Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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