mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-05 21:31:08 -06:00
add_library: Reject shared libraries on platforms that do not support them
Add policy CMP0164 to provide compatibility. Fixes: #25759
This commit is contained in:
@@ -84,6 +84,13 @@ See also :prop_sf:`HEADER_FILE_ONLY` on what to do if some sources are
|
|||||||
pre-processed, and you want to have the original sources reachable from
|
pre-processed, and you want to have the original sources reachable from
|
||||||
within IDE.
|
within IDE.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.30
|
||||||
|
|
||||||
|
On platforms that do not support shared libraries, ``add_library``
|
||||||
|
now fails on calls creating ``SHARED`` libraries instead of
|
||||||
|
automatically converting them to ``STATIC`` libraries as before.
|
||||||
|
See policy :policy:`CMP0164`.
|
||||||
|
|
||||||
Object Libraries
|
Object Libraries
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ Policies Introduced by CMake 3.30
|
|||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
CMP0164: add_library() rejects SHARED libraries when not supported by the platform. </policy/CMP0164>
|
||||||
CMP0163: The GENERATED source file property is now visible in all directories. </policy/CMP0163>
|
CMP0163: The GENERATED source file property is now visible in all directories. </policy/CMP0163>
|
||||||
CMP0162: Visual Studio generators add UseDebugLibraries indicators by default. </policy/CMP0162>
|
CMP0162: Visual Studio generators add UseDebugLibraries indicators by default. </policy/CMP0162>
|
||||||
|
|
||||||
|
|||||||
31
Help/policy/CMP0164.rst
Normal file
31
Help/policy/CMP0164.rst
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
CMP0164
|
||||||
|
-------
|
||||||
|
|
||||||
|
.. versionadded:: 3.30
|
||||||
|
|
||||||
|
:command:`add_library` rejects ``SHARED`` libraries when not supported by
|
||||||
|
the platform.
|
||||||
|
|
||||||
|
In CMake 3.29 and below, on platforms that do not support shared libraries
|
||||||
|
(:prop_gbl:`TARGET_SUPPORTS_SHARED_LIBS` is ``false``), the
|
||||||
|
:command:`add_library` command automatically converted ``SHARED`` libraries to
|
||||||
|
``STATIC`` libraries to help users build projects on such platforms. However,
|
||||||
|
the semantics of shared and static libraries are different enough that such
|
||||||
|
automatic conversion cannot work in general. Projects using shared libraries
|
||||||
|
need to be ported to such platforms on a case-by-case basis.
|
||||||
|
|
||||||
|
In CMake 3.30 and above, :command:`add_library` prefers to reject creation
|
||||||
|
of shared libraries on platforms that do not support them, and fail with a
|
||||||
|
fatal error message. This policy provides compatibility for projects that
|
||||||
|
happened to work with the automatic conversion to static libraries and have
|
||||||
|
not been updated with an explicit port.
|
||||||
|
|
||||||
|
The ``OLD`` behavior for this policy is to implicitly create a static
|
||||||
|
library with a developer warning. The ``NEW`` behavior for this policy is
|
||||||
|
to fail.
|
||||||
|
|
||||||
|
.. |INTRODUCED_IN_CMAKE_VERSION| replace:: 3.30
|
||||||
|
.. |WARNS_OR_DOES_NOT_WARN| replace:: does *not* warn about the behavior change
|
||||||
|
.. include:: STANDARD_ADVICE.txt
|
||||||
|
|
||||||
|
.. include:: DEPRECATED.txt
|
||||||
6
Help/release/dev/add_library-no-static-fallback.rst
Normal file
6
Help/release/dev/add_library-no-static-fallback.rst
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
add_library-no-static-fallback
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
* On platforms that do not support shared libraries, the :command:`add_library`
|
||||||
|
command now rejects creation of shared libraries instead of automatically
|
||||||
|
converting them to static libraries. See policy :policy:`CMP0164`.
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "cmState.h"
|
#include "cmState.h"
|
||||||
#include "cmStateTypes.h"
|
#include "cmStateTypes.h"
|
||||||
#include "cmStringAlgorithms.h"
|
#include "cmStringAlgorithms.h"
|
||||||
|
#include "cmSystemTools.h"
|
||||||
#include "cmTarget.h"
|
#include "cmTarget.h"
|
||||||
#include "cmValue.h"
|
#include "cmValue.h"
|
||||||
|
|
||||||
@@ -226,14 +227,35 @@ bool cmAddLibraryCommand(std::vector<std::string> const& args,
|
|||||||
if ((type == cmStateEnums::SHARED_LIBRARY ||
|
if ((type == cmStateEnums::SHARED_LIBRARY ||
|
||||||
type == cmStateEnums::MODULE_LIBRARY) &&
|
type == cmStateEnums::MODULE_LIBRARY) &&
|
||||||
!mf.GetState()->GetGlobalPropertyAsBool("TARGET_SUPPORTS_SHARED_LIBS")) {
|
!mf.GetState()->GetGlobalPropertyAsBool("TARGET_SUPPORTS_SHARED_LIBS")) {
|
||||||
mf.IssueMessage(
|
switch (status.GetMakefile().GetPolicyStatus(cmPolicies::CMP0164)) {
|
||||||
MessageType::AUTHOR_WARNING,
|
case cmPolicies::WARN:
|
||||||
cmStrCat(
|
mf.IssueMessage(
|
||||||
"ADD_LIBRARY called with ",
|
MessageType::AUTHOR_WARNING,
|
||||||
(type == cmStateEnums::SHARED_LIBRARY ? "SHARED" : "MODULE"),
|
cmStrCat(
|
||||||
" option but the target platform does not support dynamic linking. ",
|
"ADD_LIBRARY called with ",
|
||||||
"Building a STATIC library instead. This may lead to problems."));
|
(type == cmStateEnums::SHARED_LIBRARY ? "SHARED" : "MODULE"),
|
||||||
type = cmStateEnums::STATIC_LIBRARY;
|
" option but the target platform does not support dynamic "
|
||||||
|
"linking. ",
|
||||||
|
"Building a STATIC library instead. This may lead to problems."));
|
||||||
|
CM_FALLTHROUGH;
|
||||||
|
case cmPolicies::OLD:
|
||||||
|
type = cmStateEnums::STATIC_LIBRARY;
|
||||||
|
break;
|
||||||
|
case cmPolicies::NEW:
|
||||||
|
case cmPolicies::REQUIRED_IF_USED:
|
||||||
|
case cmPolicies::REQUIRED_ALWAYS:
|
||||||
|
mf.IssueMessage(
|
||||||
|
MessageType::FATAL_ERROR,
|
||||||
|
cmStrCat(
|
||||||
|
"ADD_LIBRARY called with ",
|
||||||
|
(type == cmStateEnums::SHARED_LIBRARY ? "SHARED" : "MODULE"),
|
||||||
|
" option but the target platform does not support dynamic "
|
||||||
|
"linking."));
|
||||||
|
cmSystemTools::SetFatalErrorOccurred();
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle imported target creation.
|
// Handle imported target creation.
|
||||||
|
|||||||
@@ -501,7 +501,11 @@ class cmMakefile;
|
|||||||
SELECT( \
|
SELECT( \
|
||||||
POLICY, CMP0163, \
|
POLICY, CMP0163, \
|
||||||
"The GENERATED source file property is now visible in all directories.", \
|
"The GENERATED source file property is now visible in all directories.", \
|
||||||
3, 30, 0, cmPolicies::WARN)
|
3, 30, 0, cmPolicies::WARN) \
|
||||||
|
SELECT(POLICY, CMP0164, \
|
||||||
|
"add_library() rejects SHARED libraries when not supported by the " \
|
||||||
|
"platform.", \
|
||||||
|
3, 30, 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)
|
||||||
#define CM_FOR_EACH_POLICY_ID(POLICY) \
|
#define CM_FOR_EACH_POLICY_ID(POLICY) \
|
||||||
|
|||||||
@@ -22,3 +22,7 @@ run_cmake(STATICwithNoSourcesButLinkObjects)
|
|||||||
run_cmake(SHAREDwithNoSourcesButLinkObjects)
|
run_cmake(SHAREDwithNoSourcesButLinkObjects)
|
||||||
run_cmake(MODULEwithNoSourcesButLinkObjects)
|
run_cmake(MODULEwithNoSourcesButLinkObjects)
|
||||||
run_cmake(UNKNOWNwithNoSourcesButLinkObjects)
|
run_cmake(UNKNOWNwithNoSourcesButLinkObjects)
|
||||||
|
|
||||||
|
run_cmake(TARGET_SUPPORTS_SHARED_LIBS_CMP0164_OLD)
|
||||||
|
run_cmake(TARGET_SUPPORTS_SHARED_LIBS_CMP0164_NEW)
|
||||||
|
run_cmake(TARGET_SUPPORTS_SHARED_LIBS_CMP0164_WARN)
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
1
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
^CMake Error at TARGET_SUPPORTS_SHARED_LIBS_CMP0164_NEW.cmake:[0-9]+ \(add_library\):
|
||||||
|
ADD_LIBRARY called with SHARED option but the target platform does not
|
||||||
|
support dynamic linking.
|
||||||
|
Call Stack \(most recent call first\):
|
||||||
|
CMakeLists.txt:[0-9]+ \(include\)$
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
enable_language(CXX)
|
||||||
|
cmake_policy(SET CMP0164 NEW)
|
||||||
|
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
|
||||||
|
add_library(someLib SHARED test.cpp)
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
enable_language(CXX)
|
||||||
|
cmake_policy(SET CMP0164 OLD)
|
||||||
|
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
|
||||||
|
|
||||||
|
add_library(someLib SHARED test.cpp)
|
||||||
|
get_target_property(someLibType someLib TYPE)
|
||||||
|
if(NOT someLibType STREQUAL "STATIC_LIBRARY")
|
||||||
|
message(FATAL_ERROR "expected type does not match")
|
||||||
|
endif()
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
^CMake Warning \(dev\) at TARGET_SUPPORTS_SHARED_LIBS_CMP0164_WARN.cmake:[0-9]+ \(add_library\):
|
||||||
|
ADD_LIBRARY called with SHARED option but the target platform does not
|
||||||
|
support dynamic linking. Building a STATIC library instead. This may lead
|
||||||
|
to problems.
|
||||||
|
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,3 @@
|
|||||||
|
enable_language(CXX)
|
||||||
|
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
|
||||||
|
add_library(someLib SHARED test.cpp)
|
||||||
Reference in New Issue
Block a user