Error on relative path in INCLUDE_DIRECTORIES target property.
Add policy CMP0021 to preserve existing behavior in projects expecting it from earlier CMake versions.
This commit is contained in:
parent
272431a84f
commit
eabefa8b02
|
@ -529,6 +529,20 @@ cmPolicies::cmPolicies()
|
||||||
"The NEW behavior for this policy is to link executables to "
|
"The NEW behavior for this policy is to link executables to "
|
||||||
"qtmain.lib automatically when they link to QtCore IMPORTED target.",
|
"qtmain.lib automatically when they link to QtCore IMPORTED target.",
|
||||||
2,8,11,0, cmPolicies::WARN);
|
2,8,11,0, cmPolicies::WARN);
|
||||||
|
|
||||||
|
this->DefinePolicy(
|
||||||
|
CMP0021, "CMP0021",
|
||||||
|
"Fatal error on relative paths in INCLUDE_DIRECTORIES target property.",
|
||||||
|
"CMake 2.8.10.2 and lower allowed the INCLUDE_DIRECTORIES target "
|
||||||
|
"property to contain relative paths. The base path for such relative "
|
||||||
|
"entries is not well defined. CMake 2.8.12 issues a FATAL_ERROR if the "
|
||||||
|
"INCLUDE_DIRECTORIES property contains a relative path."
|
||||||
|
"\n"
|
||||||
|
"The OLD behavior for this policy is not to warn about relative paths in "
|
||||||
|
"the INCLUDE_DIRECTORIES target property. "
|
||||||
|
"The NEW behavior for this policy is to issue a FATAL_ERROR if "
|
||||||
|
"INCLUDE_DIRECTORIES contains a relative path.",
|
||||||
|
2,8,11,20130516, cmPolicies::WARN);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmPolicies::~cmPolicies()
|
cmPolicies::~cmPolicies()
|
||||||
|
|
|
@ -70,6 +70,8 @@ public:
|
||||||
/// instead.
|
/// instead.
|
||||||
CMP0019, ///< No variable re-expansion in include and link info
|
CMP0019, ///< No variable re-expansion in include and link info
|
||||||
CMP0020, ///< Automatically link Qt executables to qtmain target
|
CMP0020, ///< Automatically link Qt executables to qtmain target
|
||||||
|
CMP0021, ///< Fatal error on relative paths in INCLUDE_DIRECTORIES
|
||||||
|
/// target property
|
||||||
|
|
||||||
/** \brief Always the last entry.
|
/** \brief Always the last entry.
|
||||||
*
|
*
|
||||||
|
|
|
@ -191,6 +191,7 @@ cmTarget::cmTarget()
|
||||||
this->PolicyStatusCMP0004 = cmPolicies::WARN;
|
this->PolicyStatusCMP0004 = cmPolicies::WARN;
|
||||||
this->PolicyStatusCMP0008 = cmPolicies::WARN;
|
this->PolicyStatusCMP0008 = cmPolicies::WARN;
|
||||||
this->PolicyStatusCMP0020 = cmPolicies::WARN;
|
this->PolicyStatusCMP0020 = cmPolicies::WARN;
|
||||||
|
this->PolicyStatusCMP0021 = cmPolicies::WARN;
|
||||||
this->LinkLibrariesAnalyzed = false;
|
this->LinkLibrariesAnalyzed = false;
|
||||||
this->HaveInstallRule = false;
|
this->HaveInstallRule = false;
|
||||||
this->DLLPlatform = false;
|
this->DLLPlatform = false;
|
||||||
|
@ -1568,6 +1569,8 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
||||||
this->Makefile->GetPolicyStatus(cmPolicies::CMP0008);
|
this->Makefile->GetPolicyStatus(cmPolicies::CMP0008);
|
||||||
this->PolicyStatusCMP0020 =
|
this->PolicyStatusCMP0020 =
|
||||||
this->Makefile->GetPolicyStatus(cmPolicies::CMP0020);
|
this->Makefile->GetPolicyStatus(cmPolicies::CMP0020);
|
||||||
|
this->PolicyStatusCMP0021 =
|
||||||
|
this->Makefile->GetPolicyStatus(cmPolicies::CMP0021);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -2876,14 +2879,41 @@ static void processIncludeDirectories(cmTarget *tgt,
|
||||||
|
|
||||||
if (!cmSystemTools::FileIsFullPath(li->c_str()))
|
if (!cmSystemTools::FileIsFullPath(li->c_str()))
|
||||||
{
|
{
|
||||||
|
cmOStringStream e;
|
||||||
|
bool noMessage = false;
|
||||||
|
cmake::MessageType messageType = cmake::FATAL_ERROR;
|
||||||
if (!(*it)->TargetName.empty())
|
if (!(*it)->TargetName.empty())
|
||||||
{
|
{
|
||||||
cmOStringStream e;
|
|
||||||
e << "Target \"" << (*it)->TargetName << "\" contains relative "
|
e << "Target \"" << (*it)->TargetName << "\" contains relative "
|
||||||
"path in its INTERFACE_INCLUDE_DIRECTORIES:\n"
|
"path in its INTERFACE_INCLUDE_DIRECTORIES:\n"
|
||||||
" \"" << *li << "\" ";
|
" \"" << *li << "\" ";
|
||||||
tgt->GetMakefile()->IssueMessage(cmake::FATAL_ERROR,
|
}
|
||||||
e.str().c_str());
|
else
|
||||||
|
{
|
||||||
|
switch(tgt->GetPolicyStatusCMP0021())
|
||||||
|
{
|
||||||
|
case cmPolicies::WARN:
|
||||||
|
{
|
||||||
|
cmOStringStream w;
|
||||||
|
e << (mf->GetPolicies()
|
||||||
|
->GetPolicyWarning(cmPolicies::CMP0021)) << "\n";
|
||||||
|
messageType = cmake::AUTHOR_WARNING;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case cmPolicies::OLD:
|
||||||
|
noMessage = true;
|
||||||
|
case cmPolicies::REQUIRED_IF_USED:
|
||||||
|
case cmPolicies::REQUIRED_ALWAYS:
|
||||||
|
case cmPolicies::NEW:
|
||||||
|
// Issue the fatal message.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
e << "Found relative path while evaluating include directories of "
|
||||||
|
"\"" << tgt->GetName() << "\":\n \"" << *li << "\"\n";
|
||||||
|
}
|
||||||
|
if (!noMessage)
|
||||||
|
{
|
||||||
|
tgt->GetMakefile()->IssueMessage(messageType, e.str().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,6 +106,10 @@ public:
|
||||||
cmPolicies::PolicyStatus GetPolicyStatusCMP0020() const
|
cmPolicies::PolicyStatus GetPolicyStatusCMP0020() const
|
||||||
{ return this->PolicyStatusCMP0020; }
|
{ return this->PolicyStatusCMP0020; }
|
||||||
|
|
||||||
|
/** Get the status of policy CMP0021 when the target was created. */
|
||||||
|
cmPolicies::PolicyStatus GetPolicyStatusCMP0021() const
|
||||||
|
{ return this->PolicyStatusCMP0021; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the list of the custom commands for this target
|
* Get the list of the custom commands for this target
|
||||||
*/
|
*/
|
||||||
|
@ -664,6 +668,7 @@ private:
|
||||||
cmPolicies::PolicyStatus PolicyStatusCMP0004;
|
cmPolicies::PolicyStatus PolicyStatusCMP0004;
|
||||||
cmPolicies::PolicyStatus PolicyStatusCMP0008;
|
cmPolicies::PolicyStatus PolicyStatusCMP0008;
|
||||||
cmPolicies::PolicyStatus PolicyStatusCMP0020;
|
cmPolicies::PolicyStatus PolicyStatusCMP0020;
|
||||||
|
cmPolicies::PolicyStatus PolicyStatusCMP0021;
|
||||||
|
|
||||||
// Internal representation details.
|
// Internal representation details.
|
||||||
friend class cmTargetInternals;
|
friend class cmTargetInternals;
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -0,0 +1,4 @@
|
||||||
|
CMake Error in CMakeLists.txt:
|
||||||
|
Found relative path while evaluating include directories of "userTarget":
|
||||||
|
|
||||||
|
"foo"
|
|
@ -0,0 +1,9 @@
|
||||||
|
enable_language(CXX)
|
||||||
|
|
||||||
|
cmake_policy(SET CMP0021 NEW)
|
||||||
|
|
||||||
|
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_include_directories(userTarget PRIVATE $<TARGET_PROPERTY:testTarget,INTERFACE_INCLUDE_DIRECTORIES>)
|
|
@ -8,3 +8,4 @@ run_cmake(BinaryDirectoryInInterface)
|
||||||
run_cmake(RelativePathInInterface)
|
run_cmake(RelativePathInInterface)
|
||||||
run_cmake(ImportedTarget)
|
run_cmake(ImportedTarget)
|
||||||
run_cmake(RelativePathInGenex)
|
run_cmake(RelativePathInGenex)
|
||||||
|
run_cmake(CMP0021)
|
||||||
|
|
Loading…
Reference in New Issue