Home | History | Annotate | Line # | Download | only in dist
      1 #! /bin/sh
      2 # Wrapper for Microsoft lib.exe
      3 
      4 me=ar-lib
      5 scriptversion=2024-06-19.01; # UTC
      6 
      7 # Copyright (C) 2010-2024 Free Software Foundation, Inc.
      8 # Written by Peter Rosin <peda (at] lysator.liu.se>.
      9 #
     10 # This program is free software; you can redistribute it and/or modify
     11 # it under the terms of the GNU General Public License as published by
     12 # the Free Software Foundation; either version 2, or (at your option)
     13 # any later version.
     14 #
     15 # This program is distributed in the hope that it will be useful,
     16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18 # GNU General Public License for more details.
     19 #
     20 # You should have received a copy of the GNU General Public License
     21 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
     22 
     23 # As a special exception to the GNU General Public License, if you
     24 # distribute this file as part of a program that contains a
     25 # configuration script generated by Autoconf, you may include it under
     26 # the same distribution terms that you use for the rest of that program.
     27 
     28 # This file is maintained in Automake, please report
     29 # bugs to <bug-automake (at] gnu.org> or send patches to
     30 # <automake-patches (at] gnu.org>.
     31 
     32 
     33 # func_error message
     34 func_error ()
     35 {
     36   echo "$me: $1" 1>&2
     37   exit 1
     38 }
     39 
     40 file_conv=
     41 
     42 # func_file_conv build_file
     43 # Convert a $build file to $host form and store it in $file
     44 # Currently only supports Windows hosts.
     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* | MSYS*)
     57 	    file_conv=cygwin
     58 	    ;;
     59 	  *)
     60 	    file_conv=wine
     61 	    ;;
     62 	esac
     63       fi
     64       case $file_conv in
     65 	mingw)
     66 	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
     67 	  ;;
     68 	cygwin | msys)
     69 	  file=`cygpath -m "$file" || echo "$file"`
     70 	  ;;
     71 	wine)
     72 	  file=`winepath -w "$file" || echo "$file"`
     73 	  ;;
     74       esac
     75       ;;
     76   esac
     77 }
     78 
     79 # func_at_file at_file operation archive
     80 # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
     81 # for each of them.
     82 # When interpreting the content of the @FILE, do NOT use func_file_conv,
     83 # since the user would need to supply preconverted file names to
     84 # binutils ar, at least for MinGW.
     85 func_at_file ()
     86 {
     87   operation=$2
     88   archive=$3
     89   at_file_contents=`cat "$1"`
     90   eval set x "$at_file_contents"
     91   shift
     92 
     93   for member
     94   do
     95     $AR -NOLOGO $operation:"$member" "$archive" || exit $?
     96   done
     97 }
     98 
     99 case $1 in
    100   '')
    101      func_error "no command.  Try '$0 --help' for more information."
    102      ;;
    103   -h | --h*)
    104     cat <<EOF
    105 Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
    106 
    107 Members may be specified in a file named with @FILE.
    108 
    109 Report bugs to <bug-automake@gnu.org>.
    110 GNU Automake home page: <https://www.gnu.org/software/automake/>.
    111 General help using GNU software: <https://www.gnu.org/gethelp/>.
    112 EOF
    113     exit $?
    114     ;;
    115   -v | --v*)
    116     echo "$me (GNU Automake) $scriptversion"
    117     exit $?
    118     ;;
    119 esac
    120 
    121 if test $# -lt 3; then
    122   func_error "you must specify a program, an action and an archive"
    123 fi
    124 
    125 AR=$1
    126 shift
    127 while :
    128 do
    129   if test $# -lt 2; then
    130     func_error "you must specify a program, an action and an archive"
    131   fi
    132   case $1 in
    133     -lib | -LIB \
    134     | -ltcg | -LTCG \
    135     | -machine* | -MACHINE* \
    136     | -subsystem* | -SUBSYSTEM* \
    137     | -verbose | -VERBOSE \
    138     | -wx* | -WX* )
    139       AR="$AR $1"
    140       shift
    141       ;;
    142     -nologo | -NOLOGO)
    143       # We always invoke AR with -nologo, so don't need to add it again.
    144       shift
    145       ;;
    146     *)
    147       action=$1
    148       shift
    149       break
    150       ;;
    151   esac
    152 done
    153 orig_archive=$1
    154 shift
    155 func_file_conv "$orig_archive"
    156 archive=$file
    157 
    158 # strip leading dash in $action
    159 action=${action#-}
    160 
    161 delete=
    162 extract=
    163 list=
    164 quick=
    165 replace=
    166 index=
    167 create=
    168 
    169 while test -n "$action"
    170 do
    171   case $action in
    172     d*) delete=yes  ;;
    173     x*) extract=yes ;;
    174     t*) list=yes    ;;
    175     q*) quick=yes   ;;
    176     r*) replace=yes ;;
    177     s*) index=yes   ;;
    178     S*)             ;; # the index is always updated implicitly
    179     c*) create=yes  ;;
    180     u*)             ;; # TODO: don't ignore the update modifier
    181     v*)             ;; # TODO: don't ignore the verbose modifier
    182     *)
    183       func_error "unknown action specified"
    184       ;;
    185   esac
    186   action=${action#?}
    187 done
    188 
    189 case $delete$extract$list$quick$replace,$index in
    190   yes,* | ,yes)
    191     ;;
    192   yesyes*)
    193     func_error "more than one action specified"
    194     ;;
    195   *)
    196     func_error "no action specified"
    197     ;;
    198 esac
    199 
    200 if test -n "$delete"; then
    201   if test ! -f "$orig_archive"; then
    202     func_error "archive not found"
    203   fi
    204   for member
    205   do
    206     case $1 in
    207       @*)
    208         func_at_file "${1#@}" -REMOVE "$archive"
    209         ;;
    210       *)
    211         func_file_conv "$1"
    212         $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
    213         ;;
    214     esac
    215   done
    216 
    217 elif test -n "$extract"; then
    218   if test ! -f "$orig_archive"; then
    219     func_error "archive not found"
    220   fi
    221   if test $# -gt 0; then
    222     for member
    223     do
    224       case $1 in
    225         @*)
    226           func_at_file "${1#@}" -EXTRACT "$archive"
    227           ;;
    228         *)
    229           func_file_conv "$1"
    230           $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
    231           ;;
    232       esac
    233     done
    234   else
    235     $AR -NOLOGO -LIST "$archive" | tr -d '\r' | sed -e 's/\\/\\\\/g' \
    236       | while read member
    237         do
    238           $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
    239         done
    240   fi
    241 
    242 elif test -n "$quick$replace"; then
    243   if test ! -f "$orig_archive"; then
    244     if test -z "$create"; then
    245       echo "$me: creating $orig_archive"
    246     fi
    247     orig_archive=
    248   else
    249     orig_archive=$archive
    250   fi
    251 
    252   for member
    253   do
    254     case $1 in
    255     @*)
    256       func_file_conv "${1#@}"
    257       set x "$@" "@$file"
    258       ;;
    259     *)
    260       func_file_conv "$1"
    261       set x "$@" "$file"
    262       ;;
    263     esac
    264     shift
    265     shift
    266   done
    267 
    268   if test -n "$orig_archive"; then
    269     $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
    270   else
    271     $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
    272   fi
    273 
    274 elif test -n "$list"; then
    275   if test ! -f "$orig_archive"; then
    276     func_error "archive not found"
    277   fi
    278   $AR -NOLOGO -LIST "$archive" || exit $?
    279 fi
    280