2011-04-27 10:05:43 +00:00
|
|
|
/****************************************************************************
|
|
|
|
**
|
2016-01-15 12:36:27 +00:00
|
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
2011-04-27 10:05:43 +00:00
|
|
|
**
|
|
|
|
** This file is part of the qmake application of the Qt Toolkit.
|
|
|
|
**
|
2016-01-15 12:36:27 +00:00
|
|
|
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
2012-09-19 12:28:29 +00:00
|
|
|
** Commercial License Usage
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
2015-01-28 08:44:43 +00:00
|
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
2016-01-15 12:36:27 +00:00
|
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
2012-09-19 12:28:29 +00:00
|
|
|
**
|
2016-01-15 12:36:27 +00:00
|
|
|
** GNU General Public License Usage
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
** General Public License version 3 as published by the Free Software
|
|
|
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
|
|
** included in the packaging of this file. Please review the following
|
|
|
|
** information to ensure the GNU General Public License requirements will
|
|
|
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
2011-04-27 10:05:43 +00:00
|
|
|
**
|
|
|
|
** $QT_END_LICENSE$
|
|
|
|
**
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#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
|