📄 genmultilib
字号:
#!/bin/sh # Generates multilib.h.# Copyright (C) 1994, 1995 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 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:# #define MULTILIB_SELECT "\# . !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=$3# 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# 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# Construct a sed pattern which will add negations based on the# matches. The semicolons are easier than getting the shell to accept# quoted spaces when expanding a variable.matchnegations=for i in ${matches}; do l=`echo $i | sed -e 's/=.*$//' -e 's/?/=/g'` r=`echo $i | sed -e 's/^.*=//' -e 's/?/=/g'` matchnegations="${matchnegations} -e s/;!${l};/;!${l};!${r};/"done# 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# We are ready to start output.echo '#define MULTILIB_SELECT "\'# 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/^ //'`if [ -n "${matchnegations}" ]; then optout=`echo ";${optout};" | sed -e 's/ /;/g' ${matchnegations} -e 's/^;//' -e 's/;$//' -e 's/;/ /g'`fiecho ". ${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/^ //'` # Add any negations of matches. if [ -n "${matchnegations}" ]; then optout=`echo ";${optout};" | sed -e 's/ /;/g' ${matchnegations} -e 's/^;//' -e 's/;$//' -e 's/;/ /g'` fi # Output the line with all appropriate matches. dirout="${dirout}" optout="${optout}" ./tmpmultilib2 ${matches}donerm -f tmpmultilib2# That's it.echo '"'exit 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -