diff options
author | Christian Kandeler <christian.kandeler@digia.com> | 2014-05-22 12:01:14 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-05-23 13:59:09 +0200 |
commit | 0da3f04e71f6f77f47b10fef6736b1415b1960d2 (patch) | |
tree | 85d152e7f16838ca32ad1cbc8e8b07029a62e855 /src/lib/corelib/language | |
parent | e00b6c86cece5752c53f78bb439a1a21db5b7674 (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.cpp | 1 | ||||
-rw-r--r-- | src/lib/corelib/language/language.cpp | 15 | ||||
-rw-r--r-- | src/lib/corelib/language/language.h | 3 | ||||
-rw-r--r-- | src/lib/corelib/language/loader.cpp | 3 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 15 | ||||
-rw-r--r-- | src/lib/corelib/language/projectresolver.cpp | 18 | ||||
-rw-r--r-- | src/lib/corelib/language/tst_language.cpp | 36 |
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 ¶meters) // 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 ¶meters) 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 ¶ms) 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); |