diff options
author | Stephen Kelly <steveire@gmail.com> | 2013-07-31 14:40:35 (GMT) |
---|---|---|
committer | Stephen Kelly <steveire@gmail.com> | 2013-07-31 22:37:25 (GMT) |
commit | 80e652f5cc279715ff57e1c64c6e5c460b201db4 (patch) | |
tree | 20456816f757b0d5e1386041f17f0b9fc5990f04 | |
parent | 43558156d451b605bb9a3d14d53a3896ea98d73a (diff) | |
download | CMake-80e652f5cc279715ff57e1c64c6e5c460b201db4.zip CMake-80e652f5cc279715ff57e1c64c6e5c460b201db4.tar.gz CMake-80e652f5cc279715ff57e1c64c6e5c460b201db4.tar.bz2 |
Export: Process generator expressions from INCLUDES DESTINATION.
Configuration sensitive expressions are not permitted.
6 files changed, 54 insertions, 15 deletions
diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index 5b351bc..ef336ea 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -287,11 +287,33 @@ void cmExportFileGenerator::PopulateIncludeDirectoriesInterface( const char *propName = "INTERFACE_INCLUDE_DIRECTORIES"; const char *input = target->GetProperty(propName); - if (!input && tei->InterfaceIncludeDirectories.empty()) + + cmListFileBacktrace lfbt; + cmGeneratorExpression ge(lfbt); + + std::string dirs = tei->InterfaceIncludeDirectories; + this->ReplaceInstallPrefix(dirs); + cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(dirs); + std::string exportDirs = cge->Evaluate(target->GetMakefile(), 0, + false, target); + + if (cge->GetHadContextSensitiveCondition()) + { + cmMakefile* mf = target->GetMakefile(); + cmOStringStream e; + e << "Target \"" << target->GetName() << "\" is installed with " + "INCLUDES DESTINATION set to a context sensitive path. Paths which " + "depend on the configuration, policy values or the link interface are " + "not supported. Consider using target_include_directories instead."; + mf->IssueMessage(cmake::FATAL_ERROR, e.str()); + return; + } + + if (!input && exportDirs.empty()) { return; } - if ((input && !*input) && tei->InterfaceIncludeDirectories.empty()) + if ((input && !*input) && exportDirs.empty()) { // Set to empty properties[propName] = ""; @@ -300,7 +322,7 @@ void cmExportFileGenerator::PopulateIncludeDirectoriesInterface( std::string includes = (input?input:""); const char* sep = input ? ";" : ""; - includes += sep + tei->InterfaceIncludeDirectories; + includes += sep + exportDirs; std::string prepro = cmGeneratorExpression::Preprocess(includes, preprocessRule, true); diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt index 1910f8c..b5b2027 100644 --- a/Tests/ExportImport/Export/CMakeLists.txt +++ b/Tests/ExportImport/Export/CMakeLists.txt @@ -99,7 +99,6 @@ macro(add_include_lib _libName) set_property(TARGET ${_libName} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${_libName}>" - "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/${_libName}>" ) if (NOT "${ARGV1}" STREQUAL "NO_HEADER") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_libName}/${_libName}.h" "// no content\n") @@ -188,8 +187,7 @@ install(FILES DESTINATION include/testSharedLibRequired ) set_property(TARGET testSharedLibRequired APPEND PROPERTY - INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/testSharedLibRequired>" - "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>" + INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>" ) set_property(TARGET testSharedLibRequired APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS USING_TESTSHAREDLIBREQUIRED @@ -273,18 +271,24 @@ set_property(TARGET cmp0022OLD APPEND PROPERTY LINK_INTERFACE_LIBRARIES testLib3 add_library(noIncludesInterface empty.cpp) install(TARGETS testLibRequired - testLibIncludeRequired1 - testLibIncludeRequired2 - testLibIncludeRequired3 - testLibIncludeRequired4 - testLibIncludeRequired5 - testLibIncludeRequired6 - testSharedLibRequired - noIncludesInterface EXPORT RequiredExp DESTINATION lib INCLUDES DESTINATION installIncludesTest - $<INSTALL_PREFIX>/installIncludesTest2) + $<INSTALL_PREFIX>/installIncludesTest2 + ) +install(TARGETS + testLibIncludeRequired1 + testLibIncludeRequired2 + testLibIncludeRequired3 + testLibIncludeRequired4 + testLibIncludeRequired5 + testLibIncludeRequired6 + testSharedLibRequired + noIncludesInterface + EXPORT RequiredExp DESTINATION lib + INCLUDES DESTINATION + $<INSTALL_PREFIX>/include/$<TARGET_PROPERTY:NAME> +) install(EXPORT RequiredExp NAMESPACE Req:: FILE testLibRequiredTargets.cmake DESTINATION lib/cmake/testLibRequired) file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest") diff --git a/Tests/RunCMake/include_directories/RunCMakeTest.cmake b/Tests/RunCMake/include_directories/RunCMakeTest.cmake index 520dd44..f0704f4 100644 --- a/Tests/RunCMake/include_directories/RunCMakeTest.cmake +++ b/Tests/RunCMake/include_directories/RunCMakeTest.cmake @@ -9,3 +9,4 @@ run_cmake(RelativePathInInterface) run_cmake(ImportedTarget) run_cmake(RelativePathInGenex) run_cmake(CMP0021) +run_cmake(install_config) diff --git a/Tests/RunCMake/include_directories/install_config-result.txt b/Tests/RunCMake/include_directories/install_config-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/include_directories/install_config-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/include_directories/install_config-stderr.txt b/Tests/RunCMake/include_directories/install_config-stderr.txt new file mode 100644 index 0000000..ac7b7b0 --- /dev/null +++ b/Tests/RunCMake/include_directories/install_config-stderr.txt @@ -0,0 +1,5 @@ +CMake Error in CMakeLists.txt: + Target "foo" is installed with INCLUDES DESTINATION set to a context + sensitive path. Paths which depend on the configuration, policy values or + the link interface are not supported. Consider using + target_include_directories instead. diff --git a/Tests/RunCMake/include_directories/install_config.cmake b/Tests/RunCMake/include_directories/install_config.cmake new file mode 100644 index 0000000..46c626c --- /dev/null +++ b/Tests/RunCMake/include_directories/install_config.cmake @@ -0,0 +1,6 @@ + +enable_language(CXX) + +add_executable(foo empty.cpp) +install(TARGETS foo EXPORT fooTargets DESTINATION . INCLUDES DESTINATION include/$<CONFIGURATION>) +install(EXPORT fooTargets DESTINATION lib/cmake) |