Browse Source

ENH: Moved reference from local driver targets (like build.local) into individual target rule files. Main rule is now empty, except that clean.local may remove files registered for cleaning.

Brad King 21 years ago
parent
commit
5798510cc7
2 changed files with 94 additions and 43 deletions
  1. 90 34
      Source/cmLocalUnixMakefileGenerator2.cxx
  2. 4 9
      Source/cmLocalUnixMakefileGenerator2.h

+ 90 - 34
Source/cmLocalUnixMakefileGenerator2.cxx

@@ -46,6 +46,10 @@
 // TODO: Add "help" target.
 // TODO: Add "help" target.
 // TODO: Identify remaining relative path violations.
 // TODO: Identify remaining relative path violations.
 // TODO: Need test for separate executable/library output path.
 // TODO: Need test for separate executable/library output path.
+// TODO: Add registered files for cleaning:
+//       $(GENERATED_QT_FILES) $(GENERATED_FLTK_FILES)
+//       What about cleaning custom command outputs?
+
 
 
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 cmLocalUnixMakefileGenerator2::cmLocalUnixMakefileGenerator2()
 cmLocalUnixMakefileGenerator2::cmLocalUnixMakefileGenerator2()
@@ -91,7 +95,6 @@ void cmLocalUnixMakefileGenerator2::Generate(bool fromTheTop)
   const cmTargets& targets = m_Makefile->GetTargets();
   const cmTargets& targets = m_Makefile->GetTargets();
   for(cmTargets::const_iterator t = targets.begin(); t != targets.end(); ++t)
   for(cmTargets::const_iterator t = targets.begin(); t != targets.end(); ++t)
     {
     {
-    // TODO: Dispatch generation of each target type.
     if((t->second.GetType() == cmTarget::EXECUTABLE) ||
     if((t->second.GetType() == cmTarget::EXECUTABLE) ||
        (t->second.GetType() == cmTarget::STATIC_LIBRARY) ||
        (t->second.GetType() == cmTarget::STATIC_LIBRARY) ||
        (t->second.GetType() == cmTarget::SHARED_LIBRARY) ||
        (t->second.GetType() == cmTarget::SHARED_LIBRARY) ||
@@ -153,19 +156,16 @@ void cmLocalUnixMakefileGenerator2::GenerateMakefile()
   this->WriteAllRules(makefileStream);
   this->WriteAllRules(makefileStream);
 
 
   // Write dependency generation rules.
   // Write dependency generation rules.
-  this->WritePassRules(makefileStream, "depend",
-                       "Build dependencies for this directory.",
-                       m_DependTargets);
+  this->WritePassRules(makefileStream, "depend");
+  this->WriteLocalRule(makefileStream, "depend", 0);
 
 
   // Write main build rules.
   // Write main build rules.
-  this->WritePassRules(makefileStream, "build",
-                       "Build targets in this directory.",
-                       m_BuildTargets);
+  this->WritePassRules(makefileStream, "build");
+  this->WriteLocalRule(makefileStream, "build", 0);
 
 
   // Write clean rules.
   // Write clean rules.
-  this->WritePassRules(makefileStream, "clean",
-                       "Clean targets in this directory.",
-                       m_CleanTargets);
+  this->WritePassRules(makefileStream, "clean");
+  this->WriteLocalCleanRule(makefileStream);
 
 
   // Write include statements to get rules for this directory.
   // Write include statements to get rules for this directory.
   this->WriteRuleFileIncludes(makefileStream);
   this->WriteRuleFileIncludes(makefileStream);
@@ -762,7 +762,7 @@ cmLocalUnixMakefileGenerator2
   // Add this to the list of build rules in this directory.
   // Add this to the list of build rules in this directory.
   if(target.IsInAll())
   if(target.IsInAll())
     {
     {
-    m_BuildTargets.push_back(target.GetName());
+    this->WriteLocalRule(ruleFileStream, "build", target.GetName());
     }
     }
 }
 }
 
 
@@ -1168,10 +1168,7 @@ cmLocalUnixMakefileGenerator2
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 void
 void
 cmLocalUnixMakefileGenerator2
 cmLocalUnixMakefileGenerator2
-::WritePassRules(std::ostream& makefileStream,
-                 const char* pass,
-                 const char* comment,
-                 const std::vector<std::string>& depends)
+::WritePassRules(std::ostream& makefileStream, const char* pass)
 {
 {
   // Write section header.
   // Write section header.
   this->WriteDivider(makefileStream);
   this->WriteDivider(makefileStream);
@@ -1183,17 +1180,6 @@ cmLocalUnixMakefileGenerator2
   std::string passLocal = pass;
   std::string passLocal = pass;
   passLocal += ".local";
   passLocal += ".local";
   this->WriteDriverRules(makefileStream, pass, passLocal.c_str());
   this->WriteDriverRules(makefileStream, pass, passLocal.c_str());
-
-  // If there are no dependencies, use empty commands.
-  std::vector<std::string> commands;
-  if(depends.empty())
-    {
-    commands = m_EmptyCommands;
-    }
-
-  // Write the rule.
-  this->WriteMakeRule(makefileStream, comment, 0, passLocal.c_str(),
-                      depends, commands);
 }
 }
 
 
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
@@ -1392,6 +1378,36 @@ cmLocalUnixMakefileGenerator2
                       tgt.c_str(), depends, commands);
                       tgt.c_str(), depends, commands);
 }
 }
 
 
