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 PROJECT_H
30 #define PROJECT_H
31
32 #include <qmakeevaluator.h>
33
34 QT_BEGIN_NAMESPACE
35
36 class QMakeProject : private QMakeEvaluator
37 {
38 QString m_projectFile;
39 QString m_projectDir;
40
41 public:
42 QMakeProject();
43 QMakeProject(QMakeProject *p);
44
45 bool read(const QString &project, LoadFlags what = LoadAll);
46
projectFile()47 QString projectFile() const { return m_projectFile; }
projectDir()48 QString projectDir() const { return m_projectDir; }
sourceRoot()49 QString sourceRoot() const { return m_sourceRoot.isEmpty() ? m_buildRoot : m_sourceRoot; }
buildRoot()50 QString buildRoot() const { return m_buildRoot; }
confFile()51 QString confFile() const { return m_conffile; }
cacheFile()52 QString cacheFile() const { return m_cachefile; }
specDir()53 QString specDir() const { return m_qmakespec; }
54
55 ProString expand(const QString &v, const QString &file, int line);
56 QStringList expand(const ProKey &func, const QList<ProStringList> &args);
test(const QString & v,const QString & file,int line)57 bool test(const QString &v, const QString &file, int line)
58 { m_current.clear(); return evaluateConditional(QStringRef(&v), file, line) == ReturnTrue; }
59 bool test(const ProKey &func, const QList<ProStringList> &args);
60
isSet(const ProKey & v)61 bool isSet(const ProKey &v) const { return m_valuemapStack.front().contains(v); }
62 bool isEmpty(const ProKey &v) const;
values(const ProKey & v)63 ProStringList &values(const ProKey &v) { return valuesRef(v); }
64 int intValue(const ProKey &v, int defaultValue = 0) const;
variables()65 const ProValueMap &variables() const { return m_valuemapStack.front(); }
variables()66 ProValueMap &variables() { return m_valuemapStack.front(); }
67 bool isActiveConfig(const QString &config, bool regex = false)
68 { return QMakeEvaluator::isActiveConfig(QStringRef(&config), regex); }
69
70 void dump() const;
71
72 using QMakeEvaluator::LoadFlags;
73 using QMakeEvaluator::VisitReturn;
74 using QMakeEvaluator::setExtraVars;
75 using QMakeEvaluator::setExtraConfigs;
76 using QMakeEvaluator::loadSpec;
77 using QMakeEvaluator::evaluateFeatureFile;
78 using QMakeEvaluator::evaluateConfigFeatures;
79 using QMakeEvaluator::evaluateExpression;
80 using QMakeEvaluator::propertyValue;
81 using QMakeEvaluator::values;
82 using QMakeEvaluator::first;
83 using QMakeEvaluator::isHostBuild;
84 using QMakeEvaluator::dirSep;
85
86 private:
87 static bool boolRet(VisitReturn vr);
88 };
89
90 /*!
91 * For variables that are supposed to contain a single int,
92 * this method returns the numeric value.
93 * Only the first value of the variable is taken into account.
94 * The string representation is assumed to look like a C int literal.
95 */
intValue(const ProKey & v,int defaultValue)96 inline int QMakeProject::intValue(const ProKey &v, int defaultValue) const
97 {
98 const ProString &str = first(v);
99 if (!str.isEmpty()) {
100 bool ok;
101 int i = str.toInt(&ok, 0);
102 if (ok)
103 return i;
104 }
105 return defaultValue;
106 }
107
108 QT_END_NAMESPACE
109
110 #endif // PROJECT_H
111