|
@@ -868,6 +868,31 @@ cmValue cmGeneratorTarget::GetFeature(const std::string& feature,
|
|
|
return this->LocalGenerator->GetFeature(feature, config);
|
|
|
}
|
|
|
|
|
|
+std::string cmGeneratorTarget::GetLinkerTypeProperty(
|
|
|
+ std::string const& lang, std::string const& config) const
|
|
|
+{
|
|
|
+ std::string propName{ "LINKER_TYPE" };
|
|
|
+ auto linkerType = this->GetProperty(propName);
|
|
|
+ if (!linkerType.IsEmpty()) {
|
|
|
+ cmGeneratorExpressionDAGChecker dagChecker(this, propName, nullptr,
|
|
|
+ nullptr);
|
|
|
+ auto ltype =
|
|
|
+ cmGeneratorExpression::Evaluate(*linkerType, this->GetLocalGenerator(),
|
|
|
+ config, this, &dagChecker, this, lang);
|
|
|
+ if (this->IsDeviceLink()) {
|
|
|
+ cmList list{ ltype };
|
|
|
+ const auto DL_BEGIN = "<DEVICE_LINK>"_s;
|
|
|
+ const auto DL_END = "</DEVICE_LINK>"_s;
|
|
|
+ cm::erase_if(list, [&](const std::string& item) {
|
|
|
+ return item == DL_BEGIN || item == DL_END;
|
|
|
+ });
|
|
|
+ return list.to_string();
|
|
|
+ }
|
|
|
+ return ltype;
|
|
|
+ }
|
|
|
+ return std::string{};
|
|
|
+}
|
|
|
+
|
|
|
const char* cmGeneratorTarget::GetLinkPIEProperty(
|
|
|
const std::string& config) const
|
|
|
{
|
|
@@ -5515,6 +5540,50 @@ std::string cmGeneratorTarget::GetLinkerLanguage(
|
|
|
return this->GetLinkClosure(config)->LinkerLanguage;
|
|
|
}
|
|
|
|
|
|
+std::string cmGeneratorTarget::GetLinkerTool(const std::string& config) const
|
|
|
+{
|
|
|
+ return this->GetLinkerTool(this->GetLinkerLanguage(config), config);
|
|
|
+}
|
|
|
+
|
|
|
+std::string cmGeneratorTarget::GetLinkerTool(const std::string& lang,
|
|
|
+ const std::string& config) const
|
|
|
+{
|
|
|
+ auto usingLinker =
|
|
|
+ cmStrCat("CMAKE_", lang, "_USING_", this->IsDeviceLink() ? "DEVICE_" : "",
|
|
|
+ "LINKER_");
|
|
|
+ auto format = this->Makefile->GetDefinition(cmStrCat(usingLinker, "MODE"));
|
|
|
+ if (!format || format != "TOOL"_s) {
|
|
|
+ return this->Makefile->GetDefinition("CMAKE_LINKER");
|
|
|
+ }
|
|
|
+
|
|
|
+ auto linkerType = this->GetLinkerTypeProperty(lang, config);
|
|
|
+ if (linkerType.empty()) {
|
|
|
+ linkerType = "DEFAULT";
|
|
|
+ }
|
|
|
+ usingLinker = cmStrCat(usingLinker, linkerType);
|
|
|
+ auto linkerTool = this->Makefile->GetDefinition(usingLinker);
|
|
|
+
|
|
|
+ if (!linkerTool) {
|
|
|
+ if (this->GetGlobalGenerator()->IsVisualStudio() &&
|
|
|
+ linkerType == "DEFAULT"_s) {
|
|
|
+ return std::string{};
|
|
|
+ }
|
|
|
+
|
|
|
+ // fall-back to generic definition
|
|
|
+ linkerTool = this->Makefile->GetDefinition("CMAKE_LINKER");
|
|
|
+
|
|
|
+ if (linkerType != "DEFAULT"_s) {
|
|
|
+ this->LocalGenerator->IssueMessage(
|
|
|
+ MessageType::FATAL_ERROR,
|
|
|
+ cmStrCat("LINKER_TYPE '", linkerType,
|
|
|
+ "' is unknown. Did you forgot to define '", usingLinker,
|
|
|
+ "' variable?"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return linkerTool;
|
|
|
+}
|
|
|
+
|
|
|
std::string cmGeneratorTarget::GetPDBOutputName(
|
|
|
const std::string& config) const
|
|
|
{
|