+//----------------------------------------------------------------------------
+void
+cmLocalUnixMakefileGenerator2
+::WriteLocalRule(std::ostream& ruleFileStream, const char* pass,
+                 const char* dependency)
+{
+  std::string localTarget = pass;
+  localTarget += ".local";
+  if(dependency)
+    {
+    std::string comment = "Include this target in the \"";
+    comment += pass;
+    comment += "\" pass for this directory.";
+    std::vector<std::string> depends;
+    std::vector<std::string> no_commands;
+    depends.push_back(dependency);
+    this->WriteMakeRule(ruleFileStream, comment.c_str(), 0,
+                        localTarget.c_str(), depends, no_commands);
+    }
+  else
+    {
+    std::vector<std::string> no_depends;
+    std::vector<std::string> commands = m_EmptyCommands;
+    this->WriteMakeRule(ruleFileStream,
+                        "Local rule is empty by default.  "
+                        "Targets may add dependencies.", 0,
+                        localTarget.c_str(), no_depends, commands);
+    }
+}
+
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 void
 void
 cmLocalUnixMakefileGenerator2
 cmLocalUnixMakefileGenerator2
@@ -1970,10 +1986,10 @@ cmLocalUnixMakefileGenerator2
   this->WriteMakeRule(ruleFileStream, 0, depEcho.c_str(),
   this->WriteMakeRule(ruleFileStream, 0, depEcho.c_str(),
                       depTarget.c_str(), depends, no_commands);
                       depTarget.c_str(), depends, no_commands);
 
 
-  // Add this to the list of depend rules in this directory.
+  // Add this to the list of depends rules in this directory.
   if(target.IsInAll())
   if(target.IsInAll())
     {
     {
-    m_DependTargets.push_back(depTarget);
+    this->WriteLocalRule(ruleFileStream, "depend", depTarget.c_str());
     }
     }
 }
 }
 
 
@@ -1987,8 +2003,6 @@ cmLocalUnixMakefileGenerator2
   std::vector<std::string> no_depends;
   std::vector<std::string> no_depends;
   std::vector<std::string> commands;
   std::vector<std::string> commands;
 
 
-  // TODO: Add registered files for cleaning.
-
   // Construct the clean target name.
   // Construct the clean target name.
   std::string cleanTarget = target.GetName();
   std::string cleanTarget = target.GetName();
   cleanTarget += ".clean";
   cleanTarget += ".clean";
