summaryrefslogtreecommitdiffstats
path: root/Source/cmNinjaNormalTargetGenerator.cxx
diff options
context:
space:
mode:
authorPeter Kümmel <syntheticpp@gmx.net>2012-07-10 07:56:11 (GMT)
committerPeter Kümmel <syntheticpp@gmx.net>2012-07-10 08:53:24 (GMT)
commit7f647cf5ebf0b45663cdabe4fd137b87753b857c (patch)
tree2cee1cc242bf2e7b3836d5d4b540829821dc8721 /Source/cmNinjaNormalTargetGenerator.cxx
parent6274ca6f910683495124d22e371a1adc9cf0eebc (diff)
downloadCMake-7f647cf5ebf0b45663cdabe4fd137b87753b857c.zip
CMake-7f647cf5ebf0b45663cdabe4fd137b87753b857c.tar.gz
CMake-7f647cf5ebf0b45663cdabe4fd137b87753b857c.tar.bz2
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.
Diffstat (limited to 'Source/cmNinjaNormalTargetGenerator.cxx')
-rw-r--r--Source/cmNinjaNormalTargetGenerator.cxx27
1 files changed, 16 insertions, 11 deletions
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx
index 0cf90aa..1fd6a16 100644
--- a/Source/cmNinjaNormalTargetGenerator.cxx
+++ b/Source/cmNinjaNormalTargetGenerator.cxx
@@ -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) {