From c6d6e08feab839a9dc5792071fb803494cc51a69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucio=20Andr=C3=A9s=20Illanes=20Albornoz?= Date: Wed, 26 Feb 2020 21:54:12 +0000 Subject: General cleanup, pt. II. --- build.sh | 175 ++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 94 insertions(+), 81 deletions(-) (limited to 'build.sh') 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 # -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 -- cgit v1.2.3