compile revision ae545d91
17cea3689Smrg#! /bin/sh
27cea3689Smrg# Wrapper for compilers which do not understand '-c -o'.
37cea3689Smrg
4ae545d91Smrgscriptversion=2024-06-19.01; # UTC
57cea3689Smrg
6ae545d91Smrg# Copyright (C) 1999-2024 Free Software Foundation, Inc.
77cea3689Smrg# Written by Tom Tromey <tromey@cygnus.com>.
87cea3689Smrg#
97cea3689Smrg# This program is free software; you can redistribute it and/or modify
107cea3689Smrg# it under the terms of the GNU General Public License as published by
117cea3689Smrg# the Free Software Foundation; either version 2, or (at your option)
127cea3689Smrg# any later version.
137cea3689Smrg#
147cea3689Smrg# This program is distributed in the hope that it will be useful,
157cea3689Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
167cea3689Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
177cea3689Smrg# GNU General Public License for more details.
187cea3689Smrg#
197cea3689Smrg# You should have received a copy of the GNU General Public License
2095b7a5c8Smrg# along with this program.  If not, see <https://www.gnu.org/licenses/>.
217cea3689Smrg
227cea3689Smrg# As a special exception to the GNU General Public License, if you
237cea3689Smrg# distribute this file as part of a program that contains a
247cea3689Smrg# configuration script generated by Autoconf, you may include it under
257cea3689Smrg# the same distribution terms that you use for the rest of that program.
267cea3689Smrg
277cea3689Smrg# This file is maintained in Automake, please report
287cea3689Smrg# bugs to <bug-automake@gnu.org> or send patches to
297cea3689Smrg# <automake-patches@gnu.org>.
307cea3689Smrg
317cea3689Smrgnl='
327cea3689Smrg'
337cea3689Smrg
347cea3689Smrg# We need space, tab and new line, in precisely that order.  Quoting is
357cea3689Smrg# there to prevent tools from complaining about whitespace usage.
367cea3689SmrgIFS=" ""	$nl"
377cea3689Smrg
387cea3689Smrgfile_conv=
397cea3689Smrg
407cea3689Smrg# func_file_conv build_file lazy
417cea3689Smrg# Convert a $build file to $host form and store it in $file
427cea3689Smrg# Currently only supports Windows hosts. If the determined conversion
437cea3689Smrg# type is listed in (the comma separated) LAZY, no conversion will
447cea3689Smrg# take place.
457cea3689Smrgfunc_file_conv ()
467cea3689Smrg{
477cea3689Smrg  file=$1
487cea3689Smrg  case $file in
497cea3689Smrg    / | /[!/]*) # absolute file, and not a UNC file
507cea3689Smrg      if test -z "$file_conv"; then
517cea3689Smrg	# lazily determine how to convert abs files
527cea3689Smrg	case `uname -s` in
537cea3689Smrg	  MINGW*)
547cea3689Smrg	    file_conv=mingw
557cea3689Smrg	    ;;
5695b7a5c8Smrg	  CYGWIN* | MSYS*)
577cea3689Smrg	    file_conv=cygwin
587cea3689Smrg	    ;;
597cea3689Smrg	  *)
607cea3689Smrg	    file_conv=wine
617cea3689Smrg	    ;;
627cea3689Smrg	esac
637cea3689Smrg      fi
647cea3689Smrg      case $file_conv/,$2, in
657cea3689Smrg	*,$file_conv,*)
667cea3689Smrg	  ;;
677cea3689Smrg	mingw/*)
687cea3689Smrg	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
697cea3689Smrg	  ;;
7095b7a5c8Smrg	cygwin/* | msys/*)
717cea3689Smrg	  file=`cygpath -m "$file" || echo "$file"`
727cea3689Smrg	  ;;
737cea3689Smrg	wine/*)
747cea3689Smrg	  file=`winepath -w "$file" || echo "$file"`
757cea3689Smrg	  ;;
767cea3689Smrg      esac
777cea3689Smrg      ;;
787cea3689Smrg  esac
797cea3689Smrg}
807cea3689Smrg
817cea3689Smrg# func_cl_dashL linkdir
827cea3689Smrg# Make cl look for libraries in LINKDIR
837cea3689Smrgfunc_cl_dashL ()
847cea3689Smrg{
857cea3689Smrg  func_file_conv "$1"
867cea3689Smrg  if test -z "$lib_path"; then
877cea3689Smrg    lib_path=$file
887cea3689Smrg  else
897cea3689Smrg    lib_path="$lib_path;$file"
907cea3689Smrg  fi
917cea3689Smrg  linker_opts="$linker_opts -LIBPATH:$file"
927cea3689Smrg}
937cea3689Smrg
947cea3689Smrg# func_cl_dashl library
957cea3689Smrg# Do a library search-path lookup for cl
967cea3689Smrgfunc_cl_dashl ()
977cea3689Smrg{
987cea3689Smrg  lib=$1
997cea3689Smrg  found=no
1007cea3689Smrg  save_IFS=$IFS
1017cea3689Smrg  IFS=';'
1027cea3689Smrg  for dir in $lib_path $LIB
1037cea3689Smrg  do
1047cea3689Smrg    IFS=$save_IFS
1057cea3689Smrg    if $shared && test -f "$dir/$lib.dll.lib"; then
1067cea3689Smrg      found=yes
1077cea3689Smrg      lib=$dir/$lib.dll.lib
1087cea3689Smrg      break
1097cea3689Smrg    fi
1107cea3689Smrg    if test -f "$dir/$lib.lib"; then
1117cea3689Smrg      found=yes
1127cea3689Smrg      lib=$dir/$lib.lib
1137cea3689Smrg      break
1147cea3689Smrg    fi
1157cea3689Smrg    if test -f "$dir/lib$lib.a"; then
1167cea3689Smrg      found=yes
1177cea3689Smrg      lib=$dir/lib$lib.a
1187cea3689Smrg      break
1197cea3689Smrg    fi
1207cea3689Smrg  done
1217cea3689Smrg  IFS=$save_IFS
1227cea3689Smrg
1237cea3689Smrg  if test "$found" != yes; then
1247cea3689Smrg    lib=$lib.lib
1257cea3689Smrg  fi
1267cea3689Smrg}
1277cea3689Smrg
1287cea3689Smrg# func_cl_wrapper cl arg...
1297cea3689Smrg# Adjust compile command to suit cl
1307cea3689Smrgfunc_cl_wrapper ()
1317cea3689Smrg{
1327cea3689Smrg  # Assume a capable shell
1337cea3689Smrg  lib_path=
1347cea3689Smrg  shared=:
1357cea3689Smrg  linker_opts=
1367cea3689Smrg  for arg
1377cea3689Smrg  do
1387cea3689Smrg    if test -n "$eat"; then
1397cea3689Smrg      eat=
1407cea3689Smrg    else
1417cea3689Smrg      case $1 in
1427cea3689Smrg	-o)
1437cea3689Smrg	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
1447cea3689Smrg	  eat=1
1457cea3689Smrg	  case $2 in
146ae545d91Smrg	    *.o | *.lo | *.[oO][bB][jJ])
1477cea3689Smrg	      func_file_conv "$2"
1487cea3689Smrg	      set x "$@" -Fo"$file"
1497cea3689Smrg	      shift
1507cea3689Smrg	      ;;
1517cea3689Smrg	    *)
1527cea3689Smrg	      func_file_conv "$2"
1537cea3689Smrg	      set x "$@" -Fe"$file"
1547cea3689Smrg	      shift
1557cea3689Smrg	      ;;
1567cea3689Smrg	  esac
1577cea3689Smrg	  ;;
1587cea3689Smrg	-I)
1597cea3689Smrg	  eat=1
1607cea3689Smrg	  func_file_conv "$2" mingw
1617cea3689Smrg	  set x "$@" -I"$file"
1627cea3689Smrg	  shift
1637cea3689Smrg	  ;;
1647cea3689Smrg	-I*)
1657cea3689Smrg	  func_file_conv "${1#-I}" mingw
1667cea3689Smrg	  set x "$@" -I"$file"
1677cea3689Smrg	  shift
1687cea3689Smrg	  ;;
1697cea3689Smrg	-l)
1707cea3689Smrg	  eat=1
1717cea3689Smrg	  func_cl_dashl "$2"
1727cea3689Smrg	  set x "$@" "$lib"
1737cea3689Smrg	  shift
1747cea3689Smrg	  ;;
1757cea3689Smrg	-l*)
1767cea3689Smrg	  func_cl_dashl "${1#-l}"
1777cea3689Smrg	  set x "$@" "$lib"
1787cea3689Smrg	  shift
1797cea3689Smrg	  ;;
1807cea3689Smrg	-L)
1817cea3689Smrg	  eat=1
1827cea3689Smrg	  func_cl_dashL "$2"
1837cea3689Smrg	  ;;
1847cea3689Smrg	-L*)
1857cea3689Smrg	  func_cl_dashL "${1#-L}"
1867cea3689Smrg	  ;;
1877cea3689Smrg	-static)
1887cea3689Smrg	  shared=false
1897cea3689Smrg	  ;;
1907cea3689Smrg	-Wl,*)
1917cea3689Smrg	  arg=${1#-Wl,}
1927cea3689Smrg	  save_ifs="$IFS"; IFS=','
1937cea3689Smrg	  for flag in $arg; do
1947cea3689Smrg	    IFS="$save_ifs"
1957cea3689Smrg	    linker_opts="$linker_opts $flag"
1967cea3689Smrg	  done
1977cea3689Smrg	  IFS="$save_ifs"
1987cea3689Smrg	  ;;
1997cea3689Smrg	-Xlinker)
2007cea3689Smrg	  eat=1
2017cea3689Smrg	  linker_opts="$linker_opts $2"
2027cea3689Smrg	  ;;
2037cea3689Smrg	-*)
2047cea3689Smrg	  set x "$@" "$1"
2057cea3689Smrg	  shift
2067cea3689Smrg	  ;;
2077cea3689Smrg	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
2087cea3689Smrg	  func_file_conv "$1"
2097cea3689Smrg	  set x "$@" -Tp"$file"
2107cea3689Smrg	  shift
2117cea3689Smrg	  ;;
2127cea3689Smrg	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
2137cea3689Smrg	  func_file_conv "$1" mingw
2147cea3689Smrg	  set x "$@" "$file"
2157cea3689Smrg	  shift
2167cea3689Smrg	  ;;
2177cea3689Smrg	*)
2187cea3689Smrg	  set x "$@" "$1"
2197cea3689Smrg	  shift
2207cea3689Smrg	  ;;
2217cea3689Smrg      esac
2227cea3689Smrg    fi
2237cea3689Smrg    shift
2247cea3689Smrg  done
2257cea3689Smrg  if test -n "$linker_opts"; then
2267cea3689Smrg    linker_opts="-link$linker_opts"
2277cea3689Smrg  fi
2287cea3689Smrg  exec "$@" $linker_opts
2297cea3689Smrg  exit 1
2307cea3689Smrg}
2317cea3689Smrg
2327cea3689Smrgeat=
2337cea3689Smrg
2347cea3689Smrgcase $1 in
2357cea3689Smrg  '')
2367cea3689Smrg     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
2377cea3689Smrg     exit 1;
2387cea3689Smrg     ;;
2397cea3689Smrg  -h | --h*)
2407cea3689Smrg    cat <<\EOF
2417cea3689SmrgUsage: compile [--help] [--version] PROGRAM [ARGS]
2427cea3689Smrg
2437cea3689SmrgWrapper for compilers which do not understand '-c -o'.
2447cea3689SmrgRemove '-o dest.o' from ARGS, run PROGRAM with the remaining
2457cea3689Smrgarguments, and rename the output as expected.
2467cea3689Smrg
2477cea3689SmrgIf you are trying to build a whole package this is not the
2487cea3689Smrgright script to run: please start by reading the file 'INSTALL'.
2497cea3689Smrg
2507cea3689SmrgReport bugs to <bug-automake@gnu.org>.
251ae545d91SmrgGNU Automake home page: <https://www.gnu.org/software/automake/>.
252ae545d91SmrgGeneral help using GNU software: <https://www.gnu.org/gethelp/>.
2537cea3689SmrgEOF
2547cea3689Smrg    exit $?
2557cea3689Smrg    ;;
2567cea3689Smrg  -v | --v*)
257ae545d91Smrg    echo "compile (GNU Automake) $scriptversion"
2587cea3689Smrg    exit $?
2597cea3689Smrg    ;;
26095b7a5c8Smrg  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
261ae545d91Smrg  clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \
26295b7a5c8Smrg  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
2637cea3689Smrg    func_cl_wrapper "$@"      # Doesn't return...
2647cea3689Smrg    ;;
2657cea3689Smrgesac
2667cea3689Smrg
2677cea3689Smrgofile=
2687cea3689Smrgcfile=
2697cea3689Smrg
2707cea3689Smrgfor arg
2717cea3689Smrgdo
2727cea3689Smrg  if test -n "$eat"; then
2737cea3689Smrg    eat=
2747cea3689Smrg  else
2757cea3689Smrg    case $1 in
2767cea3689Smrg      -o)
2777cea3689Smrg	# configure might choose to run compile as 'compile cc -o foo foo.c'.
2787cea3689Smrg	# So we strip '-o arg' only if arg is an object.
2797cea3689Smrg	eat=1
2807cea3689Smrg	case $2 in
2817cea3689Smrg	  *.o | *.obj)
2827cea3689Smrg	    ofile=$2
2837cea3689Smrg	    ;;
2847cea3689Smrg	  *)
2857cea3689Smrg	    set x "$@" -o "$2"
2867cea3689Smrg	    shift
2877cea3689Smrg	    ;;
2887cea3689Smrg	esac
2897cea3689Smrg	;;
2907cea3689Smrg      *.c)
2917cea3689Smrg	cfile=$1
2927cea3689Smrg	set x "$@" "$1"
2937cea3689Smrg	shift
2947cea3689Smrg	;;
2957cea3689Smrg      *)
2967cea3689Smrg	set x "$@" "$1"
2977cea3689Smrg	shift
2987cea3689Smrg	;;
2997cea3689Smrg    esac
3007cea3689Smrg  fi
3017cea3689Smrg  shift
3027cea3689Smrgdone
3037cea3689Smrg
3047cea3689Smrgif test -z "$ofile" || test -z "$cfile"; then
3057cea3689Smrg  # If no '-o' option was seen then we might have been invoked from a
3067cea3689Smrg  # pattern rule where we don't need one.  That is ok -- this is a
3077cea3689Smrg  # normal compilation that the losing compiler can handle.  If no
3087cea3689Smrg  # '.c' file was seen then we are probably linking.  That is also
3097cea3689Smrg  # ok.
3107cea3689Smrg  exec "$@"
3117cea3689Smrgfi
3127cea3689Smrg
3137cea3689Smrg# Name of file we expect compiler to create.
3147cea3689Smrgcofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
3157cea3689Smrg
3167cea3689Smrg# Create the lock directory.
3177cea3689Smrg# Note: use '[/\\:.-]' here to ensure that we don't use the same name
3187cea3689Smrg# that we are using for the .o file.  Also, base the name on the expected
3197cea3689Smrg# object file name, since that is what matters with a parallel build.
3207cea3689Smrglockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
3217cea3689Smrgwhile true; do
3227cea3689Smrg  if mkdir "$lockdir" >/dev/null 2>&1; then
3237cea3689Smrg    break
3247cea3689Smrg  fi
3257cea3689Smrg  sleep 1
3267cea3689Smrgdone
3277cea3689Smrg# FIXME: race condition here if user kills between mkdir and trap.
3287cea3689Smrgtrap "rmdir '$lockdir'; exit 1" 1 2 15
3297cea3689Smrg
3307cea3689Smrg# Run the compile.
3317cea3689Smrg"$@"
3327cea3689Smrgret=$?
3337cea3689Smrg
3347cea3689Smrgif test -f "$cofile"; then
3357cea3689Smrg  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
3367cea3689Smrgelif test -f "${cofile}bj"; then
3377cea3689Smrg  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
3387cea3689Smrgfi
3397cea3689Smrg
3407cea3689Smrgrmdir "$lockdir"
3417cea3689Smrgexit $ret
3427cea3689Smrg
3437cea3689Smrg# Local Variables:
3447cea3689Smrg# mode: shell-script
3457cea3689Smrg# sh-indentation: 2
34695b7a5c8Smrg# eval: (add-hook 'before-save-hook 'time-stamp)
3477cea3689Smrg# time-stamp-start: "scriptversion="
3487cea3689Smrg# time-stamp-format: "%:y-%02m-%02d.%02H"
34995b7a5c8Smrg# time-stamp-time-zone: "UTC0"
3507cea3689Smrg# time-stamp-end: "; # UTC"
3517cea3689Smrg# End:
352