diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-02-16 14:40:09 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-02-16 14:40:09 +0100 |
commit | f04bf5d3cc59ff859d5135fdb5048245ae99b91d (patch) | |
tree | 45058972aa8c1f2736270d03bdb9d973fb5e7050 /src | |
parent | 3bc71587c924d849b5d5780ff7b4c6e02b390f99 (diff) | |
parent | 1e142242fc462ebfa5c84339c8f2de2273712ece (diff) |
Merge 1.11 into master
Change-Id: I9603ade37a1f839019c9219c940dcbb95c1cac89
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/corelib/api/projectdata_p.h | 7 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/projectbuilddata.cpp | 4 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 90 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.h | 8 | ||||
-rw-r--r-- | src/lib/corelib/tools/stringconstants.h | 3 |
5 files changed, 97 insertions, 15 deletions
diff --git a/src/lib/corelib/api/projectdata_p.h b/src/lib/corelib/api/projectdata_p.h index e81e04147..175848702 100644 --- a/src/lib/corelib/api/projectdata_p.h +++ b/src/lib/corelib/api/projectdata_p.h @@ -139,11 +139,10 @@ public: QString buildDir; }; -static inline bool isRunnableArtifact(const FileTags &fileTags, - bool isBundle) +inline bool isRunnableArtifact(const FileTags &fileTags, bool isBundle) { - return (fileTags.contains("application") - && (!isBundle || fileTags.contains("bundle.content"))) + return (fileTags.contains("application") && (!isBundle || fileTags.contains("bundle.content"))) + || fileTags.contains("bundle.application-executable") || fileTags.contains("android.apk") || fileTags.contains("msi"); } diff --git a/src/lib/corelib/buildgraph/projectbuilddata.cpp b/src/lib/corelib/buildgraph/projectbuilddata.cpp index de1f96626..b382ed092 100644 --- a/src/lib/corelib/buildgraph/projectbuilddata.cpp +++ b/src/lib/corelib/buildgraph/projectbuilddata.cpp @@ -446,7 +446,9 @@ void BuildDataResolver::connectRulesToDependencies(const ResolvedProductPtr &pro for (RuleNode *ruleNode : ruleNodes) { static const FileTag installableTag("installable"); if (areRulesCompatible(ruleNode, depRuleNode) - || (ruleNode->rule()->inputsFromDependencies.contains(installableTag) + || ((ruleNode->rule()->inputsFromDependencies.contains(installableTag) + || ruleNode->rule()->auxiliaryInputs.contains(installableTag) + || ruleNode->rule()->explicitlyDependsOn.contains(installableTag)) && isRootRuleNode(depRuleNode))) { connect(ruleNode, depRuleNode); } diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index 3460c8b59..4fce3c7eb 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -302,8 +302,10 @@ ModuleLoaderResult ModuleLoader::load(const SetupProjectParameters ¶meters) break; } } - if (ok) + if (ok) { + collectNameFromOverride(key); continue; + } ErrorInfo e(Tr::tr("Property override key '%1' not understood.").arg(key)); e.append(Tr::tr("Please use one of the following:")); e.append(QLatin1Char('\t') + Tr::tr("projects.<project-name>.<property-name>:value")); @@ -527,7 +529,10 @@ void ModuleLoader::handleTopLevelProject(ModuleLoaderResult *loadResult, Item *p TopLevelProjectContext tlp; tlp.buildDirectory = buildDirectory; handleProject(loadResult, &tlp, projectItem, referencedFilePaths); + checkProjectNamesInOverrides(tlp); collectProductsByName(tlp); + checkProductNamesInOverrides(); + adjustDependenciesForMultiplexing(tlp); for (ProjectContext * const projectContext : qAsConst(tlp.projects)) { @@ -580,12 +585,15 @@ void ModuleLoader::handleProject(ModuleLoaderResult *loadResult, projectItem->addModule(loadBaseModule(&dummyProductContext, projectItem)); overrideItemProperties(projectItem, StringConstants::projectPrefix(), m_parameters.overriddenValuesTree()); - const QString projectName = m_evaluator->stringValue(projectItem, - StringConstants::nameProperty()); - if (!projectName.isEmpty()) - overrideItemProperties(projectItem, QStringLiteral("projects.") + projectName, - m_parameters.overriddenValuesTree()); + projectContext.name = m_evaluator->stringValue(projectItem, + StringConstants::nameProperty()); + if (projectContext.name.isEmpty()) + projectContext.name = FileInfo::baseName(projectItem->location().filePath()); + overrideItemProperties(projectItem, + StringConstants::projectsOverridePrefix() + projectContext.name, + m_parameters.overriddenValuesTree()); if (!checkItemCondition(projectItem)) { + m_disabledProjects.insert(projectContext.name); delete p; return; } @@ -792,7 +800,7 @@ QList<Item *> ModuleLoader::multiplexProductItem(ProductContext *dummyContext, I productName = FileInfo::completeBaseName(productItem->file()->filePath()); productItem->setProperty(nameKey, VariantValue::create(productName)); } - overrideItemProperties(productItem, QStringLiteral("products.") + productName, + overrideItemProperties(productItem, StringConstants::productsOverridePrefix() + productName, m_parameters.overriddenValuesTree()); const MultiplexInfo &multiplexInfo = extractMultiplexInfo(productItem, qbsModule.item); @@ -1784,6 +1792,70 @@ void ModuleLoader::handleProfile(Item *profileItem) m_localProfiles.insert(profileName, values); } +void ModuleLoader::collectNameFromOverride(const QString &overrideString) +{ + static const auto extract = [](const QString &prefix, const QString &overrideString) { + if (!overrideString.startsWith(prefix)) + return QString(); + const int startPos = prefix.length(); + const int endPos = overrideString.lastIndexOf(StringConstants::dot()); + if (endPos == -1) + return QString(); + return overrideString.mid(startPos, endPos - startPos); + }; + const QString &projectName = extract(StringConstants::projectsOverridePrefix(), overrideString); + if (!projectName.isEmpty()) { + m_projectNamesUsedInOverrides.insert(projectName); + return; + } + const QString &productName = extract(StringConstants::productsOverridePrefix(), overrideString); + if (!productName.isEmpty()) { + m_productNamesUsedInOverrides.insert(productName.left( + productName.indexOf(StringConstants::dot()))); + return; + } +} + +void ModuleLoader::checkProjectNamesInOverrides(const ModuleLoader::TopLevelProjectContext &tlp) +{ + for (const QString &projectNameInOverride : m_projectNamesUsedInOverrides) { + if (m_disabledProjects.contains(projectNameInOverride)) + continue; + bool found = false; + for (const ProjectContext * const p : tlp.projects) { + if (p->name == projectNameInOverride) { + found = true; + break; + } + } + if (!found) { + handlePropertyError(Tr::tr("Unknown project '%1' in property override.") + .arg(projectNameInOverride), m_parameters, m_logger); + } + } +} + +void ModuleLoader::checkProductNamesInOverrides() +{ + for (const QString &productNameInOverride : m_productNamesUsedInOverrides) { + bool found = false; + for (auto it = m_productsByName.cbegin(); it != m_productsByName.cend(); ++it) { + // In an override string such as "a.b.c:d, we cannot tell whether we have a product + // "a" and a module "b.c" or a product "a.b" and a module "c", so we need to take + // care not to emit false positives here. + if (it->first == productNameInOverride + || it->first.startsWith(productNameInOverride + StringConstants::dot())) { + found = true; + break; + } + } + if (!found) { + handlePropertyError(Tr::tr("Unknown product '%1' in property override.") + .arg(productNameInOverride), m_parameters, m_logger); + } + } +} + void ModuleLoader::collectProductsByName(const TopLevelProjectContext &topLevelProject) { for (ProjectContext * const project : topLevelProject.projects) { @@ -2858,8 +2930,8 @@ void ModuleLoader::instantiateModule(ProductContext *productContext, Item *expor deepestModuleInstance->setPrototype(modulePrototype); const QString fullName = moduleName.toString(); const QString generalOverrideKey = QStringLiteral("modules.") + fullName; - const QString perProductOverrideKey = QStringLiteral("products.") + productContext->name - + QLatin1Char('.') + fullName; + const QString perProductOverrideKey = StringConstants::productsOverridePrefix() + + productContext->name + QLatin1Char('.') + fullName; for (Item *instance = moduleInstance; instance; instance = instance->prototype()) { overrideItemProperties(instance, generalOverrideKey, m_parameters.overriddenValuesTree()); if (fullName == QStringLiteral("qbs")) diff --git a/src/lib/corelib/language/moduleloader.h b/src/lib/corelib/language/moduleloader.h index f0d9281bc..bb1fc7761 100644 --- a/src/lib/corelib/language/moduleloader.h +++ b/src/lib/corelib/language/moduleloader.h @@ -152,6 +152,7 @@ private: Item *item; Item *scope; + QString name; }; class ProjectContext; @@ -163,7 +164,6 @@ private: public: ProjectContext *project; ModuleLoaderResult::ProductInfo info; - QString name; QString profileName; QString multiplexConfigurationId; QString multiplexConfigIdForModulePrototypes; @@ -340,6 +340,9 @@ private: void evaluateProfileValues(const QualifiedId &namePrefix, Item *item, Item *profileItem, QVariantMap &values); void handleProfile(Item *profileItem); + void collectNameFromOverride(const QString &overrideString); + void checkProjectNamesInOverrides(const TopLevelProjectContext &tlp); + void checkProductNamesInOverrides(); ItemPool *m_pool; Logger &m_logger; @@ -388,6 +391,9 @@ private: quint64 m_probesRun; quint64 m_probesCachedCurrent; quint64 m_probesCachedOld; + Set<QString> m_projectNamesUsedInOverrides; + Set<QString> m_productNamesUsedInOverrides; + Set<QString> m_disabledProjects; }; } // namespace Internal diff --git a/src/lib/corelib/tools/stringconstants.h b/src/lib/corelib/tools/stringconstants.h index 6fda4f47a..e56ddc52b 100644 --- a/src/lib/corelib/tools/stringconstants.h +++ b/src/lib/corelib/tools/stringconstants.h @@ -149,6 +149,9 @@ public: static const QString &projectPrefix() { return project(); } static const QString &productValue() { return product(); } + QBS_STRING_CONSTANT(projectsOverridePrefix, "projects.") + QBS_STRING_CONSTANT(productsOverridePrefix, "products.") + QBS_STRING_CONSTANT(baseVar, "base") static const QString &explicitlyDependsOnVar() { return explicitlyDependsOn(); } QBS_STRING_CONSTANT(inputVar, "input") |