diff options
author | Daniel Eiband <daniel.eiband@brainlab.com> | 2019-09-06 17:17:37 (GMT) |
---|---|---|
committer | Daniel Eiband <daniel.eiband@brainlab.com> | 2019-09-06 20:22:22 (GMT) |
commit | 75692393628d757a3dadb090179e167cd9539e2f (patch) | |
tree | 97624a27032783e147a3e919d7a2f8309e6cca81 | |
parent | ca8c3d64c8accebeacf322f0574494ffddb039c5 (diff) | |
download | CMake-75692393628d757a3dadb090179e167cd9539e2f.zip CMake-75692393628d757a3dadb090179e167cd9539e2f.tar.gz CMake-75692393628d757a3dadb090179e167cd9539e2f.tar.bz2 |
cmMakefile: set GENERATED property of outputs upfront
Setting the GENERATED property of outputs upfront is a precondition for delayed
custom command creation (generator expressions in outputs).
Issue: 12877
-rw-r--r-- | Source/cmMakefile.cxx | 48 | ||||
-rw-r--r-- | Source/cmMakefile.h | 5 |
2 files changed, 25 insertions, 28 deletions
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 411add3..d729451 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -860,7 +860,7 @@ void cmMakefile::AddCustomCommandToTarget( e << "No TARGET '" << target << "' has been created in this directory."; } - IssueMessage(messageType, e.str()); + this->IssueMessage(messageType, e.str()); } return; @@ -886,11 +886,7 @@ void cmMakefile::AddCustomCommandToTarget( } // Always create the byproduct sources and mark them generated. - for (std::string const& o : byproducts) { - if (cmSourceFile* out = this->GetOrCreateSource(o, true)) { - out->SetProperty("GENERATED", "1"); - } - } + this->CreateGeneratedSources(byproducts); // Add the command to the appropriate build step for the target. std::vector<std::string> no_output; @@ -940,6 +936,10 @@ cmSourceFile* cmMakefile::AddCustomCommandToOutput( } } + // Always create the output sources and mark them generated. + this->CreateGeneratedSources(outputs, cmSourceFileLocationKind::Known); + this->CreateGeneratedSources(byproducts, cmSourceFileLocationKind::Known); + // Choose a source file on which to store the custom command. cmSourceFile* file = nullptr; if (!commandLines.empty() && !main_dependency.empty()) { @@ -987,20 +987,6 @@ cmSourceFile* cmMakefile::AddCustomCommandToOutput( file->SetProperty("__CMAKE_RULE", "1"); } - // Always create the output sources and mark them generated. - for (std::string const& o : outputs) { - if (cmSourceFile* out = - this->GetOrCreateSource(o, true, cmSourceFileLocationKind::Known)) { - out->SetProperty("GENERATED", "1"); - } - } - for (std::string const& o : byproducts) { - if (cmSourceFile* out = - this->GetOrCreateSource(o, true, cmSourceFileLocationKind::Known)) { - out->SetProperty("GENERATED", "1"); - } - } - // Attach the custom command to the file. if (file) { // Construct a complete list of dependencies. @@ -1180,6 +1166,7 @@ cmTarget* cmMakefile::AddUtilityCommand( if (excludeFromAll || this->GetPropertyAsBool("EXCLUDE_FROM_ALL")) { target->SetProperty("EXCLUDE_FROM_ALL", "TRUE"); } + if (!comment) { // Use an empty comment to avoid generation of default comment. comment = ""; @@ -1187,6 +1174,9 @@ cmTarget* cmMakefile::AddUtilityCommand( // Store the custom command in the target. if (!commandLines.empty() || !depends.empty()) { + // Always create the byproduct sources and mark them generated. + this->CreateGeneratedSources(byproducts, cmSourceFileLocationKind::Known); + std::string force = cmStrCat(this->GetCurrentBinaryDirectory(), "/CMakeFiles/", utilityName); std::vector<std::string> forced; @@ -1205,14 +1195,6 @@ cmTarget* cmMakefile::AddUtilityCommand( } else { cmSystemTools::Error("Could not get source file entry for " + force); } - - // Always create the byproduct sources and mark them generated. - for (std::string const& byproduct : byproducts) { - if (cmSourceFile* out = this->GetOrCreateSource( - byproduct, true, cmSourceFileLocationKind::Known)) { - out->SetProperty("GENERATED", "1"); - } - } } return target; } @@ -3325,6 +3307,16 @@ cmSourceFile* cmMakefile::GetOrCreateSource(const std::string& sourceName, return this->CreateSource(sourceName, generated, kind); } +void cmMakefile::CreateGeneratedSources( + const std::vector<std::string>& outputs, cmSourceFileLocationKind kind) +{ + for (std::string const& output : outputs) { + if (cmSourceFile* out = this->GetOrCreateSource(output, true, kind)) { + out->SetProperty("GENERATED", "1"); + } + } +} + void cmMakefile::AddTargetObject(std::string const& tgtName, std::string const& objFile) { diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 09f53c9..52464d6 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -1030,6 +1030,11 @@ private: bool escapeQuotes, bool noEscapes, bool atOnly, const char* filename, long line, bool replaceAt) const; + + void CreateGeneratedSources( + const std::vector<std::string>& outputs, + cmSourceFileLocationKind kind = cmSourceFileLocationKind::Ambiguous); + /** * Old version of GetSourceFileWithOutput(const std::string&) kept for * backward-compatibility. It implements a linear search and support |