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/CMP0038
|
||||||
/policy/CMP0039
|
/policy/CMP0039
|
||||||
/policy/CMP0040
|
/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;
|
const bool inSourceBuild = strcmp(topSourceDir, topBinaryDir) == 0;
|
||||||
|
|
||||||
|
bool hadFatalError = false;
|
||||||
|
|
||||||
for(std::vector<std::string>::iterator li = parts.begin();
|
for(std::vector<std::string>::iterator li = parts.begin();
|
||||||
li != parts.end(); ++li)
|
li != parts.end(); ++li)
|
||||||
{
|
{
|
||||||
if (cmGeneratorExpression::Find(*li) != std::string::npos)
|
size_t genexPos = cmGeneratorExpression::Find(*li);
|
||||||
|
if (genexPos == 0)
|
||||||
{
|
{
|
||||||
continue;
|
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}"))
|
if (cmHasLiteralPrefix(li->c_str(), "${_IMPORT_PREFIX}"))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!cmSystemTools::FileIsFullPath(li->c_str()))
|
if (!cmSystemTools::FileIsFullPath(li->c_str()))
|
||||||
{
|
{
|
||||||
cmOStringStream e;
|
|
||||||
e << "Target \"" << target->GetName() << "\" "
|
e << "Target \"" << target->GetName() << "\" "
|
||||||
"INTERFACE_INCLUDE_DIRECTORIES property contains relative path:\n"
|
"INTERFACE_INCLUDE_DIRECTORIES property contains relative path:\n"
|
||||||
" \"" << *li << "\"";
|
" \"" << *li << "\"";
|
||||||
target->GetMakefile()->IssueMessage(cmake::FATAL_ERROR,
|
target->GetMakefile()->IssueMessage(messageType, e.str().c_str());
|
||||||
e.str().c_str());
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
if (isSubDirectory(li->c_str(), installDir))
|
if (isSubDirectory(li->c_str(), installDir))
|
||||||
{
|
{
|
||||||
|
@ -260,29 +280,44 @@ static bool checkInterfaceDirs(const std::string &prepro,
|
||||||
}
|
}
|
||||||
if (isSubDirectory(li->c_str(), topBinaryDir))
|
if (isSubDirectory(li->c_str(), topBinaryDir))
|
||||||
{
|
{
|
||||||
cmOStringStream e;
|
|
||||||
e << "Target \"" << target->GetName() << "\" "
|
e << "Target \"" << target->GetName() << "\" "
|
||||||
"INTERFACE_INCLUDE_DIRECTORIES property contains path:\n"
|
"INTERFACE_INCLUDE_DIRECTORIES property contains path:\n"
|
||||||
" \"" << *li << "\"\nwhich is prefixed in the build directory.";
|
" \"" << *li << "\"\nwhich is prefixed in the build directory.";
|
||||||
target->GetMakefile()->IssueMessage(cmake::FATAL_ERROR,
|
target->GetMakefile()->IssueMessage(messageType, e.str().c_str());
|
||||||
e.str().c_str());
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
if (!inSourceBuild)
|
if (!inSourceBuild)
|
||||||
{
|
{
|
||||||
if (isSubDirectory(li->c_str(), topSourceDir))
|
if (isSubDirectory(li->c_str(), topSourceDir))
|
||||||
{
|
{
|
||||||
cmOStringStream e;
|
|
||||||
e << "Target \"" << target->GetName() << "\" "
|
e << "Target \"" << target->GetName() << "\" "
|
||||||
"INTERFACE_INCLUDE_DIRECTORIES property contains path:\n"
|
"INTERFACE_INCLUDE_DIRECTORIES property contains path:\n"
|
||||||
" \"" << *li << "\"\nwhich is prefixed in the source directory.";
|
" \"" << *li << "\"\nwhich is prefixed in the source directory.";
|
||||||
target->GetMakefile()->IssueMessage(cmake::FATAL_ERROR,
|
target->GetMakefile()->IssueMessage(messageType, e.str().c_str());
|
||||||
e.str().c_str());
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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;
|
cmListFileBacktrace lfbt;
|
||||||
cmGeneratorExpression ge(lfbt);
|
cmGeneratorExpression ge(lfbt);
|
||||||
|
|
||||||
std::string dirs = tei->InterfaceIncludeDirectories;
|
std::string dirs = cmGeneratorExpression::Preprocess(
|
||||||
|
tei->InterfaceIncludeDirectories,
|
||||||
|
preprocessRule,
|
||||||
|
true);
|
||||||
this->ReplaceInstallPrefix(dirs);
|
this->ReplaceInstallPrefix(dirs);
|
||||||
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(dirs);
|
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(dirs);
|
||||||
std::string exportDirs = cge->Evaluate(target->GetMakefile(), 0,
|
std::string exportDirs = cge->Evaluate(target->GetMakefile(), 0,
|
||||||
|
@ -330,6 +368,8 @@ void cmExportFileGenerator::PopulateIncludeDirectoriesInterface(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prefixItems(exportDirs);
|
||||||
|
|
||||||
std::string includes = (input?input:"");
|
std::string includes = (input?input:"");
|
||||||
const char* sep = input ? ";" : "";
|
const char* sep = input ? ";" : "";
|
||||||
includes += sep + exportDirs;
|
includes += sep + exportDirs;
|
||||||
|
|
|
@ -245,7 +245,7 @@ static void prefixItems(const std::string &content, std::string &result,
|
||||||
result += sep;
|
result += sep;
|
||||||
sep = ";";
|
sep = ";";
|
||||||
if (!cmSystemTools::FileIsFullPath(ei->c_str())
|
if (!cmSystemTools::FileIsFullPath(ei->c_str())
|
||||||
&& cmGeneratorExpression::Find(*ei) == std::string::npos)
|
&& cmGeneratorExpression::Find(*ei) != 0)
|
||||||
{
|
{
|
||||||
result += prefix;
|
result += prefix;
|
||||||
}
|
}
|
||||||
|
|
|
@ -228,11 +228,6 @@ void cmInstallCommandIncludesArgument::Parse(
|
||||||
for ( ; it != args->end(); ++it)
|
for ( ; it != args->end(); ++it)
|
||||||
{
|
{
|
||||||
std::string dir = *it;
|
std::string dir = *it;
|
||||||
if (!cmSystemTools::FileIsFullPath(it->c_str())
|
|
||||||
&& cmGeneratorExpression::Find(*it) == std::string::npos)
|
|
||||||
{
|
|
||||||
dir = "$<INSTALL_PREFIX>/" + dir;
|
|
||||||
}
|
|
||||||
cmSystemTools::ConvertToUnixSlashes(dir);
|
cmSystemTools::ConvertToUnixSlashes(dir);
|
||||||
this->IncludeDirs.push_back(dir);
|
this->IncludeDirs.push_back(dir);
|
||||||
}
|
}
|
||||||
|
|
|
@ -306,6 +306,11 @@ cmPolicies::cmPolicies()
|
||||||
CMP0040, "CMP0040",
|
CMP0040, "CMP0040",
|
||||||
"The target in the TARGET signature of add_custom_command() must exist.",
|
"The target in the TARGET signature of add_custom_command() must exist.",
|
||||||
3,0,0,0, cmPolicies::WARN);
|
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()
|
cmPolicies::~cmPolicies()
|
||||||
|
|
|
@ -94,6 +94,7 @@ public:
|
||||||
CMP0039, ///< Utility targets may not have link dependencies
|
CMP0039, ///< Utility targets may not have link dependencies
|
||||||
CMP0040, ///< The target in the TARGET signature of
|
CMP0040, ///< The target in the TARGET signature of
|
||||||
/// add_custom_command() must exist.
|
/// add_custom_command() must exist.
|
||||||
|
CMP0041, ///< Error on relative include with generator expression
|
||||||
|
|
||||||
/** \brief Always the last entry.
|
/** \brief Always the last entry.
|
||||||
*
|
*
|
||||||
|
|
|
@ -25,7 +25,8 @@
|
||||||
F(CMP0008) \
|
F(CMP0008) \
|
||||||
F(CMP0020) \
|
F(CMP0020) \
|
||||||
F(CMP0021) \
|
F(CMP0021) \
|
||||||
F(CMP0022)
|
F(CMP0022) \
|
||||||
|
F(CMP0041)
|
||||||
|
|
||||||
class cmake;
|
class cmake;
|
||||||
class cmMakefile;
|
class cmMakefile;
|
||||||
|
|
|
@ -50,7 +50,7 @@ std::string cmTargetIncludeDirectoriesCommand
|
||||||
it != content.end(); ++it)
|
it != content.end(); ++it)
|
||||||
{
|
{
|
||||||
if (cmSystemTools::FileIsFullPath(it->c_str())
|
if (cmSystemTools::FileIsFullPath(it->c_str())
|
||||||
|| cmGeneratorExpression::Find(*it) != std::string::npos)
|
|| cmGeneratorExpression::Find(*it) == 0)
|
||||||
{
|
{
|
||||||
dirs += sep + *it;
|
dirs += sep + *it;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,7 @@ target_include_directories(consumer
|
||||||
PRIVATE
|
PRIVATE
|
||||||
$<TARGET_PROPERTY:target_include_directories,INTERFACE_INCLUDE_DIRECTORIES>
|
$<TARGET_PROPERTY:target_include_directories,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
relative_dir
|
relative_dir
|
||||||
|
relative_dir/$<TARGET_PROPERTY:NAME>
|
||||||
)
|
)
|
||||||
|
|
||||||
# Test no items
|
# Test no items
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "publicinclude.h"
|
#include "publicinclude.h"
|
||||||
#include "interfaceinclude.h"
|
#include "interfaceinclude.h"
|
||||||
#include "relative_dir.h"
|
#include "relative_dir.h"
|
||||||
|
#include "consumer.h"
|
||||||
|
|
||||||
#ifdef PRIVATEINCLUDE_DEFINE
|
#ifdef PRIVATEINCLUDE_DEFINE
|
||||||
#error Unexpected PRIVATEINCLUDE_DEFINE
|
#error Unexpected PRIVATEINCLUDE_DEFINE
|
||||||
|
@ -24,4 +25,8 @@
|
||||||
#error Expected RELATIVE_DIR_DEFINE
|
#error Expected RELATIVE_DIR_DEFINE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONSUMER_DEFINE
|
||||||
|
#error Expected CONSUMER_DEFINE
|
||||||
|
#endif
|
||||||
|
|
||||||
int main() { return 0; }
|
int main() { return 0; }
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
#define CONSUMER_DEFINE
|
|
@ -311,7 +311,25 @@ install(TARGETS testLibRequired
|
||||||
INCLUDES DESTINATION
|
INCLUDES DESTINATION
|
||||||
installIncludesTest
|
installIncludesTest
|
||||||
$<INSTALL_PREFIX>/installIncludesTest2
|
$<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
|
install(TARGETS
|
||||||
testLibIncludeRequired1
|
testLibIncludeRequired1
|
||||||
testLibIncludeRequired2
|
testLibIncludeRequired2
|
||||||
|
@ -334,6 +352,18 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.
|
||||||
|
|
||||||
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2")
|
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2")
|
||||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h" "// No content\n")
|
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
|
install(FILES
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.h"
|
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.h"
|
||||||
DESTINATION installIncludesTest
|
DESTINATION installIncludesTest
|
||||||
|
@ -342,6 +372,30 @@ install(FILES
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h"
|
"${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h"
|
||||||
DESTINATION installIncludesTest2
|
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(TARGETS testLibDepends testSharedLibDepends EXPORT DependsExp DESTINATION lib )
|
||||||
install(EXPORT DependsExp FILE testLibDependsTargets.cmake DESTINATION lib/cmake/testLibDepends)
|
install(EXPORT DependsExp FILE testLibDependsTargets.cmake DESTINATION lib/cmake/testLibDepends)
|
||||||
|
|
|
@ -6,6 +6,12 @@
|
||||||
|
|
||||||
#include "installIncludesTest.h"
|
#include "installIncludesTest.h"
|
||||||
#include "installIncludesTest2.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
|
#ifndef testLibRequired_IFACE_DEFINE
|
||||||
#error Expected 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(CMP0038)
|
||||||
add_RunCMake_test(CMP0039)
|
add_RunCMake_test(CMP0039)
|
||||||
add_RunCMake_test(CMP0040)
|
add_RunCMake_test(CMP0040)
|
||||||
|
add_RunCMake_test(CMP0041)
|
||||||
add_RunCMake_test(CTest)
|
add_RunCMake_test(CTest)
|
||||||
if(UNIX AND "${CMAKE_TEST_GENERATOR}" MATCHES "Unix Makefiles")
|
if(UNIX AND "${CMAKE_TEST_GENERATOR}" MATCHES "Unix Makefiles")
|
||||||
add_RunCMake_test(CompilerChange)
|
add_RunCMake_test(CompilerChange)
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
cmake_minimum_required(VERSION 2.8.4)
|
cmake_minimum_required(VERSION 2.8.4)
|
||||||
project(${RunCMake_TEST} NONE)
|
project(${RunCMake_TEST} CXX)
|
||||||
include(${RunCMake_TEST}.cmake)
|
include(${RunCMake_TEST}.cmake)
|
||||||
|
|
|
@ -11,3 +11,4 @@ run_cmake(RelativePathInGenex)
|
||||||
run_cmake(CMP0021)
|
run_cmake(CMP0021)
|
||||||
run_cmake(install_config)
|
run_cmake(install_config)
|
||||||
run_cmake(incomplete-genex)
|
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