1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the qmake application of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file.  Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #ifndef OPTION_H
43 #define OPTION_H
44 
45 #include "project.h"
46 #include <qstring.h>
47 #include <qstringlist.h>
48 #include <qfile.h>
49 
50 QT_BEGIN_NAMESPACE
51 
52 #define QMAKE_VERSION_MAJOR 2
53 #define QMAKE_VERSION_MINOR 1
54 #define QMAKE_VERSION_PATCH 0
55 const char *qmake_version();
56 
57 QString qmake_getpwd();
58 bool qmake_setpwd(const QString &p);
59 
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
62 enum QMakeWarn {
63     WarnNone    = 0x00,
64     WarnParser  = 0x01,
65     WarnLogic   = 0x02,
66     WarnDeprecated = 0x04,
67     WarnAll     = 0xFF
68 };
69 void warn_msg(QMakeWarn t, const char *fmt, ...);
70 
71 struct Option
72 {
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;
100 
101     enum CmdLineFlags {
102         QMAKE_CMDLINE_SUCCESS       = 0x00,
103         QMAKE_CMDLINE_SHOW_USAGE    = 0x01,
104         QMAKE_CMDLINE_BAIL          = 0x02,
105         QMAKE_CMDLINE_ERROR         = 0x04
106     };
107 
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 bool postProcessProject(QMakeProject *);
112 
113     enum StringFixFlags {
114         FixNone                 = 0x00,
115         FixEnvVars              = 0x01,
116         FixPathCanonicalize     = 0x02,
117         FixPathToLocalSeparators  = 0x04,
118         FixPathToTargetSeparators = 0x08
119     };
120     static QString fixString(QString string, uchar flags);
121 
122     //and convenience functions
123     inline static QString fixPathToLocalOS(const QString &in, bool fix_env=true, bool canonical=true)
124     {
125         uchar flags = FixPathToLocalSeparators;
126         if(fix_env)
127             flags |= FixEnvVars;
128         if(canonical)
129             flags |= FixPathCanonicalize;
130         return fixString(in, flags);
131     }
132     inline static QString fixPathToTargetOS(const QString &in, bool fix_env=true, bool canonical=true)
133     {
134         uchar flags = FixPathToTargetSeparators;
135         if(fix_env)
136             flags |= FixEnvVars;
137         if(canonical)
138             flags |= FixPathCanonicalize;
139         return fixString(in, flags);
140     }
141 
hasFileExtensionOption142     inline static bool hasFileExtension(const QString &str, const QStringList &extensions)
143     {
144         foreach (const QString &ext, extensions)
145             if (str.endsWith(ext))
146                 return true;
147         return false;
148     }
149 
150     //global qmake mode, can only be in one mode per invocation!
151     enum QMAKE_MODE { QMAKE_GENERATE_NOTHING,
152                       QMAKE_GENERATE_PROJECT, QMAKE_GENERATE_MAKEFILE, QMAKE_GENERATE_PRL,
153                       QMAKE_SET_PROPERTY, QMAKE_UNSET_PROPERTY, QMAKE_QUERY_PROPERTY };
154     static QMAKE_MODE qmake_mode;
155 
156     //all modes
157     static QString qmake_abslocation;
158     static QFile output;
159     static QString output_dir;
160     static int debug_level;
161     static int warn_level;
162     enum QMAKE_RECURSIVE { QMAKE_RECURSIVE_DEFAULT, QMAKE_RECURSIVE_YES, QMAKE_RECURSIVE_NO };
163     static QMAKE_RECURSIVE recursive;
164     static QStringList before_user_vars, after_user_vars, user_configs, after_user_configs;
165     enum HOST_MODE { HOST_UNKNOWN_MODE, HOST_UNIX_MODE, HOST_WIN_MODE, HOST_MACX_MODE };
166     static HOST_MODE host_mode;
167     enum TARG_MODE { TARG_UNKNOWN_MODE, TARG_UNIX_MODE, TARG_WIN_MODE, TARG_MACX_MODE,
168                      TARG_SYMBIAN_MODE, TARG_INTEGRITY_MODE };
169     static TARG_MODE target_mode;
170     static bool target_mode_overridden;
171     static QString user_template, user_template_prefix;
172     static QStringList shellPath;
173 
174     //QMAKE_*_PROPERTY options
175     struct prop {
176         static QStringList properties;
177     };
178 
179     //QMAKE_GENERATE_PROJECT options
180     struct projfile {
181         static bool do_pwd;
182         static QStringList project_dirs;
183     };
184 
185     //QMAKE_GENERATE_MAKEFILE options
186     struct mkfile {
187         static QString qmakespec;
188         static bool do_cache;
189         static bool do_deps;
190         static bool do_mocs;
191         static bool do_dep_heuristics;
192         static bool do_preprocess;
193         static bool do_stub_makefile;
194         static QString cachefile;
195         static int cachefile_depth;
196         static QStringList project_files;
197         static QString qmakespec_commandline;
198     };
199 
200 private:
201     static int parseCommandLine(int, char **, int=0);
202 };
203 
fixEnvVariables(const QString & x)204 inline QString fixEnvVariables(const QString &x) { return Option::fixString(x, Option::FixEnvVars); }
splitPathList(const QString & paths)205 inline QStringList splitPathList(const QString &paths) { return paths.split(Option::dirlist_sep); }
206 
207 // this is a stripped down version of the one found in QtCore
208 class QLibraryInfo
209 {
210 public:
211     enum LibraryLocation
212     {
213         PrefixPath,
214         DocumentationPath,
215         HeadersPath,
216         LibrariesPath,
217         BinariesPath,
218         PluginsPath,
219         DataPath,
220         TranslationsPath,
221         SettingsPath,
222         DemosPath,
223         ExamplesPath,
224         ImportsPath
225     };
226     static QString location(LibraryLocation);
227 };
228 
229 QT_END_NAMESPACE
230 
231 #endif // OPTION_H
232