summaryrefslogtreecommitdiffstats
path: root/VDEPENDS
diff options
context:
space:
mode:
Diffstat (limited to 'VDEPENDS')
-rw-r--r--VDEPENDS74
1 files changed, 74 insertions, 0 deletions
diff --git a/VDEPENDS b/VDEPENDS
new file mode 100644
index 0000000000..825856bb12
--- /dev/null
+++ b/VDEPENDS
@@ -0,0 +1,74 @@
+# -*- mode: sh -*-
+# Parse a versioned dependency list from stdin.
+# Takes one dependency per line. Format:
+# spell[subdep...] version... flags:...
+#
+# Example:
+# LANGS="ADA,FORTRAN" LANGFLAGS="--enable-ada --enable-fortran"
+# vdepends << EOF
+# gcc[$LANGS] >= 6.0 < 7.0 flags: $LANGFLAGS
+# binutils[LIBERTY] >= 2.35 flags: --with-liberty
+# EOF
+
+is_version_less() {
+ local v="$1
+$2"
+ [ "$(sort -V <<< "$v")" = "$v" ] && [ "$1" != "$2" ]
+}
+
+vdepends_vercheck() {
+ case "$2" in
+ ('>') is_version_less "$3" "$1" ;;
+ ('>=') ! is_version_less "$1" "$3" ;;
+ ('<') is_version_less "$1" "$3" ;;
+ ('<=') ! is_version_less "$3" "$1" ;;
+ ('=') [ "x$1" = "x$3" ] ;;
+ ('!=') [ "x$1" != "x$3" ] ;;
+ (*) message vdepends: \
+ "${PROBLEM_COLOR}Unsupported operator \"$2\".$DEFAULT_COLOR"
+ return 1
+ ;;
+ esac
+}
+
+vdepends() {
+ local dep features flags rest
+ local op depver iver gver
+ while read dep rest; do
+ case "$dep" in
+ (\#*) # comment line
+ continue
+ ;;
+ (*\]) # subdependencies; split them
+ features="${dep#*[}"
+ dep="${dep%[*}"
+ features="${features%]}"
+ features="${features//,/ }"
+ ;;
+ esac
+ # split configuration flags
+ rest=" $rest"
+ case "$rest" in
+ (*\ flags:*)
+ flags="${rest#* flags:}"
+ rest="${rest% flags:*}"
+ ;;
+ esac
+ depends -sub "$features" "$dep" "$flags" || return
+ # remove whitespace
+ read rest <<< "$rest"
+ # parse and check versions
+ iver="$(spell_ok "$dep" && installed_version "$dep")"
+ gver="$(codex_set_current_spell "$dep" && echo "$VERSION")"
+ while [ -n "$rest" ] && read op depver rest <<< "$rest"; do
+ [ -n "$iver" ] && vdepends_vercheck "$iver" "$op" "$depver" && continue
+ if [ "$gver" = "$iver" ] || ! vdepends_vercheck "$gver" "$op" "$depver"
+ then
+ message "${PROBLEM_COLOR}Unsatisfied dependency:$DEFAULT_COLOR" \
+ "$dep $gver $op $depver"
+ return 1
+ fi
+ force_depends "$dep"
+ done
+ done
+}