Merge topic 'dev/custom-target-performance'

6208c285 cmMakefile: Defer dependency calculations
dc2e26df cmMakefile: Avoid excess source files
d2803fba cmMakefile: Add a CreateSource method
This commit is contained in:
Brad King 2014-07-09 10:02:47 -04:00 committed by CMake Topic Stage
commit aaea11e353
3 changed files with 61 additions and 43 deletions

View File

@ -29,7 +29,7 @@ bool cmGetSourceFilePropertyCommand
// for the location we must create a source file first // for the location we must create a source file first
if (!sf && args[2] == "LOCATION") if (!sf && args[2] == "LOCATION")
{ {
sf = this->Makefile->GetOrCreateSource(file); sf = this->Makefile->CreateSource(file);
} }
if(sf) if(sf)
{ {

View File

@ -989,7 +989,7 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs,
// Choose a source file on which to store the custom command. // Choose a source file on which to store the custom command.
cmSourceFile* file = 0; cmSourceFile* file = 0;
if(!main_dependency.empty()) if(!commandLines.empty() && !main_dependency.empty())
{ {
// The main dependency was specified. Use it unless a different // The main dependency was specified. Use it unless a different
// custom command already used it. // custom command already used it.
@ -1010,11 +1010,9 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs,
file = 0; file = 0;
} }
} }
else else if (!file)
{ {
// The main dependency does not have a custom command or we are file = this->CreateSource(main_dependency);
// allowed to replace it. Use it to store the command.
file = this->GetOrCreateSource(main_dependency);
} }
} }
@ -1041,8 +1039,11 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs,
} }
// Create a cmSourceFile for the rule file. // Create a cmSourceFile for the rule file.
file = this->GetOrCreateSource(outName, true); if (!file)
file->SetProperty("__CMAKE_RULE", "1"); {
file = this->CreateSource(outName, true);
file->SetProperty("__CMAKE_RULE", "1");
}
} }
// Always create the output sources and mark them generated. // Always create the output sources and mark them generated.
@ -1055,16 +1056,16 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs,
} }
} }
// Construct a complete list of dependencies.
std::vector<std::string> depends2(depends);
if(!main_dependency.empty())
{
depends2.push_back(main_dependency);
}
// Attach the custom command to the file. // Attach the custom command to the file.
if(file) if(file)
{ {
// Construct a complete list of dependencies.
std::vector<std::string> depends2(depends);
if(!main_dependency.empty())
{
depends2.push_back(main_dependency);
}
cmCustomCommand* cc = cmCustomCommand* cc =
new cmCustomCommand(this, outputs, depends2, commandLines, new cmCustomCommand(this, outputs, depends2, commandLines,
comment, workingDir); comment, workingDir);
@ -1256,28 +1257,31 @@ cmMakefile::AddUtilityCommand(const std::string& utilityName,
} }
// Store the custom command in the target. // Store the custom command in the target.
std::string force = this->GetStartOutputDirectory(); if (!commandLines.empty() || !depends.empty())
force += cmake::GetCMakeFilesDirectory(); {
force += "/"; std::string force = this->GetStartOutputDirectory();
force += utilityName; force += cmake::GetCMakeFilesDirectory();
std::string no_main_dependency = ""; force += "/";
bool no_replace = false; force += utilityName;
this->AddCustomCommandToOutput(force, depends, std::string no_main_dependency = "";
no_main_dependency, bool no_replace = false;
commandLines, comment, this->AddCustomCommandToOutput(force, depends,
workingDirectory, no_replace, no_main_dependency,
escapeOldStyle); commandLines, comment,
cmSourceFile* sf = target->AddSourceCMP0049(force); workingDirectory, no_replace,
escapeOldStyle);
cmSourceFile* sf = target->AddSourceCMP0049(force);
// The output is not actually created so mark it symbolic. // The output is not actually created so mark it symbolic.
if(sf) if(sf)
{ {
sf->SetProperty("SYMBOLIC", "1"); sf->SetProperty("SYMBOLIC", "1");
} }
else else
{ {
cmSystemTools::Error("Could not get source file entry for ", cmSystemTools::Error("Could not get source file entry for ",
force.c_str()); force.c_str());
}
} }
return target; return target;
} }
@ -3450,6 +3454,19 @@ cmSourceFile* cmMakefile::GetSource(const std::string& sourceName) const
return 0; 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, cmSourceFile* cmMakefile::GetOrCreateSource(const std::string& sourceName,
bool generated) bool generated)
@ -3460,13 +3477,7 @@ cmSourceFile* cmMakefile::GetOrCreateSource(const std::string& sourceName,
} }
else else
{ {
cmSourceFile* sf = new cmSourceFile(this, sourceName); return this->CreateSource(sourceName, generated);
if(generated)
{
sf->SetProperty("GENERATED", "1");
}
this->SourceFiles.push_back(sf);
return sf;
} }
} }

View File

@ -560,6 +560,13 @@ public:
*/ */
cmSourceFile* GetSource(const std::string& sourceName) const; 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 /** Get a cmSourceFile pointer for a given source name, if the name is
* not found, then create the source file and return it. generated * not found, then create the source file and return it. generated
* indicates if it is a generated file, this is used in determining * indicates if it is a generated file, this is used in determining