From b85d3b66c63afa1ce7f30439deee524241b1efdc Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 14 May 2015 19:08:27 +0200 Subject: [PATCH] install: Disallow installing export() result. --- Help/manual/cmake-policies.7.rst | 1 + Help/policy/CMP0062.rst | 27 ++++++++++++ .../dev/disallow-install-of-export.rst | 5 +++ Source/cmInstallCommand.cxx | 41 +++++++++++++++++++ Source/cmPolicies.h | 3 ++ Tests/RunCMake/install/CMP0062-NEW-result.txt | 1 + Tests/RunCMake/install/CMP0062-NEW-stderr.txt | 11 +++++ Tests/RunCMake/install/CMP0062-NEW.cmake | 6 +++ Tests/RunCMake/install/CMP0062-OLD-result.txt | 1 + Tests/RunCMake/install/CMP0062-OLD.cmake | 6 +++ .../RunCMake/install/CMP0062-WARN-result.txt | 1 + .../RunCMake/install/CMP0062-WARN-stderr.txt | 16 ++++++++ Tests/RunCMake/install/CMP0062-WARN.cmake | 4 ++ Tests/RunCMake/install/RunCMakeTest.cmake | 3 ++ 14 files changed, 126 insertions(+) create mode 100644 Help/policy/CMP0062.rst create mode 100644 Help/release/dev/disallow-install-of-export.rst create mode 100644 Tests/RunCMake/install/CMP0062-NEW-result.txt create mode 100644 Tests/RunCMake/install/CMP0062-NEW-stderr.txt create mode 100644 Tests/RunCMake/install/CMP0062-NEW.cmake create mode 100644 Tests/RunCMake/install/CMP0062-OLD-result.txt create mode 100644 Tests/RunCMake/install/CMP0062-OLD.cmake create mode 100644 Tests/RunCMake/install/CMP0062-WARN-result.txt create mode 100644 Tests/RunCMake/install/CMP0062-WARN-stderr.txt create mode 100644 Tests/RunCMake/install/CMP0062-WARN.cmake diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index e59cce7e9..2cc3a47f5 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -119,3 +119,4 @@ All Policies /policy/CMP0059 /policy/CMP0060 /policy/CMP0061 + /policy/CMP0062 diff --git a/Help/policy/CMP0062.rst b/Help/policy/CMP0062.rst new file mode 100644 index 000000000..e2f5a5a02 --- /dev/null +++ b/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. diff --git a/Help/release/dev/disallow-install-of-export.rst b/Help/release/dev/disallow-install-of-export.rst new file mode 100644 index 000000000..baee26d37 --- /dev/null +++ b/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. diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx index 24de1b5ce..899b088ae 100644 --- a/Source/cmInstallCommand.cxx +++ b/Source/cmInstallCommand.cxx @@ -871,6 +871,47 @@ bool cmInstallCommand::HandleFilesMode(std::vector const& args) return false; } + cmPolicies::PolicyStatus status = + this->Makefile->GetPolicyStatus(cmPolicies::CMP0062); + + cmGlobalGenerator *gg = this->Makefile->GetGlobalGenerator(); + for(std::vector::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; diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 536dcdcab..eb564949c 100644 --- a/Source/cmPolicies.h +++ b/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) diff --git a/Tests/RunCMake/install/CMP0062-NEW-result.txt b/Tests/RunCMake/install/CMP0062-NEW-result.txt new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/Tests/RunCMake/install/CMP0062-NEW-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/install/CMP0062-NEW-stderr.txt b/Tests/RunCMake/install/CMP0062-NEW-stderr.txt new file mode 100644 index 000000000..b03f629e8 --- /dev/null +++ b/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\) diff --git a/Tests/RunCMake/install/CMP0062-NEW.cmake b/Tests/RunCMake/install/CMP0062-NEW.cmake new file mode 100644 index 000000000..a696f56fc --- /dev/null +++ b/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) diff --git a/Tests/RunCMake/install/CMP0062-OLD-result.txt b/Tests/RunCMake/install/CMP0062-OLD-result.txt new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/Tests/RunCMake/install/CMP0062-OLD-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/install/CMP0062-OLD.cmake b/Tests/RunCMake/install/CMP0062-OLD.cmake new file mode 100644 index 000000000..94b809a98 --- /dev/null +++ b/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) diff --git a/Tests/RunCMake/install/CMP0062-WARN-result.txt b/Tests/RunCMake/install/CMP0062-WARN-result.txt new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/Tests/RunCMake/install/CMP0062-WARN-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/install/CMP0062-WARN-stderr.txt b/Tests/RunCMake/install/CMP0062-WARN-stderr.txt new file mode 100644 index 000000000..12ae74573 --- /dev/null +++ b/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. diff --git a/Tests/RunCMake/install/CMP0062-WARN.cmake b/Tests/RunCMake/install/CMP0062-WARN.cmake new file mode 100644 index 000000000..0435a640e --- /dev/null +++ b/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) diff --git a/Tests/RunCMake/install/RunCMakeTest.cmake b/Tests/RunCMake/install/RunCMakeTest.cmake index 714960355..a5f5bd0ec 100644 --- a/Tests/RunCMake/install/RunCMakeTest.cmake +++ b/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)