Merge branch 'maint'
[platform/upstream/automake.git] / lib / compile
1 #! /bin/sh
2 # Wrapper for compilers which do not understand `-c -o'.
3
4 scriptversion=2010-11-15.09; # UTC
5
6 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010 Free Software
7 # 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 Win32 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: