# # set +o errexit -o noglob -o nounset is assumed. # exp_pkg_exec_filter_vars_fn() { local _vname="${1}"; case "${_vname}" in DEFAULT|PKG_*) return 0; ;; BUILD_DLCACHEDIR|BUILD_WORKDIR|MIDIPIX_BUILD_PWD) return 0; ;; CONFIG_CACHE_GNULIB) return 0; ;; PREFIX|PREFIX_CROSS|PREFIX_MINGW32|PREFIX_MINIPIX|PREFIX_NATIVE|PREFIX_RPM) return 0; ;; *) return 1; ;; esac; }; # # exp_pkg_exec_pre() - XXX # @_group_name: build group name # @_pkg_name: single package name # @_restart_at: optional comma-separated list of build steps at which to rebuild or ALL or LAST # # Return: zero (0) on success, non-zero (>0) on failure # exp_pkg_exec_pre() { local _group_name="${1}" _pkg_name="${2}" _restart_at="${3}"; if [ -z "${PKG_URL:-}" ]\ && [ -z "${PKG_URLS_GIT:-}" ]\ && [ -z "${PKG_VERSION:-}" ]\ && ! rtl_test_cmd "pkg_${_pkg_name}_all"; then "${_dispatch_fn}" missing_pkg "${_group_name}" "${_pkg_name}"; return 1; elif ! ex_pkg_state_test "${_pkg_name}" "start" "${_restart_at}"; then if [ "${PKG_NO_CLEAN_BASE_DIR:-0}" -eq 0 ]\ && ! rtl_fileop rm "${PKG_BASE_DIR}" "${PKG_BUILD_DIR}" "${PKG_DESTDIR}" "${PKG_DESTDIR_HOST}"\ || ! rtl_fileop mkdir "${PKG_BASE_DIR}"; then return 1; fi; if ! rtl_fileop mkdir "${PKG_BUILD_DIR}" "${PKG_DESTDIR}"\ || ! ex_pkg_state_set "${_pkg_name}" "start"; then return 1; fi; fi; rtl_fileop cd "${PKG_BUILD_DIR}"; }; # # exp_pkg_exec_step() - XXX # @_group_name: build group name # @_pkg_name: single package name # @_restart_at: optional comma-separated list of build steps at which to rebuild or ALL or LAST # @_step: build step to execute # # Return: zero (0) on success, non-zero (>0) on failure # exp_pkg_exec_step() { local _group_name="${1}" _pkg_name="${2}" _restart_at="${3}" _step="${4}" \ _fn_name="" _pkg_step_fn="" _rc=0; if rtl_test_cmd "pkg_${_pkg_name}_${_step}"; then _pkg_step_fn="pkg_${_pkg_name}_${_step}"; else _pkg_step_fn="pkg_${_step}"; fi; for _fn_name in \ "pkg_${_pkg_name}_${_step}_pre" \ "${_pkg_step_fn}" \ "pkg_${_pkg_name}_${_step}_post"; do if rtl_test_cmd "${_fn_name}"\ && ! "${_fn_name}" "${_group_name}" "${_pkg_name}" "${_restart_at}"; then _rc=1; break; fi; done; return "${_rc}"; }; # # exp_pkg_exec() - XXX # @_dispatch_fn: top-level dispatch function name # @_group_name: build group name # @_pkg_name: single package name # @_restart_at: optional comma-separated list of build steps at which to rebuild or ALL or LAST # # Return: zero (0) on success, non-zero (>0) on failure # ex_pkg_exec() { local _dispatch_fn="${1}" _group_name="${2}" _pkg_name="${3}" _restart_at="${4}" \ _build_step_last="" _rc=0 _step=""; if ! exp_pkg_exec_pre "${_group_name}" "${_pkg_name}" "${_restart_at}"\ || ! "${_dispatch_fn}" start_pkg_child "${_group_name}" "${_pkg_name}"; then _rc=1; elif rtl_test_cmd "pkg_${_pkg_name}_all"; then "pkg_${_pkg_name}_all" "${_restart_at}"; _rc="${?}"; else set -- ${PKG_BUILD_STEPS}; while [ ${#} -gt 0 ]; do _step="${1}"; shift; if [ "${#_restart_at}" -gt 0 ]\ && [ "${_restart_at}" != "ALL" ]\ && [ "${_restart_at}" != "LAST" ]\ && ! rtl_lmatch "${_restart_at}" "${_step}" ","; then continue; fi; if [ "${_step}" = "${ARG_DUMP_IN}" ]; then printf "" > "${BUILD_WORKDIR}/${_pkg_name}.dump"; rtl_filter_vars exp_pkg_exec_filter_vars_fn >> "${BUILD_WORKDIR}/${_pkg_name}.dump"; export >> "${BUILD_WORKDIR}/${_pkg_name}.dump"; exit 1; elif [ "${_step}" = "finish" ]; then ex_pkg_state_set "${_pkg_name}" finish; break; elif [ "${PKG_FORCE:-0}" -eq 0 ]\ && ex_pkg_state_test "${_pkg_name}" "${_step}" "${_restart_at}"; then continue; elif ! exp_pkg_exec_step "${_group_name}" "${_pkg_name}" "${_restart_at}" "${_step}"; then _rc=1; break; else printf "step %s %s %s\n" "${_group_name}" "${_pkg_name}" "${_step}" >&3; ex_pkg_state_set "${_pkg_name}" "${_step}" "${@}"; fi; done; fi; if [ "${_rc:-0}" -ne 0 ]\ && [ "${ARG_DUMP_ON_ABORT:-0}" -eq 1 ]; then printf "" > "${BUILD_WORKDIR}/${_pkg_name}.dump"; rtl_filter_vars exp_pkg_exec_filter_vars_fn >> "${BUILD_WORKDIR}/${_pkg_name}.dump"; export >> "${BUILD_WORKDIR}/${_pkg_name}.dump"; fi; return "${_rc}"; }; # vim:filetype=sh