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 + -
显示快捷键?