LINK_OPTIONS: ensure correct dollar escaping

Ensure correct escaping for Ninja and Makefile generators.

Fixes: #25049
This commit is contained in:
Marc Chevrier
2023-07-01 14:20:15 +02:00
parent a28217eb8c
commit 3c685a578a
10 changed files with 37 additions and 13 deletions

View File

@@ -637,6 +637,8 @@ public:
};
StripCommandStyle GetStripCommandStyle(std::string const& strip);
virtual std::string& EncodeLiteral(std::string& lit) { return lit; }
protected:
// for a project collect all its targets by following depend
// information, and also collect all the targets

View File

@@ -181,14 +181,13 @@ std::string cmGlobalNinjaGenerator::EncodeRuleName(std::string const& name)
return encoded;
}
std::string cmGlobalNinjaGenerator::EncodeLiteral(const std::string& lit)
std::string cmGlobalNinjaGenerator::GetEncodedLiteral(const std::string& lit)
{
std::string result = lit;
EncodeLiteralInplace(result);
return result;
return this->EncodeLiteral(result);
}
void cmGlobalNinjaGenerator::EncodeLiteralInplace(std::string& lit)
std::string& cmGlobalNinjaGenerator::EncodeLiteral(std::string& lit)
{
cmSystemTools::ReplaceString(lit, "$", "$$");
cmSystemTools::ReplaceString(lit, "\n", "$\n");
@@ -196,6 +195,7 @@ void cmGlobalNinjaGenerator::EncodeLiteralInplace(std::string& lit)
cmSystemTools::ReplaceString(lit, cmStrCat('$', this->GetCMakeCFGIntDir()),
this->GetCMakeCFGIntDir());
}
return lit;
}
std::string cmGlobalNinjaGenerator::EncodePath(const std::string& path)
@@ -207,7 +207,7 @@ std::string cmGlobalNinjaGenerator::EncodePath(const std::string& path)
else
std::replace(result.begin(), result.end(), '/', '\\');
#endif
this->EncodeLiteralInplace(result);
this->EncodeLiteral(result);
cmSystemTools::ReplaceString(result, " ", "$ ");
cmSystemTools::ReplaceString(result, ":", "$:");
return result;
@@ -394,7 +394,7 @@ void cmGlobalNinjaGenerator::WriteCustomCommandBuild(
#endif
vars["COMMAND"] = std::move(cmd);
}
vars["DESC"] = this->EncodeLiteral(description);
vars["DESC"] = this->GetEncodedLiteral(description);
if (restat) {
vars["restat"] = "1";
}

View File

@@ -77,8 +77,8 @@ public:
static void WriteDivider(std::ostream& os);
static std::string EncodeRuleName(std::string const& name);
std::string EncodeLiteral(const std::string& lit);
void EncodeLiteralInplace(std::string& lit);
std::string& EncodeLiteral(std::string& lit) override;
std::string GetEncodedLiteral(const std::string& lit);
std::string EncodePath(const std::string& path);
std::unique_ptr<cmLinkLineComputer> CreateLinkLineComputer(

View File

@@ -1431,11 +1431,14 @@ void cmLocalGenerator::GetDeviceLinkFlags(
}
this->AddVisibilityPresetFlags(linkFlags, target, "CUDA");
this->GetGlobalGenerator()->EncodeLiteral(linkFlags);
std::vector<std::string> linkOpts;
target->GetLinkOptions(linkOpts, config, "CUDA");
this->SetLinkScriptShell(this->GetGlobalGenerator()->GetUseLinkScript());
// LINK_OPTIONS are escaped.
this->AppendCompileOptions(linkFlags, linkOpts);
this->SetLinkScriptShell(false);
}
void cmLocalGenerator::GetTargetFlags(
@@ -1501,13 +1504,17 @@ void cmLocalGenerator::GetTargetFlags(
}
if (!sharedLibFlags.empty()) {
this->GetGlobalGenerator()->EncodeLiteral(sharedLibFlags);
linkFlags.emplace_back(std::move(sharedLibFlags));
}
std::vector<BT<std::string>> linkOpts =
target->GetLinkOptions(config, linkLanguage);
this->SetLinkScriptShell(this->GetGlobalGenerator()->GetUseLinkScript());
// LINK_OPTIONS are escaped.
this->AppendCompileOptions(linkFlags, linkOpts);
this->SetLinkScriptShell(false);
if (pcli) {
this->OutputLinkLibraries(pcli, linkLineComputer, linkLibs,
frameworkPath, linkPath);
@@ -1581,13 +1588,16 @@ void cmLocalGenerator::GetTargetFlags(
}
if (!exeFlags.empty()) {
this->GetGlobalGenerator()->EncodeLiteral(exeFlags);
linkFlags.emplace_back(std::move(exeFlags));
}
std::vector<BT<std::string>> linkOpts =
target->GetLinkOptions(config, linkLanguage);
this->SetLinkScriptShell(this->GetGlobalGenerator()->GetUseLinkScript());
// LINK_OPTIONS are escaped.
this->AppendCompileOptions(linkFlags, linkOpts);
this->SetLinkScriptShell(false);
} break;
default:
break;
@@ -1603,6 +1613,7 @@ void cmLocalGenerator::GetTargetFlags(
config);
if (!extraLinkFlags.empty()) {
this->GetGlobalGenerator()->EncodeLiteral(extraLinkFlags);
linkFlags.emplace_back(std::move(extraLinkFlags));
}
}

