mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00
Merge topic 'ninja-multi-long-command-line-config'
ad08f93ee4
Ninja Multi-Config: Split long command lines by config
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !6067
This commit is contained in:
@@ -410,7 +410,8 @@ void cmLocalNinjaGenerator::AppendCustomCommandDeps(
|
||||
}
|
||||
|
||||
std::string cmLocalNinjaGenerator::WriteCommandScript(
|
||||
std::vector<std::string> const& cmdLines, std::string const& customStep,
|
||||
std::vector<std::string> const& cmdLines, std::string const& outputConfig,
|
||||
std::string const& commandConfig, std::string const& customStep,
|
||||
cmGeneratorTarget const* target) const
|
||||
{
|
||||
std::string scriptPath;
|
||||
@@ -419,9 +420,13 @@ std::string cmLocalNinjaGenerator::WriteCommandScript(
|
||||
} else {
|
||||
scriptPath = cmStrCat(this->GetCurrentBinaryDirectory(), "/CMakeFiles");
|
||||
}
|
||||
scriptPath += this->GetGlobalNinjaGenerator()->ConfigDirectory(outputConfig);
|
||||
cmSystemTools::MakeDirectory(scriptPath);
|
||||
scriptPath += '/';
|
||||
scriptPath += customStep;
|
||||
if (this->GlobalGenerator->IsMultiConfig()) {
|
||||
scriptPath += cmStrCat('-', commandConfig);
|
||||
}
|
||||
#ifdef _WIN32
|
||||
scriptPath += ".bat";
|
||||
#else
|
||||
@@ -464,7 +469,8 @@ std::string cmLocalNinjaGenerator::WriteCommandScript(
|
||||
}
|
||||
|
||||
std::string cmLocalNinjaGenerator::BuildCommandLine(
|
||||
std::vector<std::string> const& cmdLines, std::string const& customStep,
|
||||
std::vector<std::string> const& cmdLines, std::string const& outputConfig,
|
||||
std::string const& commandConfig, std::string const& customStep,
|
||||
cmGeneratorTarget const* target) const
|
||||
{
|
||||
// If we have no commands but we need to build a command anyway, use noop.
|
||||
@@ -483,8 +489,8 @@ std::string cmLocalNinjaGenerator::BuildCommandLine(
|
||||
cmdLinesTotal += cmd.length() + 6;
|
||||
}
|
||||
if (cmdLinesTotal > cmSystemTools::CalculateCommandLineLengthLimit() / 2) {
|
||||
std::string const scriptPath =
|
||||
this->WriteCommandScript(cmdLines, customStep, target);
|
||||
std::string const scriptPath = this->WriteCommandScript(
|
||||
cmdLines, outputConfig, commandConfig, customStep, target);
|
||||
std::string cmd
|
||||
#ifndef _WIN32
|
||||
= "/bin/sh "
|
||||
@@ -697,7 +703,8 @@ void cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
|
||||
}
|
||||
|
||||
gg->WriteCustomCommandBuild(
|
||||
this->BuildCommandLine(cmdLines, customStep),
|
||||
this->BuildCommandLine(cmdLines, ccg.GetOutputConfig(), fileConfig,
|
||||
customStep),
|
||||
this->ConstructComment(ccg), "Custom command for " + ninjaOutputs[0],
|
||||
depfile, cc->GetJobPool(), cc->GetUsesTerminal(),
|
||||
/*restat*/ !symbolic || !byproducts.empty(), ninjaOutputs, fileConfig,
|
||||
|
@@ -61,7 +61,8 @@ public:
|
||||
}
|
||||
|
||||
std::string BuildCommandLine(
|
||||
std::vector<std::string> const& cmdLines,
|
||||
std::vector<std::string> const& cmdLines, std::string const& outputConfig,
|
||||
std::string const& commandConfig,
|
||||
std::string const& customStep = std::string(),
|
||||
cmGeneratorTarget const* target = nullptr) const;
|
||||
|
||||
@@ -119,6 +120,8 @@ private:
|
||||
std::string MakeCustomLauncher(cmCustomCommandGenerator const& ccg);
|
||||
|
||||
std::string WriteCommandScript(std::vector<std::string> const& cmdLines,
|
||||
std::string const& outputConfig,
|
||||
std::string const& commandConfig,
|
||||
std::string const& customStep,
|
||||
cmGeneratorTarget const* target) const;
|
||||
|
||||
|
@@ -287,7 +287,8 @@ void cmNinjaNormalTargetGenerator::WriteNvidiaDeviceLinkRule(
|
||||
// If there is no ranlib the command will be ":". Skip it.
|
||||
cm::erase_if(linkCmds, cmNinjaRemoveNoOpCommands());
|
||||
|
||||
rule.Command = this->GetLocalGenerator()->BuildCommandLine(linkCmds);
|
||||
rule.Command =
|
||||
this->GetLocalGenerator()->BuildCommandLine(linkCmds, config, config);
|
||||
|
||||
// Write the linker rule with response file if needed.
|
||||
rule.Comment =
|
||||
@@ -310,7 +311,8 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkRules(
|
||||
cmNinjaRule rule(this->LanguageLinkerCudaDeviceRule(config));
|
||||
rule.Command = this->GetLocalGenerator()->BuildCommandLine(
|
||||
{ cmStrCat(mf->GetRequiredDefinition("CMAKE_CUDA_DEVICE_LINKER"),
|
||||
" -arch=$ARCH $REGISTER -o=$out $in") });
|
||||
" -arch=$ARCH $REGISTER -o=$out $in") },
|
||||
config, config);
|
||||
rule.Comment = "Rule for CUDA device linking.";
|
||||
rule.Description = "Linking CUDA $out";
|
||||
this->GetGlobalGenerator()->AddRule(rule);
|
||||
@@ -336,7 +338,8 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkRules(
|
||||
compileCmd, vars);
|
||||
|
||||
rule.Name = this->LanguageLinkerCudaDeviceCompileRule(config);
|
||||
rule.Command = this->GetLocalGenerator()->BuildCommandLine({ compileCmd });
|
||||
rule.Command = this->GetLocalGenerator()->BuildCommandLine({ compileCmd },
|
||||
config, config);
|
||||
rule.Comment = "Rule for compiling CUDA device stubs.";
|
||||
rule.Description = "Compiling CUDA device stub $out";
|
||||
this->GetGlobalGenerator()->AddRule(rule);
|
||||
@@ -345,7 +348,8 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkRules(
|
||||
rule.Command = this->GetLocalGenerator()->BuildCommandLine(
|
||||
{ cmStrCat(mf->GetRequiredDefinition("CMAKE_CUDA_FATBINARY"),
|
||||
" -64 -cmdline=--compile-only -compress-all -link "
|
||||
"--embedded-fatbin=$out $PROFILES") });
|
||||
"--embedded-fatbin=$out $PROFILES") },
|
||||
config, config);
|
||||
rule.Comment = "Rule for CUDA fatbinaries.";
|
||||
rule.Description = "Creating fatbinary $out";
|
||||
this->GetGlobalGenerator()->AddRule(rule);
|
||||
@@ -475,7 +479,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile,
|
||||
|
||||
linkCmds.insert(linkCmds.begin(), "$PRE_LINK");
|
||||
linkCmds.emplace_back("$POST_BUILD");
|
||||
rule.Command = this->GetLocalGenerator()->BuildCommandLine(linkCmds);
|
||||
rule.Command =
|
||||
this->GetLocalGenerator()->BuildCommandLine(linkCmds, config, config);
|
||||
|
||||
// Write the linker rule with response file if needed.
|
||||
rule.Comment =
|
||||
@@ -500,7 +505,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile,
|
||||
std::vector<std::string> cmd;
|
||||
cmd.push_back(cmakeCommand + " -E cmake_symlink_executable $in $out");
|
||||
cmd.emplace_back("$POST_BUILD");
|
||||
rule.Command = this->GetLocalGenerator()->BuildCommandLine(cmd);
|
||||
rule.Command =
|
||||
this->GetLocalGenerator()->BuildCommandLine(cmd, config, config);
|
||||
}
|
||||
rule.Description = "Creating executable symlink $out";
|
||||
rule.Comment = "Rule for creating executable symlink.";
|
||||
@@ -512,7 +518,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile,
|
||||
cmd.push_back(cmakeCommand +
|
||||
" -E cmake_symlink_library $in $SONAME $out");
|
||||
cmd.emplace_back("$POST_BUILD");
|
||||
rule.Command = this->GetLocalGenerator()->BuildCommandLine(cmd);
|
||||
rule.Command =
|
||||
this->GetLocalGenerator()->BuildCommandLine(cmd, config, config);
|
||||
}
|
||||
rule.Description = "Creating library symlink $out";
|
||||
rule.Comment = "Rule for creating library symlink.";
|
||||
@@ -1312,10 +1319,11 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
|
||||
preLinkCmdLines.push_back("cd " + homeOutDir);
|
||||
}
|
||||
|
||||
vars["PRE_LINK"] = localGen.BuildCommandLine(preLinkCmdLines, "pre-link",
|
||||
this->GeneratorTarget);
|
||||
std::string postBuildCmdLine = localGen.BuildCommandLine(
|
||||
postBuildCmdLines, "post-build", this->GeneratorTarget);
|
||||
vars["PRE_LINK"] = localGen.BuildCommandLine(
|
||||
preLinkCmdLines, config, fileConfig, "pre-link", this->GeneratorTarget);
|
||||
std::string postBuildCmdLine =
|
||||
localGen.BuildCommandLine(postBuildCmdLines, config, fileConfig,
|
||||
"post-build", this->GeneratorTarget);
|
||||
|
||||
cmNinjaVars symlinkVars;
|
||||
bool const symlinkNeeded =
|
||||
|
@@ -539,7 +539,8 @@ cmNinjaRule GetScanRule(
|
||||
cmRulePlaceholderExpander::RuleVariables const& vars,
|
||||
const std::string& responseFlag, const std::string& flags,
|
||||
cmRulePlaceholderExpander* const rulePlaceholderExpander,
|
||||
cmLocalNinjaGenerator* generator, std::vector<std::string> scanCmds)
|
||||
cmLocalNinjaGenerator* generator, std::vector<std::string> scanCmds,
|
||||
const std::string& outputConfig)
|
||||
{
|
||||
cmNinjaRule rule(ruleName);
|
||||
// Scanning always uses a depfile for preprocessor dependencies.
|
||||
@@ -580,7 +581,8 @@ cmNinjaRule GetScanRule(
|
||||
for (std::string& scanCmd : scanCmds) {
|
||||
rulePlaceholderExpander->ExpandRuleVariables(generator, scanCmd, scanVars);
|
||||
}
|
||||
rule.Command = generator->BuildCommandLine(scanCmds);
|
||||
rule.Command =
|
||||
generator->BuildCommandLine(scanCmds, outputConfig, outputConfig);
|
||||
|
||||
return rule;
|
||||
}
|
||||
@@ -672,7 +674,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
|
||||
|
||||
auto scanRule = GetScanRule(
|
||||
scanRuleName, vars, responseFlag, flags, rulePlaceholderExpander.get(),
|
||||
this->GetLocalGenerator(), std::move(scanCommands));
|
||||
this->GetLocalGenerator(), std::move(scanCommands), config);
|
||||
|
||||
scanRule.Comment =
|
||||
cmStrCat("Rule for generating ", lang, " dependencies.");
|
||||
@@ -702,7 +704,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
|
||||
|
||||
auto scanRule = GetScanRule(
|
||||
scanRuleName, vars, "", flags, rulePlaceholderExpander.get(),
|
||||
this->GetLocalGenerator(), std::move(scanCommands));
|
||||
this->GetLocalGenerator(), std::move(scanCommands), config);
|
||||
|
||||
// Write the rule for generating dependencies for the given language.
|
||||
scanRule.Comment = cmStrCat("Rule for generating ", lang,
|
||||
@@ -734,7 +736,8 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
|
||||
ddModmapArg, " --dd=$out @", rule.RspFile);
|
||||
ddCmds.emplace_back(std::move(ccmd));
|
||||
}
|
||||
rule.Command = this->GetLocalGenerator()->BuildCommandLine(ddCmds);
|
||||
rule.Command =
|
||||
this->GetLocalGenerator()->BuildCommandLine(ddCmds, config, config);
|
||||
}
|
||||
rule.Comment =
|
||||
cmStrCat("Rule to generate ninja dyndep files for ", lang, '.');
|
||||
@@ -930,7 +933,8 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
|
||||
vars);
|
||||
}
|
||||
|
||||
rule.Command = this->GetLocalGenerator()->BuildCommandLine(compileCmds);
|
||||
rule.Command =
|
||||
this->GetLocalGenerator()->BuildCommandLine(compileCmds, config, config);
|
||||
|
||||
// Write the rule for compiling file of the given language.
|
||||
rule.Comment = cmStrCat("Rule for compiling ", lang, " files.");
|
||||
@@ -1248,7 +1252,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
|
||||
|
||||
this->ExportObjectCompileCommand(
|
||||
language, sourceFileName, objectDir, objectFileName, objectFileDir,
|
||||
vars["FLAGS"], vars["DEFINES"], vars["INCLUDES"]);
|
||||
vars["FLAGS"], vars["DEFINES"], vars["INCLUDES"], config);
|
||||
|
||||
objBuild.Outputs.push_back(objectFileName);
|
||||
if (firstForConfig) {
|
||||
@@ -1619,7 +1623,8 @@ void cmNinjaTargetGenerator::ExportObjectCompileCommand(
|
||||
std::string const& language, std::string const& sourceFileName,
|
||||
std::string const& objectDir, std::string const& objectFileName,
|
||||
std::string const& objectFileDir, std::string const& flags,
|
||||
std::string const& defines, std::string const& includes)
|
||||
std::string const& defines, std::string const& includes,
|
||||
std::string const& outputConfig)
|
||||
{
|
||||
if (!this->GeneratorTarget->GetPropertyAsBool("EXPORT_COMPILE_COMMANDS")) {
|
||||
return;
|
||||
@@ -1681,8 +1686,8 @@ void cmNinjaTargetGenerator::ExportObjectCompileCommand(
|
||||
compileObjectVars);
|
||||
}
|
||||
|
||||
std::string cmdLine =
|
||||
this->GetLocalGenerator()->BuildCommandLine(compileCmds);
|
||||
std::string cmdLine = this->GetLocalGenerator()->BuildCommandLine(
|
||||
compileCmds, outputConfig, outputConfig);
|
||||
|
||||
this->GetGlobalGenerator()->AddCXXCompileCommand(cmdLine, sourceFileName);
|
||||
}
|
||||
|
@@ -162,7 +162,8 @@ protected:
|
||||
std::string const& language, std::string const& sourceFileName,
|
||||
std::string const& objectDir, std::string const& objectFileName,
|
||||
std::string const& objectFileDir, std::string const& flags,
|
||||
std::string const& defines, std::string const& includes);
|
||||
std::string const& defines, std::string const& includes,
|
||||
std::string const& outputConfig);
|
||||
|
||||
void AdditionalCleanFiles(const std::string& config);
|
||||
|
||||
|
@@ -139,8 +139,8 @@ void cmNinjaUtilityTargetGenerator::WriteUtilBuildStatements(
|
||||
gg->WriteBuild(this->GetCommonFileStream(), phonyBuild);
|
||||
}
|
||||
} else {
|
||||
std::string command =
|
||||
lg->BuildCommandLine(commands, "utility", this->GeneratorTarget);
|
||||
std::string command = lg->BuildCommandLine(
|
||||
commands, config, fileConfig, "utility", this->GeneratorTarget);
|
||||
std::string desc;
|
||||
cmProp echoStr = genTarget->GetProperty("EchoString");
|
||||
if (echoStr) {
|
||||
|
@@ -0,0 +1,2 @@
|
||||
|
||||
Post-build Debug Release \.*$
|
@@ -14,3 +14,10 @@ add_custom_target(
|
||||
ALL
|
||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/gen.txt"
|
||||
)
|
||||
|
||||
add_executable(exe main.c)
|
||||
|
||||
add_custom_command(
|
||||
TARGET exe POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E echo "Post-build $<CONFIG> $<COMMAND_CONFIG:$<CONFIG>> ${very_long}"
|
||||
)
|
||||
|
@@ -198,8 +198,11 @@ run_cmake_build(PostBuild release Release Exe)
|
||||
run_cmake_build(PostBuild debug-in-release-graph Release Exe:Debug)
|
||||
|
||||
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/LongCommandLine-build)
|
||||
set(RunCMake_TEST_OPTIONS "-DCMAKE_CROSS_CONFIGS=all")
|
||||
run_cmake_configure(LongCommandLine)
|
||||
unset(RunCMake_TEST_OPTIONS)
|
||||
run_cmake_build(LongCommandLine release Release custom)
|
||||
run_cmake_build(LongCommandLine release-config Release exe:Debug)
|
||||
|
||||
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Framework-build)
|
||||
set(RunCMake_TEST_OPTIONS "-DCMAKE_CROSS_CONFIGS=all")
|
||||
|
Reference in New Issue
Block a user