#! /bin/sh # Script to generate SYSROOT_SUFFIX_SPEC equivalent to MULTILIB_OSDIRNAMES # Arguments are MULTILIB_OSDIRNAMES, MULTILIB_OPTIONS, MULTILIB_MATCHES, # and MULTILIB_REUSE. # Copyright (C) 2009-2022 Free Software Foundation, Inc. # This file is part of GCC. # GCC is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free # Software Foundation; either version 3, or (at your option) any later # version. # GCC is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # You should have received a copy of the GNU General Public License # along with GCC; see the file COPYING3. If not see # . # This shell script produces a header file fragment that defines # SYSROOT_SUFFIX_SPEC. It assumes that the sysroots will have the same # structure and names used by the multilibs. # Invocation: # print-sysroot-suffix.sh \ # MULTILIB_OSDIRNAMES \ # MULTILIB_OPTIONS \ # MULTILIB_MATCHES \ # MULTILIB_REUSE # > t-sysroot-suffix.h # The four options exactly correspond to the variables of the same # names defined in the t-sysroot-suffix tmake_file fragment. # Example: # sh ./gcc/config/print-sysroot-suffix.sh "a=A" "a b/c/d" "" # => # #undef SYSROOT_SUFFIX_SPEC # #define SYSROOT_SUFFIX_SPEC "" \ # "%{a:" \ # "%{b:A/b/;" \ # "c:A/c/;" \ # "d:A/d/;" \ # ":A/};" \ # ":}" # The script uses temporary subscripts in order to permit a recursive # algorithm without the use of functions. set -e dirnames="$1" options="$2" matches="$3" reuse="$4" cat > print-sysroot-suffix3.sh <<\EOF #! /bin/sh # Print all the multilib matches for this option result="$1" EOF for x in $matches; do l=`echo $x | sed -e 's/=.*$//' -e 's/?/=/g'` r=`echo $x | sed -e 's/^.*=//' -e 's/?/=/g'` echo "[ \"\$1\" = \"$l\" ] && result=\"\$result|$r\"" >> print-sysroot-suffix3.sh done echo 'echo $result' >> print-sysroot-suffix3.sh chmod +x print-sysroot-suffix3.sh cat > print-sysroot-suffix2.sh <<\EOF #! /bin/sh # Recursive script to enumerate all multilib combinations, match against # multilib directories and output a spec string of the result. # Will fold identical trees. padding="$1" optstring="$2" shift 2 n="\" \\ $padding\"" if [ $# = 0 ]; then case $optstring in EOF for x in $reuse; do l=`echo $x | sed -e 's/=.*$//' -e 's/\./=/g'` r=`echo $x | sed -e 's/^.*=//' -e 's/\./=/g'` echo "/$r/) optstring=\"/$l/\" ;;" >> print-sysroot-suffix2.sh done echo " esac" >> print-sysroot-suffix2.sh pat= for x in $dirnames; do p=`echo $x | sed -e 's,=!,/$=/,'` pat="$pat -e 's=^//$p='" done echo ' optstring=`echo "/$optstring" | sed '"$pat\`" >> print-sysroot-suffix2.sh cat >> print-sysroot-suffix2.sh <<\EOF case $optstring in //*) ;; *) echo "$optstring" ;; esac else thisopt="$1" shift bit= lastcond= result= for x in `echo "$thisopt" | sed -e 's,/, ,g'`; do case $x in EOF for x in `echo "$options" | sed -e 's,/, ,g'`; do match=`./print-sysroot-suffix3.sh "$x"` echo "$x) optmatch=\"$match\" ;;" >> print-sysroot-suffix2.sh done cat >> print-sysroot-suffix2.sh <<\EOF esac bit=`"$0" "$padding " "$optstring$x/" "$@"` if [ -z "$lastopt" ]; then lastopt="$optmatch" else if [ "$lastbit" = "$bit" ]; then lastopt="$lastopt|$optmatch" else result="$result$lastopt:$lastbit;$n" lastopt="$optmatch" fi fi lastbit="$bit" done bit=`"$0" "$padding " "$optstring" "$@"` if [ "$bit" = "$lastbit" ]; then if [ -z "$result" ]; then echo "$bit" else echo "$n%{$result:$bit}" fi else echo "$n%{$result$lastopt:$lastbit;$n:$bit}" fi fi EOF chmod +x ./print-sysroot-suffix2.sh result=`./print-sysroot-suffix2.sh "" "/" $options` echo "#undef SYSROOT_SUFFIX_SPEC" echo "#define SYSROOT_SUFFIX_SPEC \"$result\"" rm print-sysroot-suffix2.sh rm print-sysroot-suffix3.sh