From bc80e12ab133a00ece4059df40d672889fcf6bf0 Mon Sep 17 00:00:00 2001 From: Sergei Trofimovich Date: Sun, 12 Jan 2020 15:51:47 +0000 Subject: gcc-config: add basic version sorting support Before the change gcc version orderig was relying on bash sorting in flob matches, like: cat /etc/env.d/gcc/${CHOST}-* | fgrep LDPATH | tail -n 1 This stopped working with gcc-10, which lexicographically goes before gcc-9. The workaround for now is to normalizeversions to fixed-width and order them lexicographically: gcc-0009 gcc-0010 Signed-off-by: Sergei Trofimovich --- gcc-config | 26 +++++++++++++++++++--- .../etc/env.d/gcc/x86_64-pc-linux-gnu-10.0.0 | 9 ++++++++ .../env.d/gcc/x86_64-pc-linux-gnu-11.0.0-pre9999 | 8 +++++++ tests/multi-configs/test.list.exp | 2 ++ 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 tests/multi-configs/etc/env.d/gcc/x86_64-pc-linux-gnu-10.0.0 create mode 100644 tests/multi-configs/etc/env.d/gcc/x86_64-pc-linux-gnu-11.0.0-pre9999 diff --git a/gcc-config b/gcc-config index dd11c71..1ab646b 100755 --- a/gcc-config +++ b/gcc-config @@ -68,6 +68,25 @@ usage() { } [[ $# -lt 1 ]] && usage 1 +# Usage: version_sorted_paths +# Returns paths ordered by version from olders to newest. +# We use the following hack: assume the input containst digits only in places of versions +# Normalizer: +# echo "hello-world-1.2.3.444.56778" | ${SED} -e 's/[0-9]\+/0000&/g' | ${SED} -e 's/0*\([0-9]\{4\}\)/\1/g' +# hello-world-0001.0002.0003.0444.56778 +# That way we can have 9.0 < 10.0 roder. +version_sorted_paths() { + local p mangled_v + for p in "$@"; do + # TODO: avoid -r + mangled_v=$(printf "%s" "${p}" | + ${SED} -e 's/[0-9]\+/0000&/g' | + ${SED} -e 's/0*\([0-9]\{4\}\)/\1/g' + ) + printf "%s %s\n" "${mangled_v}" "${p}" + done | LANG=C sort | $SED -e 's/^.* //g' +} + # Usage: source_var [default value] source_var() { unset $1 @@ -319,7 +338,7 @@ handle_split_usr() { # We use the same ordering logic as mentioned in the MY_LDPATH setup. # We get the libs from the latest version available. local LDPATH - eval $(grep -h '^LDPATH=' "${GCC_ENV_D}"/${CHOST}-* | tail -1) + eval $(grep -h '^LDPATH=' $(version_sorted_paths "${GCC_ENV_D}"/${CHOST}-*) | tail -1) LDPATH=${LDPATH%%:*} # If GCC directory is not in separate mountpoint than /lib, @@ -538,6 +557,7 @@ prefix_copy_gcc_libs() { rmdir "${sourcedir}" } + # We don't rely on iteration order here. local GCC_PROFILES=$(LC_ALL="C" ls ${GCC_ENV_D}/${CHOST}-*) local targetdirs= GCC_PATH= LDPATH= @@ -655,7 +675,7 @@ switch_profile() { local MY_LDPATH MY_LDPATH=$(${SED} -n \ -e '/^LDPATH=/{s|LDPATH=||;s|"||g;s|:|\n|g;p}' \ - "${GCC_ENV_D}"/${CHOST}-* | tac + $(version_sorted_paths "${GCC_ENV_D}"/${CHOST}-*) | tac ) # Pass all by default @@ -797,7 +817,7 @@ list_profiles() { source_var CURRENT "${GCC_ENV_D}"/config-${CTARGET} CURRENT_NATIVE=${CURRENT} local target= - for x in "${GCC_ENV_D}"/* ; do + for x in $(version_sorted_paths "${GCC_ENV_D}"/*) ; do [[ -f ${x} ]] || continue [[ ${x} == */config* ]] && continue diff --git a/tests/multi-configs/etc/env.d/gcc/x86_64-pc-linux-gnu-10.0.0 b/tests/multi-configs/etc/env.d/gcc/x86_64-pc-linux-gnu-10.0.0 new file mode 100644 index 0000000..c863019 --- /dev/null +++ b/tests/multi-configs/etc/env.d/gcc/x86_64-pc-linux-gnu-10.0.0 @@ -0,0 +1,9 @@ +GCC_PATH="/usr/x86_64-pc-linux-gnu/gcc-bin/10.0.0" +LDPATH="/usr/lib/gcc/x86_64-pc-linux-gnu/10.0.0:/usr/lib/gcc/x86_64-pc-linux-gnu/10.0.0/32" +MANPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/10.0.0/man" +INFOPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/10.0.0/info" +STDCXX_INCDIR="g++-v10" +CTARGET="x86_64-pc-linux-gnu" +GCC_SPECS="" +MULTIOSDIRS="../lib64:../lib" + diff --git a/tests/multi-configs/etc/env.d/gcc/x86_64-pc-linux-gnu-11.0.0-pre9999 b/tests/multi-configs/etc/env.d/gcc/x86_64-pc-linux-gnu-11.0.0-pre9999 new file mode 100644 index 0000000..1654050 --- /dev/null +++ b/tests/multi-configs/etc/env.d/gcc/x86_64-pc-linux-gnu-11.0.0-pre9999 @@ -0,0 +1,8 @@ +GCC_PATH="/usr/x86_64-pc-linux-gnu/gcc-bin/11.0.0-pre9999" +LDPATH="/usr/lib/gcc/x86_64-pc-linux-gnu/11.0.0-pre9999:/usr/lib/gcc/x86_64-pc-linux-gnu/11.0.0-pre9999/32" +MANPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/11.0.0-pre9999/man" +INFOPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/11.0.0-pre9999/info" +STDCXX_INCDIR="g++-v10" +CTARGET="x86_64-pc-linux-gnu" +GCC_SPECS="" +MULTIOSDIRS="../lib64:../lib" diff --git a/tests/multi-configs/test.list.exp b/tests/multi-configs/test.list.exp index 18640e1..5e8db88 100644 --- a/tests/multi-configs/test.list.exp +++ b/tests/multi-configs/test.list.exp @@ -8,3 +8,5 @@ Using gcc-config info in @ROOT@/ [4] x86_64-pc-linux-gnu-4.6.0 [5] x86_64-pc-linux-gnu-4.6.1 [6] x86_64-pc-linux-gnu-4.6.2 * + [7] x86_64-pc-linux-gnu-10.0.0 + [8] x86_64-pc-linux-gnu-11.0.0-pre9999 -- cgit v1.2.3-65-gdbad