diff options
Diffstat (limited to 'src/lib/corelib')
-rw-r--r-- | src/lib/corelib/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/lib/corelib/api/internaljobs.cpp | 8 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/buildgraphloader.cpp | 18 | ||||
-rw-r--r-- | src/lib/corelib/corelib.qbs | 2 | ||||
-rw-r--r-- | src/lib/corelib/loader/loader.cpp | 153 | ||||
-rw-r--r-- | src/lib/corelib/loader/loader.h | 84 | ||||
-rw-r--r-- | src/lib/corelib/loader/projectresolver.cpp | 76 | ||||
-rw-r--r-- | src/lib/corelib/loader/projectresolver.h | 9 |
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 ¶meters); - -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 ¶meters) { + 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 ¶meters); private: class Private; |