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