]>
Commit | Line | Data |
---|---|---|
1 | #! /bin/sh | |
2 | # Wrapper for compilers which do not understand '-c -o'. | |
3 | ||
4 | scriptversion=2012-10-14.11; # UTC | |
5 | ||
6 | # Copyright (C) 1999-2013 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 <http://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*) | |
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 | 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 | ;; | |
258 | cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) | |
259 | func_cl_wrapper "$@" # Doesn't return... | |
260 | ;; | |
261 | esac | |
262 | ||
263 | ofile= | |
264 | cfile= | |
265 | ||
266 | for arg | |
267 | do | |
268 | if test -n "$eat"; then | |
269 | eat= | |
270 | else | |
271 | case $1 in | |
272 | -o) | |
273 | # configure might choose to run compile as 'compile cc -o foo foo.c'. | |
274 | # So we strip '-o arg' only if arg is an object. | |
275 | eat=1 | |
276 | case $2 in | |
277 | *.o | *.obj) | |
278 | ofile=$2 | |
279 | ;; | |
280 | *) | |
281 | set x "$@" -o "$2" | |
282 | shift | |
283 | ;; | |
284 | esac | |
285 | ;; | |
286 | *.c) | |
287 | cfile=$1 | |
288 | set x "$@" "$1" | |
289 | shift | |
290 | ;; | |
291 | *) | |
292 | set x "$@" "$1" | |
293 | shift | |
294 | ;; | |
295 | esac | |
296 | fi | |
297 | shift | |
298 | done | |
299 | ||
300 | if test -z "$ofile" || test -z "$cfile"; then | |
301 | # If no '-o' option was seen then we might have been invoked from a | |
302 | # pattern rule where we don't need one. That is ok -- this is a | |
303 | # normal compilation that the losing compiler can handle. If no | |
304 | # '.c' file was seen then we are probably linking. That is also | |
305 | # ok. | |
306 | exec "$@" | |
307 | fi | |
308 | ||
309 | # Name of file we expect compiler to create. | |
310 | cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` | |
311 | ||
312 | # Create the lock directory. | |
313 | # Note: use '[/\\:.-]' here to ensure that we don't use the same name | |
314 | # that we are using for the .o file. Also, base the name on the expected | |
315 | # object file name, since that is what matters with a parallel build. | |
316 | lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d | |
317 | while true; do | |
318 | if mkdir "$lockdir" >/dev/null 2>&1; then | |
319 | break | |
320 | fi | |
321 | sleep 1 | |
322 | done | |
323 | # FIXME: race condition here if user kills between mkdir and trap. | |
324 | trap "rmdir '$lockdir'; exit 1" 1 2 15 | |
325 | ||
326 | # Run the compile. | |
327 | "$@" | |
328 | ret=$? | |
329 | ||
330 | if test -f "$cofile"; then | |
331 | test "$cofile" = "$ofile" || mv "$cofile" "$ofile" | |
332 | elif test -f "${cofile}bj"; then | |
333 | test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" | |
334 | fi | |
335 | ||
336 | rmdir "$lockdir" | |
337 | exit $ret | |
338 | ||
339 | # Local Variables: | |
340 | # mode: shell-script | |
341 | # sh-indentation: 2 | |
342 | # eval: (add-hook 'write-file-hooks 'time-stamp) | |
343 | # time-stamp-start: "scriptversion=" | |
344 | # time-stamp-format: "%:y-%02m-%02d.%02H" | |
345 | # time-stamp-time-zone: "UTC" | |
346 | # time-stamp-end: "; # UTC" | |
347 | # End: |