1 | #! /bin/sh |
---|
2 | # Wrapper for compilers which do not understand '-c -o'. |
---|
3 | |
---|
4 | scriptversion=2018-03-07.03; # UTC |
---|
5 | |
---|
6 | # Copyright (C) 1999-2018 Free Software Foundation, Inc. |
---|
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 |
---|
20 | # along with this program. If not, see <https://www.gnu.org/licenses/>. |
---|
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* | MSYS* ) |
---|
54 | file_conv=mingw |
---|
55 | ;; |
---|
56 | CYGWIN*) |
---|
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 | ;; |
---|
70 | cygwin/*) |
---|
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 | outfile= |
---|
137 | implib= |
---|
138 | linking=1 |
---|
139 | for arg |
---|
140 | do |
---|
141 | if test -n "$eat"; then |
---|
142 | eat= |
---|
143 | else |
---|
144 | case $1 in |
---|
145 | -o) |
---|
146 | # configure might choose to run compile as 'compile cc -o foo foo.c'. |
---|
147 | eat=1 |
---|
148 | case $2 in |
---|
149 | *.o | *.[oO][bB][jJ]) |
---|
150 | func_file_conv "$2" |
---|
151 | set x "$@" -Fo"$file" |
---|
152 | shift |
---|
153 | outfile="$file" |
---|
154 | ;; |
---|
155 | *) |
---|
156 | func_file_conv "$2" |
---|
157 | set x "$@" -Fe"$file" |
---|
158 | shift |
---|
159 | outfile="$file" |
---|
160 | ;; |
---|
161 | esac |
---|
162 | ;; |
---|
163 | -I) |
---|
164 | eat=1 |
---|
165 | func_file_conv "$2" mingw |
---|
166 | set x "$@" -I"$file" |
---|
167 | shift |
---|
168 | ;; |
---|
169 | -I*) |
---|
170 | func_file_conv "${1#-I}" mingw |
---|
171 | set x "$@" -I"$file" |
---|
172 | shift |
---|
173 | ;; |
---|
174 | -l) |
---|
175 | eat=1 |
---|
176 | func_cl_dashl "$2" |
---|
177 | set x "$@" "$lib" |
---|
178 | shift |
---|
179 | ;; |
---|
180 | -l*) |
---|
181 | func_cl_dashl "${1#-l}" |
---|
182 | set x "$@" "$lib" |
---|
183 | shift |
---|
184 | ;; |
---|
185 | -L) |
---|
186 | eat=1 |
---|
187 | func_cl_dashL "$2" |
---|
188 | ;; |
---|
189 | -L*) |
---|
190 | func_cl_dashL "${1#-L}" |
---|
191 | ;; |
---|
192 | -static) |
---|
193 | shared=false |
---|
194 | ;; |
---|
195 | -Wl,*) |
---|
196 | arg=${1#-Wl,} |
---|
197 | save_ifs="$IFS"; IFS=',' |
---|
198 | for flag in $arg; do |
---|
199 | IFS="$save_ifs" |
---|
200 | linker_opts="$linker_opts $flag" |
---|
201 | case "$flag" in -IMPLIB:*) implib=${flag#-IMPLIB:} ;; esac |
---|
202 | done |
---|
203 | IFS="$save_ifs" |
---|
204 | ;; |
---|
205 | -Xlinker) |
---|
206 | eat=1 |
---|
207 | linker_opts="$linker_opts $2" |
---|
208 | ;; |
---|
209 | -*) |
---|
210 | set x "$@" "$1" |
---|
211 | shift |
---|
212 | ;; |
---|
213 | *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) |
---|
214 | func_file_conv "$1" |
---|
215 | set x "$@" -Tp"$file" |
---|
216 | shift |
---|
217 | ;; |
---|
218 | *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) |
---|
219 | func_file_conv "$1" mingw |
---|
220 | set x "$@" "$file" |
---|
221 | shift |
---|
222 | ;; |
---|
223 | -c) |
---|
224 | linking=0 |
---|
225 | set x "$@" "$1" |
---|
226 | shift |
---|
227 | ;; |
---|
228 | *) |
---|
229 | set x "$@" "$1" |
---|
230 | shift |
---|
231 | ;; |
---|
232 | esac |
---|
233 | fi |
---|
234 | shift |
---|
235 | done |
---|
236 | if test -n "$linker_opts"; then |
---|
237 | linker_opts="-link$linker_opts" |
---|
238 | fi |
---|
239 | # remove old $implib, so we can distinguish between generated and not-generated implib below |
---|
240 | if test -n "$implib" && test -f "$implib" ; then rm "$implib" ; fi |
---|
241 | |
---|
242 | # add path to MSVC link in front on PATH if we seem to link (check isn't so accurate, but some false-positives shouldn't matter) |
---|
243 | # compiler will call the link it finds in the PATH, and we don't want it to use MSYS' /bin/link |
---|
244 | # we assume that MSVC link is in same directory as cl and that cl is found in PATH |
---|
245 | if test "$linking" = 1 && comppath=`which cl 2>/dev/null` ; then |
---|
246 | comppath=`dirname "$comppath"` |
---|
247 | #echo "Adding $comppath to front of PATH" |
---|
248 | PATH="$comppath:$PATH" |
---|
249 | fi |
---|
250 | |
---|
251 | #echo "compile: $@ $linker_opts" |
---|
252 | "$@" $linker_opts || exit $? |
---|
253 | |
---|
254 | # if -implib got lost or ignored, then the lib should be named ${outfile/.dll/.lib} and we rename that file |
---|
255 | if test -n "$implib" && test ! -f "$implib" ; then |
---|
256 | echo "compile: mv ${outfile/.dll/.lib} $implib" |
---|
257 | mv "${outfile/.dll/.lib}" "$implib" |
---|
258 | fi |
---|
259 | |
---|
260 | exit 0 |
---|
261 | } |
---|
262 | |
---|
263 | eat= |
---|
264 | |
---|
265 | case $1 in |
---|
266 | '') |
---|
267 | echo "$0: No command. Try '$0 --help' for more information." 1>&2 |
---|
268 | exit 1; |
---|
269 | ;; |
---|
270 | -h | --h*) |
---|
271 | cat <<\EOF |
---|
272 | Usage: compile [--help] [--version] PROGRAM [ARGS] |
---|
273 | |
---|
274 | Wrapper for compilers which do not understand '-c -o'. |
---|
275 | Remove '-o dest.o' from ARGS, run PROGRAM with the remaining |
---|
276 | arguments, and rename the output as expected. |
---|
277 | |
---|
278 | If you are trying to build a whole package this is not the |
---|
279 | right script to run: please start by reading the file 'INSTALL'. |
---|
280 | |
---|
281 | Report bugs to <bug-automake@gnu.org>. |
---|
282 | EOF |
---|
283 | exit $? |
---|
284 | ;; |
---|
285 | -v | --v*) |
---|
286 | echo "compile $scriptversion" |
---|
287 | exit $? |
---|
288 | ;; |
---|
289 | cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ |
---|
290 | icl | *[/\\]icl | icl.exe | *[/\\]icl.exe | \ |
---|
291 | ifort | *[/\\]ifort | ifort.exe | *[/\\]ifort.exe ) |
---|
292 | func_cl_wrapper "$@" # Doesn't return... |
---|
293 | ;; |
---|
294 | esac |
---|
295 | |
---|
296 | ofile= |
---|
297 | cfile= |
---|
298 | |
---|
299 | for arg |
---|
300 | do |
---|
301 | if test -n "$eat"; then |
---|
302 | eat= |
---|
303 | else |
---|
304 | case $1 in |
---|
305 | -o) |
---|
306 | # configure might choose to run compile as 'compile cc -o foo foo.c'. |
---|
307 | # So we strip '-o arg' only if arg is an object. |
---|
308 | eat=1 |
---|
309 | case $2 in |
---|
310 | *.o | *.obj) |
---|
311 | ofile=$2 |
---|
312 | ;; |
---|
313 | *) |
---|
314 | set x "$@" -o "$2" |
---|
315 | shift |
---|
316 | ;; |
---|
317 | esac |
---|
318 | ;; |
---|
319 | *.c) |
---|
320 | cfile=$1 |
---|
321 | set x "$@" "$1" |
---|
322 | shift |
---|
323 | ;; |
---|
324 | *) |
---|
325 | set x "$@" "$1" |
---|
326 | shift |
---|
327 | ;; |
---|
328 | esac |
---|
329 | fi |
---|
330 | shift |
---|
331 | done |
---|
332 | |
---|
333 | if test -z "$ofile" || test -z "$cfile"; then |
---|
334 | # If no '-o' option was seen then we might have been invoked from a |
---|
335 | # pattern rule where we don't need one. That is ok -- this is a |
---|
336 | # normal compilation that the losing compiler can handle. If no |
---|
337 | # '.c' file was seen then we are probably linking. That is also |
---|
338 | # ok. |
---|
339 | exec "$@" |
---|
340 | fi |
---|
341 | |
---|
342 | # Name of file we expect compiler to create. |
---|
343 | cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` |
---|
344 | |
---|
345 | # Create the lock directory. |
---|
346 | # Note: use '[/\\:.-]' here to ensure that we don't use the same name |
---|
347 | # that we are using for the .o file. Also, base the name on the expected |
---|
348 | # object file name, since that is what matters with a parallel build. |
---|
349 | lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d |
---|
350 | while true; do |
---|
351 | if mkdir "$lockdir" >/dev/null 2>&1; then |
---|
352 | break |
---|
353 | fi |
---|
354 | sleep 1 |
---|
355 | done |
---|
356 | # FIXME: race condition here if user kills between mkdir and trap. |
---|
357 | trap "rmdir '$lockdir'; exit 1" 1 2 15 |
---|
358 | |
---|
359 | # Run the compile. |
---|
360 | "$@" |
---|
361 | ret=$? |
---|
362 | |
---|
363 | if test -f "$cofile"; then |
---|
364 | test "$cofile" = "$ofile" || mv "$cofile" "$ofile" |
---|
365 | elif test -f "${cofile}bj"; then |
---|
366 | test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" |
---|
367 | fi |
---|
368 | |
---|
369 | rmdir "$lockdir" |
---|
370 | exit $ret |
---|
371 | |
---|
372 | # Local Variables: |
---|
373 | # mode: shell-script |
---|
374 | # sh-indentation: 2 |
---|
375 | # eval: (add-hook 'before-save-hook 'time-stamp) |
---|
376 | # time-stamp-start: "scriptversion=" |
---|
377 | # time-stamp-format: "%:y-%02m-%02d.%02H" |
---|
378 | # time-stamp-time-zone: "UTC0" |
---|
379 | # time-stamp-end: "; # UTC" |
---|
380 | # End: |
---|