aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Trofimovich <slyfox@gentoo.org>2020-01-12 15:51:47 +0000
committerSergei Trofimovich <slyfox@gentoo.org>2020-01-12 16:05:39 +0000
commitbc80e12ab133a00ece4059df40d672889fcf6bf0 (patch)
treeb00a82f3afbdfbffbd6d15467f21297d70d0bdbb
parentgcc-config: consolidate profiles sourcing logic in a single function (diff)
downloadgcc-config-bc80e12ab133a00ece4059df40d672889fcf6bf0.tar.gz
gcc-config-bc80e12ab133a00ece4059df40d672889fcf6bf0.tar.bz2
gcc-config-bc80e12ab133a00ece4059df40d672889fcf6bf0.zip
gcc-config: add basic version sorting supportv2.2
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 <slyfox@gentoo.org>
-rwxr-xr-xgcc-config26
-rw-r--r--tests/multi-configs/etc/env.d/gcc/x86_64-pc-linux-gnu-10.0.09
-rw-r--r--tests/multi-configs/etc/env.d/gcc/x86_64-pc-linux-gnu-11.0.0-pre99998
-rw-r--r--tests/multi-configs/test.list.exp2
4 files changed, 42 insertions, 3 deletions
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 <CHOST>
+# 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 <var> <file> [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