summaryrefslogtreecommitdiffhomepage
path: root/subr/ex_pkg_dispatch.subr
diff options
context:
space:
mode:
Diffstat (limited to 'subr/ex_pkg_dispatch.subr')
-rw-r--r--subr/ex_pkg_dispatch.subr71
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