diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/corelib/buildgraph/projectbuilddata.cpp | 5 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/rulesapplicator.cpp | 43 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/rulesapplicator.h | 10 | ||||
-rw-r--r-- | src/lib/corelib/language/builtindeclarations.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/language.cpp | 1 | ||||
-rw-r--r-- | src/lib/corelib/language/language.h | 4 | ||||
-rw-r--r-- | src/lib/corelib/language/projectresolver.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/tools/persistence.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/tools/stringconstants.h | 4 |
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") |