diff options
author | Ismael Luceno | 2021-02-13 18:35:48 +0100 |
---|---|---|
committer | Ismael Luceno | 2021-02-13 19:02:43 +0100 |
commit | 217f1108f14e135085ccaa9a85fe3596514e85b5 (patch) | |
tree | ab44e7be8fd5b53d6668263de149f00245b5d045 /VDEPENDS | |
parent | d523cfc301c17731bde576b86a0cea5f30dcade2 (diff) |
Add improved vdepends implementation
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
This changes the format and adds support for:
- chained comparisons
- sub-dependencies
- comment lines
Now the check is done against the grimoire version of the spell too, to
avoid casting a spell that can't satisfy the dependency.
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 +} |