diff options
Diffstat (limited to 'VDEPENDS')
-rw-r--r-- | VDEPENDS | 74 |
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 +} |