aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-02-16 14:40:09 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2018-02-16 14:40:09 +0100
commitf04bf5d3cc59ff859d5135fdb5048245ae99b91d (patch)
tree45058972aa8c1f2736270d03bdb9d973fb5e7050 /src
parent3bc71587c924d849b5d5780ff7b4c6e02b390f99 (diff)
parent1e142242fc462ebfa5c84339c8f2de2273712ece (diff)
Merge 1.11 into master
Diffstat (limited to 'src')
-rw-r--r--src/lib/corelib/api/projectdata_p.h7
-rw-r--r--src/lib/corelib/buildgraph/projectbuilddata.cpp4
-rw-r--r--src/lib/corelib/language/moduleloader.cpp90
-rw-r--r--src/lib/corelib/language/moduleloader.h8
-rw-r--r--src/lib/corelib/tools/stringconstants.h3
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 &parameters)
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")