diff --git a/bin/dunemodules.inc b/bin/dunemodules.inc index 5613b8e4a008071f822efada4bfec45046e9f80b..8dba379bbb46e687dc3349daa4562d99e202c65e 100644 --- a/bin/dunemodules.inc +++ b/bin/dunemodules.inc @@ -8,6 +8,9 @@ # name of the "control" files CONTROL="dune.module" +# pattern needed to parse the Suggests and Depnds entries +PARSE_SUGDEP_PATTERN='^ *\([^ ^:]\{1,\}\) *\(([^)]*)\)\{0,1\},\{0,1\} *\(.*\)$' + ############################################### ### ### check for environment variables @@ -167,18 +170,30 @@ sort_modules() { sort_dependencies() { # reset list export SORTEDMODULES="" + local deps="" + local name="" + local dep="" + local ver="" + local xdeps="" # handle each modules passed as parameter for m in "$@"; do # did we find a module file for this mopdule? if test "x$(eval echo \$HAVE_$m)" != "x"; then - if test "x$(eval echo \$DEPS_$m)" != "x" ; then - for name in $(eval echo \$DEPS_$m); do - dep=$(fix_variable_name $name) - _sort_module $dep - done - fi + eval deps=\$DEPS_$m + while test -n "$deps"; do + PATTERN=$PARSE_SUGDEP_PATTERN + name=`echo $deps | sed -e "s/$PATTERN/\1/"` + xdeps=`echo $deps | sed -e "s/$PATTERN/\3/"` + if test "$deps" = "$xdeps"; then + eval echo ERROR: parsing dependency string \$DEPS_$m >&2 + exit 1 + fi + deps=$xdeps + dep=`fix_variable_name $name` + _sort_module $dep + done else - echo "ERROR: could not find module $(eval echo \$NAME_$m)" >&2 + eval echo ERROR: could not find module \$NAME_$m >&2 exit 1 fi done @@ -246,6 +261,14 @@ sort_suggestions() { # _sort_module() { local module="$1" + local modname="" + eval modname=\$NAME_$module + local deps="" + local name="" + local dep="" + local ver="" + local depver="" + local xdeps="" shift 1 if ! check_modname $module; then echo "ERROR: invalid module name $module" >&2 @@ -253,22 +276,39 @@ _sort_module() { fi if test "x$(eval echo \$SORT_DONE_${module})" != "xyes"; then # resolve dependencies - for name in $(eval "echo \$DEPS_$module"); do + eval deps=\$DEPS_$module + while test -n "$deps"; do + PATTERN=$PARSE_SUGDEP_PATTERN + name=`echo $deps | sed -e "s/$PATTERN/\1/"` + depver=`echo $deps | sed -e "s/$PATTERN/\2/" -e 's/[()]//g'` + xdeps=`echo $deps | sed -e "s/$PATTERN/\3/"` + if test "$deps" = "$xdeps"; then + echo "ERROR: parsing dependencies for $modname" >&2 + exit 1 + fi + deps="$xdeps" dep=$(fix_variable_name $name) if ! check_modname $dep; then echo "ERROR: invalid module name $name" >&2 exit 1 fi if test "x$(eval echo \$HAVE_$dep)" != "x"; then + eval ver=\$VERS_$dep + if ! check_version "$ver" "$depver"; then + echo "ERROR: version mismatch." >&2 + echo " $modname requires $name $depver," >&2 + echo " but only $name = $ver available." >&2 + exit 1 + fi _sort_module $dep else # perhaps this module is installed, # then it should be handled via pkg-config if ! pkg-config $name; then - echo "ERROR: could not find module $(eval echo \$NAME_$dep)" >&2 - echo " module is also unknown to pkg-config" >&2 + echo "ERROR: could not find module $name," >&2 + echo " module is also unknown to pkg-config." >&2 echo " Maybe you need to adjust PKG_CONFIG_PATH!" >&2 - echo " $(eval echo \$NAME_$dep) is required by $(eval echo \$NAME_$module)" >&2 + echo " $name is required by $modname" >&2 exit 1 fi fi @@ -414,6 +454,9 @@ compare_sub_version() { } check_version() { + if test -z "$2"; then # if no constraint is given, check_version is true + return 0 + fi local v=$1 local PATTERN="^ *\([<>=]*\) *\([0-9.]*\)\(.*\)$" if test x != `echo "$2" | sed -e "s/$PATTERN/x/"`; then @@ -448,4 +491,4 @@ check_version() { return 0 fi return 1 -} \ No newline at end of file +} diff --git a/bin/test-version-compare b/bin/test-version-compare index b381f35a0559ea4d6ac3fe7017da52b252b98d9e..a23bf2b6b3c04787e15ef953b141f06f3fa0f2db 100755 --- a/bin/test-version-compare +++ b/bin/test-version-compare @@ -1,5 +1,7 @@ #!/bin/bash +set -e + ############################################### ### ### read lib @@ -100,3 +102,33 @@ test_version_check "1.2.3" "> 1.2" test_version_check "1.2.3" "= 1.2" test_version_check "1.2.3" "< 1.2" +check_pattern() +{ + PATTERN=$PARSE_SUGDEP_PATTERN +} + +parse_version() +{ + local deps="$1" + local name="" + local dep="" + local xdeps="" + echo start: $deps + while test -n "$deps"; do + PATTERN=$PARSE_SUGDEP_PATTERN + name=`echo $deps | sed -e "s/$PATTERN/\1/"` + ver=`echo $deps | sed -e "s/$PATTERN/\2/" -e 's/[()]//g'` + xdeps=`echo $deps | sed -e "s/$PATTERN/\3/"` + if test "$deps" = "$xdeps"; then + echo Error parsing dependency string \"$1\" + exit 1 + fi + deps=$xdeps + echo $name version $ver ... $deps + done + echo done +} + +parse_version "dune-common (>= 1.2), dune-istl (<999)" +parse_version "alf (12) bart()c" +parse_version "a b () c"