ソースを参照

install: Disallow installing export() result.

Stephen Kelly 10 年 前
コミット
b85d3b66c6

+ 1 - 0
Help/manual/cmake-policies.7.rst

@@ -119,3 +119,4 @@ All Policies
    /policy/CMP0059
    /policy/CMP0060
    /policy/CMP0061
+   /policy/CMP0062

+ 27 - 0
Help/policy/CMP0062.rst

@@ -0,0 +1,27 @@
+CMP0062
+-------
+
+Disallow install() of export() result.
+
+The :command:`export()` command generates a file containing
+:ref:`Imported Targets`, which is suitable for use from the build
+directory.  It is not suitable for installation because it contains absolute
+paths to buildsystem locations, and is particular to a single build
+configuration.
+
+The :command:`install(EXPORT)` generates and installs files which contain
+:ref:`Imported Targets`.  These files are generated with relative paths
+(unless the user specifies absolute paths), and are designed for
+multi-configuration use.  See :ref:`Creating Packages` for more.
+
+CMake 3.3 no longer allows the use of the :command:`install(FILES)` command
+with the result of the :command:`export()` command.
+
+The ``OLD`` behavior for this policy is to allow installing the result of
+an :command:`export()` command.  The ``NEW`` behavior for this policy is
+not to allow installing the result of an :command:`export()` command.
+
+This policy was introduced in CMake version 3.3.  CMake version
+|release| warns when the policy is not set and uses ``OLD`` behavior.  Use
+the :command:`cmake_policy()` command to set it to ``OLD`` or ``NEW``
+explicitly.

+ 5 - 0
Help/release/dev/disallow-install-of-export.rst

@@ -0,0 +1,5 @@
+disallow-install-of-export
+--------------------------
+
+* Using the output of :command:`export()` with the :command:`install(FILES)`
+  command is no longer allowed.  See policy :policy:`CMP0062` for details.

+ 41 - 0
Source/cmInstallCommand.cxx

@@ -871,6 +871,47 @@ bool cmInstallCommand::HandleFilesMode(std::vector<std::string> const& args)
     return false;
     }
 
+  cmPolicies::PolicyStatus status =
+      this->Makefile->GetPolicyStatus(cmPolicies::CMP0062);
+
+  cmGlobalGenerator *gg = this->Makefile->GetGlobalGenerator();
+  for(std::vector<std::string>::const_iterator fileIt = filesVector.begin();
+      fileIt != filesVector.end(); ++fileIt)
+    {
+    if (gg->IsExportedTargetsFile(*fileIt))
+      {
+      const char *modal = 0;
+      std::ostringstream e;
+      cmake::MessageType messageType = cmake::AUTHOR_WARNING;
+
+      switch(status)
+        {
+        case cmPolicies::WARN:
+          e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0062) << "\n";
+          modal = "should";
+        case cmPolicies::OLD:
+          break;
+        case cmPolicies::REQUIRED_IF_USED:
+        case cmPolicies::REQUIRED_ALWAYS:
+        case cmPolicies::NEW:
+          modal = "may";
+          messageType = cmake::FATAL_ERROR;
+        }
+      if (modal)
+        {
+        e << "The file\n  " << *fileIt << "\nwas generated by the export() "
+          "command.  It " << modal << " not be installed with the "
+          "install() command.  Use the install(EXPORT) mechanism "
+          "instead.  See the cmake-packages(7) manual for more.\n";
+        this->Makefile->IssueMessage(messageType, e.str());
+        if (messageType == cmake::FATAL_ERROR)
+          {
+          return false;
+          }
+        }
+      }
+    }
+
   if (!ica.Finalize())
     {
     return false;

+ 3 - 0
Source/cmPolicies.h

@@ -211,6 +211,9 @@ class cmPolicy;
     3, 3, 0, cmPolicies::WARN) \
   SELECT(POLICY, CMP0061, \
     "CTest does not by default tell make to ignore errors (-i).", \
+    3, 3, 0, cmPolicies::WARN) \
+  SELECT(POLICY, CMP0062, \
+    "Disallow install() of export() result.", \
     3, 3, 0, cmPolicies::WARN)
 
 #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)

+ 1 - 0
Tests/RunCMake/install/CMP0062-NEW-result.txt

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

+ 11 - 0
Tests/RunCMake/install/CMP0062-NEW-stderr.txt

@@ -0,0 +1,11 @@
+CMake Error at CMP0062-NEW.cmake:[0-9]+ \(install\):
+  The file
+
+    .*Tests/RunCMake/install/CMP0062-NEW-build/exported.cmake
+
+  was generated by the export\(\) command.  It may not be installed with the
+  install\(\) command.  Use the install\(EXPORT\) mechanism instead.  See the
+  cmake-packages\(7\) manual for more.
+
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)

+ 6 - 0
Tests/RunCMake/install/CMP0062-NEW.cmake

@@ -0,0 +1,6 @@
+
+cmake_policy(SET CMP0062 NEW)
+
+add_library(iface INTERFACE)
+export(TARGETS iface FILE "${CMAKE_CURRENT_BINARY_DIR}/exported.cmake")
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/exported.cmake" DESTINATION cmake)

+ 1 - 0
Tests/RunCMake/install/CMP0062-OLD-result.txt

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

+ 6 - 0
Tests/RunCMake/install/CMP0062-OLD.cmake

@@ -0,0 +1,6 @@
+
+cmake_policy(SET CMP0062 OLD)
+
+add_library(iface INTERFACE)
+export(TARGETS iface FILE "${CMAKE_CURRENT_BINARY_DIR}/exported.cmake")
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/exported.cmake" DESTINATION cmake)

+ 1 - 0
Tests/RunCMake/install/CMP0062-WARN-result.txt

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

+ 16 - 0
Tests/RunCMake/install/CMP0062-WARN-stderr.txt

@@ -0,0 +1,16 @@
+CMake Warning \(dev\) at CMP0062-WARN.cmake:[0-9]+ \(install\):
+  Policy CMP0062 is not set: Disallow install\(\) of export\(\) result.  Run
+  "cmake --help-policy CMP0062" for policy details.  Use the cmake_policy
+  command to set the policy and suppress this warning.
+
+  The file
+
+    .*Tests/RunCMake/install/CMP0062-WARN-build/exported.cmake
+
+  was generated by the export\(\) command.  It should not be installed with the
+  install\(\) command.  Use the install\(EXPORT\) mechanism instead.  See the
+  cmake-packages\(7\) manual for more.
+
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)
+This warning is for project developers.  Use -Wno-dev to suppress it.

+ 4 - 0
Tests/RunCMake/install/CMP0062-WARN.cmake

@@ -0,0 +1,4 @@
+
+add_library(iface INTERFACE)
+export(TARGETS iface FILE "${CMAKE_CURRENT_BINARY_DIR}/exported.cmake")
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/exported.cmake" DESTINATION cmake)

+ 3 - 0
Tests/RunCMake/install/RunCMakeTest.cmake

@@ -7,3 +7,6 @@ run_cmake(SkipInstallRulesWarning)
 run_cmake(SkipInstallRulesNoWarning1)
 run_cmake(SkipInstallRulesNoWarning2)
 run_cmake(TARGETS-DESTINATION-bad)
+run_cmake(CMP0062-OLD)
+run_cmake(CMP0062-NEW)
+run_cmake(CMP0062-WARN)