Browse Source

Merge topic 'cpack-rpm-weak-deps'

283a48403f CPack/RPM: Fix detection of RPM support for weak dependencies
ab4e74ad0b CPack/RPM: Remove redundant conditions for presence of rpmbuild

Acked-by: Kitware Robot <[email protected]>
Merge-request: !10403
Brad King 10 months ago
parent
commit
759ba45bdb

+ 46 - 61
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

+ 13 - 7
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()