From 820be1bcb38273c0c7adc44b4a474c08273cdf61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucio=20Andr=C3=A9s=20Illanes=20Albornoz=20=28arab=2C=20vx?= =?UTF-8?q?p=29?= Date: Sat, 9 Jul 2016 14:36:05 +0000 Subject: General cleanup; user-visible changes: -a nt{32,64}, -b {debug,release}. --- build.subr | 349 +++++++++++++++---------------------------------------------- 1 file changed, 84 insertions(+), 265 deletions(-) (limited to 'build.subr') diff --git a/build.subr b/build.subr index f44b5be7..b0469f7e 100644 --- a/build.subr +++ b/build.subr @@ -1,20 +1,11 @@ # -# . ./build.vars and set -o errexit are assumed. +# . ./build.vars and set -o errexit -o noglob are assumed. # See warning at the top of build.vars. # date() { command date +"${1:-${TIMESTAMP_FMT}}"; }; -get_basename() { set -- $(get_name_without_slash ${1}); echo "${1##*/}"; }; -get_var_dyn() { ${1}; }; get_var_unsafe() { eval echo \${${1}}; }; -set_var_dyn() { eval ${1}\(\) \{ echo \"${2}\"\; \}; }; set_var_unsafe() { eval ${1}=\"${2}\"; }; -get_name_without_slash() { while [ "${1%/}" != "${1}" ]; do set -- ${1%/}; done; echo ${1}; }; -get_postfix_lrg() { echo "${1##*${2}}"; }; -get_prefix_lrg() { echo "${1%%${2}*}"; }; -get_postfix() { echo "${1#*${2}}"; }; -get_prefix() { echo "${1%${2}*}"; }; -match_any() { [ "${1#*${2}*}" != "${1}" ]; }; match_uname_any() { set -- ${1} $(uname -s); [ "${2#*${1}*}" != "${2}" ]; }; push_IFS() { _pI_IFS="${IFS}"; IFS="${1}"; }; pop_IFS() { IFS="${_pI_IFS}"; unset _pI_IFS; }; @@ -23,63 +14,38 @@ split() { push_IFS "${1}"; set -- ${2}; pop_IFS; echo "${*}"; }; test_cmd() { command -v "${1}" >/dev/null; }; unsplit() { push_IFS "${1}"; shift; set -- "${@}"; echo "${*}"; pop_IFS; }; - -build_times_init() { BUILD_TIMES_SECS=$(command date +%s); }; -build_times_get() { - : $((BUILD_TIMES_SECS=$(command date +%s)-${BUILD_TIMES_SECS})); - : $((BUILD_TIMES_HOURS=${BUILD_TIMES_SECS}/3600)); - : $((BUILD_TIMES_MINUTES=(${BUILD_TIMES_SECS}%3600)/60)); - : $((BUILD_TIMES_SECS=(${BUILD_TIMES_SECS}%3600)%60)); -}; - -clean_prefix() { - log_msg info "-c specified, cleaning prefix..."; - set -- bin i686-nt32-midipix include lib lib64 libexec native share x86_64-nt64-midipix; - while [ ${#} -gt 0 ]; do rm -rf ${PREFIX}/${1}; shift; done; - for _cp_pname in $(find ${PREFIX}/tmp -mindepth 1 -maxdepth 1 -not -iname \*.tar\*) \ - $(find ${PREFIX}/tmp -mindepth 1 -maxdepth 1 -type f -iname .\*); do - rm_if_exists ${_cp_pname}; - done; unset _cp_pname; -}; - -clean_build_status() { - [ "${1}" = abort ] && _cbs_abort=1; - set -- BUILD_STATUS_IN_PROGRESS_FNAME BUILD_STATUS_PROGRESS_FNAME BUILD_STATUS_TARBALL_PROGRESS_FNAME; - while [ ${#} -gt 0 ]; do - rm -f $(get_var_unsafe ${1}); shift; - done; - if [ ${_cbs_abort:-0} -eq 1 ]; then - unset _cbs_abort; - touch ${PREFIX}/BUILD_ABORTED_AT_$(date %Y-%m-%d-%H-%M-%S); - log_msg fail "Build aborted at $(date %Y-%m-%d-%H-%M-%S)."; - fi; unset _cbs_abort; +compare_hash() { + # Push the output of dgst(1SSL) and the caller-supplied hash + # value to compare the former with on the pseudo-stack and + # shift off# all but the last two positional parameters. + # This corresponds to the hash output and caller-supplied + # hash values. + set -- $(openssl dgst -sha256 ${1}) ${2}; shift $((${#}-2)); + [ "${1}" = "${2}" ] || echo "${1}"; }; -export_vars_subst() { - _evs_pfx=${1}; _evs_pfx_new=${2}; shift 2; - while [ ${#} -gt 0 ]; do - if [ -n "${_evs_vval:=$(get_var_unsafe ${_evs_pfx}${1})}" ]; then - export "${_evs_pfx_new}${1}=${_evs_vval}"; - fi; unset _evs_vval; shift; - done; unset _evs_pfx _evs_pfx_new; +# N.B. URLs ($1) may contain `?' or '&' characters. +fetch() { + _f_url="${1}"; _f_sha256sum_src="${2}"; + _f_url_dst="${DLCACHEDIR}/$(basename "${_f_url}")"; + wget ${WGET_ARGS} -c -O ${_f_url_dst} "${_f_url}"; + if [ -n "${_f_sha256sum_src}" ]; then + _f_sha256sum_dst="$(compare_hash ${_f_url_dst} ${_f_sha256sum_src})"; + if [ -n "${_f_sha256sum_dst}" ]; then + set -- "${_f_url}" ${_f_sha256sum_dst} ${_f_sha256sum_src}; + unset _f_url _f_url_dst _f_sha256sum_src _f_sha256sum_dst; + log_msg failexit "Error: hash mismatch for URL \`${1}' (is: ${2}, should be: ${3}.)"; + fi; unset _f_sha256sum_dst; + fi; unset _f_url _f_url_dst _f_sha256sum_src; }; fetch_git() { [ -z "${1}" ] && return 1; - [ ${ARG_NO_DOWNLOAD:-0} -eq 1 ] && return; rm_if_exists ${1}; [ -d ${1} ] && (cd ${1} && git pull origin main)\ || git clone ${3} ${2} ${1}; }; -find_with_no_paths() { - for _fwnp_not_path in ${1}; do - _fwnp_args="${_fwnp_args:+${_fwnp_args} }-not -path ./${_fwnp_not_path} -not -path ./${_fwnp_not_path}/*"; - done; shift; - set -f; find "${@}" ${_fwnp_args}; _rc=${?}; set +f; - unset _fwnp_args _fwnp_not_path; return ${_rc}; -}; - insert_build_script_link() { _ibsl_fname=${1}; _ibsl_level=${_ibsl_fname%%.*}; @@ -92,8 +58,8 @@ insert_build_script_link() { elif [ -e ${_ibsl_fname} ]; then log_msg failexit "Error: build script \`${_ibsl_fname}' already exists."; elif [ -z "$(find -maxdepth 1 -name ${_ibsl_level}.\* -printf '%P\n' -quit)" ]; then - echo ln -s pkg.build ${_ibsl_fname}; - ln -s pkg.build ${_ibsl_fname}; + echo ln -s -- pkg.build ${_ibsl_fname}; + ln -s -- pkg.build ${_ibsl_fname}; unset _ibsl_fname _ibsl_level _ibsl_name; return 0; else @@ -104,8 +70,8 @@ insert_build_script_link() { for _ibsl_fname_cur in ${_ibsl_levels}; do if [ \( ${_ibsl_changed:=0} -eq 0 \) -a \ \( "${_ibsl_fname_cur%%.*}" -eq ${_ibsl_level} \) ]; then - echo ln -s pkg.build ${_ibsl_fname}; - ln -s pkg.build ${_ibsl_fname}; + echo ln -s -- pkg.build ${_ibsl_fname}; + ln -s -- pkg.build ${_ibsl_fname}; _ibsl_changed=1; fi; if [ ${_ibsl_changed:=0} -eq 1 ]; then @@ -113,9 +79,9 @@ insert_build_script_link() { -printf '%P\n' -quit)" ]; then _ibsl_last=1; fi; - echo mv ${_ibsl_fname_cur} \ + echo mv -- ${_ibsl_fname_cur} \ $((${_ibsl_fname_cur%%.*}+1)).${_ibsl_fname_cur#*.}; - mv ${_ibsl_fname_cur} \ + mv -- ${_ibsl_fname_cur} \ $((${_ibsl_fname_cur%%.*}+1)).${_ibsl_fname_cur#*.}; if [ ${_ibsl_last:-0} -eq 1 ]; then break; @@ -129,7 +95,6 @@ insert_build_script_link() { unset _ibsl_fname _ibsl_level _ibsl_name; fi; }; - isnumber() { [ -z "${1}" ] && return 1 || _i_num=${1}; while [ -n "${_i_num}" ]; do @@ -141,152 +106,6 @@ isnumber() { done; unset _i_num; return 0; }; -rm_if_exists() { - [ -z "${1#-m}" ] && { _rie_arg_m=1; shift; }; - [ -z "${1#-c}" ] && { _rie_arg_c=1; shift; }; - [ -z "${1}" ] && return 1; - if [ -d ${1} -o -f ${1} ]; then - log_msg warn "Removing directory or file \`${1}'."; - if [ ${ARG_PEDANTIC:-0} -eq 1 ]; then - printf "Confirm deletion (y|N) "; - read _rie_prompt; case "${_rie_prompt}" in - [yY]) rm -rf ${1}; ;; - *) log_msg warn "Skipping removal of \`${1}'."; - _rie_arg_m=0; ;; - esac; - else - rm -rf ${1}; - fi; - fi; - [ ${_rie_arg_m:-0} -eq 1 ] && { - log_msg warn "Making directory \`${1}'."; - mkdir ${1}; unset _rie_arg_m; }; - [ ${_rie_arg_c:-0} -eq 1 ] && { cd ${1}; unset _rie_arg_c; }; - return 0; -}; - -rotate_files() { - set -- $(find ${PREFIX} -mindepth 1 -maxdepth 1 -type f -iname "${1}" |\ - sort | sed -n $((${2}+1)),\$p); - while [ ${#} -gt 0 ]; do - rm -f "${1}"; shift; - done; -}; - -set_env_vars() { - _sev_val_new="${1}"; shift; - while [ ${#} -gt 1 ]; do - [ -z "${_sev_val_new}" ] && unset ${1} ||\ - export "${1}=${_sev_val_new}"; shift; - done; unset _sev_val_new; -}; - -set_env_vars_with_sep() { - _sevws_sep=${1}; shift; push_IFS ${_sevws_sep}; set -- ${1}; - while [ ${#} -gt 0 ]; do - export "${1}"; shift; - done; unset _sevws_sep; pop_IFS; -}; - - -# Download GNU bash-style patch sets into ${2}-patches-extra and -# apply them to ${2} in the correct order. -apply_patches() { - (rm_if_exists -m -c ${2}-patches-extra; - wget -c -nd -np -r -R \*.htm\* -R \*.sig ${1}; - for _ap_patch_fname in \ - $(find . -type f -not -iname \*.sig | sort); do - patch -b -d ../${2} -p0 < ${_ap_patch_fname}; - done; unset _ap_patch_fname); -}; - -# Check whether all supplied arguments contain non-empty valid values. -check_path_vars() { - while [ ${#} -gt 0 ]; do - if [ -z "${_cpv_val:=$(get_var_unsafe "${1}")}" ]; then - log_msg failexit "Error: variable \`${1}' is empty or unset."; - elif match_any "${_cpv_val}" " "; then - log_msg failexit "Error: variable \`${1}' contains one or more whitespace characters."; - else - shift; - fi; - unset _cpv_val; - done; -}; - -# Check whether all supplied command names resolve. -check_prereq_cmds() { - while [ ${#} -gt 0 ]; do - if ! command -v ${1} >/dev/null; then - _cpc_missing_list="${1}${_cpc_missing_list:+ ${_cpc_missing_list}}"; - fi; shift; - done; - if [ -n "${_cpc_missing_list}" ]; then - log_msg failexit "Error: missing prerequisite command(s): ${_cpc_missing_list}."; - fi; unset _cpc_missing_list; -}; - -# Check whether all supplied pathnames resolve. -check_prereq_files() { - while [ ${#} -gt 0 ]; do - if [ ! -e ${1} ]; then - _cpf_missing_list="${1}${_cpf_missing_list:+ ${_cpf_missing_list}}"; - fi; shift; - done; - if [ -n "${_cpf_missing_list}" ]; then - log_msg failexit "Error: missing prerequisite file(s): ${_cpf_missing_list}."; - fi; unset _cpf_missing_list; -}; - -# Clear the environment by unsetting each exported variable except -# for those named by the caller. -clear_env_with_except() { - _cewe_vfilter="${*}"; _cewe_unset_cmds="$(mktemp -q)"; - export | while read _cewe_vspec; do - set -- ${_cewe_vspec}; shift; - [ "${1#*[^\"\'=a-zA-Z0-9_]}" != "${1}" ] && continue; - if ! match_list "${_cewe_vfilter}" " " \ - $(get_prefix_lrg ${1} =); then - echo unset $(get_prefix_lrg ${1} =) >> ${_cewe_unset_cmds}; - fi; - done; . "${_cewe_unset_cmds}"; rm -f "${_cewe_unset_cmds}" 2>/dev/null; - unset _cewe_vfilter _cewe_vspec; -}; - -# N.B. URLs ($1) may contain `?' or '&' characters. -fetch() { - [ ${ARG_NO_DOWNLOAD:-0} -eq 1 ] && return; - _f_url="${1}"; _f_sha256sum_src="${2}"; - _f_url_dst="$(get_basename "${_f_url}")"; - rm_if_exists ${_f_url_dst}; - wget ${WGET_ARGS} -O ${_f_url_dst} "${_f_url}"; - if [ -n "${_f_sha256sum_src}" ]; then - _f_sha256sum_dst="$(compare_hash ${_f_url_dst} ${_f_sha256sum_src})"; - if [ -n "${_f_sha256sum_dst}" ]; then - set -- "${_f_url}" ${_f_sha256sum_dst} ${_f_sha256sum_src}; - unset _f_url _f_url_dst _f_sha256sum_src _f_sha256sum_dst; - log_msg failexit "Error: hash mismatch for URL \`${1}' (is: ${2}, should be: ${3}.)"; - fi; unset _f_sha256sum_dst; - fi; unset _f_url _f_url_dst _f_sha256sum_src; -}; - -compare_hash() { - # Push the output of dgst(1SSL) and the caller-supplied hash - # value to compare the former with on the pseudo-stack and - # shift off# all but the last two positional parameters. - # This corresponds to the hash output and caller-supplied - # hash values. - set -- $(openssl dgst -sha256 ${1}) ${2}; shift $((${#}-2)); - [ "${1}" = "${2}" ] || echo "${1}"; -}; -compare_hash_manifest() { - while [ ${#} -gt 0 ]; do - if ! compare_hash ${1} ${2}; then - log_msg failexit "Error: hash mismatch for patch file \`${1}'."; - fi; shift; - done; return 0; -}; - is_build_script_done() { if [ -n "${ARG_RESTART_SCRIPT_AT}" ]; then if [ "${1}" = clean ]\ @@ -300,7 +119,7 @@ is_build_script_done() { else return 1; # Build fi; - elif [ -f "${WORKDIR}/.${2:-$(get_basename ${SCRIPT_FNAME%.build})}.${1}" ]; then + elif [ -f "${WORKDIR}/.${2:-$(basename ${SCRIPT_FNAME%.build})}.${1}" ]; then return 0; # Skip else return 1; # Build @@ -311,7 +130,7 @@ set_build_script_done() { _sbsd_done_fname=${WORKDIR}/.${_sbsd_script_fname%.build}; while [ $# -ge 1 ]; do if [ "${1#-}" != "${1}" ]; then - rm -f ${_sbsd_done_fname}.${1#-}; + rm -f -- ${_sbsd_done_fname}.${1#-}; else touch ${_sbsd_done_fname}.${1}; log_msg info "Finished build step ${1} of build script \`${_sbsd_script_fname}'."; @@ -362,27 +181,55 @@ match_list() { parse_with_pkg_name() { PKG_LVL=${1}; PKG_NAME=${2}; shift 2; - while [ ${#} -gt 0 ]; do - if [ "${PKG_NAME}" = "${1}" ]; then - export_vars_subst PKG_LVL${PKG_LVL}_ PKG_ ${PKG_BUILD_VARS}; - export_vars_subst PKG_$(echo ${PKG_NAME} | tr a-z A-Z)_ PKG_ ${PKG_BUILD_VARS}; - [ -z "${PKG_URL}" ] && return 1; - [ -z "${PKG_FNAME}" ] && PKG_FNAME=${PKG_URL##*/}; - [ -z "${PKG_SUBDIR}" ] && PKG_SUBDIR=${PKG_FNAME%%.tar*}; - [ -n "${PKG_ENV_VARS_EXTRA}" ] && set_env_vars_with_sep : "${PKG_ENV_VARS_EXTRA}"; - export PKG_PREFIX=$(get_var_unsafe PREFIX_LVL${PKG_LVL}); - for _pwpn_env_var in $(export); do - if [ "${_pwpn_env_var#PKG_}" != "${_pwpn_env_var}" ]; then - _pwpn_env_vars="${_pwpn_env_vars:+${_pwpn_env_vars} }${_pwpn_env_var%%=*}"; - fi; - done; - if [ -n "${_pwpn_env_vars}" ]; then - log_env_vars "build script" ${_pwpn_env_vars}; - fi; unset _pwpn_env_var _pwpn_env_vars; - return 0; - fi; shift; + _pwpn_pkg_NAME=$(echo ${PKG_NAME} | tr a-z A-Z); + if [ -z "$(get_var_unsafe PKG_${_pwpn_pkg_NAME}_URL)" ]; then + unset _pwpn_pkg_NAME; + log_msg failexit "Error: package \`${PKG_NAME}' missing in build.vars."; + else + for _pwpn_vname in ${PKG_BUILD_VARS}; do + if [ -n "$(get_var_unsafe DEFAULT_${_pwpn_vname})" ]; then + export "PKG_${_pwpn_vname}=$(get_var_unsafe DEFAULT_${_pwpn_vname})"; + fi; + if [ -n "$(get_var_unsafe PKG_LVL${PKG_LVL}_${_pwpn_vname})" ]; then + export "PKG_${_pwpn_vname}=$(get_var_unsafe PKG_LVL${PKG_LVL}_${_pwpn_vname})"; + fi; + if [ -n "$(get_var_unsafe PKG_${_pwpn_pkg_NAME}_${_pwpn_vname})" ]; then + export "PKG_${_pwpn_vname}=$(get_var_unsafe PKG_${_pwpn_pkg_NAME}_${_pwpn_vname})"; + fi; + done; unset _pwpn_vname; + fi; + [ -z "${PKG_FNAME}" ] && PKG_FNAME=${PKG_URL##*/}; + [ -z "${PKG_SUBDIR}" ] && PKG_SUBDIR=${PKG_FNAME%%.tar*}; + [ -n "${PKG_ENV_VARS_EXTRA}" ] && set_env_vars_with_sep : "${PKG_ENV_VARS_EXTRA}"; + for _pwpn_env_var in $(export); do + if [ "${_pwpn_env_var#PKG_}" != "${_pwpn_env_var}" ]; then + _pwpn_env_vars="${_pwpn_env_vars:+${_pwpn_env_vars} }${_pwpn_env_var%%=*}"; + fi; done; - log_msg failexit "Error: package \`${PKG_NAME}' missing in \${PKG_BUILD_NAMES}."; + if [ -n "${_pwpn_env_vars}" ]; then + log_env_vars "build script" ${_pwpn_env_vars}; + fi; unset _pwpn_pkg_NAME _pwpn_env_var _pwpn_env_vars; +}; +set_env_vars_with_sep() { + _sevws_sep=${1}; shift; push_IFS ${_sevws_sep}; set -- ${1}; + while [ ${#} -gt 0 ]; do + export "${1}"; shift; + done; unset _sevws_sep; pop_IFS; +}; + +rm_if_exists() { + [ -z "${1#-m}" ] && { _rie_arg_m=1; shift; }; + [ -z "${1#-c}" ] && { _rie_arg_c=1; shift; }; + [ -z "${1}" ] && return 1; + if [ -d ${1} -o -f ${1} ]; then + log_msg warn "Removing directory or file \`${1}'."; + rm -rf -- ${1}; + fi; + [ ${_rie_arg_m:-0} -eq 1 ] && { + log_msg warn "Making directory \`${1}'."; + mkdir -- ${1}; unset _rie_arg_m; }; + [ ${_rie_arg_c:-0} -eq 1 ] && { cd ${1}; unset _rie_arg_c; }; + return 0; }; run_cmd_unsplit() { @@ -396,40 +243,12 @@ run_cmd_unsplit() { unset _rcu_cmd _rcu_cmdline; return ${_rcu_rc}; }; -update_build_status() { - while [ ${#} -gt 0 ]; do - case ${1} in - build_start) - if [ -f "${BUILD_STATUS_IN_PROGRESS_FNAME}" ]; then - log_msg failexit "Error: build already in progress."; - else - touch ${BUILD_STATUS_IN_PROGRESS_FNAME}; - touch ${BUILD_STATUS_PROGRESS_FNAME:=${PREFIX}/BUILD_STARTED_AT_${BUILD_DATE_START:=$(date %Y-%m-%d-%H-%M-%S)}}; - fi; - ;; - build_finish) - if [ -f "${BUILD_STATUS_PROGRESS_FNAME}" ]; then - _ubs_bsp_fname=${BUILD_STATUS_PROGRESS_FNAME}; - unset BUILD_STATUS_PROGRESS_FNAME; - rm -f ${_ubs_bsp_fname}; - unset _ubs_bsp_fname; - fi; - touch ${BUILD_STATUS_FINISHED_AT_FNAME:=${PREFIX}/BUILD_FINISHED_AT_$(date ${TIMESTAMP_FMT_STATUS_FILES})}; - rotate_files BUILD_FINISHED_AT_\* 8; - ln -sf ${BUILD_STATUS_FINISHED_AT_FNAME}\ - ${BUILD_STATUS_FINISHED_AT_CURRENT_FNAME}; ;; - tarball_start) - rotate_files midipix.\*.tar.bz2 8; - touch ${BUILD_STATUS_TARBALL_PROGRESS_FNAME:=${PREFIX}/TARBALL_STARTED_AT_$(date ${TIMESTAMP_FMT_STATUS_FILES})}; - ;; - tarball_finish) - [ -f "${BUILD_STATUS_TARBALL_PROGRESS_FNAME}" ] &&\ - rm -f ${BUILD_STATUS_TARBALL_PROGRESS_FNAME}; ;; - finish) - [ -f "${BUILD_STATUS_IN_PROGRESS_FNAME}" ] &&\ - rm -f ${BUILD_STATUS_IN_PROGRESS_FNAME}; ;; - esac; shift; - done; +set_env_vars() { + _sev_val_new="${1}"; shift; + while [ ${#} -gt 1 ]; do + [ -z "${_sev_val_new}" ] && unset ${1} ||\ + export "${1}=${_sev_val_new}"; shift; + done; unset _sev_val_new; }; # vim:filetype=sh -- cgit v1.2.3