View File

@@ -126,8 +126,11 @@ void cmMakefileTargetGenerator::GetDeviceLinkFlags(
std::vector<std::string> linkOpts;
this->GeneratorTarget->GetLinkOptions(linkOpts, this->GetConfigName(),
linkLanguage);
this->LocalGenerator->SetLinkScriptShell(
this->GlobalGenerator->GetUseLinkScript());
// LINK_OPTIONS are escaped.
this->LocalGenerator->AppendCompileOptions(linkFlags, linkOpts);
this->LocalGenerator->SetLinkScriptShell(false);
}
void cmMakefileTargetGenerator::GetTargetLinkFlags(
@@ -144,8 +147,11 @@ void cmMakefileTargetGenerator::GetTargetLinkFlags(
std::vector<std::string> opts;
this->GeneratorTarget->GetLinkOptions(opts, this->GetConfigName(),
linkLanguage);
this->LocalGenerator->SetLinkScriptShell(
this->GlobalGenerator->GetUseLinkScript());
// LINK_OPTIONS are escaped.
this->LocalGenerator->AppendCompileOptions(flags, opts);
this->LocalGenerator->SetLinkScriptShell(false);
this->LocalGenerator->AppendPositionIndependentLinkerFlags(
flags, this->GeneratorTarget, this->GetConfigName(), linkLanguage);

View File

@@ -952,8 +952,6 @@ void cmNinjaNormalTargetGenerator::WriteNvidiaDeviceLinkStatement(
this->addPoolNinjaVariable("JOB_POOL_LINK", genTarget, vars);
vars["LINK_FLAGS"] = globalGen->EncodeLiteral(vars["LINK_FLAGS"]);
vars["MANIFESTS"] = this->GetManifests(config);
vars["LINK_PATH"] = frameworkPath + linkPath;
@@ -1271,8 +1269,6 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
vars["LINK_FLAGS"], this->GetGeneratorTarget(),
this->TargetLinkLanguage(config));
vars["LINK_FLAGS"] = globalGen->EncodeLiteral(vars["LINK_FLAGS"]);
vars["MANIFESTS"] = this->GetManifests(config);
vars["AIX_EXPORTS"] = this->GetAIXExports(config);

View File

@@ -0,0 +1,4 @@
if (NOT actual_stdout MATCHES "BADFLAG_\\$dollar")
set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG_$dollar'.")
endif()

View File

@@ -53,3 +53,7 @@ target_link_options(LinkOptions_mod PRIVATE $<$<CONFIG:Release>:${pre}BADFLAG_RE
# executable with generator expression
add_executable(LinkOptions_exe LinkOptionsExe.c)
target_link_options(LinkOptions_exe PRIVATE $<$<CONFIG:Release>:${pre}BADFLAG_RELEASE${obj}>)
# executable with dollar character
add_executable(LinkOptions_dollar_exe LinkOptionsExe.c)
target_link_options(LinkOptions_dollar_exe PRIVATE "${pre}BADFLAG_$dollar${obj}")

View File

@@ -30,7 +30,7 @@ if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel")
run_cmake_target(LINK_OPTIONS shared LinkOptions_shared --config Release)
run_cmake_target(LINK_OPTIONS mod LinkOptions_mod --config Release)
run_cmake_target(LINK_OPTIONS exe LinkOptions_exe --config Release)
run_cmake_target(LINK_OPTIONS dollar-option LinkOptions_dollar_exe --config Release)
run_cmake(genex_LINK_LANGUAGE)