Annotation of parser3/compile, revision 1.2

1.1       moko        1: #! /bin/sh
                      2: # Wrapper for compilers which do not understand '-c -o'.
                      3: 
1.2     ! moko        4: scriptversion=2024-06-19.01; # UTC
1.1       moko        5: 
1.2     ! moko        6: # Copyright (C) 1999-2024 Free Software Foundation, Inc.
1.1       moko        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
1.2     ! moko       20: # along with this program.  If not, see <https://www.gnu.org/licenses/>.
1.1       moko       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:            ;;
1.2     ! moko       56:          CYGWIN* | MSYS*)
1.1       moko       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:          ;;
1.2     ! moko       70:        cygwin/* | msys/*)
1.1       moko       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
1.2     ! moko      146:            *.o | *.lo | *.[oO][bB][jJ])
1.1       moko      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 <bug-automake@gnu.org>.
1.2     ! moko      251: GNU Automake home page: <https://www.gnu.org/software/automake/>.
        !           252: General help using GNU software: <https://www.gnu.org/gethelp/>.
1.1       moko      253: EOF
                    254:     exit $?
                    255:     ;;
                    256:   -v | --v*)
1.2     ! moko      257:     echo "compile (GNU Automake) $scriptversion"
1.1       moko      258:     exit $?
                    259:     ;;
1.2     ! moko      260:   cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
        !           261:   clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \
        !           262:   icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
1.1       moko      263:     func_cl_wrapper "$@"      # Doesn't return...
                    264:     ;;
                    265: esac
                    266: 
                    267: ofile=
                    268: cfile=
                    269: 
                    270: for arg
                    271: do
                    272:   if test -n "$eat"; then
                    273:     eat=
                    274:   else
                    275:     case $1 in
                    276:       -o)
                    277:        # configure might choose to run compile as 'compile cc -o foo foo.c'.
                    278:        # So we strip '-o arg' only if arg is an object.
                    279:        eat=1
                    280:        case $2 in
                    281:          *.o | *.obj)
                    282:            ofile=$2
                    283:            ;;
                    284:          *)
                    285:            set x "$@" -o "$2"
                    286:            shift
                    287:            ;;
                    288:        esac
                    289:        ;;
                    290:       *.c)
                    291:        cfile=$1
                    292:        set x "$@" "$1"
                    293:        shift
                    294:        ;;
                    295:       *)
                    296:        set x "$@" "$1"
                    297:        shift
                    298:        ;;
                    299:     esac
                    300:   fi
                    301:   shift
                    302: done
                    303: 
                    304: if test -z "$ofile" || test -z "$cfile"; then
                    305:   # If no '-o' option was seen then we might have been invoked from a
                    306:   # pattern rule where we don't need one.  That is ok -- this is a
                    307:   # normal compilation that the losing compiler can handle.  If no
                    308:   # '.c' file was seen then we are probably linking.  That is also
                    309:   # ok.
                    310:   exec "$@"
                    311: fi
                    312: 
                    313: # Name of file we expect compiler to create.
                    314: cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
                    315: 
                    316: # Create the lock directory.
                    317: # Note: use '[/\\:.-]' here to ensure that we don't use the same name
                    318: # that we are using for the .o file.  Also, base the name on the expected
                    319: # object file name, since that is what matters with a parallel build.
                    320: lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
                    321: while true; do
                    322:   if mkdir "$lockdir" >/dev/null 2>&1; then
                    323:     break
                    324:   fi
                    325:   sleep 1
                    326: done
                    327: # FIXME: race condition here if user kills between mkdir and trap.
                    328: trap "rmdir '$lockdir'; exit 1" 1 2 15
                    329: 
                    330: # Run the compile.
                    331: "$@"
                    332: ret=$?
                    333: 
                    334: if test -f "$cofile"; then
                    335:   test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
                    336: elif test -f "${cofile}bj"; then
                    337:   test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
                    338: fi
                    339: 
                    340: rmdir "$lockdir"
                    341: exit $ret
                    342: 
                    343: # Local Variables:
                    344: # mode: shell-script
                    345: # sh-indentation: 2
1.2     ! moko      346: # eval: (add-hook 'before-save-hook 'time-stamp)
1.1       moko      347: # time-stamp-start: "scriptversion="
                    348: # time-stamp-format: "%:y-%02m-%02d.%02H"
1.2     ! moko      349: # time-stamp-time-zone: "UTC0"
1.1       moko      350: # time-stamp-end: "; # UTC"
                    351: # End:

E-mail: