diff options
Diffstat (limited to 'subr/ex_pkg_dispatch.subr')
-rw-r--r-- | subr/ex_pkg_dispatch.subr | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/subr/ex_pkg_dispatch.subr b/subr/ex_pkg_dispatch.subr new file mode 100644 index 00000000..99c9ff8f --- /dev/null +++ b/subr/ex_pkg_dispatch.subr @@ -0,0 +1,71 @@ +# +# set -o errexit -o noglob are assumed. +# + +ex_pkg_dispatch() { + local _tgt_name="${1}" _pkg_name="${2}" \ + _restart="${3}" _restart_at="${4}" \ + _pkg_step_cmds _pkg_step_cmd_args; + if [ "${_pkg_name#*_flavour_*}" != "${_pkg_name}" ]; then + PKG_NAME_PARENT="${_pkg_name%_flavour_*}"; + fi; + (set -o errexit -o noglob; + ex_pkg_vars; ex_pkg_env; + ex_build_fileop mkdir "${PKG_BASE_DIR}"; + ex_build_fileop cd "${PKG_BASE_DIR}"; + if [ -n "${_restart}" ]\ + || [ "${_tgt_name}" = "INVARIANTS" ]\ + || ! ex_pkg_state_test "${_pkg_name}" finish; then + set -- $(ex_lfilter -not "${BUILD_STEPS}" \ + "$(ex_get_var_unsafe PKG_$(ex_toupper "${_pkg_name}")_BUILD_STEPS_DISABLE)"); + while [ ${#} -gt 0 ]; do + _pkg_step_cmds=""; _pkg_step_cmd_args=""; + case "${1#*:}" in + dynamic) + if [ "${_tgt_name}" = "INVARIANTS" ]; then + _pkg_step_cmds="pkg_${_pkg_name}_${1%:*} pkg_${1%:*}"; + elif [ -n "${_restart}" ]; then + if [ -z "${_restart_at}" ]\ + || ex_lmatch "${_restart_at}" , "${1%:*}"; then + _pkg_step_cmds="pkg_${_pkg_name}_${1%:*} pkg_${1%:*}"; + fi; + elif ! ex_pkg_state_test "${_pkg_name}" "${1%:*}"; then + _pkg_step_cmds="pkg_${_pkg_name}_${1%:*} pkg_${1%:*}"; + fi; ;; + invariant) + _pkg_step_cmds="pkg_${1%:*}"; ;; + variant) + if ex_lmatch "${_restart_at}" "," "${1%:*}"; then + _pkg_step_cmds="pkg_${_pkg_name}_${1%:*} pkg_${1%:*}"; + fi; ;; + virtual) + _pkg_step_cmds="pkg_${_pkg_name}_${1%:*}"; + _pkg_step_cmd_args="${_restart_at:-ALL}"; ;; + all) + if ex_test_cmd "pkg_${_pkg_name}_${1%:*}"; then + "pkg_${_pkg_name}_${1%:*}" "${_restart_at:-ALL}"; + break; + fi; ;; + finish) ex_pkg_state_push "${_pkg_name}" finish; ;; + *) ;; + esac; + for __ in ${_pkg_step_cmds}; do + if ex_test_cmd "${__}"; then + ex_test_cmd "pkg_${_pkg_name}_${1%:*}_pre" \ + && "pkg_${_pkg_name}_${1%:*}_pre" + "${__}" ${_pkg_step_cmd_args}; + ex_test_cmd "pkg_${_pkg_name}_${1%:*}_post" \ + && "pkg_${_pkg_name}_${1%:*}_post" + if [ "${1#*:}" != "invariant" ]\ + && [ ${#} -ge 2 ]; then + ex_pkg_state_push "${_pkg_name}" "${1%:*}" "-${2#*:}"; + else + ex_pkg_state_push "${_pkg_name}" "${1%:*}"; + fi; break; + fi; + done; + shift; done; + fi); return ${?}; +}; + +# vim:filetype=sh |