Ninja: also write link libraries to rsp file

and enable rspfile support on Linux, needed for commands longer than e.g. 2096152 characters on Ubuntu.
This commit is contained in:
Peter Kümmel 2012-07-10 09:56:11 +02:00
parent 6274ca6f91
commit 7f647cf5eb
3 changed files with 28 additions and 13 deletions

View File

@ -217,6 +217,7 @@ void cmGlobalNinjaGenerator::AddCustomCommandRule()
"Rule for running custom commands.",
/*depfile*/ "",
/*rspfile*/ "",
/*rspcontent*/ "",
/*restat*/ true);
}
@ -258,6 +259,7 @@ void cmGlobalNinjaGenerator::WriteRule(std::ostream& os,
const std::string& comment,
const std::string& depfile,
const std::string& rspfile,
const std::string& rspcontent,
bool restat,
bool generator)
{
@ -307,7 +309,8 @@ void cmGlobalNinjaGenerator::WriteRule(std::ostream& os,
cmGlobalNinjaGenerator::Indent(os, 1);
os << "rspfile = " << rspfile << "\n";
cmGlobalNinjaGenerator::Indent(os, 1);
os << "rspfile_content = $in" << "\n";
os << "rspfile_content = " <<
(rspcontent.empty() ? "$in" :rspcontent) << "\n";
}
if(restat)
@ -538,6 +541,7 @@ void cmGlobalNinjaGenerator::AddRule(const std::string& name,
const std::string& comment,
const std::string& depfile,
const std::string& rspfile,
const std::string& rspcontent,
bool restat,
bool generator)
{
@ -555,6 +559,7 @@ void cmGlobalNinjaGenerator::AddRule(const std::string& name,
comment,
depfile,
rspfile,
rspcontent,
restat,
generator);
@ -911,6 +916,7 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
"Rule for re-running cmake.",
/*depfile=*/ "",
/*rspfile=*/ "",
/*rspcontent*/ "",
/*restat=*/ false,
/*generator=*/ true);
@ -960,6 +966,7 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
"Rule for cleaning all built files.",
/*depfile=*/ "",
/*rspfile=*/ "",
/*rspcontent*/ "",
/*restat=*/ false,
/*generator=*/ false);
WriteBuild(os,
@ -981,6 +988,7 @@ void cmGlobalNinjaGenerator::WriteTargetHelp(std::ostream& os)
"Rule for printing all primary targets available.",
/*depfile=*/ "",
/*rspfile=*/ "",
/*rspcontent*/ "",
/*restat=*/ false,
/*generator=*/ false);
WriteBuild(os,

View File

@ -116,7 +116,8 @@ public:
const std::string& description,
const std::string& comment = "",
const std::string& depfile = "",
const std::string& rspfile = "" ,
const std::string& rspfile = "",
const std::string& rspcontent = "",
bool restat = false,
bool generator = false);
@ -234,6 +235,7 @@ public:
const std::string& comment = "",
const std::string& depfile = "",
const std::string& rspfile = "",
const std::string& rspcontent = "",
bool restat = false,
bool generator = false);

View File

@ -75,10 +75,8 @@ void cmNinjaNormalTargetGenerator::Generate()
}
else
{
this->WriteLinkRule(false);
#ifdef _WIN32 // TODO response file support only Linux
this->WriteLinkRule(true);
#endif
this->WriteLinkRule(false); // write rule without rspfile support
this->WriteLinkRule(true); // write rule with rspfile support
this->WriteLinkStatement();
}
}
@ -140,6 +138,7 @@ cmNinjaNormalTargetGenerator
// Select whether to use a response file for objects.
std::string rspfile;
std::string rspcontent;
if (!this->GetGlobalGenerator()->HasRule(ruleName)) {
cmLocalGenerator::RuleVariables vars;
@ -150,6 +149,7 @@ cmNinjaNormalTargetGenerator
std::string responseFlag;
if (!useResponseFile) {
vars.Objects = "$in";
vars.LinkLibraries = "$LINK_LIBRARIES";
} else {
// handle response file
std::string cmakeLinkVar = std::string("CMAKE_") +
@ -162,7 +162,9 @@ cmNinjaNormalTargetGenerator
}
rspfile = "$out.rsp";
responseFlag += rspfile;
rspcontent = "$in $LINK_LIBRARIES";
vars.Objects = responseFlag.c_str();
vars.LinkLibraries = "";
}
vars.ObjectDir = "$OBJECT_DIR";
@ -189,7 +191,6 @@ cmNinjaNormalTargetGenerator
vars.TargetVersionMajor = targetVersionMajor.c_str();
vars.TargetVersionMinor = targetVersionMinor.c_str();
vars.LinkLibraries = "$LINK_LIBRARIES";
vars.Flags = "$FLAGS";
vars.LinkFlags = "$LINK_FLAGS";
@ -227,7 +228,8 @@ cmNinjaNormalTargetGenerator
description.str(),
comment.str(),
/*depfile*/ "",
rspfile);
rspfile,
rspcontent);
}
if (this->TargetNameOut != this->TargetNameReal) {
@ -478,12 +480,15 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
symlinkVars["POST_BUILD"] = postBuildCmdLine;
}
int cmdLineLimit;
#ifdef _WIN32
cmdLineLimit = 8000 - this->GetGlobalGenerator()->
int linkRuleLength = this->GetGlobalGenerator()->
GetRuleCmdLength(this->LanguageLinkerRule());
#ifdef _WIN32
int commandLineLengthLimit = 8000 - linkRuleLength;
#elif __linux
// for instance ARG_MAX is 2096152 on Ubuntu
int commandLineLengthLimit = sysconf(_SC_ARG_MAX) - linkRuleLength - 1000;
#else
cmdLineLimit = -1; // TODO
int commandLineLengthLimit = -1;
#endif
// Write the build statement for this target.
@ -495,7 +500,7 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
implicitDeps,
emptyDeps,
vars,
cmdLineLimit);
commandLineLengthLimit);
if (targetOutput != targetOutputReal) {
if (targetType == cmTarget::EXECUTABLE) {