|
|
@@ -754,30 +754,24 @@ cmMakefileTargetGenerator
|
|
|
compileCommands.begin(), compileCommands.end());
|
|
|
}
|
|
|
|
|
|
- // Write the rule.
|
|
|
- this->LocalGenerator->WriteMakeRule(*this->BuildFileStream, 0,
|
|
|
- relativeObj,
|
|
|
- depends, commands, false);
|
|
|
-
|
|
|
// Check for extra outputs created by the compilation.
|
|
|
+ std::vector<std::string> outputs(1, relativeObj);
|
|
|
if(const char* extra_outputs_str =
|
|
|
source.GetProperty("OBJECT_OUTPUTS"))
|
|
|
{
|
|
|
- std::vector<std::string> extra_outputs;
|
|
|
- cmSystemTools::ExpandListArgument(extra_outputs_str, extra_outputs);
|
|
|
- for(std::vector<std::string>::const_iterator eoi = extra_outputs.begin();
|
|
|
- eoi != extra_outputs.end(); ++eoi)
|
|
|
+ cmSystemTools::ExpandListArgument(extra_outputs_str, outputs);
|
|
|
+ for(std::vector<std::string>::const_iterator eoi = outputs.begin()+1;
|
|
|
+ eoi != outputs.end(); ++eoi)
|
|
|
{
|
|
|
- // Register this as an extra output for the object file rule.
|
|
|
- // This will cause the object file to be rebuilt if the extra
|
|
|
- // output is missing.
|
|
|
- this->GenerateExtraOutput(eoi->c_str(), relativeObj.c_str(), false);
|
|
|
-
|
|
|
// Register this as an extra file to clean.
|
|
|
this->CleanFiles.push_back(*eoi);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Write the rule.
|
|
|
+ this->LocalGenerator->WriteMakeRule(*this->BuildFileStream, 0,
|
|
|
+ outputs, depends, commands, false);
|
|
|
+
|
|
|
bool do_preprocess_rules = lang_has_preprocessor &&
|
|
|
this->LocalGenerator->GetCreatePreprocessedSourceRules();
|
|
|
bool do_assembly_rules = lang_has_assembly &&
|
|
|
@@ -1017,25 +1011,6 @@ void cmMakefileTargetGenerator::WriteTargetDependRules()
|
|
|
this->LocalGenerator->
|
|
|
WriteDependLanguageInfo(*this->InfoFileStream,*this->Target);
|
|
|
|
|
|
- // Store multiple output pairs in the depend info file.
|
|
|
- if(!this->MultipleOutputPairs.empty())
|
|
|
- {
|
|
|
- *this->InfoFileStream
|
|
|
- << "\n"
|
|
|
- << "# Pairs of files generated by the same build rule.\n"
|
|
|
- << "set(CMAKE_MULTIPLE_OUTPUT_PAIRS\n";
|
|
|
- for(MultipleOutputPairsType::const_iterator pi =
|
|
|
- this->MultipleOutputPairs.begin();
|
|
|
- pi != this->MultipleOutputPairs.end(); ++pi)
|
|
|
- {
|
|
|
- *this->InfoFileStream
|
|
|
- << " " << this->LocalGenerator->EscapeForCMake(pi->first)
|
|
|
- << " " << this->LocalGenerator->EscapeForCMake(pi->second)
|
|
|
- << "\n";
|
|
|
- }
|
|
|
- *this->InfoFileStream << " )\n\n";
|
|
|
- }
|
|
|
-
|
|
|
// Store list of targets linked directly or transitively.
|
|
|
{
|
|
|
*this->InfoFileStream
|
|
|
@@ -1273,7 +1248,7 @@ void cmMakefileTargetGenerator
|
|
|
}
|
|
|
}
|
|
|
this->LocalGenerator->WriteMakeRule(*this->BuildFileStream, 0,
|
|
|
- *o, depends, commands,
|
|
|
+ outputs, depends, commands,
|
|
|
symbolic);
|
|
|
|
|
|
// If the rule has changed make sure the output is rebuilt.
|
|
|
@@ -1283,21 +1258,6 @@ void cmMakefileTargetGenerator
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 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;
|
|
|
- if(need_symbolic)
|
|
|
- {
|
|
|
- if(cmSourceFile* sf = this->Makefile->GetSource(*o))
|
|
|
- {
|
|
|
- symbolic = sf->GetPropertyAsBool("SYMBOLIC");
|
|
|
- }
|
|
|
- }
|
|
|
- this->GenerateExtraOutput(o->c_str(), in, symbolic);
|
|
|
- }
|
|
|
-
|
|
|
// Setup implicit dependency scanning.
|
|
|
for(cmCustomCommand::ImplicitDependsList::const_iterator
|
|
|
idi = ccg.GetCC().GetImplicitDepends().begin();
|
|
|
@@ -1314,32 +1274,6 @@ void cmMakefileTargetGenerator
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-//----------------------------------------------------------------------------
|
|
|
-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->GetEmptyRuleHackCommand();
|
|
|
- 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->AddMultipleOutputPair(out, in);
|
|
|
-}
|
|
|
-
|
|
|
//----------------------------------------------------------------------------
|
|
|
void
|
|
|
cmMakefileTargetGenerator::AppendProgress(std::vector<std::string>& commands)
|
|
|
@@ -1767,15 +1701,6 @@ void cmMakefileTargetGenerator::RemoveForbiddenFlags(const char* flagVar,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-//----------------------------------------------------------------------------
|
|
|
-void
|
|
|
-cmMakefileTargetGenerator
|
|
|
-::AddMultipleOutputPair(const char* depender, const char* dependee)
|
|
|
-{
|
|
|
- MultipleOutputPairsType::value_type p(depender, dependee);
|
|
|
- this->MultipleOutputPairs.insert(p);
|
|
|
-}
|
|
|
-
|
|
|
//----------------------------------------------------------------------------
|
|
|
void
|
|
|
cmMakefileTargetGenerator
|