diff options
-rw-r--r-- | Source/cmExportFileGenerator.cxx | 3 | ||||
-rw-r--r-- | Source/cmGeneratorExpression.cxx | 36 | ||||
-rw-r--r-- | Source/cmGeneratorExpression.h | 3 | ||||
-rw-r--r-- | Tests/ExportImport/Export/CMakeLists.txt | 7 | ||||
-rw-r--r-- | 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 ba0d00b..36802b5 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 ab8bd13..e962313 100644 --- a/Source/cmGeneratorExpression.cxx +++ b/Source/cmGeneratorExpression.cxx @@ -229,8 +229,27 @@ static std::string stripAllGeneratorExpressions(const std::string &input) } //---------------------------------------------------------------------------- +static void prefixItems(const std::string &content, std::string &result, + const std::string &prefix) +{ + std::vector<std::string> entries; + cmGeneratorExpression::Split(content, entries); + for(std::vector<std::string>::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 86b6f25..c20f130 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<std::string> &output); diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt index 787856f..49f1c58 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 $<TARGET_PROPERTY:testLibIncludeRequired1,INTERFACE_INCLUDE_DIRECTORIES> @@ -154,6 +160,7 @@ set_property(TARGET testLibRequired APPEND PROPERTY $<BUILD_INTERFACE:$<TARGET_PROPERTY:testLibIncludeRequired5,INTERFACE_INCLUDE_DIRECTORIES>> # Test that the below is non-fatal $<$<STREQUAL:one,two>:$<TARGET_PROPERTY:not_a_target,INTERFACE_INCLUDE_DIRECTORIES>> + $<INSTALL_INTERFACE:include/testLibIncludeRequired7> ) 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 d9dc331..48a4c44 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" |