2022-05-10 10:06:48 +00:00
|
|
|
// Copyright (C) 2016 The Qt Company Ltd.
|
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
2011-04-27 10:05:43 +00:00
|
|
|
|
|
|
|
#ifndef OPTION_H
|
|
|
|
#define OPTION_H
|
|
|
|
|
2012-09-05 16:29:19 +00:00
|
|
|
#include <qmakeglobals.h>
|
2013-05-29 18:18:51 +00:00
|
|
|
#include <qmakevfs.h>
|
2012-09-05 16:29:19 +00:00
|
|
|
#include <qmakeparser.h>
|
|
|
|
#include <qmakeevaluator.h>
|
|
|
|
|
2011-04-27 10:05:43 +00:00
|
|
|
#include <qstring.h>
|
|
|
|
#include <qstringlist.h>
|
|
|
|
#include <qfile.h>
|
|
|
|
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
|
|
|
|
QString qmake_getpwd();
|
|
|
|
bool qmake_setpwd(const QString &p);
|
|
|
|
|
|
|
|
#define debug_msg if(Option::debug_level) debug_msg_internal
|
|
|
|
void debug_msg_internal(int level, const char *fmt, ...); //don't call directly, use debug_msg
|
|
|
|
enum QMakeWarn {
|
|
|
|
WarnNone = 0x00,
|
|
|
|
WarnParser = 0x01,
|
|
|
|
WarnLogic = 0x02,
|
|
|
|
WarnDeprecated = 0x04,
|
|
|
|
WarnAll = 0xFF
|
|
|
|
};
|
|
|
|
void warn_msg(QMakeWarn t, const char *fmt, ...);
|
|
|
|
|
2012-09-05 16:29:19 +00:00
|
|
|
class QMakeProject;
|
|
|
|
|
|
|
|
class EvalHandler : public QMakeHandler {
|
|
|
|
public:
|
2018-08-02 21:34:53 +00:00
|
|
|
void message(int type, const QString &msg, const QString &fileName, int lineNo) override;
|
2012-09-05 16:29:19 +00:00
|
|
|
|
2018-08-02 21:34:53 +00:00
|
|
|
void fileMessage(int type, const QString &msg) override;
|
2012-09-05 16:29:19 +00:00
|
|
|
|
2018-08-02 21:34:53 +00:00
|
|
|
void aboutToEval(ProFile *, ProFile *, EvalFileType) override;
|
|
|
|
void doneWithEval(ProFile *) override;
|
2012-09-05 16:29:19 +00:00
|
|
|
};
|
|
|
|
|
2011-04-27 10:05:43 +00:00
|
|
|
struct Option
|
|
|
|
{
|
2012-09-05 16:29:19 +00:00
|
|
|
static EvalHandler evalHandler;
|
|
|
|
|
|
|
|
static QMakeGlobals *globals;
|
|
|
|
static ProFileCache *proFileCache;
|
2013-05-29 18:18:51 +00:00
|
|
|
static QMakeVfs *vfs;
|
2012-09-05 16:29:19 +00:00
|
|
|
static QMakeParser *parser;
|
|
|
|
|
2011-04-27 10:05:43 +00:00
|
|
|
//simply global convenience
|
|
|
|
static QString libtool_ext;
|
|
|
|
static QString pkgcfg_ext;
|
|
|
|
static QString prf_ext;
|
|
|
|
static QString prl_ext;
|
|
|
|
static QString ui_ext;
|
|
|
|
static QStringList h_ext;
|
|
|
|
static QStringList cpp_ext;
|
|
|
|
static QStringList c_ext;
|
Distinguish between Objective-C and Objective-C++ sources
Instead of lumping both Objective-C (.m) and Objective-C++ (.mm) sources
into the same pile, passing them on to the same compiler as for C++ (CXX),
with the C++ flags (CXXFLAGS), we follow Apple's lead and treat them as
variants of the C and C++ languages separately, so that Objective-C
sources are built with CC and with CFLAGS, and Objective-C++ sources
with CXX, and CXXFLAGS.
This lets us remove a lot of duplicated flags and definitions from the
QMAKE_OBJECTIVE_CFLAGS variable, which in 99% of the cases just matched
the C++ equivalent. The remaining Objective-C/C++ flags are added to
CFLAGS/CXXFLAGS, as the compiler will just ignore them when running in
C/C++ mode. This matches Xcode, which also doesn't have a separate build
setting for Objective-C/C++ flags.
The Makefile qmake generator has been rewritten to support Objective-C/C++
fully, by not assuming that we're just iterating over the C and C++
extensions when dealing with compilation rules, precompiled headers, etc.
There's some duplicated logic in this code, as inherent by qmake's already
duplicated code paths, but this can be cleaned up when C++11 support is
mandatory and we can use lambda functions.
Task-number: QTBUG-36575
Change-Id: I4f06576d5f49e939333a2e03d965da54119e5e31
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>
2015-10-02 11:54:33 +00:00
|
|
|
static QString objc_ext;
|
|
|
|
static QString objcpp_ext;
|
2011-04-27 10:05:43 +00:00
|
|
|
static QString cpp_moc_ext;
|
|
|
|
static QString obj_ext;
|
|
|
|
static QString lex_ext;
|
|
|
|
static QString yacc_ext;
|
|
|
|
static QString h_moc_mod;
|
|
|
|
static QString lex_mod;
|
|
|
|
static QString yacc_mod;
|
|
|
|
static QString dir_sep;
|
|
|
|
static QString pro_ext;
|
|
|
|
static QString res_ext;
|
|
|
|
static char field_sep;
|
|
|
|
|
|
|
|
enum CmdLineFlags {
|
|
|
|
QMAKE_CMDLINE_SUCCESS = 0x00,
|
|
|
|
QMAKE_CMDLINE_SHOW_USAGE = 0x01,
|
|
|
|
QMAKE_CMDLINE_BAIL = 0x02,
|
|
|
|
QMAKE_CMDLINE_ERROR = 0x04
|
|
|
|
};
|
|
|
|
|
|
|
|
//both of these must be called..
|
2018-08-02 22:22:24 +00:00
|
|
|
static int init(int argc = 0, char **argv = nullptr); //parse cmdline
|
2012-05-09 13:29:25 +00:00
|
|
|
static void prepareProject(const QString &pfile);
|
2011-04-27 10:05:43 +00:00
|
|
|
static bool postProcessProject(QMakeProject *);
|
|
|
|
|
|
|
|
enum StringFixFlags {
|
|
|
|
FixNone = 0x00,
|
|
|
|
FixEnvVars = 0x01,
|
|
|
|
FixPathCanonicalize = 0x02,
|
|
|
|
FixPathToLocalSeparators = 0x04,
|
2011-11-15 08:34:38 +00:00
|
|
|
FixPathToTargetSeparators = 0x08,
|
|
|
|
FixPathToNormalSeparators = 0x10
|
2011-04-27 10:05:43 +00:00
|
|
|
};
|
|
|
|
static QString fixString(QString string, uchar flags);
|
|
|
|
|
|
|
|
//and convenience functions
|
|
|
|
inline static QString fixPathToLocalOS(const QString &in, bool fix_env=true, bool canonical=true)
|
|
|
|
{
|
|
|
|
uchar flags = FixPathToLocalSeparators;
|
|
|
|
if(fix_env)
|
|
|
|
flags |= FixEnvVars;
|
|
|
|
if(canonical)
|
|
|
|
flags |= FixPathCanonicalize;
|
|
|
|
return fixString(in, flags);
|
|
|
|
}
|
|
|
|
inline static QString fixPathToTargetOS(const QString &in, bool fix_env=true, bool canonical=true)
|
|
|
|
{
|
|
|
|
uchar flags = FixPathToTargetSeparators;
|
|
|
|
if(fix_env)
|
|
|
|
flags |= FixEnvVars;
|
|
|
|
if(canonical)
|
|
|
|
flags |= FixPathCanonicalize;
|
|
|
|
return fixString(in, flags);
|
|
|
|
}
|
2011-11-15 08:34:38 +00:00
|
|
|
inline static QString normalizePath(const QString &in, bool fix_env=true, bool canonical=true)
|
|
|
|
{
|
|
|
|
uchar flags = FixPathToNormalSeparators;
|
|
|
|
if (fix_env)
|
|
|
|
flags |= FixEnvVars;
|
|
|
|
if (canonical)
|
|
|
|
flags |= FixPathCanonicalize;
|
|
|
|
return fixString(in, flags);
|
|
|
|
}
|
2011-04-27 10:05:43 +00:00
|
|
|
|
|
|
|
inline static bool hasFileExtension(const QString &str, const QStringList &extensions)
|
|
|
|
{
|
2016-01-26 13:38:54 +00:00
|
|
|
for (const QString &ext : extensions)
|
2011-04-27 10:05:43 +00:00
|
|
|
if (str.endsWith(ext))
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
//global qmake mode, can only be in one mode per invocation!
|
|
|
|
enum QMAKE_MODE { QMAKE_GENERATE_NOTHING,
|
|
|
|
QMAKE_GENERATE_PROJECT, QMAKE_GENERATE_MAKEFILE, QMAKE_GENERATE_PRL,
|
|
|
|
QMAKE_SET_PROPERTY, QMAKE_UNSET_PROPERTY, QMAKE_QUERY_PROPERTY };
|
|
|
|
static QMAKE_MODE qmake_mode;
|
|
|
|
|
|
|
|
//all modes
|
|
|
|
static QFile output;
|
|
|
|
static QString output_dir;
|
|
|
|
static int debug_level;
|
|
|
|
static int warn_level;
|
2012-05-04 18:02:35 +00:00
|
|
|
static bool recursive;
|
2011-04-27 10:05:43 +00:00
|
|
|
|
|
|
|
//QMAKE_*_PROPERTY options
|
|
|
|
struct prop {
|
|
|
|
static QStringList properties;
|
|
|
|
};
|
|
|
|
|
|
|
|
//QMAKE_GENERATE_PROJECT options
|
|
|
|
struct projfile {
|
|
|
|
static bool do_pwd;
|
|
|
|
static QStringList project_dirs;
|
|
|
|
};
|
|
|
|
|
|
|
|
//QMAKE_GENERATE_MAKEFILE options
|
|
|
|
struct mkfile {
|
|
|
|
static bool do_deps;
|
|
|
|
static bool do_mocs;
|
|
|
|
static bool do_dep_heuristics;
|
|
|
|
static bool do_preprocess;
|
|
|
|
static int cachefile_depth;
|
|
|
|
static QStringList project_files;
|
|
|
|
};
|
|
|
|
|
|
|
|
private:
|
2013-01-30 17:37:11 +00:00
|
|
|
static int parseCommandLine(QStringList &args, QMakeCmdLineParserState &state);
|
2011-04-27 10:05:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
inline QString fixEnvVariables(const QString &x) { return Option::fixString(x, Option::FixEnvVars); }
|
2012-09-05 16:29:19 +00:00
|
|
|
inline QStringList splitPathList(const QString &paths) { return paths.isEmpty() ? QStringList() : paths.split(Option::globals->dirlist_sep); }
|
2011-04-27 10:05:43 +00:00
|
|
|
|
|
|
|
QT_END_NAMESPACE
|
|
|
|
|
|
|
|
#endif // OPTION_H
|