From d2404872b2ce30dd49905037fa5056a7adce6328 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 10 Nov 2025 11:40:20 -0500 Subject: CPack/RPM: Backport "Remove redundant conditions for presence of rpmbuild" Backport commit ab4e74ad0b (CPack/RPM: Remove redundant conditions for presence of rpmbuild, 2025-02-28, v4.0.0-rc3~8^2~1) to CMake 3.31. --- Modules/Internal/CPack/CPackRPM.cmake | 81 ++++++++++++++--------------------- 1 file changed, 31 insertions(+), 50 deletions(-) diff --git a/Modules/Internal/CPack/CPackRPM.cmake b/Modules/Internal/CPack/CPackRPM.cmake index e3f8f5e..bd960f4 100644 --- a/Modules/Internal/CPack/CPackRPM.cmake +++ b/Modules/Internal/CPack/CPackRPM.cmake @@ -811,25 +811,22 @@ function(cpack_rpm_generate_package) # rpmbuild is the basic command for building RPM package # it may be a simple (symbolic) link to rpm command. find_program(RPMBUILD_EXECUTABLE rpmbuild) + if(NOT RPMBUILD_EXECUTABLE) + message(FATAL_ERROR "RPM package requires rpmbuild executable") + endif() # Check version of the rpmbuild tool this would be easier to # track bugs with users and CPackRPM debug mode. # We may use RPM version in order to check for available version dependent features - if(RPMBUILD_EXECUTABLE) - execute_process(COMMAND ${RPMBUILD_EXECUTABLE} --version - OUTPUT_VARIABLE _TMP_VERSION - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REGEX REPLACE "^.* " "" - RPMBUILD_EXECUTABLE_VERSION - ${_TMP_VERSION}) - if(CPACK_RPM_PACKAGE_DEBUG) - message("CPackRPM:Debug: rpmbuild version is <${RPMBUILD_EXECUTABLE_VERSION}>") - endif() - endif() - - if(NOT RPMBUILD_EXECUTABLE) - message(FATAL_ERROR "RPM package requires rpmbuild executable") + execute_process(COMMAND ${RPMBUILD_EXECUTABLE} --version + OUTPUT_VARIABLE _TMP_VERSION + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REGEX REPLACE "^.* " "" + RPMBUILD_EXECUTABLE_VERSION + ${_TMP_VERSION}) + if(CPACK_RPM_PACKAGE_DEBUG) + message("CPackRPM:Debug: rpmbuild version is <${RPMBUILD_EXECUTABLE_VERSION}>") endif() # Display lsb_release output if DEBUG mode enable @@ -859,16 +856,6 @@ function(cpack_rpm_generate_package) message(FATAL_ERROR "${RPMBUILD_EXECUTABLE} can't handle paths with spaces, use a build directory without spaces for building RPMs.") endif() - # If rpmbuild is found - # we try to discover alien since we may be on non RPM distro like Debian. - # In this case we may try to use more advanced features - # like generating RPM directly from DEB using alien. - # FIXME feature not finished (yet) - find_program(ALIEN_EXECUTABLE alien) - if(ALIEN_EXECUTABLE) - message(STATUS "alien found, we may be on a Debian based distro.") - endif() - # Are we packaging components ? if(CPACK_RPM_PACKAGE_COMPONENT) string(TOUPPER ${CPACK_RPM_PACKAGE_COMPONENT} CPACK_RPM_PACKAGE_COMPONENT_UPPER) @@ -1885,31 +1872,25 @@ mv %_topdir/tmpBBroot $RPM_BUILD_ROOT endif() if(NOT GENERATE_SPEC_PARTS) # generate package - if(RPMBUILD_EXECUTABLE) - # Now call rpmbuild using the SPECFILE - execute_process( - COMMAND "${RPMBUILD_EXECUTABLE}" ${RPMBUILD_FLAGS} - --define "_topdir ${CPACK_RPM_DIRECTORY}" - --buildroot "%_topdir/${CPACK_PACKAGE_FILE_NAME}${CPACK_RPM_PACKAGE_COMPONENT_PART_PATH}" - --target "${CPACK_RPM_PACKAGE_ARCHITECTURE}" - "${CPACK_RPM_BINARY_SPECFILE}" - WORKING_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}${CPACK_RPM_PACKAGE_COMPONENT_PART_PATH}" - RESULT_VARIABLE CPACK_RPMBUILD_EXEC_RESULT - ERROR_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.err" - OUTPUT_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.out") - if(CPACK_RPM_PACKAGE_DEBUG OR CPACK_RPMBUILD_EXEC_RESULT) - file(READ ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.err RPMBUILDERR) - file(READ ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.out RPMBUILDOUT) - message("CPackRPM:Debug: You may consult rpmbuild logs in: ") - message("CPackRPM:Debug: - ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.err") - message("CPackRPM:Debug: *** ${RPMBUILDERR} ***") - message("CPackRPM:Debug: - ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.out") - message("CPackRPM:Debug: *** ${RPMBUILDOUT} ***") - endif() - else() - if(ALIEN_EXECUTABLE) - message(FATAL_ERROR "RPM packaging through alien not done (yet)") - endif() + # Now call rpmbuild using the SPECFILE + execute_process( + COMMAND "${RPMBUILD_EXECUTABLE}" ${RPMBUILD_FLAGS} + --define "_topdir ${CPACK_RPM_DIRECTORY}" + --buildroot "%_topdir/${CPACK_PACKAGE_FILE_NAME}${CPACK_RPM_PACKAGE_COMPONENT_PART_PATH}" + --target "${CPACK_RPM_PACKAGE_ARCHITECTURE}" + "${CPACK_RPM_BINARY_SPECFILE}" + WORKING_DIRECTORY "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}${CPACK_RPM_PACKAGE_COMPONENT_PART_PATH}" + RESULT_VARIABLE CPACK_RPMBUILD_EXEC_RESULT + ERROR_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.err" + OUTPUT_FILE "${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.out") + if(CPACK_RPM_PACKAGE_DEBUG OR CPACK_RPMBUILD_EXEC_RESULT) + file(READ ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.err RPMBUILDERR) + file(READ ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.out RPMBUILDOUT) + message("CPackRPM:Debug: You may consult rpmbuild logs in: ") + message("CPackRPM:Debug: - ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.err") + message("CPackRPM:Debug: *** ${RPMBUILDERR} ***") + message("CPackRPM:Debug: - ${CPACK_TOPLEVEL_DIRECTORY}/rpmbuild${CPACK_RPM_PACKAGE_NAME}.out") + message("CPackRPM:Debug: *** ${RPMBUILDOUT} ***") endif() # find generated rpm files and take their names -- cgit v0.12 From 1803eda9f7af301f0b139c836d5cca77b881c35a Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 10 Nov 2025 11:40:49 -0500 Subject: CPack/RPM: Backport "Fix detection of RPM support for weak dependencies" Backport commit 283a48403f (CPack/RPM: Fix detection of RPM support for weak dependencies, 2025-02-28, v4.0.0-rc3~8^2) to CMake 3.31. Fixes: #27373 --- Modules/Internal/CPack/CPackRPM.cmake | 24 +++++++++++++--------- .../CPack/tests/SUGGESTS/VerifyResult.cmake | 20 +++++++++++------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/Modules/Internal/CPack/CPackRPM.cmake b/Modules/Internal/CPack/CPackRPM.cmake index bd960f4..5666619 100644 --- a/Modules/Internal/CPack/CPackRPM.cmake +++ b/Modules/Internal/CPack/CPackRPM.cmake @@ -815,6 +815,10 @@ function(cpack_rpm_generate_package) message(FATAL_ERROR "RPM package requires rpmbuild executable") endif() + # rpm is used for fallback queries in some older versions, + # but is not required in general. + find_program(RPM_EXECUTABLE rpm) + # Check version of the rpmbuild tool this would be easier to # track bugs with users and CPackRPM debug mode. # We may use RPM version in order to check for available version dependent features @@ -1081,16 +1085,16 @@ function(cpack_rpm_generate_package) # In some versions of RPM, weak dependency tags are present in the --querytags # list, but unsupported by rpmbuild. A different method must be used to check # if they are supported. - - execute_process( - COMMAND ${RPM_EXECUTABLE} --suggests - ERROR_QUIET - RESULT_VARIABLE RPMBUILD_SUGGESTS_RESULT) - - if(NOT RPMBUILD_SUGGESTS_RESULT EQUAL 0) - foreach(_WEAK_DEP SUGGESTS RECOMMENDS SUPPLEMENTS ENHANCES) - list(REMOVE_ITEM RPMBUILD_TAG_LIST ${_WEAK_DEP}) - endforeach() + if(RPM_EXECUTABLE) + execute_process( + COMMAND "${RPM_EXECUTABLE}" --suggests + ERROR_QUIET + RESULT_VARIABLE RPM_SUGGESTS_RESULT) + if(NOT RPM_SUGGESTS_RESULT EQUAL 0) + foreach(_WEAK_DEP SUGGESTS RECOMMENDS SUPPLEMENTS ENHANCES) + list(REMOVE_ITEM RPMBUILD_TAG_LIST ${_WEAK_DEP}) + endforeach() + endif() endif() if(CPACK_RPM_PACKAGE_EPOCH) diff --git a/Tests/RunCMake/CPack/tests/SUGGESTS/VerifyResult.cmake b/Tests/RunCMake/CPack/tests/SUGGESTS/VerifyResult.cmake index d1d615b..36d070f 100644 --- a/Tests/RunCMake/CPack/tests/SUGGESTS/VerifyResult.cmake +++ b/Tests/RunCMake/CPack/tests/SUGGESTS/VerifyResult.cmake @@ -4,6 +4,7 @@ execute_process( COMMAND ${RPMBUILD_EXECUTABLE} --nobuild test_suggests.spec ERROR_QUIET + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE RPMBUILD_SUGGESTS_RESULT) if(RPMBUILD_SUGGESTS_RESULT EQUAL 0) @@ -15,15 +16,20 @@ endif() # that tag and that was already checked by expected files test. if(should_contain_suggests_tag_) execute_process(COMMAND ${RPM_EXECUTABLE} -q --suggests -p "${FOUND_FILE_1}" - WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}" RESULT_VARIABLE rpm_result_ - OUTPUT_VARIABLE rpm_output_ - ERROR_VARIABLE error_variable_ + OUTPUT_VARIABLE rpm_stdout_ + ERROR_VARIABLE rpm_stderr_ OUTPUT_STRIP_TRAILING_WHITESPACE) - if(rpm_result_ OR NOT rpm_output_ STREQUAL "libsuggested") - message(FATAL_ERROR "RPM_SUGGESTED package error: no suggested packages" - " (result: '${rpm_result_}'; output: '${rpm_output_}';" - " error: '${error_variable_}')") + if(rpm_result_ OR NOT rpm_stdout_ STREQUAL "libsuggested") + string(REPLACE "\n" "\n " rpm_stdout_ "${rpm_stdout_}") + string(REPLACE "\n" "\n " rpm_stderr_ "${rpm_stderr_}") + message(FATAL_ERROR "RPM_SUGGESTED package error: no suggested packages\n" + "result: ${rpm_result_}\n" + "stdout:\n" + " ${rpm_stdout_}\n" + "stderr:\n" + " ${rpm_stderr_}\n" + ) endif() endif() -- cgit v0.12 From f357fc27e50616d22ca26547dcbffefe4e09f925 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 10 Nov 2025 11:42:10 -0500 Subject: CPack: Backport "correctly perform querytags on old versions of RPM" Backport commit 488de6294a (CPack: correctly perform querytags on old versions of RPM, 2025-01-09, v4.0.0-rc1~182^2~3) to CMake 3.31. --- Modules/Internal/CPack/CPackRPM.cmake | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Modules/Internal/CPack/CPackRPM.cmake b/Modules/Internal/CPack/CPackRPM.cmake index 5666619..3119894 100644 --- a/Modules/Internal/CPack/CPackRPM.cmake +++ b/Modules/Internal/CPack/CPackRPM.cmake @@ -1079,7 +1079,17 @@ function(cpack_rpm_generate_package) execute_process( COMMAND "${RPMBUILD_EXECUTABLE}" --querytags OUTPUT_VARIABLE RPMBUILD_TAG_LIST + RESULT_VARIABLE RPMBUILD_QUERYTAGS_SUCCESS + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + # In some versions of RPM, rpmbuild does not understand --querytags parameter, + # but rpm does. + if(NOT RPMBUILD_QUERYTAGS_SUCCESS EQUAL 0 AND RPM_EXECUTABLE) + execute_process( + COMMAND "${RPM_EXECUTABLE}" --querytags + OUTPUT_VARIABLE RPMBUILD_TAG_LIST + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() string(REPLACE "\n" ";" RPMBUILD_TAG_LIST "${RPMBUILD_TAG_LIST}") # In some versions of RPM, weak dependency tags are present in the --querytags -- cgit v0.12