xref: /libtiff-4.0.7/config/compile (revision a17a6e5e)
1d1e97bf2SAndrey Kiselev#! /bin/sh
2d1be5cb7SEven Rouault# Wrapper for compilers which do not understand '-c -o'.
3d1e97bf2SAndrey Kiselev
4d1be5cb7SEven Rouaultscriptversion=2012-10-14.11; # UTC
5d1e97bf2SAndrey Kiselev
6*a17a6e5eSEven Rouault# Copyright (C) 1999-2014 Free Software Foundation, Inc.
7d1e97bf2SAndrey Kiselev# Written by Tom Tromey <[email protected]>.
8d1e97bf2SAndrey Kiselev#
9d1e97bf2SAndrey Kiselev# This program is free software; you can redistribute it and/or modify
10d1e97bf2SAndrey Kiselev# it under the terms of the GNU General Public License as published by
11d1e97bf2SAndrey Kiselev# the Free Software Foundation; either version 2, or (at your option)
12d1e97bf2SAndrey Kiselev# any later version.
13d1e97bf2SAndrey Kiselev#
14d1e97bf2SAndrey Kiselev# This program is distributed in the hope that it will be useful,
15d1e97bf2SAndrey Kiselev# but WITHOUT ANY WARRANTY; without even the implied warranty of
16d1e97bf2SAndrey Kiselev# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17d1e97bf2SAndrey Kiselev# GNU General Public License for more details.
18d1e97bf2SAndrey Kiselev#
19d1e97bf2SAndrey Kiselev# You should have received a copy of the GNU General Public License
20d1be5cb7SEven Rouault# along with this program.  If not, see <http://www.gnu.org/licenses/>.
21d1e97bf2SAndrey Kiselev
22d1e97bf2SAndrey Kiselev# As a special exception to the GNU General Public License, if you
23d1e97bf2SAndrey Kiselev# distribute this file as part of a program that contains a
24d1e97bf2SAndrey Kiselev# configuration script generated by Autoconf, you may include it under
25d1e97bf2SAndrey Kiselev# the same distribution terms that you use for the rest of that program.
26d1e97bf2SAndrey Kiselev
27d1e97bf2SAndrey Kiselev# This file is maintained in Automake, please report
28d1e97bf2SAndrey Kiselev# bugs to <[email protected]> or send patches to
29d1e97bf2SAndrey Kiselev# <[email protected]>.
30d1e97bf2SAndrey Kiselev
31d1be5cb7SEven Rouaultnl='
32d1be5cb7SEven Rouault'
33d1be5cb7SEven Rouault
34d1be5cb7SEven Rouault# We need space, tab and new line, in precisely that order.  Quoting is
35d1be5cb7SEven Rouault# there to prevent tools from complaining about whitespace usage.
36d1be5cb7SEven RouaultIFS=" ""	$nl"
37d1be5cb7SEven Rouault
38d1be5cb7SEven Rouaultfile_conv=
39d1be5cb7SEven Rouault
40d1be5cb7SEven Rouault# func_file_conv build_file lazy
41d1be5cb7SEven Rouault# Convert a $build file to $host form and store it in $file
42d1be5cb7SEven Rouault# Currently only supports Windows hosts. If the determined conversion
43d1be5cb7SEven Rouault# type is listed in (the comma separated) LAZY, no conversion will
44d1be5cb7SEven Rouault# take place.
45d1be5cb7SEven Rouaultfunc_file_conv ()
46d1be5cb7SEven Rouault{
47d1be5cb7SEven Rouault  file=$1
48d1be5cb7SEven Rouault  case $file in
49d1be5cb7SEven Rouault    / | /[!/]*) # absolute file, and not a UNC file
50d1be5cb7SEven Rouault      if test -z "$file_conv"; then
51d1be5cb7SEven Rouault	# lazily determine how to convert abs files
52d1be5cb7SEven Rouault	case `uname -s` in
53d1be5cb7SEven Rouault	  MINGW*)
54d1be5cb7SEven Rouault	    file_conv=mingw
55d1be5cb7SEven Rouault	    ;;
56d1be5cb7SEven Rouault	  CYGWIN*)
57d1be5cb7SEven Rouault	    file_conv=cygwin
58d1be5cb7SEven Rouault	    ;;
59d1be5cb7SEven Rouault	  *)
60d1be5cb7SEven Rouault	    file_conv=wine
61d1be5cb7SEven Rouault	    ;;
62d1be5cb7SEven Rouault	esac
63d1be5cb7SEven Rouault      fi
64d1be5cb7SEven Rouault      case $file_conv/,$2, in
65d1be5cb7SEven Rouault	*,$file_conv,*)
66d1be5cb7SEven Rouault	  ;;
67d1be5cb7SEven Rouault	mingw/*)
68d1be5cb7SEven Rouault	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
69d1be5cb7SEven Rouault	  ;;
70d1be5cb7SEven Rouault	cygwin/*)
71d1be5cb7SEven Rouault	  file=`cygpath -m "$file" || echo "$file"`
72d1be5cb7SEven Rouault	  ;;
73d1be5cb7SEven Rouault	wine/*)
74d1be5cb7SEven Rouault	  file=`winepath -w "$file" || echo "$file"`
75d1be5cb7SEven Rouault	  ;;
76d1be5cb7SEven Rouault      esac
77d1be5cb7SEven Rouault      ;;
78d1be5cb7SEven Rouault  esac
79d1be5cb7SEven Rouault}
80d1be5cb7SEven Rouault
81d1be5cb7SEven Rouault# func_cl_dashL linkdir
82d1be5cb7SEven Rouault# Make cl look for libraries in LINKDIR
83d1be5cb7SEven Rouaultfunc_cl_dashL ()
84d1be5cb7SEven Rouault{
85d1be5cb7SEven Rouault  func_file_conv "$1"
86d1be5cb7SEven Rouault  if test -z "$lib_path"; then
87d1be5cb7SEven Rouault    lib_path=$file
88d1be5cb7SEven Rouault  else
89d1be5cb7SEven Rouault    lib_path="$lib_path;$file"
90d1be5cb7SEven Rouault  fi
91d1be5cb7SEven Rouault  linker_opts="$linker_opts -LIBPATH:$file"
92d1be5cb7SEven Rouault}
93d1be5cb7SEven Rouault
94d1be5cb7SEven Rouault# func_cl_dashl library
95d1be5cb7SEven Rouault# Do a library search-path lookup for cl
96d1be5cb7SEven Rouaultfunc_cl_dashl ()
97d1be5cb7SEven Rouault{
98d1be5cb7SEven Rouault  lib=$1
99d1be5cb7SEven Rouault  found=no
100d1be5cb7SEven Rouault  save_IFS=$IFS
101d1be5cb7SEven Rouault  IFS=';'
102d1be5cb7SEven Rouault  for dir in $lib_path $LIB
103d1be5cb7SEven Rouault  do
104d1be5cb7SEven Rouault    IFS=$save_IFS
105d1be5cb7SEven Rouault    if $shared && test -f "$dir/$lib.dll.lib"; then
106d1be5cb7SEven Rouault      found=yes
107d1be5cb7SEven Rouault      lib=$dir/$lib.dll.lib
108d1be5cb7SEven Rouault      break
109d1be5cb7SEven Rouault    fi
110d1be5cb7SEven Rouault    if test -f "$dir/$lib.lib"; then
111d1be5cb7SEven Rouault      found=yes
112d1be5cb7SEven Rouault      lib=$dir/$lib.lib
113d1be5cb7SEven Rouault      break
114d1be5cb7SEven Rouault    fi
115d1be5cb7SEven Rouault    if test -f "$dir/lib$lib.a"; then
116d1be5cb7SEven Rouault      found=yes
117d1be5cb7SEven Rouault      lib=$dir/lib$lib.a
118d1be5cb7SEven Rouault      break
119d1be5cb7SEven Rouault    fi
120d1be5cb7SEven Rouault  done
121d1be5cb7SEven Rouault  IFS=$save_IFS
122d1be5cb7SEven Rouault
123d1be5cb7SEven Rouault  if test "$found" != yes; then
124d1be5cb7SEven Rouault    lib=$lib.lib
125d1be5cb7SEven Rouault  fi
126d1be5cb7SEven Rouault}
127d1be5cb7SEven Rouault
128d1be5cb7SEven Rouault# func_cl_wrapper cl arg...
129d1be5cb7SEven Rouault# Adjust compile command to suit cl
130d1be5cb7SEven Rouaultfunc_cl_wrapper ()
131d1be5cb7SEven Rouault{
132d1be5cb7SEven Rouault  # Assume a capable shell
133d1be5cb7SEven Rouault  lib_path=
134d1be5cb7SEven Rouault  shared=:
135d1be5cb7SEven Rouault  linker_opts=
136d1be5cb7SEven Rouault  for arg
137d1be5cb7SEven Rouault  do
138d1be5cb7SEven Rouault    if test -n "$eat"; then
139d1be5cb7SEven Rouault      eat=
140d1be5cb7SEven Rouault    else
141d1be5cb7SEven Rouault      case $1 in
142d1be5cb7SEven Rouault	-o)
143d1be5cb7SEven Rouault	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
144d1be5cb7SEven Rouault	  eat=1
145d1be5cb7SEven Rouault	  case $2 in
146d1be5cb7SEven Rouault	    *.o | *.[oO][bB][jJ])
147d1be5cb7SEven Rouault	      func_file_conv "$2"
148d1be5cb7SEven Rouault	      set x "$@" -Fo"$file"
149d1be5cb7SEven Rouault	      shift
150d1be5cb7SEven Rouault	      ;;
151d1be5cb7SEven Rouault	    *)
152d1be5cb7SEven Rouault	      func_file_conv "$2"
153d1be5cb7SEven Rouault	      set x "$@" -Fe"$file"
154d1be5cb7SEven Rouault	      shift
155d1be5cb7SEven Rouault	      ;;
156d1be5cb7SEven Rouault	  esac
157d1be5cb7SEven Rouault	  ;;
158d1be5cb7SEven Rouault	-I)
159d1be5cb7SEven Rouault	  eat=1
160d1be5cb7SEven Rouault	  func_file_conv "$2" mingw
161d1be5cb7SEven Rouault	  set x "$@" -I"$file"
162d1be5cb7SEven Rouault	  shift
163d1be5cb7SEven Rouault	  ;;
164d1be5cb7SEven Rouault	-I*)
165d1be5cb7SEven Rouault	  func_file_conv "${1#-I}" mingw
166d1be5cb7SEven Rouault	  set x "$@" -I"$file"
167d1be5cb7SEven Rouault	  shift
168d1be5cb7SEven Rouault	  ;;
169d1be5cb7SEven Rouault	-l)
170d1be5cb7SEven Rouault	  eat=1
171d1be5cb7SEven Rouault	  func_cl_dashl "$2"
172d1be5cb7SEven Rouault	  set x "$@" "$lib"
173d1be5cb7SEven Rouault	  shift
174d1be5cb7SEven Rouault	  ;;
175d1be5cb7SEven Rouault	-l*)
176d1be5cb7SEven Rouault	  func_cl_dashl "${1#-l}"
177d1be5cb7SEven Rouault	  set x "$@" "$lib"
178d1be5cb7SEven Rouault	  shift
179d1be5cb7SEven Rouault	  ;;
180d1be5cb7SEven Rouault	-L)
181d1be5cb7SEven Rouault	  eat=1
182d1be5cb7SEven Rouault	  func_cl_dashL "$2"
183d1be5cb7SEven Rouault	  ;;
184d1be5cb7SEven Rouault	-L*)
185d1be5cb7SEven Rouault	  func_cl_dashL "${1#-L}"
186d1be5cb7SEven Rouault	  ;;
187d1be5cb7SEven Rouault	-static)
188d1be5cb7SEven Rouault	  shared=false
189d1be5cb7SEven Rouault	  ;;
190d1be5cb7SEven Rouault	-Wl,*)
191d1be5cb7SEven Rouault	  arg=${1#-Wl,}
192d1be5cb7SEven Rouault	  save_ifs="$IFS"; IFS=','
193d1be5cb7SEven Rouault	  for flag in $arg; do
194d1be5cb7SEven Rouault	    IFS="$save_ifs"
195d1be5cb7SEven Rouault	    linker_opts="$linker_opts $flag"
196d1be5cb7SEven Rouault	  done
197d1be5cb7SEven Rouault	  IFS="$save_ifs"
198d1be5cb7SEven Rouault	  ;;
199d1be5cb7SEven Rouault	-Xlinker)
200d1be5cb7SEven Rouault	  eat=1
201d1be5cb7SEven Rouault	  linker_opts="$linker_opts $2"
202d1be5cb7SEven Rouault	  ;;
203d1be5cb7SEven Rouault	-*)
204d1be5cb7SEven Rouault	  set x "$@" "$1"
205d1be5cb7SEven Rouault	  shift
206d1be5cb7SEven Rouault	  ;;
207d1be5cb7SEven Rouault	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
208d1be5cb7SEven Rouault	  func_file_conv "$1"
209d1be5cb7SEven Rouault	  set x "$@" -Tp"$file"
210d1be5cb7SEven Rouault	  shift
211d1be5cb7SEven Rouault	  ;;
212d1be5cb7SEven Rouault	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
213d1be5cb7SEven Rouault	  func_file_conv "$1" mingw
214d1be5cb7SEven Rouault	  set x "$@" "$file"
215d1be5cb7SEven Rouault	  shift
216d1be5cb7SEven Rouault	  ;;
217d1be5cb7SEven Rouault	*)
218d1be5cb7SEven Rouault	  set x "$@" "$1"
219d1be5cb7SEven Rouault	  shift
220d1be5cb7SEven Rouault	  ;;
221d1be5cb7SEven Rouault      esac
222d1be5cb7SEven Rouault    fi
223d1be5cb7SEven Rouault    shift
224d1be5cb7SEven Rouault  done
225d1be5cb7SEven Rouault  if test -n "$linker_opts"; then
226d1be5cb7SEven Rouault    linker_opts="-link$linker_opts"
227d1be5cb7SEven Rouault  fi
228d1be5cb7SEven Rouault  exec "$@" $linker_opts
229d1be5cb7SEven Rouault  exit 1
230d1be5cb7SEven Rouault}
231d1be5cb7SEven Rouault
232d1be5cb7SEven Rouaulteat=
233d1be5cb7SEven Rouault
234d1e97bf2SAndrey Kiselevcase $1 in
235d1e97bf2SAndrey Kiselev  '')
236d1be5cb7SEven Rouault     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
237d1e97bf2SAndrey Kiselev     exit 1;
238d1e97bf2SAndrey Kiselev     ;;
239d1e97bf2SAndrey Kiselev  -h | --h*)
240d1e97bf2SAndrey Kiselev    cat <<\EOF
241d1e97bf2SAndrey KiselevUsage: compile [--help] [--version] PROGRAM [ARGS]
242d1e97bf2SAndrey Kiselev
243d1be5cb7SEven RouaultWrapper for compilers which do not understand '-c -o'.
244d1be5cb7SEven RouaultRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
245d1e97bf2SAndrey Kiselevarguments, and rename the output as expected.
246d1e97bf2SAndrey Kiselev
247d1e97bf2SAndrey KiselevIf you are trying to build a whole package this is not the
248d1be5cb7SEven Rouaultright script to run: please start by reading the file 'INSTALL'.
249d1e97bf2SAndrey Kiselev
250d1e97bf2SAndrey KiselevReport bugs to <bug-automake@gnu.org>.
251d1e97bf2SAndrey KiselevEOF
252f714980aSAndrey Kiselev    exit $?
253d1e97bf2SAndrey Kiselev    ;;
254d1e97bf2SAndrey Kiselev  -v | --v*)
255d1e97bf2SAndrey Kiselev    echo "compile $scriptversion"
256f714980aSAndrey Kiselev    exit $?
257d1e97bf2SAndrey Kiselev    ;;
258d1be5cb7SEven Rouault  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
259d1be5cb7SEven Rouault    func_cl_wrapper "$@"      # Doesn't return...
260d1be5cb7SEven Rouault    ;;
261d1e97bf2SAndrey Kiselevesac
262d1e97bf2SAndrey Kiselev
263d1e97bf2SAndrey Kiselevofile=
264d1e97bf2SAndrey Kiselevcfile=
265d1e97bf2SAndrey Kiselev
266d1e97bf2SAndrey Kiselevfor arg
267d1e97bf2SAndrey Kiselevdo
268d1e97bf2SAndrey Kiselev  if test -n "$eat"; then
269d1e97bf2SAndrey Kiselev    eat=
270d1e97bf2SAndrey Kiselev  else
271d1e97bf2SAndrey Kiselev    case $1 in
272d1e97bf2SAndrey Kiselev      -o)
273d1be5cb7SEven Rouault	# configure might choose to run compile as 'compile cc -o foo foo.c'.
274d1be5cb7SEven Rouault	# So we strip '-o arg' only if arg is an object.
275d1e97bf2SAndrey Kiselev	eat=1
276d1e97bf2SAndrey Kiselev	case $2 in
277d1e97bf2SAndrey Kiselev	  *.o | *.obj)
278d1e97bf2SAndrey Kiselev	    ofile=$2
279d1e97bf2SAndrey Kiselev	    ;;
280d1e97bf2SAndrey Kiselev	  *)
281d1e97bf2SAndrey Kiselev	    set x "$@" -o "$2"
282d1e97bf2SAndrey Kiselev	    shift
283d1e97bf2SAndrey Kiselev	    ;;
284d1e97bf2SAndrey Kiselev	esac
285d1e97bf2SAndrey Kiselev	;;
286d1e97bf2SAndrey Kiselev      *.c)
287d1e97bf2SAndrey Kiselev	cfile=$1
288d1e97bf2SAndrey Kiselev	set x "$@" "$1"
289d1e97bf2SAndrey Kiselev	shift
290d1e97bf2SAndrey Kiselev	;;
291d1e97bf2SAndrey Kiselev      *)
292d1e97bf2SAndrey Kiselev	set x "$@" "$1"
293d1e97bf2SAndrey Kiselev	shift
294d1e97bf2SAndrey Kiselev	;;
295d1e97bf2SAndrey Kiselev    esac
296d1e97bf2SAndrey Kiselev  fi
297d1e97bf2SAndrey Kiselev  shift
298d1e97bf2SAndrey Kiselevdone
299d1e97bf2SAndrey Kiselev
300d1e97bf2SAndrey Kiselevif test -z "$ofile" || test -z "$cfile"; then
301d1be5cb7SEven Rouault  # If no '-o' option was seen then we might have been invoked from a
302d1e97bf2SAndrey Kiselev  # pattern rule where we don't need one.  That is ok -- this is a
303d1e97bf2SAndrey Kiselev  # normal compilation that the losing compiler can handle.  If no
304d1be5cb7SEven Rouault  # '.c' file was seen then we are probably linking.  That is also
305d1e97bf2SAndrey Kiselev  # ok.
306d1e97bf2SAndrey Kiselev  exec "$@"
307d1e97bf2SAndrey Kiselevfi
308d1e97bf2SAndrey Kiselev
309d1e97bf2SAndrey Kiselev# Name of file we expect compiler to create.
310d1be5cb7SEven Rouaultcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
311d1e97bf2SAndrey Kiselev
312d1e97bf2SAndrey Kiselev# Create the lock directory.
313d1be5cb7SEven Rouault# Note: use '[/\\:.-]' here to ensure that we don't use the same name
314d1e97bf2SAndrey Kiselev# that we are using for the .o file.  Also, base the name on the expected
315d1e97bf2SAndrey Kiselev# object file name, since that is what matters with a parallel build.
316d1be5cb7SEven Rouaultlockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
317d1e97bf2SAndrey Kiselevwhile true; do
318d1e97bf2SAndrey Kiselev  if mkdir "$lockdir" >/dev/null 2>&1; then
319d1e97bf2SAndrey Kiselev    break
320d1e97bf2SAndrey Kiselev  fi
321d1e97bf2SAndrey Kiselev  sleep 1
322d1e97bf2SAndrey Kiselevdone
323d1e97bf2SAndrey Kiselev# FIXME: race condition here if user kills between mkdir and trap.
324d1e97bf2SAndrey Kiselevtrap "rmdir '$lockdir'; exit 1" 1 2 15
325d1e97bf2SAndrey Kiselev
326d1e97bf2SAndrey Kiselev# Run the compile.
327d1e97bf2SAndrey Kiselev"$@"
328d1e97bf2SAndrey Kiselevret=$?
329d1e97bf2SAndrey Kiselev
330d1e97bf2SAndrey Kiselevif test -f "$cofile"; then
331d1be5cb7SEven Rouault  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
332f714980aSAndrey Kiselevelif test -f "${cofile}bj"; then
333d1be5cb7SEven Rouault  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
334d1e97bf2SAndrey Kiselevfi
335d1e97bf2SAndrey Kiselev
336d1e97bf2SAndrey Kiselevrmdir "$lockdir"
337d1e97bf2SAndrey Kiselevexit $ret
338d1e97bf2SAndrey Kiselev
339d1e97bf2SAndrey Kiselev# Local Variables:
340d1e97bf2SAndrey Kiselev# mode: shell-script
341d1e97bf2SAndrey Kiselev# sh-indentation: 2
342d1e97bf2SAndrey Kiselev# eval: (add-hook 'write-file-hooks 'time-stamp)
343d1e97bf2SAndrey Kiselev# time-stamp-start: "scriptversion="
344d1e97bf2SAndrey Kiselev# time-stamp-format: "%:y-%02m-%02d.%02H"
345d1be5cb7SEven Rouault# time-stamp-time-zone: "UTC"
346d1be5cb7SEven Rouault# time-stamp-end: "; # UTC"
347d1e97bf2SAndrey Kiselev# End:
348