Просмотр исходного кода

Merge topic 'cpack-rpm-user-file-list-with-multiple-directives'

4e4b786e CPack/RPM CPACK_RPM_USER_FILELIST change release note
a5a6f61b CPackRPM now supports multiple directives in CPACK_RPM_USER_FILELIST
Brad King 9 лет назад
Родитель
Сommit
76444957c1

+ 6 - 0
Help/release/dev/cpack-rpm-user-file-list-with-multiple-directives.rst

@@ -0,0 +1,6 @@
+cpack-rpm-user-file-list-with-multiple-directives
+-------------------------------------------------
+
+* The :module:`CPackRPM` module learned to support
+  multiple directives per file when using
+  :variable:`CPACK_RPM_USER_FILELIST` variable.

+ 8 - 5
Modules/CPackRPM.cmake

@@ -507,10 +507,12 @@
 #
 #  May be used to explicitly specify ``%(<directive>)`` file line
 #  in the spec file. Like ``%config(noreplace)`` or any other directive
-#  that be found in the ``%files`` section. Since CPackRPM is generating
-#  the list of files (and directories) the user specified files of
-#  the ``CPACK_RPM_<COMPONENT>_USER_FILELIST`` list will be removed from
-#  the generated list.
+#  that be found in the ``%files`` section. You can have multiple directives
+#  per line, as in ``%attr(600,root,root) %config(noreplace)``. Since
+#  CPackRPM is generating the list of files (and directories) the user
+#  specified files of the ``CPACK_RPM_<COMPONENT>_USER_FILELIST`` list will
+#  be removed from the generated list. If referring to directories do
+#  not add a trailing slash.
 #
 # .. variable:: CPACK_RPM_CHANGELOG_FILE
 #
@@ -2055,7 +2057,8 @@ function(cpack_rpm_generate_package)
     set(CPACK_RPM_USER_INSTALL_FILES "")
     foreach(F IN LISTS CPACK_RPM_USER_FILELIST_INTERNAL)
       string(REGEX REPLACE "%[A-Za-z]+(\\([^()]*\\))? " "" F_PATH ${F})
-      string(REGEX MATCH "%[A-Za-z]+(\\([^()]*\\))?" F_PREFIX ${F})
+      string(REGEX MATCH "(%[A-Za-z]+(\\([^()]*\\))? )*" F_PREFIX ${F})
+      string(STRIP ${F_PREFIX} F_PREFIX)
 
       if(CPACK_RPM_PACKAGE_DEBUG)
         message("CPackRPM:Debug: F_PREFIX=<${F_PREFIX}>, F_PATH=<${F_PATH}>")

+ 1 - 0
Tests/RunCMake/CPack/RunCMakeTest.cmake

@@ -22,3 +22,4 @@ run_cpack_test(PER_COMPONENT_FIELDS "RPM;DEB" false "COMPONENT")
 run_cpack_test_subtests(SINGLE_DEBUGINFO "no_main_component;one_component;one_component_main;no_debuginfo;one_component_no_debuginfo;no_components;valid" "RPM" true "CUSTOM")
 run_cpack_source_test(SOURCE_PACKAGE "RPM")
 run_cpack_test(SUGGESTS "RPM" false "MONOLITHIC")
+run_cpack_test(USER_FILELIST "RPM" false "MONOLITHIC")

+ 2 - 0
Tests/RunCMake/CPack/tests/USER_FILELIST/ExpectedFiles.cmake

@@ -0,0 +1,2 @@
+set(EXPECTED_FILES_COUNT "1")
+set(EXPECTED_FILE_CONTENT_1_LIST "/usr/one;/usr/one/foo.txt;/usr/one/two;/usr/one/two/bar.txt;/usr/three;/usr/three/baz.txt;/usr/three/qux.txt")

+ 12 - 0
Tests/RunCMake/CPack/tests/USER_FILELIST/VerifyResult.cmake

@@ -0,0 +1,12 @@
+execute_process(COMMAND ${RPM_EXECUTABLE} -qpd ${FOUND_FILE_1}
+  WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
+  OUTPUT_VARIABLE DOC_FILES_
+  ERROR_QUIET
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+string(REPLACE "\n" ";" DOC_FILES_ "${DOC_FILES_}")
+
+set(DOC_FILES_WANTED_ "/usr/one/foo.txt;/usr/one/two/bar.txt;/usr/three/baz.txt")
+if (NOT "${DOC_FILES_}" STREQUAL "${DOC_FILES_WANTED_}")
+  message(FATAL_ERROR "USER_FILELIST handling error: Check filelist in spec file. Doc files were: ${DOC_FILES_}. Should have been ${DOC_FILES_WANTED_}")
+endif()

+ 13 - 0
Tests/RunCMake/CPack/tests/USER_FILELIST/test.cmake

@@ -0,0 +1,13 @@
+install(FILES CMakeLists.txt DESTINATION one     RENAME foo.txt)
+install(FILES CMakeLists.txt DESTINATION one/two RENAME bar.txt)
+install(FILES CMakeLists.txt DESTINATION three   RENAME baz.txt)
+install(FILES CMakeLists.txt DESTINATION three   RENAME qux.txt)
+
+# We are verifying the USER_FILELIST works by comparing what
+# ends up with a %doc tag in the final rpm with what we expect
+# from this USER_FILELIST.
+set(CPACK_RPM_USER_FILELIST
+  "%doc /usr/one/foo.txt"
+  "%doc %attr(640,root,root) /usr/one/two/bar.txt"
+  "%attr(600, -, root) %doc /usr/three/baz.txt"
+)