summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Cole <david.cole@kitware.com>2012-07-09 18:23:47 (GMT)
committerCMake Topic Stage <kwrobot@kitware.com>2012-07-09 18:23:47 (GMT)
commitada7fe248a0b0c50a3487150cdfc2add6e8f8b22 (patch)
tree117bed70e907288dd331de73c5fdebef5401cb49
parentcdc00f0f7ef6c28540a1755573b477690501ee7f (diff)
parent6332ba5a58f0114d1763c263950eae20b09eaa4b (diff)
downloadCMake-ada7fe248a0b0c50a3487150cdfc2add6e8f8b22.zip
CMake-ada7fe248a0b0c50a3487150cdfc2add6e8f8b22.tar.gz
CMake-ada7fe248a0b0c50a3487150cdfc2add6e8f8b22.tar.bz2
Merge topic 'ninja-cmdLineLimit'
6332ba5 Ninja: also consider rule command length for rsp file 0c42faf Ninja: also consider variables when checking command line length
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx41
-rw-r--r--Source/cmGlobalNinjaGenerator.h5
-rw-r--r--Source/cmLocalNinjaGenerator.cxx2
-rw-r--r--Source/cmNinjaNormalTargetGenerator.cxx3
4 files changed, 30 insertions, 21 deletions
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index af61d95..6392ecd 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -160,34 +160,35 @@ void cmGlobalNinjaGenerator::WriteBuild(std::ostream& os,
arguments << "\n";
-
- cmOStringStream builds;
+ cmOStringStream build;
// Write outputs files.
- builds << "build";
+ build << "build";
for(cmNinjaDeps::const_iterator i = outputs.begin();
- i != outputs.end();
- ++i)
- builds << " " << EncodeIdent(EncodePath(*i), os);
- builds << ":";
-
+ i != outputs.end(); ++i)
+ build << " " << EncodeIdent(EncodePath(*i), os);
+ build << ":";
// Write the rule.
- builds << " " << rule;
+ build << " " << rule;
+
+ // Write the variables bound to this build statement.
+ cmOStringStream variable_assignments;
+ for(cmNinjaVars::const_iterator i = variables.begin();
+ i != variables.end(); ++i)
+ cmGlobalNinjaGenerator::WriteVariable(variable_assignments,
+ i->first, i->second, "", 1);
// check if a response file rule should be used
+ std::string buildstr = build.str();
+ const std::string assignments = variable_assignments.str();
const std::string args = arguments.str();
- if (cmdLineLimit > 0 &&
- (args.size() + + builds.str().size()) > (size_t)cmdLineLimit)
- builds << "_RSPFILE";
+ if (cmdLineLimit > 0
+ && args.size() + buildstr.size() + assignments.size()
+ > (size_t) cmdLineLimit)
+ buildstr += "_RSPFILE";
- os << builds.str() << args;
-
- // Write the variables bound to this build statement.
- for(cmNinjaVars::const_iterator i = variables.begin();
- i != variables.end();
- ++i)
- cmGlobalNinjaGenerator::WriteVariable(os, i->first, i->second, "", 1);
+ os << buildstr << args << assignments;
}
void cmGlobalNinjaGenerator::WritePhonyBuild(std::ostream& os,
@@ -556,6 +557,8 @@ void cmGlobalNinjaGenerator::AddRule(const std::string& name,
rspfile,
restat,
generator);
+
+ this->RuleCmdLength[name] = command.size();
}
bool cmGlobalNinjaGenerator::HasRule(const std::string &name)
diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h
index e939f61..e5f8099 100644
--- a/Source/cmGlobalNinjaGenerator.h
+++ b/Source/cmGlobalNinjaGenerator.h
@@ -319,6 +319,8 @@ private:
std::string ninjaCmd() const;
+ int GetRuleCmdLength(const std::string& name) { return RuleCmdLength[name]; }
+
private:
/// The file containing the build statement. (the relation ship of the
/// compilation DAG).
@@ -335,6 +337,9 @@ private:
/// The set of rules added to the generated build system.
RulesSetType Rules;
+ /// Length of rule command, used by rsp file evaluation
+ std::map<std::string, int> RuleCmdLength;
+
/// The set of dependencies to add to the "all" target.
cmNinjaDeps AllDependencies;
diff --git a/Source/cmLocalNinjaGenerator.cxx b/Source/cmLocalNinjaGenerator.cxx
index 9a496f2..ea9c406 100644
--- a/Source/cmLocalNinjaGenerator.cxx
+++ b/Source/cmLocalNinjaGenerator.cxx
@@ -272,7 +272,7 @@ std::string cmLocalNinjaGenerator::BuildCommandLine(
// don't use POST_BUILD.
if (cmdLines.empty())
#ifdef _WIN32
- return "cd.";
+ return "cd .";
#else
return ":";
#endif
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx
index 01e8e73..6befb05 100644
--- a/Source/cmNinjaNormalTargetGenerator.cxx
+++ b/Source/cmNinjaNormalTargetGenerator.cxx
@@ -480,7 +480,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
int cmdLineLimit;
#ifdef _WIN32
- cmdLineLimit = 8000;
+ cmdLineLimit = 8000 - this->GetGlobalGenerator()->
+ GetRuleCmdLength(this->LanguageLinkerRule());
#else
cmdLineLimit = -1; // TODO
#endif