diff --git a/Modules/Internal/CPack/CPackRPM.cmake b/Modules/Internal/CPack/CPackRPM.cmake index 5ac5336a69..dcc575f613 100644 --- a/Modules/Internal/CPack/CPackRPM.cmake +++ b/Modules/Internal/CPack/CPackRPM.cmake @@ -808,25 +808,26 @@ 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() + + # 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 - 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 @@ -856,16 +857,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) @@ -1090,7 +1081,7 @@ function(cpack_rpm_generate_package) 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) + if(NOT RPMBUILD_QUERYTAGS_SUCCESS EQUAL 0 AND RPM_EXECUTABLE) execute_process( COMMAND "${RPM_EXECUTABLE}" --querytags OUTPUT_VARIABLE RPMBUILD_TAG_LIST @@ -1101,16 +1092,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) @@ -1892,31 +1883,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 diff --git a/Tests/RunCMake/CPack/tests/SUGGESTS/VerifyResult.cmake b/Tests/RunCMake/CPack/tests/SUGGESTS/VerifyResult.cmake index d1d615be71..36d070f4be 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()