diff options
-rw-r--r-- | lib/deps.sh | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/lib/deps.sh b/lib/deps.sh new file mode 100644 index 0000000..49d3cb2 --- /dev/null +++ b/lib/deps.sh @@ -0,0 +1,185 @@ +# opkbuild +# lib/deps +# Functions for parsing dependency field values. +# +# Copyright (C) 2012 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +[ -n "${_OB_DEPS_SM}" ] && return 0 +_OB_DEPS_SM='true' + +ob_parse_dep() +{ + _obpd_opt= + _obpd_pkg_var= + _obpd_archqual_var= + _obpd_rel_var= + _obpd_ver_var= + _obpd_arches_var= + _obpd_host_arch= + _obpd_dep= + _obpd_pkgarchqual= + _obpd_relver= + _obpd_arches= + + while getopts 'p:q:r:v:A:a:' _obpd_opt; do + case "${_obpd_opt}" in + p) + _obpd_pkg_var="${OPTARG}" + ;; + q) + _obpd_archqual_var="${OPTARG}" + ;; + r) + _obpd_rel_var="${OPTARG}" + ;; + v) + _obpd_ver_var="${OPTARG}" + ;; + A) + _obpd_arches_var="${OPTARG}" + ;; + a) + _obpd_host_arch="${OPTARG}" + ;; + ?) + #unset + return 125 + ;; + esac + done + shift $(($OPTIND - 1)) + + if [ "${#}" -eq 1 ]; then + # Separate components with spaces. + _obpd_dep="$(echo "${1}" | \ + sed 's/\([(\[]\)/ \1/g;s/\([<>=][<>=]*\)/\1 /g')" + # Remove leading, trailing, and duplicate spaces. + _obpd_dep="$(IFS=' ' echo ${_obpd_dep})" + else + #unset + return 125 + fi + + # <pkg>[:<archqual>] [(<rel> <ver>)] [\[<arches>\]] + + _obpd_pkgarchqual="${_obpd_dep%% *}" + _obpd_dep=" ${_obpd_dep#* }" + if [ -n "${_obpd_pkg_var}" ]; then + eval "${_obpd_pkg_var}=${_obpd_pkgarchqual%:*}" + fi + if [ -n "${_obpd_archqual_var}" ]; then + eval "${_obpd_archqual_var}=${_obpd_pkgarchqual##*:}" + fi + + if [ "${_obpd_dep# (*)}" != "${_obpd_dep}" ]; then + _obpd_relver="${_obpd_dep# (}" + _obpd_relver="${_obpd_relver%%)*}" + _obpd_dep="${_obpd_dep#(*)}" + if [ -n "${_obpd_rel_var}" ]; then + eval "${_obpd_rel_var}=${_obpd_relver% *}" + fi + if [ -n "${_obpd_ver_var}" ]; then + eval "${_obpd_ver_var}=${_obpd_relver##* }" + fi + fi + + if [ "${_obpd_dep# \[*\]}" != "${_obpd_dep}" ]; then + _obpd_arches="${_obpd_dep# \[}" + _obpd_arches="${_obpd_arches%%\]*}" + # TODO: Reduce arch is host arch is given. + if [ -n "${_obpd_arches_var}" ]; then + eval "${_obpd_arches_var}=${_obpd_arches}" + fi + fi + + return 0 +} + +ob_reduce_deps() +{ + _obrd_opt= + _obrd_host_arch= + _obrd_union=false + _obrd_deps= + _obrd_orig_ifs= + _obrd_dep_and= + _obrd_dep_or= + + while getopts 'a:u' _obrd_opt; do + case "${_obrd_opt}" in + a) + _obrd_host_arch="${OPTARG}" + ;; + u) + _obrd_union=true + ;; + ?) + #unset + return 125 + ;; + esac + done + shift $(($OPTIND - 1)) + + if [ "${#}" -eq 1 ]; then + _obrd_deps="${1}" + else + #unset + return 125 + fi + + _obrd_orig_ifs="${IFS}" + IFS=', ' + for _obrd_dep_and in ${_obrd_deps}; do + if ! ${_obrd_union}; then + IFS='| ' + for _obrd_dep_or in ${_obrd_deps}; do + : + done + else + : + fi + done + + return 0 +} + +_ob_dep_arch_is_concerned() +{ + _obdaic_host_arch="${1}" + _obdaic_arches="${2}" + _obdaic_arch= + _obdaic_not_arch= + _obdaic_seen_arch=1 + + for _obdaic_arch in ${_obdaic_arches}; do + _obdaic_not_arch="${_obdaic_arch#!}" + if [ "${_obdaic_not_arch}" != "${_obdaic_arch}" ]; then + if ob_match_arch "${_obdaic_host_arch}" "${_obdaic_not_arch}"; then + _obdaic_seen_arch=1 + break + else + _obdaic_seen_arch=0 + fi + elif ob_match_arch "${_obdaic_host_arch}" "${_obdaic_arch}"; then + _obdaic_seen_arch=0 + break + fi + done + + unset _obdaic_host_arch _obdaic_arches _obdaic_arch _obdaic_not_arch + return ${_obdaic_seen_arch} +} |