Merge topic 'export-includes'

5838aba Export: Report error on relative include with genex.
7a3e45b Export: Prefix relative items with genexes in INSTALL_INTERFACE.
f088a32 Export: Process INSTALL_INTERFACE in INCLUDES DESTINATION.
9eedc85 Export: Process relative includes after genex evaluation.
80790f3 Export: Test existing behavior of exporting includes with genexes.
38afc82 target_include_directories: Allow relative path with genex
This commit is contained in:
Brad King 2013-12-02 12:06:43 -05:00 committed by CMake Topic Stage
commit 9d51c764f7
41 changed files with 427 additions and 26 deletions

View File

@ -74,3 +74,4 @@ All Policies
/policy/CMP0038
/policy/CMP0039
/policy/CMP0040
/policy/CMP0041

25
Help/policy/CMP0041.rst Normal file
View File

@ -0,0 +1,25 @@
CMP0041
-------
Error on relative include with generator expression.
Diagnostics in CMake 2.8.12 and lower silently ignored an entry in the
:prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` of a target if it contained a generator
expression at any position.
The path entries in that target property should not be relative. High-level
API should ensure that by adding either a source directory or a install
directory prefix, as appropriate.
As an additional diagnostic, the :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` generated
on an :prop_tgt:`IMPORTED` target for the install location should not contain
paths in the source directory or the build directory.
The OLD behavior for this policy is to ignore relative path entries if they
contain a generator expression. The NEW behavior for this policy is to report
an error if a generator expression appears in another location and the path is
relative.
This policy was introduced in CMake version 3.0.0. CMake version
|release| warns when the policy is not set and uses OLD behavior. Use
the cmake_policy command to set it to OLD or NEW explicitly.

View File

