# 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 # . [ "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 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 elif [ "x${host_arch}" != 'xall' ]; then 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 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 elif [ "x${host_plat}" != 'xall' ]; then seen_plat=0 fi elif match_plat "${host_plat}" "${plat}"; then seen_plat=0 break fi done return ${seen_plat} fi }