mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-09 09:12:00 +00:00
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:
committed by
Brad King
parent
b53d3c7cc1
commit
6dc46638f4
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -174,6 +174,7 @@ protected:
|
||||
|
||||
enum ResponseFlagFor
|
||||
{
|
||||
Archive,
|
||||
Link,
|
||||
DeviceLink,
|
||||
};
|
||||
|
||||
@@ -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" ||
|
||||
|
||||
Reference in New Issue
Block a user