From 634bb33f3aa3b7f2181a896c025976b52171524a Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 26 Mar 2013 18:08:26 +0100 Subject: [PATCH] Error if linked target has relative paths in INTERFACE_INCLUDE_DIRECTORIES We can do this check only if the TargetName is non-empty, which means that we're evaluating INTERFACE_INCLUDE_DIRECTORIES from a linked dependency which was set using target_link_libraries. It is possible to have relative paths in INCLUDE_DIRECTORIES already in CMake 2.8.10.2, so that part will require a policy to fix. --- Source/cmTarget.cxx | 14 ++++++++++++++ .../RelativePathInGenex-result.txt | 1 + .../RelativePathInGenex-stderr.txt | 5 +++++ .../include_directories/RelativePathInGenex.cmake | 8 ++++++++ .../include_directories/RunCMakeTest.cmake | 1 + 5 files changed, 29 insertions(+) create mode 100644 Tests/RunCMake/include_directories/RelativePathInGenex-result.txt create mode 100644 Tests/RunCMake/include_directories/RelativePathInGenex-stderr.txt create mode 100644 Tests/RunCMake/include_directories/RelativePathInGenex.cmake diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index b4fdcd54f2..1b329cf853 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2842,6 +2842,20 @@ static void processIncludeDirectories(cmTarget *tgt, return; } + if (!cmSystemTools::FileIsFullPath(li->c_str())) + { + if (!(*it)->TargetName.empty()) + { + cmOStringStream e; + e << "Target \"" << (*it)->TargetName << "\" contains relative " + "path in its INTERFACE_INCLUDE_DIRECTORIES:\n" + " \"" << *li << "\" "; + tgt->GetMakefile()->IssueMessage(cmake::FATAL_ERROR, + e.str().c_str()); + return; + } + } + if (testIsOff && !cmSystemTools::IsOff(li->c_str())) { cmSystemTools::ConvertToUnixSlashes(*li); diff --git a/Tests/RunCMake/include_directories/RelativePathInGenex-result.txt b/Tests/RunCMake/include_directories/RelativePathInGenex-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/include_directories/RelativePathInGenex-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/include_directories/RelativePathInGenex-stderr.txt b/Tests/RunCMake/include_directories/RelativePathInGenex-stderr.txt new file mode 100644 index 0000000000..490c700f86 --- /dev/null +++ b/Tests/RunCMake/include_directories/RelativePathInGenex-stderr.txt @@ -0,0 +1,5 @@ +CMake Error in CMakeLists.txt: + Target "testTarget" contains relative path in its + INTERFACE_INCLUDE_DIRECTORIES: + + "foo" diff --git a/Tests/RunCMake/include_directories/RelativePathInGenex.cmake b/Tests/RunCMake/include_directories/RelativePathInGenex.cmake new file mode 100644 index 0000000000..f72cf3adb6 --- /dev/null +++ b/Tests/RunCMake/include_directories/RelativePathInGenex.cmake @@ -0,0 +1,8 @@ + +project(RelativePathInInterface) + +add_library(testTarget "${CMAKE_CURRENT_SOURCE_DIR}/empty.cpp") +set_property(TARGET testTarget PROPERTY INTERFACE_INCLUDE_DIRECTORIES "$<1:foo>") + +add_library(userTarget "${CMAKE_CURRENT_SOURCE_DIR}/empty.cpp") +target_link_libraries(userTarget testTarget) diff --git a/Tests/RunCMake/include_directories/RunCMakeTest.cmake b/Tests/RunCMake/include_directories/RunCMakeTest.cmake index 1caae5cfba..f5160860dc 100644 --- a/Tests/RunCMake/include_directories/RunCMakeTest.cmake +++ b/Tests/RunCMake/include_directories/RunCMakeTest.cmake @@ -7,3 +7,4 @@ run_cmake(SourceDirectoryInInterface) run_cmake(BinaryDirectoryInInterface) run_cmake(RelativePathInInterface) run_cmake(ImportedTarget) +run_cmake(RelativePathInGenex)