diff options
author | Brad King <brad.king@kitware.com> | 2005-02-09 14:36:28 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2005-02-09 14:36:28 (GMT) |
commit | 5798510cc7a7543f3583e36f7860488f1c7f6a69 (patch) | |
tree | 9e0e92e30ed0eb6256dd67680d5fb6437d3a0bfe | |
parent | 5517bc911d3c1f57aa77cdb59454ac6655effe21 (diff) | |
download | CMake-5798510cc7a7543f3583e36f7860488f1c7f6a69.zip CMake-5798510cc7a7543f3583e36f7860488f1c7f6a69.tar.gz CMake-5798510cc7a7543f3583e36f7860488f1c7f6a69.tar.bz2 |
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.
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator2.cxx | 124 | ||||
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator2.h | 13 |
2 files changed, 94 insertions, 43 deletions
diff --git a/Source/cmLocalUnixMakefileGenerator2.cxx b/Source/cmLocalUnixMakefileGenerator2.cxx index d222b4b..fda2e0a 100644 --- a/Source/cmLocalUnixMakefileGenerator2.cxx +++ b/Source/cmLocalUnixMakefileGenerator2.cxx @@ -46,6 +46,10 @@ // TODO: Add "help" target. // TODO: Identify remaining relative path violations. // 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() @@ -91,7 +95,6 @@ void cmLocalUnixMakefileGenerator2::Generate(bool fromTheTop) const cmTargets& targets = m_Makefile->GetTargets(); for(cmTargets::const_iterator t = targets.begin(); t != targets.end(); ++t) { - // TODO: Dispatch generation of each target type. if((t->second.GetType() == cmTarget::EXECUTABLE) || (t->second.GetType() == cmTarget::STATIC_LIBRARY) || (t->second.GetType() == cmTarget::SHARED_LIBRARY) || @@ -153,19 +156,16 @@ void cmLocalUnixMakefileGenerator2::GenerateMakefile() this->WriteAllRules(makefileStream); // 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. - this->WritePassRules(makefileStream, "build", - "Build targets in this directory.", - m_BuildTargets); + this->WritePassRules(makefileStream, "build"); + this->WriteLocalRule(makefileStream, "build", 0); // 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. this->WriteRuleFileIncludes(makefileStream); @@ -762,7 +762,7 @@ cmLocalUnixMakefileGenerator2 // Add this to the list of build rules in this directory. if(target.IsInAll()) { - m_BuildTargets.push_back(target.GetName()); + this->WriteLocalRule(ruleFileStream, "build", target.GetName()); } } @@ -1168,10 +1168,7 @@ cmLocalUnixMakefileGenerator2 //---------------------------------------------------------------------------- void 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. this->WriteDivider(makefileStream); @@ -1183,17 +1180,6 @@ cmLocalUnixMakefileGenerator2 std::string passLocal = pass; passLocal += ".local"; 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); } //---------------------------------------------------------------------------- @@ -1395,6 +1381,36 @@ cmLocalUnixMakefileGenerator2 //---------------------------------------------------------------------------- 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 +cmLocalUnixMakefileGenerator2 ::WriteConvenienceRules(std::ostream& ruleFileStream, const cmTarget& target, const char* targetOutPath) { @@ -1970,10 +1986,10 @@ cmLocalUnixMakefileGenerator2 this->WriteMakeRule(ruleFileStream, 0, depEcho.c_str(), 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()) { - 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> commands; - // TODO: Add registered files for cleaning. - // Construct the clean target name. std::string cleanTarget = target.GetName(); cleanTarget += ".clean"; @@ -2010,7 +2024,7 @@ cmLocalUnixMakefileGenerator2 // Add this to the list of clean rules in this directory. 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. std::string targetRequires = target.GetName(); targetRequires += ".requires"; + std::string comment = "Directory-level driver rulue for this target."; if(provides_requires.empty()) { // No provides-requires mode objects in this target. Anything @@ -2030,7 +2045,7 @@ cmLocalUnixMakefileGenerator2 std::vector<std::string> no_commands; std::vector<std::string> depends; depends.push_back(target.GetName()); - this->WriteMakeRule(ruleFileStream, 0, 0, + this->WriteMakeRule(ruleFileStream, comment.c_str(), 0, targetRequires.c_str(), depends, no_commands); } else @@ -2056,9 +2071,10 @@ cmLocalUnixMakefileGenerator2 depends.push_back(*pr); } + // Write the requires rule for this target. std::vector<std::string> commands; 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); } } @@ -2066,7 +2082,47 @@ cmLocalUnixMakefileGenerator2 // Add this to the list of build rules in this directory. 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); } } diff --git a/Source/cmLocalUnixMakefileGenerator2.h b/Source/cmLocalUnixMakefileGenerator2.h index 2fb3a12..7cf9a16 100644 --- a/Source/cmLocalUnixMakefileGenerator2.h +++ b/Source/cmLocalUnixMakefileGenerator2.h @@ -90,9 +90,7 @@ protected: void WriteSpecialTargetsBottom(std::ostream& makefileStream); void WriteRuleFileIncludes(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, const char* local1, const char* local2=0); void WriteSubdirRules(std::ostream& makefileStream, const char* pass); @@ -100,6 +98,8 @@ protected: const char* subdir, std::string& last); void WriteSubdirDriverRule(std::ostream& makefileStream, const char* pass, const char* order, const std::string& last); + void WriteLocalRule(std::ostream& ruleFileStream, const char* pass, + const char* dependency); void WriteConvenienceRules(std::ostream& ruleFileStream, const cmTarget& target, const char* targetOutPath); @@ -154,6 +154,7 @@ protected: void WriteTargetRequiresRule(std::ostream& ruleFileStream, const cmTarget& target, const std::vector<std::string>& provides_requires); + void WriteLocalCleanRule(std::ostream& makefileStream); void WriteCMakeArgument(std::ostream& os, const char* s); std::string GetTargetDirectory(const cmTarget& target); std::string GetSubdirTargetName(const char* pass, const char* subdir); @@ -211,12 +212,6 @@ private: // Set of custom rule files that have been generated. 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. // No sequence of ../.. will ever go past this path. std::string m_RelativePathTop; |