Annotation of embedaddon/confuse/support/compile, revision 1.1.1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>