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:
commit
9d51c764f7
|
@ -74,3 +74,4 @@ All Policies
|
|||
/policy/CMP0038
|
||||
/policy/CMP0039
|
||||
/policy/CMP0040
|
||||
/policy/CMP0041
|
||||
|
|
|
@ -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.
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -25,7 +25,8 @@
|
|||
F(CMP0008) \
|
||||
F(CMP0020) \
|
||||
F(CMP0021) \
|
||||
F(CMP0022)
|
||||
F(CMP0022) \
|
||||
F(CMP0041)
|
||||
|
||||
class cmake;
|
||||
class cmMakefile;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
#define CONSUMER_DEFINE
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -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.
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
|||
0
|
|
@ -0,0 +1 @@
|
|||
^$
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
|||
0
|
|
@ -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.
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -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.
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
|||
0
|
|
@ -0,0 +1 @@
|
|||
^$
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
|||
0
|
|
@ -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.
|
|
@ -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)
|
|
@ -0,0 +1,3 @@
|
|||
cmake_minimum_required(VERSION 2.8)
|
||||
project(${RunCMake_TEST} CXX)
|
||||
include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE)
|
|
@ -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)
|
|
@ -0,0 +1,7 @@
|
|||
#ifdef _WIN32
|
||||
__declspec(dllexport)
|
||||
#endif
|
||||
int empty()
|
||||
{
|
||||
return 0;
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
cmake_minimum_required(VERSION 2.8.4)
|
||||
project(${RunCMake_TEST} NONE)
|
||||
project(${RunCMake_TEST} CXX)
|
||||
include(${RunCMake_TEST}.cmake)
|
||||
|
|
|
@ -11,3 +11,4 @@ run_cmake(RelativePathInGenex)
|
|||
run_cmake(CMP0021)
|
||||
run_cmake(install_config)
|
||||
run_cmake(incomplete-genex)
|
||||
run_cmake(export-NOWARN)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
0
|
|
@ -0,0 +1 @@
|
|||
^$
|
|
@ -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)
|
Loading…
Reference in New Issue