Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

klish / aux_scripts / compile @ b81ff592

History | View | Annotate | Download (7.07 KB)

1
#! /bin/sh
2
# Wrapper for compilers which do not understand '-c -o'.
3

    
4
scriptversion=2012-03-05.13; # UTC
5

    
6
# Copyright (C) 1999-2012 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
  done
116
  IFS=$save_IFS
117

    
118
  if test "$found" != yes; then
119
    lib=$lib.lib
120
  fi
121
}
122

    
123
# func_cl_wrapper cl arg...
124
# Adjust compile command to suit cl
125
func_cl_wrapper ()
126
{
127
  # Assume a capable shell
128
  lib_path=
129
  shared=:
130
  linker_opts=
131
  for arg
132
  do
133
    if test -n "$eat"; then
134
      eat=
135
    else
136
      case $1 in
137
	-o)
138
	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
139
	  eat=1
140
	  case $2 in
141
	    *.o | *.[oO][bB][jJ])
142
	      func_file_conv "$2"
143
	      set x "$@" -Fo"$file"
144
	      shift
145
	      ;;
146
	    *)
147
	      func_file_conv "$2"
148
	      set x "$@" -Fe"$file"
149
	      shift
150
	      ;;
151
	  esac
152
	  ;;
153
	-I)
154
	  eat=1
155
	  func_file_conv "$2" mingw
156
	  set x "$@" -I"$file"
157
	  shift
158
	  ;;
159
	-I*)
160
	  func_file_conv "${1#-I}" mingw
161
	  set x "$@" -I"$file"
162
	  shift
163
	  ;;
164
	-l)
165
	  eat=1
166
	  func_cl_dashl "$2"
167
	  set x "$@" "$lib"
168
	  shift
169
	  ;;
170
	-l*)
171
	  func_cl_dashl "${1#-l}"
172
	  set x "$@" "$lib"
173
	  shift
174
	  ;;
175
	-L)
176
	  eat=1
177
	  func_cl_dashL "$2"
178
	  ;;
179
	-L*)
180
	  func_cl_dashL "${1#-L}"
181
	  ;;
182
	-static)
183
	  shared=false
184
	  ;;
185
	-Wl,*)
186
	  arg=${1#-Wl,}
187
	  save_ifs="$IFS"; IFS=','
188
	  for flag in $arg; do
189
	    IFS="$save_ifs"
190
	    linker_opts="$linker_opts $flag"
191
	  done
192
	  IFS="$save_ifs"
193
	  ;;
194
	-Xlinker)
195
	  eat=1
196
	  linker_opts="$linker_opts $2"
197
	  ;;
198
	-*)
199
	  set x "$@" "$1"
200
	  shift
201
	  ;;
202
	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
203
	  func_file_conv "$1"
204
	  set x "$@" -Tp"$file"
205
	  shift
206
	  ;;
207
	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
208
	  func_file_conv "$1" mingw
209
	  set x "$@" "$file"
210
	  shift
211
	  ;;
212
	*)
213
	  set x "$@" "$1"
214
	  shift
215
	  ;;
216
      esac
217
    fi
218
    shift
219
  done
220
  if test -n "$linker_opts"; then
221
    linker_opts="-link$linker_opts"
222
  fi
223
  exec "$@" $linker_opts
224
  exit 1
225
}
226

    
227
eat=
228

    
229
case $1 in
230
  '')
231
     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
232
     exit 1;
233
     ;;
234
  -h | --h*)
235
    cat <<\EOF
236
Usage: compile [--help] [--version] PROGRAM [ARGS]
237

    
238
Wrapper for compilers which do not understand '-c -o'.
239
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
240
arguments, and rename the output as expected.
241

    
242
If you are trying to build a whole package this is not the
243
right script to run: please start by reading the file 'INSTALL'.
244

    
245
Report bugs to <bug-automake@gnu.org>.
246
EOF
247
    exit $?
248
    ;;
249
  -v | --v*)
250
    echo "compile $scriptversion"
251
    exit $?
252
    ;;
253
  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
254
    func_cl_wrapper "$@"      # Doesn't return...
255
    ;;
256
esac
257

    
258
ofile=
259
cfile=
260

    
261
for arg
262
do
263
  if test -n "$eat"; then
264
    eat=
265
  else
266
    case $1 in
267
      -o)
268
	# configure might choose to run compile as 'compile cc -o foo foo.c'.
269
	# So we strip '-o arg' only if arg is an object.
270
	eat=1
271
	case $2 in
272
	  *.o | *.obj)
273
	    ofile=$2
274
	    ;;
275
	  *)
276
	    set x "$@" -o "$2"
277
	    shift
278
	    ;;
279
	esac
280
	;;
281
      *.c)
282
	cfile=$1
283
	set x "$@" "$1"
284
	shift
285
	;;
286
      *)
287
	set x "$@" "$1"
288
	shift
289
	;;
290
    esac
291
  fi
292
  shift
293
done
294

    
295
if test -z "$ofile" || test -z "$cfile"; then
296
  # If no '-o' option was seen then we might have been invoked from a
297
  # pattern rule where we don't need one.  That is ok -- this is a
298
  # normal compilation that the losing compiler can handle.  If no
299
  # '.c' file was seen then we are probably linking.  That is also
300
  # ok.
301
  exec "$@"
302
fi
303

    
304
# Name of file we expect compiler to create.
305
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
306

    
307
# Create the lock directory.
308
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
309
# that we are using for the .o file.  Also, base the name on the expected
310
# object file name, since that is what matters with a parallel build.
311
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
312
while true; do
313
  if mkdir "$lockdir" >/dev/null 2>&1; then
314
    break
315
  fi
316
  sleep 1
317
done
318
# FIXME: race condition here if user kills between mkdir and trap.
319
trap "rmdir '$lockdir'; exit 1" 1 2 15
320

    
321
# Run the compile.
322
"$@"
323
ret=$?
324

    
325
if test -f "$cofile"; then
326
  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
327
elif test -f "${cofile}bj"; then
328
  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
329
fi
330

    
331
rmdir "$lockdir"
332
exit $ret
333

    
334
# Local Variables:
335
# mode: shell-script
336
# sh-indentation: 2
337
# eval: (add-hook 'write-file-hooks 'time-stamp)
338
# time-stamp-start: "scriptversion="
339
# time-stamp-format: "%:y-%02m-%02d.%02H"
340
# time-stamp-time-zone: "UTC"
341
# time-stamp-end: "; # UTC"
342
# End: