summaryrefslogtreecommitdiffhomepage
path: root/subr
diff options
context:
space:
mode:
authorLucio Andrés Illanes Albornoz <lucio@lucioillanes.de>2020-03-15 09:14:23 +0000
committerLucio Andrés Illanes Albornoz <lucio@lucioillanes.de>2020-03-15 09:14:23 +0000
commitb6a9a1a3c8b98077cce47d579069c42080d17da5 (patch)
tree56301493a28e098de840c21b6d7e2776dd5574a1 /subr
parent3e295f4e81f867fbd8b6c9c306bc1ca124e41d8b (diff)
downloadmidipix_build-b6a9a1a3c8b98077cce47d579069c42080d17da5.tar.bz2
midipix_build-b6a9a1a3c8b98077cce47d579069c42080d17da5.tar.xz
General cleanup.
Diffstat (limited to 'subr')
-rw-r--r--subr/build_init.subr274
-rw-r--r--subr/ex_pkg.subr132
-rw-r--r--subr/ex_pkg_dispatch.subr101
-rw-r--r--subr/ex_pkg_env.subr6
-rw-r--r--subr/ex_pkg_exec.subr8
-rw-r--r--subr/pkg_configure_autotools.subr2
-rw-r--r--subr/pkg_fetch_extract.subr4
-rw-r--r--subr/pkg_install.subr4
-rw-r--r--subr/pkg_install_files.subr2
-rw-r--r--subr/pkgtool_init.subr169
-rw-r--r--subr/rtl.subr9
-rw-r--r--subr/rtl_complex.subr21
-rw-r--r--subr/rtl_fetch.subr3
-rw-r--r--subr/rtl_fileop.subr98
-rw-r--r--subr/rtl_list.subr24
-rw-r--r--subr/rtl_log.subr115
-rw-r--r--subr/rtl_string.subr15
17 files changed, 478 insertions, 509 deletions
diff --git a/subr/build_init.subr b/subr/build_init.subr
index eeeaf60b..91784f83 100644
--- a/subr/build_init.subr
+++ b/subr/build_init.subr
@@ -3,87 +3,117 @@
#
buildp_init_args() {
- local _last_pkg=""; _status="";
- if [ "${ARG_AS_NEEDED:-0}" -eq 1 ]\
+ local _group="" _last_pkg="" _pkg_names_unknown="" _rc=0; _status="";
+ if [ "${ARG_DUMP_ON_ABORT:-0}" -eq 1 ]\
+ && [ "${ARG_RELAXED:-0}" -eq 1 ]; then
+ _rc=1; _status="Error: --dump-on-abort excludes -R.";
+ elif [ "${ARG_AS_NEEDED:-0}" -eq 1 ]\
&& [ -e "${PREFIX}/build.gitref" ]\
&& [ "$(git rev-parse HEAD)" = "$(cat "${PREFIX}/build.gitref")" ]; then
- _status="Git repository has not changed since last build and --as-needed was specified.";
- fi;
- if [ -n "${ARG_RESTART}" ]; then
- if [ "${ARG_RESTART#\*\*\*}" != "${ARG_RESTART}" ]; then
- ARG_RESTART="${ARG_RESTART#\*\*\*}"; ARG_RESTART_RECURSIVE=3;
- elif [ "${ARG_RESTART#\*\*}" != "${ARG_RESTART}" ]; then
- ARG_RESTART="${ARG_RESTART#\*\*}"; ARG_RESTART_RECURSIVE=2;
- elif [ "${ARG_RESTART#\*}" != "${ARG_RESTART}" ]; then
- ARG_RESTART="${ARG_RESTART#\*}"; ARG_RESTART_RECURSIVE=1;
- fi;
- fi;
- case "${ARG_RESTART}" in
- ALL) ARG_RESTART_AT=ALL; ARG_RESTART_RECURSIVE=2; ;;
- LAST) ARG_RESTART_AT=ALL; ARG_RESTART_RECURSIVE=0; ;;
- "") ;;
- *:*) ARG_RESTART_AT="${ARG_RESTART#*:}"; ARG_RESTART="$(rtl_llift "${ARG_RESTART%%:*}" "," " ")"; ;;
- *) ARG_RESTART="$(rtl_llift "${ARG_RESTART}" "," " ")"; ARG_RESTART_AT=ALL; ;;
- esac;
- if [ "${ARG_RESTART}" = "LAST" ]; then
- if [ -n "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}" ]\
- && [ -e "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}" ]; then
- _last_pkg="$(cat "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}")";
- rtl_fileop rm "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}";
- rtl_state_clear "${BUILD_WORKDIR}" "${_last_pkg}";
- ARG_RESTART="${_last_pkg}";
+ _rc=0; _status="Git repository has not changed since last build and --as-needed was specified.";
+ else case "${ARG_PARALLEL}" in
+ auto) if ! ARG_PARALLEL="$(rtl_get_cpu_count)"; then
+ _rc=1; _status="Error: failed to get CPU count.";
+ else
+ ARG_PARALLEL=$((${ARG_PARALLEL}/2));
+ fi; ;;
+ "") ARG_PARALLEL=1; ;;
+ *) if ! rtl_isnumber "${ARG_PARALLEL}"; then
+ _rc=1; _status="Error: invalid jobs count \`${ARG_PARALLEL}'.";
+ fi; ;;
+ esac;
+ if [ "${_rc:-0}" -eq 0 ]; then
+ DEFAULT_BUILD_CPUS="${ARG_PARALLEL}";
+ case "${ARG_FETCH_FORCE}" in
+ ipv4) DEFAULT_GIT_ARGS="$(rtl_lconcat "-4" "${DEFAULT_GIT_ARGS}")";
+ DEFAULT_WGET_ARGS="$(rtl_lconcat "-4" "${DEFAULT_GIT_ARGS}")"; ;;
+ ipv6) DEFAULT_GIT_ARGS="$(rtl_lconcat "-6" "${DEFAULT_GIT_ARGS}")";
+ DEFAULT_WGET_ARGS="$(rtl_lconcat "-6" "${DEFAULT_GIT_ARGS}")"; ;;
+ esac;
+ case "${ARG_RESTART}" in
+ \*\*\*[a-zA-Z]*)
+ ARG_RESTART="${ARG_RESTART#\*\*\*}"; ARG_RESTART_RECURSIVE=3; ;;
+ \*\*[a-zA-Z]*) ARG_RESTART="${ARG_RESTART#\*\*}"; ARG_RESTART_RECURSIVE=2; ;;
+ \*[a-zA-Z]*) ARG_RESTART="${ARG_RESTART#\*}"; ARG_RESTART_RECURSIVE=1; ;;
+ ALL) ARG_RESTART_AT=ALL; ARG_RESTART_RECURSIVE=2; ;;
+ LAST) ARG_RESTART_AT=ALL; ARG_RESTART_RECURSIVE=0;
+ if [ -n "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}" ]\
+ && [ -e "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}" ]; then
+ _last_pkg="$(cat "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}")";
+ rtl_fileop rm "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}";
+ rtl_state_clear "${BUILD_WORKDIR}" "${_last_pkg}";
+ ARG_RESTART="${_last_pkg}";
+ else
+ _rc=1; _status="Error: cannot rebuild last failed package.";
+ fi; ;;
+ esac;
+ if [ "${_rc:-0}" -eq 0 ]; then
+ case "${ARG_RESTART}" in
+ *:*) ARG_RESTART_AT="${ARG_RESTART#*:}"; ARG_RESTART="$(rtl_llift "${ARG_RESTART%%:*}" "," " ")"; ;;
+ *) ARG_RESTART="$(rtl_llift "${ARG_RESTART}" "," " ")"; ARG_RESTART_AT=ALL; ;;
+ esac;
+ if ! ex_pkg_load_groups; then
+ _rc=1; _status="Error: failed to load build groups.";
+ else if ! rtl_lmatch "${ARG_DIST}" "rpm" ","; then
+ EX_PKG_BUILD_GROUPS="$(rtl_lfilter "${EX_PKG_BUILD_GROUPS}" "host_deps_rpm")";
+ fi;
+ if [ -z "${BUILD_GROUPS}" ]; then
+ BUILD_GROUPS="${EX_PKG_BUILD_GROUPS}";
+ else for _group in ${BUILD_GROUPS}; do
+ if ! rtl_lmatch "${EX_PKG_BUILD_GROUPS}" "${_group}"; then
+ _rc=1; _status="Error: unknown build group \`${_group}'."; break;
+ fi;
+ done;
+ fi;
+ if [ "${_rc:-0}" -eq 0 ]; then
+ if [ -n "${ARG_DIST}" ]; then
+ BUILD_GROUPS="$(rtl_lconcat "$(rtl_lfilter "${BUILD_GROUPS}" "dist")" "dist")";
+ fi;
+ if [ -n "${ARG_RESTART}" ]; then
+ for _pkg_name in ${ARG_RESTART}; do
+ if ! ex_pkg_find_package "${BUILD_GROUPS}" "${_pkg_name}" >/dev/null; then
+ _pkg_names_unknown="$(rtl_lconcat "${_pkg_names_unknown}" "${_pkg_name}")";
+ fi;
+ done;
+ case "$(rtl_llength "${_pkg_names_unknown}")" in
+ 0) ;;
+ 1) _rc=1; _status="Error: unknown package \`${_pkg_names_unknown}'."; ;;
+ *) _rc=1; _status="Error: unknown packages: $(rtl_subst "${_pkg_names_unknown}" " " ", ")"; ;;
+ esac;
+ fi;
+ if [ "${_rc}" -eq 0 ]; then
+ case "${ARG_VERBOSE:-0}" in
+ 0) rtl_fileop_set_log 0; rtl_log_set_lvl 0; ;;
+ 1) rtl_fileop_set_log 0; rtl_log_set_lvl 2; ;;
+ 2) rtl_fileop_set_log 0; rtl_log_set_lvl 2; ;;
+ 3) rtl_fileop_set_log 0; rtl_log_set_lvl 2; ;;
+ 4) rtl_fileop_set_log 1; rtl_log_set_lvl 3; ;;
+ *) _rc=1; _status="Error: invalid verbosity level (max. -vvvv)"; ;;
+ esac;
+ fi;
+ fi;
+ fi;
+ fi;
fi;
- fi;
- rtl_log_set_vnfo_lvl "${ARG_VERBOSE:-0}";
- case "${ARG_FETCH_FORCE}" in
- ipv4) DEFAULT_GIT_ARGS="$(rtl_lconcat "-4" "${DEFAULT_GIT_ARGS}")";
- DEFAULT_WGET_ARGS="$(rtl_lconcat "-4" "${DEFAULT_GIT_ARGS}")"; ;;
- ipv6) DEFAULT_GIT_ARGS="$(rtl_lconcat "-6" "${DEFAULT_GIT_ARGS}")";
- DEFAULT_WGET_ARGS="$(rtl_lconcat "-6" "${DEFAULT_GIT_ARGS}")"; ;;
- esac;
- return 0;
-};
-
-buildp_init_defaults() {
- local _rc=0; _status="";
-
- # Command-line arguments
- : ${ARCH:="nt64"}; : ${BUILD:="debug"};
- ARG_AS_NEEDED=0; ARG_CLEAN_BUILDS=""; ARG_DEBUG_MINIPIX=0; ARG_DUMP_IN="";
- ARG_DUMP_ON_ABORT=0; ARG_DIST=""; ARG_FETCH_FORCE=0; ARG_PARALLEL=1; ARG_RELAXED=0;
- ARG_RESTART=""; ARG_VERBOSE=0;
-
- # Build parameters & state
- BUILD_HNAME=""; BUILD_IS_PARENT=1; BUILD_GROUPS=""; BUILD_GROUPS_INHIBIT_DEPS=0;
- BUILD_TARGET=""; BUILD_USER=""; MIDIPIX_BUILD_PWD="";
-
- # Global defaults
- DEFAULT_BUILD_CPUS=1;
- DEFAULT_BUILD_LAST_FAILED_PKG_FNAME=""
- DEFAULT_BUILD_LOG_FNAME="";
- DEFAULT_BUILD_STATUS_IN_PROGRESS_FNAME="";
- DEFAULT_BUILD_STEPS="";
- DEFAULT_BUILD_VARS="";
- DEFAULT_CLEAR_PREFIX_PATHS="";
- DEFAULT_GIT_ARGS="";
- DEFAULT_GITROOT_HEAD="";
- DEFAULT_LOG_ENV_VARS="";
- DEFAULT_TARGET="";
- DEFAULT_WGET_ARGS="";
-
- return "${_rc}";
+ fi; return "${_rc}";
};
buildp_init_env() {
local _fname="" _rc=0; _status="";
- if ! umask 022; then
- printf "Error: failed to setup environment.\n"; exit 1;
+ if ! cd "${0%/*}"; then
+ printf "Error: failed to change working directory to \`${0%/*}'." >&2; exit 1;
+ elif ! umask 022; then
+ printf "Error: failed to set umask(2).\n" >&2; exit 1;
+ elif ! BUILD_HNAME="$(hostname)"; then
+ _rc=1; _status="Error: failed to obtain hostname.";
+ elif ! BUILD_USER="$(id -nu)"; then
+ _rc=1; _status="Error: failed to obtain username.";
else for _fname in $(find subr -name *.subr); do
if ! . "${_fname}"; then
printf "Error: failed to source \`%s'.\n" "${_fname}"; exit 1;
fi;
- done; fi;
- return "${_rc}";
+ done;
+ fi; return "${_rc}";
};
buildp_init_files() {
@@ -107,7 +137,7 @@ buildp_init_files() {
rtl_fileop mv "${DEFAULT_BUILD_LOG_FNAME}" "${_log_last_fname}";
rtl_fileop ln_symbolic "${_log_last_fname}" "${DEFAULT_BUILD_LOG_LAST_FNAME}";
fi;
- rtl_fileop touch "${DEFAULT_BUILD_LOG_FNAME}";
+ rtl_fileop touch "${DEFAULT_BUILD_LOG_FNAME}"; rtl_log_set_fname "${DEFAULT_BUILD_LOG_FNAME}";
if rtl_lmatch "${ARG_CLEAN_BUILDS}" "prefix" ","; then
rtl_log_msg info "-C prefix specified, cleaning prefix...";
for _pname in ${DEFAULT_CLEAR_PREFIX_PATHS}; do
@@ -123,6 +153,10 @@ buildp_init_files() {
buildp_init_getopts() {
local _arg="" _opt="" _rc=0 _shiftfl=0 OPTIND=0; _status="";
+ : ${ARCH:="nt64"}; : ${BUILD:="debug"};
+ ARG_AS_NEEDED=0; ARG_CLEAN_BUILDS=""; ARG_DEBUG_MINIPIX=0; ARG_DIST=1; ARG_DUMP_IN="";
+ ARG_DUMP_ON_ABORT=0; ARG_FETCH_FORCE=0; ARG_PARALLEL=1; ARG_RELAXED=0; ARG_RESTART="";
+ ARG_VERBOSE=0;
while [ "${#}" -gt 0 ]; do
case "${1}" in
--as-needed) ARG_AS_NEEDED=1; _shiftfl=1; ;;
@@ -161,13 +195,10 @@ buildp_init_getopts() {
break;
fi;
done;
- if [ "${_rc}" -eq 0 ]; then
- if [ "${ARG_DUMP_ON_ABORT:-0}" -eq 1 ]\
- && [ "${ARG_RELAXED:-0}" -eq 1 ]; then
- _rc=1; _status="Error: --dump-on-abort excludes -R.";
- else while [ ${#} -gt 0 ]; do
- if [ "${1#\*}" != "${1}" ]; then
- BUILD_GROUPS_INHIBIT_DEPS=1; _arg="${1#\*}";
+ if [ "${_rc:-0}" -eq 0 ]; then
+ while [ ${#} -gt 0 ]; do
+ if [ "${1#=}" != "${1}" ]; then
+ BUILD_GROUPS_INHIBIT_DEPS=1; _arg="${1#=}";
else
_arg="${1}";
fi;
@@ -176,56 +207,17 @@ buildp_init_getopts() {
[^a-zA-Z]*) _rc=1; _status="Error: build group names must start with [a-zA-Z] (in argument \`${_arg}'.)"; ;;
*[^_a-zA-Z]*) _rc=1; _status="Error: build group names must not contain [^_a-zA-Z] (in argument \`${_arg}'.)"; ;;
*) BUILD_GROUPS="$(rtl_lconcat "${BUILD_GROUPS}" "${_arg}")"; ;;
- esac; shift; done;
- fi;
+ esac; shift;
+ done;
fi;
return "${_rc}";
};
-buildp_init_groups() {
- local _default_build_groups="" _fname="" _group="" _groups="" _rc=0; _status="";
- for _fname in $(find ./groups -name *.group | sort); do
- rtl_fileop source_opt "${_fname}";
- if [ -n "${GROUP_TARGET}" ]; then
- _group="${GROUP_TARGET}"; unset GROUP_TARGET;
- else
- _group="${_fname##*/}"; _group="${_group%.group}"; _group="${_group#*.}";
- fi;
- if ! rtl_lmatch "${_groups}" "${_group}"; then
- _groups="$(rtl_lconcat "${_groups}" "${_group}")";
- if [ -n "${GROUP_AUTO}" ]; then
- if [ "${GROUP_AUTO:-0}" -ne 0 ]; then
- _default_build_groups="$(rtl_lconcat "${_default_build_groups}" "${_group}")";
- fi;
- unset GROUP_AUTO;
- else
- _default_build_groups="$(rtl_lconcat "${_default_build_groups}" "${_group}")";
- fi;
- fi;
- done;
- _default_build_groups="$(rtl_uniq "${_default_build_groups}")";
- if ! rtl_lmatch "${ARG_DIST}" "rpm" ","; then
- _default_build_groups="$(rtl_lfilter "${_default_build_groups}" "host_deps_rpm")";
- fi;
- if [ -z "${BUILD_GROUPS}" ]; then
- BUILD_GROUPS="${_default_build_groups}";
- fi;
- if [ -n "${ARG_DIST}" ]; then
- BUILD_GROUPS="$(rtl_lconcat "$(rtl_lfilter "${BUILD_GROUPS}" "dist")" "dist")";
- fi;
- for _group in ${BUILD_GROUPS}; do
- if ! rtl_lmatch "${_groups}" "${_group}"; then
- _rc=1; _status="Error: unknown build group \`${_group}'."; break;
- fi;
- done;
- return "${_rc}";
-};
-
buildp_init_prereqs() {
local _cmd="" _cmds_missing="" _rc=0; _status="";
for _cmd in \
awk bunzip2 bzip2 cat chmod cmake cp date find flock \
- g++ gcc git grep gunzip gzip hostname install kill \
+ g++ gcc git grep gunzip gzip hostname id install kill \
ln lzip make mkdir mkfifo mktemp mv paste patch perl \
pgrep pkill printf readlink rm sed sha256sum sort \
tail tar test touch tr uniq wget xz zip; do
@@ -242,50 +234,16 @@ buildp_init_prereqs() {
return "${_rc}";
};
-buildp_init_vars() {
- local _rc=0; _status="";
- if ! rtl_lmatch "${ARCH}" "nt32 nt64"; then
- _rc=1; _status="Error: invalid architecture \`${ARCH}'.";
- elif ! rtl_lmatch "${BUILD}" "debug release"; then
- _rc=1; _status="Error: unknown build type \`${BUILD}'.";
- elif [ -n "${ARG_PARALLEL}" ] && [ "${ARG_PARALLEL}" != "auto" ]\
- && ! rtl_isnumber "${ARG_PARALLEL}"; then
- _rc=1; _status="Error: invalid jobs count \`${ARG_PARALLEL}'.";
- else case "${ARCH}" in
- nt32) DEFAULT_TARGET="i686-nt32-midipix"; ;;
- nt64) DEFAULT_TARGET="x86_64-nt64-midipix"; ;;
- esac;
- if DEFAULT_BUILD_CPUS="$(rtl_get_cpu_count)"; then
- if [ "${ARG_PARALLEL}" = "auto" ]\
- && [ "${DEFAULT_BUILD_CPUS}" -gt 1 ]; then
- ARG_PARALLEL=$((${DEFAULT_BUILD_CPUS}/2));
- fi;
- rtl_fileop source_opt \
- "${HOME}/midipix_build.vars" "${HOME}/.midipix_build.vars" \
- ../midipix_build.vars ./midipix.env;
- if [ -z "${PREFIX}" ]; then
- _rc=1; _status="Error: \${PREFIX} empty or unset.";
- fi;
- fi;
- fi; return "${_rc}";
-};
-
build_init() {
- local _fname="" _rc=0 _status="";
+ local _rc=0; _status="";
if ! buildp_init_env \
- || ! buildp_init_defaults \
|| ! buildp_init_getopts "${@}" \
|| ! buildp_init_prereqs \
- || ! buildp_init_vars \
- || ! buildp_init_groups \
+ || ! ex_pkg_load_vars \
|| ! buildp_init_args \
|| ! buildp_init_files; then
- _rc="${?}"; rtl_log_msg fail "${_status}"; exit "${_rc}";
- elif [ -n "${_status}" ]; then
- rtl_log_msg info "${_status}"; exit 0;
- else
- return "${_rc}";
- fi;
+ _rc=1; _status="${_status}";
+ fi; return "${_rc}";
};
# vim:filetype=sh
diff --git a/subr/ex_pkg.subr b/subr/ex_pkg.subr
index 497e89ce..3dcfbc7e 100644
--- a/subr/ex_pkg.subr
+++ b/subr/ex_pkg.subr
@@ -4,31 +4,27 @@
#
# ex_pkg_check_depends() - check single named package for unsatisfied dependencies
+# @_checkfl: enable (1) or inhibit (0) dependency expansion
# @_pkg_disabled: list of disabled packages
# @_pkg_finished: list of finished packages
# @_pkg_name: single package name
# @_pkg_wait: list of in-progress packages
-# @_restart_recursive: optional flag specifiying either no dependency expansion (0,) dependency expansion (1,) dependency expansion and forcibly rebuild (2,) forcibly rebuild reverse dependencies (3.)
#
# Return: zero (0) given no outstanding dependencies, non-zero (>0) otherwise
#
ex_pkg_check_depends() {
- local _pkg_disabled="${1}" _pkg_finished="${2}" _pkg_name="${3}" \
- _pkg_wait="${4}" _restart_recursive="${5}" \
- _pkg_depends="" _pkg_name_depend="" _dependfl=0;
- if _pkg_depends="$(rtl_uniq $(rtl_lunfold_depends 'PKG_${_name}_DEPENDS' $(rtl_get_var_unsafe -u "PKG_"${_pkg_name}"_DEPENDS")))"\
- && [ -n "${_pkg_depends}" ]; then
- if [ -z "${_restart}" ]\
- || [ "${_restart_recursive:-0}" -ge 1 ]; then
- for _pkg_name_depend in $(rtl_uniq ${_pkg_depends}); do
- if ! rtl_lmatch "${_pkg_disabled}" "${_pkg_name_depend}"\
- && ! rtl_lmatch "${_pkg_finished}" "${_pkg_name_depend}"; then
- _dependfl=1; break;
- elif rtl_lmatch "${_pkg_wait}" "${_pkg_name_depend}"; then
- _dependfl=1; break;
- fi;
- done;
- fi;
+ local _checkfl="${1}" _pkg_disabled="${2}" _pkg_finished="${3}" _pkg_name="${4}" _pkg_wait="${5}"\
+ _dependfl=0 _pkg_depends="" _pkg_name_depend="";
+ if [ "${_checkfl:-0}" -eq 1 ]\
+ && _pkg_depends="$(rtl_uniq $(rtl_lunfold_depends 'PKG_${_name}_DEPENDS' $(rtl_get_var_unsafe -u "PKG_"${_pkg_name}"_DEPENDS")))"; then
+ for _pkg_name_depend in $(rtl_uniq ${_pkg_depends}); do
+ if ! rtl_lmatch "${_pkg_disabled}" "${_pkg_name_depend}"\
+ && ! rtl_lmatch "${_pkg_finished}" "${_pkg_name_depend}"; then
+ _dependfl=1; break;
+ elif rtl_lmatch "${_pkg_wait}" "${_pkg_name_depend}"; then
+ _dependfl=1; break;
+ fi;
+ done;
fi;
return "${_dependfl}";
};
@@ -41,7 +37,7 @@ ex_pkg_check_depends() {
# Return: zero (0) on success, non-zero (>0) if package not found, group name on stdout if package was found.
#
ex_pkg_find_package() {
- local _group_names="${1}" _pkg_name="${2}" _group_name="" _pkg_names="";
+ local _group_names="${1}" _pkg_name="${2}" _foundfl=0 _group_name="" _pkg_names="";
for _group_name in ${_group_names}; do
if _pkg_names="$(rtl_get_var_unsafe -u "${_group_name}_PACKAGES")"\
&& [ -n "${_pkg_names}" ]\
@@ -51,7 +47,7 @@ ex_pkg_find_package() {
done;
case "${_foundfl:-0}" in
0) return 1; ;;
- 1) echo "${_group_name}"; return 0; ;;
+ 1) printf "%s" "${_group_name}"; return 0; ;;
esac;
};
@@ -65,32 +61,113 @@ ex_pkg_get_packages() {
local _group_name="${1}" _pkg_names="";
if _pkg_names="$(rtl_get_var_unsafe -u "${_group_name}_PACKAGES")"\
&& [ -n "${_pkg_names}" ]; then
- echo "${_pkg_names}"; return 0;
+ printf "%s" "${_pkg_names}"; return 0;
else
return 1;
fi;
};
#
+# ex_pkg_load_dump() - load package dump
+# @_pkg_name: package name
+#
+# Return: zero (0) on success, non-zero (>0) on failure, package dump post-return on success.
+#
+ex_pkg_load_dump() {
+ local _pkg_name="${1}" _workdir="${2}" _rc=0; _status="";
+ if [ ! -e "${_workdir}/${_pkg_name}.dump" ]; then
+ rtl_log_msg warn "Warning: failed to locate environment dump for package \`%s' in \`%s'." "${_pkg_name}" "${_workdir}";
+ rtl_log_msg info "Re_building package \`%s' w/ --dump-in _build..." "${_pkg_name}";
+ (export ARCH BUILD BUILD_DLCACHEDIR BUILD_WORKDIR \
+ PREFIX PREFIX_CROSS PREFIX_MINGW32 PREFIX_MINIPIX \
+ PREFIX_NATIVE PREFIX_ROOT PREFIX_RPM;
+ ./build.sh --dump-in _build -P -r "${_pkg_name}" -v);
+ if [ ! -e "${_workdir}/${_pkg_name}.dump" ]; then
+ _rc=1; _status="Error: failed to locate environment dump for package \`${_pkg_name}' in \`${_workdir}'.";
+ fi;
+ else
+ _rc=0;
+ fi;
+ if [ "${_rc:-0}" -eq 0 ]\
+ && ! . "${_workdir}/${_pkg_name}.dump"; then
+ _rc=1; _status="Error: failed to source environment dump for package \`${_pkg_name}' from \`${_workdir}'.";
+ elif [ "${_rc:-0}" -eq 0 ]\
+ && ! rtl_fileop cd "${PKG_BUILD_DIR}"; then
+ _rc=1; _status="Error: failed to change working directory to \`${PKG_BUILD_DIR}'.";
+ fi; return "${_rc}";
+};
+
+#
+# ex_pkg_load_vars() - load build variables
+#
+# Return: zero (0) on success, non-zero (>0) on failure, build variables post-return on success.
+#
+ex_pkg_load_vars() {
+ local _rc=0; _status="";
+ if ! rtl_lmatch "${ARCH}" "nt32 nt64"; then
+ _rc=1; _status="Error: invalid architecture \`${ARCH}'.";
+ elif ! rtl_lmatch "${BUILD}" "debug release"; then
+ _rc=1; _status="Error: unknown build type \`${BUILD}'.";
+ else case "${ARCH}" in
+ nt32) DEFAULT_TARGET="i686-nt32-midipix"; ;;
+ nt64) DEFAULT_TARGET="x86_64-nt64-midipix"; ;;
+ esac;
+ rtl_fileop source_opt \
+ "${HOME}/midipix_build.vars" "${HOME}/.midipix_build.vars" \
+ ../midipix_build.vars ./midipix.env;
+ if [ -z "${PREFIX}" ]; then
+ _rc=1; _status="Error: \${PREFIX} empty or unset.";
+ fi;
+ fi; return "${_rc}";
+};
+
+#
+# ex_pkg_load_groups() - load all available build groups
+#
+# Return: zero (0) on success, non-zero (>0) on failure, build groups loaded and ${EX_PKG_BUILD_GROUPS} set post-return.
+#
+ex_pkg_load_groups() {
+ local _build_groups="" _fname="" _group="" _groups="";
+ for _fname in $(find ./groups -name *.group | sort); do
+ rtl_fileop source_opt "${_fname}";
+ if [ -n "${GROUP_TARGET}" ]; then
+ _group="${GROUP_TARGET}"; unset GROUP_TARGET;
+ else
+ _group="${_fname##*/}"; _group="${_group%.group}"; _group="${_group#*.}";
+ fi;
+ if ! rtl_lmatch "${_groups}" "${_group}"; then
+ _groups="$(rtl_lconcat "${_groups}" "${_group}")";
+ if [ -n "${GROUP_AUTO}" ]; then
+ if [ "${GROUP_AUTO:-0}" -ne 0 ]; then
+ _build_groups="$(rtl_lconcat "${_build_groups}" "${_group}")";
+ fi;
+ unset GROUP_AUTO;
+ else
+ _build_groups="$(rtl_lconcat "${_build_groups}" "${_group}")";
+ fi;
+ fi;
+ done;
+ EX_PKG_BUILD_GROUPS="$(rtl_uniq "${_build_groups}")";
+};
+
+#
# ex_pkg_unfold_depends() - unfold list of package names into dependency-expanded set of complete, disabled, finished, and outstanding package names
+# @_checkfl: enable (1) or inhibit (0) dependency expansion
+# @_forcefl: enable (1) or inhibit (0) forcibly rebuilding finished packages
# @_group_name: build group name
# @_pkg_names: list of package names
# @_restart: optional whitespace-separated list of package names to rebuild
-# @_restart_recursive: optional flag specifiying either no dependency expansion (0,) dependency expansion (1,) dependency expansion and forcibly rebuild (2,) forcibly rebuild reverse dependencies (3.)
# @_test_finished: only exclude disabled packages from ${EX_PKG_NAMES} (0,) split finished packages into ${EX_PKG_FINISHED}
#
# Return: zero (0) on success, non-zero (>0) on failure, ${EX_PKG_DISABLED}, ${EX_PKG_FINISHED}, and ${EX_PKG_NAMES} set post-return.
#
ex_pkg_unfold_depends() {
- local _group_name="${1}" _pkg_names="${2}" _restart="${3}" \
- _restart_recursive="${4}" _test_finished="${5}" \
+ local _checkfl="${1}" _forcefl="${2}" _group_name="${3}" _pkg_names="${4}" _restart="${5}" _test_finished="${6}"\
_pkg_name="" _restartfl=0;
if [ -n "${_restart}" ] && ! rtl_lmatch "${_restart}" "ALL LAST"; then
_pkg_names="$(rtl_lsearch "${_pkg_names}" "${_restart}")";
fi;
- if [ -n "${_restart}" ]\
- && [ "${_restart_recursive:-0}" -ge 1 ]\
- && [ "${_restart_recursive:-0}" -le 2 ]; then
+ if [ -n "${_restart}" ] && [ "${_checkfl:-0}" -eq 1 ]; then
_pkg_names="$(rtl_uniq $(rtl_lunfold_depends 'PKG_${_name}_DEPENDS' ${_pkg_names}))";
fi;
for _pkg_name in ${_pkg_names}; do
@@ -106,7 +183,7 @@ ex_pkg_unfold_depends() {
elif [ "${_test_finished:-1}" -eq 1 ]\
&& ex_pkg_state_test "${_pkg_name}" finish\
&& [ "${_restartfl:-0}" -eq 0 ]\
- && [ "${_restart_recursive:-0}" -ne 2 ]\
+ && [ "${_forcefl:-0}" -ne 1 ]\
&& [ "x$(rtl_get_var_unsafe -u "${_group_name}_FORCE")" != "x1" ]; then
EX_PKG_FINISHED="$(rtl_lconcat "${EX_PKG_FINISHED}" "${_pkg_name}")";
_pkg_names="$(rtl_lfilter "${_pkg_names}" "${_pkg_name}")";
@@ -122,7 +199,6 @@ ex_pkg_unfold_depends() {
# @_group_name: build group name
# @_pkg_names: list of package names
# @_restart: optional whitespace-separated list of package names to rebuild
-# @_restart_recursive: optional flag specifiying either no dependency expansion (0,) dependency expansion (1,) dependency expansion and forcibly rebuild (2,) forcibly rebuild reverse dependencies (3.)
# @_test_finished: only exclude disabled packages from ${EX_PKG_NAMES} (0,) split finished packages into ${EX_PKG_FINISHED}
#
# Return: zero (0) on success, non-zero (>0) on failure, ${EX_PKG_DISABLED}, ${EX_PKG_FINISHED}, and ${EX_PKG_NAMES} set post-return.
diff --git a/subr/ex_pkg_dispatch.subr b/subr/ex_pkg_dispatch.subr
index 5426b8d7..44ed8d43 100644
--- a/subr/ex_pkg_dispatch.subr
+++ b/subr/ex_pkg_dispatch.subr
@@ -23,19 +23,21 @@ exp_pkg_dispatch_complete() {
#
# exp_pkg_dispatch_expand_packages() - expand build group name to list of packages ordered and filtered according to dependency and restart constraints
+# @_checkfl: enable (1) or inhibit (0) dependency expansion
+# @_forcefl: enable (1) or inhibit (0) forcibly rebuilding finished packages
# @_group_name: build group name
# @_restart: optional whitespace-separated list of package names to rebuild
-# @_restart_recursive: optional flag specifiying either no dependency expansion (0,) dependency expansion (1,) dependency expansion and forcibly rebuild (2,) forcibly rebuild reverse dependencies (3.)
+# @_reversefl: unfold reverse dependencies (1) or dependencies (0)
#
# Return: zero (0) on success, non-zero (>0) on failure, ${EX_PKG_DISABLED}, ${EX_PKG_FINISHED}, and ${EX_PKG_NAMES} set post-return.
#
exp_pkg_dispatch_expand_packages() {
- local _group_name="${1}" _restart="${2}" _restart_recursive="${3}" _pkg_names="";
- EX_PKG_DISABLED=""; EX_PKG_FINISHED=""; EX_PKG_NAMES="";
+ local _checkfl="${1}" _forcefl="${2}" _group_name="${3}" _restart="${4}" _reversefl="${5}"\
+ _pkg_names=""; EX_PKG_DISABLED=""; EX_PKG_FINISHED=""; EX_PKG_NAMES="";
if _pkg_names="$(rtl_get_var_unsafe -u "${_group_name}_PACKAGES")"\
&& [ -n "${_pkg_names}" ]; then
- if [ "${_restart_recursive:-0}" -ne 3 ]; then
- ex_pkg_unfold_depends "${_group_name}" "${_pkg_names}" "${_restart}" "${_restart_recursive}" 1;
+ if [ "${_reversefl:-0}" -eq 0 ]; then
+ ex_pkg_unfold_depends "${_checkfl}" "${_forcefl}" "${_group_name}" "${_pkg_names}" "${_restart}" 1;
else ex_pkg_unfold_rdepends "${_group_name}" "${_pkg_names}" "${_restart}" 1;
fi;
fi;
@@ -46,20 +48,20 @@ exp_pkg_dispatch_expand_packages() {
# exp_pkg_dispatch_group() - dispatch a single build group
# @_build_steps_default: list of default build steps
# @_build_vars_default: list of default build variables
+# @_checkfl: enable (1) or inhibit (0) dependency expansion
# @_dispatch_fn: top-level dispatch function name
# @_group_name: build group name
# @_njobs_max: maximum count of simultaneous jobs
# @_pipe_path: pathname to build FIFO
# @_restart_at: optional comma-separated list of build steps at which to rebuild or ALL
-# @_restart_recursive: optional flag specifiying either no dependency expansion (0,) dependency expansion (1,) dependency expansion and forcibly rebuild (2,) forcibly rebuild reverse dependencies (3.)
# @_workdir: pathname to build-specific temporary directory
#
# Return: zero (0) on success, non-zero (>0) on failure.
#
exp_pkg_dispatch_group() {
- local _build_steps_default="${1}" _build_vars_default="${2}" _dispatch_fn="${3}" \
- _group_name="${4}" _njobs_max="${5}" _pipe_path="${6}" _restart_at="${7}" \
- _restart_recursive="${8}" _workdir="${9}" _pipe_msg="" _pkg_name="" _rc=0;
+ local _build_steps_default="${1}" _build_vars_default="${2}" _checkfl="${3}" \
+ _dispatch_fn="${4}" _group_name="${5}" _njobs_max="${6}" _pipe_path="${7}" \
+ _restart_at="${8}" _workdir="${9}" _pipe_msg="" _pkg_name="" _rc=0;
rtl_fileop mkfifo "${_pipe_path}";
while true; do
while [ "${EXP_PKG_DISPATCH_NJOBS:-0}" -gt 0 ] && read _pipe_msg; do
@@ -72,11 +74,11 @@ exp_pkg_dispatch_group() {
if [ -n "${EX_PKG_NAMES}" ] && [ "${_rc}" -eq 0 ]; then
if [ "${EXP_PKG_DISPATCH_NJOBS}" -ne "${_njobs_max}" ]; then
exp_pkg_dispatch_packages "${_build_steps_default}" \
- "${_build_vars_default}" "${_dispatch_fn}" \
- "${_group_name}" "${_njobs_max}" \
- "${_pipe_path}" "${EX_PKG_DISABLED}" \
- "${EX_PKG_FINISHED}" "${_restart_at}" \
- "${_restart_recursive}" "${_workdir}";
+ "${_build_vars_default}" "${_checkfl}" \
+ "${_dispatch_fn}" "${_group_name}" \
+ "${_njobs_max}" "${_pipe_path}" \
+ "${EX_PKG_DISABLED}" "${EX_PKG_FINISHED}" \
+ "${_restart_at}" "${_workdir}";
fi;
elif [ "${EXP_PKG_DISPATCH_NJOBS:-0}" -eq 0 ]; then
break;
@@ -90,11 +92,11 @@ exp_pkg_dispatch_group() {
if [ -n "${EX_PKG_NAMES}" ] && [ "${_rc}" -eq 0 ]; then
if [ "${EXP_PKG_DISPATCH_NJOBS}" -ne "${_njobs_max}" ]; then
exp_pkg_dispatch_packages "${_build_steps_default}" \
- "${_build_vars_default}" "${_dispatch_fn}" \
- "${_group_name}" "${_njobs_max}" "${_pipe_path}" \
+ "${_build_vars_default}" "${_checkfl}" \
+ "${_dispatch_fn}" "${_group_name}" \
+ "${_njobs_max}" "${_pipe_path}" \
"${EX_PKG_DISABLED}" "${EX_PKG_FINISHED}" \
- "${_restart_at}" "${_restart_recursive}" \
- "${_workdir}";
+ "${_restart_at}" "${_workdir}";
fi;
elif [ "${EXP_PKG_DISPATCH_NJOBS:-0}" -eq 0 ]; then
break;
@@ -121,7 +123,13 @@ exp_pkg_dispatch_package() {
_group_name="${4}" _pkg_name="${5}" _restart_at="${6}" _workdir="${7}";
if "${_dispatch_fn}" start_pkg "${_group_name}" "${_pkg_name}" "$((${EXP_PKG_DISPATCH_COUNT}+1))" "${EXP_PKG_DISPATCH_COUNT_MAX}"; then
: $((EXP_PKG_DISPATCH_NJOBS+=1)); : $((EXP_PKG_DISPATCH_COUNT+=1)); EX_PKG_DISPATCH_WAIT="$(rtl_lconcat "${EX_PKG_DISPATCH_WAIT}" "${_pkg_name}")";
- (set +o errexit -o noglob; BUILD_IS_PARENT=0;
+ (trap "if [ \${?} -eq 0 ]; then \
+ printf \"done %s %s\n\" \"${_group_name}\" \"${_pkg_name}\" >&3; \
+ else \
+ printf \"fail %s %s\n\" \"${_group_name}\" \"${_pkg_name}\" >&3; \
+ pkill -U "${$}"; \
+ fi;" EXIT HUP INT TERM USR1 USR2;
+ set +o errexit -o noglob; BUILD_IS_PARENT=0; rtl_log_set_fname ""; rtl_log_set_no_attr 1;
if ex_pkg_env "${_build_steps_default}" "${_build_vars_default}" \
"${_group_name}" 0 "${_pkg_name}" "${_restart_at}" "${_workdir}"; then
ex_pkg_exec "${_dispatch_fn}" "${_group_name}" "${_pkg_name}" "${_restart_at}";
@@ -137,6 +145,7 @@ exp_pkg_dispatch_package() {
# exp_pkg_dispatch_packages() - dispatch set of packages
# @_build_steps_default: list of default build steps
# @_build_vars_default: list of default build variables
+# @_checkfl: enable (1) or inhibit (0) dependency expansion
# @_dispatch_fn: top-level dispatch function name
# @_group_name: build group name
# @_njobs_max: maximum count of simultaneous jobs
@@ -144,15 +153,14 @@ exp_pkg_dispatch_package() {
# @_pkg_disabled: list of disabled packages
# @_pkg_finished: list of finished packages
# @_restart_at: optional comma-separated list of build steps at which to rebuild or ALL
-# @_restart_recursive: optional flag specifiying either no dependency expansion (0,) dependency expansion (1,) dependency expansion and forcibly rebuild (2,) forcibly rebuild reverse dependencies (3.)
# @_workdir: pathname to build-specific temporary directory
#
# Return: zero (0) on success, non-zero (>0) on failure, ${EXP_PKG_DISPATCH_NJOBS}, ${EXP_PKG_DISPATCH_COUNT}, ${EX_PKG_NAMES}, and ${EX_PKG_DISPATCH_WAIT} may be mutated post-return.
#
exp_pkg_dispatch_packages() {
- local _build_steps_default="${1}" _build_vars_default="${2}" _dispatch_fn="${3}" \
- _group_name="${4}" _njobs_max="${5}" _pipe_path="${6}" _pkg_disabled="${7}" \
- _pkg_finished="${8}" _restart_at="${9}" _restart_recursive="${10}" _workdir="${11}" \
+ local _build_steps_default="${1}" _build_vars_default="${2}" _checkfl="${3}" \
+ _dispatch_fn="${4}" _group_name="${5}" _njobs_max="${6}" _pipe_path="${7}" \
+ _pkg_disabled="${8}" _pkg_finished="${9}" _restart_at="${10}" _workdir="${11}" \
_foundfl=0 _njob=0 _pkg_depends="" _pkg_name="";
while [ "${EXP_PKG_DISPATCH_NJOBS:-0}" -lt "${_njobs_max}" ]; do
_foundfl=0;
@@ -160,8 +168,8 @@ exp_pkg_dispatch_packages() {
if ! rtl_lmatch "${_pkg_disabled}" "${_pkg_name}"\
&& ! rtl_lmatch "${_pkg_finished}" "${_pkg_name}"\
&& ! rtl_lmatch "${EX_PKG_DISPATCH_WAIT}" "${_pkg_name}"\
- && ex_pkg_check_depends "${_pkg_disabled}" "${_pkg_finished}" "${_pkg_name}" \
- "${EX_PKG_DISPATCH_WAIT}" "${_restart_recursive}"; then
+ && ex_pkg_check_depends "${_checkfl}" "${_pkg_disabled}" "${_pkg_finished}" \
+ "${_pkg_name}" "${EX_PKG_DISPATCH_WAIT}"; then
exp_pkg_dispatch_package "${_build_steps_default}" \
"${_build_vars_default}" "${_dispatch_fn}" \
"${_group_name}" "${_pkg_name}" "${_restart_at}" \
@@ -185,55 +193,52 @@ exp_pkg_dispatch_packages() {
# @_pipe_path: pathname to build FIFO
# @_restart: optional whitespace-separated list of package names to rebuild
# @_restart_at: optional comma-separated list of build steps at which to rebuild or ALL
-# @_restart_recursive: optional flag specifiying either no dependency expansion (0,) dependency expansion (1,) dependency expansion and forcibly rebuild (2.)
+# @_restart_recursive: optional flag specifiying either no dependency expansion (0,) dependency expansion (1,) dependency expansion and forcibly rebuild (2,) forcibly rebuild reverse dependencies (3.)
# @_workdir: pathname to build-specific temporary directory
#
-# Return: zero (0) on success, non-zero (>0) on failure, ${EX_PKG_DISPATCH_UNKNOWN} and ${EX_PKG_DISPATCH_WAIT} mutated post-return.
+# Return: zero (0) on success, non-zero (>0) on failure, ${EX_PKG_DISPATCH_WAIT} mutated post-return.
#
ex_pkg_dispatch() {
local _build_steps_default="${1}" _build_vars_default="${2}" _dispatch_fn="${3}" \
_group_names="${4}" _groups_inhibit_deps="${5}" _njobs_max="${6}" _pipe_path="${7}" \
_restart="${8}" _restart_at="${9}" _restart_recursive="${10}" _workdir="${11}" \
- _pkg_name="" _pkg_names="" _rc=0 \
+ _checkfl=1 _forcefl=0 _pkg_name="" _pkg_names="" _rc=0 _reversefl=0 \
EX_PKG_DISABLED EX_PKG_FINISHED EX_PKG_NAMES EXP_PKG_DISPATCH_COUNT \
EXP_PKG_DISPATCH_COUNT_MAX EXP_PKG_DISPATCH_NJOBS; EX_PKG_DISPATCH_WAIT="";
- if [ "${_groups_inhibit_deps:-0}" -eq 0 ]; then
- _group_names="$(rtl_uniq $(rtl_lunfold_depends '${_name}_GROUP_DEPENDS' ${_group_names}))";
+ case "${_groups_inhibit_deps:-0}" in
+ 0) _group_names="$(rtl_uniq $(rtl_lunfold_depends '${_name}_GROUP_DEPENDS' ${_group_names}))";
+ esac;
+ if [ -n "${_restart}" ]; then
+ case "${_restart_recursive:-0}" in
+ 0) _checkfl=0; _forcefl=0; _reversefl=0; ;;
+ 1) _checkfl=1; _forcefl=0; _reversefl=0; ;;
+ 2) _checkfl=1; _forcefl=1; _reversefl=0; ;;
+ 3) _checkfl=1; _forcefl=1; _reversefl=1; ;;
+ esac;
fi;
for _group_name in ${_group_names}; do
EX_PKG_DISABLED=""; EX_PKG_DISPATCH_WAIT=""; EX_PKG_FINISHED=""; EX_PKG_NAMES="";
EXP_PKG_DISPATCH_COUNT=0; EXP_PKG_DISPATCH_COUNT_MAX=0; EXP_PKG_DISPATCH_NJOBS=0;
if "${_dispatch_fn}" start_group "${_group_name}" ""; then
if rtl_fileop mkdir "${_workdir}"\
- && rtl_log_msg vnfo "Resolving \`${_group_name}' dependencies..."\
- && exp_pkg_dispatch_expand_packages "${_group_name}" "${_restart}" "${_restart_recursive}"\
+ && rtl_log_msg notice "Resolving \`%s' dependencies..." "${_group_name}"\
+ && exp_pkg_dispatch_expand_packages "${_checkfl}" "${_forcefl}" "${_group_name}" "${_restart}" "${_reversefl}"\
&& exp_pkg_dispatch_complete "${_dispatch_fn}" "${_group_name}" "${EX_PKG_DISABLED}" "${EX_PKG_FINISHED}"\
- && rtl_log_msg vnfo "Resolved \`${_group_name}' dependencies."\
+ && rtl_log_msg notice "Resolved \`%s' dependencies." "${_group_name}"\
&& EXP_PKG_DISPATCH_COUNT_MAX="$(rtl_llength "${EX_PKG_NAMES}")"\
&& [ "${EXP_PKG_DISPATCH_COUNT_MAX}" -gt 0 ]; then
_pkg_names="$(rtl_lconcat "${_pkg_names}" "${EX_PKG_NAMES}")";
exp_pkg_dispatch_group "${_build_steps_default}" \
- "${_build_vars_default}" "${_dispatch_fn}" "${_group_name}" \
- "${_njobs_max}" "${_pipe_path}" "${_restart_at}" \
- "${_restart_recursive}" "${_workdir}"; _rc="${?}";
+ "${_build_vars_default}" "${_checkfl}" "${_dispatch_fn}" \
+ "${_group_name}" "${_njobs_max}" "${_pipe_path}" \
+ "${_restart_at}" "${_workdir}"; _rc="${?}";
fi;
"${_dispatch_fn}" finish_group "${_group_name}" "";
if [ "${_rc}" -ne 0 ]; then
break;
fi;
fi;
- done;
- if ! rtl_lmatch "${_restart}" "ALL LAST"; then
- for _pkg_name in ${_restart}; do
- if ! rtl_lmatch "${_pkg_names}" "${_pkg_name}"; then
- EX_PKG_DISPATCH_UNKNOWN="$(rtl_lconcat "${EX_PKG_DISPATCH_UNKNOWN}" "${_pkg_name}")";
- fi;
- done;
- fi;
- if [ -n "${EX_PKG_DISPATCH_UNKNOWN}" ]; then
- _rc=1;
- fi;
- return "${_rc}";
+ done; return "${_rc}";
};
# vim:filetype=sh textwidth=0
diff --git a/subr/ex_pkg_env.subr b/subr/ex_pkg_env.subr
index edb5e8d1..48b57535 100644
--- a/subr/ex_pkg_env.subr
+++ b/subr/ex_pkg_env.subr
@@ -52,7 +52,7 @@ exp_pkg_env_defaults() {
#
exp_pkg_env_set() {
local _build_vars_default="${1}" _group_name="${2}" _nounset="${3}" \
- _pkg_name="${4}" _var_prefixes="" _vars_set="" _vname="";
+ _pkg_name="${4}" _var_prefixes="" _vars_set="" _vname="" IFS IFS0;
rtl_set_vars _vars_set BUILD_TYPE "DEFAULT ${_group_name} PKG_${_pkg_name}";
rtl_set_vars _vars_set INHERIT_FROM "PKG_${_pkg_name}";
_var_prefixes="$(rtl_toupper "DEFAULT DEFAULT_${PKG_BUILD_TYPE} ${_group_name}")";
@@ -67,9 +67,9 @@ exp_pkg_env_set() {
"$(rtl_toupper "PKG_${_pkg_name}")")";
fi;
done;
- rtl_push_IFS :; for _vname in ${PKG_ENV_VARS_EXTRA}; do
+ IFS0="${IFS}"; IFS=":"; for _vname in ${PKG_ENV_VARS_EXTRA}; do
export "${_vname}";
- done; rtl_pop_IFS;
+ done; IFS="${IFS0}";
if [ "${_nounset:-0}" -eq 0 ]; then
rtl_unset_vars $(rtl_lfilter \
"$(set | sed -ne '/^PKG_[^=]*=/s/=.*$//p')" \
diff --git a/subr/ex_pkg_exec.subr b/subr/ex_pkg_exec.subr
index fb0cfa02..4519ce25 100644
--- a/subr/ex_pkg_exec.subr
+++ b/subr/ex_pkg_exec.subr
@@ -88,12 +88,6 @@ exp_pkg_exec_step() {
ex_pkg_exec() {
local _dispatch_fn="${1}" _group_name="${2}" _pkg_name="${3}" _restart_at="${4}" \
_rc=0 _step="" _step_next="";
- trap "if [ \${?} -eq 0 ]; then \
- echo \"done ${_group_name} ${_pkg_name}\" >&3; \
- else \
- echo \"fail ${_group_name} ${_pkg_name}\" >&3; \
- pkill -U "${$}"; \
- fi;" EXIT HUP INT TERM USR1 USR2;
if exp_pkg_exec_pre "${_group_name}" "${_pkg_name}" "${_restart_at}"\
&& "${_dispatch_fn}" start_pkg_child "${_group_name}" "${_pkg_name}"; then
if rtl_test_cmd "pkg_${_pkg_name}_all"; then
@@ -112,7 +106,7 @@ ex_pkg_exec() {
elif ! exp_pkg_exec_step "${_group_name}" "${_pkg_name}" "${_restart_at}" "${_step}"; then
_rc=1; break;
else
- echo "step ${_group_name} ${_pkg_name} ${_step}" >&3;
+ printf "step %s %s %s\n" "${_group_name}" "${_pkg_name}" "${_step}" >&3;
ex_pkg_state_set "${_pkg_name}" "${_step}" "${_step_next:+-${_step_next}}";
fi;
done;
diff --git a/subr/pkg_configure_autotools.subr b/subr/pkg_configure_autotools.subr
index d28cc8e1..32daedc1 100644
--- a/subr/pkg_configure_autotools.subr
+++ b/subr/pkg_configure_autotools.subr
@@ -53,7 +53,7 @@ pkg_configure_autotools() {
"${PKG_CONFIG_CACHE}" \
"${PKG_CONFIG_CACHE_LOCAL}" \
"${PKG_CONFIG_CACHE_EXTRA}";
- do if ! echo "${_config_cache}" |\
+ do if ! printf "%s" "${_config_cache}" |\
tr " " "\n" >> "${PKG_BUILD_DIR}/config.cache"; then
return 1;
fi;
diff --git a/subr/pkg_fetch_extract.subr b/subr/pkg_fetch_extract.subr
index eedd84ab..8a9d8319 100644
--- a/subr/pkg_fetch_extract.subr
+++ b/subr/pkg_fetch_extract.subr
@@ -5,9 +5,9 @@
pkgp_fetch_extract_type() {
local _fname="${1}";
if [ "${1##*.tar.}" != "${1}" ]; then
- echo "${1##*.tar.}";
+ printf "%s" "${1##*.tar.}";
elif [ "${1##*.t}" != "${1}" ]; then
- echo "${1##*.t}";
+ printf "%s" "${1##*.t}";
fi;
};
diff --git a/subr/pkg_install.subr b/subr/pkg_install.subr
index d0b59486..4cefa2d1 100644
--- a/subr/pkg_install.subr
+++ b/subr/pkg_install.subr
@@ -23,7 +23,7 @@ pkg_install() {
fi;
done; IFS="${_ifs_old}";
(set +o errexit -o noglob; trap "rm -f \"${BUILD_WORKDIR}/install.lock\"" EXIT;
- date; echo trying to grab lock
+ date;
while true; do
if flock -E 622 -w 600 4; then
break;
@@ -44,7 +44,7 @@ pkg_install() {
return 1;
else
_pkglist_name="${PKG_BASE_DIR##*/}"; _pkglist_name="${_pkglist_name%%-*}";
- if ! echo "${_pkglist_name}" >> "${PREFIX}/pkglist.${PKG_BUILD_TYPE}"; then
+ if ! printf "%s" "${_pkglist_name}" >> "${PREFIX}/pkglist.${PKG_BUILD_TYPE}"; then
return 1;
fi;
fi;
diff --git a/subr/pkg_install_files.subr b/subr/pkg_install_files.subr
index c555499b..2c6703fb 100644
--- a/subr/pkg_install_files.subr
+++ b/subr/pkg_install_files.subr
@@ -33,7 +33,7 @@ pkgp_install_files_strip() {
fi;
for _bin_path in $(find "${_tree_root}" -perm /a=x -type f); do
if objdump -sj .debug_info "${_bin_path}" >/dev/null 2>&1; then
- rtl_log_msg info "Stripping ${_bin_path}...";
+ rtl_log_msg info "Stripping %s..." "${_bin_path}";
if ! "${PKG_TARGET}-strip" "${_bin_path}"; then
return 1;
fi;
diff --git a/subr/pkgtool_init.subr b/subr/pkgtool_init.subr
index ce3c6808..f92572fb 100644
--- a/subr/pkgtool_init.subr
+++ b/subr/pkgtool_init.subr
@@ -2,57 +2,35 @@
# set +o errexit -o noglob is assumed.
#
-pkgtoolp_init_defaults() {
- : ${ARCH:="nt64"}; : ${BUILD:="debug"}; : ${PKG_NAME:=""};
- : ${BUILD_WORKDIR:=""}; : ${PREFIX=""};
- ARG_INFO=0; ARG_RESTART_AT=""; ARG_RDEPENDS=0;
- ARG_UPDATE_DIFF=0; ARG_SHELL=0; ARG_TARBALL=0;
- BUILD_GROUPS="";
-};
-
-pkgtoolp_init_dump() {
+pkgtoolp_init_args() {
local _rc=0; _status="";
- if [ -n "${ARG_RESTART_AT}" ]\
- || [ "${ARG_UPDATE_DIFF:-0}" -eq 1 ]\
- || [ "${ARG_SHELL:-0}" -eq 1 ]; then
- if [ ! -e "${BUILD_WORKDIR}/${PKG_NAME}.dump" ]; then
- rtl_log_msg warn "Warning: failed to locate environment dump for package \`${PKG_NAME}' in \`${BUILD_WORKDIR}'.";
- rtl_log_msg info "Rebuilding package \`${PKG_NAME}' w/ --dump-in build...";
- (export ARCH BUILD \
- BUILD_DLCACHEDIR BUILD_WORKDIR \
- PREFIX PREFIX_CROSS PREFIX_MINGW32 PREFIX_MINIPIX \
- PREFIX_NATIVE PREFIX_ROOT PREFIX_RPM;
- ./build.sh -a "${ARCH}" -b "${BUILD}" --dump-in build -P -r "${PKG_NAME}" -v);
- if [ ! -e "${BUILD_WORKDIR}/${PKG_NAME}.dump" ]; then
- _rc=1; _status="Error: failed to locate environment dump for package \`${PKG_NAME}' in \`${BUILD_WORKDIR}'.";
- fi;
- else
- _rc=0;
- fi;
- if [ "${_rc:-0}" -eq 0 ]\
- && ! . "${BUILD_WORKDIR}/${PKG_NAME}.dump"; then
- _rc=1; _status="Error: failed to source environment dump for package \`${PKG_NAME}' from \`${BUILD_WORKDIR}'.";
- elif [ "${_rc:-0}" -eq 0 ]\
- && ! rtl_fileop cd "${PKG_BUILD_DIR}"; then
- _rc=1; _status="Error: failed to change working directory to \`${PKG_BUILD_DIR}'.";
- fi;
+ if [ "$((${ARG_INFO:-0} + ${ARG_RDEPENDS:-0} + ${ARG_SHELL:-0} + ${ARG_TARBALL:-0}))" -gt 1 ]; then
+ cat etc/pkgtool.usage; _rc=1; _status="Error: only one of -i, -r, -s, or -t must be specified.";
+ elif [ "$((${ARG_INFO:-0} + ${ARG_RDEPENDS:-0} + ${ARG_SHELL:-0} + ${ARG_TARBALL:-0}))" -eq 0 ]\
+ && [ -z "${ARG_RESTART_AT}" ]\
+ && [ "${ARG_UPDATE_DIFF:-0}" -eq 0 ]; then
+ cat etc/pkgtool.usage; _rc=1; _status="Error: one of -i, -r, -s, or -t must be specified.";
+ else _rc=0;
fi; return "${_rc}";
};
pkgtoolp_init_env() {
local _fname="" _rc=0; _status="";
- if ! umask 022; then
- printf "Error: failed to setup environment.\n"; exit 1;
+ if ! cd "${0%/*}"; then
+ printf "Error: failed to change working directory to \`${0%/*}'." >&2; exit 1;
+ elif ! umask 022; then
+ printf "Error: failed to set umask(2).\n" >&2; exit 1;
else for _fname in $(find subr -name *.subr); do
if ! . "${_fname}"; then
- printf "Error: failed to source \`%s'.\n" "${_fname}"; exit 1;
+ printf "Error: failed to source \`%s'.\n" "${_fname}" >&2; exit 1;
fi;
- done; fi;
- return "${_rc}";
+ done;
+ fi; return "${_rc}";
};
pkgtoolp_init_getopts() {
- local _opt="" _shiftfl=0 _rc=0 OPTIND=0; _status="";
+ local _opt="" _shiftfl=0 _rc=0 OPTIND=0; _status=""; : ${ARCH:="nt64"}; : ${BUILD:="debug"};
+ ARG_INFO=0; ARG_RESTART_AT=""; ARG_RDEPENDS=0; ARG_UPDATE_DIFF=0; ARG_SHELL=0; ARG_TARBALL=0;
while [ "${#}" -gt 0 ]; do
case "${1}" in
--update-diff)
@@ -86,78 +64,22 @@ pkgtoolp_init_getopts() {
fi;
done;
if [ "${_rc}" -eq 0 ]; then
- if [ "$((${ARG_INFO:-0} + ${ARG_RDEPENDS:-0} + ${ARG_SHELL:-0} + ${ARG_TARBALL:-0}))" -gt 1 ]; then
- cat etc/pkgtool.usage; rtl_log_msg failexit "Error: only one of -i, -r, -s, or -t must be specified.";
- elif [ "$((${ARG_INFO:-0} + ${ARG_RDEPENDS:-0} + ${ARG_SHELL:-0} + ${ARG_TARBALL:-0}))" -eq 0 ]; then
- if [ -z "${ARG_RESTART_AT}" ]\
- && [ "${ARG_UPDATE_DIFF:-0}" -eq 0 ]; then
- cat etc/pkgtool.usage; rtl_log_msg failexit "Error: one of -i, -r, -s, or -t must be specified.";
- fi;
- fi;
while [ "${#}" -gt 0 ]; do
- case "${1}" in
- *=*) rtl_set_var_unsafe "${1%%=*}" "${1#*=}"; ;;
- *) if [ "${#}" -ne 1 ]; then
- _rc=1; _status="Error: invalid argument \`${1}'.";
- fi; break; ;;
- esac; shift; done;
+ case "${1}" in
+ *=*) rtl_set_var_unsafe "${1%%=*}" "${1#*=}"; ;;
+ *) if [ "${#}" -ne 1 ]; then
+ _rc=1; _status="Error: invalid argument \`${1}'.";
+ fi; break; ;;
+ esac; shift;
+ done;
if [ "${_rc:-0}" -eq 0 ]; then
if [ "${#}" -ne 1 ]\
- && [ -z "${PKG_NAME}" ]; then
+ && [ -z "${PKGTOOL_PKG_NAME}" ]; then
_rc=1; _status="Error: missing package name.";
elif [ "${#}" -eq 1 ]; then
- PKG_NAME="${1}";
+ PKGTOOL_PKG_NAME="${1}"; export PKGTOOL_PKG_NAME;
fi;
fi;
- fi;
- return "${_rc}";
-};
-
-pkgtoolp_init_groups() {
- local _default_build_groups="" _fname="" _group="" _groups="" _rc=0; _status="";
- if [ "${ARG_INFO:-0}" -eq 1 ]\
- || [ "${ARG_RDEPENDS:-0}" -eq 1 ]\
- || [ "${ARG_TARBALL:-0}" -eq 1 ]; then
- for _fname in $(find ./groups -name *.group | sort); do
- rtl_fileop source_opt "${_fname}";
- if [ -n "${GROUP_TARGET}" ]; then
- _group="${GROUP_TARGET}"; unset GROUP_TARGET;
- else
- _group="${_fname##*/}"; _group="${_group%.group}"; _group="${_group#*.}";
- fi;
- if ! rtl_lmatch "${_groups}" "${_group}"; then
- _groups="$(rtl_lconcat "${_groups}" "${_group}")";
- if [ -n "${GROUP_AUTO}" ]; then
- if [ "${GROUP_AUTO:-0}" -ne 0 ]; then
- _default_build_groups="$(rtl_lconcat "${_default_build_groups}" "${_group}")";
- fi;
- unset GROUP_AUTO;
- else
- _default_build_groups="$(rtl_lconcat "${_default_build_groups}" "${_group}")";
- fi;
- fi;
- done;
- _default_build_groups="$(rtl_uniq "${_default_build_groups}")";
- BUILD_GROUPS="${_default_build_groups}";
- fi; return "${_rc}";
-};
-
-pkgtoolp_init_package() {
- local _foundfl=0 _group_name="" _pkg_names="" _rc=0; _status="";
- if [ "${ARG_INFO:-0}" -eq 1 ]\
- || [ "${ARG_RDEPENDS:-0}" -eq 1 ]\
- || [ "${ARG_TARBALL:-0}" -eq 1 ]; then
- for _group_name in ${BUILD_GROUPS}; do
- if ! _pkg_names="$(rtl_get_var_unsafe -u "${_group_name}_PACKAGES")"\
- || [ -z "${_pkg_names}" ]; then
- rtl_log_msg warn "Warning: ignoring non-existent or invalid build group \`${_build_group}'.";
- elif rtl_lmatch "${_pkg_names}" "${PKG_NAME}"; then
- _foundfl=1;
- fi;
- done;
- if [ "${_foundfl:-0}" -eq 0 ]; then
- _rc=1; _status="Error: package \`${PKG_NAME}' unknown.";
- fi;
fi; return "${_rc}";
};
@@ -176,45 +98,18 @@ pkgtoolp_init_prereqs() {
elif ! (FNAME="$(mktemp)" && { trap "rm -f \"\${FNAME}\"" EXIT; \
sed -i'' -e '' "${FNAME}" >/dev/null 2>&1; }); then
_rc=1; _status="Error: sed(1) in \${PATH} does not support the \`-i' option.";
- fi;
- return "${_rc}";
-};
-
-pkgtoolp_init_vars() {
- local _rc=0; _status="";
- if ! rtl_lmatch "${ARCH}" "nt32 nt64"; then
- _rc=1; _status="Error: invalid architecture \`${ARCH}'.";
- elif ! rtl_lmatch "${BUILD}" "debug release"; then
- _rc=1; _status="Error: unknown build type \`${BUILD}'.";
- else case "${ARCH}" in
- nt32) DEFAULT_TARGET="i686-nt32-midipix"; ;;
- nt64) DEFAULT_TARGET="x86_64-nt64-midipix"; ;;
- esac;
- rtl_fileop source_opt \
- "${HOME}/midipix_build.vars" "${HOME}/.midipix_build.vars" \
- ../midipix_build.vars ./midipix.env;
- if [ -z "${PREFIX}" ]; then
- _rc=1; _status="Error: \${PREFIX} empty or unset.";
- fi; fi;
- return "${_rc}";
+ fi; return "${_rc}";
};
pkgtool_init() {
- local _fname="" _rc=0 _status="";
+ local _fname="" _rc=0; _status="";
if ! pkgtoolp_init_env \
- || ! pkgtoolp_init_defaults \
|| ! pkgtoolp_init_getopts "${@}" \
|| ! pkgtoolp_init_prereqs \
- || ! pkgtoolp_init_vars \
- || ! pkgtoolp_init_dump \
- || ! pkgtoolp_init_groups \
- || ! pkgtoolp_init_package; then
- _rc="${?}"; rtl_log_msg fail "${_status}"; exit "${_rc}";
- elif [ -n "${_status}" ]; then
- rtl_log_msg info "${_status}"; exit 0;
- else
- return "${_rc}";
- fi;
+ || ! ex_pkg_load_vars \
+ || ! pkgtoolp_init_args; then
+ _rc=1; _status="${_status}";
+ fi; return "${_rc}";
};
# vim:filetype=sh
diff --git a/subr/rtl.subr b/subr/rtl.subr
index 18ddb8d6..f029a8e1 100644
--- a/subr/rtl.subr
+++ b/subr/rtl.subr
@@ -2,16 +2,11 @@
# set +o errexit -o noglob is assumed.
#
-EXP_RTL_IFS="${IFS}";
-
-rtl_basename() { echo "${1##*/}"; };
+rtl_basename() { local _fname="${1##*/}"; printf "%s" "${_fname}"; };
rtl_date() { command date "+${1:-${DEFAULT_TIMESTAMP_FMT}}"; };
-rtl_dirname() { echo "${1%/*}"; };
-rtl_pop_IFS() { IFS="${EXP_RTL_IFS}"; };
-rtl_push_IFS() { EXP_RTL_IFS="${IFS}"; IFS="${1}"; };
rtl_set_var_unsafe() { [ -n "${2}" ] && eval ${1}=\"${2}\" || return 0; };
rtl_test_cmd() { command -v "${1}" >/dev/null; };
-rtl_uniq() { echo "${@}" | sed 's/ /\n/g' | awk '!x[$0]++' | paste -s -d" "; };
+rtl_uniq() { if [ "${#}" -gt 0 ]; then printf "%s" "${*}" | sed 's/ /\n/g' | awk '!x[$0]++' | paste -s -d" "; fi; };
rtl_unset_vars() { while [ ${#} -gt 0 ]; do unset "${1}"; shift; done; };
# vim:filetype=sh
diff --git a/subr/rtl_complex.subr b/subr/rtl_complex.subr
index 01e373ea..0e39178d 100644
--- a/subr/rtl_complex.subr
+++ b/subr/rtl_complex.subr
@@ -27,6 +27,13 @@ rtl_clean_env() {
rtl_unset_vars $(rtl_lfilter "${_env_vars}" "${_env_vars_except}");
};
+rtl_dirname() {
+ local _dname="${1%/*}";
+ while rtl_matchr "${_dname}" "*/"; do
+ _dname="${_dname%/}";
+ done; printf "%s" "${_dname:-/}";
+};
+
rtl_exists_any() {
local _subdir="${1}"; shift;
while [ "${#}" -gt 0 ]; do
@@ -79,12 +86,13 @@ rtl_filter_vars() {
esac; ;;
esac;
if "${_fn}" "${_vname}"; then
- _vars="$(rtl_lconcat "${_vars}" "${_var_spec}" "\n")"; _fnfl=1;
+ _vars="${_vars:+${_vars}
+}${_var_spec}"; _fnfl=1;
else
_fnfl=0;
fi;
done;
- echo "${_vars}";
+ printf "%s" "${_vars}";
};
rtl_get_cpu_count() {
@@ -96,7 +104,7 @@ rtl_get_cpu_count() {
if rtl_match "${_line}" "processor*:"; then
: $((_ncpus+=1));
fi;
- done < /proc/cpuinfo; echo "${_ncpus}";
+ done < /proc/cpuinfo; printf "%s" "${_ncpus}";
fi; ;;
*) _rc=1; _status="Error: unknown platform \`${_sname}'."; ;;
esac; return "${_rc}";
@@ -112,6 +120,11 @@ rtl_get_var_unsafe() {
eval echo \${${_vname}};
};
+rtl_get_vars_fast() {
+ local _pattern="${1}";
+ set | awk -F= '/'"${_pattern}"'/{print $1}' | sort;
+};
+
rtl_head() {
local _pattern="${1}" _s="${2}";
while true; do
@@ -121,7 +134,7 @@ rtl_head() {
_s="${_s%%${_pattern}}";
fi;
done;
- echo "${_s}";
+ printf "%s" "${_s}";
};
rtl_is_newer() {
diff --git a/subr/rtl_fetch.subr b/subr/rtl_fetch.subr
index 3afd30dc..e93d69eb 100644
--- a/subr/rtl_fetch.subr
+++ b/subr/rtl_fetch.subr
@@ -82,7 +82,8 @@ rtl_fetch_url_wget() {
if [ -n "${_sha256sum_src}" ]; then
set -- $(sha256sum "${_url_dst}");
if [ "${_sha256sum_dst:=${1}}" != "${_sha256sum_src}" ]; then
- rtl_log_msg failexit "Error: hash mismatch for URL \`${_url}' (downloaded file: ${_sha256sum_dst}, from build variables: ${_sha256sum_src}.)";
+ rtl_log_msg fatalexit "Error: hash mismatch for URL \`%s' (downloaded file: %s, from build variables: %s.)"\
+ "${_url}" "${_sha256sum_dst}" "${_sha256sum_src}";
fi;
fi;
rtl_fileop touch "${_url_dst}.fetched";
diff --git a/subr/rtl_fileop.subr b/subr/rtl_fileop.subr
index c2b403fa..fd45f67f 100644
--- a/subr/rtl_fileop.subr
+++ b/subr/rtl_fileop.subr
@@ -2,123 +2,137 @@
# set +o errexit -o noglob is assumed.
#
-exp_rtl_fileop_check() {
+#
+# Private globals and subroutines
+#
+RTLP_FILEOP_LOG=0;
+rtl_fileop_set_log() { RTLP_FILEOP_LOG="${1}"; };
+
+rtlp_fileop_check() {
local _prefix="${1}" _pname="" _rname=""; shift;
while [ "${#}" -gt 0 ]; do
return 0;
shift; done;
};
+rtlp_fileop_log() {
+ local _msg="${1}";
+ if [ "${RTLP_FILEOP_LOG:-0}" -eq 1 ]; then
+ rtl_log_msg debug "${_msg}";
+ fi;
+};
+
+
rtl_fileop() {
local _op="${1}" _dst="" _mode="" _install_args="" _owner="" _rc=0 _src=""; shift;
case "${_op}" in
cd) if [ \( -z "${1}" \) -o ! \( -L "${1}" -o -e "${1}" \) ]; then
- rtl_log_msg failexit "Invalid or non-existent directory \`${1}'.";
- elif exp_rtl_fileop_check "${PREFIX}" "${1}"; then
- rtl_log_msg vvvv "Changing working directory to \`${1}'.";
+ rtl_log_msg fatalexit "Invalid or non-existent directory \`%s'." "${1}";
+ elif rtlp_fileop_check "${PREFIX}" "${1}"; then
+ rtlp_fileop_log "Changing working directory to \`${1}'.";
cd -- "${1}"; _rc="${?}";
fi; ;;
chmod) if [ "${#}" -lt 2 ]; then
- rtl_log_msg failexit "Missing parameters (in: chmod ${*}.)";
+ rtl_log_msg fatalexit "Missing parameters (in: chmod %s.)" "${*}";
elif _mode="${1}" && shift\
- && exp_rtl_fileop_check "${PREFIX}" "${*}"; then
- rtl_log_msg vvvv "Changing file mode bits of \`${*}' to \`${_mode}'.";
+ && rtlp_fileop_check "${PREFIX}" "${*}"; then
+ rtlp_fileop_log "Changing file mode bits of \`${*}' to \`${_mode}'.";
chmod -- "${_mode}" "${@}"; _rc="${?}";
fi; ;;
chown) if [ "${#}" -lt 2 ]; then
- rtl_log_msg failexit "Missing parameters (in: chown ${*}.)";
+ rtl_log_msg fatalexit "Missing parameters (in: chown %s.)" "${*}";
elif _owner="${1}" && shift\
- && exp_rtl_fileop_check "${PREFIX}" "${*}"; then
- rtl_log_msg vvvv "Changing file owner of \`${*}' to \`${_owner}'.";
+ && rtlp_fileop_check "${PREFIX}" "${*}"; then
+ rtlp_fileop_log "Changing file owner of \`${*}' to \`${_owner}'.";
chown -- "${_owner}" "${@}"; _rc="${?}";
fi; ;;
cp_follow)
if [ "${#}" -lt 2 ]; then
- rtl_log_msg failexit "Missing parameters (in: cp_follow ${*}.)";
- elif exp_rtl_fileop_check "${PREFIX}" "${*}"; then
+ rtl_log_msg fatalexit "Missing parameters (in: cp_follow %s}.)" "${*}";
+ elif rtlp_fileop_check "${PREFIX}" "${*}"; then
_src="${*}"; _src="${_src% *}";
_dst="${*}"; _dst="${_dst##* }";
- rtl_log_msg vvvv "Copying \`${_src}' into \`${_dst}' w/ -pLR.";
+ rtlp_fileop_log "Copying \`${_src}' into \`${_dst}' w/ -pLR.";
cp -pLR -- "${@}"; _rc="${?}";
fi; ;;
cp) if [ "${#}" -lt 2 ]; then
- rtl_log_msg failexit "Missing parameters (in: cp ${*}.)";
- elif exp_rtl_fileop_check "${PREFIX}" "${*}"; then
+ rtl_log_msg fatalexit "Missing parameters (in: cp %s.)" "${*}";
+ elif rtlp_fileop_check "${PREFIX}" "${*}"; then
_src="${*}"; _src="${_src% *}";
_dst="${*}"; _dst="${_dst##* }";
- rtl_log_msg vvvv "Copying \`${_src}' into \`${_dst}' w/ -pPR.";
+ rtlp_fileop_log "Copying \`${_src}' into \`${_dst}' w/ -pPR.";
cp -pPR -- "${@}"; _rc="${?}";
fi; ;;
install)
if [ "${#}" -lt 2 ]; then
- rtl_log_msg failexit "Missing parameters (in: install ${*}.)";
- else _dst="$(while [ ""${#}"" -gt 2 ]; do shift; done; echo "${2}")";
- _install_args="$(while [ ""${#}"" -gt 2 ]; do echo "${1}"; shift; done)";
- _src="$(while [ ""${#}"" -gt 2 ]; do shift; done; echo "${1}")";
- if exp_rtl_fileop_check "${PREFIX}" "${_dst}" "${_src}"; then
- rtl_log_msg vvvv "Installing \`${_src}' into \`${_dst}' w/ ${_install_args}.";
+ rtl_log_msg fatalexit "Missing parameters (in: install %s.)" "${*}";
+ else _dst="$(while [ ""${#}"" -gt 2 ]; do shift; done; printf "%s" "${2}")";
+ _install_args="$(while [ ""${#}"" -gt 2 ]; do printf "%s" "${1}"; shift; done)";
+ _src="$(while [ ""${#}"" -gt 2 ]; do shift; done; printf "%s" "${1}")";
+ if rtlp_fileop_check "${PREFIX}" "${_dst}" "${_src}"; then
+ rtlp_fileop_log "Installing \`${_src}' into \`${_dst}' w/ ${_install_args}.";
install "${@}"; _rc="${?}";
fi;
fi; ;;
ln_symbolic)
if [ \( -z "${1}" \) -o \( -z "${2}" \) ]; then
- rtl_log_msg failexit "Missing parameters (in: ln_symbolic ${*}.)";
- elif exp_rtl_fileop_check "${PREFIX}" "${2}"; then
+ rtl_log_msg fatalexit "Missing parameters (in: ln_symbolic %s.)" "${*}";
+ elif rtlp_fileop_check "${PREFIX}" "${2}"; then
if rtl_fileop test "${2}"; then
rtl_fileop rm "${2}";
fi;
if [ "${?}" -eq 0 ]; then
- rtl_log_msg vvvv "Linking \`${1}' to \`${2}' w/ -fs";
+ rtlp_fileop_log "Linking \`${1}' to \`${2}' w/ -fs";
ln -fs -- "${1}" "${2}"; _rc="${?}";
fi;
fi; ;;
mv) if [ \( -z "${1}" \) -o \( -z "${2}" \) ]; then
- rtl_log_msg failexit "Missing parameters (in: mv ${*}.)";
- elif exp_rtl_fileop_check "${PREFIX}" "${1}" "${2}"; then
- rtl_log_msg vvvv "Moving \`${1}' to \`${2}' w/ -fs";
+ rtl_log_msg fatalexit "Missing parameters (in: mv %s.)" "${*}";
+ elif rtlp_fileop_check "${PREFIX}" "${1}" "${2}"; then
+ rtlp_fileop_log "Moving \`${1}' to \`${2}' w/ -fs";
mv -f -- "${1}" "${2}"; _rc="${?}";
fi; ;;
mkdir|mkfifo|rm|source_opt|test|touch)
while [ \( "${?}" -eq 0 \) -a \( ""${#}"" -gt 0 \) ]; do
if [ -z "${1}" ]; then
- rtl_log_msg failexit "Missing parameters (in: ${_op} ${*}.)";
+ rtl_log_msg fatalexit "Missing parameters (in: %s %s.)" "${_op}" "${*}";
elif [ "${_op}" = mkdir ]\
&& [ ! -d "${1}" ]\
- && exp_rtl_fileop_check "${PREFIX}" "${1}"; then
+ && rtlp_fileop_check "${PREFIX}" "${1}"; then
if rtl_fileop test "${1}"; then
rtl_fileop rm "${1}";
fi;
- rtl_log_msg vvvv "Making directory \`${1}'.";
+ rtlp_fileop_log "Making directory \`${1}'.";
mkdir -p -- "${1}"; _rc="${?}";
elif [ "${_op}" = mkfifo ]\
- && exp_rtl_fileop_check "${PREFIX}" "${1}"; then
+ && rtlp_fileop_check "${PREFIX}" "${1}"; then
if rtl_fileop test "${1}"; then
rtl_fileop rm "${1}";
fi;
- rtl_log_msg vvvv "Creating FIFO \`${1}'.";
- exp_rtl_fileop_check "${PREFIX}" "${1}";
+ rtlp_fileop_log "Creating FIFO \`${1}'.";
+ rtlp_fileop_check "${PREFIX}" "${1}";
mkfifo -- "${1}"; _rc="${?}";
elif [ "${_op}" = rm ]\
&& rtl_fileop test "${1}"\
- && exp_rtl_fileop_check "${PREFIX}" "${1}"; then
- rtl_log_msg vvvv "Removing directory or file \`${1}'.";
+ && rtlp_fileop_check "${PREFIX}" "${1}"; then
+ rtlp_fileop_log "Removing directory or file \`${1}'.";
rm -rf -- "${1}"; _rc="${?}";
elif [ "${_op}" = source_opt ]\
&& rtl_fileop test "${1}"\
- && exp_rtl_fileop_check "${PREFIX}" "${1}"; then
- rtl_log_msg vvvv "Sourcing file \`${1}'.";
+ && rtlp_fileop_check "${PREFIX}" "${1}"; then
+ rtlp_fileop_log "Sourcing file \`${1}'.";
. "${1}"; _rc="${?}";
elif [ "${_op}" = test ]\
- && exp_rtl_fileop_check "${PREFIX}" "${1}"\
+ && rtlp_fileop_check "${PREFIX}" "${1}"\
&& ! [ \( -L "${1}" \) -o \( -e "${1}" \) ]; then
return 1;
elif [ "${_op}" = touch ]\
- && exp_rtl_fileop_check "${PREFIX}" "${1}"; then
- rtl_log_msg vvvv "Touching file \`${1}'.";
+ && rtlp_fileop_check "${PREFIX}" "${1}"; then
+ rtlp_fileop_log "Touching file \`${1}'.";
touch -- "${1}"; _rc="${?}";
fi; shift;
done; ;;
- *) rtl_log_msg failexit "Error: rtl_fileop() called w/ invalid parameter(s): ${*}"; ;;
+ *) rtl_log_msg fatalexit "Error: rtl_fileop() called w/ invalid parameter(s): %s" "${*}"; ;;
esac; return "${_rc}";
};
diff --git a/subr/rtl_list.subr b/subr/rtl_list.subr
index f57a3ee9..b1105bab 100644
--- a/subr/rtl_list.subr
+++ b/subr/rtl_list.subr
@@ -15,7 +15,7 @@ rtl_lfilter() {
local _list="${1}" _filter="${2}" _sep="${3:- }" IFS="${3:-${IFS}}" \
_filterfl="" _litem="" _litem_filter="" _lnew="";
if [ -z "${_filter}" ]; then
- echo "${_list}"; return 0;
+ printf "%s" "${_list}"; return 0;
else for _litem in ${_list}; do
_filterfl=0;
for _litem_filter in ${_filter}; do
@@ -27,7 +27,7 @@ rtl_lfilter() {
_lnew="${_lnew:+${_lnew}${_sep}}${_litem}";
fi;
done; fi;
- echo "${_lnew}";
+ printf "%s" "${_lnew}";
};
rtl_llength() {
@@ -35,13 +35,13 @@ rtl_llength() {
for _litem in ${_list}; do
: $((_llength+=1));
done;
- echo "${_llength}";
+ printf "%s" "${_llength}";
};
rtl_llift() {
local _list="${1}" _sep="${2}" _sep_new="${3}" IFS; IFS="${_sep}";
set -- ${_list}; IFS="${_sep_new}";
- echo "${*}";
+ printf "%s" "${*}";
};
rtl_lmatch() {
@@ -49,11 +49,21 @@ rtl_lmatch() {
[ -n "$(rtl_lsearch "${_list}" "${_item}" "${_sep}")" ];
};
+rtl_lmax() {
+ local _len=0 _len_max=0;
+ while [ "${#}" -gt 0 ]; do
+ _len="${#1}";
+ if [ "${_len}" -gt "${_len_max}" ]; then
+ _len_max="${_len}";
+ fi; shift;
+ done; printf "%s" "${_len_max}";
+};
+
rtl_lsearch() {
local _list="${1}" _filter="${2}" _sep="${3:- }" IFS="${3:-${IFS}}" \
_litem="" _litem_filter="" _lnew="";
if [ -z "${_filter}" ]; then
- echo "${_list}"; return 0;
+ printf "%s" "${_list}"; return 0;
else for _litem in ${_list}; do
for _litem_filter in ${_filter}; do
if [ "${_litem_filter}" = "${_litem}" ]; then
@@ -62,7 +72,7 @@ rtl_lsearch() {
fi;
done;
done; fi;
- echo "${_lnew}";
+ printf "%s" "${_lnew}";
};
rtl_lsort() {
@@ -80,7 +90,7 @@ rtl_lunfold_depends() {
fi;
_names="$(rtl_lconcat "${_names}" "${_name}")";
done;
- echo "${_names}";
+ printf "%s" "${_names}";
};
# vim:filetype=sh
diff --git a/subr/rtl_log.subr b/subr/rtl_log.subr
index 51db687b..860ccf03 100644
--- a/subr/rtl_log.subr
+++ b/subr/rtl_log.subr
@@ -2,77 +2,76 @@
# set +o errexit -o noglob is assumed.
#
-: ${DEFAULT_LOG_MSG_FAIL_COLOUR:=91};
-: ${DEFAULT_LOG_MSG_INFO_COLOUR:=93};
-: ${DEFAULT_LOG_MSG_INF2_COLOUR:=33};
-: ${DEFAULT_LOG_MSG_SUCC_COLOUR:=92};
-: ${DEFAULT_LOG_MSG_SUC2_COLOUR:=32};
-: ${DEFAULT_LOG_MSG_VNFO_COLOUR:=96};
-: ${DEFAULT_LOG_MSG_VUCC_COLOUR:=90};
-: ${DEFAULT_LOG_MSG_VVFO_COLOUR:=96};
-: ${DEFAULT_LOG_MSG_VVVO_COLOUR:=96};
-: ${DEFAULT_LOG_MSG_VVVV_COLOUR:=96};
-: ${DEFAULT_LOG_MSG_WARN_COLOUR:=31};
+#
+# Private globals and subroutines
+#
+RTLP_LOG_NO_ATTR=0;
+RTLP_LOG_FNAME="";
+RTLP_LOG_LVL="0";
+rtl_log_set_fname() { RTLP_LOG_FNAME="${1}"; };
+rtl_log_set_lvl() { RTLP_LOG_LVL="${1}"; };
+rtl_log_set_no_attr() { RTLP_LOG_NO_ATTR="${1}"; };
-exp_rtl_log_printf() {
- local _attrs="${1}" _msg=""; shift; _msg="$(printf "${@}")";
- if [ "${BUILD_IS_PARENT:-0}" -eq 1 ]\
- && [ -n "${DEFAULT_BUILD_LOG_FNAME}" ]\
- && [ -e "${DEFAULT_BUILD_LOG_FNAME}" ]; then
- printf "%s\n" "${_msg}" >> "${DEFAULT_BUILD_LOG_FNAME}";
+rtlp_log_printf() {
+ local _attr="${1}" _fmt="${2}"; shift 2; _msg="$(printf "${_fmt}" "${@}")";
+ if [ -n "${RTLP_LOG_FNAME}" ]; then
+ printf "%s\n" "${_msg}" >> "${RTLP_LOG_FNAME}";
+ fi;
+ if [ "${RTLP_LOG_NO_ATTR:-0}" -eq 0 ]; then
+ printf "\033[0m\033[${_attr}m%s\033[0m\n" "${_msg}";
+ else
+ printf "%s\n" "${_msg}";
fi;
- printf "\033[0m\033[${_attr}m%s\033[0m\n" "${_msg}";
};
+#
+# Public globals
+#
+RTL_LOG_MSG_FATAL_COLOUR=91; # Bright red
+RTL_LOG_MSG_WARNING_COLOUR=31; # Dark red
+RTL_LOG_MSG_SUCCESS_COLOUR=33; # Dark yellow
+RTL_LOG_MSG_SUCCESS_END_COLOUR=32; # Dark green
+RTL_LOG_MSG_INFO_COLOUR=93; # Bright yellow
+RTL_LOG_MSG_INFO_END_COLOUR=92; # Bright green
+RTL_LOG_MSG_NOTICE_COLOUR=96; # Bright cyan
+RTL_LOG_MSG_VERBOSE_COLOUR=90; # Dark grey
+RTL_LOG_MSG_DEBUG_COLOUR=36; # Dark cyan
+
+
rtl_log_env_vars() {
- local _nvar=1 _arg="" _arg_len_max=0;
+ local _arg_len_max=0;
rtl_log_msg info "Variables for this ${1:-build}:"; shift;
- while [ ${_nvar} -le ${#} ]; do
- _arg="$(eval echo \${${_nvar}})";
- _arg="${_arg%%=*}";
- if [ ${#_arg} -gt ${_arg_len_max} ]; then
- _arg_len_max=${#_arg};
- fi; : $((_nvar+=1));
- done;
- while [ ${#} -gt 0 ]; do
- rtl_log_msg info "$(printf \
+ _arg_len_max="$(rtl_lmax "${@}")";
+ while [ "${#}" -gt 0 ]; do
+ rtl_log_msg info \
"%${_arg_len_max}.${_arg_len_max}s=%s" \
- "${1%%=*}" "$(rtl_get_var_unsafe ${1#*=})")";
+ "${1%%=*}" "$(rtl_get_var_unsafe "${1#*=}")";
shift;
done;
};
-rtl_log_set_vnfo_lvl() {
- EXP_RTL_LOG_VNFO_LVL="${1}";
-};
-
rtl_log_msg() {
- local _lvl="${1}" _lvl_uc="" _attr=""; shift;
- if [ "${_lvl}" = vnfo ]\
- || [ "${_lvl}" = vucc ]\
- && [ "${EXP_RTL_LOG_VNFO_LVL:-0}" -lt 1 ]; then
- return;
- elif [ "${_lvl}" = vvfo ]\
- && [ "${EXP_RTL_LOG_VNFO_LVL:-0}" -lt 2 ]; then
- return;
- elif [ "${_lvl}" = vvvo ]\
- && [ "${EXP_RTL_LOG_VNFO_LVL:-0}" -lt 3 ]; then
- return;
- elif [ "${_lvl}" = vvvv ]\
- && [ "${EXP_RTL_LOG_VNFO_LVL:-0}" -lt 4 ]; then
- return;
- fi;
- _lvl_uc="$(rtl_toupper "${_lvl%exit}")";
- _attr="$(rtl_get_var_unsafe "DEFAULT_LOG_MSG_${_lvl_uc}_COLOUR")";
- if [ ${#} -gt 1 ]; then
- exp_rtl_log_printf "${_attrs}" "==> %s %s %s" "$(rtl_date)" "${1}" "$*";
- else
- exp_rtl_log_printf "${_attrs}" "==> %s %s" "$(rtl_date)" "${1}";
- fi;
- if [ ${_lvl} = failexit ]; then
+ local _lvl="${1}" _fmt="${2}" _attr=""; shift 2;
+ case "${RTLP_LOG_LVL:-0}" in
+ 0) rtl_lmatch "notice verbose debug" "${_lvl}" && return; ;;
+ 1) rtl_lmatch "verbose debug" "${_lvl}" && return; ;;
+ 2) rtl_lmatch "debug" "${_lvl}" && return; ;;
+ 3) ;;
+ esac;
+ case "${_lvl}" in
+ fatal|fatalexit) _attr="${RTL_LOG_MSG_FATAL_COLOUR}"; ;;
+ warning) _attr="${RTL_LOG_MSG_WARNING_COLOUR}"; ;;
+ success) _attr="${RTL_LOG_MSG_SUCCESS_COLOUR}"; ;;
+ success_end) _attr="${RTL_LOG_MSG_SUCCESS_END_COLOUR}"; ;;
+ info) _attr="${RTL_LOG_MSG_INFO_COLOUR}"; ;;
+ info_end) _attr="${RTL_LOG_MSG_INFO_END_COLOUR}"; ;;
+ notice) _attr="${RTL_LOG_MSG_NOTICE_COLOUR}"; ;;
+ verbose) _attr="${RTL_LOG_MSG_VERBOSE_COLOUR}"; ;;
+ debug) _attr="${RTL_LOG_MSG_DEBUG_COLOUR}"; ;;
+ esac;
+ rtlp_log_printf "${_attr}" "==> %s ${_fmt}" "$(rtl_date)" "${@}";
+ if [ "x${_lvl}" = "xfatalexit" ]; then
exit 1;
- else
- return 0;
fi;
};
diff --git a/subr/rtl_string.subr b/subr/rtl_string.subr
index c30cfe8c..2dd9e27a 100644
--- a/subr/rtl_string.subr
+++ b/subr/rtl_string.subr
@@ -21,6 +21,15 @@ rtl_match() {
fi;
};
+rtl_matchr() {
+ local _s="${1}" _find="${2}";
+ if [ "${_s%${_find}}" != "${_s}" ]; then
+ return 0;
+ else
+ return 1;
+ fi;
+};
+
rtl_subst() {
local _s="${1}" _find="${2}" _replace="${3}" _prefix="" _s_new="";
while [ -n "${_s}" ]; do
@@ -29,7 +38,7 @@ rtl_subst() {
_s_new="${_s_new:+${_s_new}}${_prefix}${_replace}"; ;;
*) _s_new="${_s_new:+${_s_new}}${_s}"; _s=""; ;;
esac; done;
- echo "${_s_new}";
+ printf "%s" "${_s_new}";
};
rtl_tolower() {
@@ -68,7 +77,7 @@ rtl_tolower() {
_s="${_s#[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]}";
done; ;;
esac; done;
- echo "${_s_new}";
+ printf "%s" "${_s_new}";
};
rtl_toupper() {
@@ -107,7 +116,7 @@ rtl_toupper() {
_s="${_s#[^abcdefghijklmnopqrstuvwxyz]}";
done; ;;
esac; done;
- echo "${_s_new}";
+ printf "%s" "${_s_new}";
};
# vim:filetype=sh