1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the qmake application of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
47 #include <qstringlist.h>
52 #define QMAKE_VERSION_MAJOR 2
53 #define QMAKE_VERSION_MINOR 1
54 #define QMAKE_VERSION_PATCH 0
55 const char *qmake_version();
57 QString qmake_getpwd();
58 bool qmake_setpwd(const QString &p);
60 #define debug_msg if(Option::debug_level) debug_msg_internal
61 void debug_msg_internal(int level, const char *fmt, ...); //don't call directly, use debug_msg
66 WarnDeprecated = 0x04,
69 void warn_msg(QMakeWarn t, const char *fmt, ...);
73 //simply global convenience
74 static QString js_ext;
75 static QString libtool_ext;
76 static QString pkgcfg_ext;
77 static QString prf_ext;
78 static QString prl_ext;
79 static QString ui_ext;
80 static QStringList h_ext;
81 static QStringList cpp_ext;
82 static QStringList c_ext;
83 static QString h_moc_ext;
84 static QString cpp_moc_ext;
85 static QString obj_ext;
86 static QString lex_ext;
87 static QString yacc_ext;
88 static QString h_moc_mod;
89 static QString cpp_moc_mod;
90 static QString lex_mod;
91 static QString yacc_mod;
92 static QString dir_sep;
93 static QString dirlist_sep;
94 static QString sysenv_mod;
95 static QString pro_ext;
96 static QString mmp_ext;
97 static QString res_ext;
98 static char field_sep;
99 static const char *application_argv0;
102 QMAKE_CMDLINE_SUCCESS = 0x00,
103 QMAKE_CMDLINE_SHOW_USAGE = 0x01,
104 QMAKE_CMDLINE_BAIL = 0x02,
105 QMAKE_CMDLINE_ERROR = 0x04
108 //both of these must be called..
109 static int init(int argc=0, char **argv=0); //parse cmdline
110 static void applyHostMode();
111 static QStringList mkspecPaths();
112 static bool prepareProject(const QString &pfile);
113 static bool postProcessProject(QMakeProject *);
115 enum StringFixFlags {
118 FixPathCanonicalize = 0x02,
119 FixPathToLocalSeparators = 0x04,
120 FixPathToTargetSeparators = 0x08,
121 FixPathToNormalSeparators = 0x10
123 static QString fixString(QString string, uchar flags);
125 //and convenience functions
126 inline static QString fixPathToLocalOS(const QString &in, bool fix_env=true, bool canonical=true)
128 uchar flags = FixPathToLocalSeparators;
132 flags |= FixPathCanonicalize;
133 return fixString(in, flags);
135 inline static QString fixPathToTargetOS(const QString &in, bool fix_env=true, bool canonical=true)
137 uchar flags = FixPathToTargetSeparators;
141 flags |= FixPathCanonicalize;
142 return fixString(in, flags);
144 inline static QString normalizePath(const QString &in, bool fix_env=true, bool canonical=true)
146 uchar flags = FixPathToNormalSeparators;
150 flags |= FixPathCanonicalize;
151 return fixString(in, flags);
154 inline static bool hasFileExtension(const QString &str, const QStringList &extensions)
156 foreach (const QString &ext, extensions)
157 if (str.endsWith(ext))
162 //global qmake mode, can only be in one mode per invocation!
163 enum QMAKE_MODE { QMAKE_GENERATE_NOTHING,
164 QMAKE_GENERATE_PROJECT, QMAKE_GENERATE_MAKEFILE, QMAKE_GENERATE_PRL,
165 QMAKE_SET_PROPERTY, QMAKE_UNSET_PROPERTY, QMAKE_QUERY_PROPERTY };
166 static QMAKE_MODE qmake_mode;
169 static QString qmake_abslocation;
171 static QString output_dir;
172 static int debug_level;
173 static int warn_level;
174 enum QMAKE_RECURSIVE { QMAKE_RECURSIVE_DEFAULT, QMAKE_RECURSIVE_YES, QMAKE_RECURSIVE_NO };
175 static QMAKE_RECURSIVE recursive;
176 static QStringList before_user_vars, after_user_vars, user_configs;
177 enum HOST_MODE { HOST_UNKNOWN_MODE, HOST_UNIX_MODE, HOST_WIN_MODE, HOST_MACX_MODE };
178 static HOST_MODE host_mode;
179 enum TARG_MODE { TARG_UNKNOWN_MODE, TARG_UNIX_MODE, TARG_WIN_MODE, TARG_MACX_MODE,
180 TARG_INTEGRITY_MODE };
181 static TARG_MODE target_mode;
182 static bool target_mode_overridden;
183 static QString user_template, user_template_prefix;
184 static QStringList shellPath;
186 //QMAKE_*_PROPERTY options
188 static QStringList properties;
191 //QMAKE_GENERATE_PROJECT options
194 static QStringList project_dirs;
197 //QMAKE_GENERATE_MAKEFILE options
199 static QString qmakespec;
200 static bool do_cache;
203 static bool do_dep_heuristics;
204 static bool do_preprocess;
205 static bool do_stub_makefile;
206 static QString project_root;
207 static QString project_build_root;
208 static QString cachefile;
209 static int cachefile_depth;
210 static QStringList project_files;
211 static QString qmakespec_commandline;
215 static int parseCommandLine(int, char **, int=0);
216 static bool resolveSpec(QString *spec);
219 inline QString fixEnvVariables(const QString &x) { return Option::fixString(x, Option::FixEnvVars); }
220 inline QStringList splitPathList(const QString &paths) { return paths.split(Option::dirlist_sep); }
222 // this is a stripped down version of the one found in QtCore
241 static QString location(LibraryLocation);