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