diff options
-rw-r--r-- | Source/cmGlobalUnixMakefileGenerator3.cxx | 76 | ||||
-rw-r--r-- | Source/cmGlobalUnixMakefileGenerator3.h | 1 | ||||
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator3.cxx | 154 | ||||
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator3.h | 17 |
4 files changed, 56 insertions, 192 deletions
diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx index 4a0596c..985e092 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.cxx +++ b/Source/cmGlobalUnixMakefileGenerator3.cxx @@ -101,7 +101,6 @@ void cmGlobalUnixMakefileGenerator3::Generate() this->WriteMainCMakefile(); // now write the support Makefiles - this->WriteDependMakefile(); this->WriteBuildMakefile(); this->WriteCleanMakefile(); } @@ -316,64 +315,6 @@ void cmGlobalUnixMakefileGenerator3 } } -void cmGlobalUnixMakefileGenerator3::WriteDependMakefile() -{ - unsigned int i; - - // Open the output file. This should not be copy-if-different - // because the check-build-system step compares the makefile time to - // see if the build system must be regenerated. - std::string makefileName = this->GetCMakeInstance()->GetHomeOutputDirectory(); - makefileName += "/depend.make"; - cmGeneratedFileStream makefileStream(makefileName.c_str()); - if(!makefileStream) - { - return; - } - - // get a local generator for some useful methods - cmLocalUnixMakefileGenerator3 *lg = - static_cast<cmLocalUnixMakefileGenerator3 *>(m_LocalGenerators[0]); - - // Write the do not edit header. - lg->WriteDisclaimer(makefileStream); - //lg->WriteMakeVariables(makefileStream); - - // add the generic dependency - std::vector<std::string> depends; - std::vector<std::string> no_commands; - lg->WriteMakeRule(makefileStream, 0, "depend", depends, no_commands); - - // include the build rules - makefileStream - << "# Include make rules for build targets\n"; - makefileStream - << lg->GetIncludeDirective() << " " - << lg->ConvertToOutputForExisting("build.make").c_str() - << "\n\n"; - - // include all the target depends - for (i = 0; i < m_LocalGenerators.size(); ++i) - { - cmLocalUnixMakefileGenerator3 *lg2 = - static_cast<cmLocalUnixMakefileGenerator3 *>(m_LocalGenerators[i]); - // are any parents excluded - bool exclude = false; - cmLocalGenerator *lg3 = lg2; - while (lg3) - { - if (lg3->GetExcludeAll()) - { - exclude = true; - break; - } - lg3 = lg3->GetParent(); - } - lg2->WriteMainTargetIncludes(makefileStream,"depend.make","depend"); - lg2->WriteMainTargetRules(makefileStream,"depend.make","depend",!exclude); - } -} - void cmGlobalUnixMakefileGenerator3::WriteBuildMakefile() { unsigned int i; @@ -401,6 +342,8 @@ void cmGlobalUnixMakefileGenerator3::WriteBuildMakefile() std::vector<std::string> depends; std::vector<std::string> no_commands; lg->WriteMakeRule(makefileStream, 0, "build", depends, no_commands); + lg->WriteMakeRule(makefileStream, 0, "depend", depends, no_commands); + lg->WriteMakeRule(makefileStream, 0, "requires", depends, no_commands); // include all the target depends for (i = 0; i < m_LocalGenerators.size(); ++i) @@ -420,8 +363,9 @@ void cmGlobalUnixMakefileGenerator3::WriteBuildMakefile() lg3 = lg3->GetParent(); } lg2->WriteMainTargetIncludes(makefileStream,"build.make","build"); - lg2->WriteMainTargetRules(makefileStream,"build.make","build",!exclude); + lg2->WriteMainTargetRules(makefileStream,"build.make","depend",!exclude); lg2->WriteMainTargetRules(makefileStream,"build.make","requires",!exclude); + lg2->WriteMainTargetRules(makefileStream,"build.make","build",!exclude); } } @@ -483,8 +427,8 @@ void cmGlobalUnixMakefileGenerator3 // Check the build system in this directory. depends.push_back("cmake_check_build_system"); - commands.push_back(lg->GetRecursiveMakeCall("depend.make",0)); - commands.push_back(lg->GetRecursiveMakeCall("depend.make","requires")); + commands.push_back(lg->GetRecursiveMakeCall("build.make","depend")); + commands.push_back(lg->GetRecursiveMakeCall("build.make","requires")); commands.push_back(lg->GetRecursiveMakeCall("build.make",0)); // Write the rule. @@ -520,10 +464,10 @@ cmGlobalUnixMakefileGenerator3 commands.clear(); makeTargetName = dir; makeTargetName += "/depend"; - commands.push_back(lg->GetRecursiveMakeCall("depend.make",makeTargetName.c_str())); + commands.push_back(lg->GetRecursiveMakeCall("build.make",makeTargetName.c_str())); makeTargetName = dir; makeTargetName += "/requires"; - commands.push_back(lg->GetRecursiveMakeCall("depend.make",makeTargetName.c_str())); + commands.push_back(lg->GetRecursiveMakeCall("build.make",makeTargetName.c_str())); makeTargetName = dir; makeTargetName += "/build"; commands.push_back(lg->GetRecursiveMakeCall("build.make",makeTargetName.c_str())); @@ -548,10 +492,10 @@ cmGlobalUnixMakefileGenerator3 commands.clear(); makeTargetName = localName; makeTargetName += "/depend"; - commands.push_back(lg->GetRecursiveMakeCall("depend.make",makeTargetName.c_str())); + commands.push_back(lg->GetRecursiveMakeCall("build.make",makeTargetName.c_str())); makeTargetName = localName; makeTargetName += "/requires"; - commands.push_back(lg->GetRecursiveMakeCall("depend.make",makeTargetName.c_str())); + commands.push_back(lg->GetRecursiveMakeCall("build.make",makeTargetName.c_str())); makeTargetName = localName; makeTargetName += "/build"; commands.push_back(lg->GetRecursiveMakeCall("build.make",makeTargetName.c_str())); diff --git a/Source/cmGlobalUnixMakefileGenerator3.h b/Source/cmGlobalUnixMakefileGenerator3.h index eb8d8da..b63d007 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.h +++ b/Source/cmGlobalUnixMakefileGenerator3.h @@ -60,7 +60,6 @@ public: protected: void WriteMainMakefile(); void WriteMainCMakefile(); - void WriteDependMakefile(); void WriteBuildMakefile(); void WriteCleanMakefile(); void WriteMainCMakefileLanguageRules(cmGeneratedFileStream& cmakefileStream); diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx index 9f9e47f..4efbe53 100644 --- a/Source/cmLocalUnixMakefileGenerator3.cxx +++ b/Source/cmLocalUnixMakefileGenerator3.cxx @@ -428,11 +428,12 @@ cmLocalUnixMakefileGenerator3 //---------------------------------------------------------------------------- void cmLocalUnixMakefileGenerator3 -::WriteObjectDependFile(std::string &obj, - const char * lang, - const cmSourceFile& source, - std::vector<std::string>& depends, - std::string& depMakeFile) +::WriteObjectDependRules(std::ostream& ruleFileStream, + std::string &obj, + const char * lang, + const cmSourceFile& source, + std::vector<std::string>& depends, + std::string& depMakeFile) { // TODO: what the heck is this? // Generate the build-time dependencies file for this object file. @@ -445,21 +446,6 @@ cmLocalUnixMakefileGenerator3 return; } - // Open the rule file for writing. This should be copy-if-different - // because the rules may depend on this file itself. - std::string ruleFileName = obj; - ruleFileName += ".depend.make"; - std::string ruleFileNameFull = this->ConvertToFullPath(ruleFileName); - cmGeneratedFileStream ruleFileStream(ruleFileNameFull.c_str()); - ruleFileStream.SetCopyIfDifferent(true); - if(!ruleFileStream) - { - return; - } - this->WriteDisclaimer(ruleFileStream); - ruleFileStream - << "# depend stage file for object file " << obj.c_str() << ".\n\n"; - // Create the list of dependencies known at cmake time. These are // shared between the object file and dependency scanning rule. depends.push_back(source.GetFullPath()); @@ -473,7 +459,6 @@ cmLocalUnixMakefileGenerator3 depends.push_back(i->c_str()); } } - this->AppendRuleDepend(depends, ruleFileNameFull.c_str()); // Write the dependency generation rule. std::string relativeObj = this->GetHomeRelativeOutputPath(); @@ -532,6 +517,12 @@ cmLocalUnixMakefileGenerator3 ruleFileStream << "# Rule file for object file " << obj.c_str() << ".\n\n"; + // generate the depend scanning rule + this->WriteObjectDependRules(ruleFileStream, obj, lang, source, + depends, depMakeFile); + + this->AppendRuleDepend(depends, ruleFileNameFull.c_str()); + // Include the dependencies for the target. std::string depPath = this->GetHomeRelativeOutputPath(); depPath += depMakeFile; @@ -543,7 +534,6 @@ cmLocalUnixMakefileGenerator3 << "\n\n"; // Write the build rule. - { // Build the set of compiler flags. std::string flags; @@ -621,11 +611,10 @@ cmLocalUnixMakefileGenerator3 // Write the rule. this->WriteMakeRule(ruleFileStream, 0, relativeObj.c_str(), depends, commands); - } // If the language needs provides-requires mode, create the // corresponding targets. - std::string objectRequires = obj; + std::string objectRequires = relativeObj; objectRequires += ".requires"; std::vector<std::string> no_commands; @@ -713,9 +702,6 @@ cmLocalUnixMakefileGenerator3 std::vector<std::string> depends; std::string depMakeFile; - // generate the depends rule file - this->WriteObjectDependFile(obj, lang, source, depends, depMakeFile); - // generate the build rule file this->WriteObjectBuildFile(obj, lang, target, source, depends, depMakeFile, provides_requires); @@ -1430,62 +1416,30 @@ cmLocalUnixMakefileGenerator3 void cmLocalUnixMakefileGenerator3 ::WriteTargetRequiresRule(std::ostream& ruleFileStream, const cmTarget& target, - const std::vector<std::string>& provides_requires) + const std::vector<std::string>& objects) { - // Create the driving make target. - std::string dir = m_Makefile->GetStartOutputDirectory(); - dir += "/"; - dir += this->GetTargetDirectory(target); - std::string targetRequires = dir; - targetRequires += "/requires"; - targetRequires = this->Convert(targetRequires.c_str(),HOME_OUTPUT,MAKEFILE); + std::vector<std::string> depends; + std::vector<std::string> no_commands; - std::string buildTarget = dir; - buildTarget += "/build"; - buildTarget = this->Convert(buildTarget.c_str(),HOME_OUTPUT,MAKEFILE); - - std::string comment = "Directory-level requires rule for this target."; - if(provides_requires.empty()) - { - // No provides-requires mode objects in this target. Anything - // that requires the target can build it directly. - std::vector<std::string> no_commands; - std::vector<std::string> depends; - depends.push_back(buildTarget); - this->WriteMakeRule(ruleFileStream, comment.c_str(), - targetRequires.c_str(), depends, no_commands); - } - else - { - // There are provides-requires mode objects in this target. Use - // provides-requires mode to build the target itself. - std::string targetProvides = dir; - targetProvides += "/provides"; - targetProvides = this->Convert(targetProvides.c_str(),HOME_OUTPUT,MAKEFILE); + // Construct the name of the dependency generation target. + std::string depTarget = this->GetRelativeTargetDirectory(target); + depTarget += "/requires"; + + // This target drives dependency generation for all object files. + std::string relPath = this->GetHomeRelativeOutputPath(); + std::string objTarget; + for(std::vector<std::string>::const_iterator obj = objects.begin(); + obj != objects.end(); ++obj) { - std::vector<std::string> no_commands; - std::vector<std::string> depends; - depends.push_back(buildTarget); - this->WriteMakeRule(ruleFileStream, 0, - targetProvides.c_str(), depends, no_commands); + objTarget = relPath; + objTarget += *obj; + objTarget += ".requires"; + depends.push_back(objTarget); } - { - // Build list of require-level dependencies. - std::vector<std::string> depends; - for(std::vector<std::string>::const_iterator - pr = provides_requires.begin(); - pr != provides_requires.end(); ++pr) - { - 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, comment.c_str(), - targetRequires.c_str(), depends, commands); - } - } + // Write the rule. + this->WriteMakeRule(ruleFileStream, 0, + depTarget.c_str(), depends, no_commands); } //---------------------------------------------------------------------------- @@ -1499,7 +1453,7 @@ cmLocalUnixMakefileGenerator3 const std::vector<std::string>& provides_requires) { // Write the dependency generation rule. - this->WriteTargetDependRule(ruleFileName, target, objects); + this->WriteTargetDependRule(ruleFileStream, target, objects); std::vector<std::string> commands; @@ -1666,7 +1620,7 @@ cmLocalUnixMakefileGenerator3 this->WriteTargetCleanRule(ruleFileName, target, cleanFiles, objects, external_objects); // Write the driving make target. - this->WriteTargetRequiresRule(ruleFileStream, target, provides_requires); + this->WriteTargetRequiresRule(ruleFileStream, target, objects); } //---------------------------------------------------------------------------- @@ -1772,7 +1726,7 @@ cmLocalUnixMakefileGenerator3 const std::vector<std::string>& provides_requires) { // Write the dependency generation rule. - this->WriteTargetDependRule(ruleFileName, target, objects); + this->WriteTargetDependRule(ruleFileStream, target, objects); // TODO: Merge the methods that call this method to avoid // code duplication. @@ -1991,7 +1945,7 @@ cmLocalUnixMakefileGenerator3 this->WriteTargetCleanRule(ruleFileName, target, cleanFiles, objects, external_objects); // Write the driving make target. - this->WriteTargetRequiresRule(ruleFileStream, target, provides_requires); + this->WriteTargetRequiresRule(ruleFileStream, target, objects); } //---------------------------------------------------------------------------- @@ -2048,25 +2002,10 @@ cmLocalUnixMakefileGenerator3 //---------------------------------------------------------------------------- void cmLocalUnixMakefileGenerator3 -::WriteTargetDependRule(const char* ruleFileName, +::WriteTargetDependRule(std::ostream& ruleFileStream, const cmTarget& target, const std::vector<std::string>& objects) { - std::string dir = cmSystemTools::GetFilenamePath(ruleFileName); - std::string dependFileName = dir; - dependFileName += "/depend.make"; - - // Open the rule file. This should be copy-if-different because the - // rules may depend on this file itself. - std::string ruleFileNameFull = this->ConvertToFullPath(dependFileName); - cmGeneratedFileStream ruleFileStream(ruleFileNameFull.c_str()); - ruleFileStream.SetCopyIfDifferent(true); - if(!ruleFileStream) - { - return; - } - this->WriteDisclaimer(ruleFileStream); - std::vector<std::string> depends; std::vector<std::string> no_commands; @@ -2089,25 +2028,6 @@ cmLocalUnixMakefileGenerator3 // Write the rule. this->WriteMakeRule(ruleFileStream, 0, depTarget.c_str(), depends, no_commands); - - // Include the rule file for each object. - if(!objects.empty()) - { - ruleFileStream - << "# Include depend rules for object files.\n"; - for(std::vector<std::string>::const_iterator obj = objects.begin(); - obj != objects.end(); ++obj) - { - objTarget = relPath; - objTarget += *obj; - objTarget += ".depend.make"; - ruleFileStream - << m_IncludeDirective << " " - << this->ConvertToOutputForExisting(objTarget.c_str()).c_str() - << "\n"; - } - ruleFileStream << "\n"; - } } //---------------------------------------------------------------------------- diff --git a/Source/cmLocalUnixMakefileGenerator3.h b/Source/cmLocalUnixMakefileGenerator3.h index 0302e64..e6ec5fc 100644 --- a/Source/cmLocalUnixMakefileGenerator3.h +++ b/Source/cmLocalUnixMakefileGenerator3.h @@ -194,12 +194,13 @@ protected: std::vector<std::string>& provides_requires); // write the depend.make file for an object - void WriteObjectDependFile(std::string& obj, - const char *lang, - const cmSourceFile& source, - std::vector<std::string>& depends, - std::string& depMarkFile); - + void WriteObjectDependRules(std::ostream& ruleFileStream, + std::string& obj, + const char *lang, + const cmSourceFile& source, + std::vector<std::string>& depends, + std::string& depMarkFile); + // this is used only by WriteObjectDependFile bool GenerateDependsMakeFile(const std::string& lang, const char* objFile, @@ -269,7 +270,7 @@ protected: const std::vector<std::string>& external_objects, std::string& variableName, std::string& variableNameExternal); - void WriteTargetDependRule(const char* ruleFileName, + void WriteTargetDependRule(std::ostream& ruleFileStream, const cmTarget& target, const std::vector<std::string>& objects); void WriteTargetCleanRule(const char *ruleFileName, @@ -279,7 +280,7 @@ protected: const std::vector<std::string>& external_objects); void WriteTargetRequiresRule(std::ostream& ruleFileStream, const cmTarget& target, - const std::vector<std::string>& provides_requires); + const std::vector<std::string>& objects); std::string GetTargetDirectory(const cmTarget& target); std::string GetSubdirTargetName(const char* pass, const char* subdir); |