aboutsummaryrefslogtreecommitdiff
path: root/compile
diff options
context:
space:
mode:
Diffstat (limited to 'compile')
-rwxr-xr-xcompile315
1 files changed, 261 insertions, 54 deletions
diff --git a/compile b/compile
index a81e000..862a14e 100755
--- a/compile
+++ b/compile
@@ -1,9 +1,10 @@
1#! /bin/sh 1#! /bin/sh
2# Wrapper for compilers which do not understand `-c -o'. 2# Wrapper for compilers which do not understand '-c -o'.
3 3
4scriptversion=2003-11-09.00 4scriptversion=2012-03-05.13; # UTC
5 5
6# Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc. 6# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free
7# Software Foundation, Inc.
7# Written by Tom Tromey <tromey@cygnus.com>. 8# Written by Tom Tromey <tromey@cygnus.com>.
8# 9#
9# This program is free software; you can redistribute it and/or modify 10# This program is free software; you can redistribute it and/or modify
@@ -17,8 +18,7 @@ scriptversion=2003-11-09.00
17# GNU General Public License for more details. 18# GNU General Public License for more details.
18# 19#
19# You should have received a copy of the GNU General Public License 20# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software 21# along with this program. If not, see <http://www.gnu.org/licenses/>.
21# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 22
23# As a special exception to the GNU General Public License, if you 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 24# distribute this file as part of a program that contains a
@@ -29,102 +29,308 @@ scriptversion=2003-11-09.00
29# bugs to <bug-automake@gnu.org> or send patches to 29# bugs to <bug-automake@gnu.org> or send patches to
30# <automake-patches@gnu.org>. 30# <automake-patches@gnu.org>.
31 31
32nl='
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.
37IFS=" "" $nl"
38
39file_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.
46func_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
84func_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
97func_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
126func_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
228eat=
229
32case $1 in 230case $1 in
33 '') 231 '')
34 echo "$0: No command. Try \`$0 --help' for more information." 1>&2 232 echo "$0: No command. Try '$0 --help' for more information." 1>&2
35 exit 1; 233 exit 1;
36 ;; 234 ;;
37 -h | --h*) 235 -h | --h*)
38 cat <<\EOF 236 cat <<\EOF
39Usage: compile [--help] [--version] PROGRAM [ARGS] 237Usage: compile [--help] [--version] PROGRAM [ARGS]
40 238
41Wrapper for compilers which do not understand `-c -o'. 239Wrapper for compilers which do not understand '-c -o'.
42Remove `-o dest.o' from ARGS, run PROGRAM with the remaining 240Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
43arguments, and rename the output as expected. 241arguments, and rename the output as expected.
44 242
45If you are trying to build a whole package this is not the 243If you are trying to build a whole package this is not the
46right script to run: please start by reading the file `INSTALL'. 244right script to run: please start by reading the file 'INSTALL'.
47 245
48Report bugs to <bug-automake@gnu.org>. 246Report bugs to <bug-automake@gnu.org>.
49EOF 247EOF
50 exit 0 248 exit $?
51 ;; 249 ;;
52 -v | --v*) 250 -v | --v*)
53 echo "compile $scriptversion" 251 echo "compile $scriptversion"
54 exit 0 252 exit $?
253 ;;
254 cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
255 func_cl_wrapper "$@" # Doesn't return...
55 ;; 256 ;;
56esac 257esac
57 258
58
59prog=$1
60shift
61
62ofile= 259ofile=
63cfile= 260cfile=
64args= 261
65while test $# -gt 0; do 262for arg
66 case "$1" in 263do
67 -o) 264 if test -n "$eat"; then
68 # configure might choose to run compile as `compile cc -o foo foo.c'. 265 eat=
69 # So we do something ugly here. 266 else
70 ofile=$2 267 case $1 in
71 shift 268 -o)
72 case "$ofile" in 269 # configure might choose to run compile as 'compile cc -o foo foo.c'.
73 *.o | *.obj) 270 # So we strip '-o arg' only if arg is an object.
74 ;; 271 eat=1
75 *) 272 case $2 in
76 args="$args -o $ofile" 273 *.o | *.obj)
77 ofile= 274 ofile=$2
78 ;; 275 ;;
79 esac 276 *)
80 ;; 277 set x "$@" -o "$2"
81 *.c) 278 shift
82 cfile=$1 279 ;;
83 args="$args $1" 280 esac
84 ;; 281 ;;
85 *) 282 *.c)
86 args="$args $1" 283 cfile=$1
87 ;; 284 set x "$@" "$1"
88 esac 285 shift
286 ;;
287 *)
288 set x "$@" "$1"
289 shift
290 ;;
291 esac
292 fi
89 shift 293 shift
90done 294done
91 295
92if test -z "$ofile" || test -z "$cfile"; then 296if test -z "$ofile" || test -z "$cfile"; then
93 # If no `-o' option was seen then we might have been invoked from a 297 # If no '-o' option was seen then we might have been invoked from a
94 # pattern rule where we don't need one. That is ok -- this is a 298 # pattern rule where we don't need one. That is ok -- this is a
95 # normal compilation that the losing compiler can handle. If no 299 # normal compilation that the losing compiler can handle. If no
96 # `.c' file was seen then we are probably linking. That is also 300 # '.c' file was seen then we are probably linking. That is also
97 # ok. 301 # ok.
98 exec "$prog" $args 302 exec "$@"
99fi 303fi
100 304
101# Name of file we expect compiler to create. 305# Name of file we expect compiler to create.
102cofile=`echo $cfile | sed -e 's|^.*/||' -e 's/\.c$/.o/'` 306cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
103 307
104# Create the lock directory. 308# Create the lock directory.
105# Note: use `[/.-]' here to ensure that we don't use the same name 309# Note: use '[/\\:.-]' here to ensure that we don't use the same name
106# that we are using for the .o file. Also, base the name on the expected 310# that we are using for the .o file. Also, base the name on the expected
107# object file name, since that is what matters with a parallel build. 311# object file name, since that is what matters with a parallel build.
108lockdir=`echo $cofile | sed -e 's|[/.-]|_|g'`.d 312lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
109while true; do 313while true; do
110 if mkdir $lockdir > /dev/null 2>&1; then 314 if mkdir "$lockdir" >/dev/null 2>&1; then
111 break 315 break
112 fi 316 fi
113 sleep 1 317 sleep 1
114done 318done
115# FIXME: race condition here if user kills between mkdir and trap. 319# FIXME: race condition here if user kills between mkdir and trap.
116trap "rmdir $lockdir; exit 1" 1 2 15 320trap "rmdir '$lockdir'; exit 1" 1 2 15
117 321
118# Run the compile. 322# Run the compile.
119"$prog" $args 323"$@"
120status=$? 324ret=$?
121 325
122if test -f "$cofile"; then 326if test -f "$cofile"; then
123 mv "$cofile" "$ofile" 327 test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
328elif test -f "${cofile}bj"; then
329 test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
124fi 330fi
125 331
126rmdir $lockdir 332rmdir "$lockdir"
127exit $status 333exit $ret
128 334
129# Local Variables: 335# Local Variables:
130# mode: shell-script 336# mode: shell-script
@@ -132,5 +338,6 @@ exit $status
132# eval: (add-hook 'write-file-hooks 'time-stamp) 338# eval: (add-hook 'write-file-hooks 'time-stamp)
133# time-stamp-start: "scriptversion=" 339# time-stamp-start: "scriptversion="
134# time-stamp-format: "%:y-%02m-%02d.%02H" 340# time-stamp-format: "%:y-%02m-%02d.%02H"
135# time-stamp-end: "$" 341# time-stamp-time-zone: "UTC"
342# time-stamp-end: "; # UTC"
136# End: 343# End: