Files
qt-creator/src/plugins/qmakeprojectmanager/qmakeproject.h

221 lines
8.0 KiB
C
Raw Normal View History

/****************************************************************************
2008-12-02 12:01:29 +01:00
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
2008-12-02 12:01:29 +01:00
**
** This file is part of Qt Creator.
2008-12-02 12:01:29 +01:00
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
2010-12-17 16:01:08 +01:00
**
****************************************************************************/
2008-12-02 16:19:05 +01:00
#pragma once
2008-12-02 12:01:29 +01:00
#include "qmakeprojectmanager_global.h"
#include "qmakeprojectmanager.h"
#include "qmakenodes.h"
#include "qmakeparsernodes.h"
2008-12-02 12:01:29 +01:00
#include <projectexplorer/project.h>
2008-12-02 12:01:29 +01:00
#include <QStringList>
#include <QFutureInterface>
#include <QTimer>
#include <QFuture>
2008-12-02 12:01:29 +01:00
QT_BEGIN_NAMESPACE
class QMakeGlobals;
class QMakeVfs;
2008-12-02 12:01:29 +01:00
QT_END_NAMESPACE
namespace ProjectExplorer { class DeploymentData; }
namespace QtSupport { class ProFileReader; }
namespace QmakeProjectManager {
class QmakeBuildConfiguration;
2008-12-02 12:01:29 +01:00
namespace Internal {
class CentralizedFolderWatcher;
class QmakeProjectFile;
class QmakeProjectFiles;
class QmakeProjectConfigWidget;
}
class QMAKEPROJECTMANAGER_EXPORT QmakeProject : public ProjectExplorer::Project
2008-12-02 12:01:29 +01:00
{
Q_OBJECT
public:
QmakeProject(QmakeManager *manager, const QString &proFile);
~QmakeProject() final;
2008-12-02 12:01:29 +01:00
QString displayName() const final;
QmakeManager *projectManager() const final;
2008-12-02 12:01:29 +01:00
bool supportsKit(ProjectExplorer::Kit *k, QString *errorMesage) const final;
QmakeProFileNode *rootProjectNode() const final;
bool validParse(const Utils::FileName &proFilePath) const;
bool parseInProgress(const Utils::FileName &proFilePath) const;
2008-12-02 12:01:29 +01:00
virtual QStringList files(FilesMode fileMode) const final;
virtual QStringList filesGeneratedFrom(const QString &file) const final;
2008-12-02 12:01:29 +01:00
enum Parsing {ExactParse, ExactAndCumulativeParse };
QList<QmakeProFileNode *> allProFiles(const QList<ProjectType> &projectTypes = QList<ProjectType>(),
Parsing parse = ExactParse) const;
QList<QmakeProFileNode *> applicationProFiles(Parsing parse = ExactParse) const;
bool hasApplicationProFile(const Utils::FileName &path) const;
static QList<QmakeProFileNode *> nodesWithQtcRunnable(QList<QmakeProFileNode *> nodes);
static QList<Core::Id> idsForNodes(Core::Id base, const QList<QmakeProFileNode *> &nodes);
2008-12-02 12:01:29 +01:00
void notifyChanged(const Utils::FileName &name);
/// \internal
QtSupport::ProFileReader *createProFileReader(const QmakeProFileNode *qmakeProFileNode,
QmakeBuildConfiguration *bc = nullptr);
/// \internal
QMakeGlobals *qmakeGlobals();
/// \internal
QMakeVfs *qmakeVfs();
/// \internal
QString qmakeSysroot();
/// \internal
void destroyProFileReader(QtSupport::ProFileReader *reader);
/// \internal
void scheduleAsyncUpdate(QmakeProjectManager::QmakeProFileNode *node,
QmakeParserProFileNode::AsyncUpdateDelay delay = QmakeParserProFileNode::ParseLater);
/// \internal
void incrementPendingEvaluateFutures();
/// \internal
void decrementPendingEvaluateFutures();
/// \internal
bool wasEvaluateCanceled();
// For QmakeProFileNode after a on disk change
void updateFileList();
void updateCodeModels();
void watchFolders(const QStringList &l, QmakePriFileNode *node);
void unwatchFolders(const QStringList &l, QmakePriFileNode *node);
bool needsConfiguration() const final;
void configureAsExampleProject(const QSet<Core::Id> &platforms) final;
bool requiresTargetPanel() const final;
/// \internal
QString disabledReasonForRunConfiguration(const Utils::FileName &proFilePath);
/// used by the default implementation of shadowBuildDirectory
static QString buildNameFor(const ProjectExplorer::Kit *k);
void emitBuildDirectoryInitialized();
static void proFileParseError(const QString &errorMessage);
ProjectExplorer::ProjectImporter *projectImporter() const final;
enum AsyncUpdateState { Base, AsyncFullUpdatePending, AsyncPartialUpdatePending, AsyncUpdateInProgress, ShuttingDown };
AsyncUpdateState asyncUpdateState() const;
QString mapProFilePathToTarget(const Utils::FileName &proFilePath);
signals:
void proFileUpdated(QmakeProjectManager::QmakeProFileNode *node, bool, bool);
void buildDirectoryInitialized();
void proFilesEvaluated();
public:
void scheduleAsyncUpdate(QmakeParserProFileNode::AsyncUpdateDelay delay = QmakeParserProFileNode::ParseLater);
void scheduleAsyncUpdateLater() { scheduleAsyncUpdate(); }
protected:
RestoreResult fromMap(const QVariantMap &map, QString *errorMessage) final;
2008-12-02 12:01:29 +01:00
private:
void asyncUpdate();
void buildFinished(bool success);
void activeTargetWasChanged();
void setAllBuildConfigurationsEnabled(bool enabled);
QString executableFor(const QmakeProFileNode *node);
void updateRunConfigurations();
2008-12-02 12:01:29 +01:00
void updateCppCodeModel();
void updateQmlJSCodeModel();
static void collectAllProFiles(QList<QmakeProFileNode *> &list, QmakeProFileNode *node, Parsing parse,
const QList<ProjectType> &projectTypes);
static void findProFile(const Utils::FileName &fileName, QmakeProFileNode *root, QList<QmakeProFileNode *> &list);
static bool hasSubNode(QmakePriFileNode *root, const Utils::FileName &path);
2008-12-02 12:01:29 +01:00
static bool equalFileList(const QStringList &a, const QStringList &b);
2008-12-02 12:01:29 +01:00
void updateBuildSystemData();
void collectData(const QmakeProFileNode *node, ProjectExplorer::DeploymentData &deploymentData);
void collectApplicationData(const QmakeProFileNode *node,
ProjectExplorer::DeploymentData &deploymentData);
void collectLibraryData(const QmakeProFileNode *node,
ProjectExplorer::DeploymentData &deploymentData);
void startAsyncTimer(QmakeParserProFileNode::AsyncUpdateDelay delay);
bool matchesKit(const ProjectExplorer::Kit *kit);
void warnOnToolChainMismatch(const QmakeProFileNode *pro) const;
void testToolChain(ProjectExplorer::ToolChain *tc, const Utils::FileName &path) const;
mutable QSet<const QPair<Utils::FileName, Utils::FileName>> m_toolChainWarnings;
2008-12-02 12:01:29 +01:00
// Current configuration
QString m_oldQtIncludePath;
QString m_oldQtLibsPath;
// cached lists of all of files
Internal::QmakeProjectFiles *m_projectFiles = nullptr;
2008-12-02 12:01:29 +01:00
QMakeVfs *m_qmakeVfs = nullptr;
// cached data during project rescan
QMakeGlobals *m_qmakeGlobals = nullptr;
int m_qmakeGlobalsRefCnt = 0;
QString m_qmakeSysroot;
QTimer m_asyncUpdateTimer;
QFutureInterface<void> *m_asyncUpdateFutureInterface = nullptr;
int m_pendingEvaluateFuturesCount = 0;
AsyncUpdateState m_asyncUpdateState = Base;
bool m_cancelEvaluate = false;
QList<QmakeProFileNode *> m_partialEvaluate;
2010-03-02 12:51:47 +01:00
QFuture<void> m_codeModelFuture;
Internal::CentralizedFolderWatcher *m_centralizedFolderWatcher = nullptr;
ProjectExplorer::Target *m_activeTarget = nullptr;
mutable ProjectExplorer::ProjectImporter *m_projectImporter = nullptr;
friend class Internal::QmakeProjectFile;
friend class Internal::QmakeProjectConfigWidget;
friend class QmakeManager; // to schedule a async update if the unconfigured settings change
2008-12-02 12:01:29 +01:00
};
} // namespace QmakeProjectManager