BUG: A utility target should not run the custom commands from its source files directly. The target-level rule must add dependencies on the file-level custom commands to drive them. This bug was introduced by the "fix" to bug 4377. This also restores the documented behavior that PRE_BUILD rules are treated as PRE_LINK rules on non-VS generators. Also fixed custom command dependencies on the rule file build.make so that custom commands re-run when the commands themselves change.

This commit is contained in:
Brad King 2007-05-01 13:51:25 -04:00
parent ef0b9ff2cc
commit c51c245efa
5 changed files with 17 additions and 28 deletions

View File

@ -27,7 +27,7 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmMakefileExecutableTargetGenerator::cmMakefileExecutableTargetGenerator() cmMakefileExecutableTargetGenerator::cmMakefileExecutableTargetGenerator()
{ {
this->DriveCustomCommandsOnDepends = true; this->CustomCommandDriver = OnDepends;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -29,7 +29,7 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmMakefileLibraryTargetGenerator::cmMakefileLibraryTargetGenerator() cmMakefileLibraryTargetGenerator::cmMakefileLibraryTargetGenerator()
{ {
this->DriveCustomCommandsOnDepends = true; this->CustomCommandDriver = OnDepends;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -35,7 +35,7 @@ cmMakefileTargetGenerator::cmMakefileTargetGenerator()
this->BuildFileStream = 0; this->BuildFileStream = 0;
this->InfoFileStream = 0; this->InfoFileStream = 0;
this->FlagFileStream = 0; this->FlagFileStream = 0;
this->DriveCustomCommandsOnDepends = false; this->CustomCommandDriver = OnBuild;
} }
cmMakefileTargetGenerator * cmMakefileTargetGenerator *
@ -788,7 +788,7 @@ void cmMakefileTargetGenerator::WriteTargetDependRules()
commands.push_back(depCmd.str()); commands.push_back(depCmd.str());
// Make sure all custom command outputs in this target are built. // Make sure all custom command outputs in this target are built.
if(this->DriveCustomCommandsOnDepends) if(this->CustomCommandDriver == OnDepends)
{ {
this->DriveCustomCommands(depends); this->DriveCustomCommands(depends);
} }
@ -874,6 +874,10 @@ void cmMakefileTargetGenerator
std::vector<std::string> depends; std::vector<std::string> depends;
this->LocalGenerator->AppendCustomDepend(depends, cc); this->LocalGenerator->AppendCustomDepend(depends, cc);
// Add a dependency on the rule file itself.
this->LocalGenerator->AppendRuleDepend(depends,
this->BuildFileNameFull.c_str());
// Check whether we need to bother checking for a symbolic output. // Check whether we need to bother checking for a symbolic output.
bool need_symbolic = this->GlobalGenerator->GetNeedSymbolicMark(); bool need_symbolic = this->GlobalGenerator->GetNeedSymbolicMark();
@ -1096,7 +1100,7 @@ void cmMakefileTargetGenerator::WriteTargetDriverRule(const char* main_output,
comment = "Rule to build all files generated by this target."; comment = "Rule to build all files generated by this target.";
// Make sure all custom command outputs in this target are built. // Make sure all custom command outputs in this target are built.
if(!this->DriveCustomCommandsOnDepends) if(this->CustomCommandDriver == OnBuild)
{ {
this->DriveCustomCommands(depends); this->DriveCustomCommands(depends);
} }

View File

@ -129,7 +129,8 @@ protected:
cmGlobalUnixMakefileGenerator3 *GlobalGenerator; cmGlobalUnixMakefileGenerator3 *GlobalGenerator;
cmMakefile *Makefile; cmMakefile *Makefile;
bool DriveCustomCommandsOnDepends; enum CustomCommandDriveType { OnBuild, OnDepends, OnUtility };
CustomCommandDriveType CustomCommandDriver;
// the full path to the build file // the full path to the build file
std::string BuildFileName; std::string BuildFileName;

View File

@ -26,10 +26,9 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmMakefileUtilityTargetGenerator::cmMakefileUtilityTargetGenerator() cmMakefileUtilityTargetGenerator::cmMakefileUtilityTargetGenerator()
{ {
this->DriveCustomCommandsOnDepends = true; this->CustomCommandDriver = OnUtility;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmMakefileUtilityTargetGenerator::WriteRuleFiles() void cmMakefileUtilityTargetGenerator::WriteRuleFiles()
{ {
@ -49,39 +48,24 @@ void cmMakefileUtilityTargetGenerator::WriteRuleFiles()
this->LocalGenerator->AppendCustomDepends this->LocalGenerator->AppendCustomDepends
(depends, this->Target->GetPreBuildCommands()); (depends, this->Target->GetPreBuildCommands());
// Build list of dependencies.
std::string relPath = this->LocalGenerator->GetHomeRelativeOutputPath();
std::string objTarget;
this->LocalGenerator->AppendCustomDepends this->LocalGenerator->AppendCustomDepends
(depends, this->Target->GetPostBuildCommands()); (depends, this->Target->GetPostBuildCommands());
this->LocalGenerator->AppendCustomCommands this->LocalGenerator->AppendCustomCommands
(commands, this->Target->GetPreBuildCommands()); (commands, this->Target->GetPreBuildCommands());
// Depend on all custom command outputs for sources // Depend on all custom command outputs for sources
const std::vector<cmSourceFile*>& sources = this->DriveCustomCommands(depends);
this->Target->GetSourceFiles();
for(std::vector<cmSourceFile*>::const_iterator source = sources.begin();
source != sources.end(); ++source)
{
if(cmCustomCommand* cc = (*source)->GetCustomCommand())
{
this->LocalGenerator->AppendCustomCommand(commands, *cc);
this->LocalGenerator->AppendCustomDepend(depends, *cc);
}
}
this->LocalGenerator->AppendCustomCommands this->LocalGenerator->AppendCustomCommands
(commands, this->Target->GetPostBuildCommands()); (commands, this->Target->GetPostBuildCommands());
// Add dependencies on targets that must be built first. // Add dependencies on targets that must be built first.
this->AppendTargetDepends(depends); this->AppendTargetDepends(depends);
// Add a dependency on the rule file itself. // Add a dependency on the rule file itself.
objTarget = relPath; this->LocalGenerator->AppendRuleDepend(depends,
objTarget += this->BuildFileName; this->BuildFileNameFull.c_str());
this->LocalGenerator->AppendRuleDepend(depends, objTarget.c_str());
// If the rule is empty add the special empty rule dependency needed // If the rule is empty add the special empty rule dependency needed
// by some make tools. // by some make tools.