CPack: Change CPACK_PRODUCTBUILD_DOMAINS default to true (CMP0161)

Fixes: #23351
This commit is contained in:
Craig Scott 2024-01-28 17:57:58 +11:00
parent 4e7f2397e4
commit 339ae33e55
No known key found for this signature in database
GPG Key ID: 6FF37CBDCCADED9F
14 changed files with 99 additions and 3 deletions

View File

@ -91,8 +91,9 @@ macOS using ProductBuild:
.. versionadded:: 3.23
This option enables more granular control over where the product may be
installed. When it is set to true, a ``domains`` element of the following
form will be added to the productbuild Distribution XML:
installed. When it is set to true (see policy :policy:`CMP0161`), a
``domains`` element of the following form will be added to the
productbuild Distribution XML:
.. code-block:: xml

View File

@ -57,6 +57,7 @@ Policies Introduced by CMake 3.29
.. toctree::
:maxdepth: 1
CMP0161: CPACK_PRODUCTBUILD_DOMAINS defaults to true. </policy/CMP0161>
CMP0160: More read-only target properties now error when trying to set them. </policy/CMP0160>
CMP0159: file(STRINGS) with REGEX updates CMAKE_MATCH_<n>. </policy/CMP0159>
CMP0158: add_test() honors CMAKE_CROSSCOMPILING_EMULATOR only when cross-compiling. </policy/CMP0158>

36
Help/policy/CMP0161.rst Normal file
View File

@ -0,0 +1,36 @@
CMP0161
-------
.. versionadded:: 3.29
The :variable:`CPACK_PRODUCTBUILD_DOMAINS` variable defaults to true.
Before CMake 3.29, the :variable:`CPACK_PRODUCTBUILD_DOMAINS` variable is
unset by default. When using the :cpack_gen:`CPack productbuild Generator`,
this disables the use of the ``domains`` attribute in the productbuild
Distribution XML, and falls back to the ``auth`` attribute instead.
These attributes control where a productbuild package is allowed to be
installed. But the ``auth`` attribute has been deprecated by Apple,
so projects should migrate to using ``domains`` instead.
CMake 3.29 and above prefer to use a default value of true for
:variable:`CPACK_PRODUCTBUILD_DOMAINS`, which means ``domains`` will be used
by default unless the project explicitly sets
:variable:`CPACK_PRODUCTBUILD_DOMAINS` to false.
This policy provides compatibility with projects that enabled the
:cpack_gen:`CPack productbuild Generator`, but did not explicitly set
:variable:`CPACK_PRODUCTBUILD_DOMAINS`.
The ``OLD`` behavior for this policy is to leave
:variable:`CPACK_PRODUCTBUILD_DOMAINS` unset if it hasn't been set.
The ``NEW`` behavior for this policy is to use a default value of true for
:variable:`CPACK_PRODUCTBUILD_DOMAINS`.
.. |INTRODUCED_IN_CMAKE_VERSION| replace:: 3.29
.. |WARNS_OR_DOES_NOT_WARN| replace:: warns
.. include:: STANDARD_ADVICE.txt
Note that a warning will only be emitted if the
:variable:`CPACK_BINARY_PRODUCTBUILD <CPACK_BINARY_<GENNAME>>` variable is
set to true and the project is being built for an Apple platform.
.. include:: DEPRECATED.txt

View File

@ -0,0 +1,5 @@
productbuild-domains-policy
---------------------------
* The :variable:`CPACK_PRODUCTBUILD_DOMAINS` variable now defaults to true.
See policy :policy:`CMP0161`.

View File

