From b8dc7fad23a0b6867dae30e3cd6a23c82d6cfac9 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 25 Jul 2013 09:12:28 +0200 Subject: [PATCH] Genex: Disallow LINKER_LANGUAGE only when used on a static library. For shared libraries and executables, the linker_language is indepenedent of the linked libraries. --- Source/cmGeneratorExpressionEvaluator.cxx | 5 +++-- Source/cmTarget.cxx | 8 ++++---- Source/cmTarget.h | 3 +++ Tests/RunCMake/Languages/LINK_LANGUAGE-genex.cmake | 4 ++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index b59298fee..d0b61909a 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -790,11 +790,12 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode if (propertyName == "LINKER_LANGUAGE") { - if (dagCheckerParent && dagCheckerParent->EvaluatingLinkLibraries()) + if (target->LinkLanguagePropagatesToDependents() && + dagCheckerParent && dagCheckerParent->EvaluatingLinkLibraries()) { reportError(context, content->GetOriginalExpression(), "LINKER_LANGUAGE target property can not be used while evaluating " - "link libraries"); + "link libraries for a static library"); return std::string(); } const char *lang = target->GetLinkerLanguage(context->Config); diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 622e812c9..ffd4008b3 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -6241,7 +6241,7 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config, } // Get the link languages. - if(this->GetType() == cmTarget::STATIC_LIBRARY) + if(this->LinkLanguagePropagatesToDependents()) { std::string linkProp = "IMPORTED_LINK_INTERFACE_LANGUAGES"; linkProp += suffix; @@ -6470,7 +6470,7 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, else { iface.Libraries = impl->Libraries; - if(this->GetType() == cmTarget::STATIC_LIBRARY) + if(this->LinkLanguagePropagatesToDependents()) { // Targets using this archive need its language runtime libraries. iface.Languages = impl->Languages; @@ -6539,7 +6539,7 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, } } } - if(this->GetType() == cmTarget::STATIC_LIBRARY) + if(this->LinkLanguagePropagatesToDependents()) { // Targets using this archive need its language runtime libraries. iface.Languages = impl->Languages; @@ -6558,7 +6558,7 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface, iface.ImplementationIsInterface = true; iface.Libraries = impl->Libraries; iface.WrongConfigLibraries = impl->WrongConfigLibraries; - if(this->GetType() == cmTarget::STATIC_LIBRARY) + if(this->LinkLanguagePropagatesToDependents()) { // Targets using this archive need its language runtime libraries. iface.Languages = impl->Languages; diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 24a71ed63..27b74ca4b 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -549,6 +549,9 @@ public: void FinalizeSystemIncludeDirectories(); + bool LinkLanguagePropagatesToDependents() const + { return this->TargetTypeValue == STATIC_LIBRARY; } + private: // The set of include directories that are marked as system include // directories. diff --git a/Tests/RunCMake/Languages/LINK_LANGUAGE-genex.cmake b/Tests/RunCMake/Languages/LINK_LANGUAGE-genex.cmake index d4e31cde3..64f394c11 100644 --- a/Tests/RunCMake/Languages/LINK_LANGUAGE-genex.cmake +++ b/Tests/RunCMake/Languages/LINK_LANGUAGE-genex.cmake @@ -1,4 +1,4 @@ -add_library(foo SHARED empty.cpp) -add_library(bar SHARED empty.cpp) +add_library(foo STATIC empty.cpp) +add_library(bar STATIC empty.cpp) target_link_libraries(foo $<$,anything>:bar>)