@@ -2010,7 +2024,7 @@ cmLocalUnixMakefileGenerator2
   // Add this to the list of clean rules in this directory.
   // Add this to the list of clean rules in this directory.
   if(target.IsInAll())
   if(target.IsInAll())
     {
     {
-    m_CleanTargets.push_back(cleanTarget);
+    this->WriteLocalRule(ruleFileStream, "clean", cleanTarget.c_str());
     }
     }
 }
 }
 
 
@@ -2023,6 +2037,7 @@ cmLocalUnixMakefileGenerator2
   // Create the driving make target.
   // Create the driving make target.
   std::string targetRequires = target.GetName();
   std::string targetRequires = target.GetName();
   targetRequires += ".requires";
   targetRequires += ".requires";
+  std::string comment = "Directory-level driver rulue for this target.";
   if(provides_requires.empty())
   if(provides_requires.empty())
     {
     {
     // No provides-requires mode objects in this target.  Anything
     // No provides-requires mode objects in this target.  Anything
@@ -2030,7 +2045,7 @@ cmLocalUnixMakefileGenerator2
     std::vector<std::string> no_commands;
     std::vector<std::string> no_commands;
     std::vector<std::string> depends;
     std::vector<std::string> depends;
     depends.push_back(target.GetName());
     depends.push_back(target.GetName());
-    this->WriteMakeRule(ruleFileStream, 0, 0,
+    this->WriteMakeRule(ruleFileStream, comment.c_str(), 0,
                         targetRequires.c_str(), depends, no_commands);
                         targetRequires.c_str(), depends, no_commands);
     }
     }
   else
   else
@@ -2056,9 +2071,10 @@ cmLocalUnixMakefileGenerator2
       depends.push_back(*pr);
       depends.push_back(*pr);
       }
       }
 
 
+    // Write the requires rule for this target.
     std::vector<std::string> commands;
     std::vector<std::string> commands;
     commands.push_back(this->GetRecursiveMakeCall(targetProvides.c_str()));
     commands.push_back(this->GetRecursiveMakeCall(targetProvides.c_str()));
-    this->WriteMakeRule(ruleFileStream, 0, 0,
+    this->WriteMakeRule(ruleFileStream, comment.c_str(), 0,
                         targetRequires.c_str(), depends, commands);
                         targetRequires.c_str(), depends, commands);
     }
     }
     }
     }
@@ -2066,7 +2082,47 @@ cmLocalUnixMakefileGenerator2
   // Add this to the list of build rules in this directory.
   // Add this to the list of build rules in this directory.
   if(target.IsInAll())
   if(target.IsInAll())
     {
     {
-    m_BuildTargets.push_back(targetRequires);
+    this->WriteLocalRule(ruleFileStream, "build", targetRequires.c_str());
+    }
+}
+
+//----------------------------------------------------------------------------
+void
+cmLocalUnixMakefileGenerator2
+::WriteLocalCleanRule(std::ostream& makefileStream)
+{
+  // Collect a list of extra files to clean in this directory.
+  std::vector<std::string> files;
+
+  // Look for files registered for cleaning in this directory.
+  if(const char* additional_clean_files =
+     m_Makefile->GetProperty("ADDITIONAL_MAKE_CLEAN_FILES"))
+    {
+    cmSystemTools::ExpandListArgument(additional_clean_files, files);
+    }
+
+  // Write the local clean rule for this directory.
+  if(files.empty())
+    {
+    // No extra files to clean.  Write an empty rule.
+    this->WriteLocalRule(makefileStream, "clean", 0);
+    }
+  else
+    {
+    // Have extra files to clean.  Write the action to remove them.
+    std::string remove = "$(CMAKE_COMMAND) -E remove -f";
+    for(std::vector<std::string>::iterator i = files.begin();
+        i != files.end(); ++i)
+      {
+      remove += " ";
+      remove += this->ConvertToRelativeOutputPath(i->c_str());
+      }
+    std::vector<std::string> no_depends;
+    std::vector<std::string> commands;
+    commands.push_back(remove);
+    this->WriteMakeRule(makefileStream,
+                        "Clean extra files in this directory.", 0,
+                        "clean.local", no_depends, commands);
     }
     }
 }
 }
 
 

