From 9429b5475c3e0ef15a98b22ea6fddb59dd2af385 Mon Sep 17 00:00:00 2001 From: LucĂ­a Andrea Illanes Albornoz Date: Apr 25 2024 18:07:01 +0000 Subject: Always check all packages' deps for unknown packages. --- diff --git a/etc/build.msgs.en b/etc/build.msgs.en index ddacb97..529d1bd 100644 --- a/etc/build.msgs.en +++ b/etc/build.msgs.en @@ -13,6 +13,7 @@ MSG_build_reset_pkg_state="1;Reset package state for: %s"; MSG_build_resolved_deps="1;Resolved \`%s' dependencies."; MSG_build_resolving_deps="1;Resolving \`%s' dependencies..."; MSG_build_unknown_dep="2;Error: dependency \`%s' of \`%s' unknown."; +MSG_build_unknown_deps="0;Error: packages with unknown dependencies."; MSG_group_begin="4;[%3d%% ] [%03d/%03d] Starting \`%s' build group..."; MSG_group_finish="4;[%3d%% ] [%03d/%03d] Finished \`%s' build group."; diff --git a/subr.ex/ex_pkg.subr b/subr.ex/ex_pkg.subr index 97d5ea0..a14ac21 100644 --- a/subr.ex/ex_pkg.subr +++ b/subr.ex/ex_pkg.subr @@ -39,6 +39,34 @@ ex_pkg_check_depends() { }; # +# ex_pkg_check_depends_unknown() - check single named package for unknown dependencies +# @_pkg_name: single package name +# @_rpkg_names_set: in reference to variable of set of package names +# @_rpkg_unknown: out reference to variable of list of finished packages +# +# Returns: zero (0) given no unknown dependencies, non-zero (>0) otherwise +# +ex_pkg_check_depends_unknown() { + local _epcdu_pkg_name="${1}" _epcdu_rpkg_names_set="${2#\$}" \ + _epcdu_rpkg_unknown="${3#\$}" \ + _epcdu_defined=0 _epcdu_depends="" _epcdu_pkg_name_depend="" \ + _epcdu_rc=0; + + if rtl_get_var_unsafe \$_epcdu_depends -u "PKG_"${_epcdu_pkg_name}"_DEPENDS"\ + && [ "${_epcdu_depends:+1}" = 1 ]; then + for _epcdu_pkg_name_depend in ${_epcdu_depends}; do + if ! rtl_get_var_unsafe \$_epcdu_defined "${_epcdu_rpkg_names_set}_${_epcdu_pkg_name_depend}"\ + || [ "${_epcdu_defined:-0}" -eq 0 ]; then + rtl_lconcat "${_epcdu_rpkg_unknown}" "${_epcdu_pkg_name_depend}"; + _epcdu_rc=1; + fi; + done; + fi; + + return "${_epcdu_rc}"; +}; + +# # ex_pkg_copy_group_vars() - copy build group variables into build group # @_group_name_src: single source build group name # @_group_name_dst: single destination build group name @@ -372,8 +400,9 @@ ex_pkg_unfold_depends() { _epud_checkfl="${4}" _epud_forcefl="${5}" _epud_group_name="${6}" \ _epud_pkg_names="${7}" _epud_restart="${8}" _epud_test_finished="${9}" \ _epud_workdir="${10}" \ - _epud_pkg_disabled="" _epud_pkg_force="" _epud_pkg_name="" \ - _epud_pkg_names_new="" _epud_restartfl=0; + _epud_depends="" _epud_pkg_disabled="" _epud_pkg_force="" _epud_pkg_name="" \ + _epud_pkg_name_depend="" _epud_pkg_names_new="" _epud_pkg_names_set="" \ + _epud_pkg_unknown="" _epud_restartfl=0 _epud_unknown_depends=0; if [ "${_epud_restart:+1}" = 1 ]\ && ! rtl_lmatch \$_epud_restart "ALL LAST"; then @@ -385,7 +414,19 @@ ex_pkg_unfold_depends() { _epud_pkg_names="$(rtl_uniq ${_epud_pkg_names})"; fi; + rtl_llift_set \$_epud_pkg_names \$_epud_pkg_names_set; for _epud_pkg_name in ${_epud_pkg_names}; do + if rtl_get_var_unsafe \$_epud_depends -u "PKG_"${_epud_pkg_name}"_DEPENDS"\ + && [ "${_epud_depends:+1}" = 1 ]; then + _epud_pkg_unknown=""; + if ! ex_pkg_check_depends_unknown "${_epud_pkg_name}" \$_epud_pkg_names_set \$_epud_pkg_unknown; then + for _epud_pkg_name_depend in ${_epud_pkg_unknown}; do + rtl_log_msgV "fatal" "${MSG_build_unknown_dep}" "${_epud_pkg_name_depend}" "${_epud_pkg_name}"; + done; + _epud_unknown_depends=1; + fi; + fi; + if [ "${_epud_restart}" = "ALL" ]\ || rtl_lmatch \$_epud_restart "${_epud_pkg_name}"; then _epud_restartfl=1; @@ -411,6 +452,11 @@ ex_pkg_unfold_depends() { rtl_lconcat \$_epud_pkg_names_new "${_epud_pkg_name}"; fi; done; + rtl_llift_unset \$_epud_pkg_names_set; + + if [ "${_epud_unknown_depends}" -eq 1 ]; then + rtl_log_msgV "fatalexit" "${MSG_build_unknown_deps}"; + fi; eval ${_epud_rdisabled}='$(rtl_uniq2 "${_epud_rdisabled}")'; eval ${_epud_rfinished}='$(rtl_uniq2 "${_epud_rfinished}")'; diff --git a/subr.rtl/rtl_list.subr b/subr.rtl/rtl_list.subr index 36bc77e..0ec5366 100644 --- a/subr.rtl/rtl_list.subr +++ b/subr.rtl/rtl_list.subr @@ -222,6 +222,54 @@ rtl_llift2() { }; # +# rtl_llift_set() - convert list w/ separator to set +# @_rlist: in reference to list +# @_rset_new: out reference to new set +# @_sep: single non-zero, possibly multi-character, separator +# +# Notate bene: all list items in @_rlist must form valid shell parameter name substrings; +# no list item must be named "__000000__" +# Returns: zero (0) on success, non-zero (>0) on failure +# +rtl_llift_set() { + local _rls3_rlist="${1#\$}" _rls3_rset_new="${2#\$}" _rls3_sep="${3:-}" \ + _rls3_litem=""; + + if [ "${_rls3_sep:+1}" = 1 ]; then + local IFS="${_rls3_sep}"; + else + local _rls3_sep=" " IFS="${RTL_IFS_ORIG}"; + fi; + + eval set -- '${'"${_rls3_rlist}"'}'; + eval "${_rls3_rset_new}___000000__=\${${_rls3_rlist}}"; + for _rls3_litem in "${@}"; do + eval "${_rls3_rset_new}_${_rls3_litem}=1"; + done; + return 0; +}; + +# +# rtl_llift_unset() - unset set previously created w/ rtl_llift_set() +# @_rset: in reference to set +# +# Returns: zero (0) on success, non-zero (>0) on failure +# +rtl_llift_unset() { + local _rlu_rset="${1#\$}" \ + _rlu_index="" _rlu_item=""; + + if rtl_get_var_unsafe \$_rlu_index "${_rlu_rset}___000000__"; then + for _rlu_item in ${_rlu_index}; do + unset "${_rlu_rset}_${_rlu_item}"; + done; + unset "${_rlu_rset}___000000__"; + fi; + + return 0; +}; + +# # rtl_lmatch() - check if item(s) in list # @_rlist: in reference to list # @_item: item(s) to search for