Ninja: Use a TARGET_FILE variable to hold the link output file
Use an explicit "$TARGET_FILE" variable instead of "$out" so that we can have multiple output files while still only referencing the main one in command lines.
This commit is contained in:
parent
592644c42c
commit
ef42e57d47
|
@ -194,12 +194,7 @@ cmNinjaNormalTargetGenerator
|
||||||
|
|
||||||
vars.ObjectDir = "$OBJECT_DIR";
|
vars.ObjectDir = "$OBJECT_DIR";
|
||||||
|
|
||||||
// TODO:
|
vars.Target = "$TARGET_FILE";
|
||||||
// Makefile generator expands <TARGET> to the plain target name
|
|
||||||
// with suffix. $out expands to a relative path. This difference
|
|
||||||
// could make trouble when switching to Ninja generator. Maybe
|
|
||||||
// using TARGET_NAME and RuleVariables::TargetName is a fix.
|
|
||||||
vars.Target = "$out";
|
|
||||||
|
|
||||||
vars.SONameFlag = "$SONAME_FLAG";
|
vars.SONameFlag = "$SONAME_FLAG";
|
||||||
vars.TargetSOName = "$SONAME";
|
vars.TargetSOName = "$SONAME";
|
||||||
|
@ -252,7 +247,7 @@ cmNinjaNormalTargetGenerator
|
||||||
<< this->GetVisibleTypeName() << ".";
|
<< this->GetVisibleTypeName() << ".";
|
||||||
cmOStringStream description;
|
cmOStringStream description;
|
||||||
description << "Linking " << this->TargetLinkLanguage << " "
|
description << "Linking " << this->TargetLinkLanguage << " "
|
||||||
<< this->GetVisibleTypeName() << " $out";
|
<< this->GetVisibleTypeName() << " $TARGET_FILE";
|
||||||
this->GetGlobalGenerator()->AddRule(ruleName,
|
this->GetGlobalGenerator()->AddRule(ruleName,
|
||||||
linkCmd,
|
linkCmd,
|
||||||
description.str(),
|
description.str(),
|
||||||
|
@ -326,7 +321,7 @@ cmNinjaNormalTargetGenerator
|
||||||
this->GetLocalGenerator()->ConvertToOutputFormat(
|
this->GetLocalGenerator()->ConvertToOutputFormat(
|
||||||
mf->GetRequiredDefinition("CMAKE_COMMAND"),
|
mf->GetRequiredDefinition("CMAKE_COMMAND"),
|
||||||
cmLocalGenerator::SHELL);
|
cmLocalGenerator::SHELL);
|
||||||
linkCmds.push_back(cmakeCommand + " -E remove $out");
|
linkCmds.push_back(cmakeCommand + " -E remove $TARGET_FILE");
|
||||||
}
|
}
|
||||||
// TODO: Use ARCHIVE_APPEND for archives over a certain size.
|
// TODO: Use ARCHIVE_APPEND for archives over a certain size.
|
||||||
{
|
{
|
||||||
|
@ -450,6 +445,10 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
|
||||||
this->GetConfigName());
|
this->GetConfigName());
|
||||||
bool useWatcomQuote = mf->IsOn(createRule+"_USE_WATCOM_QUOTE");
|
bool useWatcomQuote = mf->IsOn(createRule+"_USE_WATCOM_QUOTE");
|
||||||
cmLocalNinjaGenerator& localGen = *this->GetLocalGenerator();
|
cmLocalNinjaGenerator& localGen = *this->GetLocalGenerator();
|
||||||
|
|
||||||
|
vars["TARGET_FILE"] =
|
||||||
|
localGen.ConvertToOutputFormat(targetOutputReal, cmLocalGenerator::SHELL);
|
||||||
|
|
||||||
localGen.GetTargetFlags(vars["LINK_LIBRARIES"],
|
localGen.GetTargetFlags(vars["LINK_LIBRARIES"],
|
||||||
vars["FLAGS"],
|
vars["FLAGS"],
|
||||||
vars["LINK_FLAGS"],
|
vars["LINK_FLAGS"],
|
||||||
|
@ -509,6 +508,10 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
|
||||||
cmLocalGenerator::SHELL);
|
cmLocalGenerator::SHELL);
|
||||||
vars["TARGET_IMPLIB"] = impLibPath;
|
vars["TARGET_IMPLIB"] = impLibPath;
|
||||||
EnsureParentDirectoryExists(impLibPath);
|
EnsureParentDirectoryExists(impLibPath);
|
||||||
|
if(target.HasImportLibrary())
|
||||||
|
{
|
||||||
|
outputs.push_back(targetOutputImplib);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this->SetMsvcTargetPdbVariable(vars))
|
if (!this->SetMsvcTargetPdbVariable(vars))
|
||||||
|
@ -659,16 +662,6 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this->TargetNameImport.empty())
|
|
||||||
{
|
|
||||||
// Since using multiple outputs would mess up the $out variable, use an
|
|
||||||
// alias for the import library.
|
|
||||||
globalGen.WritePhonyBuild(this->GetBuildFileStream(),
|
|
||||||
"Alias for import library.",
|
|
||||||
cmNinjaDeps(1, targetOutputImplib),
|
|
||||||
cmNinjaDeps(1, targetOutputReal));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add aliases for the file name and the target name.
|
// Add aliases for the file name and the target name.
|
||||||
globalGen.AddTargetAlias(this->TargetNameOut, &target);
|
globalGen.AddTargetAlias(this->TargetNameOut, &target);
|
||||||
globalGen.AddTargetAlias(this->GetTargetName(), &target);
|
globalGen.AddTargetAlias(this->GetTargetName(), &target);
|
||||||
|
|
Loading…
Reference in New Issue