Browse Source

Error on relative path in INCLUDE_DIRECTORIES target property.

Add policy CMP0021 to preserve existing behavior in projects expecting
it from earlier CMake versions.
Stephen Kelly 12 years ago
parent
commit
eabefa8b02

+ 14 - 0
Source/cmPolicies.cxx

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

+ 2 - 0
Source/cmPolicies.h

@@ -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.
      *

+ 33 - 3
Source/cmTarget.cxx

@@ -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;
           }
         }

+ 5 - 0
Source/cmTarget.h

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

+ 1 - 0
Tests/RunCMake/include_directories/CMP0021-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/include_directories/CMP0021-stderr.txt

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

+ 9 - 0
Tests/RunCMake/include_directories/CMP0021.cmake

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

+ 1 - 0
Tests/RunCMake/include_directories/RunCMakeTest.cmake

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