From d2803fbac6ca20c998ff5364e79f0841eba6c579 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Tue, 11 Mar 2014 18:04:11 -0400 Subject: [PATCH 1/3] cmMakefile: Add a CreateSource method The GetOrCreateSource searches the source file listing again, but some callers know that it already didn't exist. --- Source/cmGetSourceFilePropertyCommand.cxx | 2 +- Source/cmMakefile.cxx | 34 ++++++++++++++--------- Source/cmMakefile.h | 7 +++++ 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/Source/cmGetSourceFilePropertyCommand.cxx b/Source/cmGetSourceFilePropertyCommand.cxx index 8a96289b4..7667a8592 100644 --- a/Source/cmGetSourceFilePropertyCommand.cxx +++ b/Source/cmGetSourceFilePropertyCommand.cxx @@ -29,7 +29,7 @@ bool cmGetSourceFilePropertyCommand // for the location we must create a source file first if (!sf && args[2] == "LOCATION") { - sf = this->Makefile->GetOrCreateSource(file); + sf = this->Makefile->CreateSource(file); } if(sf) { diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 412c998ac..c4543d731 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1010,11 +1010,9 @@ cmMakefile::AddCustomCommandToOutput(const std::vector& outputs, file = 0; } } - else + else if (!file) { - // The main dependency does not have a custom command or we are - // allowed to replace it. Use it to store the command. - file = this->GetOrCreateSource(main_dependency); + file = this->CreateSource(main_dependency); } } @@ -1041,8 +1039,11 @@ cmMakefile::AddCustomCommandToOutput(const std::vector& outputs, } // Create a cmSourceFile for the rule file. - file = this->GetOrCreateSource(outName, true); - file->SetProperty("__CMAKE_RULE", "1"); + if (!file) + { + file = this->CreateSource(outName, true); + file->SetProperty("__CMAKE_RULE", "1"); + } } // Always create the output sources and mark them generated. @@ -3450,6 +3451,19 @@ cmSourceFile* cmMakefile::GetSource(const std::string& sourceName) const return 0; } +//---------------------------------------------------------------------------- +cmSourceFile* cmMakefile::CreateSource(const std::string& sourceName, + bool generated) +{ + cmSourceFile* sf = new cmSourceFile(this, sourceName); + if(generated) + { + sf->SetProperty("GENERATED", "1"); + } + this->SourceFiles.push_back(sf); + return sf; +} + //---------------------------------------------------------------------------- cmSourceFile* cmMakefile::GetOrCreateSource(const std::string& sourceName, bool generated) @@ -3460,13 +3474,7 @@ cmSourceFile* cmMakefile::GetOrCreateSource(const std::string& sourceName, } else { - cmSourceFile* sf = new cmSourceFile(this, sourceName); - if(generated) - { - sf->SetProperty("GENERATED", "1"); - } - this->SourceFiles.push_back(sf); - return sf; + return this->CreateSource(sourceName, generated); } } diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index d5ffd984a..3a40c1c0f 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -560,6 +560,13 @@ public: */ cmSourceFile* GetSource(const std::string& sourceName) const; + /** Create the source file and return it. generated + * indicates if it is a generated file, this is used in determining + * how to create the source file instance e.g. name + */ + cmSourceFile* CreateSource(const std::string& sourceName, + bool generated = false); + /** Get a cmSourceFile pointer for a given source name, if the name is * not found, then create the source file and return it. generated * indicates if it is a generated file, this is used in determining From dc2e26df01eb4230a69c43a05b867fce330f57a4 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Wed, 12 Mar 2014 17:29:04 -0400 Subject: [PATCH 2/3] cmMakefile: Avoid excess source files When there are no commands, a main_dependency is not required and when there are also no dependencies, nothing is required. --- Source/cmMakefile.cxx | 47 +++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index c4543d731..452d3f6f3 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -989,7 +989,7 @@ cmMakefile::AddCustomCommandToOutput(const std::vector& outputs, // Choose a source file on which to store the custom command. cmSourceFile* file = 0; - if(!main_dependency.empty()) + if(!commandLines.empty() && !main_dependency.empty()) { // The main dependency was specified. Use it unless a different // custom command already used it. @@ -1257,28 +1257,31 @@ cmMakefile::AddUtilityCommand(const std::string& utilityName, } // Store the custom command in the target. - std::string force = this->GetStartOutputDirectory(); - force += cmake::GetCMakeFilesDirectory(); - force += "/"; - force += utilityName; - std::string no_main_dependency = ""; - bool no_replace = false; - this->AddCustomCommandToOutput(force, depends, - no_main_dependency, - commandLines, comment, - workingDirectory, no_replace, - escapeOldStyle); - cmSourceFile* sf = target->AddSourceCMP0049(force); + if (!commandLines.empty() || !depends.empty()) + { + std::string force = this->GetStartOutputDirectory(); + force += cmake::GetCMakeFilesDirectory(); + force += "/"; + force += utilityName; + std::string no_main_dependency = ""; + bool no_replace = false; + this->AddCustomCommandToOutput(force, depends, + no_main_dependency, + commandLines, comment, + workingDirectory, no_replace, + escapeOldStyle); + cmSourceFile* sf = target->AddSourceCMP0049(force); - // The output is not actually created so mark it symbolic. - if(sf) - { - sf->SetProperty("SYMBOLIC", "1"); - } - else - { - cmSystemTools::Error("Could not get source file entry for ", - force.c_str()); + // The output is not actually created so mark it symbolic. + if(sf) + { + sf->SetProperty("SYMBOLIC", "1"); + } + else + { + cmSystemTools::Error("Could not get source file entry for ", + force.c_str()); + } } return target; } From 6208c285c8ae43d566474f488a00967b74ee4389 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 21 Mar 2014 22:27:59 -0400 Subject: [PATCH 3/3] cmMakefile: Defer dependency calculations --- Source/cmMakefile.cxx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 452d3f6f3..2218e2f05 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1056,16 +1056,16 @@ cmMakefile::AddCustomCommandToOutput(const std::vector& outputs, } } - // Construct a complete list of dependencies. - std::vector depends2(depends); - if(!main_dependency.empty()) - { - depends2.push_back(main_dependency); - } - // Attach the custom command to the file. if(file) { + // Construct a complete list of dependencies. + std::vector depends2(depends); + if(!main_dependency.empty()) + { + depends2.push_back(main_dependency); + } + cmCustomCommand* cc = new cmCustomCommand(this, outputs, depends2, commandLines, comment, workingDir);