diff options
-rw-r--r-- | Source/cmMakefileLibraryTargetGenerator.cxx | 27 | ||||
-rw-r--r-- | Source/cmMakefileTargetGenerator.cxx | 48 | ||||
-rw-r--r-- | Source/cmMakefileTargetGenerator.h | 5 |
3 files changed, 44 insertions, 36 deletions
diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index 67bc46e..7797c91 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx @@ -653,26 +653,19 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules targetFullPathReal.c_str(), depends, commands, false); - // The symlink names for the target should depend on the real target - // so if the target version changes it rebuilds and recreates the - // symlinks. - if(targetFullPathSO != targetFullPathReal) + // Some targets have more than one output file. Create rules to + // drive the build if any extra outputs are missing. + std::vector<std::string> extraOutputs; + if(targetNameSO != targetNameReal) { - depends.clear(); - commands.clear(); - depends.push_back(targetFullPathReal.c_str()); - this->LocalGenerator->WriteMakeRule(*this->BuildFileStream, 0, - targetFullPathSO.c_str(), - depends, commands, false); + this->GenerateExtraOutput(targetFullPathSO.c_str(), + targetFullPathReal.c_str()); } - if(targetFullPath != targetFullPathSO) + if(targetName != targetNameSO && + targetName != targetNameReal) { - depends.clear(); - commands.clear(); - depends.push_back(targetFullPathSO.c_str()); - this->LocalGenerator->WriteMakeRule(*this->BuildFileStream, 0, - targetFullPath.c_str(), - depends, commands, false); + this->GenerateExtraOutput(targetFullPath.c_str(), + targetFullPathReal.c_str()); } // Write the main driver rule to build everything in this target. diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index 8adcc9b..1f6fe63 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -903,20 +903,8 @@ void cmMakefileTargetGenerator symbolic); } - // If the rule has multiple outputs, add a rule for the extra - // outputs to just depend on the first output with no command. Also - // register the extra outputs as paired with the first output so - // that the check-build-system step will remove the primary output - // if any extra outputs are missing, forcing the rule to regenerate - // all outputs. - depends.clear(); - depends.push_back(*o); - commands.clear(); - std::string emptyCommand = this->GlobalGenerator->GetEmptyCommandHack(); - if(!emptyCommand.empty()) - { - commands.push_back(emptyCommand); - } + // Write rules to drive building any outputs beyond the first. + const char* in = o->c_str(); for(++o; o != outputs.end(); ++o) { bool symbolic = false; @@ -927,12 +915,34 @@ void cmMakefileTargetGenerator symbolic = sf->GetPropertyAsBool("SYMBOLIC"); } } - this->LocalGenerator->WriteMakeRule(*this->BuildFileStream, 0, - o->c_str(), depends, commands, - symbolic); - this->GlobalGenerator->AddMultipleOutputPair(o->c_str(), - depends[0].c_str()); + this->GenerateExtraOutput(o->c_str(), in, symbolic); + } +} + +//---------------------------------------------------------------------------- +void +cmMakefileTargetGenerator +::GenerateExtraOutput(const char* out, const char* in, bool symbolic) +{ + // Add a rule to build the primary output if the extra output needs + // to be created. + std::vector<std::string> commands; + std::vector<std::string> depends; + std::string emptyCommand = this->GlobalGenerator->GetEmptyCommandHack(); + if(!emptyCommand.empty()) + { + commands.push_back(emptyCommand); } + depends.push_back(in); + this->LocalGenerator->WriteMakeRule(*this->BuildFileStream, 0, + out, depends, commands, + symbolic); + + // Register the extra output as paired with the first output so that + // the check-build-system step will remove the primary output if any + // extra outputs are missing. This forces the rule to regenerate + // all outputs. + this->GlobalGenerator->AddMultipleOutputPair(out, in); } //---------------------------------------------------------------------------- diff --git a/Source/cmMakefileTargetGenerator.h b/Source/cmMakefileTargetGenerator.h index 308a64d..e81e72a 100644 --- a/Source/cmMakefileTargetGenerator.h +++ b/Source/cmMakefileTargetGenerator.h @@ -99,6 +99,11 @@ protected: // write the build rule for a custom command void GenerateCustomRuleFile(const cmCustomCommand& cc); + // write a rule to drive building of more than one output from + // another rule + void GenerateExtraOutput(const char* out, const char* in, + bool symbolic = false); + // write out the variable that lists the objects for this target void WriteObjectsVariable(std::string& variableName, std::string& variableNameExternal); |