|
@@ -82,7 +82,6 @@ static auto ruleReplaceVars = { "CMAKE_${LANG}_COMPILER",
|
|
"CMAKE_CURRENT_SOURCE_DIR",
|
|
"CMAKE_CURRENT_SOURCE_DIR",
|
|
"CMAKE_CURRENT_BINARY_DIR",
|
|
"CMAKE_CURRENT_BINARY_DIR",
|
|
"CMAKE_RANLIB",
|
|
"CMAKE_RANLIB",
|
|
- "CMAKE_LINKER",
|
|
|
|
"CMAKE_MT",
|
|
"CMAKE_MT",
|
|
"CMAKE_TAPI",
|
|
"CMAKE_TAPI",
|
|
"CMAKE_CUDA_HOST_COMPILER",
|
|
"CMAKE_CUDA_HOST_COMPILER",
|
|
@@ -1604,6 +1603,7 @@ void cmLocalGenerator::GetTargetFlags(
|
|
}
|
|
}
|
|
|
|
|
|
std::string extraLinkFlags;
|
|
std::string extraLinkFlags;
|
|
|
|
+ this->AppendLinkerTypeFlags(extraLinkFlags, target, config, linkLanguage);
|
|
this->AppendPositionIndependentLinkerFlags(extraLinkFlags, target, config,
|
|
this->AppendPositionIndependentLinkerFlags(extraLinkFlags, target, config,
|
|
linkLanguage);
|
|
linkLanguage);
|
|
this->AppendIPOLinkerFlags(extraLinkFlags, target, config, linkLanguage);
|
|
this->AppendIPOLinkerFlags(extraLinkFlags, target, config, linkLanguage);
|
|
@@ -3200,6 +3200,49 @@ void cmLocalGenerator::AddUnityBuild(cmGeneratorTarget* target)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void cmLocalGenerator::AppendLinkerTypeFlags(std::string& flags,
|
|
|
|
+ cmGeneratorTarget* target,
|
|
|
|
+ const std::string& config,
|
|
|
|
+ const std::string& linkLanguage)
|
|
|
|
+{
|
|
|
|
+ switch (target->GetType()) {
|
|
|
|
+ case cmStateEnums::EXECUTABLE:
|
|
|
|
+ case cmStateEnums::SHARED_LIBRARY:
|
|
|
|
+ case cmStateEnums::MODULE_LIBRARY:
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ auto usingLinker =
|
|
|
|
+ cmStrCat("CMAKE_", linkLanguage, "_USING_",
|
|
|
|
+ target->IsDeviceLink() ? "DEVICE_" : "", "LINKER_");
|
|
|
|
+
|
|
|
|
+ auto format = this->Makefile->GetDefinition(cmStrCat(usingLinker, "MODE"));
|
|
|
|
+ if (format && format != "FLAG"_s) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ auto linkerType = target->GetLinkerTypeProperty(linkLanguage, config);
|
|
|
|
+ if (linkerType.empty()) {
|
|
|
|
+ linkerType = "DEFAULT";
|
|
|
|
+ }
|
|
|
|
+ usingLinker = cmStrCat(usingLinker, linkerType);
|
|
|
|
+ auto linkerTypeFlags = this->Makefile->GetDefinition(usingLinker);
|
|
|
|
+ if (linkerTypeFlags) {
|
|
|
|
+ if (!linkerTypeFlags.IsEmpty()) {
|
|
|
|
+ auto linkerFlags = cmExpandListWithBacktrace(linkerTypeFlags);
|
|
|
|
+ target->ResolveLinkerWrapper(linkerFlags, linkLanguage);
|
|
|
|
+ this->AppendFlags(flags, linkerFlags);
|
|
|
|
+ }
|
|
|
|
+ } else if (linkerType != "DEFAULT"_s) {
|
|
|
|
+ this->IssueMessage(MessageType::FATAL_ERROR,
|
|
|
|
+ cmStrCat("LINKER_TYPE '", linkerType,
|
|
|
|
+ "' is unknown. Did you forgot to define '",
|
|
|
|
+ usingLinker, "' variable?"));
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void cmLocalGenerator::AppendIPOLinkerFlags(std::string& flags,
|
|
void cmLocalGenerator::AppendIPOLinkerFlags(std::string& flags,
|
|
cmGeneratorTarget* target,
|
|
cmGeneratorTarget* target,
|
|
const std::string& config,
|
|
const std::string& config,
|