Procházet zdrojové kódy

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.

Brad King před 18 roky
rodič
revize
c51c245efa

+ 1 - 1
Source/cmMakefileExecutableTargetGenerator.cxx

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

+ 1 - 1
Source/cmMakefileLibraryTargetGenerator.cxx

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

+ 7 - 3
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<std::string> 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);
       }

+ 2 - 1
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;

+ 6 - 22
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<cmSourceFile*>& sources =
-    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->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.