⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genmultilib

📁 gcc库的原代码,对编程有很大帮助.
💻
字号:
#!/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 + -