|
|
1.1 root 1: #!/bin/sh
2: # Generates multilib.h.
1.1.1.2 ! root 3: # Copyright (C) 1994, 1995 Free Software Foundation, Inc.
1.1 root 4:
5: #This file is part of GNU CC.
6:
7: #GNU CC is free software; you can redistribute it and/or modify
8: #it under the terms of the GNU General Public License as published by
9: #the Free Software Foundation; either version 2, or (at your option)
10: #any later version.
11:
12: #GNU CC is distributed in the hope that it will be useful,
13: #but WITHOUT ANY WARRANTY; without even the implied warranty of
14: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: #GNU General Public License for more details.
16:
17: #You should have received a copy of the GNU General Public License
18: #along with GNU CC; see the file COPYING. If not, write to
1.1.1.2 ! root 19: #the Free Software Foundation, 59 Temple Place - Suite 330,
! 20: #Boston, MA 02111-1307, USA.
1.1 root 21:
22: # This shell script produces a header file which the gcc driver
23: # program uses to pick which library to use based on the machine
24: # specific options that it is given.
25:
26: # The first argument is a list of sets of options. The elements in
27: # the list are separated by spaces. Within an element, the options
28: # are separated by slashes. No leading dash is used on the options.
29: # Each option in a set is mutually incompatible with all other options
30: # in the set.
31:
32: # The optional second argument is a list of subdirectory names. If
33: # the second argument is non-empty, there must be as many elements in
34: # the second argument as there are options in the first argument. The
35: # elements in the second list are separated by spaces. If the second
36: # argument is empty, the option names will be used as the directory
37: # names.
38:
39: # The optional third argument is a list of options which are
40: # identical. The elements in the list are separated by spaces. Each
41: # element must be of the form OPTION=OPTION. The first OPTION should
42: # appear in the first argument, and the second should be a synonym for
1.1.1.2 ! root 43: # it. Question marks are replaced with equal signs in both options.
1.1 root 44:
45: # The output looks like
46: # #define MULTILIB_MATCHES "\
47: # SUBDIRECTORY OPTIONS;\
48: # ...
49: # "
50: # The SUBDIRECTORY is the subdirectory to use. The OPTIONS are
51: # multiple options separated by spaces. Each option may start with an
52: # exclamation point. gcc will consider each line in turn. If none of
53: # the options beginning with an exclamation point are present, and all
54: # of the other options are present, that subdirectory will be used.
55: # The order of the subdirectories is such that they can be created in
56: # order; that is, a subdirectory is preceded by all its parents.
57:
58: # Here is a example (this is simplified from the actual 680x0 case):
59: # genmultilib "m68000/m68020 msoft-float" "m68000 m68020 msoft-float"
60: # "m68000=mc68000"
61: # This produces:
1.1.1.2 ! root 62: # #define MULTILIB_SELECT "\
1.1 root 63: # . !m68000 !mc68000 !m68020 !msoft-float;\
1.1.1.2 ! root 64: # m68000 m68000 !m68020 !msoft-float;\
! 65: # m68000 mc60000 !m68020 !msoft-float;\
! 66: # m68020 !m68000 !mc68000 m68020 !msoft-float;\
! 67: # msoft-float !m68000 !mc68000 !m68020 msoft-float;\
! 68: # m68000/msoft-float m68000 !m68020 msoft-float;\
! 69: # m68000/msoft-float mc68000 !m68020 msoft-float;\
! 70: # m68020/msoft-float !m68000 !mc68000 m68020 msoft-float;\
1.1 root 71: # "
72: # The effect is that `gcc -msoft-float' (for example) will append
73: # msoft-float to the directory name when searching for libraries or
74: # startup files, and `gcc -m68000 -msoft-float' (for example) will
75: # append m68000/msoft-float.
76:
77: # Copy the positional parameters into variables.
78: options=$1
79: dirnames=$2
80: matches=$3
81:
82: # What we want to do is select all combinations of the sets in
83: # options. Each combination which includes a set of mutually
84: # exclusive options must then be output multiple times, once for each
85: # item in the set. Selecting combinations is a recursive process.
86: # Since not all versions of sh support functions, we achieve recursion
87: # by creating a temporary shell script which invokes itself.
88: rm -f tmpmultilib
89: cat >tmpmultilib <<\EOF
90: #!/bin/sh
91: # This recursive script basically outputs all combinations of its
92: # input arguments, handling mutually exclusive sets of options by
93: # repetition. When the script is called, ${initial} is the list of
94: # options which should appear before all combinations this will
95: # output. The output looks like a list of subdirectory names with
96: # leading and trailing slashes.
97: if [ "$#" != "0" ]; then
98: first=$1
99: shift
100: for opt in `echo $first | sed -e 's|/| |'g`; do
101: echo ${initial}${opt}/
102: done
103: ./tmpmultilib $@
104: for opt in `echo $first | sed -e 's|/| |'g`; do
105: initial="${initial}${opt}/" ./tmpmultilib $@
106: done
107: fi
108: EOF
109: chmod +x tmpmultilib
110:
111: combinations=`initial=/ ./tmpmultilib ${options}`
112:
113: rm -f tmpmultilib
114:
115: # Construct a sed pattern which will convert option names to directory
116: # names.
117: todirnames=
118: if [ -n "${dirnames}" ]; then
119: set x ${dirnames}
120: shift
121: for set in ${options}; do
122: for opt in `echo ${set} | sed -e 's|/| |'g`; do
123: if [ "$1" != "${opt}" ]; then
124: todirnames="${todirnames} -e s|/${opt}/|/${1}/|g"
125: fi
126: shift
127: done
128: done
129: fi
130:
131: # Construct a sed pattern which will add negations based on the
132: # matches. The semicolons are easier than getting the shell to accept
133: # quoted spaces when expanding a variable.
134: matchnegations=
135: for i in ${matches}; do
1.1.1.2 ! root 136: l=`echo $i | sed -e 's/=.*$//' -e 's/?/=/g'`
! 137: r=`echo $i | sed -e 's/^.*=//' -e 's/?/=/g'`
1.1 root 138: matchnegations="${matchnegations} -e s/;!${l};/;!${l};!${r};/"
139: done
140:
141: # We need another recursive shell script to correctly handle positive
142: # matches. If we are invoked as
143: # genmultilib "opt1 opt2" "" "opt1=nopt1 opt2=nopt2"
144: # we must output
145: # opt1/opt2 opt1 opt2
146: # opt1/opt2 nopt1 opt2
147: # opt1/opt2 opt1 nopt2
148: # opt1/opt2 nopt1 nopt2
149: # In other words, we must output all combinations of matches.
150: rm -f tmpmultilib2
151: cat >tmpmultilib2 <<\EOF
152: #!/bin/sh
153: # The positional parameters are a list of matches to consider.
154: # ${dirout} is the directory name and ${optout} is the current list of
155: # options.
156: if [ "$#" = "0" ]; then
157: echo "${dirout} ${optout};\\"
158: else
159: first=$1
160: shift
161: dirout="${dirout}" optout="${optout}" ./tmpmultilib2 $@
1.1.1.2 ! root 162: l=`echo ${first} | sed -e 's/=.*$//' -e 's/?/=/g'`
! 163: r=`echo ${first} | sed -e 's/^.*=//' -e 's/?/=/g'`
! 164: if expr " ${optout} " : ".* ${l} .*" > /dev/null; then
1.1 root 165: newopt=`echo " ${optout} " | sed -e "s/ ${l} / ${r} /" -e 's/^ //' -e 's/ $//'`
166: dirout="${dirout}" optout="${newopt}" ./tmpmultilib2 $@
1.1.1.2 ! root 167: fi
1.1 root 168: fi
169: EOF
170: chmod +x tmpmultilib2
171:
172: # We are ready to start output.
173: echo '#define MULTILIB_SELECT "\'
174:
175: # Start with the current directory, which includes only negations.
176: optout=
177: for set in ${options}; do
178: for opt in `echo ${set} | sed -e 's|/| |'g`; do
179: optout="${optout} !${opt}"
180: done
181: done
182: optout=`echo ${optout} | sed -e 's/^ //'`
183: if [ -n "${matchnegations}" ]; then
184: optout=`echo ";${optout};" | sed -e 's/ /;/g' ${matchnegations} -e 's/^;//' -e 's/;$//' -e 's/;/ /g'`
185: fi
186: echo ". ${optout};\\"
187:
188: # Work over the list of combinations. We have to translate each one
189: # to use the directory names rather than the option names, we have to
190: # include the information in matches, and we have to generate the
191: # correct list of options and negations.
192: for combo in ${combinations}; do
193: # Use the directory names rather than the option names.
194: if [ -n "${todirnames}" ]; then
195: dirout=`echo ${combo} | sed ${todirnames}`
196: else
197: dirout=${combo}
198: fi
199: # Remove the leading and trailing slashes.
200: dirout=`echo ${dirout} | sed -e 's|^/||' -e 's|/$||g'`
201:
202: # Look through the options. We must output each option that is
1.1.1.2 ! root 203: # present, and negate each option that is not present.
1.1 root 204: optout=
205: for set in ${options}; do
206: setopts=`echo ${set} | sed -e 's|/| |g'`
207: for opt in ${setopts}; do
1.1.1.2 ! root 208: if expr "${combo} " : ".*/${opt}/.*" > /dev/null; then
1.1 root 209: optout="${optout} ${opt}"
1.1.1.2 ! root 210: else
1.1 root 211: optout="${optout} !${opt}"
1.1.1.2 ! root 212: fi
! 213: done
1.1 root 214: done
215: optout=`echo ${optout} | sed -e 's/^ //'`
216:
217: # Add any negations of matches.
218: if [ -n "${matchnegations}" ]; then
219: optout=`echo ";${optout};" | sed -e 's/ /;/g' ${matchnegations} -e 's/^;//' -e 's/;$//' -e 's/;/ /g'`
220: fi
221:
222: # Output the line with all appropriate matches.
223: dirout="${dirout}" optout="${optout}" ./tmpmultilib2 ${matches}
224: done
225:
226: rm -f tmpmultilib2
227:
228: # That's it.
229: echo '"'
230:
231: exit 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.