aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-05-22 12:01:14 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2014-05-23 13:59:09 +0200
commit0da3f04e71f6f77f47b10fef6736b1415b1960d2 (patch)
tree85d152e7f16838ca32ad1cbc8e8b07029a62e855 /src/lib/corelib/language
parente00b6c86cece5752c53f78bb439a1a21db5b7674 (diff)
Sanitize the project setup API.
Ever since we introduced "overridden values", the setter for the build configuration has been pretty much an empty shell, containing only the build variant and the profile. We now make that explicit, resulting in a less confusing API that does not expect the caller to know how to encode profile and build variant information in a QVariantMap. Change-Id: I60183fc1884a884c9ceba34d7eb460c261be47ca Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/lib/corelib/language')
-rw-r--r--src/lib/corelib/language/builtindeclarations.cpp1
-rw-r--r--src/lib/corelib/language/language.cpp15
-rw-r--r--src/lib/corelib/language/language.h3
-rw-r--r--src/lib/corelib/language/loader.cpp3
-rw-r--r--src/lib/corelib/language/moduleloader.cpp15
-rw-r--r--src/lib/corelib/language/projectresolver.cpp18
-rw-r--r--src/lib/corelib/language/tst_language.cpp36
7 files changed, 55 insertions, 36 deletions
diff --git a/src/lib/corelib/language/builtindeclarations.cpp b/src/lib/corelib/language/builtindeclarations.cpp
index 3ff60944b..d09c3167e 100644
--- a/src/lib/corelib/language/builtindeclarations.cpp
+++ b/src/lib/corelib/language/builtindeclarations.cpp
@@ -275,6 +275,7 @@ void BuiltinDeclarations::addProjectItem()
item << conditionProperty();
item << buildDirProperty();
item << PropertyDeclaration(QLatin1String("sourceDirectory"), PropertyDeclaration::Path);
+ item << PropertyDeclaration(QLatin1String("profile"), PropertyDeclaration::String);
item << PropertyDeclaration(QLatin1String("references"), PropertyDeclaration::Variant,
PropertyDeclaration::PropertyNotAvailableInConfig);
item << PropertyDeclaration(QLatin1String("qbsSearchPaths"),
diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp
index 4974a3e68..fce173f5f 100644
--- a/src/lib/corelib/language/language.cpp
+++ b/src/lib/corelib/language/language.cpp
@@ -921,12 +921,14 @@ TopLevelProject::~TopLevelProject()
{
}
-QString TopLevelProject::deriveId(const QVariantMap &config)
+QString TopLevelProject::deriveId(const QString &profile, const QVariantMap &config)
{
const QVariantMap qbsProperties = config.value(QLatin1String("qbs")).toMap();
const QString buildVariant = qbsProperties.value(QLatin1String("buildVariant")).toString();
- const QString profile = qbsProperties.value(QLatin1String("profile")).toString();
- return profile + QLatin1Char('-') + buildVariant;
+ QString prefix = profile;
+ if (prefix.isEmpty())
+ prefix = QLatin1String("no-profile");
+ return prefix + QLatin1Char('-') + buildVariant;
}
QString TopLevelProject::deriveBuildDirectory(const QString &buildRoot, const QString &id)
@@ -937,7 +939,12 @@ QString TopLevelProject::deriveBuildDirectory(const QString &buildRoot, const QS
void TopLevelProject::setBuildConfiguration(const QVariantMap &config)
{
m_buildConfiguration = config;
- m_id = deriveId(config);
+ m_id = deriveId(profile(), config);
+}
+
+QString TopLevelProject::profile() const
+{
+ return projectProperties().value(QLatin1String("profile")).toString();
}
QString TopLevelProject::buildGraphFilePath() const
diff --git a/src/lib/corelib/language/language.h b/src/lib/corelib/language/language.h
index a76c8ad26..70d7fb9ea 100644
--- a/src/lib/corelib/language/language.h
+++ b/src/lib/corelib/language/language.h
@@ -445,7 +445,7 @@ public:
static TopLevelProjectPtr create() { return TopLevelProjectPtr(new TopLevelProject); }
- static QString deriveId(const QVariantMap &config);
+ static QString deriveId(const QString &profile, const QVariantMap &config);
static QString deriveBuildDirectory(const QString &buildRoot, const QString &id);
QString buildDirectory; // Not saved
@@ -461,6 +461,7 @@ public:
void setBuildConfiguration(const QVariantMap &config);
const QVariantMap &buildConfiguration() const { return m_buildConfiguration; }
QString id() const { return m_id; }
+ QString profile() const;
QString buildGraphFilePath() const;
void store(const Logger &logger) const;
diff --git a/src/lib/corelib/language/loader.cpp b/src/lib/corelib/language/loader.cpp
index 622cfa073..308849700 100644
--- a/src/lib/corelib/language/loader.cpp
+++ b/src/lib/corelib/language/loader.cpp
@@ -114,7 +114,8 @@ TopLevelProjectPtr Loader::loadProject(const SetupProjectParameters &parameters)
// we have enough information.
if (m_progressObserver) {
m_progressObserver->initialize(Tr::tr("Resolving project for configuration %1")
- .arg(TopLevelProject::deriveId(parameters.buildConfigurationTree())), 1);
+ .arg(TopLevelProject::deriveId(parameters.topLevelProfile(),
+ parameters.finalBuildConfigurationTree())), 1);
cancelationTimer.setSingleShot(false);
QObject::connect(&cancelationTimer, SIGNAL(timeout()), SLOT(checkForCancelation()));
cancelationTimer.start(1000);
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp
index 3dc7df283..94948be10 100644
--- a/src/lib/corelib/language/moduleloader.cpp
+++ b/src/lib/corelib/language/moduleloader.cpp
@@ -122,12 +122,14 @@ ModuleLoaderResult ModuleLoader::load(const SetupProjectParameters &parameters)
if (root->typeName() != QLatin1String("Project"))
root = wrapWithProject(root);
- const QString buildDirectory
- = TopLevelProject::deriveBuildDirectory(parameters.buildRoot(),
- TopLevelProject::deriveId(parameters.finalBuildConfigurationTree()));
+ const QString buildDirectory = TopLevelProject::deriveBuildDirectory(parameters.buildRoot(),
+ TopLevelProject::deriveId(parameters.topLevelProfile(),
+ parameters.finalBuildConfigurationTree()));
root->setProperty(QLatin1String("sourceDirectory"),
VariantValue::create(QFileInfo(root->file()->filePath()).absolutePath()));
root->setProperty(QLatin1String("buildDirectory"), VariantValue::create(buildDirectory));
+ root->setProperty(QLatin1String("profile"),
+ VariantValue::create(m_parameters.topLevelProfile()));
handleProject(&result, root, buildDirectory,
QSet<QString>() << QDir::cleanPath(parameters.projectFilePath()));
result.root = root;
@@ -1017,7 +1019,8 @@ void ModuleLoader::checkCancelation() const
{
if (m_progressObserver && m_progressObserver->canceled()) {
throw ErrorInfo(Tr::tr("Project resolving canceled for configuration %1.")
- .arg(TopLevelProject::deriveId(m_parameters.buildConfigurationTree())));
+ .arg(TopLevelProject::deriveId(m_parameters.topLevelProfile(),
+ m_parameters.finalBuildConfigurationTree())));
}
}
@@ -1082,8 +1085,8 @@ void ModuleLoader::copyProperties(const Item *sourceProject, Item *targetProject
it != sourceProject->propertyDeclarations().constEnd(); ++it) {
// We must not inherit built-in properties such as "name",
- // but "qbsSearchPaths" is an exception.
- if (it.key() == QLatin1String("qbsSearchPaths")) {
+ // but there are exceptions.
+ if (it.key() == QLatin1String("qbsSearchPaths") || it.key() == QLatin1String("profile")) {
const JSSourceValueConstPtr &v
= targetProject->property(it.key()).dynamicCast<const JSSourceValue>();
QBS_ASSERT(v, continue);
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp
index 4fe03b7cb..e54074f14 100644
--- a/src/lib/corelib/language/projectresolver.cpp
+++ b/src/lib/corelib/language/projectresolver.cpp
@@ -124,7 +124,8 @@ void ProjectResolver::checkCancelation() const
{
if (m_progressObserver && m_progressObserver->canceled()) {
throw ErrorInfo(Tr::tr("Project resolving canceled for configuration %1.")
- .arg(TopLevelProject::deriveId(m_setupParams.finalBuildConfigurationTree())));
+ .arg(TopLevelProject::deriveId(m_setupParams.topLevelProfile(),
+ m_setupParams.finalBuildConfigurationTree())));
}
}
@@ -180,11 +181,12 @@ void ProjectResolver::resolveTopLevelProject(Item *item, ProjectContext *project
if (m_progressObserver)
m_progressObserver->setMaximum(projectContext->loadResult->productInfos.count());
const TopLevelProjectPtr project = TopLevelProject::create();
- project->setBuildConfiguration(m_setupParams.finalBuildConfigurationTree());
- project->buildDirectory
- = TopLevelProject::deriveBuildDirectory(m_setupParams.buildRoot(), project->id());
+ project->buildDirectory = TopLevelProject::deriveBuildDirectory(m_setupParams.buildRoot(),
+ TopLevelProject::deriveId(m_setupParams.topLevelProfile(),
+ m_setupParams.finalBuildConfigurationTree()));
projectContext->project = project;
resolveProject(item, projectContext);
+ project->setBuildConfiguration(m_setupParams.finalBuildConfigurationTree());
project->usedEnvironment = m_engine->usedEnvironment();
project->fileExistsResults = m_engine->fileExistsResults();
project->fileLastModifiedResults = m_engine->fileLastModifiedResults();
@@ -204,12 +206,16 @@ void ProjectResolver::resolveProject(Item *item, ProjectContext *projectContext)
projectContext->project->name = FileInfo::baseName(item->location().fileName()); // FIXME: Must also be changed in item?
projectContext->project->enabled
= m_evaluator->boolValue(item, QLatin1String("condition"));
- if (!projectContext->project->enabled)
+ QVariantMap projectProperties;
+ if (!projectContext->project->enabled) {
+ projectProperties.insert(QLatin1String("profile"),
+ m_evaluator->stringValue(item, QLatin1String("profile")));
+ projectContext->project->setProjectProperties(projectProperties);
return;
+ }
projectContext->dummyModule = ResolvedModule::create();
- QVariantMap projectProperties;
for (Item::PropertyDeclarationMap::const_iterator it
= item->propertyDeclarations().constBegin();
it != item->propertyDeclarations().constEnd(); ++it) {
diff --git a/src/lib/corelib/language/tst_language.cpp b/src/lib/corelib/language/tst_language.cpp
index 6873391e9..d3c7d89e4 100644
--- a/src/lib/corelib/language/tst_language.cpp
+++ b/src/lib/corelib/language/tst_language.cpp
@@ -40,6 +40,7 @@
#include <tools/scripttools.h>
#include <tools/error.h>
#include <tools/hostosinfo.h>
+#include <tools/profile.h>
#include <tools/propertyfinder.h>
#include <QProcessEnvironment>
@@ -121,11 +122,8 @@ void TestLanguage::handleInitCleanupDataTags(const char *projectFileName, bool *
QString TestLanguage::buildDir(const SetupProjectParameters &params) const
{
- return FileInfo::resolvePath(params.buildRoot(),
- getConfigProperty(params.buildConfigurationTree(),
- QStringList() << "qbs" << "profile").toString() + QLatin1Char('-')
- + getConfigProperty(params.buildConfigurationTree(),
- QStringList() << "qbs" << "buildVariant").toString());
+ return FileInfo::resolvePath(params.buildRoot(), params.topLevelProfile()
+ + QLatin1Char('-') + params.buildVariant());
}
#define HANDLE_INIT_CLEANUP_DATATAGS(fn) {\
@@ -143,11 +141,10 @@ void TestLanguage::initTestCase()
loader = new Loader(m_engine, m_logger);
loader->setSearchPaths(QStringList()
<< QLatin1String(SRCDIR "/../../../share/qbs"));
- QVariantMap buildConfig = defaultParameters.buildConfigurationTree();
- buildConfig.insert("qbs.targetOS", "linux");
- buildConfig.insert("qbs.architecture", "x86_64");
- buildConfig.insert("qbs.profile", "qbs_autotests");
- defaultParameters.setBuildConfiguration(buildConfig);
+ defaultParameters.setTopLevelProfile("qbs_autotests");
+ defaultParameters.setBuildVariant("debug");
+ Settings settings((QString()));
+ defaultParameters.expandBuildConfiguration(&settings);
QVERIFY(QFileInfo(m_wildcardsTestDirPath).isAbsolute());
}
@@ -821,11 +818,11 @@ void TestLanguage::jsImportUsedInMultipleScopes()
bool exceptionCaught = false;
try {
- QVariantMap customBuildConfig = defaultParameters.buildConfiguration();
- customBuildConfig.insert(QLatin1String("qbs.buildVariant"), buildVariant);
SetupProjectParameters params = defaultParameters;
params.setProjectFilePath(testProject("jsimportsinmultiplescopes.qbs"));
- params.setBuildConfiguration(customBuildConfig);
+ params.setBuildVariant(buildVariant);
+ Settings settings((QString()));
+ params.expandBuildConfiguration(&settings);
TopLevelProjectPtr project = loader->loadProject(params);
QVERIFY(project);
QHash<QString, ResolvedProductPtr> products = productsFromProject(project);
@@ -1032,16 +1029,19 @@ void TestLanguage::profileValuesAndOverriddenValues()
{
bool exceptionCaught = false;
try {
+ Settings settings((QString()));
+ Profile profile(QLatin1String("tst_lang_profile"), &settings); // TODO: Make sure it's removed afterwards.
+ profile.setValue("dummy.defines", "IN_PROFILE");
+ profile.setValue("dummy.cFlags", "IN_PROFILE");
+ profile.setValue("dummy.cxxFlags", "IN_PROFILE");
+ profile.setValue("qbs.architecture", "x86");
SetupProjectParameters parameters = defaultParameters;
- QVariantMap buildConfig = parameters.buildConfiguration();
- buildConfig.insert("dummy.defines", "IN_PROFILE");
- buildConfig.insert("dummy.cFlags", "IN_PROFILE");
- buildConfig.insert("dummy.cxxFlags", "IN_PROFILE");
- parameters.setBuildConfiguration(buildConfig);
+ parameters.setTopLevelProfile(profile.name());
QVariantMap overriddenValues;
overriddenValues.insert("dummy.cFlags", "OVERRIDDEN");
parameters.setOverriddenValues(overriddenValues);
parameters.setProjectFilePath(testProject("profilevaluesandoverriddenvalues.qbs"));
+ parameters.expandBuildConfiguration(&settings);
project = loader->loadProject(parameters);
QVERIFY(project);
QHash<QString, ResolvedProductPtr> products = productsFromProject(project);