浏览代码

Merge topic 'cpack-debian-multiarch'

71c631c435 CPack/DEB: Add Multi-Arch support
55524c48a4 CPack/DEB: Add Multi-Arch support
a022705a2e Tests/RunCMake/CPack: Improve README

Acked-by: Kitware Robot <[email protected]>
Merge-request: !9609
Brad King 1 年之前
父节点
当前提交
a20377e41a

+ 25 - 0
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
    This value is not interpreted. It is possible to pass an optional
    revision number of the referenced source package as well.
    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
 Packaging of debug information
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 

+ 6 - 0
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.

+ 2 - 1
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_}
   # if per-component variable, overrides the global CPACK_DEBIAN_PACKAGE_${variable_type_}
   # automatic dependency discovery will be performed afterwards.
   # automatic dependency discovery will be performed afterwards.
   if(CPACK_DEB_PACKAGE_COMPONENT)
   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_}")
       set(_component_var "CPACK_DEBIAN_${_local_component_name}_PACKAGE_${value_type_}")
 
 
       # if set, overrides the global variable
       # 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_CONFLICTS "${CPACK_DEBIAN_PACKAGE_CONFLICTS}" PARENT_SCOPE)
   set(GEN_CPACK_DEBIAN_PACKAGE_PROVIDES "${CPACK_DEBIAN_PACKAGE_PROVIDES}" 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_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_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_EXTRA "${CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA}" PARENT_SCOPE)
   set(GEN_CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION
   set(GEN_CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION

+ 15 - 0
Source/CPack/cmCPackDebGenerator.cxx

@@ -789,6 +789,21 @@ bool cmCPackDebGenerator::createDeb()
   if (cmNonempty(debian_pkg_replaces)) {
   if (cmNonempty(debian_pkg_replaces)) {
     controlValues["Replaces"] = *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 strGenWDIR(this->GetOption("GEN_WDIR"));
   const std::string shlibsfilename = strGenWDIR + "/shlibs";
   const std::string shlibsfilename = strGenWDIR + "/shlibs";

+ 1 - 0
Tests/RunCMake/CMakeLists.txt

@@ -1067,6 +1067,7 @@ set(cpack_tests
   DEB.DEB_DESCRIPTION
   DEB.DEB_DESCRIPTION
   DEB.PROJECT_META
   DEB.PROJECT_META
   DEB.COMPONENT_WITH_SPECIAL_CHARS
   DEB.COMPONENT_WITH_SPECIAL_CHARS
+  DEB.MULTIARCH
 
 
   RPM.AUTO_SUFFIXES
   RPM.AUTO_SUFFIXES
   RPM.CUSTOM_BINARY_SPEC_FILE
   RPM.CUSTOM_BINARY_SPEC_FILE

+ 4 - 4
Tests/RunCMake/CPack/README.txt

@@ -10,8 +10,8 @@ CPack test root directory: 'Tests/RunCMake/CPack/tests'.
 All phases are executed separately for each generator that is bound to a test.
 All phases are executed separately for each generator that is bound to a test.
 Tests for each generator are subtests of test 'RunCMake.CPack_<generator_name>'.
 Tests for each generator are subtests of test 'RunCMake.CPack_<generator_name>'.
 
 
-Each test must also be added to 'RunCMakeTest.cmake' script located in CPack
-test root directory.
+Each test must be added to list "cpack_tests" in 'Tests/RunCMake/CMakeLists.txt'
+and also to 'RunCMakeTest.cmake' script located in 'Tests/RunCMake/CPack/'.
 
 
 Line that adds a test is:
 Line that adds a test is:
 run_cpack_test(<test_name> "<generator_name_list>" <compile_stage>
 run_cpack_test(<test_name> "<generator_name_list>" <compile_stage>
@@ -53,7 +53,7 @@ Test consists of
 - verification of generated files
 - verification of generated files
 
 
 The phases are executed once per specified generator, packaging type and subtest
 The phases are executed once per specified generator, packaging type and subtest
-combinatiion.
+combination.
 
 
 test prerequirements phase (optional):
 test prerequirements phase (optional):
 --------------------------------------
 --------------------------------------
@@ -136,7 +136,7 @@ this step and must contain
 - EXPECTED_FILES_COUNT variable that contains the number of expected files that
 - EXPECTED_FILES_COUNT variable that contains the number of expected files that
   will be generated (0 or more)
   will be generated (0 or more)
 
 
-- EXPECTED_FILE_<file_number_starting_with_1> that contains globing expression
+- EXPECTED_FILE_<file_number_starting_with_1> that contains globbing expression
   that uniquely defines expected file name (will be used to find expected file)
   that uniquely defines expected file name (will be used to find expected file)
   and should be present once for each expected file.
   and should be present once for each expected file.
   NOTE: This variable should be used only as last resort as it sets generator
   NOTE: This variable should be used only as last resort as it sets generator

+ 1 - 0
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_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(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_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")

+ 1 - 0
Tests/RunCMake/CPack/tests/MULTIARCH/DEB-fail-stderr.txt

@@ -0,0 +1 @@
+Error: invalid value for Multi-Arch: fail\. Valid values are: same, foreign, allowed

+ 5 - 0
Tests/RunCMake/CPack/tests/MULTIARCH/ExpectedFiles.cmake

@@ -0,0 +1,5 @@
+set(EXPECTED_FILES_COUNT "0")
+if(NOT ${RunCMake_SUBTEST_SUFFIX} STREQUAL "fail")
+    set(EXPECTED_FILES_COUNT "1")
+    set(EXPECTED_FILE_CONTENT_1_LIST "/foo;/foo/CMakeLists.txt")
+endif ()

+ 4 - 0
Tests/RunCMake/CPack/tests/MULTIARCH/VerifyResult.cmake

@@ -0,0 +1,4 @@
+if(NOT ${RunCMake_SUBTEST_SUFFIX} STREQUAL "fail")
+    set(MULTIARCH_control "Multi-Arch: ${RunCMake_SUBTEST_SUFFIX}")
+    verifyDebControl("${FOUND_FILE_1}" "MULTIARCH" "control")
+endif ()

+ 7 - 0
Tests/RunCMake/CPack/tests/MULTIARCH/test.cmake

@@ -0,0 +1,7 @@
+install(FILES CMakeLists.txt DESTINATION foo COMPONENT test)
+
+set(CPACK_DEBIAN_PACKAGE_MULTIARCH ${RunCMake_SUBTEST_SUFFIX})
+
+if(PACKAGING_TYPE STREQUAL "COMPONENT")
+  set(CPACK_COMPONENTS_ALL test)
+endif()