OSDN Git Service

2006-10-21 H.J. Lu <hongjiu.lu@intel.com>
[pf3gnuchains/gcc-fork.git] / gcc / genmultilib
index 7b5cdc2..660639e 100644 (file)
@@ -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
 # 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 ".".
@@ -121,7 +126,8 @@ enable_multilib=$8
 echo "static const char *const multilib_raw[] = {"
 
 mkdir tmpmultilib.$$ || exit 1
-cd 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
@@ -215,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
@@ -274,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
@@ -285,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'`
@@ -297,8 +323,16 @@ for combo in ${combinations}; do
     osdirout=`echo ${osdirout} | sed -e 's|^/||' -e 's|/$||g'`
     if [ "x${enable_multilib}" != xyes ]; then
       dirout=".:${osdirout}"
+      disable_multilib=yes
     else
-      dirout="${dirout}:${osdirout}"
+      case "${osdirout}" in
+        !*)
+         dirout=`echo ${osdirout} | sed 's/^!//'`
+         ;;
+       *)
+         dirout="${dirout}:${osdirout}"
+         ;;
+      esac
     fi
   else
     if [ "x${enable_multilib}" != xyes ]; then
@@ -370,6 +404,12 @@ moptions=`echo ${options} | sed -e 's,[    ][      ]*, ,g'`
 echo ""
 echo "static const char *multilib_options = \"${moptions}\";"
 
+# Finally output the disable flag if specified
+if [ "x${disable_multilib}" = xyes ]; then
+  echo ""
+  echo "#define DISABLE_MULTILIB  1"
+fi
+
 cd ..
 rm -r tmpmultilib.$$