@ -233,26 +233,46 @@ static bool checkInterfaceDirs(const std::string &prepro,
const bool inSourceBuild = strcmp(topSourceDir, topBinaryDir) == 0;
bool hadFatalError = false;
for(std::vector<std::string>::iterator li = parts.begin();
li != parts.end(); ++li)
{
if (cmGeneratorExpression::Find(*li) != std::string::npos)
size_t genexPos = cmGeneratorExpression::Find(*li);
if (genexPos == 0)
{
continue;
}
cmake::MessageType messageType = cmake::FATAL_ERROR;
cmOStringStream e;
if (genexPos != std::string::npos)
{
switch (target->GetPolicyStatusCMP0041())
{
case cmPolicies::WARN:
messageType = cmake::WARNING;
e << target->GetMakefile()->GetPolicies()
->GetPolicyWarning(cmPolicies::CMP0041) << "\n";
break;
case cmPolicies::OLD:
continue;
case cmPolicies::REQUIRED_IF_USED:
case cmPolicies::REQUIRED_ALWAYS:
case cmPolicies::NEW:
hadFatalError = true;
break; // Issue fatal message.
}
}
if (cmHasLiteralPrefix(li->c_str(), "${_IMPORT_PREFIX}"))
{
continue;
}
if (!cmSystemTools::FileIsFullPath(li->c_str()))
{
cmOStringStream e;
e << "Target \"" << target->GetName() << "\" "
"INTERFACE_INCLUDE_DIRECTORIES property contains relative path:\n"
" \"" << *li << "\"";
target->GetMakefile()->IssueMessage(cmake::FATAL_ERROR,
e.str().c_str());
return false;
target->GetMakefile()->IssueMessage(messageType, e.str().c_str());
}
if (isSubDirectory(li->c_str(), installDir))
{
@ -260,29 +280,44 @@ static bool checkInterfaceDirs(const std::string &prepro,
}
if (isSubDirectory(li->c_str(), topBinaryDir))
{
cmOStringStream e;
e << "Target \"" << target->GetName() << "\" "
"INTERFACE_INCLUDE_DIRECTORIES property contains path:\n"
" \"" << *li << "\"\nwhich is prefixed in the build directory.";
target->GetMakefile()->IssueMessage(cmake::FATAL_ERROR,
e.str().c_str());
return false;
target->GetMakefile()->IssueMessage(messageType, e.str().c_str());
}
if (!inSourceBuild)
{
if (isSubDirectory(li->c_str(), topSourceDir))
{
cmOStringStream e;
e << "Target \"" << target->GetName() << "\" "
"INTERFACE_INCLUDE_DIRECTORIES property contains path:\n"
" \"" << *li << "\"\nwhich is prefixed in the source directory.";
target->GetMakefile()->IssueMessage(cmake::FATAL_ERROR,
e.str().c_str());
return false;
target->GetMakefile()->IssueMessage(messageType, e.str().c_str());
}
}
}
return true;
return !hadFatalError;
}
//----------------------------------------------------------------------------
static void prefixItems(std::string &exportDirs)
{
std::vector<std::string> entries;
cmGeneratorExpression::Split(exportDirs, entries);
exportDirs = "";
const char *sep = "";
for(std::vector<std::string>::const_iterator ei = entries.begin();
ei != entries.end(); ++ei)
{
exportDirs += sep;
sep = ";";
if (!cmSystemTools::FileIsFullPath(ei->c_str())
&& ei->find("${_IMPORT_PREFIX}") == std::string::npos)
{
exportDirs += "${_IMPORT_PREFIX}/";
}
exportDirs += *ei;
}
}
//----------------------------------------------------------------------------
@ -301,7 +336,10 @@ void cmExportFileGenerator::PopulateIncludeDirectoriesInterface(
cmListFileBacktrace lfbt;
cmGeneratorExpression ge(lfbt);
std::string dirs = tei->InterfaceIncludeDirectories;
std::string dirs = cmGeneratorExpression::Preprocess(
tei->InterfaceIncludeDirectories,
preprocessRule,
true);
this->ReplaceInstallPrefix(dirs);
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(dirs);
std::string exportDirs = cge->Evaluate(target->GetMakefile(), 0,
@ -330,6 +368,8 @@ void cmExportFileGenerator::PopulateIncludeDirectoriesInterface(
return;
}
prefixItems(exportDirs);
std::string includes = (input?input:"");
const char* sep = input ? ";" : "";
includes += sep + exportDirs;

View File

@ -245,7 +245,7 @@ static void prefixItems(const std::string &content, std::string &result,
result += sep;
sep = ";";
if (!cmSystemTools::FileIsFullPath(ei->c_str())
&& cmGeneratorExpression::Find(*ei) == std::string::npos)
&& cmGeneratorExpression::Find(*ei) != 0)
{
result += prefix;
}

View File

@ -228,11 +228,6 @@ void cmInstallCommandIncludesArgument::Parse(
for ( ; it != args->end(); ++it)
{
std::string dir = *it;
if (!cmSystemTools::FileIsFullPath(it->c_str())
&& cmGeneratorExpression::Find(*it) == std::string::npos)
{
dir = "$<INSTALL_PREFIX>/" + dir;
}
cmSystemTools::ConvertToUnixSlashes(dir);
this->IncludeDirs.push_back(dir);
}

View File

@ -306,6 +306,11 @@ cmPolicies::cmPolicies()
CMP0040, "CMP0040",
"The target in the TARGET signature of add_custom_command() must exist.",
3,0,0,0, cmPolicies::WARN);
this->DefinePolicy(
CMP0041, "CMP0041",
"Error on relative include with generator expression.",
3,0,0,0, cmPolicies::WARN);
}
cmPolicies::~cmPolicies()

View File

@ -94,6 +94,7 @@ public:
CMP0039, ///< Utility targets may not have link dependencies
CMP0040, ///< The target in the TARGET signature of
/// add_custom_command() must exist.
CMP0041, ///< Error on relative include with generator expression
/** \brief Always the last entry.
*

View File

@ -25,7 +25,8 @@
F(CMP0008) \
F(CMP0020) \
F(CMP0021) \
F(CMP0022)
F(CMP0022) \
F(CMP0041)
class cmake;
class cmMakefile;

View File

@ -50,7 +50,7 @@ std::string cmTargetIncludeDirectoriesCommand
it != content.end(); ++it)
{
if (cmSystemTools::FileIsFullPath(it->c_str())
|| cmGeneratorExpression::Find(*it) != std::string::npos)
|| cmGeneratorExpression::Find(*it) == 0)
{
dirs += sep + *it;
}

View File

@ -45,7 +45,8 @@ add_executable(consumer
target_include_directories(consumer
PRIVATE
$<TARGET_PROPERTY:target_include_directories,INTERFACE_INCLUDE_DIRECTORIES>
relative_dir
relative_dir
relative_dir/$<TARGET_PROPERTY:NAME>
)
# Test no items

View File

@ -3,6 +3,7 @@
#include "publicinclude.h"
#include "interfaceinclude.h"
#include "relative_dir.h"
#include "consumer.h"
#ifdef PRIVATEINCLUDE_DEFINE
#error Unexpected PRIVATEINCLUDE_DEFINE
@ -24,4 +25,8 @@
#error Expected RELATIVE_DIR_DEFINE
#endif
#ifndef CONSUMER_DEFINE
#error Expected CONSUMER_DEFINE
#endif
int main() { return 0; }

View File

@ -0,0 +1,2 @@
#define CONSUMER_DEFINE

View File

@ -311,7 +311,25 @@ install(TARGETS testLibRequired
INCLUDES DESTINATION
installIncludesTest
$<INSTALL_PREFIX>/installIncludesTest2
)
installIncludesTest3/$<TARGET_PROPERTY:NAME>
$<TARGET_PROPERTY:NAME>/installIncludesTest4
$<INSTALL_INTERFACE:installIncludesTest5$<0:>>
$<INSTALL_INTERFACE:$<0:>installIncludesTest6>
$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/installIncludesTest7>
)
target_include_directories(testLibRequired INTERFACE
# These can't be in the above install(INCLUDES DESTINATION call because
# that is only for installed interfaces. These directories are prefixes
# in the build dir, which is an error for the installed interface.
# We add them here so that we don't have to add conditions in the Import
# component of the test.
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5$<0:>>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/$<0:>installIncludesTest6>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7>
$<INSTALL_INTERFACE:installIncludesTest8/$<0:>>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8$<0:>>
)
install(TARGETS
testLibIncludeRequired1
testLibIncludeRequired2
@ -334,6 +352,18 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h" "// No content\n")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired/installIncludesTest3.h" "// No content\n")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4/installIncludesTest4.h" "// No content\n")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5/installIncludesTest5.h" "// No content\n")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest6")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest6/installIncludesTest6.h" "// No content\n")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7/installIncludesTest7.h" "// No content\n")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8/installIncludesTest8.h" "// No content\n")
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.h"
DESTINATION installIncludesTest
@ -342,6 +372,30 @@ install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h"
DESTINATION installIncludesTest2
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired/installIncludesTest3.h"
DESTINATION installIncludesTest3/testLibRequired
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4/installIncludesTest4.h"
DESTINATION testLibRequired/installIncludesTest4
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest5/installIncludesTest5.h"
DESTINATION installIncludesTest5
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest6/installIncludesTest6.h"
DESTINATION installIncludesTest6
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest7/installIncludesTest7.h"
DESTINATION installIncludesTest7
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest8/installIncludesTest8.h"
DESTINATION installIncludesTest8
)
install(TARGETS testLibDepends testSharedLibDepends EXPORT DependsExp DESTINATION lib )
install(EXPORT DependsExp FILE testLibDependsTargets.cmake DESTINATION lib/cmake/testLibDepends)

View File

@ -6,6 +6,12 @@
#include "installIncludesTest.h"
#include "installIncludesTest2.h"
#include "installIncludesTest3.h"
#include "installIncludesTest4.h"
#include "installIncludesTest5.h"
#include "installIncludesTest6.h"
#include "installIncludesTest7.h"
#include "installIncludesTest8.h"
#ifndef testLibRequired_IFACE_DEFINE
#error Expected testLibRequired_IFACE_DEFINE

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,20 @@
CMake Error in CMakeLists.txt:
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains relative path:
"include/\$<TARGET_PROPERTY:NAME>"
CMake Error in CMakeLists.txt:
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains path:
".*/Tests/RunCMake/CMP0041/include/\$<TARGET_PROPERTY:NAME>"
which is prefixed in the source directory.
CMake Error in CMakeLists.txt:
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains path:
".*/Tests/RunCMake/CMP0041/CMP0041-NEW-build/include/\$<TARGET_PROPERTY:NAME>"
which is prefixed in the build directory.

View File

@ -0,0 +1,12 @@
cmake_policy(SET CMP0041 NEW)
add_library(foo empty.cpp)
set_property(TARGET foo
PROPERTY INTERFACE_INCLUDE_DIRECTORIES
include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_SOURCE_DIR}/include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_BINARY_DIR}/include/$<TARGET_PROPERTY:NAME>
)
install(TARGETS foo EXPORT FooExport DESTINATION lib)
install(EXPORT FooExport DESTINATION lib/cmake)

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1 @@
^$

View File

@ -0,0 +1,12 @@
cmake_policy(SET CMP0041 OLD)
add_library(foo empty.cpp)
set_property(TARGET foo
PROPERTY INTERFACE_INCLUDE_DIRECTORIES
include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_SOURCE_DIR}/include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_BINARY_DIR}/include/$<TARGET_PROPERTY:NAME>
)
install(TARGETS foo EXPORT FooExport DESTINATION lib)
install(EXPORT FooExport DESTINATION lib/cmake)

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,32 @@
CMake Warning in CMakeLists.txt:
Policy CMP0041 is not set: Error on relative include with generator
expression. Run "cmake --help-policy CMP0041" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains relative path:
"include/\$<TARGET_PROPERTY:NAME>"
CMake Warning in CMakeLists.txt:
Policy CMP0041 is not set: Error on relative include with generator
expression. Run "cmake --help-policy CMP0041" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains path:
".*/Tests/RunCMake/CMP0041/include/\$<TARGET_PROPERTY:NAME>"
which is prefixed in the source directory.
CMake Warning in CMakeLists.txt:
Policy CMP0041 is not set: Error on relative include with generator
expression. Run "cmake --help-policy CMP0041" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains path:
".*/Tests/RunCMake/CMP0041/CMP0041-WARN-build/include/\$<TARGET_PROPERTY:NAME>"
which is prefixed in the build directory.

