diff options
Diffstat (limited to 'lib/archplat.sh')
-rw-r--r-- | lib/archplat.sh | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/lib/archplat.sh b/lib/archplat.sh new file mode 100644 index 0000000..7100568 --- /dev/null +++ b/lib/archplat.sh @@ -0,0 +1,159 @@ +# Functions for matching architectures and platforms +# +# Copyright (C) 2012 Patrick "P. J." McDermott +# +# This file is part of the ProteanOS Development Kit. +# +# The ProteanOS Development Kit 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. +# +# The ProteanOS Development Kit 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 the ProteanOS Development Kit. If not, see +# <http://www.gnu.org/licenses/>. + +[ "x${_ARCHPLAT_SM+set}" = 'xset' ] && return 0 +_ARCHPLAT_SM=1 + +match_arch() +{ + local arch="${1}" + local arch_field="${2}" + local a= + local a_ere= + + for a in ${arch_field}; do + + # "all" == "all" + if [ "${arch}" = 'all' ]; then + if [ "${a}" = 'all' ]; then + return 0 + else + continue + fi + fi + + # "foo-bar-baz" == "any" + if [ "${a}" = 'any' ]; then + return 0 + fi + + # Generate an ERE to match hyphenated architectures. + a_ere="$(printf '%s\n' "${a}" | sed \ + 's/^any-/[^-]+-/;s/-any-/-[^-]+-/g;s/-any$/-[^-]+/g')" + + # "foo-bar-baz" == "foo-any-any" + if echo "${arch}" | grep -E "${a_ere}" >/dev/null 2>&1; then + return 0 + fi + + done + + # Nothing matched. + return 1 +} + +match_plat() +{ + local plat="${1}" + local plat_field="${2}" + local p= + + for p in ${plat_field}; do + if [ "x${plat}" = 'xall' ]; then + if [ "x${p}" = 'xall' ]; then + return 0 + else + continue + fi + fi + if [ "x${p}" = 'xany' ]; then + return 0 + fi + if [ "x${p}" = "x${plat}" ]; then + return 0 + fi + done + + return 1 +} + +arch_is_concerned() +{ + local host_arch="${1}" + local arches="${2}" + local arch= + local not_arch= + local seen_arch= + + if [ "x${arches}" = 'x' ]; then + return 0 + elif [ "x${host_arch}" = 'xall' ]; then + if [ "x${arches}" = 'xall' ]; then + return 0 + else + return 1 + fi + else + seen_arch=1 + for arch in ${arches}; do + not_arch="${arch#!}" + if [ "x${not_arch}" != "x${arch}" ]; then + if match_arch "${host_arch}" "${not_arch}" + then + seen_arch=1 + break + else + seen_arch=0 + fi + elif match_arch "${host_arch}" "${arch}"; then + seen_arch=0 + break + fi + done + return ${seen_arch} + fi +} + +plat_is_concerned() +{ + local host_plat="${1}" + local plats="${2}" + local plat= + local not_plat= + local seen_plat= + + if [ "x${plats}" = 'x' ]; then + return 0 + elif [ "x${host_plat}" = 'xall' ]; then + if [ "x${plats}" = 'xall' ]; then + return 0 + else + return 1 + fi + else + seen_plat=1 + for plat in ${plats}; do + not_plat="${plat#!}" + if [ "x${not_plat}" != "x${plat}" ]; then + if match_plat "${host_plat}" "${not_plat}" + then + seen_plat=1 + break + else + seen_plat=0 + fi + elif match_plat "${host_plat}" "${plat}"; then + seen_plat=0 + break + fi + done + return ${seen_plat} + fi +} |