From a3aedb8152ad6fcdb42fd04e45307eea6ce0043e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 4 Jan 2013 15:56:13 +0100 Subject: [PATCH] Split the generator expression before extracting targets. Now that we're processing a LINK_INTERFACE_LIBRARIES string, it can contain targets. Make sure they are extracted for namespacing purposes. This needs to be restricted to strings which can actually have targets named in them. For example, this is not done for INTERFACE_COMPILE_DEFINITIONS, because even if there is a target named 'foo', the string 'foo' in that property means that '-Dfoo' will be set when compiling. --- Source/cmExportFileGenerator.cxx | 45 ++++++++++++++++++++++++++++++++ Source/cmExportFileGenerator.h | 14 ++++++++-- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index da1885668f..df8f3e8d16 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -218,9 +218,54 @@ cmExportFileGenerator::AddTargetNamespace(std::string &input, return true; } +//---------------------------------------------------------------------------- +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 cmExportFileGenerator::ResolveTargetsInGeneratorExpressions( + std::string &input, + cmTarget* target, + std::vector &missingTargets, + FreeTargetsReplace replace) +{ + if (replace == NoReplaceFreeTargets) + { + this->ResolveTargetsInGeneratorExpression(input, target, missingTargets); + return; + } + std::vector parts; + cmGeneratorExpression::Split(input, parts); + + std::string sep; + input = ""; + for(std::vector::iterator li = parts.begin(); + li != parts.end(); ++li) + { + if (!isGeneratorExpression(*li)) + { + this->AddTargetNamespace(*li, target, missingTargets); + } + else + { + this->ResolveTargetsInGeneratorExpression( + *li, + target, + missingTargets); + } + input += sep + *li; + sep = ";"; + } +} + +//---------------------------------------------------------------------------- +void +cmExportFileGenerator::ResolveTargetsInGeneratorExpression( std::string &input, cmTarget* target, std::vector &missingTargets) diff --git a/Source/cmExportFileGenerator.h b/Source/cmExportFileGenerator.h index a5b25f49c9..866806b66e 100644 --- a/Source/cmExportFileGenerator.h +++ b/Source/cmExportFileGenerator.h @@ -102,9 +102,16 @@ protected: void GenerateInterfaceProperties(cmTarget *target, std::ostream& os, const ImportPropertyMap &properties); + + enum FreeTargetsReplace { + ReplaceFreeTargets, + NoReplaceFreeTargets + }; + void ResolveTargetsInGeneratorExpressions(std::string &input, - cmTarget* target, - std::vector &missingTargets); + cmTarget* target, + std::vector &missingTargets, + FreeTargetsReplace replace = NoReplaceFreeTargets); // The namespace in which the exports are placed in the generated file. std::string Namespace; @@ -132,6 +139,9 @@ private: bool AddTargetNamespace(std::string &input, cmTarget* target, std::vector &missingTargets); + void ResolveTargetsInGeneratorExpression(std::string &input, + cmTarget* target, + std::vector &missingTargets); }; #endif