NAG Fortran: Fix response file flag for creating archives

Since commit 10d6c3a635 (NAG: Pass response files through front-end to
the linker, 2018-08-01, v3.13.0-rc1~244^2) we use `-Wl,@` instead of `@`
in order to pass the response file through the `nagfor` compiler driver
to the linker.  However, this is not needed for the archiver.  Create
a separate rule variable so we can use different response file flags
for archiving and linking.

Issue: #23577
This commit is contained in:
Simon Maertens
2026-05-05 19:18:02 +01:00
committed by Brad King
parent b53d3c7cc1
commit 6dc46638f4
5 changed files with 32 additions and 6 deletions

View File

@@ -45,6 +45,7 @@ set(CMAKE_Fortran_FORMAT_FREE_FLAG "-free")
set(CMAKE_Fortran_COMPILE_OPTIONS_PIC "-PIC")
set(CMAKE_Fortran_COMPILE_OPTIONS_PIE "-PIC")
set(CMAKE_Fortran_RESPONSE_FILE_LINK_FLAG "-Wl,@")
set(CMAKE_Fortran_RESPONSE_FILE_ARCHIVE_FLAG "@")
set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_ON "-fpp")
set(CMAKE_Fortran_LINK_MODE DRIVER)

View File

@@ -755,9 +755,13 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules(
// Construct object file lists that may be needed to expand the
// rule.
std::string buildObjs;
cmMakefileTargetGenerator::ResponseFlagFor responseMode =
this->GeneratorTarget->GetType() == cmStateEnums::STATIC_LIBRARY
? cmMakefileTargetGenerator::ResponseFlagFor::Archive
: cmMakefileTargetGenerator::ResponseFlagFor::Link;
this->CreateObjectLists(useLinkScript, useArchiveRules,
useResponseFileForObjects, buildObjs, depends,
useWatcomQuote, linkLanguage);
useWatcomQuote, linkLanguage, responseMode);
if (!this->DeviceLinkObject.empty()) {
buildObjs += " " +
this->LocalGenerator->ConvertToOutputFormat(

View File

@@ -2420,10 +2420,17 @@ std::string cmMakefileTargetGenerator::GetResponseFlag(
responseFlagVar = cmStrCat("CMAKE_", lang, "_RESPONSE_FILE_LINK_FLAG");
} else if (mode == cmMakefileTargetGenerator::ResponseFlagFor::DeviceLink) {
responseFlagVar = "CMAKE_CUDA_RESPONSE_FILE_DEVICE_LINK_FLAG";
} else if (mode == cmMakefileTargetGenerator::ResponseFlagFor::Archive) {
responseFlagVar = cmStrCat("CMAKE_", lang, "_RESPONSE_FILE_ARCHIVE_FLAG");
}
if (cmValue const p = this->Makefile->GetDefinition(responseFlagVar)) {
responseFlag = *p;
} else if (mode == cmMakefileTargetGenerator::ResponseFlagFor::Archive) {
responseFlagVar = cmStrCat("CMAKE_", lang, "_RESPONSE_FILE_LINK_FLAG");
if (cmValue const q = this->Makefile->GetDefinition(responseFlagVar)) {
responseFlag = *q;
}
}
return responseFlag;
}

View File

@@ -174,6 +174,7 @@ protected:
enum ResponseFlagFor
{
Archive,
Link,
DeviceLink,
};

View File

@@ -498,8 +498,15 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(
}
// build response file name
std::string cmakeLinkVar = cmakeVarLang + "_RESPONSE_FILE_LINK_FLAG";
cmValue flag = this->GetMakefile()->GetDefinition(cmakeLinkVar);
cmValue flag;
if (targetType == cmStateEnums::STATIC_LIBRARY) {
std::string cmakeLinkVar = cmakeVarLang + "_RESPONSE_FILE_ARCHIVE_FLAG";
flag = this->GetMakefile()->GetDefinition(cmakeLinkVar);
}
if (!flag) {
std::string cmakeLinkVar = cmakeVarLang + "_RESPONSE_FILE_LINK_FLAG";
flag = this->GetMakefile()->GetDefinition(cmakeLinkVar);
}
if (flag) {
responseFlag = *flag;
@@ -1589,9 +1596,15 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement(
cmStrCat("CMAKE_", this->TargetLinkLanguage(config));
// build response file name
std::string cmakeLinkVar = cmakeVarLang + "_RESPONSE_FILE_LINK_FLAG";
cmValue flag = this->GetMakefile()->GetDefinition(cmakeLinkVar);
cmValue flag;
if (targetType == cmStateEnums::STATIC_LIBRARY) {
std::string cmakeLinkVar = cmakeVarLang + "_RESPONSE_FILE_ARCHIVE_FLAG";
flag = this->GetMakefile()->GetDefinition(cmakeLinkVar);
}
if (!flag) {
std::string cmakeLinkVar = cmakeVarLang + "_RESPONSE_FILE_LINK_FLAG";
flag = this->GetMakefile()->GetDefinition(cmakeLinkVar);
}
bool const lang_supports_response =
!(this->TargetLinkLanguage(config) == "RC" ||