summaryrefslogtreecommitdiff
path: root/src/lib/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/corelib')
-rw-r--r--src/lib/corelib/CMakeLists.txt2
-rw-r--r--src/lib/corelib/api/internaljobs.cpp8
-rw-r--r--src/lib/corelib/buildgraph/buildgraphloader.cpp18
-rw-r--r--src/lib/corelib/corelib.qbs2
-rw-r--r--src/lib/corelib/loader/loader.cpp153
-rw-r--r--src/lib/corelib/loader/loader.h84
-rw-r--r--src/lib/corelib/loader/projectresolver.cpp76
-rw-r--r--src/lib/corelib/loader/projectresolver.h9
8 files changed, 77 insertions, 275 deletions
diff --git a/src/lib/corelib/CMakeLists.txt b/src/lib/corelib/CMakeLists.txt
index ee551b2ca..0df30295b 100644
--- a/src/lib/corelib/CMakeLists.txt
+++ b/src/lib/corelib/CMakeLists.txt
@@ -248,8 +248,6 @@ set(LOADER_SOURCES
itemreaderastvisitor.h
itemreadervisitorstate.cpp
itemreadervisitorstate.h
- loader.cpp
- loader.h
localprofiles.cpp
localprofiles.h
moduleinstantiator.cpp
diff --git a/src/lib/corelib/api/internaljobs.cpp b/src/lib/corelib/api/internaljobs.cpp
index 8aef79595..894c7a8b1 100644
--- a/src/lib/corelib/api/internaljobs.cpp
+++ b/src/lib/corelib/api/internaljobs.cpp
@@ -50,7 +50,7 @@
#include <buildgraph/rulesevaluationcontext.h>
#include <language/language.h>
#include <language/scriptengine.h>
-#include <loader/loader.h>
+#include <loader/projectresolver.h>
#include <logging/logger.h>
#include <logging/translator.h>
#include <tools/buildgraphlocker.h>
@@ -324,9 +324,9 @@ void InternalSetupProjectJob::execute()
void InternalSetupProjectJob::resolveProjectFromScratch(ScriptEngine *engine)
{
- Loader loader(engine, logger());
- loader.setProgressObserver(observer());
- m_newProject = loader.loadProject(m_parameters);
+ ProjectResolver resolver(engine, logger());
+ resolver.setProgressObserver(observer());
+ m_newProject = resolver.resolve(m_parameters);
QBS_CHECK(m_newProject);
}
diff --git a/src/lib/corelib/buildgraph/buildgraphloader.cpp b/src/lib/corelib/buildgraph/buildgraphloader.cpp
index f0db5f81f..31cda94ee 100644
--- a/src/lib/corelib/buildgraph/buildgraphloader.cpp
+++ b/src/lib/corelib/buildgraph/buildgraphloader.cpp
@@ -52,7 +52,7 @@
#include <language/propertymapinternal.h>
#include <language/qualifiedid.h>
#include <language/resolvedfilecontext.h>
-#include <loader/loader.h>
+#include <loader/projectresolver.h>
#include <logging/categories.h>
#include <logging/translator.h>
#include <tools/buildgraphlocker.h>
@@ -338,19 +338,19 @@ void BuildGraphLoader::trackProjectChanges()
markTransformersForChangeTracking(allRestoredProducts);
if (!m_parameters.overrideBuildGraphData())
m_parameters.setEnvironment(restoredProject->environment);
- Loader ldr(m_evalContext->engine(), m_logger);
- ldr.setProgressObserver(m_evalContext->observer());
- ldr.setOldProjectProbes(restoredProject->probes);
+ ProjectResolver resolver(m_evalContext->engine(), m_logger);
+ resolver.setProgressObserver(m_evalContext->observer());
+ resolver.setOldProjectProbes(restoredProject->probes);
if (!m_parameters.forceProbeExecution())
- ldr.setStoredModuleProviderInfo(restoredProject->moduleProviderInfo);
- ldr.setLastResolveTime(restoredProject->lastStartResolveTime);
+ resolver.setStoredModuleProviderInfo(restoredProject->moduleProviderInfo);
+ resolver.setLastResolveTime(restoredProject->lastStartResolveTime);
QHash<QString, std::vector<ProbeConstPtr>> restoredProbes;
for (const auto &restoredProduct : qAsConst(allRestoredProducts))
restoredProbes.insert(restoredProduct->uniqueName(), restoredProduct->probes);
- ldr.setOldProductProbes(restoredProbes);
+ resolver.setOldProductProbes(restoredProbes);
if (!m_parameters.overrideBuildGraphData())
- ldr.setStoredProfiles(restoredProject->profileConfigs);
- m_result.newlyResolvedProject = ldr.loadProject(m_parameters);
+ resolver.setStoredProfiles(restoredProject->profileConfigs);
+ m_result.newlyResolvedProject = resolver.resolve(m_parameters);
std::vector<ResolvedProductPtr> allNewlyResolvedProducts
= m_result.newlyResolvedProject->allProducts();
diff --git a/src/lib/corelib/corelib.qbs b/src/lib/corelib/corelib.qbs
index 1056970cf..532148d2c 100644
--- a/src/lib/corelib/corelib.qbs
+++ b/src/lib/corelib/corelib.qbs
@@ -337,8 +337,6 @@ QbsLibrary {
"itemreaderastvisitor.h",
"itemreadervisitorstate.cpp",
"itemreadervisitorstate.h",
- "loader.cpp",
- "loader.h",
"localprofiles.cpp",
"localprofiles.h",
"moduleinstantiator.cpp",
diff --git a/src/lib/corelib/loader/loader.cpp b/src/lib/corelib/loader/loader.cpp
deleted file mode 100644
index e0ef3ca64..000000000
--- a/src/lib/corelib/loader/loader.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qbs.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** 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 Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** 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-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "loader.h"
-
-#include "projectresolver.h"
-
-#include <language/language.h>
-#include <language/scriptengine.h>
-#include <logging/translator.h>
-#include <tools/fileinfo.h>
-#include <tools/profile.h>
-#include <tools/progressobserver.h>
-#include <tools/qbsassert.h>
-#include <tools/settings.h>
-#include <tools/setupprojectparameters.h>
-#include <tools/stringconstants.h>
-
-#include <QtCore/qdir.h>
-#include <QtCore/qobject.h>
-
-namespace qbs {
-namespace Internal {
-
-Loader::Loader(ScriptEngine *engine, Logger logger)
- : m_logger(std::move(logger))
- , m_progressObserver(nullptr)
- , m_engine(engine)
-{
- m_logger.storeWarnings();
-}
-
-void Loader::setProgressObserver(ProgressObserver *observer)
-{
- m_progressObserver = observer;
-}
-
-void Loader::setOldProjectProbes(const std::vector<ProbeConstPtr> &oldProbes)
-{
- m_oldProjectProbes = oldProbes;
-}
-
-void Loader::setOldProductProbes(const QHash<QString, std::vector<ProbeConstPtr>> &oldProbes)
-{
- m_oldProductProbes = oldProbes;
-}
-
-void Loader::setStoredProfiles(const QVariantMap &profiles)
-{
- m_storedProfiles = profiles;
-}
-
-void Loader::setStoredModuleProviderInfo(const StoredModuleProviderInfo &providerInfo)
-{
- m_storedModuleProviderInfo = providerInfo;
-}
-
-TopLevelProjectPtr Loader::loadProject(const SetupProjectParameters &_parameters)
-{
- SetupProjectParameters parameters = _parameters;
-
- if (parameters.topLevelProfile().isEmpty()) {
- Settings settings(parameters.settingsDirectory());
- QString profileName = settings.defaultProfile();
- if (profileName.isEmpty()) {
- m_logger.qbsDebug() << Tr::tr("No profile specified and no default profile exists. "
- "Using default property values.");
- profileName = Profile::fallbackName();
- }
- parameters.setTopLevelProfile(profileName);
- parameters.expandBuildConfiguration();
- }
-
- parameters.finalizeProjectFilePath();
- QBS_CHECK(QFileInfo(parameters.projectFilePath()).isAbsolute());
- m_logger.qbsDebug() << "Using project file '"
- << QDir::toNativeSeparators(parameters.projectFilePath()) << "'.";
-
- m_engine->setEnvironment(parameters.adjustedEnvironment());
- m_engine->checkAndClearException({});
- m_engine->clearImportsCache();
- m_engine->clearRequestedProperties();
- m_engine->enableProfiling(parameters.logElapsedTime());
- m_logger.clearWarnings();
- EvalContextSwitcher evalContextSwitcher(m_engine, EvalContext::PropertyEvaluation);
-
- // At this point, we cannot set a sensible total effort, because we know nothing about
- // the project yet. That's why we use a placeholder here, so the user at least
- // sees that an operation is starting. The real total effort will be set later when
- // we have enough information.
- if (m_progressObserver) {
- m_progressObserver->initialize(Tr::tr("Resolving project for configuration %1")
- .arg(TopLevelProject::deriveId(parameters.finalBuildConfigurationTree())), 1);
- m_progressObserver->setScriptEngine(m_engine);
- }
-
- const FileTime resolveTime = FileTime::currentTime();
- ProjectResolver resolver(parameters, m_engine, m_logger);
- resolver.setProgressObserver(m_progressObserver);
- resolver.setOldProjectProbes(m_oldProjectProbes);
- resolver.setOldProductProbes(m_oldProductProbes);
- resolver.setLastResolveTime(m_lastResolveTime);
- resolver.setStoredProfiles(m_storedProfiles);
- resolver.setStoredModuleProviderInfo(m_storedModuleProviderInfo);
- TopLevelProjectPtr project = resolver.resolve();
- project->lastStartResolveTime = resolveTime;
- project->lastEndResolveTime = FileTime::currentTime();
-
- // E.g. if the top-level project is disabled.
- if (m_progressObserver)
- m_progressObserver->setFinished();
-
- return project;
-}
-
-} // namespace Internal
-} // namespace qbs
diff --git a/src/lib/corelib/loader/loader.h b/src/lib/corelib/loader/loader.h
deleted file mode 100644
index 227b5cdd9..000000000
--- a/src/lib/corelib/loader/loader.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qbs.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** 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 Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** 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-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#ifndef QBS_LOADER_H
-#define QBS_LOADER_H
-
-#include <language/forward_decls.h>
-#include <language/moduleproviderinfo.h>
-#include <logging/logger.h>
-#include <tools/filetime.h>
-
-#include <QtCore/qstringlist.h>
-
-namespace qbs {
-class Settings;
-class SetupProjectParameters;
-namespace Internal {
-class Logger;
-class ProgressObserver;
-class ScriptEngine;
-
-class QBS_AUTOTEST_EXPORT Loader
-{
-public:
- Loader(ScriptEngine *engine, Logger logger);
-
- void setProgressObserver(ProgressObserver *observer);
- void setOldProjectProbes(const std::vector<ProbeConstPtr> &oldProbes);
- void setOldProductProbes(const QHash<QString, std::vector<ProbeConstPtr>> &oldProbes);
- void setLastResolveTime(const FileTime &time) { m_lastResolveTime = time; }
- void setStoredProfiles(const QVariantMap &profiles);
- void setStoredModuleProviderInfo(const StoredModuleProviderInfo &providerInfo);
- TopLevelProjectPtr loadProject(const SetupProjectParameters &parameters);
-
-private:
- Logger m_logger;
- ProgressObserver *m_progressObserver;
- ScriptEngine * const m_engine;
- std::vector<ProbeConstPtr> m_oldProjectProbes;
- QHash<QString, std::vector<ProbeConstPtr>> m_oldProductProbes;
- StoredModuleProviderInfo m_storedModuleProviderInfo;
- QVariantMap m_storedProfiles;
- FileTime m_lastResolveTime;
-};
-
-} // namespace Internal
-} // namespace qbs
-
-#endif // QBS_LOADER_H
diff --git a/src/lib/corelib/loader/projectresolver.cpp b/src/lib/corelib/loader/projectresolver.cpp
index a7eb562c3..994436b61 100644
--- a/src/lib/corelib/loader/projectresolver.cpp
+++ b/src/lib/corelib/loader/projectresolver.cpp
@@ -56,18 +56,19 @@
#include <language/scriptengine.h>
#include <language/value.h>
#include <logging/categories.h>
-#include <logging/logger.h>
#include <logging/translator.h>
#include <tools/error.h>
#include <tools/fileinfo.h>
#include <tools/joblimits.h>
#include <tools/jsliterals.h>
+#include <tools/profile.h>
#include <tools/profiling.h>
#include <tools/progressobserver.h>
#include <tools/scripttools.h>
#include <tools/qbsassert.h>
#include <tools/qttools.h>
#include <tools/set.h>
+#include <tools/settings.h>
#include <tools/setupprojectparameters.h>
#include <tools/stlutils.h>
#include <tools/stringconstants.h>
@@ -127,11 +128,7 @@ class CancelException { };
class ProjectResolver::Private
{
public:
- Private(const SetupProjectParameters &setupParameters,
- ScriptEngine *engine, Logger &logger)
- : setupParams(setupParameters), engine(engine), evaluator(engine),
- logger(logger)
- {}
+ Private(ScriptEngine *engine, Logger &&logger) : engine(engine), logger(std::move(logger)) {}
static void applyFileTaggers(const SourceArtifactPtr &artifact,
const ResolvedProductConstPtr &product);
@@ -139,6 +136,7 @@ public:
const ResolvedProductPtr &rproduct, const QString &fileName, const GroupPtr &group,
bool wildcard, const CodeLocation &filesLocation = CodeLocation(),
FileLocations *fileLocations = nullptr, ErrorInfo *errorInfo = nullptr);
+ void finalizeProjectParameters();
void checkCancelation() const;
QString verbatimValue(const ValueConstPtr &value, bool *propertyWasSet = nullptr) const;
QString verbatimValue(Item *item, const QString &name, bool *propertyWasSet = nullptr) const;
@@ -222,12 +220,12 @@ public:
using ItemFuncMap = QMap<ItemType, ItemFuncPtr>;
void callItemFunction(const ItemFuncMap &mappings, Item *item, ProjectContext *projectContext);
- const SetupProjectParameters &setupParams;
- ProjectTreeBuilder::Result loadResult;
ScriptEngine * const engine;
- Evaluator evaluator;
- Logger &logger;
+ mutable Logger logger;
+ Evaluator evaluator{engine};
ItemPool itemPool;
+ SetupProjectParameters setupParams;
+ ProjectTreeBuilder::Result loadResult;
ProgressObserver *progressObserver = nullptr;
ProductContext *productContext = nullptr;
ModuleContext *moduleContext = nullptr;
@@ -252,11 +250,10 @@ public:
};
-ProjectResolver::ProjectResolver(const SetupProjectParameters &setupParameters,
- ScriptEngine *engine, Logger &logger)
- : d(new Private(setupParameters, engine, logger))
+ProjectResolver::ProjectResolver(ScriptEngine *engine, Logger logger)
+ : d(new Private(engine, std::move(logger)))
{
- QBS_CHECK(FileInfo::isAbsolute(d->setupParams.buildRoot()));
+ d->logger.storeWarnings();
}
ProjectResolver::~ProjectResolver()
@@ -314,12 +311,36 @@ static void checkForDuplicateProductNames(const TopLevelProjectConstPtr &project
}
}
-TopLevelProjectPtr ProjectResolver::resolve()
+TopLevelProjectPtr ProjectResolver::resolve(const SetupProjectParameters &parameters)
{
+ d->setupParams = parameters;
+ d->finalizeProjectParameters();
+ QBS_CHECK(FileInfo::isAbsolute(d->setupParams.buildRoot()));
+
TimedActivityLogger projectResolverTimer(d->logger, Tr::tr("ProjectResolver"),
d->setupParams.logElapsedTime());
qCDebug(lcProjectResolver) << "resolving" << d->setupParams.projectFilePath();
+ d->engine->setEnvironment(d->setupParams.adjustedEnvironment());
+ d->engine->checkAndClearException({});
+ d->engine->clearImportsCache();
+ d->engine->clearRequestedProperties();
+ d->engine->enableProfiling(d->setupParams.logElapsedTime());
+ d->logger.clearWarnings();
+ EvalContextSwitcher evalContextSwitcher(d->engine, EvalContext::PropertyEvaluation);
+
+ // At this point, we cannot set a sensible total effort, because we know nothing about
+ // the project yet. That's why we use a placeholder here, so the user at least
+ // sees that an operation is starting. The real total effort will be set later when
+ // we have enough information.
+ if (d->progressObserver) {
+ d->progressObserver->initialize(Tr::tr("Resolving project for configuration %1")
+ .arg(TopLevelProject::deriveId(d->setupParams.finalBuildConfigurationTree())), 1);
+ d->progressObserver->setScriptEngine(d->engine);
+ }
+
+ const FileTime resolveTime = FileTime::currentTime();
+ TopLevelProjectPtr tlp;
ProjectTreeBuilder projectTreeBuilder(d->setupParams, d->itemPool, d->evaluator, d->logger);
projectTreeBuilder.setProgressObserver(d->progressObserver);
projectTreeBuilder.setOldProjectProbes(d->oldProjectProbes);
@@ -328,8 +349,6 @@ TopLevelProjectPtr ProjectResolver::resolve()
projectTreeBuilder.setStoredProfiles(d->storedProfiles);
projectTreeBuilder.setStoredModuleProviderInfo(d->storedModuleProviderInfo);
d->loadResult = projectTreeBuilder.load();
-
- TopLevelProjectPtr tlp;
try {
tlp = d->resolveTopLevelProject();
d->printProfilingInfo();
@@ -338,6 +357,12 @@ TopLevelProjectPtr ProjectResolver::resolve()
.arg(TopLevelProject::deriveId(
d->setupParams.finalBuildConfigurationTree())));
}
+ tlp->lastStartResolveTime = resolveTime;
+ tlp->lastEndResolveTime = FileTime::currentTime();
+
+ // E.g. if the top-level project is disabled.
+ if (d->progressObserver)
+ d->progressObserver->setFinished();
return tlp;
}
@@ -807,6 +832,23 @@ SourceArtifactPtr ProjectResolver::Private::createSourceArtifact(
return artifact;
}
+void ProjectResolver::Private::finalizeProjectParameters()
+{
+ if (setupParams.topLevelProfile().isEmpty()) {
+ Settings settings(setupParams.settingsDirectory());
+ QString profileName = settings.defaultProfile();
+ if (profileName.isEmpty()) {
+ logger.qbsDebug() << Tr::tr("No profile specified and no default profile exists. "
+ "Using default property values.");
+ profileName = Profile::fallbackName();
+ }
+ setupParams.setTopLevelProfile(profileName);
+ setupParams.expandBuildConfiguration();
+ }
+ setupParams.finalizeProjectFilePath();
+ QBS_CHECK(QFileInfo(setupParams.projectFilePath()).isAbsolute());
+}
+
static QualifiedIdSet propertiesToEvaluate(std::deque<QualifiedId> initialProps,
const PropertyDependencies &deps)
{
diff --git a/src/lib/corelib/loader/projectresolver.h b/src/lib/corelib/loader/projectresolver.h
index eaa88fd63..94a88c614 100644
--- a/src/lib/corelib/loader/projectresolver.h
+++ b/src/lib/corelib/loader/projectresolver.h
@@ -41,6 +41,8 @@
#define PROJECTRESOLVER_H
#include <language/forward_decls.h>
+#include <logging/logger.h>
+#include <tools/qbs_export.h>
#include <QHash>
#include <QVariant>
@@ -56,11 +58,10 @@ class ProgressObserver;
class ScriptEngine;
class StoredModuleProviderInfo;
-class ProjectResolver
+class QBS_AUTOTEST_EXPORT ProjectResolver
{
public:
- ProjectResolver(const SetupProjectParameters &setupParameters,
- ScriptEngine *engine, Logger &logger);
+ ProjectResolver(ScriptEngine *engine, Logger logger);
~ProjectResolver();
void setProgressObserver(ProgressObserver *observer);
@@ -69,7 +70,7 @@ public:
void setLastResolveTime(const FileTime &time);
void setStoredProfiles(const QVariantMap &profiles);
void setStoredModuleProviderInfo(const StoredModuleProviderInfo &providerInfo);
- TopLevelProjectPtr resolve();
+ TopLevelProjectPtr resolve(const SetupProjectParameters &parameters);
private:
class Private;