diff --git a/Modules/Compiler/NAG-Fortran.cmake b/Modules/Compiler/NAG-Fortran.cmake index 50b2991daf..4eb316224d 100644 --- a/Modules/Compiler/NAG-Fortran.cmake +++ b/Modules/Compiler/NAG-Fortran.cmake @@ -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) diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index 09026ca701..c046e11381 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx @@ -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( diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index a8e19f2f87..b1de402612 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -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; } diff --git a/Source/cmMakefileTargetGenerator.h b/Source/cmMakefileTargetGenerator.h index 7e551a8e9a..bcb5f26d8f 100644 --- a/Source/cmMakefileTargetGenerator.h +++ b/Source/cmMakefileTargetGenerator.h @@ -174,6 +174,7 @@ protected: enum ResponseFlagFor { + Archive, Link, DeviceLink, }; diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index c962997e8a..ee29cf8e61 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -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" ||