cmakeproject.h 6.63 KB
Newer Older
1
/**************************************************************************
con's avatar
con committed
2 3 4
**
** This file is part of Qt Creator
**
5
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
con's avatar
con committed
6 7 8
**
** Contact:  Qt Software Information (qt-info@nokia.com)
**
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 26
** If you are unsure which license is appropriate for your use, please
** contact the sales department at qt-sales@nokia.com.
con's avatar
con committed
27
**
28
**************************************************************************/
hjk's avatar
hjk committed
29

con's avatar
con committed
30 31 32
#ifndef CMAKEPROJECT_H
#define CMAKEPROJECT_H

hjk's avatar
hjk committed
33 34
#include "cmakeprojectmanager.h"
#include "cmakeprojectnodes.h"
35
#include "makestep.h"
hjk's avatar
hjk committed
36

con's avatar
con committed
37 38 39
#include <projectexplorer/project.h>
#include <projectexplorer/projectnodes.h>
#include <projectexplorer/buildstep.h>
40
#include <projectexplorer/toolchain.h>
41
#include <projectexplorer/filewatcher.h>
con's avatar
con committed
42
#include <coreplugin/ifile.h>
43
#include <utils/pathchooser.h>
con's avatar
con committed
44

hjk's avatar
hjk committed
45
#include <QtCore/QXmlStreamReader>
con's avatar
con committed
46 47

namespace CMakeProjectManager {
48
namespace Internal {
con's avatar
con committed
49 50 51

class CMakeFile;

dt's avatar
dt committed
52 53 54 55 56 57 58 59 60 61
struct CMakeTarget
{
    QString title;
    QString executable;
    QString workingDirectory;
    QString makeCommand;
    QString makeCleanCommand;
    void clear();
};

con's avatar
con committed
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
class CMakeProject : public ProjectExplorer::Project
{
    Q_OBJECT
public:
    CMakeProject(CMakeManager *manager, const QString &filename);
    ~CMakeProject();

    virtual QString name() const;
    virtual Core::IFile *file() const;
    virtual ProjectExplorer::IProjectManager *projectManager() const;

    virtual QList<ProjectExplorer::Project *> dependsOn(); //NBS TODO implement dependsOn

    virtual bool isApplication() const;

    virtual ProjectExplorer::Environment environment(const QString &buildConfiguration) const;
    virtual QString buildDirectory(const QString &buildConfiguration) const;

    virtual ProjectExplorer::BuildStepConfigWidget *createConfigWidget();
    virtual QList<ProjectExplorer::BuildStepConfigWidget*> subConfigWidgets();

    // This method is called for new build configurations
    // You should probably set some default values in this method
    virtual void newBuildConfiguration(const QString &buildConfiguration);

//    // Returns the list of different views (such as "File View" or "Project View") the project supports.
//    virtual QStringList supportedModels() const = 0;
//
//    // Returns the tree representing the requested view.
//    virtual QModelIndex model(const QString &modelId) const = 0;

    virtual ProjectExplorer::ProjectNode *rootProjectNode() const;

//    // Conversion functions
//    virtual QModelIndex indexForNode(const Node *node, const QString &modelId) const = 0;
//    virtual Node *nodeForIndex(const QModelIndex &index) const = 0;
//    virtual Node *nodeForFile(const QString &filePath) const = 0;

    virtual QStringList files(FilesMode fileMode) const;
101 102
    MakeStep *makeStep() const;
    QStringList targets() const;
103
    QString buildParser(const QString &buildConfiguration) const;
104
    CMakeTarget targetForTitle(const QString &title);
con's avatar
con committed
105

106 107 108 109 110 111 112
protected:
    virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer);
    virtual void restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader);

private slots:
    void fileChanged(const QString &fileName);

con's avatar
con committed
113
private:
dt's avatar
dt committed
114
    void parseCMakeLists();
115
    void updateToolChain(const QString &compiler);
116

con's avatar
con committed
117
    void buildTree(CMakeProjectNode *rootNode, QList<ProjectExplorer::FileNode *> list);
118
    void gatherFileNodes(ProjectExplorer::FolderNode *parent, QList<ProjectExplorer::FileNode *> &list);
con's avatar
con committed
119 120 121 122 123
    ProjectExplorer::FolderNode *findOrCreateFolder(CMakeProjectNode *rootNode, QString directory);

    CMakeManager *m_manager;
    QString m_fileName;
    CMakeFile *m_file;
124
    QString m_projectName;
con's avatar
con committed
125 126

    // TODO probably need a CMake specific node structure
127
    CMakeProjectNode *m_rootNode;
con's avatar
con committed
128
    QStringList m_files;
dt's avatar
dt committed
129
    QList<CMakeTarget> m_targets;
130
    ProjectExplorer::ToolChain *m_toolChain;
131 132
    ProjectExplorer::FileWatcher *m_watcher;
    bool m_insideFileChanged;
con's avatar
con committed
133 134
};

135 136 137 138 139 140
class CMakeCbpParser : public QXmlStreamReader
{
public:
    bool parseCbpFile(const QString &fileName);
    QList<ProjectExplorer::FileNode *> fileList();
    QStringList includeFiles();
dt's avatar
dt committed
141
    QList<CMakeTarget> targets();
142
    QString projectName() const;
143
    QString compilerName() const;
144 145 146 147
private:
    void parseCodeBlocks_project_file();
    void parseProject();
    void parseBuild();
148
    void parseOption();
149
    void parseTarget();
dt's avatar
dt committed
150
    void parseTargetOption();
dt's avatar
dt committed
151 152 153
    void parseMakeCommand();
    void parseTargetBuild();
    void parseTargetClean();
154 155 156 157 158 159 160
    void parseCompiler();
    void parseAdd();
    void parseUnit();
    void parseUnknownElement();

    QList<ProjectExplorer::FileNode *> m_fileList;
    QStringList m_includeFiles;
dt's avatar
dt committed
161

dt's avatar
dt committed
162
    CMakeTarget m_target;
dt's avatar
dt committed
163
    bool m_targetType;
dt's avatar
dt committed
164
    QList<CMakeTarget> m_targets;
165
    QString m_projectName;
166
    QString m_compiler;
167 168
};

con's avatar
con committed
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
class CMakeFile : public Core::IFile
{
    Q_OBJECT
public:
    CMakeFile(CMakeProject *parent, QString fileName);

    bool save(const QString &fileName = QString());
    QString fileName() const;

    QString defaultPath() const;
    QString suggestedFileName() const;
    QString mimeType() const;

    bool isModified() const;
    bool isReadOnly() const;
    bool isSaveAsAllowed() const;

    void modified(ReloadBehavior *behavior);
private:
    CMakeProject *m_project;
    QString m_fileName;
};

class CMakeBuildSettingsWidget : public ProjectExplorer::BuildStepConfigWidget
{
194
    Q_OBJECT
con's avatar
con committed
195
public:
196
    CMakeBuildSettingsWidget(CMakeProject *project);
con's avatar
con committed
197 198 199 200 201
    virtual QString displayName() const;

    // This is called to set up the config widget before showing it
    // buildConfiguration is QString::null for the non buildConfiguration specific page
    virtual void init(const QString &buildConfiguration);
202 203 204 205 206 207
private slots:
    void buildDirectoryChanged();
private:
    CMakeProject *m_project;
    Core::Utils::PathChooser *m_pathChooser;
    QString m_buildConfiguration;
con's avatar
con committed
208 209
};

hjk's avatar
hjk committed
210 211
} // namespace Internal
} // namespace CMakeProjectManager
con's avatar
con committed
212 213

#endif // CMAKEPROJECT_H