From c51c245efa2cf6608e97862edbf7c1ba038e0cf2 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 1 May 2007 13:51:25 -0400 Subject: [PATCH] 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. --- .../cmMakefileExecutableTargetGenerator.cxx | 2 +- Source/cmMakefileLibraryTargetGenerator.cxx | 2 +- Source/cmMakefileTargetGenerator.cxx | 10 +++++-- Source/cmMakefileTargetGenerator.h | 3 +- Source/cmMakefileUtilityTargetGenerator.cxx | 28 ++++--------------- 5 files changed, 17 insertions(+), 28 deletions(-) diff --git a/Source/cmMakefileExecutableTargetGenerator.cxx b/Source/cmMakefileExecutableTargetGenerator.cxx index 677f9f3fd..ccb13e9a3 100644 --- a/Source/cmMakefileExecutableTargetGenerator.cxx +++ b/Source/cmMakefileExecutableTargetGenerator.cxx @@ -27,7 +27,7 @@ //---------------------------------------------------------------------------- cmMakefileExecutableTargetGenerator::cmMakefileExecutableTargetGenerator() { - this->DriveCustomCommandsOnDepends = true; + this->CustomCommandDriver = OnDepends; } //---------------------------------------------------------------------------- diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index 717b0ddc4..5325c06a0 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx @@ -29,7 +29,7 @@ //---------------------------------------------------------------------------- cmMakefileLibraryTargetGenerator::cmMakefileLibraryTargetGenerator() { - this->DriveCustomCommandsOnDepends = true; + this->CustomCommandDriver = OnDepends; } //---------------------------------------------------------------------------- diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index 523a6f736..54d7835d8 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -35,7 +35,7 @@ cmMakefileTargetGenerator::cmMakefileTargetGenerator() this->BuildFileStream = 0; this->InfoFileStream = 0; this->FlagFileStream = 0; - this->DriveCustomCommandsOnDepends = false; + this->CustomCommandDriver = OnBuild; } cmMakefileTargetGenerator * @@ -788,7 +788,7 @@ void cmMakefileTargetGenerator::WriteTargetDependRules() commands.push_back(depCmd.str()); // Make sure all custom command outputs in this target are built. - if(this->DriveCustomCommandsOnDepends) + if(this->CustomCommandDriver == OnDepends) { this->DriveCustomCommands(depends); } @@ -874,6 +874,10 @@ void cmMakefileTargetGenerator std::vector depends; 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. 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."; // Make sure all custom command outputs in this target are built. - if(!this->DriveCustomCommandsOnDepends) + if(this->CustomCommandDriver == OnBuild) { this->DriveCustomCommands(depends); } diff --git a/Source/cmMakefileTargetGenerator.h b/Source/cmMakefileTargetGenerator.h index e81e72abd..58d7cd0de 100644 --- a/Source/cmMakefileTargetGenerator.h +++ b/Source/cmMakefileTargetGenerator.h @@ -129,7 +129,8 @@ protected: cmGlobalUnixMakefileGenerator3 *GlobalGenerator; cmMakefile *Makefile; - bool DriveCustomCommandsOnDepends; + enum CustomCommandDriveType { OnBuild, OnDepends, OnUtility }; + CustomCommandDriveType CustomCommandDriver; // the full path to the build file std::string BuildFileName; diff --git a/Source/cmMakefileUtilityTargetGenerator.cxx b/Source/cmMakefileUtilityTargetGenerator.cxx index 60400239e..c4ce9f114 100644 --- a/Source/cmMakefileUtilityTargetGenerator.cxx +++ b/Source/cmMakefileUtilityTargetGenerator.cxx @@ -26,10 +26,9 @@ //---------------------------------------------------------------------------- cmMakefileUtilityTargetGenerator::cmMakefileUtilityTargetGenerator() { - this->DriveCustomCommandsOnDepends = true; + this->CustomCommandDriver = OnUtility; } - //---------------------------------------------------------------------------- void cmMakefileUtilityTargetGenerator::WriteRuleFiles() { @@ -49,39 +48,24 @@ void cmMakefileUtilityTargetGenerator::WriteRuleFiles() this->LocalGenerator->AppendCustomDepends (depends, this->Target->GetPreBuildCommands()); - // Build list of dependencies. - std::string relPath = this->LocalGenerator->GetHomeRelativeOutputPath(); - std::string objTarget; - this->LocalGenerator->AppendCustomDepends (depends, this->Target->GetPostBuildCommands()); this->LocalGenerator->AppendCustomCommands (commands, this->Target->GetPreBuildCommands()); - + // Depend on all custom command outputs for sources - const std::vector& sources = - this->Target->GetSourceFiles(); - for(std::vector::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->DriveCustomCommands(depends); this->LocalGenerator->AppendCustomCommands (commands, this->Target->GetPostBuildCommands()); // Add dependencies on targets that must be built first. this->AppendTargetDepends(depends); - + // Add a dependency on the rule file itself. - objTarget = relPath; - objTarget += this->BuildFileName; - this->LocalGenerator->AppendRuleDepend(depends, objTarget.c_str()); + this->LocalGenerator->AppendRuleDepend(depends, + this->BuildFileNameFull.c_str()); // If the rule is empty add the special empty rule dependency needed // by some make tools.