autoupdate
[pspp] / build-aux / compile
1 #! /bin/sh
2 # Wrapper for compilers which do not understand `-c -o'.
3
4 scriptversion=2010-09-21.14; # 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 case $1 in
196   '')
197      echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
198      exit 1;
199      ;;
200   -h | --h*)
201     cat <<\EOF
202 Usage: compile [--help] [--version] PROGRAM [ARGS]
203
204 Wrapper for compilers which do not understand `-c -o'.
205 Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
206 arguments, and rename the output as expected.
207
208 If you are trying to build a whole package this is not the
209 right script to run: please start by reading the file `INSTALL'.
210
211 Report bugs to <bug-automake@gnu.org>.
212 EOF
213     exit $?
214     ;;
215   -v | --v*)
216     echo "compile $scriptversion"
217     exit $?
218     ;;
219   cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
220     func_cl_wrapper "$@"      # Doesn't return...
221     ;;
222 esac
223
224 ofile=
225 cfile=
226 eat=
227
228 for arg
229 do
230   if test -n "$eat"; then
231     eat=
232   else
233     case $1 in
234       -o)
235         # configure might choose to run compile as `compile cc -o foo foo.c'.
236         # So we strip `-o arg' only if arg is an object.
237         eat=1
238         case $2 in
239           *.o | *.obj)
240             ofile=$2
241             ;;
242           *)
243             set x "$@" -o "$2"
244             shift
245             ;;
246         esac
247         ;;
248       *.c)
249         cfile=$1
250         set x "$@" "$1"
251         shift
252         ;;
253       *)
254         set x "$@" "$1"
255         shift
256         ;;
257     esac
258   fi
259   shift
260 done
261
262 if test -z "$ofile" || test -z "$cfile"; then
263   # If no `-o' option was seen then we might have been invoked from a
264   # pattern rule where we don't need one.  That is ok -- this is a
265   # normal compilation that the losing compiler can handle.  If no
266   # `.c' file was seen then we are probably linking.  That is also
267   # ok.
268   exec "$@"
269 fi
270
271 # Name of file we expect compiler to create.
272 cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
273
274 # Create the lock directory.
275 # Note: use `[/\\:.-]' here to ensure that we don't use the same name
276 # that we are using for the .o file.  Also, base the name on the expected
277 # object file name, since that is what matters with a parallel build.
278 lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
279 while true; do
280   if mkdir "$lockdir" >/dev/null 2>&1; then
281     break
282   fi
283   sleep 1
284 done
285 # FIXME: race condition here if user kills between mkdir and trap.
286 trap "rmdir '$lockdir'; exit 1" 1 2 15
287
288 # Run the compile.
289 "$@"
290 ret=$?
291
292 if test -f "$cofile"; then
293   test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
294 elif test -f "${cofile}bj"; then
295   test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
296 fi
297
298 rmdir "$lockdir"
299 exit $ret
300
301 # Local Variables:
302 # mode: shell-script
303 # sh-indentation: 2
304 # eval: (add-hook 'write-file-hooks 'time-stamp)
305 # time-stamp-start: "scriptversion="
306 # time-stamp-format: "%:y-%02m-%02d.%02H"
307 # time-stamp-time-zone: "UTC"
308 # time-stamp-end: "; # UTC"
309 # End: