summaryrefslogtreecommitdiffstats
path: root/Source/cmTargetLinkLibrariesCommand.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmTargetLinkLibrariesCommand.cxx')
-rw-r--r--Source/cmTargetLinkLibrariesCommand.cxx53
1 files changed, 53 insertions, 0 deletions
diff --git a/Source/cmTargetLinkLibrariesCommand.cxx b/Source/cmTargetLinkLibrariesCommand.cxx
index f42b0f6..cb913f5 100644
--- a/Source/cmTargetLinkLibrariesCommand.cxx
+++ b/Source/cmTargetLinkLibrariesCommand.cxx
@@ -250,10 +250,51 @@ cmTargetLinkLibrariesCommand
}
//----------------------------------------------------------------------------
+static std::string compileProperty(cmTarget *tgt, const std::string &lib,
+ bool isGenex,
+ const std::string &property,
+ cmTarget::LinkLibraryType llt)
+{
+ std::string value = !isGenex ? "$<LINKED:" + lib + ">"
+ : "$<$<TARGET_DEFINED:" + lib + ">:" +
+ "$<TARGET_PROPERTY:" + lib +
+ ",INTERFACE_" + property + ">"
+ ">";
+
+ return tgt->GetDebugGeneratorExpressions(value, llt);
+}
+
+//----------------------------------------------------------------------------
+static bool isGeneratorExpression(const std::string &lib)
+{
+ const std::string::size_type openpos = lib.find("$<");
+ return (openpos != std::string::npos)
+ && (lib.find(">", openpos) != std::string::npos);
+}
+
+//----------------------------------------------------------------------------
void
cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib,
cmTarget::LinkLibraryType llt)
{
+ const bool isGenex = isGeneratorExpression(lib);
+
+ cmsys::RegularExpression targetNameValidator;
+ targetNameValidator.compile("^[A-Za-z0-9_.:-]+$");
+ const bool potentialTargetName = targetNameValidator.find(lib);
+
+ if (potentialTargetName || isGenex)
+ {
+ this->Target->AppendProperty("INCLUDE_DIRECTORIES",
+ compileProperty(this->Target, lib,
+ isGenex,
+ "INCLUDE_DIRECTORIES", llt).c_str());
+ this->Target->AppendProperty("COMPILE_DEFINITIONS",
+ compileProperty(this->Target, lib,
+ isGenex,
+ "COMPILE_DEFINITIONS", llt).c_str());
+ }
+
// Handle normal case first.
if(this->CurrentProcessingState != ProcessingLinkInterface)
{
@@ -266,6 +307,18 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib,
}
}
+ if (potentialTargetName || isGenex)
+ {
+ this->Target->AppendProperty("INTERFACE_COMPILE_DEFINITIONS",
+ compileProperty(this->Target, lib,
+ isGenex,
+ "COMPILE_DEFINITIONS", llt).c_str());
+ this->Target->AppendProperty("INTERFACE_INCLUDE_DIRECTORIES",
+ compileProperty(this->Target, lib,
+ isGenex,
+ "INCLUDE_DIRECTORIES", llt).c_str());
+ }
+
// Get the list of configurations considered to be DEBUG.
std::vector<std::string> const& debugConfigs =
this->Makefile->GetCMakeInstance()->GetDebugConfigs();