X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgenmultilib;h=660639ef364f06c249ae77418c5357f9e8d4b7c1;hb=7c568de5f7d7fb8852c9d1808236f2a8c2d45ecd;hp=c687537d70046e7d094e3281c85a87c127d3be2c;hpb=c954ff02f308a7c03628c9c7882c21b0fd032c67;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/genmultilib b/gcc/genmultilib index c687537d700..660639ef364 100644 --- a/gcc/genmultilib +++ b/gcc/genmultilib @@ -1,6 +1,6 @@ #!/bin/sh # Generates multilib.h. -# Copyright (C) 1994, 1995, 1996, 1997, 1999 Free Software Foundation, Inc. +# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2002 Free Software Foundation, Inc. #This file is part of GCC. @@ -16,8 +16,8 @@ #You should have received a copy of the GNU General Public License #along with GCC; see the file COPYING. If not, write to the Free -#Software Foundation, 59 Temple Place - Suite 330, Boston, MA -#02111-1307, USA. +#Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +#02110-1301, USA. # This shell script produces a header file which the gcc driver # program uses to pick which library to use based on the machine @@ -63,10 +63,18 @@ # for the rule to exclude a set. Options can be preceded with a '!' to # match a logical NOT. -# The optional sevenths argument is a list of OS subdirectory names. -# The format is the same as of the second argument. -# The difference is that second argument describes multilib directories -# in GCC conventions, while this one the OS multilib convention. +# The optional seventh argument is a list of OS subdirectory names. +# The format is either the same as of the second argument, or a set of +# mappings. When it is the same as the second argument, it describes +# the multilib directories using OS conventions, rather than GCC +# conventions. When it is a set of mappings of the form gccdir=osdir, +# the left side gives the GCC convention and the right gives the +# equivalent OS defined location. If the osdir part begins with a !, +# the os directory names are used exclusively. Use the mapping when +# there is no one-to-one equivalence between GCC levels and the OS. + +# The last option should be "yes" if multilibs are enabled. If it is not +# "yes", all GCC multilib dir names will be ".". # The output looks like # #define MULTILIB_MATCHES "\ @@ -85,7 +93,7 @@ # genmultilib 'm64/m32 mno-app-regs|mcmodel=medany' '64 32 alt' # 'mcmodel?medany=mcmodel?medmid' 'm32/mno-app-regs* m32/mcmodel=*' # '' 'm32/!m64/mno-app-regs m32/!m64/mcmodel=medany' -# '../lib64 ../lib32 alt' +# '../lib64 ../lib32 alt' yes # This produces: # ". !m64 !m32 !mno-app-regs !mcmodel=medany;", # "64:../lib64 m64 !m32 !mno-app-regs !mcmodel=medany;", @@ -113,9 +121,14 @@ exceptions=$4 extra=$5 exclusions=$6 osdirnames=$7 +enable_multilib=$8 echo "static const char *const multilib_raw[] = {" +mkdir tmpmultilib.$$ || exit 1 +# Use cd ./foo to avoid CDPATH output. +cd ./tmpmultilib.$$ || exit 1 + # What we want to do is select all combinations of the sets in # options. Each combination which includes a set of mutually # exclusive options must then be output multiple times, once for each @@ -157,11 +170,8 @@ chmod +x tmpmultilib combinations=`initial=/ ./tmpmultilib ${options}` -rm -f tmpmultilib - # If there exceptions, weed them out now if [ -n "${exceptions}" ]; then - rm -f tmpmultilib2 cat >tmpmultilib2 <<\EOF #!/bin/sh # This recursive script weeds out any combination of multilib @@ -183,7 +193,6 @@ cat >>tmpmultilib2 <<\EOF EOF chmod +x tmpmultilib2 combinations=`./tmpmultilib2 ${combinations}` - rm -f ./tmpmultilib2 fi # Construct a sed pattern which will convert option names to directory @@ -212,24 +221,44 @@ fi # Construct a sed pattern which will convert option names to OS directory # names. toosdirnames= +defaultosdirname= if [ -n "${osdirnames}" ]; then set x ${osdirnames} shift - for set in ${options}; do - for opts in `echo ${set} | sed -e 's|/| |'g`; do - patt="/" - for opt in `echo ${opts} | sed -e 's_|_ _'g`; do - if [ "$1" != "${opt}" ]; then - toosdirnames="${toosdirnames} -e s|/${opt}/|/${1}/|g" - patt="${patt}${1}/" - if [ "${patt}" != "/${1}/" ]; then - toosdirnames="${toosdirnames} -e s|${patt}|/${1}/|g" + while [ $# != 0 ] ; do + case "$1" in + .=*) + defaultosdirname=`echo $1 | sed 's|^.=|:|'` + shift + ;; + *=*) + patt=`echo $1 | sed -e 's|=|/$=/|'` + toosdirnames="${toosdirnames} -e s=^/${patt}/=" + shift + ;; + *) + break + ;; + esac + done + + if [ $# != 0 ]; then + for set in ${options}; do + for opts in `echo ${set} | sed -e 's|/| |'g`; do + patt="/" + for opt in `echo ${opts} | sed -e 's_|_ _'g`; do + if [ "$1" != "${opt}" ]; then + toosdirnames="${toosdirnames} -e s|/${opt}/|/${1}/|g" + patt="${patt}${1}/" + if [ "${patt}" != "/${1}/" ]; then + toosdirnames="${toosdirnames} -e s|${patt}|/${1}/|g" + fi fi - fi + done + shift done - shift done - done + fi fi # We need another recursive shell script to correctly handle positive @@ -271,7 +300,7 @@ for set in ${options}; do done done optout=`echo ${optout} | sed -e 's/^ //'` -echo "\". ${optout};\"," +echo "\".${defaultosdirname} ${optout};\"," # Work over the list of combinations. We have to translate each one # to use the directory names rather than the option names, we have to @@ -282,7 +311,7 @@ for combo in ${combinations}; do if [ -n "${todirnames}" ]; then dirout=`echo ${combo} | sed ${todirnames}` else - dirout=${combo} + dirout=`echo ${combo} | sed -e 's/=/-/g'` fi # Remove the leading and trailing slashes. dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/$||g'` @@ -292,8 +321,25 @@ for combo in ${combinations}; do osdirout=`echo ${combo} | sed ${toosdirnames}` # Remove the leading and trailing slashes. osdirout=`echo ${osdirout} | sed -e 's|^/||' -e 's|/$||g'` - if [ "x${dirout}" != "x${osdirout}" ]; then - dirout="${dirout}:${osdirout}" + if [ "x${enable_multilib}" != xyes ]; then + dirout=".:${osdirout}" + disable_multilib=yes + else + case "${osdirout}" in + !*) + dirout=`echo ${osdirout} | sed 's/^!//'` + ;; + *) + dirout="${dirout}:${osdirout}" + ;; + esac + fi + else + if [ "x${enable_multilib}" != xyes ]; then + # genmultilib with --disable-multilib should be + # called with '' '' '' '' '' '' '' no + # if MULTILIB_OSDIRNAMES is empty. + exit 1 fi fi @@ -358,6 +404,13 @@ moptions=`echo ${options} | sed -e 's,[ ][ ]*, ,g'` echo "" echo "static const char *multilib_options = \"${moptions}\";" -rm -f tmpmultilib2 +# Finally output the disable flag if specified +if [ "x${disable_multilib}" = xyes ]; then + echo "" + echo "#define DISABLE_MULTILIB 1" +fi + +cd .. +rm -r tmpmultilib.$$ exit 0