1
/****************************************************************************
2
**
3
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4
** All rights reserved.
5
** Contact: Nokia Corporation (qt-info@nokia.com)
6
**
7
** This file is part of the qmake application of the Qt Toolkit.
8
**
9
** $QT_BEGIN_LICENSE:LGPL$
10
** GNU Lesser General Public License Usage
11
** This file may be used under the terms of the GNU Lesser General Public
12
** License version 2.1 as published by the Free Software Foundation and
13
** appearing in the file LICENSE.LGPL included in the packaging of this
14
** file. Please review the following information to ensure the GNU Lesser
15
** General Public License version 2.1 requirements will be met:
16
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17
**
18
** In addition, as a special exception, Nokia gives you certain additional
19
** rights. These rights are described in the Nokia Qt LGPL Exception
20
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21
**
22
** GNU General Public License Usage
23
** Alternatively, this file may be used under the terms of the GNU General
24
** Public License version 3.0 as published by the Free Software Foundation
25
** and appearing in the file LICENSE.GPL included in the packaging of this
26
** file. Please review the following information to ensure the GNU General
27
** Public License version 3.0 requirements will be met:
28
** http://www.gnu.org/copyleft/gpl.html.
29
**
30
** Other Usage
31
** Alternatively, this file may be used in accordance with the terms and
32
** conditions contained in a signed written agreement between you and Nokia.
33
**
34
**
35
**
36
**
37
**
38
** $QT_END_LICENSE$
39
**
40
****************************************************************************/
41
42
#ifndef PROJECT_H
43
#define PROJECT_H
44
45
#include <qstringlist.h>
46
#include <qtextstream.h>
47
#include <qstring.h>
48
#include <qstack.h>
49
#include <qmap.h>
50
#include <qmetatype.h>
51
52
QT_BEGIN_NAMESPACE
53
54
class QMakeProperty;
55
56
struct ParsableBlock;
57
struct IteratorBlock;
58
struct FunctionBlock;
59
60
class QMakeProject
61
{
62
    struct ScopeBlock
63
    {
64
        enum TestStatus { TestNone, TestFound, TestSeek };
65
        ScopeBlock() : iterate(0), ignore(false), else_status(TestNone) { }
66
        ScopeBlock(bool i) : iterate(0), ignore(i), else_status(TestNone) { }
67
        ~ScopeBlock();
68
        IteratorBlock *iterate;
69
        uint ignore : 1, else_status : 2;
70
    };
71
    friend struct ParsableBlock;
72
    friend struct IteratorBlock;
73
    friend struct FunctionBlock;
74
75
    QStack<ScopeBlock> scope_blocks;
76
    QStack<FunctionBlock *> function_blocks;
77
    IteratorBlock *iterator;
78
    FunctionBlock *function;
79
    QMap<QString, FunctionBlock*> testFunctions, replaceFunctions;
80
81
    bool recursive;
82
    bool own_prop;
83
    bool backslashWarned;
84
    QString pfile, cfile;
85
    QMakeProperty *prop;
86
    void reset();
87
    QMap<QString, QStringList> vars, base_vars, cache;
88
    bool parse(const QString &text, QMap<QString, QStringList> &place, int line_count=1);
89
90
    enum IncludeStatus {
91
        IncludeSuccess,
92
        IncludeFeatureAlreadyLoaded,
93
        IncludeFailure,
94
        IncludeNoExist,
95
        IncludeParseFailure
96
    };
97
    enum IncludeFlags {
98
        IncludeFlagNone = 0x00,
99
        IncludeFlagFeature = 0x01,
100
        IncludeFlagNewParser = 0x02,
101
        IncludeFlagNewProject = 0x04
102
    };
103
    IncludeStatus doProjectInclude(QString file, uchar flags, QMap<QString, QStringList> &place);
104
105
    bool doProjectCheckReqs(const QStringList &deps, QMap<QString, QStringList> &place);
106
    bool doVariableReplace(QString &str, QMap<QString, QStringList> &place);
107
    QStringList doVariableReplaceExpand(const QString &str, QMap<QString, QStringList> &place, bool *ok=0);
108
    void init(QMakeProperty *, const QMap<QString, QStringList> *);
109
    QStringList &values(const QString &v, QMap<QString, QStringList> &place);
110
    void validateModes();
111
112
public:
113
    QMakeProject() { init(0, 0); }
114
    QMakeProject(QMakeProperty *p) { init(p, 0); }
115
    QMakeProject(QMakeProject *p, const QMap<QString, QStringList> *nvars=0);
116
    QMakeProject(const QMap<QString, QStringList> &nvars) { init(0, &nvars); }
117
    QMakeProject(QMakeProperty *p, const QMap<QString, QStringList> &nvars) { init(p, &nvars); }
118
    ~QMakeProject();
119
120
    enum { ReadCache=0x01, ReadConf=0x02, ReadCmdLine=0x04, ReadProFile=0x08,
121
           ReadFeatures=0x20, ReadConfigs=0x40, ReadAll=0xFF };
122
    inline bool parse(const QString &text) { return parse(text, vars); }
123
    bool read(const QString &project, uchar cmd=ReadAll);
124
    bool read(uchar cmd=ReadAll);
125
126
    QStringList userExpandFunctions() { return replaceFunctions.keys(); }
127
    QStringList userTestFunctions() { return testFunctions.keys(); }
128
129
    QString projectFile();
130
    inline QMakeProperty *properties() { return prop; }
131
132
    bool doProjectTest(QString str, QMap<QString, QStringList> &place);
133
    bool doProjectTest(QString func, const QString &params,
134
                       QMap<QString, QStringList> &place);
135
    bool doProjectTest(QString func, QStringList args,
136
                       QMap<QString, QStringList> &place);
137
    bool doProjectTest(QString func, QList<QStringList> args,
138
                       QMap<QString, QStringList> &place);
139
    QStringList doProjectExpand(QString func, const QString &params,
140
                                QMap<QString, QStringList> &place);
141
    QStringList doProjectExpand(QString func, QStringList args,
142
                                QMap<QString, QStringList> &place);
143
    QStringList doProjectExpand(QString func, QList<QStringList> args,
144
                                QMap<QString, QStringList> &place);
145
146
    QStringList expand(const QString &v);
147
    QString expand(const QString &v, const QString &file, int line);
148
    QStringList expand(const QString &func, const QList<QStringList> &args);
149
    bool test(const QString &v);
150
    bool test(const QString &func, const QList<QStringList> &args);
151
    bool isActiveConfig(const QString &x, bool regex=false,
152
                        QMap<QString, QStringList> *place=NULL);
153
154
    bool isSet(const QString &v); // No compat mapping, no magic variables
155
    bool isEmpty(const QString &v); // With compat mapping, but no magic variables
156
    QStringList &values(const QString &v); // With compat mapping and magic variables
157
    QString first(const QString &v); // ditto
158
    QMap<QString, QStringList> &variables(); // No compat mapping and magic, obviously
159
    int intValue(const QString &v, int defaultValue = 0); // ditto
160
161
    bool isRecursive() const { return recursive; }
162
163
protected:
164
    friend class MakefileGenerator;
165
    bool read(const QString &file, QMap<QString, QStringList> &place);
166
    bool read(QTextStream &file, QMap<QString, QStringList> &place);
167
168
};
169
Q_DECLARE_METATYPE(QMakeProject*)
170
171
inline QString QMakeProject::projectFile()
172
{
173
    if (pfile == "-")
174
        return QString("(stdin)");
175
    return pfile;
176
}
177
178
inline QStringList &QMakeProject::values(const QString &v)
179
{ return values(v, vars); }
180
181
inline bool QMakeProject::isSet(const QString &v)
182
{ return vars.contains(v); }
183
184
inline QString QMakeProject::first(const QString &v)
185
{
186
    const QStringList vals = values(v);
187
    if(vals.isEmpty())
188
        return QString("");
189
    return vals.first();
190
}
191
192
inline int QMakeProject::intValue(const QString &v, int defaultValue)
193
{
194
    const QString str = first(v);
195
    if (!str.isEmpty()) {
196
        bool ok;
197
        int i = str.toInt(&ok);
198
        if (ok)
199
            return i;
200
    }
201
    return defaultValue;
202
}
203
204
inline QMap<QString, QStringList> &QMakeProject::variables()
205
{ return vars; }
206
207
QT_END_NAMESPACE
208
209
#endif // PROJECT_H