summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmMakefileLibraryTargetGenerator.cxx27
-rw-r--r--Source/cmMakefileTargetGenerator.cxx48
-rw-r--r--Source/cmMakefileTargetGenerator.h5
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);