summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--subr.ex/ex_rtl.subr105
-rw-r--r--subr.ex/ex_rtl_rpm.subr253
-rw-r--r--subr.pkg/pkg_install_rpm.subr1
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" \