CPackRPM: add scriplets tags only if scripts exist

Scriplet tags should not be added to generated
spec files if scripts weren't provided as those
tags are otherwise present in generated rpm file
even if the script wasn't provided thereby
generating unneeded dependency on shell.

Fixes: #21345
This commit is contained in:
Domen Vrankar
2021-04-01 22:28:24 +02:00
parent 0fee2adf8c
commit 34c8a23044
7 changed files with 153 additions and 106 deletions

View File

@@ -6,6 +6,56 @@
cmake_policy(PUSH) cmake_policy(PUSH)
cmake_policy(SET CMP0057 NEW) # if IN_LIST cmake_policy(SET CMP0057 NEW) # if IN_LIST
function(set_spec_script_if_enabled TYPE PACKAGE_NAME VAR)
if(NOT "${VAR}" STREQUAL "" AND NOT "${VAR}" STREQUAL "\n")
if(PACKAGE_NAME)
set(PACKAGE_NAME " -n ${PACKAGE_NAME}")
endif()
set(${TYPE}_
"%${TYPE}${PACKAGE_NAME}\n"
"${VAR}\n" PARENT_SCOPE)
else()
set(${TYPE} "" PARENT_SCOPE)
endif()
endfunction()
macro(set_spec_scripts PACKAGE_NAME)
# we should only set scripts that were provided
# as script announcement without content inside
# spec file will generate unneeded dependency
# on shell
set_spec_script_if_enabled(
"post"
"${PACKAGE_NAME}"
"${RPM_SYMLINK_POSTINSTALL}\n${CPACK_RPM_SPEC_POSTINSTALL}")
set_spec_script_if_enabled(
"posttrans"
"${PACKAGE_NAME}"
"${CPACK_RPM_SPEC_POSTTRANS}")
set_spec_script_if_enabled(
"postun"
"${PACKAGE_NAME}"
"${CPACK_RPM_SPEC_POSTUNINSTALL}")
set_spec_script_if_enabled(
"pre"
"${PACKAGE_NAME}"
"${CPACK_RPM_SPEC_PREINSTALL}")
set_spec_script_if_enabled(
"pretrans"
"${PACKAGE_NAME}"
"${CPACK_RPM_SPEC_PRETRANS}")
set_spec_script_if_enabled(
"preun"
"${PACKAGE_NAME}"
"${CPACK_RPM_SPEC_PREUNINSTALL}")
endmacro()
function(get_file_permissions FILE RETURN_VAR) function(get_file_permissions FILE RETURN_VAR)
execute_process(COMMAND ls -l ${FILE} execute_process(COMMAND ls -l ${FILE}
OUTPUT_VARIABLE permissions_ OUTPUT_VARIABLE permissions_
@@ -1613,6 +1663,9 @@ Vendor: \@CPACK_RPM_PACKAGE_VENDOR\@
) )
elseif(GENERATE_SPEC_PARTS) # binary rpm with single debuginfo package elseif(GENERATE_SPEC_PARTS) # binary rpm with single debuginfo package
set_spec_scripts("${CPACK_RPM_PACKAGE_NAME}")
file(WRITE ${CPACK_RPM_BINARY_SPECFILE}.in file(WRITE ${CPACK_RPM_BINARY_SPECFILE}.in
"# -*- rpm-spec -*- "# -*- rpm-spec -*-
%package -n \@CPACK_RPM_PACKAGE_NAME\@ %package -n \@CPACK_RPM_PACKAGE_NAME\@
@@ -1643,24 +1696,12 @@ Vendor: \@CPACK_RPM_PACKAGE_VENDOR\@
%description -n \@CPACK_RPM_PACKAGE_NAME\@ %description -n \@CPACK_RPM_PACKAGE_NAME\@
\@CPACK_RPM_PACKAGE_DESCRIPTION\@ \@CPACK_RPM_PACKAGE_DESCRIPTION\@
%post -n \@CPACK_RPM_PACKAGE_NAME\@ \@post_\@
\@RPM_SYMLINK_POSTINSTALL\@ \@posttrans_\@
\@CPACK_RPM_SPEC_POSTINSTALL\@ \@postun_\@
\@pre_\@
%posttrans -n \@CPACK_RPM_PACKAGE_NAME\@ \@pretrans_\@
\@CPACK_RPM_SPEC_POSTTRANS\@ \@preun_\@
%postun -n \@CPACK_RPM_PACKAGE_NAME\@
\@CPACK_RPM_SPEC_POSTUNINSTALL\@
%pre -n \@CPACK_RPM_PACKAGE_NAME\@
\@CPACK_RPM_SPEC_PREINSTALL\@
%pretrans -n \@CPACK_RPM_PACKAGE_NAME\@
\@CPACK_RPM_SPEC_PRETRANS\@
%preun -n \@CPACK_RPM_PACKAGE_NAME\@
\@CPACK_RPM_SPEC_PREUNINSTALL\@
%files -n \@CPACK_RPM_PACKAGE_NAME\@ %files -n \@CPACK_RPM_PACKAGE_NAME\@
%defattr(\@TMP_DEFAULT_FILE_PERMISSIONS\@,\@TMP_DEFAULT_USER\@,\@TMP_DEFAULT_GROUP\@,\@TMP_DEFAULT_DIR_PERMISSIONS\@) %defattr(\@TMP_DEFAULT_FILE_PERMISSIONS\@,\@TMP_DEFAULT_USER\@,\@TMP_DEFAULT_GROUP\@,\@TMP_DEFAULT_DIR_PERMISSIONS\@)
@@ -1687,6 +1728,8 @@ Vendor: \@CPACK_RPM_PACKAGE_VENDOR\@
set(RPMBUILD_FLAGS "-bb") set(RPMBUILD_FLAGS "-bb")
if(CPACK_RPM_GENERATE_USER_BINARY_SPECFILE_TEMPLATE OR NOT CPACK_RPM_USER_BINARY_SPECFILE) if(CPACK_RPM_GENERATE_USER_BINARY_SPECFILE_TEMPLATE OR NOT CPACK_RPM_USER_BINARY_SPECFILE)
set_spec_scripts("")
file(WRITE ${CPACK_RPM_BINARY_SPECFILE}.in file(WRITE ${CPACK_RPM_BINARY_SPECFILE}.in
"# Restore old style debuginfo creation for rpm >= 4.14. "# Restore old style debuginfo creation for rpm >= 4.14.
%undefine _debugsource_packages %undefine _debugsource_packages
@@ -1750,24 +1793,12 @@ mv %_topdir/tmpBBroot $RPM_BUILD_ROOT
%clean %clean
%post \@post_\@
\@RPM_SYMLINK_POSTINSTALL\@ \@posttrans_\@
\@CPACK_RPM_SPEC_POSTINSTALL\@ \@postun_\@
\@pre_\@
%posttrans \@pretrans_\@
\@CPACK_RPM_SPEC_POSTTRANS\@ \@preun_\@
%postun
\@CPACK_RPM_SPEC_POSTUNINSTALL\@
%pre
\@CPACK_RPM_SPEC_PREINSTALL\@
%pretrans
\@CPACK_RPM_SPEC_PRETRANS\@
%preun
\@CPACK_RPM_SPEC_PREUNINSTALL\@
%files %files
%defattr(\@TMP_DEFAULT_FILE_PERMISSIONS\@,\@TMP_DEFAULT_USER\@,\@TMP_DEFAULT_GROUP\@,\@TMP_DEFAULT_DIR_PERMISSIONS\@) %defattr(\@TMP_DEFAULT_FILE_PERMISSIONS\@,\@TMP_DEFAULT_USER\@,\@TMP_DEFAULT_GROUP\@,\@TMP_DEFAULT_DIR_PERMISSIONS\@)

View File

@@ -16,7 +16,7 @@ run_cpack_test(VERSION "RPM.VERSION;DEB.VERSION" false "MONOLITHIC;COMPONENT")
run_cpack_test(EXTRA "DEB.EXTRA" false "COMPONENT") run_cpack_test(EXTRA "DEB.EXTRA" false "COMPONENT")
run_cpack_test_subtests(GENERATE_SHLIBS "soversion_not_zero;soversion_zero" "DEB.GENERATE_SHLIBS" true "COMPONENT") run_cpack_test_subtests(GENERATE_SHLIBS "soversion_not_zero;soversion_zero" "DEB.GENERATE_SHLIBS" true "COMPONENT")
run_cpack_test(GENERATE_SHLIBS_LDCONFIG "DEB.GENERATE_SHLIBS_LDCONFIG" true "COMPONENT") run_cpack_test(GENERATE_SHLIBS_LDCONFIG "DEB.GENERATE_SHLIBS_LDCONFIG" true "COMPONENT")
run_cpack_test_subtests(INSTALL_SCRIPTS "default;single_debug_info" "RPM.INSTALL_SCRIPTS" false "COMPONENT") run_cpack_test_subtests(INSTALL_SCRIPTS "default;single_debug_info;no_scripts;no_scripts_single_debug_info" "RPM.INSTALL_SCRIPTS" false "COMPONENT")
run_cpack_test(LONG_FILENAMES "DEB.LONG_FILENAMES" false "MONOLITHIC") run_cpack_test(LONG_FILENAMES "DEB.LONG_FILENAMES" false "MONOLITHIC")
run_cpack_test_subtests(MAIN_COMPONENT "invalid;found" "RPM.MAIN_COMPONENT" false "COMPONENT") run_cpack_test_subtests(MAIN_COMPONENT "invalid;found" "RPM.MAIN_COMPONENT" false "COMPONENT")
run_cpack_test(MINIMAL "RPM.MINIMAL;DEB.MINIMAL;7Z;TBZ2;TGZ;TXZ;TZ;ZIP;STGZ;External" false "MONOLITHIC;COMPONENT") run_cpack_test(MINIMAL "RPM.MINIMAL;DEB.MINIMAL;7Z;TBZ2;TGZ;TXZ;TZ;ZIP;STGZ;External" false "MONOLITHIC;COMPONENT")

View File

@@ -1,4 +1,4 @@
if(RunCMake_SUBTEST_SUFFIX STREQUAL "single_debug_info") if(RunCMake_SUBTEST_SUFFIX MATCHES ".*single_debug_info")
set(EXPECTED_FILE_1 "install_scripts-0.1.1-1.*.rpm") set(EXPECTED_FILE_1 "install_scripts-0.1.1-1.*.rpm")
else() else()
set(EXPECTED_FILE_1_COMPONENT "foo") set(EXPECTED_FILE_1_COMPONENT "foo")

View File

@@ -1,5 +1,5 @@
function(get_test_prerequirements found_var config_file) function(get_test_prerequirements found_var config_file)
if(SUBTEST_SUFFIX STREQUAL "single_debug_info") if(SUBTEST_SUFFIX MATCHES ".*single_debug_info")
include(${config_file}) include(${config_file})
if(OBJDUMP_EXECUTABLE) if(OBJDUMP_EXECUTABLE)

View File

@@ -7,23 +7,34 @@ function(checkScripts_ FILE COMPARE_LIST)
ERROR_QUIET ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE) OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\n" ";" FILE_SCRIPTS_LIST_ "${FILE_SCRIPTS_}") if(COMPARE_LIST STREQUAL "")
if(NOT FILE_SCRIPTS_ STREQUAL "")
message(FATAL_ERROR "No scripts were expected in '${FILE}'; file info: '${FILE_SCRIPTS_}'")
endif()
else()
string(REPLACE "\n" ";" FILE_SCRIPTS_LIST_ "${FILE_SCRIPTS_}")
foreach(COMPARE_REGEX_ IN LISTS COMPARE_LIST) foreach(COMPARE_REGEX_ IN LISTS COMPARE_LIST)
unset(FOUND_) unset(FOUND_)
foreach(COMPARE_ IN LISTS FILE_SCRIPTS_LIST_) foreach(COMPARE_ IN LISTS FILE_SCRIPTS_LIST_)
if(COMPARE_ MATCHES "${COMPARE_REGEX_}") if(COMPARE_ MATCHES "${COMPARE_REGEX_}")
set(FOUND_ true) set(FOUND_ true)
break() break()
endif()
endforeach()
if(NOT FOUND_)
message(FATAL_ERROR "Missing scripts in '${FILE}'; file info: '${FILE_SCRIPTS_}'; missing: '${COMPARE_REGEX_}'")
endif() endif()
endforeach() endforeach()
endif()
if(NOT FOUND_)
message(FATAL_ERROR "Missing scripts in '${FILE}'; file info: '${FILE_SCRIPTS_}'; missing: '${COMPARE_REGEX_}'")
endif()
endforeach()
endfunction() endfunction()
checkScripts_("${FOUND_FILE_1}" "echo \"pre install foo\";echo \"post install foo\";echo \"pre uninstall foo\";echo \"post uninstall foo\";echo \"pre trans foo\";echo \"post trans foo\"") if(RunCMake_SUBTEST_SUFFIX MATCHES "no_scripts.*")
checkScripts_("${FOUND_FILE_2}" "echo \"pre install\";echo \"post install\";echo \"pre uninstall\";echo \"post uninstall\";echo \"pre trans\";echo \"post trans\"") checkScripts_("${FOUND_FILE_1}" "")
checkScripts_("${FOUND_FILE_2}" "")
else()
checkScripts_("${FOUND_FILE_1}" "echo \"pre install foo\";echo \"post install foo\";echo \"pre uninstall foo\";echo \"post uninstall foo\";echo \"pre trans foo\";echo \"post trans foo\"")
checkScripts_("${FOUND_FILE_2}" "echo \"pre install\";echo \"post install\";echo \"pre uninstall\";echo \"post uninstall\";echo \"pre trans\";echo \"post trans\"")
endif()

View File

@@ -1,31 +1,5 @@
if(GENERATOR_TYPE STREQUAL "RPM") if(GENERATOR_TYPE STREQUAL "RPM")
set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE if(RunCMake_SUBTEST_SUFFIX MATCHES ".*single_debug_info")
"${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh")
set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/post_install.sh")
set(CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall.sh")
set(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/post_uninstall.sh")
set(CPACK_RPM_PRE_TRANS_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/pre_trans.sh")
set(CPACK_RPM_POST_TRANS_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/post_trans.sh")
set(CPACK_RPM_foo_PRE_INSTALL_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/pre_install_foo.sh")
set(CPACK_RPM_foo_POST_INSTALL_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/post_install_foo.sh")
set(CPACK_RPM_foo_PRE_UNINSTALL_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall_foo.sh")
set(CPACK_RPM_foo_POST_UNINSTALL_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/post_uninstall_foo.sh")
set(CPACK_RPM_foo_PRE_TRANS_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/pre_trans_foo.sh")
set(CPACK_RPM_foo_POST_TRANS_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/post_trans_foo.sh")
if(RunCMake_SUBTEST_SUFFIX STREQUAL "single_debug_info")
set(CPACK_RPM_MAIN_COMPONENT "foo") set(CPACK_RPM_MAIN_COMPONENT "foo")
set(CPACK_RPM_DEBUGINFO_SINGLE_PACKAGE ON) set(CPACK_RPM_DEBUGINFO_SINGLE_PACKAGE ON)
set(CPACK_RPM_FOO_FILE_NAME "RPM-DEFAULT") set(CPACK_RPM_FOO_FILE_NAME "RPM-DEFAULT")
@@ -34,33 +8,63 @@ endif()
set(CMAKE_BUILD_WITH_INSTALL_RPATH 1) set(CMAKE_BUILD_WITH_INSTALL_RPATH 1)
# default if(NOT RunCMake_SUBTEST_SUFFIX MATCHES "no_scripts.*")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh" if(GENERATOR_TYPE STREQUAL "RPM")
"echo \"pre install\"\n") set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_install.sh" "${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh")
"echo \"post install\"\n") set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall.sh" "${CMAKE_CURRENT_BINARY_DIR}/post_install.sh")
"echo \"pre uninstall\"\n") set(CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_uninstall.sh" "${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall.sh")
"echo \"post uninstall\"\n") set(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_trans.sh" "${CMAKE_CURRENT_BINARY_DIR}/post_uninstall.sh")
"echo \"pre trans\"\n") set(CPACK_RPM_PRE_TRANS_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_trans.sh" "${CMAKE_CURRENT_BINARY_DIR}/pre_trans.sh")
"echo \"post trans\"\n") set(CPACK_RPM_POST_TRANS_SCRIPT_FILE
"${CMAKE_CURRENT_BINARY_DIR}/post_trans.sh")
# specific set(CPACK_RPM_foo_PRE_INSTALL_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_install_foo.sh" "${CMAKE_CURRENT_BINARY_DIR}/pre_install_foo.sh")
"echo \"pre install foo\"\n") set(CPACK_RPM_foo_POST_INSTALL_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_install_foo.sh" "${CMAKE_CURRENT_BINARY_DIR}/post_install_foo.sh")
"echo \"post install foo\"\n") set(CPACK_RPM_foo_PRE_UNINSTALL_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall_foo.sh" "${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall_foo.sh")
"echo \"pre uninstall foo\"\n") set(CPACK_RPM_foo_POST_UNINSTALL_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_uninstall_foo.sh" "${CMAKE_CURRENT_BINARY_DIR}/post_uninstall_foo.sh")
"echo \"post uninstall foo\"\n") set(CPACK_RPM_foo_PRE_TRANS_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_trans_foo.sh" "${CMAKE_CURRENT_BINARY_DIR}/pre_trans_foo.sh")
"echo \"pre trans foo\"\n") set(CPACK_RPM_foo_POST_TRANS_SCRIPT_FILE
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_trans_foo.sh" "${CMAKE_CURRENT_BINARY_DIR}/post_trans_foo.sh")
"echo \"post trans foo\"\n") endif()
# default
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh"
"echo \"pre install\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_install.sh"
"echo \"post install\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall.sh"
"echo \"pre uninstall\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_uninstall.sh"
"echo \"post uninstall\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_trans.sh"
"echo \"pre trans\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_trans.sh"
"echo \"post trans\"\n")
# specific
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_install_foo.sh"
"echo \"pre install foo\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_install_foo.sh"
"echo \"post install foo\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_uninstall_foo.sh"
"echo \"pre uninstall foo\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_uninstall_foo.sh"
"echo \"post uninstall foo\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/pre_trans_foo.sh"
"echo \"pre trans foo\"\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/post_trans_foo.sh"
"echo \"post trans foo\"\n")
endif()
install(FILES CMakeLists.txt DESTINATION foo COMPONENT foo) install(FILES CMakeLists.txt DESTINATION foo COMPONENT foo)
install(FILES CMakeLists.txt DESTINATION bar COMPONENT bar) install(FILES CMakeLists.txt DESTINATION bar COMPONENT bar)