From 05ef86ccaf7a4be0737f0af0bf61c69bd6f2e97a Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 15 Jul 2014 11:42:56 +0200 Subject: Speed up project re-resolving by skipping the loading from file. When re-resolving an existing project, the build graph already exists in memory and does not have to be read from disk. Change-Id: Icf5cf7396a859d4ee1c495b8cc4fa7a1ee61ff1d Reviewed-by: Joerg Bornemann --- src/app/qbs/commandlinefrontend.cpp | 2 +- src/lib/corelib/api/internaljobs.cpp | 56 ++++++++++++--------- src/lib/corelib/api/internaljobs.h | 6 ++- src/lib/corelib/api/jobs.cpp | 23 +++++++-- src/lib/corelib/api/jobs.h | 8 ++- src/lib/corelib/api/project.cpp | 6 ++- src/lib/corelib/api/project.h | 4 +- src/lib/corelib/api/project_p.h | 2 +- src/lib/corelib/buildgraph/buildgraphloader.cpp | 44 ++++++++++------ src/lib/corelib/buildgraph/buildgraphloader.h | 6 ++- tests/auto/api/tst_api.cpp | 67 +++++++++++-------------- 11 files changed, 133 insertions(+), 91 deletions(-) diff --git a/src/app/qbs/commandlinefrontend.cpp b/src/app/qbs/commandlinefrontend.cpp index 1a958935c..5ecd22f71 100644 --- a/src/app/qbs/commandlinefrontend.cpp +++ b/src/app/qbs/commandlinefrontend.cpp @@ -145,7 +145,7 @@ void CommandLineFrontend::start() params.setBuildVariant(buildVariant); params.setBuildRoot(buildDirectory(profileName)); params.setOverriddenValues(userConfig); - SetupProjectJob * const job = Project::setupProject(params, + SetupProjectJob * const job = Project().setupProject(params, ConsoleLogger::instance().logSink(), this); connectJob(job); m_resolveJobs << job; diff --git a/src/lib/corelib/api/internaljobs.cpp b/src/lib/corelib/api/internaljobs.cpp index a3789f31d..f9159146d 100644 --- a/src/lib/corelib/api/internaljobs.cpp +++ b/src/lib/corelib/api/internaljobs.cpp @@ -204,8 +204,10 @@ InternalSetupProjectJob::~InternalSetupProjectJob() { } -void InternalSetupProjectJob::init(const SetupProjectParameters ¶meters) +void InternalSetupProjectJob::init(const TopLevelProjectPtr &existingProject, + const SetupProjectParameters ¶meters) { + m_existingProject = existingProject; m_parameters = parameters; setTimed(parameters.logElapsedTime()); } @@ -218,28 +220,33 @@ void InternalSetupProjectJob::reportError(const ErrorInfo &error) TopLevelProjectPtr InternalSetupProjectJob::project() const { - return m_project; + return m_newProject; } void InternalSetupProjectJob::start() { - BuildGraphLocker *bgLocker = 0; + BuildGraphLocker *bgLocker = m_existingProject ? m_existingProject->bgLocker : 0; try { const ErrorInfo err = m_parameters.expandBuildConfiguration(); if (err.hasError()) throw err; - const QString projectId = TopLevelProject::deriveId(m_parameters.topLevelProfile(), - m_parameters.finalBuildConfigurationTree()); - const QString buildDir - = TopLevelProject::deriveBuildDirectory(m_parameters.buildRoot(), projectId); - bgLocker = new BuildGraphLocker(ProjectBuildData::deriveBuildGraphFilePath(buildDir, - projectId)); + if (!bgLocker) { + const QString projectId = TopLevelProject::deriveId(m_parameters.topLevelProfile(), + m_parameters.finalBuildConfigurationTree()); + const QString buildDir + = TopLevelProject::deriveBuildDirectory(m_parameters.buildRoot(), projectId); + bgLocker = new BuildGraphLocker(ProjectBuildData::deriveBuildGraphFilePath(buildDir, + projectId)); + } execute(); - m_project->bgLocker = bgLocker; + if (m_existingProject) + m_existingProject->bgLocker = 0; + m_newProject->bgLocker = bgLocker; } catch (const ErrorInfo &error) { - m_project.clear(); + m_newProject.clear(); setError(error); - delete bgLocker; + if (!m_existingProject) + delete bgLocker; } emit finished(this); } @@ -255,28 +262,28 @@ void InternalSetupProjectJob::execute() resolveBuildDataFromScratch(evalContext); break; case SetupProjectParameters::RestoreOnly: - m_project = restoreProject(evalContext).loadedProject; + m_newProject = restoreProject(evalContext).loadedProject; break; case SetupProjectParameters::RestoreAndTrackChanges: { const BuildGraphLoadResult loadResult = restoreProject(evalContext); - m_project = loadResult.newlyResolvedProject; - if (!m_project) - m_project = loadResult.loadedProject; - if (!m_project) { + m_newProject = loadResult.newlyResolvedProject; + if (!m_newProject) + m_newProject = loadResult.loadedProject; + if (!m_newProject) { resolveProjectFromScratch(evalContext->engine()); resolveBuildDataFromScratch(evalContext); } else { - QBS_CHECK(m_project->buildData); + QBS_CHECK(m_newProject->buildData); } break; } } if (!m_parameters.dryRun()) - storeBuildGraph(m_project); + storeBuildGraph(m_newProject); // The evalutation context cannot be re-used for building, which runs in a different thread. - m_project->buildData->evaluationContext.clear(); + m_newProject->buildData->evaluationContext.clear(); } void InternalSetupProjectJob::resolveProjectFromScratch(ScriptEngine *engine) @@ -284,20 +291,21 @@ void InternalSetupProjectJob::resolveProjectFromScratch(ScriptEngine *engine) Loader loader(engine, logger()); loader.setSearchPaths(m_parameters.searchPaths()); loader.setProgressObserver(observer()); - m_project = loader.loadProject(m_parameters); - QBS_CHECK(m_project); + m_newProject = loader.loadProject(m_parameters); + QBS_CHECK(m_newProject); } void InternalSetupProjectJob::resolveBuildDataFromScratch(const RulesEvaluationContextPtr &evalContext) { TimedActivityLogger resolveLogger(logger(), QLatin1String("Resolving build project")); - BuildDataResolver(logger()).resolveBuildData(m_project, evalContext); + BuildDataResolver(logger()).resolveBuildData(m_newProject, evalContext); } BuildGraphLoadResult InternalSetupProjectJob::restoreProject(const RulesEvaluationContextPtr &evalContext) { BuildGraphLoader bgLoader(m_parameters.adjustedEnvironment(), logger()); - const BuildGraphLoadResult loadResult = bgLoader.load(m_parameters, evalContext); + const BuildGraphLoadResult loadResult + = bgLoader.load(m_existingProject, m_parameters, evalContext); return loadResult; } diff --git a/src/lib/corelib/api/internaljobs.h b/src/lib/corelib/api/internaljobs.h index a31a638f8..566698df3 100644 --- a/src/lib/corelib/api/internaljobs.h +++ b/src/lib/corelib/api/internaljobs.h @@ -48,6 +48,7 @@ class Settings; namespace Internal { class BuildGraphLoadResult; +class BuildGraphLocker; class Executor; class JobObserver; class ScriptEngine; @@ -118,7 +119,7 @@ public: InternalSetupProjectJob(const Logger &logger); ~InternalSetupProjectJob(); - void init(const SetupProjectParameters ¶meters); + void init(const TopLevelProjectPtr &existingProject, const SetupProjectParameters ¶meters); void reportError(const ErrorInfo &error); TopLevelProjectPtr project() const; @@ -132,7 +133,8 @@ private: BuildGraphLoadResult restoreProject(const RulesEvaluationContextPtr &evalContext); void execute(); - TopLevelProjectPtr m_project; + TopLevelProjectPtr m_existingProject; + TopLevelProjectPtr m_newProject; SetupProjectParameters m_parameters; }; diff --git a/src/lib/corelib/api/jobs.cpp b/src/lib/corelib/api/jobs.cpp index 7c30c39e2..035a0bf8f 100644 --- a/src/lib/corelib/api/jobs.cpp +++ b/src/lib/corelib/api/jobs.cpp @@ -29,7 +29,7 @@ #include "jobs.h" #include "internaljobs.h" -#include "project.h" +#include "project_p.h" #include #include @@ -187,6 +187,7 @@ void AbstractJob::handleTaskProgress(int newProgressValue) void AbstractJob::handleFinished() { QBS_ASSERT(m_state != StateFinished, return); + finish(); m_state = StateFinished; unlockProject(); emit finished(!error().hasError(), this); @@ -220,13 +221,19 @@ Project SetupProjectJob::project() const return Project(job->project(), job->logger()); } -void SetupProjectJob::resolve(const SetupProjectParameters ¶meters) +void SetupProjectJob::resolve(const Project &existingProject, + const SetupProjectParameters ¶meters) { + m_existingProject = existingProject; + const TopLevelProjectPtr &existingInternalProject + = existingProject.d ? existingProject.d->internalProject : TopLevelProjectPtr(); + if (existingInternalProject && !lockProject(existingInternalProject)) + return; InternalJobThreadWrapper * const wrapper = qobject_cast(internalJob()); InternalSetupProjectJob * const job = qobject_cast(wrapper->synchronousJob()); - job->init(parameters); + job->init(existingInternalProject, parameters); wrapper->start(); } @@ -239,6 +246,16 @@ void SetupProjectJob::reportError(const ErrorInfo &error) job->reportError(error); } +void SetupProjectJob::finish() +{ + // If the new project was successfully created, invalidate the existing one. + // The invariant is that there must always be at most one valid Project object + // for the same build directory, so that exclusive ownership of the build graph lock + // is ensured. + if (m_existingProject.isValid() && !error().hasError()) + m_existingProject.d->internalProject.clear(); +} + /*! * \class ProcessResult * \brief The \c ProcessResult class represents the result of one external program run by Qbs. diff --git a/src/lib/corelib/api/jobs.h b/src/lib/corelib/api/jobs.h index eaac19018..32459f262 100644 --- a/src/lib/corelib/api/jobs.h +++ b/src/lib/corelib/api/jobs.h @@ -29,6 +29,7 @@ #ifndef QBS_JOBS_H #define QBS_JOBS_H +#include "project.h" #include "../language/forward_decls.h" #include "../tools/error.h" #include "../tools/qbs_export.h" @@ -85,6 +86,7 @@ private slots: private: void unlockProject(); + virtual void finish() { } Internal::InternalJob * const m_internalJob; Internal::TopLevelProjectPtr m_project; @@ -102,8 +104,12 @@ public: private: SetupProjectJob(const Internal::Logger &logger, QObject *parent); - void resolve(const SetupProjectParameters ¶meters); + void resolve(const Project &existingProject, const SetupProjectParameters ¶meters); void reportError(const ErrorInfo &error); + + void finish(); + + Project m_existingProject; }; class QBS_EXPORT BuildJob : public AbstractJob diff --git a/src/lib/corelib/api/project.cpp b/src/lib/corelib/api/project.cpp index 4a641336c..1aa101717 100644 --- a/src/lib/corelib/api/project.cpp +++ b/src/lib/corelib/api/project.cpp @@ -663,6 +663,10 @@ Project &Project::operator=(const Project &other) * \brief Sets up a \c Project from a source file, possibly re-using previously stored information. * The function will finish immediately, returning a \c SetupProjectJob which can be used to * track the results of the operation. + * If the function is called on a valid \c Project object, the build graph will not be loaded + * from a file, but will be taken from the existing project. In that case, if resolving + * finishes successfully, the existing project will be invalidated. If resolving fails, the + * existing \c Project object stays as it is. * \note The qbs plugins will only be loaded once. As a result, the value of * \c parameters.pluginPaths will only have an effect the first time this function is called. * Similarly, the value of \c parameters.searchPaths will not have an effect if @@ -675,7 +679,7 @@ SetupProjectJob *Project::setupProject(const SetupProjectParameters ¶meters, SetupProjectJob * const job = new SetupProjectJob(logger, jobOwner); try { loadPlugins(parameters.pluginPaths(), logger); - job->resolve(parameters); + job->resolve(*this, parameters); } catch (const ErrorInfo &error) { // Throwing from here would complicate the API, so let's report the error the same way // as all others, via AbstractJob::error(). diff --git a/src/lib/corelib/api/project.h b/src/lib/corelib/api/project.h index 871f6210d..a68bbc1c0 100644 --- a/src/lib/corelib/api/project.h +++ b/src/lib/corelib/api/project.h @@ -72,8 +72,8 @@ class QBS_EXPORT Project friend class SetupProjectJob; friend uint qHash(const Project &p); public: - static SetupProjectJob *setupProject(const SetupProjectParameters ¶meters, - ILogSink *logSink, QObject *jobOwner); + SetupProjectJob *setupProject(const SetupProjectParameters ¶meters, + ILogSink *logSink, QObject *jobOwner); Project(); Project(const Project &other); diff --git a/src/lib/corelib/api/project_p.h b/src/lib/corelib/api/project_p.h index 25ab09ca7..2c6dddf73 100644 --- a/src/lib/corelib/api/project_p.h +++ b/src/lib/corelib/api/project_p.h @@ -103,7 +103,7 @@ public: const CodeLocation &changeLocation, int lineOffset); void prepareChangeToProject(); - const TopLevelProjectPtr internalProject; + TopLevelProjectPtr internalProject; Logger logger; private: diff --git a/src/lib/corelib/buildgraph/buildgraphloader.cpp b/src/lib/corelib/buildgraph/buildgraphloader.cpp index f31ef0794..4ea222fcf 100644 --- a/src/lib/corelib/buildgraph/buildgraphloader.cpp +++ b/src/lib/corelib/buildgraph/buildgraphloader.cpp @@ -98,20 +98,29 @@ static void restoreBackPointers(const ResolvedProjectPtr &project) } } -BuildGraphLoadResult BuildGraphLoader::load(const SetupProjectParameters ¶meters, - const RulesEvaluationContextPtr &evalContext) +BuildGraphLoadResult BuildGraphLoader::load(const TopLevelProjectPtr &existingProject, + const SetupProjectParameters ¶meters, + const RulesEvaluationContextPtr &evalContext) { m_parameters = parameters; m_result = BuildGraphLoadResult(); m_evalContext = evalContext; - loadBuildGraphFromDisk(); + + if (existingProject) { + QBS_CHECK(existingProject->buildData); + existingProject->buildData->evaluationContext = evalContext; + checkBuildGraphCompatibility(existingProject); + m_result.loadedProject = existingProject; + } else { + loadBuildGraphFromDisk(); + } if (!m_result.loadedProject) return m_result; if (parameters.restoreBehavior() == SetupProjectParameters::RestoreOnly) return m_result; QBS_CHECK(parameters.restoreBehavior() == SetupProjectParameters::RestoreAndTrackChanges); - trackProjectChanges(m_result.loadedProject); + trackProjectChanges(); return m_result; } @@ -142,11 +151,23 @@ void BuildGraphLoader::loadBuildGraphFromDisk() project->load(pool); project->buildData->evaluationContext = m_evalContext; + project->setBuildConfiguration(pool.headData().projectConfig); + project->buildDirectory = buildDir; + checkBuildGraphCompatibility(project); + restoreBackPointers(project); + project->location = CodeLocation(m_parameters.projectFilePath(), project->location.line(), + project->location.column()); + m_result.loadedProject = project; + m_evalContext->incrementProgressValue(); + doSanityChecks(project, m_logger); +} +void BuildGraphLoader::checkBuildGraphCompatibility(const TopLevelProjectConstPtr &project) +{ if (QFileInfo(project->location.fileName()) != QFileInfo(m_parameters.projectFilePath())) { QString errorMessage = Tr::tr("Stored build graph at '%1' is for project file '%2', but " "input file is '%3'. ") - .arg(QDir::toNativeSeparators(buildGraphFilePath), + .arg(QDir::toNativeSeparators(project->buildGraphFilePath()), QDir::toNativeSeparators(project->location.fileName()), QDir::toNativeSeparators(m_parameters.projectFilePath())); if (!m_parameters.ignoreDifferentProjectFilePath()) { @@ -158,20 +179,11 @@ void BuildGraphLoader::loadBuildGraphFromDisk() errorMessage += Tr::tr("Ignoring."); m_logger.qbsWarning() << errorMessage; } - - restoreBackPointers(project); - - project->location = CodeLocation(m_parameters.projectFilePath(), project->location.line(), - project->location.column()); - project->setBuildConfiguration(pool.headData().projectConfig); - project->buildDirectory = buildDir; - m_result.loadedProject = project; - m_evalContext->incrementProgressValue(); - doSanityChecks(project, m_logger); } -void BuildGraphLoader::trackProjectChanges(const TopLevelProjectPtr &restoredProject) +void BuildGraphLoader::trackProjectChanges() { + const TopLevelProjectPtr &restoredProject = m_result.loadedProject; QSet buildSystemFiles = restoredProject->buildSystemFiles; QList allRestoredProducts = restoredProject->allProducts(); QList changedProducts; diff --git a/src/lib/corelib/buildgraph/buildgraphloader.h b/src/lib/corelib/buildgraph/buildgraphloader.h index 57285b62a..d0ae8cae9 100644 --- a/src/lib/corelib/buildgraph/buildgraphloader.h +++ b/src/lib/corelib/buildgraph/buildgraphloader.h @@ -64,12 +64,14 @@ public: BuildGraphLoader(const QProcessEnvironment &env, const Logger &logger); ~BuildGraphLoader(); - BuildGraphLoadResult load(const SetupProjectParameters ¶meters, + BuildGraphLoadResult load(const TopLevelProjectPtr &existingProject, + const SetupProjectParameters ¶meters, const RulesEvaluationContextPtr &evalContext); private: void loadBuildGraphFromDisk(); - void trackProjectChanges(const TopLevelProjectPtr &restoredProject); + void checkBuildGraphCompatibility(const TopLevelProjectConstPtr &project); + void trackProjectChanges(); bool hasEnvironmentChanged(const TopLevelProjectConstPtr &restoredProject) const; bool hasFileExistsResultChanged(const TopLevelProjectConstPtr &restoredProject) const; bool hasFileLastModifiedResultChanged(const TopLevelProjectConstPtr &restoredProject) const; diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index db0fc4d41..a9ad4b731 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -126,13 +126,13 @@ void TestApi::buildGraphLocking() qbs::SetupProjectParameters setupParams = defaultSetupParameters(); const QString projectDirPath = QDir::cleanPath(m_workingDataDir + "/buildgraph-locking"); setupParams.setProjectFilePath(projectDirPath + "/project.qbs"); - QScopedPointer setupJob(qbs::Project::setupProject(setupParams, + QScopedPointer setupJob(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString())); const qbs::Project project = setupJob->project(); Q_UNUSED(project); - setupJob.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); + setupJob.reset(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY(setupJob->error().hasError()); QVERIFY2(setupJob->error().toString().contains("lock"), @@ -144,8 +144,8 @@ void TestApi::buildSingleFile() qbs::SetupProjectParameters setupParams = defaultSetupParameters(); const QString projectDirPath = QDir::cleanPath(m_workingDataDir + "/build-single-file"); setupParams.setProjectFilePath(projectDirPath + "/project.qbs"); - QScopedPointer setupJob(qbs::Project::setupProject(setupParams, - m_logSink, 0)); + QScopedPointer setupJob(qbs::Project().setupProject(setupParams, + m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString())); qbs::Project project = setupJob->project(); @@ -179,7 +179,7 @@ void TestApi::changeContent() qbs::SetupProjectParameters setupParams = defaultSetupParameters(); setupParams.setProjectFilePath(QDir::cleanPath(m_workingDataDir + "/project-editing/project.qbs")); - QScopedPointer job(qbs::Project::setupProject(setupParams, + QScopedPointer job(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); @@ -349,9 +349,7 @@ void TestApi::changeContent() // Now check whether the data updates were done correctly. projectData = project.projectData(); - buildJob.reset(0); - project = qbs::Project(); - job.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); + job.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); project = job->project(); @@ -395,9 +393,7 @@ void TestApi::changeContent() setupParams.setProjectFilePath(QDir::cleanPath(m_workingDataDir + "/project-editing/project-with-no-files.qbs")); - buildJob.reset(0); - project = qbs::Project(); - job.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); + job.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); project = job->project(); @@ -414,9 +410,7 @@ void TestApi::changeContent() waitForFinished(buildJob.data()); QVERIFY2(!buildJob->error().hasError(), qPrintable(buildJob->error().toString())); QVERIFY(rcvr.descriptions.contains("compiling main.cpp")); - buildJob.reset(0); - project = qbs::Project(); - job.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); + job.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); if (job->project().projectData() != projectData) { @@ -441,7 +435,7 @@ void TestApi::disabledInstallGroup() qbs::SetupProjectParameters setupParams = defaultSetupParameters(); setupParams.setProjectFilePath(QDir::cleanPath(m_workingDataDir + "/disabled_install_group/project.qbs")); - QScopedPointer job(qbs::Project::setupProject(setupParams, + QScopedPointer job(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); @@ -467,8 +461,8 @@ void TestApi::fileTagsFilterOverride() qbs::SetupProjectParameters setupParams = defaultSetupParameters(); setupParams.setProjectFilePath(QDir::cleanPath(m_workingDataDir + "/filetagsfilter_override/project.qbs")); - QScopedPointer job(qbs::Project::setupProject(setupParams, - m_logSink, 0)); + QScopedPointer job(qbs::Project().setupProject(setupParams, + m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); qbs::Project project = job->project(); @@ -492,8 +486,8 @@ void TestApi::infiniteLoopBuilding() const QString projectDir = QDir::cleanPath(m_workingDataDir + '/' + projectDirName); setupParams.setProjectFilePath(projectDir + "/infinite-loop.qbs"); setupParams.setBuildRoot(projectDir); - QScopedPointer setupJob(qbs::Project::setupProject(setupParams, - m_logSink, 0)); + QScopedPointer setupJob(qbs::Project().setupProject(setupParams, + m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString())); qbs::Project project = setupJob->project(); @@ -515,8 +509,8 @@ void TestApi::infiniteLoopResolving() const QString projectDir = QDir::cleanPath(m_workingDataDir + "/infinite-loop-resolving"); setupParams.setProjectFilePath(projectDir + "/project.qbs"); setupParams.setBuildRoot(projectDir); - QScopedPointer setupJob(qbs::Project::setupProject(setupParams, - m_logSink, 0)); + QScopedPointer setupJob(qbs::Project().setupProject(setupParams, + m_logSink, 0)); QTimer::singleShot(1000, setupJob.data(), SLOT(cancel())); QVERIFY(waitForFinished(setupJob.data(), 300000)); QVERIFY2(setupJob->error().toString().toLower().contains("cancel"), @@ -528,8 +522,8 @@ void TestApi::installableFiles() qbs::SetupProjectParameters setupParams = defaultSetupParameters(); setupParams.setProjectFilePath(QDir::cleanPath(QLatin1String(SRCDIR "/../blackbox/testdata" "/installed_artifact/installed_artifact.qbs"))); - QScopedPointer job(qbs::Project::setupProject(setupParams, - m_logSink, 0)); + QScopedPointer job(qbs::Project().setupProject(setupParams, + m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); qbs::Project project = job->project(); @@ -558,8 +552,7 @@ void TestApi::installableFiles() setupParams.setProjectFilePath(QDir::cleanPath(QLatin1String(SRCDIR "/../blackbox/testdata" "/recursive_wildcards/recursive_wildcards.qbs"))); - project = qbs::Project(); - job.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); + job.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); project = job->project(); @@ -579,7 +572,7 @@ void TestApi::isRunnable() qbs::SetupProjectParameters setupParams = defaultSetupParameters(); setupParams.setProjectFilePath(QDir::cleanPath(QLatin1String(SRCDIR "/testdata" "/is-runnable/project.qbs"))); - QScopedPointer job(qbs::Project::setupProject(setupParams, + QScopedPointer job(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); @@ -602,7 +595,7 @@ void TestApi::listBuildSystemFiles() = QDir::cleanPath(QLatin1String(SRCDIR "/../blackbox/testdata/subprojects")); const QString topLevelProjectFile = projectDir + QLatin1String("/toplevelproject.qbs"); setupParams.setProjectFilePath(topLevelProjectFile); - QScopedPointer job(qbs::Project::setupProject(setupParams, + QScopedPointer job(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); @@ -634,7 +627,7 @@ void TestApi::multiArch() overriddenValues.insert("project.targetProfile", targetProfile.name()); overriddenValues.insert("qbs.endianness", "little"); // TODO: Why does the qbs module require this? setupParams.setOverriddenValues(overriddenValues); - QScopedPointer setupJob(qbs::Project::setupProject(setupParams, + QScopedPointer setupJob(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString())); @@ -680,9 +673,7 @@ void TestApi::multiArch() // Error check: Try to build for the same profile twice. overriddenValues.insert("project.targetProfile", hostProfile.name()); setupParams.setOverriddenValues(overriddenValues); - project = qbs::Project(); - buildJob.reset(0); - setupJob.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); + setupJob.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY(setupJob->error().hasError()); QVERIFY2(setupJob->error().toString().contains(hostProfile.name()) @@ -695,7 +686,7 @@ void TestApi::multiArch() overriddenValues.insert("p1.profiles", targetProfile.name() + ',' + targetProfile.name()); overriddenValues.insert("qbs.endianness", "little"); // TODO: Meh. setupParams.setOverriddenValues(overriddenValues); - setupJob.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); + setupJob.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY(setupJob->error().hasError()); QVERIFY2(setupJob->error().toString().contains(targetProfile.name()) @@ -710,7 +701,7 @@ void TestApi::nonexistingProjectPropertyFromProduct() = QDir::cleanPath(m_workingDataDir + "/nonexistingprojectproperties"); const QString topLevelProjectFile = projectDir + QLatin1String("/invalidaccessfromproduct.qbs"); setupParams.setProjectFilePath(topLevelProjectFile); - QScopedPointer job(qbs::Project::setupProject(setupParams, + QScopedPointer job(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QEXPECT_FAIL("", "QBS-432", Abort); @@ -728,7 +719,7 @@ void TestApi::nonexistingProjectPropertyFromCommandLine() QVariantMap projectProperties; projectProperties.insert(QLatin1String("project.blubb"), QLatin1String("true")); setupParams.setOverriddenValues(projectProperties); - QScopedPointer job(qbs::Project::setupProject(setupParams, + QScopedPointer job(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY(job->error().hasError()); @@ -760,7 +751,7 @@ void TestApi::references() qbs::SetupProjectParameters setupParams = defaultSetupParameters(); const QString projectDir = QDir::cleanPath(m_workingDataDir + "/references"); setupParams.setProjectFilePath(projectDir + QLatin1String("/invalid1.qbs")); - QScopedPointer job(qbs::Project::setupProject(setupParams, + QScopedPointer job(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY(job->error().hasError()); @@ -768,14 +759,14 @@ void TestApi::references() QVERIFY2(errorString.contains("does not contain"), qPrintable(errorString)); setupParams.setProjectFilePath(projectDir + QLatin1String("/invalid2.qbs")); - job.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); + job.reset(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY(job->error().hasError()); errorString = job->error().toString(); QVERIFY2(errorString.contains("contains more than one"), qPrintable(errorString)); setupParams.setProjectFilePath(projectDir + QLatin1String("/valid.qbs")); - job.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); + job.reset(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); const qbs::ProjectData topLevelProject = job->project().projectData(); @@ -790,7 +781,7 @@ void TestApi::sourceFileInBuildDir() qbs::SetupProjectParameters setupParams = defaultSetupParameters(); const QString projectDir = QDir::cleanPath(m_workingDataDir + "/source-file-in-build-dir"); setupParams.setProjectFilePath(projectDir + QLatin1String("/project.qbs")); - QScopedPointer job(qbs::Project::setupProject(setupParams, + QScopedPointer job(qbs::Project().setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); -- cgit v1.2.3