+ 4 - 9
Source/cmLocalUnixMakefileGenerator2.h

@@ -90,9 +90,7 @@ protected:
   void WriteSpecialTargetsBottom(std::ostream& makefileStream);
   void WriteSpecialTargetsBottom(std::ostream& makefileStream);
   void WriteRuleFileIncludes(std::ostream& makefileStream);
   void WriteRuleFileIncludes(std::ostream& makefileStream);
   void WriteAllRules(std::ostream& makefileStream);
   void WriteAllRules(std::ostream& makefileStream);
-  void WritePassRules(std::ostream& makefileStream,
-                      const char* pass, const char* comment,
-                      const std::vector<std::string>& depends);
+  void WritePassRules(std::ostream& makefileStream, const char* pass);
   void WriteDriverRules(std::ostream& makefileStream, const char* pass,
   void WriteDriverRules(std::ostream& makefileStream, const char* pass,
                         const char* local1, const char* local2=0);
                         const char* local1, const char* local2=0);
   void WriteSubdirRules(std::ostream& makefileStream, const char* pass);
   void WriteSubdirRules(std::ostream& makefileStream, const char* pass);
@@ -100,6 +98,8 @@ protected:
                        const char* subdir, std::string& last);
                        const char* subdir, std::string& last);
   void WriteSubdirDriverRule(std::ostream& makefileStream, const char* pass,
   void WriteSubdirDriverRule(std::ostream& makefileStream, const char* pass,
                              const char* order, const std::string& last);
                              const char* order, const std::string& last);
+  void WriteLocalRule(std::ostream& ruleFileStream, const char* pass,
+                      const char* dependency);
   void WriteConvenienceRules(std::ostream& ruleFileStream,
   void WriteConvenienceRules(std::ostream& ruleFileStream,
                              const cmTarget& target,
                              const cmTarget& target,
                              const char* targetOutPath);
                              const char* targetOutPath);
@@ -154,6 +154,7 @@ protected:
   void WriteTargetRequiresRule(std::ostream& ruleFileStream,
   void WriteTargetRequiresRule(std::ostream& ruleFileStream,
                                const cmTarget& target,
                                const cmTarget& target,
                                const std::vector<std::string>& provides_requires);
                                const std::vector<std::string>& provides_requires);
+  void WriteLocalCleanRule(std::ostream& makefileStream);
   void WriteCMakeArgument(std::ostream& os, const char* s);
   void WriteCMakeArgument(std::ostream& os, const char* s);
   std::string GetTargetDirectory(const cmTarget& target);
   std::string GetTargetDirectory(const cmTarget& target);
   std::string GetSubdirTargetName(const char* pass, const char* subdir);
   std::string GetSubdirTargetName(const char* pass, const char* subdir);
@@ -211,12 +212,6 @@ private:
   // Set of custom rule files that have been generated.
   // Set of custom rule files that have been generated.
   std::set<cmStdString> m_CustomRuleFiles;
   std::set<cmStdString> m_CustomRuleFiles;
 
 
-  // List of target-level rules for each pass.  These are populated by
-  // target rule file writing methods.
-  std::vector<std::string> m_DependTargets;
-  std::vector<std::string> m_BuildTargets;
-  std::vector<std::string> m_CleanTargets;
-
   // The prefix required of a path to be converted to a relative path.
   // The prefix required of a path to be converted to a relative path.
   // No sequence of ../.. will ever go past this path.
   // No sequence of ../.. will ever go past this path.
   std::string m_RelativePathTop;
   std::string m_RelativePathTop;