diff options
author | Peter Kümmel <syntheticpp@gmx.net> | 2012-07-10 07:56:11 (GMT) |
---|---|---|
committer | Peter Kümmel <syntheticpp@gmx.net> | 2012-07-10 08:53:24 (GMT) |
commit | 7f647cf5ebf0b45663cdabe4fd137b87753b857c (patch) | |
tree | 2cee1cc242bf2e7b3836d5d4b540829821dc8721 | |
parent | 6274ca6f910683495124d22e371a1adc9cf0eebc (diff) | |
download | CMake-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.
-rw-r--r-- | Source/cmGlobalNinjaGenerator.cxx | 10 | ||||
-rw-r--r-- | Source/cmGlobalNinjaGenerator.h | 4 | ||||
-rw-r--r-- | Source/cmNinjaNormalTargetGenerator.cxx | 27 |
3 files changed, 28 insertions, 13 deletions
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 9829d19..2bb409c 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -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, diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h index e5f8099..9431c57 100644 --- a/Source/cmGlobalNinjaGenerator.h +++ b/Source/cmGlobalNinjaGenerator.h @@ -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); 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) { |