summaryrefslogtreecommitdiffstats
path: root/lib/archplat.sh
diff options
context:
space:
mode:
Diffstat (limited to 'lib/archplat.sh')
-rw-r--r--lib/archplat.sh159
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
+}