From d777b8e7167e0c1a3de4ebcf66fac5fc604f1dd9 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 25 Jul 2013 09:05:03 +0200 Subject: [PATCH] Genex: Allow relative paths in INSTALL_INTERFACE. These paths can be prepended with the ${_IMPORT_PREFIX} generated in the export file. Such relative paths were previously an error. --- Source/cmExportFileGenerator.cxx | 3 +- Source/cmGeneratorExpression.cxx | 36 +++++++++++++++++++++--- Source/cmGeneratorExpression.h | 3 +- Tests/ExportImport/Export/CMakeLists.txt | 7 +++++ Tests/ExportImport/Import/A/deps_iface.c | 1 + 5 files changed, 44 insertions(+), 6 deletions(-) diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index cff539f11..b8188a6c8 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -302,7 +302,8 @@ void cmExportFileGenerator::PopulateIncludeDirectoriesInterface( const char* sep = input ? ";" : ""; includes += sep + tei->InterfaceIncludeDirectories; std::string prepro = cmGeneratorExpression::Preprocess(includes, - preprocessRule); + preprocessRule, + true); if (!prepro.empty()) { this->ResolveTargetsInGeneratorExpressions(prepro, target, diff --git a/Source/cmGeneratorExpression.cxx b/Source/cmGeneratorExpression.cxx index ab8bd137e..e96231304 100644 --- a/Source/cmGeneratorExpression.cxx +++ b/Source/cmGeneratorExpression.cxx @@ -228,9 +228,28 @@ static std::string stripAllGeneratorExpressions(const std::string &input) return cmGeneratorExpression::StripEmptyListElements(result); } +//---------------------------------------------------------------------------- +static void prefixItems(const std::string &content, std::string &result, + const std::string &prefix) +{ + std::vector entries; + cmGeneratorExpression::Split(content, entries); + for(std::vector::const_iterator ei = entries.begin(); + ei != entries.end(); ++ei) + { + if (!cmSystemTools::FileIsFullPath(ei->c_str()) + && cmGeneratorExpression::Find(*ei) == std::string::npos) + { + result += prefix; + } + result += *ei; + } +} + //---------------------------------------------------------------------------- static std::string stripExportInterface(const std::string &input, - cmGeneratorExpression::PreprocessContext context) + cmGeneratorExpression::PreprocessContext context, + bool resolveRelative) { std::string result; @@ -289,7 +308,15 @@ static std::string stripExportInterface(const std::string &input, else if(context == cmGeneratorExpression::InstallInterface && gotInstallInterface) { - result += input.substr(pos, c - cStart); + const std::string content = input.substr(pos, c - cStart); + if (resolveRelative) + { + prefixItems(content, result, "${_IMPORT_PREFIX}/"); + } + else + { + result += content; + } } break; } @@ -380,7 +407,8 @@ void cmGeneratorExpression::Split(const std::string &input, //---------------------------------------------------------------------------- std::string cmGeneratorExpression::Preprocess(const std::string &input, - PreprocessContext context) + PreprocessContext context, + bool resolveRelative) { if (context == StripAllGeneratorExpressions) { @@ -388,7 +416,7 @@ std::string cmGeneratorExpression::Preprocess(const std::string &input, } else if (context == BuildInterface || context == InstallInterface) { - return stripExportInterface(input, context); + return stripExportInterface(input, context, resolveRelative); } assert(!"cmGeneratorExpression::Preprocess called with invalid args"); diff --git a/Source/cmGeneratorExpression.h b/Source/cmGeneratorExpression.h index 86b6f25df..c20f130c9 100644 --- a/Source/cmGeneratorExpression.h +++ b/Source/cmGeneratorExpression.h @@ -57,7 +57,8 @@ public: }; static std::string Preprocess(const std::string &input, - PreprocessContext context); + PreprocessContext context, + bool resolveRelative = false); static void Split(const std::string &input, std::vector &output); diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt index 737ec432b..877255503 100644 --- a/Tests/ExportImport/Export/CMakeLists.txt +++ b/Tests/ExportImport/Export/CMakeLists.txt @@ -140,6 +140,12 @@ install(FILES ) add_include_lib(testLibIncludeRequired6) +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired7/testLibIncludeRequired7.h" "// No content\n") +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/testLibIncludeRequired7/testLibIncludeRequired7.h" + DESTINATION include/testLibIncludeRequired7 +) + set_property(TARGET testLibRequired APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES $ @@ -154,6 +160,7 @@ set_property(TARGET testLibRequired APPEND PROPERTY $> # Test that the below is non-fatal $<$:$> + $ ) set_property(TARGET testLibRequired APPEND PROPERTY diff --git a/Tests/ExportImport/Import/A/deps_iface.c b/Tests/ExportImport/Import/A/deps_iface.c index d9dc3319c..48a4c44d6 100644 --- a/Tests/ExportImport/Import/A/deps_iface.c +++ b/Tests/ExportImport/Import/A/deps_iface.c @@ -2,6 +2,7 @@ #include "testLibIncludeRequired1.h" #include "testLibIncludeRequired2.h" #include "testLibIncludeRequired6.h" +#include "testLibIncludeRequired7.h" #include "installIncludesTest.h" #include "installIncludesTest2.h"