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:
Stephen Kelly 2013-03-26 18:08:29 +01:00 committed by Brad King
parent 272431a84f
commit eabefa8b02
8 changed files with 69 additions and 3 deletions

View File

@ -529,6 +529,20 @@ cmPolicies::cmPolicies()
"The NEW behavior for this policy is to link executables to "
"qtmain.lib automatically when they link to QtCore IMPORTED target.",
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()

View File

@ -70,6 +70,8 @@ public:
/// instead.
CMP0019, ///< No variable re-expansion in include and link info
CMP0020, ///< Automatically link Qt executables to qtmain target
CMP0021, ///< Fatal error on relative paths in INCLUDE_DIRECTORIES
/// target property
/** \brief Always the last entry.
*

View File

@ -191,6 +191,7 @@ cmTarget::cmTarget()
this->PolicyStatusCMP0004 = cmPolicies::WARN;
this->PolicyStatusCMP0008 = cmPolicies::WARN;
this->PolicyStatusCMP0020 = cmPolicies::WARN;
this->PolicyStatusCMP0021 = cmPolicies::WARN;
this->LinkLibrariesAnalyzed = false;
this->HaveInstallRule = false;
this->DLLPlatform = false;
@ -1568,6 +1569,8 @@ void cmTarget::SetMakefile(cmMakefile* mf)
this->Makefile->GetPolicyStatus(cmPolicies::CMP0008);
this->PolicyStatusCMP0020 =
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()))
{
cmOStringStream e;
bool noMessage = false;
cmake::MessageType messageType = cmake::FATAL_ERROR;
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());
}
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;
}
}

View File

@ -106,6 +106,10 @@ public:
cmPolicies::PolicyStatus GetPolicyStatusCMP0020() const
{ 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
*/
@ -664,6 +668,7 @@ private:
cmPolicies::PolicyStatus PolicyStatusCMP0004;
cmPolicies::PolicyStatus PolicyStatusCMP0008;
cmPolicies::PolicyStatus PolicyStatusCMP0020;
cmPolicies::PolicyStatus PolicyStatusCMP0021;
// Internal representation details.
friend class cmTargetInternals;

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,4 @@
CMake Error in CMakeLists.txt:
Found relative path while evaluating include directories of "userTarget":
"foo"

View File

@ -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>)

View File

@ -8,3 +8,4 @@ run_cmake(BinaryDirectoryInInterface)
run_cmake(RelativePathInInterface)
run_cmake(ImportedTarget)
run_cmake(RelativePathInGenex)
run_cmake(CMP0021)