Files
qt-creator/src/plugins/qmakeprojectmanager/qmakeproject.h
Tobias Hunger 1094fe5abf Qmake: Fix detection of successful parsing run
Do not report success of a qmake parsing run based on every .pro-file
having reported success. Take the top-level .pro-file's success value
instead.

This fixes e.g. Creator, which has some .pro-files that error out in
some conditions.

Task-number: QTCREATORBUG-18992
Change-Id: I888141e723da84fb780ccd84c86acc25d03f5f28
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
2017-11-03 10:12:59 +00:00

208 lines
7.1 KiB
C++

/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** 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.
**
****************************************************************************/
#pragma once
#include "qmakeprojectmanager_global.h"
#include "qmakeprojectmanager.h"
#include "qmakenodes.h"
#include "qmakeparsernodes.h"
#include <projectexplorer/project.h>
#include <projectexplorer/runconfiguration.h>
#include <QStringList>
#include <QFutureInterface>
#include <QTimer>
#include <QFuture>
QT_BEGIN_NAMESPACE
class QMakeGlobals;
class QMakeVfs;
QT_END_NAMESPACE
namespace CppTools { class CppProjectUpdater; }
namespace ProjectExplorer { class DeploymentData; }
namespace QtSupport { class ProFileReader; }
namespace QmakeProjectManager {
class QmakeBuildConfiguration;
namespace Internal {
class CentralizedFolderWatcher;
class QmakeProjectFiles;
}
class QMAKEPROJECTMANAGER_EXPORT QmakeProject : public ProjectExplorer::Project
{
Q_OBJECT
public:
explicit QmakeProject(const Utils::FileName &proFile);
~QmakeProject() final;
QmakeProFile *rootProFile() const;
bool supportsKit(ProjectExplorer::Kit *k, QString *errorMesage) const final;
QmakeProFileNode *rootProjectNode() const final;
virtual QStringList filesGeneratedFrom(const QString &file) const final;
enum Parsing {ExactParse, ExactAndCumulativeParse };
QList<QmakeProFile *> allProFiles(const QList<ProjectType> &projectTypes = QList<ProjectType>(),
Parsing parse = ExactParse) const;
QList<QmakeProFile *> applicationProFiles(Parsing parse = ExactParse) const;
bool hasApplicationProFile(const Utils::FileName &path) const;
QList<Core::Id> creationIds(Core::Id base,
ProjectExplorer::IRunConfigurationFactory::CreationMode mode,
const QList<ProjectType> &projectTypes = {});
static void notifyChanged(const Utils::FileName &name);
/// \internal
QtSupport::ProFileReader *createProFileReader(const QmakeProFile *qmakeProFile);
/// \internal
QMakeGlobals *qmakeGlobals();
/// \internal
QMakeVfs *qmakeVfs();
/// \internal
QString qmakeSysroot();
/// \internal
void destroyProFileReader(QtSupport::ProFileReader *reader);
/// \internal
void scheduleAsyncUpdate(QmakeProFile *file,
QmakeProFile::AsyncUpdateDelay delay = QmakeProFile::ParseLater);
/// \internal
void incrementPendingEvaluateFutures();
/// \internal
void decrementPendingEvaluateFutures();
/// \internal
bool wasEvaluateCanceled();
void updateCodeModels();
void watchFolders(const QStringList &l, QmakePriFile *file);
void unwatchFolders(const QStringList &l, QmakePriFile *file);
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::QmakeProFile *pro, bool, bool);
void buildDirectoryInitialized();
void proFilesEvaluated();
public:
void scheduleAsyncUpdate(QmakeProFile::AsyncUpdateDelay delay = QmakeProFile::ParseLater);
void scheduleAsyncUpdateLater() { scheduleAsyncUpdate(); }
protected:
RestoreResult fromMap(const QVariantMap &map, QString *errorMessage) final;
private:
void asyncUpdate();
void buildFinished(bool success);
void activeTargetWasChanged();
void setAllBuildConfigurationsEnabled(bool enabled);
QString executableFor(const QmakeProFile *file);
void updateRunConfigurations();
void updateCppCodeModel();
void updateQmlJSCodeModel();
static QList<QmakeProFile *> collectAllProFiles(QmakeProFile *file, Parsing parse,
const QList<ProjectType> &projectTypes);
static bool equalFileList(const QStringList &a, const QStringList &b);
void updateBuildSystemData();
void collectData(const QmakeProFile *file, ProjectExplorer::DeploymentData &deploymentData);
void collectApplicationData(const QmakeProFile *file,
ProjectExplorer::DeploymentData &deploymentData);
void collectLibraryData(const QmakeProFile *file,
ProjectExplorer::DeploymentData &deploymentData);
void startAsyncTimer(QmakeProFile::AsyncUpdateDelay delay);
bool matchesKit(const ProjectExplorer::Kit *kit);
void warnOnToolChainMismatch(const QmakeProFile *pro) const;
void testToolChain(ProjectExplorer::ToolChain *tc, const Utils::FileName &path) const;
mutable QSet<const QPair<Utils::FileName, Utils::FileName>> m_toolChainWarnings;
// Current configuration
QString m_oldQtIncludePath;
QString m_oldQtLibsPath;
std::unique_ptr<QmakeProFile> m_rootProFile;
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<QmakeProFile *> m_partialEvaluate;
CppTools::CppProjectUpdater *m_cppCodeModelUpdater = nullptr;
Internal::CentralizedFolderWatcher *m_centralizedFolderWatcher = nullptr;
ProjectExplorer::Target *m_activeTarget = nullptr;
mutable ProjectExplorer::ProjectImporter *m_projectImporter = nullptr;
};
} // namespace QmakeProjectManager