View File

@ -0,0 +1,10 @@
add_library(foo empty.cpp)
set_property(TARGET foo
PROPERTY INTERFACE_INCLUDE_DIRECTORIES
include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_SOURCE_DIR}/include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_BINARY_DIR}/include/$<TARGET_PROPERTY:NAME>
)
install(TARGETS foo EXPORT FooExport DESTINATION lib)
install(EXPORT FooExport DESTINATION lib/cmake)

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,22 @@
CMake Error in CMakeLists.txt:
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains path:
".*/Tests/RunCMake/CMP0041/include/\$<TARGET_PROPERTY:NAME>"
which is prefixed in the source directory.
CMake Error in CMakeLists.txt:
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains path:
".*/Tests/RunCMake/CMP0041/include/\$<TARGET_PROPERTY:NAME>"
which is prefixed in the source directory.
CMake Error in CMakeLists.txt:
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains path:
".*/Tests/RunCMake/CMP0041/CMP0041-tid-NEW-build/include/\$<TARGET_PROPERTY:NAME>"
which is prefixed in the build directory.

View File

@ -0,0 +1,11 @@
cmake_policy(SET CMP0041 NEW)
add_library(foo empty.cpp)
target_include_directories(foo INTERFACE
include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_SOURCE_DIR}/include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_BINARY_DIR}/include/$<TARGET_PROPERTY:NAME>
)
install(TARGETS foo EXPORT FooExport DESTINATION lib)
install(EXPORT FooExport DESTINATION lib/cmake)

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1 @@
^$

View File

@ -0,0 +1,11 @@
cmake_policy(SET CMP0041 OLD)
add_library(foo empty.cpp)
target_include_directories(foo INTERFACE
include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_SOURCE_DIR}/include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_BINARY_DIR}/include/$<TARGET_PROPERTY:NAME>
)
install(TARGETS foo EXPORT FooExport DESTINATION lib)
install(EXPORT FooExport DESTINATION lib/cmake)

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,34 @@
CMake Warning in CMakeLists.txt:
Policy CMP0041 is not set: Error on relative include with generator
expression. Run "cmake --help-policy CMP0041" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains path:
".*/Tests/RunCMake/CMP0041/include/\$<TARGET_PROPERTY:NAME>"
which is prefixed in the source directory.
CMake Warning in CMakeLists.txt:
Policy CMP0041 is not set: Error on relative include with generator
expression. Run "cmake --help-policy CMP0041" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains path:
".*/Tests/RunCMake/CMP0041/include/\$<TARGET_PROPERTY:NAME>"
which is prefixed in the source directory.
CMake Warning in CMakeLists.txt:
Policy CMP0041 is not set: Error on relative include with generator
expression. Run "cmake --help-policy CMP0041" for policy details. Use the
cmake_policy command to set the policy and suppress this warning.
Target "foo" INTERFACE_INCLUDE_DIRECTORIES property contains path:
".*/Tests/RunCMake/CMP0041/CMP0041-tid-WARN-build/include/\$<TARGET_PROPERTY:NAME>"
which is prefixed in the build directory.

View File

@ -0,0 +1,9 @@
add_library(foo empty.cpp)
target_include_directories(foo INTERFACE
include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_SOURCE_DIR}/include/$<TARGET_PROPERTY:NAME>
${CMAKE_CURRENT_BINARY_DIR}/include/$<TARGET_PROPERTY:NAME>
)
install(TARGETS foo EXPORT FooExport DESTINATION lib)
install(EXPORT FooExport DESTINATION lib/cmake)

