aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/corelib')
-rw-r--r--src/lib/corelib/buildgraph/projectbuilddata.cpp5
-rw-r--r--src/lib/corelib/buildgraph/rulesapplicator.cpp43
-rw-r--r--src/lib/corelib/buildgraph/rulesapplicator.h10
-rw-r--r--src/lib/corelib/language/builtindeclarations.cpp2
-rw-r--r--src/lib/corelib/language/language.cpp1
-rw-r--r--src/lib/corelib/language/language.h4
-rw-r--r--src/lib/corelib/language/projectresolver.cpp2
-rw-r--r--src/lib/corelib/tools/persistence.cpp2
-rw-r--r--src/lib/corelib/tools/stringconstants.h4
9 files changed, 59 insertions, 14 deletions
diff --git a/src/lib/corelib/buildgraph/projectbuilddata.cpp b/src/lib/corelib/buildgraph/projectbuilddata.cpp
index 2874fe23c..67228d35d 100644
--- a/src/lib/corelib/buildgraph/projectbuilddata.cpp
+++ b/src/lib/corelib/buildgraph/projectbuilddata.cpp
@@ -390,7 +390,7 @@ static bool areRulesCompatible(const RuleNode *ruleNode, const RuleNode *depende
return true;
if (!dependencyRule->product->fileTags.intersects(outTags))
return false;
- if (ruleNode->rule()->explicitlyDependsOn.intersects(outTags))
+ if (ruleNode->rule()->explicitlyDependsOnFromDependencies.intersects(outTags))
return true;
return ruleNode->rule()->auxiliaryInputs.intersects(outTags);
}
@@ -464,7 +464,8 @@ void BuildDataResolver::connectRulesToDependencies(const ResolvedProductPtr &pro
if (areRulesCompatible(ruleNode, depRuleNode)
|| ((ruleNode->rule()->inputsFromDependencies.contains(installableTag)
|| ruleNode->rule()->auxiliaryInputs.contains(installableTag)
- || ruleNode->rule()->explicitlyDependsOn.contains(installableTag))
+ || ruleNode->rule()->explicitlyDependsOnFromDependencies.contains(
+ installableTag))
&& isRootRuleNode(depRuleNode))) {
connect(ruleNode, depRuleNode);
}
diff --git a/src/lib/corelib/buildgraph/rulesapplicator.cpp b/src/lib/corelib/buildgraph/rulesapplicator.cpp
index 8a908b27c..22c89ea54 100644
--- a/src/lib/corelib/buildgraph/rulesapplicator.cpp
+++ b/src/lib/corelib/buildgraph/rulesapplicator.cpp
@@ -154,7 +154,8 @@ void RulesApplicator::handleRemovedRuleOutputs(const ArtifactSet &inputArtifacts
ArtifactSet RulesApplicator::collectAuxiliaryInputs(const Rule *rule,
const ResolvedProduct *product)
{
- return collectAdditionalInputs(rule->auxiliaryInputs, rule, product);
+ return collectAdditionalInputs(rule->auxiliaryInputs, rule, product,
+ RulesApplicator::CurrentProduct | RulesApplicator::Dependencies);
}
static void copyProperty(const QString &name, const QScriptValue &src, QScriptValue dst)
@@ -298,19 +299,37 @@ ArtifactSet RulesApplicator::collectOldOutputArtifacts(const ArtifactSet &inputA
}
ArtifactSet RulesApplicator::collectAdditionalInputs(const FileTags &tags, const Rule *rule,
- const ResolvedProduct *product)
+ const ResolvedProduct *product,
+ InputsSources inputsSources)
{
ArtifactSet artifacts;
for (const FileTag &fileTag : tags) {
for (Artifact *dependency : product->lookupArtifactsByFileTag(fileTag)) {
- if (!dependency->fileTags().intersects(rule->excludedInputs))
+ // Skip excluded inputs.
+ if (dependency->fileTags().intersects(rule->excludedInputs))
+ continue;
+
+ // Two cases are considered:
+ // 1) An artifact is considered a dependency when it's part of the current product.
+ // 2) An artifact marked with filesAreTargets: true inside a Group inside of a
+ // Module also ends up in the results returned by product->lookupArtifactsByFileTag,
+ // so it should be considered conceptually as a "dependent product artifact".
+ if ((inputsSources.testFlag(RulesApplicator::CurrentProduct)
+ && !dependency->isTargetOfModule())
+ || (inputsSources.testFlag(RulesApplicator::Dependencies)
+ && dependency->isTargetOfModule())
+ ) {
artifacts << dependency;
+ }
}
- for (const ResolvedProductConstPtr &depProduct : product->dependencies) {
- for (Artifact * const ta : depProduct->targetArtifacts()) {
- if (ta->fileTags().contains(fileTag)
- && !ta->fileTags().intersects(rule->excludedInputs)) {
- artifacts << ta;
+
+ if (inputsSources.testFlag(RulesApplicator::Dependencies)) {
+ for (const ResolvedProductConstPtr &depProduct : product->dependencies) {
+ for (Artifact * const ta : depProduct->targetArtifacts()) {
+ if (ta->fileTags().contains(fileTag)
+ && !ta->fileTags().intersects(rule->excludedInputs)) {
+ artifacts << ta;
+ }
}
}
}
@@ -320,7 +339,13 @@ ArtifactSet RulesApplicator::collectAdditionalInputs(const FileTags &tags, const
ArtifactSet RulesApplicator::collectExplicitlyDependsOn()
{
- return collectAdditionalInputs(m_rule->explicitlyDependsOn, m_rule.get(), m_product.get());
+ ArtifactSet first = collectAdditionalInputs(
+ m_rule->explicitlyDependsOn, m_rule.get(), m_product.get(),
+ RulesApplicator::CurrentProduct);
+ ArtifactSet second = collectAdditionalInputs(
+ m_rule->explicitlyDependsOnFromDependencies, m_rule.get(), m_product.get(),
+ RulesApplicator::Dependencies);
+ return first.unite(second);
}
Artifact *RulesApplicator::createOutputArtifactFromRuleArtifact(
diff --git a/src/lib/corelib/buildgraph/rulesapplicator.h b/src/lib/corelib/buildgraph/rulesapplicator.h
index ac4501491..76220f52d 100644
--- a/src/lib/corelib/buildgraph/rulesapplicator.h
+++ b/src/lib/corelib/buildgraph/rulesapplicator.h
@@ -46,6 +46,7 @@
#include <language/forward_decls.h>
#include <logging/logger.h>
+#include <QtCore/qflags.h>
#include <QtCore/qhash.h>
#include <QtCore/qstring.h>
#include <QtScript/qscriptvalue.h>
@@ -75,10 +76,14 @@ public:
const ArtifactSet &artifactsToRemove, const Logger &logger);
static ArtifactSet collectAuxiliaryInputs(const Rule *rule, const ResolvedProduct *product);
+ enum InputsSourceFlag { CurrentProduct, Dependencies };
+ Q_DECLARE_FLAGS(InputsSources, InputsSourceFlag)
+
private:
void doApply(const ArtifactSet &inputArtifacts, QScriptValue &prepareScriptContext);
ArtifactSet collectOldOutputArtifacts(const ArtifactSet &inputArtifacts) const;
ArtifactSet collectExplicitlyDependsOn();
+ ArtifactSet collectExplicitlyDependsOnFromDependencies();
Artifact *createOutputArtifactFromRuleArtifact(const RuleArtifactConstPtr &ruleArtifact,
const ArtifactSet &inputArtifacts, Set<QString> *outputFilePaths);
Artifact *createOutputArtifact(const QString &filePath, const FileTags &fileTags,
@@ -93,7 +98,8 @@ private:
QScriptValue scope() const;
static ArtifactSet collectAdditionalInputs(const FileTags &tags,
- const Rule *rule, const ResolvedProduct *product);
+ const Rule *rule, const ResolvedProduct *product,
+ InputsSources inputsSources);
const ResolvedProductPtr m_product;
const std::unordered_map<QString, const ResolvedProduct *> &m_productsByName;
@@ -108,6 +114,8 @@ private:
Logger m_logger;
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(RulesApplicator::InputsSources)
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/corelib/language/builtindeclarations.cpp b/src/lib/corelib/language/builtindeclarations.cpp
index 8aac3c24a..4be405112 100644
--- a/src/lib/corelib/language/builtindeclarations.cpp
+++ b/src/lib/corelib/language/builtindeclarations.cpp
@@ -507,6 +507,8 @@ void BuiltinDeclarations::addRuleItem()
PropertyDeclaration::StringList);
item << PropertyDeclaration(StringConstants::explicitlyDependsOnProperty(),
PropertyDeclaration::StringList);
+ item << PropertyDeclaration(StringConstants::explicitlyDependsOnFromDependenciesProperty(),
+ PropertyDeclaration::StringList);
item << prepareScriptProperty();
insert(item);
}
diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp
index 2acd867a8..ac78b06c5 100644
--- a/src/lib/corelib/language/language.cpp
+++ b/src/lib/corelib/language/language.cpp
@@ -902,6 +902,7 @@ bool operator==(const Rule &r1, const Rule &r2)
&& r1.excludedInputs == r2.excludedInputs
&& r1.inputsFromDependencies == r2.inputsFromDependencies
&& r1.explicitlyDependsOn == r2.explicitlyDependsOn
+ && r1.explicitlyDependsOnFromDependencies == r2.explicitlyDependsOnFromDependencies
&& r1.multiplex == r2.multiplex
&& r1.requiresInputs == r2.requiresInputs
&& r1.alwaysRun == r2.alwaysRun;
diff --git a/src/lib/corelib/language/language.h b/src/lib/corelib/language/language.h
index 96fb83640..05fcfcf46 100644
--- a/src/lib/corelib/language/language.h
+++ b/src/lib/corelib/language/language.h
@@ -414,6 +414,7 @@ public:
FileTags excludedInputs;
FileTags inputsFromDependencies;
FileTags explicitlyDependsOn;
+ FileTags explicitlyDependsOnFromDependencies;
bool multiplex;
bool requiresInputs;
std::vector<RuleArtifactPtr> artifacts; // unused, if outputFileTags/outputArtifactsScript is non-empty
@@ -436,7 +437,8 @@ public:
{
pool.serializationOp<opType>(name, prepareScript, outputArtifactsScript, module, inputs,
outputFileTags, auxiliaryInputs, excludedInputs,
- inputsFromDependencies, explicitlyDependsOn, multiplex,
+ inputsFromDependencies, explicitlyDependsOn,
+ explicitlyDependsOnFromDependencies, multiplex,
requiresInputs, alwaysRun, artifacts);
}
private:
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp
index 33fee79b7..8b129c98b 100644
--- a/src/lib/corelib/language/projectresolver.cpp
+++ b/src/lib/corelib/language/projectresolver.cpp
@@ -1194,6 +1194,8 @@ void ProjectResolver::resolveRule(Item *item, ProjectContext *projectContext)
}
rule->explicitlyDependsOn
= m_evaluator->fileTagsValue(item, StringConstants::explicitlyDependsOnProperty());
+ rule->explicitlyDependsOnFromDependencies = m_evaluator->fileTagsValue(
+ item, StringConstants::explicitlyDependsOnFromDependenciesProperty());
rule->module = m_moduleContext ? m_moduleContext->module : projectContext->dummyModule;
if (!rule->multiplex && !rule->declaresInputs()) {
throw ErrorInfo(Tr::tr("Rule has no inputs, but is not a multiplex rule."),
diff --git a/src/lib/corelib/tools/persistence.cpp b/src/lib/corelib/tools/persistence.cpp
index 6d8aadf7e..0dab81440 100644
--- a/src/lib/corelib/tools/persistence.cpp
+++ b/src/lib/corelib/tools/persistence.cpp
@@ -49,7 +49,7 @@
namespace qbs {
namespace Internal {
-static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-116";
+static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE-117";
NoBuildGraphError::NoBuildGraphError(const QString &filePath)
: ErrorInfo(Tr::tr("Build graph not found for configuration '%1'. Expected location was '%2'.")
diff --git a/src/lib/corelib/tools/stringconstants.h b/src/lib/corelib/tools/stringconstants.h
index fa0836d2e..f2666e070 100644
--- a/src/lib/corelib/tools/stringconstants.h
+++ b/src/lib/corelib/tools/stringconstants.h
@@ -83,6 +83,9 @@ public:
QBS_STRING_CONSTANT(excludedAuxiliaryInputsProperty, "excludedAuxiliaryInputs")
QBS_STRING_CONSTANT(excludedInputsProperty, "excludedInputs")
static const QString &explicitlyDependsOnProperty() { return explicitlyDependsOn(); }
+ static const QString &explicitlyDependsOnFromDependenciesProperty() {
+ return explicitlyDependsOnFromDependencies();
+ }
static const QString &fileNameProperty() { return fileName(); }
static const QString &filePathProperty() { return filePath(); }
QBS_STRING_CONSTANT(fileTagsFilterProperty, "fileTagsFilter")
@@ -225,6 +228,7 @@ public:
private:
QBS_STRING_CONSTANT(cpp, "cpp")
QBS_STRING_CONSTANT(explicitlyDependsOn, "explicitlyDependsOn")
+ QBS_STRING_CONSTANT(explicitlyDependsOnFromDependencies, "explicitlyDependsOnFromDependencies")
QBS_STRING_CONSTANT(fileName, "fileName")
QBS_STRING_CONSTANT(filePath, "filePath")
QBS_STRING_CONSTANT(inputs, "inputs")