Add support of CMAKE_<LANG>_USE_RESPONSE_FILE_FOR_LIBRARIES variable.

We add a function in cmNinjaNormalTargetGenerator.cxx to check for the state of the option (as it was done for Makefile). This will be checked to add or not the `$LINK_PATH` and `$LINK_LIBRARIES` to the Ninja file.
The default behavior is adding those libraries.
Fixes: #24681
This commit is contained in:
Matthieu Ribiere
2023-04-07 12:10:19 +02:00
parent 9af53e9bcf
commit e0364eb20d
2 changed files with 35 additions and 5 deletions

View File

@@ -213,6 +213,22 @@ std::string cmNinjaNormalTargetGenerator::TextStubsGeneratorRule(
'_', config);
}
bool cmNinjaNormalTargetGenerator::CheckUseResponseFileForLibraries(
const std::string& l) const
{
// Check for an explicit setting one way or the other.
std::string const responseVar =
"CMAKE_" + l + "_USE_RESPONSE_FILE_FOR_LIBRARIES";
// If the option is defined, read it's value
if (cmValue val = this->Makefile->GetDefinition(responseVar)) {
return val.IsOn();
}
// Default to true
return true;
}
struct cmNinjaRemoveNoOpCommands
{
bool operator()(std::string const& cmd)
@@ -251,9 +267,16 @@ void cmNinjaNormalTargetGenerator::WriteNvidiaDeviceLinkRule(
} else {
rule.RspContent = "$in_newline";
}
rule.RspContent += " $LINK_LIBRARIES";
// add the link command in the file if necessary
if (this->CheckUseResponseFileForLibraries("CUDA")) {
rule.RspContent += " $LINK_LIBRARIES";
vars.LinkLibraries = "";
} else {
vars.LinkLibraries = "$LINK_PATH $LINK_LIBRARIES";
}
vars.Objects = responseFlag.c_str();
vars.LinkLibraries = "";
}
vars.ObjectDir = "$OBJECT_DIR";
@@ -416,13 +439,20 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile,
} else {
rule.RspContent = "$in_newline";
}
rule.RspContent += " $LINK_PATH $LINK_LIBRARIES";
// If libraries in rsp is enable
if (this->CheckUseResponseFileForLibraries(lang)) {
rule.RspContent += " $LINK_PATH $LINK_LIBRARIES";
vars.LinkLibraries = "";
} else {
vars.LinkLibraries = "$LINK_PATH $LINK_LIBRARIES";
}
if (this->TargetLinkLanguage(config) == "Swift") {
vars.SwiftSources = responseFlag.c_str();
} else {
vars.Objects = responseFlag.c_str();
}
vars.LinkLibraries = "";
}
vars.ObjectDir = "$OBJECT_DIR";

View File

@@ -26,7 +26,7 @@ private:
const std::string& config) const;
std::string LanguageLinkerCudaFatbinaryRule(const std::string& config) const;
std::string TextStubsGeneratorRule(const std::string& config) const;
bool CheckUseResponseFileForLibraries(const std::string& config) const;
const char* GetVisibleTypeName() const;
void WriteLanguagesRules(const std::string& config);