install: Disallow installing export() result.
This commit is contained in:
parent
501c237a83
commit
b85d3b66c6
|
@ -119,3 +119,4 @@ All Policies
|
||||||
/policy/CMP0059
|
/policy/CMP0059
|
||||||
/policy/CMP0060
|
/policy/CMP0060
|
||||||
/policy/CMP0061
|
/policy/CMP0061
|
||||||
|
/policy/CMP0062
|
||||||
|
|
|
@ -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.
|
|
@ -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.
|
|
@ -871,6 +871,47 @@ bool cmInstallCommand::HandleFilesMode(std::vector<std::string> const& args)
|
||||||
return false;
|
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())
|
if (!ica.Finalize())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -211,6 +211,9 @@ class cmPolicy;
|
||||||
3, 3, 0, cmPolicies::WARN) \
|
3, 3, 0, cmPolicies::WARN) \
|
||||||
SELECT(POLICY, CMP0061, \
|
SELECT(POLICY, CMP0061, \
|
||||||
"CTest does not by default tell make to ignore errors (-i).", \
|
"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)
|
3, 3, 0, cmPolicies::WARN)
|
||||||
|
|
||||||
#define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)
|
#define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -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\)
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
||||||
|
0
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
||||||
|
0
|
|
@ -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.
|
|
@ -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)
|
|
@ -7,3 +7,6 @@ run_cmake(SkipInstallRulesWarning)
|
||||||
run_cmake(SkipInstallRulesNoWarning1)
|
run_cmake(SkipInstallRulesNoWarning1)
|
||||||
run_cmake(SkipInstallRulesNoWarning2)
|
run_cmake(SkipInstallRulesNoWarning2)
|
||||||
run_cmake(TARGETS-DESTINATION-bad)
|
run_cmake(TARGETS-DESTINATION-bad)
|
||||||
|
run_cmake(CMP0062-OLD)
|
||||||
|
run_cmake(CMP0062-NEW)
|
||||||
|
run_cmake(CMP0062-WARN)
|
||||||
|
|
Loading…
Reference in New Issue