profileevaluator.h 5.99 KB
Newer Older
1
/**************************************************************************
con's avatar
con committed
2 3 4
**
** This file is part of Qt Creator
**
hjk's avatar
hjk committed
5
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
con's avatar
con committed
6
**
7
** Contact: Nokia Corporation (qt-info@nokia.com)
con's avatar
con committed
8
**
9
** Commercial Usage
10
**
11 12 13 14
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
15
**
16
** GNU Lesser General Public License Usage
17
**
18 19 20 21 22 23
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24
**
25
** If you are unsure which license is appropriate for your use, please
hjk's avatar
hjk committed
26
** contact the sales department at http://qt.nokia.com/contact.
con's avatar
con committed
27
**
28
**************************************************************************/
29

con's avatar
con committed
30 31 32 33 34 35 36
#ifndef PROFILEEVALUATOR_H
#define PROFILEEVALUATOR_H

#include "proitems.h"

#include <QtCore/QHash>
#include <QtCore/QStringList>
37
#ifdef PROEVALUATOR_THREAD_SAFE
38 39 40
# include <QtCore/QMutex>
# include <QtCore/QWaitCondition>
#endif
con's avatar
con committed
41 42 43

QT_BEGIN_NAMESPACE

44
struct ProFileOption;
45
class ProFileParser;
46

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
class ProFileEvaluatorHandler
{
public:
    // qmake/project configuration error
    virtual void configError(const QString &msg) = 0;
    // Some error during evaluation
    virtual void evalError(const QString &filename, int lineNo, const QString &msg) = 0;
    // error() and message() from .pro file
    virtual void fileMessage(const QString &msg) = 0;

    enum EvalFileType { EvalProjectFile, EvalIncludeFile, EvalConfigFile, EvalFeatureFile, EvalAuxFile };
    virtual void aboutToEval(ProFile *parent, ProFile *proFile, EvalFileType type) = 0;
    virtual void doneWithEval(ProFile *parent) = 0;
};


con's avatar
con committed
63 64
class ProFileEvaluator
{
65
    class Private;
66

67
public:
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
    class FunctionDef {
    public:
        FunctionDef(ProFile *pro, int offset) : m_pro(pro), m_offset(offset) { m_pro->ref(); }
        FunctionDef(const FunctionDef &o) : m_pro(o.m_pro), m_offset(o.m_offset) { m_pro->ref(); }
        ~FunctionDef() { m_pro->deref(); }
        FunctionDef &operator=(const FunctionDef &o)
        {
            if (this != &o) {
                m_pro->deref();
                m_pro = o.m_pro;
                m_pro->ref();
                m_offset = o.m_offset;
            }
            return *this;
        }
        ProFile *pro() const { return m_pro; }
84
        const ushort *tokPtr() const { return m_pro->tokPtr() + m_offset; }
85 86 87
    private:
        ProFile *m_pro;
        int m_offset;
88 89
    };

90
    struct FunctionDefs {
91 92
        QHash<ProString, FunctionDef> testFunctions;
        QHash<ProString, FunctionDef> replaceFunctions;
93 94
    };

con's avatar
con committed
95 96 97 98 99 100 101 102
    enum TemplateType {
        TT_Unknown = 0,
        TT_Application,
        TT_Library,
        TT_Script,
        TT_Subdirs
    };

103 104 105
    // Call this from a concurrency-free context
    static void initialize();

106
    ProFileEvaluator(ProFileOption *option, ProFileParser *parser, ProFileEvaluatorHandler *handler);
107
    ~ProFileEvaluator();
con's avatar
con committed
108

109
    ProFileEvaluator::TemplateType templateType() const;
110
    void setCumulative(bool on); // Default is true!
111
    void setOutputDir(const QString &dir); // Default is empty
112 113 114

    // -nocache, -cache, -spec, QMAKESPEC
    // -set persistent value
115
    void setConfigCommandLineArguments(const QStringList &addUserConfigCmdArgs, const QStringList &removeUserConfigCmdArgs);
con's avatar
con committed
116

117 118 119 120 121 122 123 124
    enum LoadFlag {
        LoadProOnly = 0,
        LoadPreFiles = 1,
        LoadPostFiles = 2,
        LoadAll = LoadPreFiles|LoadPostFiles
    };
    Q_DECLARE_FLAGS(LoadFlags, LoadFlag)
    bool accept(ProFile *pro, LoadFlags flags = LoadAll);
con's avatar
con committed
125

Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
126
    bool contains(const QString &variableName) const;
127
    QString value(const QString &variableName) const;
con's avatar
con committed
128 129
    QStringList values(const QString &variableName) const;
    QStringList values(const QString &variableName, const ProFile *pro) const;
130 131 132 133
    QStringList absolutePathValues(const QString &variable, const QString &baseDirectory) const;
    QStringList absoluteFileValues(
            const QString &variable, const QString &baseDirectory, const QStringList &searchDirs,
            const ProFile *pro) const;
con's avatar
con committed
134 135 136 137
    QString propertyValue(const QString &val) const;

private:
    Private *d;
138

139
    friend struct ProFileOption;
140 141
};

142 143
Q_DECLARE_OPERATORS_FOR_FLAGS(ProFileEvaluator::LoadFlags)

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
// This struct is from qmake, but we are not using everything.
struct ProFileOption
{
    ProFileOption();
    ~ProFileOption();

    //simply global convenience
    //QString libtool_ext;
    //QString pkgcfg_ext;
    //QString prf_ext;
    //QString prl_ext;
    //QString ui_ext;
    //QStringList h_ext;
    //QStringList cpp_ext;
    //QString h_moc_ext;
    //QString cpp_moc_ext;
    //QString obj_ext;
    //QString lex_ext;
    //QString yacc_ext;
    //QString h_moc_mod;
    //QString cpp_moc_mod;
    //QString lex_mod;
    //QString yacc_mod;
    QString dir_sep;
    QString dirlist_sep;
    QString qmakespec;
    QString cachefile;
    QHash<QString, QString> properties;

    enum TARG_MODE { TARG_UNIX_MODE, TARG_WIN_MODE, TARG_MACX_MODE, TARG_MAC9_MODE, TARG_QNX6_MODE };
    TARG_MODE target_mode;
    //QString pro_ext;
    //QString res_ext;

  private:
    friend class ProFileEvaluator;
    friend class ProFileEvaluator::Private;
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
181
    QHash<ProString, ProStringList> base_valuemap; // Cached results of qmake.conf, .qmake.cache & default_pre.prf
182 183
    ProFileEvaluator::FunctionDefs base_functions;
    QStringList feature_roots;
184
    QString qmakespec_name;
185 186 187 188 189
#ifdef PROEVALUATOR_THREAD_SAFE
    QMutex mutex;
    QWaitCondition cond;
    bool base_inProgress;
#endif
con's avatar
con committed
190 191
};

Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
192 193
Q_DECLARE_TYPEINFO(ProFileEvaluator::FunctionDef, Q_MOVABLE_TYPE);

ck's avatar
ck committed
194 195
QT_END_NAMESPACE

con's avatar
con committed
196
#endif // PROFILEEVALUATOR_H