aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-07-15 11:42:56 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2014-07-16 14:05:23 +0200
commit05ef86ccaf7a4be0737f0af0bf61c69bd6f2e97a (patch)
tree814f7fd3b1b3090b400ef706a24b8cee6acdeaab
parentf7973489aef74b1df55f7466cd176e14bbfa76d0 (diff)
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 <joerg.bornemann@digia.com>
-rw-r--r--src/app/qbs/commandlinefrontend.cpp2
-rw-r--r--src/lib/corelib/api/internaljobs.cpp56
-rw-r--r--src/lib/corelib/api/internaljobs.h6
-rw-r--r--src/lib/corelib/api/jobs.cpp23
-rw-r--r--src/lib/corelib/api/jobs.h8
-rw-r--r--src/lib/corelib/api/project.cpp6
-rw-r--r--src/lib/corelib/api/project.h4
-rw-r--r--src/lib/corelib/api/project_p.h2
-rw-r--r--src/lib/corelib/buildgraph/buildgraphloader.cpp44
-rw-r--r--src/lib/corelib/buildgraph/buildgraphloader.h6
-rw-r--r--tests/auto/api/tst_api.cpp67
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 &parameters)
+void InternalSetupProjectJob::init(const TopLevelProjectPtr &existingProject,
+ const SetupProjectParameters &parameters)
{
+ 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 &parameters);
+ void init(const TopLevelProjectPtr &existingProject, const SetupProjectParameters &parameters);
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 <language/language.h>
#include <tools/qbsassert.h>
@@ -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 &parameters)
+void SetupProjectJob::resolve(const Project &existingProject,
+ const SetupProjectParameters &parameters)
{
+ m_existingProject = existingProject;
+ const TopLevelProjectPtr &existingInternalProject
+ = existingProject.d ? existingProject.d->internalProject : TopLevelProjectPtr();
+ if (existingInternalProject && !lockProject(existingInternalProject))
+ return;
InternalJobThreadWrapper * const wrapper
= qobject_cast<InternalJobThreadWrapper *>(internalJob());
InternalSetupProjectJob * const job
= qobject_cast<InternalSetupProjectJob *>(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 &parameters);
+ void resolve(const Project &existingProject, const SetupProjectParameters &parameters);
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 &parameters,
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 &parameters,
- ILogSink *logSink, QObject *jobOwner);
+ SetupProjectJob *setupProject(const SetupProjectParameters &parameters,
+ 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 &parameters,
- const RulesEvaluationContextPtr &evalContext)
+BuildGraphLoadResult BuildGraphLoader::load(const TopLevelProjectPtr &existingProject,
+ const SetupProjectParameters &parameters,
+ 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<QString> buildSystemFiles = restoredProject->buildSystemFiles;
QList<ResolvedProductPtr> allRestoredProducts = restoredProject->allProducts();
QList<ResolvedProductPtr> 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 &parameters,
+ BuildGraphLoadResult load(const TopLevelProjectPtr &existingProject,
+ const SetupProjectParameters &parameters,
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<qbs::SetupProjectJob> setupJob(qbs::Project::setupProject(setupParams,
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> setupJob(qbs::Project::setupProject(setupParams,
- m_logSink, 0));
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> job(qbs::Project::setupProject(setupParams,
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> job(qbs::Project::setupProject(setupParams,
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> job(qbs::Project::setupProject(setupParams,
- m_logSink, 0));
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> setupJob(qbs::Project::setupProject(setupParams,
- m_logSink, 0));
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> setupJob(qbs::Project::setupProject(setupParams,
- m_logSink, 0));
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> job(qbs::Project::setupProject(setupParams,
- m_logSink, 0));
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> job(qbs::Project::setupProject(setupParams,
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> job(qbs::Project::setupProject(setupParams,
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> setupJob(qbs::Project::setupProject(setupParams,
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> job(qbs::Project::setupProject(setupParams,
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> job(qbs::Project::setupProject(setupParams,
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> job(qbs::Project::setupProject(setupParams,
+ QScopedPointer<qbs::SetupProjectJob> 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<qbs::SetupProjectJob> job(qbs::Project::setupProject(setupParams,
+ QScopedPointer<qbs::SetupProjectJob> job(qbs::Project().setupProject(setupParams,
m_logSink, 0));
waitForFinished(job.data());
QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString()));