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
diff --git a/Modules/Compiler/NAG-Fortran.cmake b/Modules/Compiler/NAG-Fortran.cmake index 50b2991..4eb3162 100644 --- a/Modules/Compiler/NAG-Fortran.cmake +++ b/Modules/Compiler/NAG-Fortran.cmake
@@ -45,6 +45,7 @@ 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)
diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index 09026ca..c046e11 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx
@@ -755,9 +755,13 @@ // 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(
diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index a8e19f2..b1de402 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx
@@ -2420,10 +2420,17 @@ 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; }
diff --git a/Source/cmMakefileTargetGenerator.h b/Source/cmMakefileTargetGenerator.h index 7e551a8..bcb5f26 100644 --- a/Source/cmMakefileTargetGenerator.h +++ b/Source/cmMakefileTargetGenerator.h
@@ -174,6 +174,7 @@ enum ResponseFlagFor { + Archive, Link, DeviceLink, };
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index c962997..ee29cf8 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx
@@ -498,8 +498,15 @@ } // 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 @@ 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" ||