genmultilib

来自「GCC编译器源代码」· 代码 · 共 270 行

TXT
270
字号
#!/bin/sh # Generates multilib.h.#   Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.#This file is part of GNU CC.#GNU CC 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 2, or (at your option)#any later version.#GNU CC 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 GNU CC; see the file COPYING.  If not, write to#the Free Software Foundation, 59 Temple Place - Suite 330,#Boston, MA 02111-1307, USA.# This shell script produces a header file which the gcc driver# program uses to pick which library to use based on the machine# specific options that it is given.# The first argument is a list of sets of options.  The elements in# the list are separated by spaces.  Within an element, the options# are separated by slashes.  No leading dash is used on the options.# Each option in a set is mutually incompatible with all other options# in the set.# The optional second argument is a list of subdirectory names.  If# the second argument is non-empty, there must be as many elements in# the second argument as there are options in the first argument.  The# elements in the second list are separated by spaces.  If the second# argument is empty, the option names will be used as the directory# names.# The optional third argument is a list of options which are# identical.  The elements in the list are separated by spaces.  Each# element must be of the form OPTION=OPTION.  The first OPTION should# appear in the first argument, and the second should be a synonym for# it.  Question marks are replaced with equal signs in both options.# The optional fourth argument is a list of multilib directory # combinations that should not be built.# The optional fifth argument is a list of options that should be# used whenever building multilib libraries.# The output looks like#   #define MULTILIB_MATCHES "\#   SUBDIRECTORY OPTIONS;\#   ...#   "# The SUBDIRECTORY is the subdirectory to use.  The OPTIONS are# multiple options separated by spaces.  Each option may start with an# exclamation point.  gcc will consider each line in turn.  If none of# the options beginning with an exclamation point are present, and all# of the other options are present, that subdirectory will be used.# The order of the subdirectories is such that they can be created in# order; that is, a subdirectory is preceded by all its parents.# Here is a example (this is simplified from the actual 680x0 case):#   genmultilib "m68000/m68020 msoft-float" "m68000 m68020 msoft-float"#		"m68000=mc68000"# This produces:#   ". !m68000 !mc68000 !m68020 !msoft-float;",#   "m68000 m68000 !m68020 !msoft-float;",#   "m68000 mc60000 !m68020 !msoft-float;",#   "m68020 !m68000 !mc68000 m68020 !msoft-float;",#   "msoft-float !m68000 !mc68000 !m68020 msoft-float;",#   "m68000/msoft-float m68000 !m68020 msoft-float;",#   "m68000/msoft-float mc68000 !m68020 msoft-float;",#   "m68020/msoft-float !m68000 !mc68000 m68020 msoft-float;",## The effect is that `gcc -msoft-float' (for example) will append# msoft-float to the directory name when searching for libraries or# startup files, and `gcc -m68000 -msoft-float' (for example) will# append m68000/msoft-float.# Copy the positional parameters into variables.options=$1dirnames=$2matches=$3exceptions=$4extra=$5echo "static char *multilib_raw[] = {"# 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# item in the set.  Selecting combinations is a recursive process.# Since not all versions of sh support functions, we achieve recursion# by creating a temporary shell script which invokes itself.rm -f tmpmultilibcat >tmpmultilib <<\EOF#!/bin/sh# This recursive script basically outputs all combinations of its# input arguments, handling mutually exclusive sets of options by# repetition.  When the script is called, ${initial} is the list of# options which should appear before all combinations this will# output.  The output looks like a list of subdirectory names with# leading and trailing slashes.if [ "$#" != "0" ]; then  first=$1  shift  for opt in `echo $first | sed -e 's|/| |'g`; do    echo ${initial}${opt}/  done  ./tmpmultilib $@  for opt in `echo $first | sed -e 's|/| |'g`; do    initial="${initial}${opt}/" ./tmpmultilib $@  donefiEOFchmod +x tmpmultilibcombinations=`initial=/ ./tmpmultilib ${options}`rm -f tmpmultilib# If there exceptions, weed them out nowif [ -n "${exceptions}" ]; then  rm -f tmpmultilib2  cat >tmpmultilib2 <<\EOF#!/bin/sh# This recursive script weeds out any combination of multilib# switches that should not be generated.  The output looks like# a list of subdirectory names with leading and trailing slashes.  for opt in $@; do    case "$opt" inEOF  for except in ${exceptions}; do    echo "      /${except}/) : ;;" >> tmpmultilib2  donecat >>tmpmultilib2 <<\EOF      *) echo ${opt};;    esac  doneEOF  chmod +x tmpmultilib2  combinations=`./tmpmultilib2 ${combinations}`  rm -f ./tmpmultilib2fi# Construct a sed pattern which will convert option names to directory# names.todirnames=if [ -n "${dirnames}" ]; then  set x ${dirnames}  shift  for set in ${options}; do    for opt in `echo ${set} | sed -e 's|/| |'g`; do      if [ "$1" != "${opt}" ]; then        todirnames="${todirnames} -e s|/${opt}/|/${1}/|g"      fi      shift    done  donefi# We need another recursive shell script to correctly handle positive# matches.  If we are invoked as#   genmultilib "opt1 opt2" "" "opt1=nopt1 opt2=nopt2"# we must output#   opt1/opt2 opt1 opt2#   opt1/opt2 nopt1 opt2#   opt1/opt2 opt1 nopt2#   opt1/opt2 nopt1 nopt2# In other words, we must output all combinations of matches.rm -f tmpmultilib2cat >tmpmultilib2 <<\EOF#!/bin/sh# The positional parameters are a list of matches to consider.# ${dirout} is the directory name and ${optout} is the current list of# options.if [ "$#" = "0" ]; then  echo "\"${dirout} ${optout};\","else  first=$1  shift  dirout="${dirout}" optout="${optout}" ./tmpmultilib2 $@  l=`echo ${first} | sed -e 's/=.*$//' -e 's/?/=/g'`  r=`echo ${first} | sed -e 's/^.*=//' -e 's/?/=/g'`  if expr " ${optout} " : ".* ${l} .*" > /dev/null; then    newopt=`echo " ${optout} " | sed -e "s/ ${l} / ${r} /" -e 's/^ //' -e 's/ $//'`    dirout="${dirout}" optout="${newopt}" ./tmpmultilib2 $@  fifiEOFchmod +x tmpmultilib2# Start with the current directory, which includes only negations.optout=for set in ${options}; do  for opt in `echo ${set} | sed -e 's|/| |'g`; do    optout="${optout} !${opt}"  donedoneoptout=`echo ${optout} | sed -e 's/^ //'`echo "\". ${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# include the information in matches, and we have to generate the# correct list of options and negations.for combo in ${combinations}; do  # Use the directory names rather than the option names.  if [ -n "${todirnames}" ]; then    dirout=`echo ${combo} | sed ${todirnames}`  else    dirout=${combo}  fi  # Remove the leading and trailing slashes.  dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/$||g'`  # Look through the options.  We must output each option that is  # present, and negate each option that is not present.  optout=  for set in ${options}; do    setopts=`echo ${set} | sed -e 's|/| |g'`    for opt in ${setopts}; do      if expr "${combo} " : ".*/${opt}/.*" > /dev/null; then	optout="${optout} ${opt}"      else	optout="${optout} !${opt}"      fi    done  done  optout=`echo ${optout} | sed -e 's/^ //'`  # Output the line with all appropriate matches.  dirout="${dirout}" optout="${optout}" ./tmpmultilib2done# Terminate the list of string.echo "NULL"echo "};"# Output all of the matches now as option and that is the same as that, with# a semicolon trailer.  Include all of the normal options as well.# Note, the format of the matches is reversed compared# to what we want, so switch them around.echo ""echo "static char *multilib_matches_raw[] = {"for match in ${matches}; do  l=`echo ${match} | sed -e 's/=.*$//' -e 's/?/=/g'`  r=`echo ${match} | sed -e 's/^.*=//' -e 's/?/=/g'`  echo "\"${r} ${l};\","donefor set in ${options}; do  for opt in `echo ${set} | sed -e 's|/| |'g`; do    echo "\"${opt} ${opt};\","  donedoneecho "NULL"echo "};"# Output the default options nowecho ""echo "static char *multilib_extra = \"${extra}\";"rm -f tmpmultilib2exit 0

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?