Rev 2010 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | - | 1 | #! /bin/sh |
2 | # Wrapper for compilers which do not understand '-c -o'. |
||
3 | |||
2010 | jag | 4 | scriptversion=2018-03-07.03; # UTC |
1 | - | 5 | |
2013 | jag | 6 | # Copyright (C) 1999-2020 Free Software Foundation, Inc. |
1 | - | 7 | # Written by Tom Tromey <tromey@cygnus.com>. |
8 | # |
||
9 | # This program is free software; you can redistribute it and/or modify |
||
10 | # it under the terms of the GNU General Public License as published by |
||
11 | # the Free Software Foundation; either version 2, or (at your option) |
||
12 | # any later version. |
||
13 | # |
||
14 | # This program is distributed in the hope that it will be useful, |
||
15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
17 | # GNU General Public License for more details. |
||
18 | # |
||
19 | # You should have received a copy of the GNU General Public License |
||
2010 | jag | 20 | # along with this program. If not, see <https://www.gnu.org/licenses/>. |
1 | - | 21 | |
22 | # As a special exception to the GNU General Public License, if you |
||
23 | # distribute this file as part of a program that contains a |
||
24 | # configuration script generated by Autoconf, you may include it under |
||
25 | # the same distribution terms that you use for the rest of that program. |
||
26 | |||
27 | # This file is maintained in Automake, please report |
||
28 | # bugs to <bug-automake@gnu.org> or send patches to |
||
29 | # <automake-patches@gnu.org>. |
||
30 | |||
31 | nl=' |
||
32 | ' |
||
33 | |||
34 | # We need space, tab and new line, in precisely that order. Quoting is |
||
35 | # there to prevent tools from complaining about whitespace usage. |
||
36 | IFS=" "" $nl" |
||
37 | |||
38 | file_conv= |
||
39 | |||
40 | # func_file_conv build_file lazy |
||
41 | # Convert a $build file to $host form and store it in $file |
||
42 | # Currently only supports Windows hosts. If the determined conversion |
||
43 | # type is listed in (the comma separated) LAZY, no conversion will |
||
44 | # take place. |
||
45 | func_file_conv () |
||
46 | { |
||
47 | file=$1 |
||
48 | case $file in |
||
49 | / | /[!/]*) # absolute file, and not a UNC file |
||
50 | if test -z "$file_conv"; then |
||
51 | # lazily determine how to convert abs files |
||
52 | case `uname -s` in |
||
53 | MINGW*) |
||
54 | file_conv=mingw |
||
55 | ;; |
||
2013 | jag | 56 | CYGWIN* | MSYS*) |
1 | - | 57 | file_conv=cygwin |
58 | ;; |
||
59 | *) |
||
60 | file_conv=wine |
||
61 | ;; |
||
62 | esac |
||
63 | fi |
||
64 | case $file_conv/,$2, in |
||
65 | *,$file_conv,*) |
||
66 | ;; |
||
67 | mingw/*) |
||
68 | file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` |
||
69 | ;; |
||
2013 | jag | 70 | cygwin/* | msys/*) |
1 | - | 71 | file=`cygpath -m "$file" || echo "$file"` |
72 | ;; |
||
73 | wine/*) |
||
74 | file=`winepath -w "$file" || echo "$file"` |
||
75 | ;; |
||
76 | esac |
||
77 | ;; |
||
78 | esac |
||
79 | } |
||
80 | |||
81 | # func_cl_dashL linkdir |
||
82 | # Make cl look for libraries in LINKDIR |
||
83 | func_cl_dashL () |
||
84 | { |
||
85 | func_file_conv "$1" |
||
86 | if test -z "$lib_path"; then |
||
87 | lib_path=$file |
||
88 | else |
||
89 | lib_path="$lib_path;$file" |
||
90 | fi |
||
91 | linker_opts="$linker_opts -LIBPATH:$file" |
||
92 | } |
||
93 | |||
94 | # func_cl_dashl library |
||
95 | # Do a library search-path lookup for cl |
||
96 | func_cl_dashl () |
||
97 | { |
||
98 | lib=$1 |
||
99 | found=no |
||
100 | save_IFS=$IFS |
||
101 | IFS=';' |
||
102 | for dir in $lib_path $LIB |
||
103 | do |
||
104 | IFS=$save_IFS |
||
105 | if $shared && test -f "$dir/$lib.dll.lib"; then |
||
106 | found=yes |
||
107 | lib=$dir/$lib.dll.lib |
||
108 | break |
||
109 | fi |
||
110 | if test -f "$dir/$lib.lib"; then |
||
111 | found=yes |
||
112 | lib=$dir/$lib.lib |
||
113 | break |
||
114 | fi |
||
115 | if test -f "$dir/lib$lib.a"; then |
||
116 | found=yes |
||
117 | lib=$dir/lib$lib.a |
||
118 | break |
||
119 | fi |
||
120 | done |
||
121 | IFS=$save_IFS |
||
122 | |||
123 | if test "$found" != yes; then |
||
124 | lib=$lib.lib |
||
125 | fi |
||
126 | } |
||
127 | |||
128 | # func_cl_wrapper cl arg... |
||
129 | # Adjust compile command to suit cl |
||
130 | func_cl_wrapper () |
||
131 | { |
||
132 | # Assume a capable shell |
||
133 | lib_path= |
||
134 | shared=: |
||
135 | linker_opts= |
||
136 | for arg |
||
137 | do |
||
138 | if test -n "$eat"; then |
||
139 | eat= |
||
140 | else |
||
141 | case $1 in |
||
142 | -o) |
||
143 | # configure might choose to run compile as 'compile cc -o foo foo.c'. |
||
144 | eat=1 |
||
145 | case $2 in |
||
146 | *.o | *.[oO][bB][jJ]) |
||
147 | func_file_conv "$2" |
||
148 | set x "$@" -Fo"$file" |
||
149 | shift |
||
150 | ;; |
||
151 | *) |
||
152 | func_file_conv "$2" |
||
153 | set x "$@" -Fe"$file" |
||
154 | shift |
||
155 | ;; |
||
156 | esac |
||
157 | ;; |
||
158 | -I) |
||
159 | eat=1 |
||
160 | func_file_conv "$2" mingw |
||
161 | set x "$@" -I"$file" |
||
162 | shift |
||
163 | ;; |
||
164 | -I*) |
||
165 | func_file_conv "${1#-I}" mingw |
||
166 | set x "$@" -I"$file" |
||
167 | shift |
||
168 | ;; |
||
169 | -l) |
||
170 | eat=1 |
||
171 | func_cl_dashl "$2" |
||
172 | set x "$@" "$lib" |
||
173 | shift |
||
174 | ;; |
||
175 | -l*) |
||
176 | func_cl_dashl "${1#-l}" |
||
177 | set x "$@" "$lib" |
||
178 | shift |
||
179 | ;; |
||
180 | -L) |
||
181 | eat=1 |
||
182 | func_cl_dashL "$2" |
||
183 | ;; |
||
184 | -L*) |
||
185 | func_cl_dashL "${1#-L}" |
||
186 | ;; |
||
187 | -static) |
||
188 | shared=false |
||
189 | ;; |
||
190 | -Wl,*) |
||
191 | arg=${1#-Wl,} |
||
192 | save_ifs="$IFS"; IFS=',' |
||
193 | for flag in $arg; do |
||
194 | IFS="$save_ifs" |
||
195 | linker_opts="$linker_opts $flag" |
||
196 | done |
||
197 | IFS="$save_ifs" |
||
198 | ;; |
||
199 | -Xlinker) |
||
200 | eat=1 |
||
201 | linker_opts="$linker_opts $2" |
||
202 | ;; |
||
203 | -*) |
||
204 | set x "$@" "$1" |
||
205 | shift |
||
206 | ;; |
||
207 | *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) |
||
208 | func_file_conv "$1" |
||
209 | set x "$@" -Tp"$file" |
||
210 | shift |
||
211 | ;; |
||
212 | *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) |
||
213 | func_file_conv "$1" mingw |
||
214 | set x "$@" "$file" |
||
215 | shift |
||
216 | ;; |
||
217 | *) |
||
218 | set x "$@" "$1" |
||
219 | shift |
||
220 | ;; |
||
221 | esac |
||
222 | fi |
||
223 | shift |
||
224 | done |
||
225 | if test -n "$linker_opts"; then |
||
226 | linker_opts="-link$linker_opts" |
||
227 | fi |
||
228 | exec "$@" $linker_opts |
||
229 | exit 1 |
||
230 | } |
||
231 | |||
232 | eat= |
||
233 | |||
234 | case $1 in |
||
235 | '') |
||
236 | echo "$0: No command. Try '$0 --help' for more information." 1>&2 |
||
237 | exit 1; |
||
238 | ;; |
||
239 | -h | --h*) |
||
240 | cat <<\EOF |
||
241 | Usage: compile [--help] [--version] PROGRAM [ARGS] |
||
242 | |||
243 | Wrapper for compilers which do not understand '-c -o'. |
||
244 | Remove '-o dest.o' from ARGS, run PROGRAM with the remaining |
||
245 | arguments, and rename the output as expected. |
||
246 | |||
247 | If you are trying to build a whole package this is not the |
||
248 | right script to run: please start by reading the file 'INSTALL'. |
||
249 | |||
250 | Report bugs to <bug-automake@gnu.org>. |
||
251 | EOF |
||
252 | exit $? |
||
253 | ;; |
||
254 | -v | --v*) |
||
255 | echo "compile $scriptversion" |
||
256 | exit $? |
||
257 | ;; |
||
2010 | jag | 258 | cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ |
259 | icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) |
||
1 | - | 260 | func_cl_wrapper "$@" # Doesn't return... |
261 | ;; |
||
262 | esac |
||
263 | |||
264 | ofile= |
||
265 | cfile= |
||
266 | |||
267 | for arg |
||
268 | do |
||
269 | if test -n "$eat"; then |
||
270 | eat= |
||
271 | else |
||
272 | case $1 in |
||
273 | -o) |
||
274 | # configure might choose to run compile as 'compile cc -o foo foo.c'. |
||
275 | # So we strip '-o arg' only if arg is an object. |
||
276 | eat=1 |
||
277 | case $2 in |
||
278 | *.o | *.obj) |
||
279 | ofile=$2 |
||
280 | ;; |
||
281 | *) |
||
282 | set x "$@" -o "$2" |
||
283 | shift |
||
284 | ;; |
||
285 | esac |
||
286 | ;; |
||
287 | *.c) |
||
288 | cfile=$1 |
||
289 | set x "$@" "$1" |
||
290 | shift |
||
291 | ;; |
||
292 | *) |
||
293 | set x "$@" "$1" |
||
294 | shift |
||
295 | ;; |
||
296 | esac |
||
297 | fi |
||
298 | shift |
||
299 | done |
||
300 | |||
301 | if test -z "$ofile" || test -z "$cfile"; then |
||
302 | # If no '-o' option was seen then we might have been invoked from a |
||
303 | # pattern rule where we don't need one. That is ok -- this is a |
||
304 | # normal compilation that the losing compiler can handle. If no |
||
305 | # '.c' file was seen then we are probably linking. That is also |
||
306 | # ok. |
||
307 | exec "$@" |
||
308 | fi |
||
309 | |||
310 | # Name of file we expect compiler to create. |
||
311 | cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` |
||
312 | |||
313 | # Create the lock directory. |
||
314 | # Note: use '[/\\:.-]' here to ensure that we don't use the same name |
||
315 | # that we are using for the .o file. Also, base the name on the expected |
||
316 | # object file name, since that is what matters with a parallel build. |
||
317 | lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d |
||
318 | while true; do |
||
319 | if mkdir "$lockdir" >/dev/null 2>&1; then |
||
320 | break |
||
321 | fi |
||
322 | sleep 1 |
||
323 | done |
||
324 | # FIXME: race condition here if user kills between mkdir and trap. |
||
325 | trap "rmdir '$lockdir'; exit 1" 1 2 15 |
||
326 | |||
327 | # Run the compile. |
||
328 | "$@" |
||
329 | ret=$? |
||
330 | |||
331 | if test -f "$cofile"; then |
||
332 | test "$cofile" = "$ofile" || mv "$cofile" "$ofile" |
||
333 | elif test -f "${cofile}bj"; then |
||
334 | test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" |
||
335 | fi |
||
336 | |||
337 | rmdir "$lockdir" |
||
338 | exit $ret |
||
339 | |||
340 | # Local Variables: |
||
341 | # mode: shell-script |
||
342 | # sh-indentation: 2 |
||
2010 | jag | 343 | # eval: (add-hook 'before-save-hook 'time-stamp) |
1 | - | 344 | # time-stamp-start: "scriptversion=" |
345 | # time-stamp-format: "%:y-%02m-%02d.%02H" |
||
2010 | jag | 346 | # time-stamp-time-zone: "UTC0" |
1 | - | 347 | # time-stamp-end: "; # UTC" |
348 | # End: |