diff --git a/Help/cpack_gen/rpm.rst b/Help/cpack_gen/rpm.rst index 0fd69646db..3583765b12 100644 --- a/Help/cpack_gen/rpm.rst +++ b/Help/cpack_gen/rpm.rst @@ -439,6 +439,51 @@ List of CPack RPM generator specific variables: variable. Note that you must enclose the entire value between quotes when setting this variable. +.. variable:: CPACK_RPM_PACKAGE_RECOMMENDS + CPACK_RPM__PACKAGE_RECOMMENDS + + .. versionadded:: 4.1 + + RPM spec recommends field. + + :Mandatory: No + :Default: + + May be used to set weak RPM dependencies (recommends). If ``rpmbuild`` doesn't + support the ``Recommends`` tag, CPack will emit a warning and ignore this + variable. Note that you must enclose the entire value between quotes when + setting this variable. + +.. variable:: CPACK_RPM_PACKAGE_SUPPLEMENTS + CPACK_RPM__PACKAGE_SUPPLEMENTS + + .. versionadded:: 4.1 + + RPM spec supplements field. + + :Mandatory: No + :Default: + + May be used to set weak RPM dependencies (supplements). If ``rpmbuild`` doesn't + support the ``Supplements`` tag, CPack will emit a warning and ignore this + variable. Note that you must enclose the entire value between quotes when + setting this variable. + +.. variable:: CPACK_RPM_PACKAGE_ENHANCES + CPACK_RPM__PACKAGE_ENHANCES + + .. versionadded:: 4.1 + + RPM spec enhances field. + + :Mandatory: No + :Default: + + May be used to set weak RPM dependencies (enhances). If ``rpmbuild`` doesn't + support the ``Enhances`` tag, CPack will emit a warning and ignore this + variable. Note that you must enclose the entire value between quotes when + setting this variable. + .. variable:: CPACK_RPM_PACKAGE_PROVIDES CPACK_RPM__PACKAGE_PROVIDES diff --git a/Help/release/dev/cpack-rpm-weak-deps-tags.rst b/Help/release/dev/cpack-rpm-weak-deps-tags.rst new file mode 100644 index 0000000000..50f49c099c --- /dev/null +++ b/Help/release/dev/cpack-rpm-weak-deps-tags.rst @@ -0,0 +1,8 @@ +cpack-rpm-weak-deps-tags +------------------------ + +* The :cpack_gen:`CPack RPM Generator` gained + :variable:`CPACK_RPM_PACKAGE_ENHANCES`, + :variable:`CPACK_RPM_PACKAGE_RECOMMENDS`, and + :variable:`CPACK_RPM_PACKAGE_SUPPLEMENTS` + variables to specify the corresponding RPM spec fields. diff --git a/Modules/Internal/CPack/CPackRPM.cmake b/Modules/Internal/CPack/CPackRPM.cmake index dcc575f613..22a47902c7 100644 --- a/Modules/Internal/CPack/CPackRPM.cmake +++ b/Modules/Internal/CPack/CPackRPM.cmake @@ -1112,7 +1112,7 @@ function(cpack_rpm_generate_package) # There may be some COMPONENT specific variables as well # If component specific var is not provided we use the global one # for each component - foreach(_RPM_SPEC_HEADER URL REQUIRES SUGGESTS PROVIDES OBSOLETES PREFIX CONFLICTS AUTOPROV AUTOREQ AUTOREQPROV REQUIRES_PRE REQUIRES_POST REQUIRES_PREUN REQUIRES_POSTUN) + foreach(_RPM_SPEC_HEADER URL REQUIRES SUGGESTS RECOMMENDS SUPPLEMENTS ENHANCES PROVIDES OBSOLETES PREFIX CONFLICTS AUTOPROV AUTOREQ AUTOREQPROV REQUIRES_PRE REQUIRES_POST REQUIRES_PREUN REQUIRES_POSTUN) if(CPACK_RPM_PACKAGE_DEBUG) message("CPackRPM:Debug: processing ${_RPM_SPEC_HEADER}") @@ -1730,7 +1730,10 @@ Vendor: \@CPACK_RPM_PACKAGE_VENDOR\@ \@TMP_RPM_PROVIDES\@ \@TMP_RPM_OBSOLETES\@ \@TMP_RPM_CONFLICTS\@ +\@TMP_RPM_RECOMMENDS\@ \@TMP_RPM_SUGGESTS\@ +\@TMP_RPM_SUPPLEMENTS\@ +\@TMP_RPM_ENHANCES\@ \@TMP_RPM_AUTOPROV\@ \@TMP_RPM_AUTOREQ\@ \@TMP_RPM_AUTOREQPROV\@ @@ -1799,7 +1802,10 @@ Vendor: \@CPACK_RPM_PACKAGE_VENDOR\@ \@TMP_RPM_PROVIDES\@ \@TMP_RPM_OBSOLETES\@ \@TMP_RPM_CONFLICTS\@ +\@TMP_RPM_RECOMMENDS\@ \@TMP_RPM_SUGGESTS\@ +\@TMP_RPM_SUPPLEMENTS\@ +\@TMP_RPM_ENHANCES\@ \@TMP_RPM_AUTOPROV\@ \@TMP_RPM_AUTOREQ\@ \@TMP_RPM_AUTOREQPROV\@ diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 83980de15c..60c8f526f7 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -1195,6 +1195,9 @@ set(cpack_tests RPM.EXTRA_SLASH_IN_PATH RPM.SOURCE_PACKAGE RPM.SUGGESTS + RPM.ENHANCES + RPM.RECOMMENDS + RPM.SUPPLEMENTS RPM.SYMLINKS RPM.USER_FILELIST RPM.PROJECT_META diff --git a/Tests/RunCMake/CPack/RunCMakeTest.cmake b/Tests/RunCMake/CPack/RunCMakeTest.cmake index 57f86caaa1..b6cacaa11f 100644 --- a/Tests/RunCMake/CPack/RunCMakeTest.cmake +++ b/Tests/RunCMake/CPack/RunCMakeTest.cmake @@ -54,6 +54,9 @@ if(NOT BRPALT) run_cpack_source_test(SOURCE_PACKAGE "RPM.SOURCE_PACKAGE") endif() run_cpack_test(SUGGESTS "RPM.SUGGESTS" false "MONOLITHIC") +run_cpack_test(ENHANCES "RPM.ENHANCES" false "MONOLITHIC") +run_cpack_test(RECOMMENDS "RPM.RECOMMENDS" false "MONOLITHIC") +run_cpack_test(SUPPLEMENTS "RPM.SUPPLEMENTS" false "MONOLITHIC") run_cpack_test(SYMLINKS "RPM.SYMLINKS;TGZ" false "MONOLITHIC;COMPONENT") set(ENVIRONMENT "SOURCE_DATE_EPOCH=123456789") run_cpack_test(TIMESTAMPS "DEB.TIMESTAMPS;TGZ" false "COMPONENT") diff --git a/Tests/RunCMake/CPack/tests/ENHANCES/ExpectedFiles.cmake b/Tests/RunCMake/CPack/tests/ENHANCES/ExpectedFiles.cmake new file mode 100644 index 0000000000..d1a3a5fb2d --- /dev/null +++ b/Tests/RunCMake/CPack/tests/ENHANCES/ExpectedFiles.cmake @@ -0,0 +1,2 @@ +set(EXPECTED_FILES_COUNT "1") +set(EXPECTED_FILE_CONTENT_1_LIST "/foo;/foo/CMakeLists.txt") diff --git a/Tests/RunCMake/CPack/tests/ENHANCES/RPM-stderr.txt b/Tests/RunCMake/CPack/tests/ENHANCES/RPM-stderr.txt new file mode 100644 index 0000000000..a5deb04e0a --- /dev/null +++ b/Tests/RunCMake/CPack/tests/ENHANCES/RPM-stderr.txt @@ -0,0 +1 @@ +^CPackRPM: Will use GENERATED spec file: (/[^/]*)*/Tests/RunCMake/RPM\.ENHANCES/CPack/[^-]*-build/_CPack_Packages/.*/RPM/SPECS/[^\.]*\.spec$ diff --git a/Tests/RunCMake/CPack/tests/ENHANCES/VerifyResult.cmake b/Tests/RunCMake/CPack/tests/ENHANCES/VerifyResult.cmake new file mode 100644 index 0000000000..2fb79bbd96 --- /dev/null +++ b/Tests/RunCMake/CPack/tests/ENHANCES/VerifyResult.cmake @@ -0,0 +1,35 @@ +# CPack uses `rpm --enhances` to check if rpmbuild supports the "Enhances:" tag. +# This test intentionally uses a different method (build a test .spec) so any +# problems will be caught early if functionality should change in the future. +execute_process( + COMMAND ${RPMBUILD_EXECUTABLE} --nobuild test_enhances.spec + ERROR_QUIET + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + RESULT_VARIABLE RPMBUILD_ENHANCES_RESULT) + +if(RPMBUILD_ENHANCES_RESULT EQUAL 0) + set(should_contain_enhances_tag_ true) +endif() + +# Only verify that enhances tag is present only if that tag is supported. +# If it is not supported the rpm package was correctly generated by ignoring +# that tag and that was already checked by expected files test. +if(should_contain_enhances_tag_) + execute_process(COMMAND ${RPM_EXECUTABLE} -q --enhances -p "${FOUND_FILE_1}" + RESULT_VARIABLE rpm_result_ + OUTPUT_VARIABLE rpm_stdout_ + ERROR_VARIABLE rpm_stderr_ + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(rpm_result_ OR NOT rpm_stdout_ STREQUAL "libenhanced") + string(REPLACE "\n" "\n " rpm_stdout_ "${rpm_stdout_}") + string(REPLACE "\n" "\n " rpm_stderr_ "${rpm_stderr_}") + message(FATAL_ERROR "RPM_ENHANCED package error: no enhanced packages\n" + "result: ${rpm_result_}\n" + "stdout:\n" + " ${rpm_stdout_}\n" + "stderr:\n" + " ${rpm_stderr_}\n" + ) + endif() +endif() diff --git a/Tests/RunCMake/CPack/tests/ENHANCES/test.cmake b/Tests/RunCMake/CPack/tests/ENHANCES/test.cmake new file mode 100644 index 0000000000..1d742bdd81 --- /dev/null +++ b/Tests/RunCMake/CPack/tests/ENHANCES/test.cmake @@ -0,0 +1,3 @@ +install(FILES CMakeLists.txt DESTINATION foo) + +set(CPACK_RPM_PACKAGE_ENHANCES "libenhanced") diff --git a/Tests/RunCMake/CPack/tests/ENHANCES/test_enhances.spec b/Tests/RunCMake/CPack/tests/ENHANCES/test_enhances.spec new file mode 100644 index 0000000000..1120f911b3 --- /dev/null +++ b/Tests/RunCMake/CPack/tests/ENHANCES/test_enhances.spec @@ -0,0 +1,22 @@ +# This spec file is used to check if the provided version of rpmbuild supports the "Enhances:" tag + +Name: test +Version: 0 +Release: 1 +Summary: test +License: test + +Enhances: enhanced_package + +%description + + +%prep + +%build +%configure +%install +%clean +%files +%doc +%changelog diff --git a/Tests/RunCMake/CPack/tests/RECOMMENDS/ExpectedFiles.cmake b/Tests/RunCMake/CPack/tests/RECOMMENDS/ExpectedFiles.cmake new file mode 100644 index 0000000000..d1a3a5fb2d --- /dev/null +++ b/Tests/RunCMake/CPack/tests/RECOMMENDS/ExpectedFiles.cmake @@ -0,0 +1,2 @@ +set(EXPECTED_FILES_COUNT "1") +set(EXPECTED_FILE_CONTENT_1_LIST "/foo;/foo/CMakeLists.txt") diff --git a/Tests/RunCMake/CPack/tests/RECOMMENDS/RPM-stderr.txt b/Tests/RunCMake/CPack/tests/RECOMMENDS/RPM-stderr.txt new file mode 100644 index 0000000000..5dc907a477 --- /dev/null +++ b/Tests/RunCMake/CPack/tests/RECOMMENDS/RPM-stderr.txt @@ -0,0 +1 @@ +^CPackRPM: Will use GENERATED spec file: (/[^/]*)*/Tests/RunCMake/RPM\.RECOMMENDS/CPack/[^-]*-build/_CPack_Packages/.*/RPM/SPECS/[^\.]*\.spec$ diff --git a/Tests/RunCMake/CPack/tests/RECOMMENDS/VerifyResult.cmake b/Tests/RunCMake/CPack/tests/RECOMMENDS/VerifyResult.cmake new file mode 100644 index 0000000000..aca1a7d90d --- /dev/null +++ b/Tests/RunCMake/CPack/tests/RECOMMENDS/VerifyResult.cmake @@ -0,0 +1,35 @@ +# CPack uses `rpm --recommends` to check if rpmbuild supports the "Recommends:" tag. +# This test intentionally uses a different method (build a test .spec) so any +# problems will be caught early if functionality should change in the future. +execute_process( + COMMAND ${RPMBUILD_EXECUTABLE} --nobuild test_recommends.spec + ERROR_QUIET + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + RESULT_VARIABLE RPMBUILD_RECOMMENDS_RESULT) + +if(RPMBUILD_RECOMMENDS_RESULT EQUAL 0) + set(should_contain_recommends_tag_ true) +endif() + +# Only verify that recommends tag is present only if that tag is supported. +# If it is not supported the rpm package was correctly generated by ignoring +# that tag and that was already checked by expected files test. +if(should_contain_recommends_tag_) + execute_process(COMMAND ${RPM_EXECUTABLE} -q --recommends -p "${FOUND_FILE_1}" + RESULT_VARIABLE rpm_result_ + OUTPUT_VARIABLE rpm_stdout_ + ERROR_VARIABLE rpm_stderr_ + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(rpm_result_ OR NOT rpm_stdout_ STREQUAL "librecommended") + string(REPLACE "\n" "\n " rpm_stdout_ "${rpm_stdout_}") + string(REPLACE "\n" "\n " rpm_stderr_ "${rpm_stderr_}") + message(FATAL_ERROR "RPM_RECOMMENDED package error: no recommended packages\n" + "result: ${rpm_result_}\n" + "stdout:\n" + " ${rpm_stdout_}\n" + "stderr:\n" + " ${rpm_stderr_}\n" + ) + endif() +endif() diff --git a/Tests/RunCMake/CPack/tests/RECOMMENDS/test.cmake b/Tests/RunCMake/CPack/tests/RECOMMENDS/test.cmake new file mode 100644 index 0000000000..706ee6fa79 --- /dev/null +++ b/Tests/RunCMake/CPack/tests/RECOMMENDS/test.cmake @@ -0,0 +1,3 @@ +install(FILES CMakeLists.txt DESTINATION foo) + +set(CPACK_RPM_PACKAGE_RECOMMENDS "librecommended") diff --git a/Tests/RunCMake/CPack/tests/RECOMMENDS/test_recommends.spec b/Tests/RunCMake/CPack/tests/RECOMMENDS/test_recommends.spec new file mode 100644 index 0000000000..2a650bccb2 --- /dev/null +++ b/Tests/RunCMake/CPack/tests/RECOMMENDS/test_recommends.spec @@ -0,0 +1,22 @@ +# This spec file is used to check if the provided version of rpmbuild supports the "Recommends:" tag + +Name: test +Version: 0 +Release: 1 +Summary: test +License: test + +Recommends: recommended_package + +%description + + +%prep + +%build +%configure +%install +%clean +%files +%doc +%changelog diff --git a/Tests/RunCMake/CPack/tests/SUPPLEMENTS/ExpectedFiles.cmake b/Tests/RunCMake/CPack/tests/SUPPLEMENTS/ExpectedFiles.cmake new file mode 100644 index 0000000000..d1a3a5fb2d --- /dev/null +++ b/Tests/RunCMake/CPack/tests/SUPPLEMENTS/ExpectedFiles.cmake @@ -0,0 +1,2 @@ +set(EXPECTED_FILES_COUNT "1") +set(EXPECTED_FILE_CONTENT_1_LIST "/foo;/foo/CMakeLists.txt") diff --git a/Tests/RunCMake/CPack/tests/SUPPLEMENTS/RPM-stderr.txt b/Tests/RunCMake/CPack/tests/SUPPLEMENTS/RPM-stderr.txt new file mode 100644 index 0000000000..d62afc5893 --- /dev/null +++ b/Tests/RunCMake/CPack/tests/SUPPLEMENTS/RPM-stderr.txt @@ -0,0 +1 @@ +^CPackRPM: Will use GENERATED spec file: (/[^/]*)*/Tests/RunCMake/RPM\.SUPPLEMENTS/CPack/[^-]*-build/_CPack_Packages/.*/RPM/SPECS/[^\.]*\.spec$ diff --git a/Tests/RunCMake/CPack/tests/SUPPLEMENTS/VerifyResult.cmake b/Tests/RunCMake/CPack/tests/SUPPLEMENTS/VerifyResult.cmake new file mode 100644 index 0000000000..6ab182ae89 --- /dev/null +++ b/Tests/RunCMake/CPack/tests/SUPPLEMENTS/VerifyResult.cmake @@ -0,0 +1,35 @@ +# CPack uses `rpm --supplements` to check if rpmbuild supports the "Supplements:" tag. +# This test intentionally uses a different method (build a test .spec) so any +# problems will be caught early if functionality should change in the future. +execute_process( + COMMAND ${RPMBUILD_EXECUTABLE} --nobuild test_supplements.spec + ERROR_QUIET + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + RESULT_VARIABLE RPMBUILD_SUPPLEMENTS_RESULT) + +if(RPMBUILD_SUPPLEMENTS_RESULT EQUAL 0) + set(should_contain_supplements_tag_ true) +endif() + +# Only verify that supplements tag is present only if that tag is supported. +# If it is not supported the rpm package was correctly generated by ignoring +# that tag and that was already checked by expected files test. +if(should_contain_supplements_tag_) + execute_process(COMMAND ${RPM_EXECUTABLE} -q --supplements -p "${FOUND_FILE_1}" + RESULT_VARIABLE rpm_result_ + OUTPUT_VARIABLE rpm_stdout_ + ERROR_VARIABLE rpm_stderr_ + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(rpm_result_ OR NOT rpm_stdout_ STREQUAL "libsupplemented") + string(REPLACE "\n" "\n " rpm_stdout_ "${rpm_stdout_}") + string(REPLACE "\n" "\n " rpm_stderr_ "${rpm_stderr_}") + message(FATAL_ERROR "RPM_SUPPLEMENTED package error: no supplemented packages\n" + "result: ${rpm_result_}\n" + "stdout:\n" + " ${rpm_stdout_}\n" + "stderr:\n" + " ${rpm_stderr_}\n" + ) + endif() +endif() diff --git a/Tests/RunCMake/CPack/tests/SUPPLEMENTS/test.cmake b/Tests/RunCMake/CPack/tests/SUPPLEMENTS/test.cmake new file mode 100644 index 0000000000..58169bd70d --- /dev/null +++ b/Tests/RunCMake/CPack/tests/SUPPLEMENTS/test.cmake @@ -0,0 +1,3 @@ +install(FILES CMakeLists.txt DESTINATION foo) + +set(CPACK_RPM_PACKAGE_SUPPLEMENTS "libsupplemented") diff --git a/Tests/RunCMake/CPack/tests/SUPPLEMENTS/test_supplements.spec b/Tests/RunCMake/CPack/tests/SUPPLEMENTS/test_supplements.spec new file mode 100644 index 0000000000..acd1a07888 --- /dev/null +++ b/Tests/RunCMake/CPack/tests/SUPPLEMENTS/test_supplements.spec @@ -0,0 +1,22 @@ +# This spec file is used to check if the provided version of rpmbuild supports the "Supplements:" tag + +Name: test +Version: 0 +Release: 1 +Summary: test +License: test + +Supplements: supplemented_package + +%description + + +%prep + +%build +%configure +%install +%clean +%files +%doc +%changelog