summaryrefslogtreecommitdiffhomepage
path: root/build.sh
diff options
context:
space:
mode:
authorLucio Andrés Illanes Albornoz <lucio@lucioillanes.de>2020-02-26 21:54:12 +0000
committerLucio Andrés Illanes Albornoz <lucio@lucioillanes.de>2020-02-26 21:54:12 +0000
commitc6d6e08feab839a9dc5792071fb803494cc51a69 (patch)
tree1513c817e4446ac3cf512d6c1f287a10fc1daf2e /build.sh
parent4a5da5254e1207686f492e7ce8759c80466185f3 (diff)
downloadmidipix_build-c6d6e08feab839a9dc5792071fb803494cc51a69.tar.bz2
midipix_build-c6d6e08feab839a9dc5792071fb803494cc51a69.tar.xz
General cleanup, pt. II.
Diffstat (limited to 'build.sh')
-rwxr-xr-xbuild.sh175
1 files changed, 94 insertions, 81 deletions
diff --git a/build.sh b/build.sh
index be59adbb..b88aab7c 100755
--- a/build.sh
+++ b/build.sh
@@ -2,93 +2,106 @@
# Copyright (c) 2016, 2017, 2018, 2019 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
#
-buildp_dispatch() {
- local _msg="${1}" _group_name="${2}" _pkg_name="${3}" \
- _build_group_lc="" _build_group_meta="" _build_groups_lc="" \
- _pkg_names="" _pkg_restart="" _rc=0;
+buildp_ast() {
+ local _param="${1}" _pids_killed="";
+ if [ "${_param}" = "abort" ]; then
+ rtl_log_msg failexit "Build aborted.";
+ fi;
+ if [ -n "${DEFAULT_BUILD_STATUS_IN_PROGRESS_FNAME}" ]; then
+ rtl_fileop rm "${DEFAULT_BUILD_STATUS_IN_PROGRESS_FNAME}";
+ fi;
+ if rtl_kill_tree "${$}"\
+ && [ -n "${_pids_killed}" ]; then
+ rtl_log_msg vnfo "Killed PIDs ${_pids_killed}";
+ fi;
+};
+
+buildp_dispatch_fail_pkg() {
+ local _group_name="${1}" _pkg_name="${2}";
+ : $((BUILD_NFAIL+=1)); BUILD_PKGS_FAILED="$(rtl_lconcat "${BUILD_PKGS_FAILED}" "${_pkg_name}")";
+ if [ "${ARG_RELAXED:-0}" -eq 1 ]; then
+ rtl_log_msg fail "$(printf "Build failed in \`%s', check \`%s' for details." "${_pkg_name}" "${BUILD_WORKDIR}/${_pkg_name}_stderrout.log")";
+ else rtl_log_msg fail "${BUILD_WORKDIR}/${_pkg_name}_stderrout.log:";
+ cat "${BUILD_WORKDIR}/${_pkg_name}_stderrout.log";
+ if [ -n "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}" ]; then
+ printf "%s" "${_pkg_name}" > "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}";
+ fi;
+ rtl_log_msg failexit "$(printf "Build failed in \`%s'." "${_pkg_name}")";
+ fi;
+};
+
+buildp_dispatch_group_state() {
+ local _group_name="${1}";
case "${_msg}" in
- # Top-level
- start_build) shift; build_init "${@}";
- ex_rtl_log_msg info "Build started by ${BUILD_USER:=${USER}}@${BUILD_HNAME:=$(hostname)} at ${BUILD_DATE_START}.";
- ex_rtl_log_env_vars "build (global)" ${DEFAULT_LOG_ENV_VARS};
- _build_groups_lc="${BUILD_GROUPS:-${GROUPS_DEFAULT}}";
- if ! ex_rtl_lmatch "${ARG_DIST}" "rpm" ","; then
- _build_groups_lc="$(ex_rtl_lfilter "${_build_groups_lc}" "host_deps_rpm")";
- fi;
- for _build_group_lc in ${_build_groups_lc}; do
- ex_pkg_dispatch buildp_dispatch "${_build_group_lc}" "${ARG_PARALLEL:-1}" \
- "${ARG_RESTART}" "${ARG_RESTART_AT}" "${ARG_RESTART_RECURSIVE}"; _rc="${?}";
- _pkg_names="$(ex_rtl_lconcat "${_pkg_names}" "${EX_PKG_NAMES}")";
- if [ "${_rc}" -ne 0 ]; then
- break;
- fi;
- done;
- for _pkg_restart in ${ARG_RESTART}; do
- if ! ex_rtl_lmatch "${_pkg_restart}" "ALL LAST"\
- && ! ex_rtl_lmatch "${_pkg_names}" "${_pkg_restart}"; then
- ex_rtl_log_msg failexit "Error: package \`${_pkg_restart}' unknown.";
- fi;
- done;
- if ! ex_pkg_dispatch buildp_dispatch "invariants" "${ARG_PARALLEL:-1}" "ALL" "ALL" 2; then
- break;
- fi;
- buildp_dispatch finish_build; ;;
- finish_build) build_fini;
- ex_rtl_log_msg info "${BUILD_NFINI:-0} finished, ${BUILD_NSKIP:-0} skipped, and ${BUILD_NFAIL:-0} failed package(s).";
- ex_rtl_log_msg info "Build time: ${BUILD_TIMES_HOURS:-0} hour(s), ${BUILD_TIMES_MINUTES:-0} minute(s), and ${BUILD_TIMES_SECS:-0} second(s).";
- if [ -n "${BUILD_PKGS_FAILED}" ]; then
- ex_rtl_log_msg failexit "Build script failure(s) in: ${BUILD_PKGS_FAILED}.";
- fi; ;;
+ finish_group) rtl_log_msg suc2 "Finished \`${_group_name}' build group."; ;;
+ start_group) rtl_log_msg inf2 "Starting \`${_group_name}' build group..."; ;;
+ esac;
+};
- # Group build
- start_group) ex_rtl_log_msg inf2 "Starting \`${_group_name}' build group..."; ;;
- finish_group) ex_rtl_log_msg suc2 "Finished \`${_group_name}' build group."; ;;
+buildp_dispatch_pkg_state() {
+ local _msg="${1}" _group_name="${2}" _pkg_name="${3}";
+ case "${_msg}" in
+ disabled_pkg) : $((BUILD_NSKIP+=1)); rtl_log_msg vnfo "$(printf "Skipping disabled package \`%s.'" "${_pkg_name}")"; ;;
+ missing_pkg) rtl_log_msg failexit "Error: package \`${_pkg_name}' missing in build.vars."; ;;
+ skipped_pkg) : $((BUILD_NSKIP+=1)); rtl_log_msg vnfo "$(printf "Skipping finished package \`%s.'" "${_pkg_name}")"; ;;
+ start_pkg) rtl_log_msg info "$(printf "[%03d/%03d] Starting \`%s' build..." "${4}" "${5}" "${_pkg_name}")"; ;;
+ step_pkg) rtl_log_msg vucc "$(printf "Finished build step %s of package \`%s'." "${4}" "${_pkg_name}")"; ;;
+ finish_pkg)
+ : $((BUILD_NFINI+=1));
+ if [ "${ARG_VERBOSE:-0}" -ge 2 ]; then
+ cat "${BUILD_WORKDIR}/${_pkg_name}_stderrout.log";
+ fi;
+ rtl_log_msg succ "$(printf "Finished \`%s' build." "${_pkg_name}")"; ;;
+ start_pkg_child)
+ if [ "${PKG_NO_LOG_VARS:-0}" -eq 0 ]; then
+ rtl_log_env_vars "build" $(set | awk -F= '/^PKG_/{print $1}' | sort);
+ fi;
+ if [ "${ARG_VERBOSE:-0}" -ge 3 ]; then
+ set -o xtrace;
+ fi; ;;
+ esac;
+};
- # Package build
- start_pkg) ex_rtl_log_msg info "$(printf "[%03d/%03d] Starting \`%s' build..." "${4}" "${5}" "${_pkg_name}")"; ;;
- finish_pkg) : $((BUILD_NFINI+=1));
- if [ "${ARG_VERBOSE:-0}" -ge 2 ]; then
- cat "${BUILD_WORKDIR}/${_pkg_name}_stderrout.log";
- fi;
- ex_rtl_log_msg succ "$(printf "Finished \`%s' build." "${_pkg_name}")"; ;;
- fail_pkg) : $((BUILD_NFAIL+=1));
- BUILD_PKGS_FAILED="${BUILD_PKGS_FAILED:+${BUILD_PKGS_FAILED} }${_pkg_name}";
- if [ "${ARG_RELAXED:-0}" -eq 1 ]; then
- ex_rtl_log_msg fail "$(printf "Build failed in \`%s', check \`%s' for details." "${_pkg_name}" "${BUILD_WORKDIR}/${_pkg_name}_stderrout.log")";
- else
- ex_rtl_log_msg fail "${BUILD_WORKDIR}/${_pkg_name}_stderrout.log:";
- cat "${BUILD_WORKDIR}/${_pkg_name}_stderrout.log";
- if [ -n "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}" ]; then
- echo "${_pkg_name}" > "${DEFAULT_BUILD_LAST_FAILED_PKG_FNAME}";
- fi;
- ex_rtl_log_msg fail "$(printf "Build failed in \`%s'." "${_pkg_name}")";
- if [ "${ARG_PARALLEL:-0}" -eq 1 ]; then
- ex_rtl_log_msg fail "Terminating pending builds...";
- pkill -P "${$}";
- fi;
- exit 1;
- fi; ;;
- disabled_pkg) : $((BUILD_NSKIP+=1));
- ex_rtl_log_msg vnfo "$(printf "Skipping disabled package \`%s.'" "${_pkg_name}")"; ;;
- skipped_pkg) : $((BUILD_NSKIP+=1));
- ex_rtl_log_msg vnfo "$(printf "Skipping finished package \`%s.'" "${_pkg_name}")"; ;;
- step_pkg) ex_rtl_log_msg vucc "$(printf "Finished build step %s of package \`%s'." "${4}" "${_pkg_name}")"; ;;
+buildp_dispatch() {
+ local _msg="${1}"; shift;
+ case "${_msg}" in
+ disabled_pkg|finish_pkg|missing_pkg|skipped_pkg|start_pkg|start_pkg_child|step_pkg)
+ buildp_dispatch_pkg_state "${_msg}" "${@}"; ;;
+ finish_group|start_group)
+ buildp_dispatch_group_state "${_msg}" "${@}"; ;;
+ *) if command -v "buildp_dispatch_${_msg}"; then
+ "buildp_dispatch_${_msg}" "${@}";
+ fi; ;;
+ esac;
+};
- # Child process
- exec_finish) ;;
- exec_missing) ex_rtl_log_msg failexit "Error: package \`${_pkg_name}' missing in build.vars."; ;;
- exec_start) if [ "${PKG_NO_LOG_VARS:-0}" -eq 0 ]; then
- ex_rtl_log_env_vars "build" $(set | awk -F= '/^PKG_/{print $1}' | sort);
+build() {
+ local _build_date_start="" _build_time_hours=0 _build_time_mins=0 _build_time_secs=0 \
+ BUILD_NFAIL=0 BUILD_NFINI=0 BUILD_NSKIP=0 BUILD_PKGS_FAILED="" EX_PKG_DISPATCH_UNKNOWN="";
+ if trap "buildp_ast abort" HUP INT TERM USR1 USR2\
+ && trap "buildp_ast exit" EXIT\
+ && . ./subr/build_init.subr && build_init "${@}"; then
+ _build_date_start="$(rtl_date %Y-%m-%d-%H-%M-%S)"; _build_time_secs="$(rtl_date %s)";
+ rtl_log_msg info "Build started by ${BUILD_USER:=${USER}}@${BUILD_HNAME:=$(hostname)} at ${_build_date_start}.";
+ rtl_log_env_vars "build (global)" ${DEFAULT_LOG_ENV_VARS};
+ if ! ex_pkg_dispatch "${DEFAULT_BUILD_STEPS}" "${DEFAULT_BUILD_VARS}" \
+ buildp_dispatch "${BUILD_GROUPS}" "${ARG_PARALLEL:-1}" \
+ "${BUILD_WORKDIR}/build.fifo" "${ARG_RESTART}" \
+ "${ARG_RESTART_AT}" "${ARG_RESTART_RECURSIVE}" "${BUILD_WORKDIR}"; then
+ rtl_log_msg failexit "Error: package \`${EX_PKG_DISPATCH_UNKNOWN}' unknown.";
+ else : $((_build_time_secs=$(rtl_date %s)-${_build_time_secs}));
+ : $((_build_time_hours=${_build_time_secs}/3600));
+ : $((_build_time_minutes=(${_build_time_secs}%3600)/60));
+ : $((_build_time_secs=(${_build_time_secs}%3600)%60));
+ rtl_log_msg info "${BUILD_NFINI:-0} finished, ${BUILD_NSKIP:-0} skipped, and ${BUILD_NFAIL:-0} failed package(s).";
+ rtl_log_msg info "Build time: ${_build_time_hours:-0} hour(s), ${_build_time_minutes:-0} minute(s), and ${_build_time_secs:-0} second(s).";
+ if [ -n "${BUILD_PKGS_FAILED}" ]; then
+ rtl_log_msg failexit "Build script failure(s) in: ${BUILD_PKGS_FAILED}.";
fi;
- if [ "${ARG_VERBOSE:-0}" -ge 3 ]; then
- set -o xtrace;
- fi; ;;
- exec_step) ex_rtl_log_msg info "Finished build step ${4} of package \`${_pkg_name}'."; ;;
- esac; return 0;
+ fi;
+ fi;
};
-set +o errexit -o noglob; cd "$(dirname "${0}")";
-for __ in $(find subr -name *.subr); do
- . "${__}"; done; buildp_dispatch start_build "${@}";
+set +o errexit -o noglob; build "${@}";
# vim:filetype=sh textwidth=0