@ -883,6 +883,24 @@ endif()
# WiX specific variables
_cpack_set_default(CPACK_WIX_SIZEOF_VOID_P "${CMAKE_SIZEOF_VOID_P}")
# productbuild specific variables
cmake_policy(GET CMP0161 _CPack_CMP0161)
if("x${_CPack_CMP0161}x" STREQUAL "xNEWx")
_cpack_set_default(CPACK_PRODUCTBUILD_DOMAINS ON)
elseif(APPLE AND CPACK_BINARY_PRODUCTBUILD AND
NOT DEFINED CPACK_PRODUCTBUILD_DOMAINS AND
NOT "x${_CPack_CMP0161}x" STREQUAL "xOLDx")
cmake_policy(GET_WARNING CMP0161 _CMP0161_warning)
message(AUTHOR_WARNING
"${_CMP0161_warning}\n"
"For compatibility, CPACK_PRODUCTBUILD_DOMAINS will remain unset. "
"Explicitly setting CPACK_PRODUCTBUILD_DOMAINS or setting policy CMP0161 "
"to NEW will prevent this warning."
)
unset(_CMP0161_warning)
endif()
unset(_CPack_CMP0161)
# set sysroot so SDK tools can be used
if(CMAKE_OSX_SYSROOT)
_cpack_set_default(CPACK_OSX_SYSROOT "${_CMAKE_OSX_SYSROOT_PATH}")

View File

@ -491,7 +491,9 @@ class cmMakefile;
SELECT( \
POLICY, CMP0160, \
"More read-only target properties now error when trying to set them.", 3, \
29, 0, cmPolicies::WARN)
29, 0, cmPolicies::WARN) \
SELECT(POLICY, CMP0161, "CPACK_PRODUCTBUILD_DOMAINS defaults to true.", 3, \
29, 0, cmPolicies::WARN)
#define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)
#define CM_FOR_EACH_POLICY_ID(POLICY) \

View File

@ -0,0 +1,3 @@
include(${RunCMake_SOURCE_DIR}/check.cmake)
test_variable(CPACK_PRODUCTBUILD_DOMAINS "ON")

View File

@ -0,0 +1,2 @@
cmake_policy(SET CMP0161 NEW)
set(CPACK_BINARY_PRODUCTBUILD ON CACHE BOOL "" FORCE)

View File

@ -0,0 +1,5 @@
include(${RunCMake_SOURCE_DIR}/check.cmake)
if(DEFINED CPACK_PRODUCTBUILD_DOMANS)
message(FATAL_ERROR "CPACK_PRODUCTBUILD_DOMANS was defined, but it should not have been")
endif()

View File

@ -0,0 +1,2 @@
cmake_policy(SET CMP0161 OLD)
set(CPACK_BINARY_PRODUCTBUILD ON CACHE BOOL "" FORCE)

View File

@ -0,0 +1,5 @@
include(${RunCMake_SOURCE_DIR}/check.cmake)
if(DEFINED CPACK_PRODUCTBUILD_DOMANS)
message(FATAL_ERROR "CPACK_PRODUCTBUILD_DOMANS was defined, but it should not have been")
endif()

View File

@ -0,0 +1,12 @@
^CMake Warning \(dev\) at [^
]*/Modules/CPack\.cmake:[0-9]+ \(message\):
Policy CMP0161 is not set: CPACK_PRODUCTBUILD_DOMAINS defaults to true\.
Run "cmake --help-policy CMP0161" for policy details\. Use the cmake_policy
command to set the policy and suppress this warning\.
For compatibility, CPACK_PRODUCTBUILD_DOMAINS will remain unset\.
Explicitly setting CPACK_PRODUCTBUILD_DOMAINS or setting policy CMP0161 to
NEW will prevent this warning\.
Call Stack \(most recent call first\):
CMakeLists\.txt:[0-9]+ \(include\)
This warning is for project developers\. Use -Wno-dev to suppress it\.$

View File

@ -0,0 +1 @@
set(CPACK_BINARY_PRODUCTBUILD ON CACHE BOOL "" FORCE)

View File

@ -2,6 +2,9 @@ include(RunCMake)
run_cmake(CMP0133-NEW)
run_cmake(CMP0133-WARN)
run_cmake(CMP0161-NEW)
run_cmake(CMP0161-OLD)
run_cmake(CMP0161-WARN)
run_cmake(Simple)
run_cmake(Default)
run_cmake(Special)