summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Schuster <rob3rt.schuster@gmail.com>2024-06-19 11:09:58 (GMT)
committerBrad King <brad.king@kitware.com>2024-06-21 16:27:50 (GMT)
commit55524c48a45ec4f05ede9e19db65edecacca61b5 (patch)
treecc42d63021c3a3b964e56d18c84e767293536adf
parenta022705a2e99c11fc946fadcdfbe0beac20f3a12 (diff)
downloadCMake-55524c48a45ec4f05ede9e19db65edecacca61b5.zip
CMake-55524c48a45ec4f05ede9e19db65edecacca61b5.tar.gz
CMake-55524c48a45ec4f05ede9e19db65edecacca61b5.tar.bz2
CPack/DEB: Add Multi-Arch support
Add support for Multi-Arch in control files of Debian packages. Valid values: same, foreign, allowed Fixes: #21445
-rw-r--r--Help/cpack_gen/deb.rst25
-rw-r--r--Help/release/dev/cpack-debian-multiarch.rst6
-rw-r--r--Modules/Internal/CPack/CPackDeb.cmake3
-rw-r--r--Source/CPack/cmCPackDebGenerator.cxx15
-rw-r--r--Tests/RunCMake/CMakeLists.txt1
-rw-r--r--Tests/RunCMake/CPack/RunCMakeTest.cmake1
6 files changed, 50 insertions, 1 deletions
diff --git a/Help/cpack_gen/deb.rst b/Help/cpack_gen/deb.rst
index 23436de..a4063d9 100644
--- a/Help/cpack_gen/deb.rst
+++ b/Help/cpack_gen/deb.rst
@@ -654,6 +654,31 @@ List of CPack DEB generator specific variables:
This value is not interpreted. It is possible to pass an optional
revision number of the referenced source package as well.
+.. variable:: CPACK_DEBIAN_PACKAGE_MULTIARCH
+ CPACK_DEBIAN_<COMPONENT>_PACKAGE_MULTIARCH
+
+ Sets the `Multi-Arch` field of the Debian package.
+ Packages can declare in their control file how they should handle
+ situations, where packages for different architectures are being installed
+ on the same machine.
+
+ :Mandatory: No
+ :Default:
+
+ - An empty string for non-component based installations
+ - :variable:`CPACK_DEBIAN_PACKAGE_MULTIARCH` for component-based
+ installations.
+
+ .. versionadded:: 3.31
+ Per-component :variable:`!CPACK_DEBIAN_<COMPONENT>_PACKAGE_MULTIARCH` variables.
+
+ See https://wiki.debian.org/MultiArch/Hints
+
+ .. note::
+
+ This value is validated. It must be one of the following values:
+ ``same``, ``foreign``, ``allowed``.
+
Packaging of debug information
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/Help/release/dev/cpack-debian-multiarch.rst b/Help/release/dev/cpack-debian-multiarch.rst
new file mode 100644
index 0000000..f593103
--- /dev/null
+++ b/Help/release/dev/cpack-debian-multiarch.rst
@@ -0,0 +1,6 @@
+cpack-debian-multiarch
+----------------------
+
+* The :cpack_gen:`CPack DEB Generator` gained a
+ :variable:`CPACK_DEBIAN_PACKAGE_MULTIARCH` option
+ to support multi-arch packages.
diff --git a/Modules/Internal/CPack/CPackDeb.cmake b/Modules/Internal/CPack/CPackDeb.cmake
index d4a47e4..2b58ab1 100644
--- a/Modules/Internal/CPack/CPackDeb.cmake
+++ b/Modules/Internal/CPack/CPackDeb.cmake
@@ -567,7 +567,7 @@ function(cpack_deb_prepare_package_vars)
# if per-component variable, overrides the global CPACK_DEBIAN_PACKAGE_${variable_type_}
# automatic dependency discovery will be performed afterwards.
if(CPACK_DEB_PACKAGE_COMPONENT)
- foreach(value_type_ IN ITEMS DEPENDS RECOMMENDS SUGGESTS PREDEPENDS ENHANCES BREAKS CONFLICTS PROVIDES REPLACES SOURCE SECTION PRIORITY NAME)
+ foreach(value_type_ IN ITEMS DEPENDS RECOMMENDS SUGGESTS PREDEPENDS ENHANCES BREAKS CONFLICTS PROVIDES REPLACES MULTIARCH SOURCE SECTION PRIORITY NAME)
set(_component_var "CPACK_DEBIAN_${_local_component_name}_PACKAGE_${value_type_}")
# if set, overrides the global variable
@@ -862,6 +862,7 @@ function(cpack_deb_prepare_package_vars)
set(GEN_CPACK_DEBIAN_PACKAGE_CONFLICTS "${CPACK_DEBIAN_PACKAGE_CONFLICTS}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_PROVIDES "${CPACK_DEBIAN_PACKAGE_PROVIDES}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_REPLACES "${CPACK_DEBIAN_PACKAGE_REPLACES}" PARENT_SCOPE)
+ set(GEN_CPACK_DEBIAN_PACKAGE_MULTIARCH "${CPACK_DEBIAN_PACKAGE_MULTIARCH}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_SHLIBS "${CPACK_DEBIAN_PACKAGE_SHLIBS_LIST}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION
diff --git a/Source/CPack/cmCPackDebGenerator.cxx b/Source/CPack/cmCPackDebGenerator.cxx
index 31191a9..d721cf1 100644
--- a/Source/CPack/cmCPackDebGenerator.cxx
+++ b/Source/CPack/cmCPackDebGenerator.cxx
@@ -789,6 +789,21 @@ bool cmCPackDebGenerator::createDeb()
if (cmNonempty(debian_pkg_replaces)) {
controlValues["Replaces"] = *debian_pkg_replaces;
}
+ cmValue debian_pkg_multiarch =
+ this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_MULTIARCH");
+ if (cmNonempty(debian_pkg_multiarch)) {
+ // check for valid values: same, foreign, allowed
+ if (*debian_pkg_multiarch != "same" &&
+ *debian_pkg_multiarch != "foreign" &&
+ *debian_pkg_multiarch != "allowed") {
+ cmCPackLogger(cmCPackLog::LOG_ERROR,
+ "Error: invalid value for Multi-Arch: "
+ << *debian_pkg_multiarch
+ << ". Valid values are: same, foreign, allowed\n");
+ return false;
+ }
+ controlValues["Multi-Arch"] = *debian_pkg_multiarch;
+ }
const std::string strGenWDIR(this->GetOption("GEN_WDIR"));
const std::string shlibsfilename = strGenWDIR + "/shlibs";
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index 213c18d..e8dce04 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -1059,6 +1059,7 @@ set(cpack_tests
DEB.DEB_DESCRIPTION
DEB.PROJECT_META
DEB.COMPONENT_WITH_SPECIAL_CHARS
+ DEB.MULTIARCH
RPM.AUTO_SUFFIXES
RPM.CUSTOM_BINARY_SPEC_FILE
diff --git a/Tests/RunCMake/CPack/RunCMakeTest.cmake b/Tests/RunCMake/CPack/RunCMakeTest.cmake
index 5d32404..54671aa 100644
--- a/Tests/RunCMake/CPack/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CPack/RunCMakeTest.cmake
@@ -73,3 +73,4 @@ run_cpack_test_package_target(PRE_POST_SCRIPTS "ZIP" false "MONOLITHIC;COMPONENT
run_cpack_test_subtests(DUPLICATE_FILE "success;conflict_file;conflict_symlink" "TGZ" false "COMPONENT;GROUP")
run_cpack_test(COMPONENT_WITH_SPECIAL_CHARS "RPM.COMPONENT_WITH_SPECIAL_CHARS;DEB.COMPONENT_WITH_SPECIAL_CHARS;7Z;TBZ2;TGZ;TXZ;TZ;ZIP;STGZ" false "MONOLITHIC;COMPONENT;GROUP")
run_cpack_test_package_target(COMPONENT_WITH_SPECIAL_CHARS "RPM.COMPONENT_WITH_SPECIAL_CHARS;DEB.COMPONENT_WITH_SPECIAL_CHARS;7Z;TBZ2;TGZ;TXZ;TZ;ZIP;STGZ" false "MONOLITHIC;COMPONENT;GROUP")
+run_cpack_test_subtests(MULTIARCH "same;foreign;allowed;fail" "DEB.MULTIARCH" false "MONOLITHIC;COMPONENT")