diff options
-rw-r--r-- | subr.ex/ex_rtl.subr | 105 | ||||
-rw-r--r-- | subr.ex/ex_rtl_rpm.subr | 253 | ||||
-rw-r--r-- | subr.pkg/pkg_install_rpm.subr | 1 |
3 files changed, 254 insertions, 105 deletions
diff --git a/subr.ex/ex_rtl.subr b/subr.ex/ex_rtl.subr index 1da1b8ef..a6177fa7 100644 --- a/subr.ex/ex_rtl.subr +++ b/subr.ex/ex_rtl.subr @@ -5,111 +5,6 @@ # # -# ex_rtl_build_rpm() - build RPM package -# @_destdir: package destination directory -# @_name: package name -# @_rpms_dname: RPMs directory pathname -# @_spec_fname: RPM .spec file pathname -# @_spec_fname_tgt: target package RPM .spec file pathname -# @_tmp_dname: temporary files directory pathname -# @_topdir: package top directory -# @_url: package URL -# @_version: package version -# @_version_rpm: package RPM version -# -# Returns: zero (0) on success, non-zero (>0) on failure -# -ex_rtl_build_rpm() { - local _erbr_destdir="${1}" _erbr_name="${2}" _erbr_rpms_dname="${3}" _erbr_spec_fname="${4}" \ - _erbr_spec_fname_tgt="${5}" _erbr_tmp_dname="${6}" _erbr_topdir="${7}" _erbr_url="${8}" \ - _erbr_version="${9}" _erbr_version_rpm="${10}" \ - _erbr_rc=0; - - if ! rtl_fileop cp "${_erbr_spec_fname}" "${_erbr_spec_fname_tgt}"; then - return 1; - else - while true; do - rpmbuild \ - -bb \ - \ - --define "_binary_payload w2T16.xzdio" \ - \ - --define="_tmppath ${_erbr_tmp_dname=}" \ - --define="_topdir ${_erbr_topdir}" \ - --define="pkg_destdir ${_erbr_destdir}" \ - --define="pkg_name ${_erbr_name}" \ - --define="pkg_url ${_erbr_url}" \ - --define="pkg_version_full ${_erbr_version}" \ - --define="pkg_version_rpm ${_erbr_version_rpm}" \ - --nodeps "${_erbr_spec_fname_tgt}"; - _erbr_rc="${?}"; - - if [ "${_erbr_rc}" -eq 0 ]; then - break; - elif [ "${_erbr_rc}" -eq 141 ]; then - continue; - else - return "${_erbr_rc}"; - fi; - done; - - if ! find "${_erbr_rpms_dname}/${_erbr_name}-${_erbr_version_rpm}/RPMS" \ - -iname \*.rpm -exec cp -pP {} "${_erbr_rpms_dname}/" \; \ - || ! rtl_fileop rm "${_erbr_rpms_dname}/${_erbr_name}-${_erbr_version_rpm}" \ - || ! rtl_fileop cp "${_erbr_spec_fname_tgt}" "${_erbr_rpms_dname}/"; - then - return 1; - fi; - fi; - - return 0; -}; - -# -# ex_rtl_expand_rpm_version() - expand RPM version strings -# @_rurl: out reference to package URL -# @_rversion: out reference to package version -# @_rversion_rpm: out reference to RPM version string -# @_subdir: package subdirectory -# @_url: package URL -# @_url_censor: package URL filter -# @_urls_git: package Git URL(s) -# @_version: package version -# -# Returns: zero (0) on success, non-zero (>0) on failure -# -ex_rtl_expand_rpm_version() { - local _ererv_rurl="${1#\$}" _ererv_rversion="${2#\$}" _ererv_rversion_rpm="${3#\$}" \ - _ererv_subdir="${4}" _ererv_url="${5}" _ererv_url_censor="${6}" \ - _ererv_urls_git="${7}" _ererv_version="${8}" \ - _ererv_version_full="" _ererv_version_rpm="" - - if [ "${_ererv_url:+1}" = 1 ]; then - _ererv_url="${_ererv_url%% *}"; - _ererv_version_full="${_ererv_version}"; - _ererv_version_rpm="${_ererv_version%%-*}"; - - elif [ "${_ererv_urls_git:+1}" = 1 ]; then - _ererv_url="${_ererv_urls_git%% *}"; - _ererv_url="${_ererv_url##*=}"; - _ererv_url="${_ererv_url%%@*}"; - - _ererv_version_rpm="$(cd "${_ererv_subdir}" && git rev-parse HEAD)" || return 1; - _ererv_version_full="${_ererv_version_rpm} ($(cd "${_ererv_subdir}" && git rev-parse --abbrev-ref HEAD))" || return 1; - fi; - - if [ "${_ererv_url#${_ererv_url_censor}}" != "${_ererv_url}" ]; then - _ererv_url="Unknown"; - fi; - - eval ${_ererv_rurl}='${_ererv_url}'; - eval ${_ererv_rversion}='${_ererv_version_full}'; - eval ${_ererv_rversion_rpm}='${_ererv_version_rpm}'; - - return 0; -}; - -# # ex_rtl_fixup_pkgconfig_paths() - fixup pathname prefixes in pkg-config(1) files # @_dname_base: base directory pathname # diff --git a/subr.ex/ex_rtl_rpm.subr b/subr.ex/ex_rtl_rpm.subr new file mode 100644 index 00000000..563ded8f --- /dev/null +++ b/subr.ex/ex_rtl_rpm.subr @@ -0,0 +1,253 @@ +# +# Copyright (c) 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 LucĂa Andrea Illanes Albornoz <lucia@luciaillanes.de> +# set +o errexit -o noglob -o nounset is assumed. +# +# + +# +# ex_rtl_build_rpm() - build RPM package +# @_destdir: package destination directory +# @_jobs_max: maximum count of simultaneously executing rpmbuild(1) processes +# @_jobs_semaphore: pathname to current count of simultaneously executing rpmbuild(1) processes semaphore file +# @_jobs_wait: wait period in seconds when @_jobs_semaphore is locked +# @_name: package name +# @_rpms_dname: RPMs directory pathname +# @_spec_fname: RPM .spec file pathname +# @_spec_fname_tgt: target package RPM .spec file pathname +# @_tmp_dname: temporary files directory pathname +# @_topdir: package top directory +# @_url: package URL +# @_version: package version +# @_version_rpm: package RPM version +# +# Returns: zero (0) on success, non-zero (>0) on failure +# +ex_rtl_build_rpm() { + local _erbr_destdir="${1}" _erbr_jobs_max="${2}" _erbr_jobs_semaphore="${3}" _erbr_jobs_wait="${4}" \ + _erbr_name="${5}" _erbr_rpms_dname="${6}" _erbr_spec_fname="${7}" _erbr_spec_fname_tgt="${8}" \ + _erbr_tmp_dname="${9}" _erbr_topdir="${10}" _erbr_url="${11}" _erbr_version="${12}" \ + _erbr_version_rpm="${13}" \ + _erbr_job_count=0 _erbr_rc=0 _erbr_rc_jobs=0; + +( + while true; do + (set +o errexit -o noglob -o nounset; + rtl_flock_acquire 4 || exit $((${?} + 1)); + + read _erbr_job_count <&4; + if [ "${_erbr_job_count:+1}" != 1 ]; then + _erbr_job_count=0; + fi; + + if [ "${_erbr_job_count}" -ge "${_erbr_jobs_max}" ]; then + exit 1; + else + : $((_erbr_job_count += 1)); + printf "%s" "${_erbr_job_count}" >"${_erbr_jobs_semaphore}" || exit $((${?} + 1)); + exit 0; + fi) 4<>"${_erbr_jobs_semaphore}"; + _erbr_rc_jobs="${?}"; + + case "${_erbr_rc_jobs}" in + 0) break; ;; + 1) sleep "${_erbr_jobs_wait}" || return "${?}"; ;; + *) return $((${_erbr_rc_jobs} - 1)); + esac; + done; + + trap ' + (set +o errexit -o noglob -o nounset; + rtl_flock_acquire 4 || exit 1; + + read _erbr_job_count <&4; + if [ "${_erbr_job_count:+1}" != 1 ]\ + || [ "${_erbr_job_count}" -lt 1 ]; then + _erbr_job_count=1; + fi; + + : $((_erbr_job_count -= 1)); + printf "%s" "${_erbr_job_count}" >"${_erbr_jobs_semaphore}" || exit 1; + exit 0) 4<>"${_erbr_jobs_semaphore}"' \ + EXIT HUP INT TERM USR1 USR2; + + if ! rtl_fileop cp "${_erbr_spec_fname}" "${_erbr_spec_fname_tgt}"; then + _erbr_rc=1; + else + while true; do + rpmbuild \ + -bb \ + \ + --define "_binary_payload w2T16.xzdio" \ + \ + --define="_tmppath ${_erbr_tmp_dname=}" \ + --define="_topdir ${_erbr_topdir}" \ + --define="pkg_destdir ${_erbr_destdir}" \ + --define="pkg_name ${_erbr_name}" \ + --define="pkg_url ${_erbr_url}" \ + --define="pkg_version_full ${_erbr_version}" \ + --define="pkg_version_rpm ${_erbr_version_rpm}" \ + --nodeps "${_erbr_spec_fname_tgt}"; + _erbr_rc="${?}"; + + if [ "${_erbr_rc}" -eq 141 ]; then + _erbr_rc=0; continue; + else + break; + fi; + done; + + if [ "${_erbr_rc}" -eq 0 ]; then + if ! find "${_erbr_rpms_dname}/${_erbr_name}-${_erbr_version_rpm}/RPMS" \ + -iname \*.rpm -exec cp -pP {} "${_erbr_rpms_dname}/" \; \ + || ! rtl_fileop rm "${_erbr_rpms_dname}/${_erbr_name}-${_erbr_version_rpm}" \ + || ! rtl_fileop cp "${_erbr_spec_fname_tgt}" "${_erbr_rpms_dname}/"; + then + _erbr_rc=1; + fi; + fi; + fi; + + exit "${_erbr_rc}"; +); + _erbr_rc="${?}"; + + return "${_erbr_rc}"; +}; + +# +# ex_rtl_expand_rpm_version() - expand RPM version strings +# @_rurl: out reference to package URL +# @_rversion: out reference to package version +# @_rversion_rpm: out reference to RPM version string +# @_subdir: package subdirectory +# @_url: package URL +# @_url_censor: package URL filter +# @_urls_git: package Git URL(s) +# @_version: package version +# +# Returns: zero (0) on success, non-zero (>0) on failure +# +ex_rtl_expand_rpm_version() { + local _ererv_rurl="${1#\$}" _ererv_rversion="${2#\$}" _ererv_rversion_rpm="${3#\$}" \ + _ererv_subdir="${4}" _ererv_url="${5}" _ererv_url_censor="${6}" \ + _ererv_urls_git="${7}" _ererv_version="${8}" \ + _ererv_version_full="" _ererv_version_rpm="" + + if [ "${_ererv_url:+1}" = 1 ]; then + _ererv_url="${_ererv_url%% *}"; + _ererv_version_full="${_ererv_version}"; + _ererv_version_rpm="${_ererv_version%%-*}"; + + elif [ "${_ererv_urls_git:+1}" = 1 ]; then + _ererv_url="${_ererv_urls_git%% *}"; + _ererv_url="${_ererv_url##*=}"; + _ererv_url="${_ererv_url%%@*}"; + + _ererv_version_rpm="$(cd "${_ererv_subdir}" && git rev-parse HEAD)" || return 1; + _ererv_version_full="${_ererv_version_rpm} ($(cd "${_ererv_subdir}" && git rev-parse --abbrev-ref HEAD))" || return 1; + fi; + + if [ "${_ererv_url#${_ererv_url_censor}}" != "${_ererv_url}" ]; then + _ererv_url="Unknown"; + fi; + + eval ${_ererv_rurl}='${_ererv_url}'; + eval ${_ererv_rversion}='${_ererv_version_full}'; + eval ${_ererv_rversion_rpm}='${_ererv_version_rpm}'; + + return 0; +}; + +# +# ex_rtl_fixup_pkgconfig_paths() - fixup pathname prefixes in pkg-config(1) files +# @_dname_base: base directory pathname +# +# Returns: zero (0) on success, non-zero (>0) on failure +# +ex_rtl_fixup_pkgconfig_paths() { + local _erfpp_dname_base="${1}" \ + _erfpp_pc_path=""; + + for _erfpp_pc_path in $(find "${_erfpp_dname_base=}" -name \*.pc); do + if [ -n "$(sed -ne '/^libdir=[^$]*$/p' "${_erfpp_pc_path}")" ] \ + && ! sed -i"" -e '/^libdir=[^$]*$/s/^libdir=\(.*\)$/libdir=${exec_prefix}\1/' \ + -e '/^exec_prefix=$/s/^.*$/exec_prefix=${prefix}/' \ + "${_erfpp_pc_path}"; + then + return 1; + fi; + + if [ -n "$(sed -ne '/^includedir=[^$]*$/p' "${_erfpp_pc_path}")" ] \ + && ! sed -i"" -e '/^includedir=[^$]*$/s/^includedir=\(.*\)$/includedir=${prefix}\1/' \ + "${_erfpp_pc_path}"; + then + return 1; + fi; + done; + + return 0; +}; + +# +# ex_rtl_purge_la_files() - purge .la files in tree +# @_dname_base: base directory pathname +# +# Returns: zero (0) on success, non-zero (>0) on failure +# +ex_rtl_purge_la_files() { + local _erplf_dname_base="${1}" \ + _erplf_la_path=""; + + for _erplf_la_path in $(find \ + "${_erplf_dname_base}" \ + -type f \ + -name \*.la); + do + if ! rtl_fileop rm "${_erplf_la_path}"; then + return 1; + fi; + done; + return 0; +}; + +# +# ex_rtl_strip_files() - strip files of debugging information +# @_strip_cmd: strip(1) command name +# @_tree_root: pathname to tree root +# @--: (ignored) +# @_log_fn: logging function name; called with @... and pathname of each file stripped +# @...: @_fn initial arguments list as positional parameters +# +# Returns: zero (0) on success, non-zero (>0) on failure +# +ex_rtl_strip_files() { + local _ersf_strip_cmd="${1}" _ersf_tree_root="${2}" \ + _ersf_ignored="${3}" _ersf_log_fn="${4}" \ + _ersf_bin_path=""; + shift 4; + + if [ -e "${_ersf_tree_root}" ]; then + for _ersf_bin_path in $(find \ + "${_ersf_tree_root}" \ + -perm /a=x \ + -type f); + do + if objdump \ + -sj .debug_frame \ + -j .debug_info \ + "${_ersf_bin_path}" \ + >/dev/null 2>&1; + then + if ! "${_ersf_strip_cmd}" "${_ersf_bin_path}"; then + return 1; + else + "${_ersf_log_fn}" "${@}" "${_ersf_bin_path}"; + fi; + fi; + done; + fi; + + return 0; +}; + +# vim:filetype=sh textwidth=0 diff --git a/subr.pkg/pkg_install_rpm.subr b/subr.pkg/pkg_install_rpm.subr index ac3d4407..c5ddf80a 100644 --- a/subr.pkg/pkg_install_rpm.subr +++ b/subr.pkg/pkg_install_rpm.subr @@ -18,6 +18,7 @@ pkg_install_rpm() { "${PKG_VERSION:-}" || return 1; ex_rtl_build_rpm \ "${PKG_DESTDIR}" \ + 1 "${BUILD_WORKDIR}/rpm.jobs" 8 \ "${PKG_NAME}" \ "${PREFIX_RPM}" \ "${MIDIPIX_BUILD_PWD}/etc/package.spec" \ |