1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the qmake application of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
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 https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28 
29 #ifndef OPTION_H
30 #define OPTION_H
31 
32 #include <qmakeglobals.h>
33 #include <qmakevfs.h>
34 #include <qmakeparser.h>
35 #include <qmakeevaluator.h>
36 
37 #include <qstring.h>
38 #include <qstringlist.h>
39 #include <qfile.h>
40 
41 QT_BEGIN_NAMESPACE
42 
43 #define QMAKE_VERSION_STR "3.1"
44 
45 QString qmake_getpwd();
46 bool qmake_setpwd(const QString &p);
47 
48 #define debug_msg if(Option::debug_level) debug_msg_internal
49 void debug_msg_internal(int level, const char *fmt, ...); //don't call directly, use debug_msg
50 enum QMakeWarn {
51     WarnNone    = 0x00,
52     WarnParser  = 0x01,
53     WarnLogic   = 0x02,
54     WarnDeprecated = 0x04,
55     WarnAll     = 0xFF
56 };
57 void warn_msg(QMakeWarn t, const char *fmt, ...);
58 
59 class QMakeProject;
60 
61 class EvalHandler : public QMakeHandler {
62 public:
63     void message(int type, const QString &msg, const QString &fileName, int lineNo) override;
64 
65     void fileMessage(int type, const QString &msg) override;
66 
67     void aboutToEval(ProFile *, ProFile *, EvalFileType) override;
68     void doneWithEval(ProFile *) override;
69 };
70 
71 struct Option
72 {
73     static EvalHandler evalHandler;
74 
75     static QMakeGlobals *globals;
76     static ProFileCache *proFileCache;
77     static QMakeVfs *vfs;
78     static QMakeParser *parser;
79 
80     //simply global convenience
81     static QString libtool_ext;
82     static QString pkgcfg_ext;
83     static QString prf_ext;
84     static QString prl_ext;
85     static QString ui_ext;
86     static QStringList h_ext;
87     static QStringList cpp_ext;
88     static QStringList c_ext;
89     static QString objc_ext;
90     static QString objcpp_ext;
91     static QString cpp_moc_ext;
92     static QString obj_ext;
93     static QString lex_ext;
94     static QString yacc_ext;
95     static QString h_moc_mod;
96     static QString lex_mod;
97     static QString yacc_mod;
98     static QString dir_sep;
99     static QString pro_ext;
100     static QString res_ext;
101     static char field_sep;
102 
103     enum CmdLineFlags {
104         QMAKE_CMDLINE_SUCCESS       = 0x00,
105         QMAKE_CMDLINE_SHOW_USAGE    = 0x01,
106         QMAKE_CMDLINE_BAIL          = 0x02,
107         QMAKE_CMDLINE_ERROR         = 0x04
108     };
109 
110     //both of these must be called..
111     static int init(int argc = 0, char **argv = nullptr); //parse cmdline
112     static void prepareProject(const QString &pfile);
113     static bool postProcessProject(QMakeProject *);
114 
115     enum StringFixFlags {
116         FixNone                 = 0x00,
117         FixEnvVars              = 0x01,
118         FixPathCanonicalize     = 0x02,
119         FixPathToLocalSeparators  = 0x04,
120         FixPathToTargetSeparators = 0x08,
121         FixPathToNormalSeparators = 0x10
122     };
123     static QString fixString(QString string, uchar flags);
124 
125     //and convenience functions
126     inline static QString fixPathToLocalOS(const QString &in, bool fix_env=true, bool canonical=true)
127     {
128         uchar flags = FixPathToLocalSeparators;
129         if(fix_env)
130             flags |= FixEnvVars;
131         if(canonical)
132             flags |= FixPathCanonicalize;
133         return fixString(in, flags);
134     }
135     inline static QString fixPathToTargetOS(const QString &in, bool fix_env=true, bool canonical=true)
136     {
137         uchar flags = FixPathToTargetSeparators;
138         if(fix_env)
139             flags |= FixEnvVars;
140         if(canonical)
141             flags |= FixPathCanonicalize;
142         return fixString(in, flags);
143     }
144     inline static QString normalizePath(const QString &in, bool fix_env=true, bool canonical=true)
145     {
146         uchar flags = FixPathToNormalSeparators;
147         if (fix_env)
148             flags |= FixEnvVars;
149         if (canonical)
150             flags |= FixPathCanonicalize;
151         return fixString(in, flags);
152     }
153 
hasFileExtensionOption154     inline static bool hasFileExtension(const QString &str, const QStringList &extensions)
155     {
156         for (const QString &ext : extensions)
157             if (str.endsWith(ext))
158                 return true;
159         return false;
160     }
161 
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;
167 
168     //all modes
169     static QFile output;
170     static QString output_dir;
171     static int debug_level;
172     static int warn_level;
173     static bool recursive;
174 
175     //QMAKE_*_PROPERTY options
176     struct prop {
177         static QStringList properties;
178     };
179 
180     //QMAKE_GENERATE_PROJECT options
181     struct projfile {
182         static bool do_pwd;
183         static QStringList project_dirs;
184     };
185 
186     //QMAKE_GENERATE_MAKEFILE options
187     struct mkfile {
188         static bool do_deps;
189         static bool do_mocs;
190         static bool do_dep_heuristics;
191         static bool do_preprocess;
192         static int cachefile_depth;
193         static QStringList project_files;
194     };
195 
196 private:
197     static int parseCommandLine(QStringList &args, QMakeCmdLineParserState &state);
198 };
199 
fixEnvVariables(const QString & x)200 inline QString fixEnvVariables(const QString &x) { return Option::fixString(x, Option::FixEnvVars); }
splitPathList(const QString & paths)201 inline QStringList splitPathList(const QString &paths) { return paths.isEmpty() ? QStringList() : paths.split(Option::globals->dirlist_sep); }
202 
203 QT_END_NAMESPACE
204 
205 #endif // OPTION_H
206