1: #! /bin/sh
2: # Wrapper for compilers which do not understand '-c -o'.
3:
4: scriptversion=2012-01-04.17; # UTC
5:
6: # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free
7: # Software Foundation, Inc.
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:
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_wrapper cl arg...
83: # Adjust compile command to suit cl
84: func_cl_wrapper ()
85: {
86: # Assume a capable shell
87: lib_path=
88: shared=:
89: linker_opts=
90: for arg
91: do
92: if test -n "$eat"; then
93: eat=
94: else
95: case $1 in
96: -o)
97: # configure might choose to run compile as 'compile cc -o foo foo.c'.
98: eat=1
99: case $2 in
100: *.o | *.[oO][bB][jJ])
101: func_file_conv "$2"
102: set x "$@" -Fo"$file"
103: shift
104: ;;
105: *)
106: func_file_conv "$2"
107: set x "$@" -Fe"$file"
108: shift
109: ;;
110: esac
111: ;;
112: -I*)
113: func_file_conv "${1#-I}" mingw
114: set x "$@" -I"$file"
115: shift
116: ;;
117: -l*)
118: lib=${1#-l}
119: found=no
120: save_IFS=$IFS
121: IFS=';'
122: for dir in $lib_path $LIB
123: do
124: IFS=$save_IFS
125: if $shared && test -f "$dir/$lib.dll.lib"; then
126: found=yes
127: set x "$@" "$dir/$lib.dll.lib"
128: break
129: fi
130: if test -f "$dir/$lib.lib"; then
131: found=yes
132: set x "$@" "$dir/$lib.lib"
133: break
134: fi
135: done
136: IFS=$save_IFS
137:
138: test "$found" != yes && set x "$@" "$lib.lib"
139: shift
140: ;;
141: -L*)
142: func_file_conv "${1#-L}"
143: if test -z "$lib_path"; then
144: lib_path=$file
145: else
146: lib_path="$lib_path;$file"
147: fi
148: linker_opts="$linker_opts -LIBPATH:$file"
149: ;;
150: -static)
151: shared=false
152: ;;
153: -Wl,*)
154: arg=${1#-Wl,}
155: save_ifs="$IFS"; IFS=','
156: for flag in $arg; do
157: IFS="$save_ifs"
158: linker_opts="$linker_opts $flag"
159: done
160: IFS="$save_ifs"
161: ;;
162: -Xlinker)
163: eat=1
164: linker_opts="$linker_opts $2"
165: ;;
166: -*)
167: set x "$@" "$1"
168: shift
169: ;;
170: *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
171: func_file_conv "$1"
172: set x "$@" -Tp"$file"
173: shift
174: ;;
175: *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
176: func_file_conv "$1" mingw
177: set x "$@" "$file"
178: shift
179: ;;
180: *)
181: set x "$@" "$1"
182: shift
183: ;;
184: esac
185: fi
186: shift
187: done
188: if test -n "$linker_opts"; then
189: linker_opts="-link$linker_opts"
190: fi
191: exec "$@" $linker_opts
192: exit 1
193: }
194:
195: eat=
196:
197: case $1 in
198: '')
199: echo "$0: No command. Try '$0 --help' for more information." 1>&2
200: exit 1;
201: ;;
202: -h | --h*)
203: cat <<\EOF
204: Usage: compile [--help] [--version] PROGRAM [ARGS]
205:
206: Wrapper for compilers which do not understand '-c -o'.
207: Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
208: arguments, and rename the output as expected.
209:
210: If you are trying to build a whole package this is not the
211: right script to run: please start by reading the file 'INSTALL'.
212:
213: Report bugs to <bug-automake@gnu.org>.
214: EOF
215: exit $?
216: ;;
217: -v | --v*)
218: echo "compile $scriptversion"
219: exit $?
220: ;;
221: cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
222: func_cl_wrapper "$@" # Doesn't return...
223: ;;
224: esac
225:
226: ofile=
227: cfile=
228:
229: for arg
230: do
231: if test -n "$eat"; then
232: eat=
233: else
234: case $1 in
235: -o)
236: # configure might choose to run compile as 'compile cc -o foo foo.c'.
237: # So we strip '-o arg' only if arg is an object.
238: eat=1
239: case $2 in
240: *.o | *.obj)
241: ofile=$2
242: ;;
243: *)
244: set x "$@" -o "$2"
245: shift
246: ;;
247: esac
248: ;;
249: *.c)
250: cfile=$1
251: set x "$@" "$1"
252: shift
253: ;;
254: *)
255: set x "$@" "$1"
256: shift
257: ;;
258: esac
259: fi
260: shift
261: done
262:
263: if test -z "$ofile" || test -z "$cfile"; then
264: # If no '-o' option was seen then we might have been invoked from a
265: # pattern rule where we don't need one. That is ok -- this is a
266: # normal compilation that the losing compiler can handle. If no
267: # '.c' file was seen then we are probably linking. That is also
268: # ok.
269: exec "$@"
270: fi
271:
272: # Name of file we expect compiler to create.
273: cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
274:
275: # Create the lock directory.
276: # Note: use '[/\\:.-]' here to ensure that we don't use the same name
277: # that we are using for the .o file. Also, base the name on the expected
278: # object file name, since that is what matters with a parallel build.
279: lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
280: while true; do
281: if mkdir "$lockdir" >/dev/null 2>&1; then
282: break
283: fi
284: sleep 1
285: done
286: # FIXME: race condition here if user kills between mkdir and trap.
287: trap "rmdir '$lockdir'; exit 1" 1 2 15
288:
289: # Run the compile.
290: "$@"
291: ret=$?
292:
293: if test -f "$cofile"; then
294: test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
295: elif test -f "${cofile}bj"; then
296: test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
297: fi
298:
299: rmdir "$lockdir"
300: exit $ret
301:
302: # Local Variables:
303: # mode: shell-script
304: # sh-indentation: 2
305: # eval: (add-hook 'write-file-hooks 'time-stamp)
306: # time-stamp-start: "scriptversion="
307: # time-stamp-format: "%:y-%02m-%02d.%02H"
308: # time-stamp-time-zone: "UTC"
309: # time-stamp-end: "; # UTC"
310: # End:
CVSweb interface <joel.bertrand@systella.fr>