View File

@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 2.8)
project(${RunCMake_TEST} CXX)
include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE)

View File

@ -0,0 +1,8 @@
include(RunCMake)
run_cmake(CMP0041-OLD)
run_cmake(CMP0041-NEW)
run_cmake(CMP0041-WARN)
run_cmake(CMP0041-tid-OLD)
run_cmake(CMP0041-tid-NEW)
run_cmake(CMP0041-tid-WARN)

View File

@ -0,0 +1,7 @@
#ifdef _WIN32
__declspec(dllexport)
#endif
int empty()
{
return 0;
}

View File

@ -60,6 +60,7 @@ add_RunCMake_test(CMP0037)
add_RunCMake_test(CMP0038)
add_RunCMake_test(CMP0039)
add_RunCMake_test(CMP0040)
add_RunCMake_test(CMP0041)
add_RunCMake_test(CTest)
if(UNIX AND "${CMAKE_TEST_GENERATOR}" MATCHES "Unix Makefiles")
add_RunCMake_test(CompilerChange)

View File

@ -1,3 +1,3 @@
cmake_minimum_required(VERSION 2.8.4)
project(${RunCMake_TEST} NONE)
project(${RunCMake_TEST} CXX)
include(${RunCMake_TEST}.cmake)

View File

@ -11,3 +11,4 @@ run_cmake(RelativePathInGenex)
run_cmake(CMP0021)
run_cmake(install_config)
run_cmake(incomplete-genex)
run_cmake(export-NOWARN)

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1 @@
^$

View File

@ -0,0 +1,62 @@
add_library(foo empty.cpp)
set_property(TARGET foo APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES $<0:>/include/subdir)
set_property(TARGET foo APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES $<INSTALL_PREFIX>/include/subdir)
set_property(TARGET foo APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/subdir>)
set_property(TARGET foo APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES $<INSTALL_INTERFACE:include/subdir>)
set_property(TARGET foo APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES $<INSTALL_INTERFACE:include/$<0:>>)
set_property(TARGET foo APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES $<INSTALL_INTERFACE:$<0:>/include>)
# target_include_directories(foo INTERFACE include/subdir) # Does and should warn. INSTALL_INTERFACE must not list src dir paths.
target_include_directories(foo INTERFACE $<0:>/include/subdir) # Does not and should not should warn, because it starts with a genex.
target_include_directories(foo INTERFACE $<INSTALL_PREFIX>/include/subdir)
target_include_directories(foo INTERFACE $<INSTALL_INTERFACE:include/subdir>)
target_include_directories(foo INTERFACE $<INSTALL_INTERFACE:include/$<0:>>)
install(TARGETS foo EXPORT FooTargets DESTINATION lib)
install(EXPORT FooTargets DESTINATION lib/cmake)
install(TARGETS foo EXPORT FooTargets2
DESTINATION lib
INCLUDES DESTINATION include # No warning. Implicit install prefix.
)
install(EXPORT FooTargets2 DESTINATION lib/cmake)
install(TARGETS foo EXPORT FooTargets3
DESTINATION lib
INCLUDES DESTINATION $<INSTALL_PREFIX>include
)
install(EXPORT FooTargets3 DESTINATION lib/cmake)
install(TARGETS foo EXPORT FooTargets4
DESTINATION lib
INCLUDES DESTINATION $<INSTALL_INTERFACE:include>
)
install(EXPORT FooTargets4 DESTINATION lib/cmake)
install(TARGETS foo EXPORT FooTargets5
DESTINATION lib
# The $<0:> is evaluated at export time, leaving 'include' behind, which should be treated as above.
INCLUDES DESTINATION $<INSTALL_INTERFACE:$<0:>include>
)
install(EXPORT FooTargets5 DESTINATION lib/cmake)
install(TARGETS foo EXPORT FooTargets6
DESTINATION lib
INCLUDES DESTINATION $<INSTALL_INTERFACE:include$<0:>>
)
install(EXPORT FooTargets6 DESTINATION lib/cmake)
install(TARGETS foo EXPORT FooTargets7
DESTINATION lib
INCLUDES DESTINATION include$<0:>
)
install(EXPORT FooTargets7 DESTINATION lib/cmake)
install(TARGETS foo EXPORT FooTargets8
DESTINATION lib
INCLUDES DESTINATION $<0:>include
)
install(EXPORT FooTargets8 DESTINATION lib/cmake)