Home | History | Annotate | Download | only in dist
      1 #! /bin/sh
      2 # Wrapper for Microsoft lib.exe
      3 
      4 me=ar-lib
      5 scriptversion=2012-03-01.08; # UTC
      6 
      7 # Copyright (C) 2010-2014 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 <http://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*)
     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)
     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 EOF
    109     exit $?
    110     ;;
    111   -v | --v*)
    112     echo "$me, version $scriptversion"
    113     exit $?
    114     ;;
    115 esac
    116 
    117 if test $# -lt 3; then
    118   func_error "you must specify a program, an action and an archive"
    119 fi
    120 
    121 AR=$1
    122 shift
    123 while :
    124 do
    125   if test $# -lt 2; then
    126     func_error "you must specify a program, an action and an archive"
    127   fi
    128   case $1 in
    129     -lib | -LIB \
    130     | -ltcg | -LTCG \
    131     | -machine* | -MACHINE* \
    132     | -subsystem* | -SUBSYSTEM* \
    133     | -verbose | -VERBOSE \
    134     | -wx* | -WX* )
    135       AR="$AR $1"
    136       shift
    137       ;;
    138     *)
    139       action=$1
    140       shift
    141       break
    142       ;;
    143   esac
    144 done
    145 orig_archive=$1
    146 shift
    147 func_file_conv "$orig_archive"
    148 archive=$file
    149 
    150 # strip leading dash in $action
    151 action=${action#-}
    152 
    153 delete=
    154 extract=
    155 list=
    156 quick=
    157 replace=
    158 index=
    159 create=
    160 
    161 while test -n "$action"
    162 do
    163   case $action in
    164     d*) delete=yes  ;;
    165     x*) extract=yes ;;
    166     t*) list=yes    ;;
    167     q*) quick=yes   ;;
    168     r*) replace=yes ;;
    169     s*) index=yes   ;;
    170     S*)             ;; # the index is always updated implicitly
    171     c*) create=yes  ;;
    172     u*)             ;; # TODO: don't ignore the update modifier
    173     v*)             ;; # TODO: don't ignore the verbose modifier
    174     *)
    175       func_error "unknown action specified"
    176       ;;
    177   esac
    178   action=${action#?}
    179 done
    180 
    181 case $delete$extract$list$quick$replace,$index in
    182   yes,* | ,yes)
    183     ;;
    184   yesyes*)
    185     func_error "more than one action specified"
    186     ;;
    187   *)
    188     func_error "no action specified"
    189     ;;
    190 esac
    191 
    192 if test -n "$delete"; then
    193   if test ! -f "$orig_archive"; then
    194     func_error "archive not found"
    195   fi
    196   for member
    197   do
    198     case $1 in
    199       @*)
    200         func_at_file "${1#@}" -REMOVE "$archive"
    201         ;;
    202       *)
    203         func_file_conv "$1"
    204         $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
    205         ;;
    206     esac
    207   done
    208 
    209 elif test -n "$extract"; then
    210   if test ! -f "$orig_archive"; then
    211     func_error "archive not found"
    212   fi
    213   if test $# -gt 0; then
    214     for member
    215     do
    216       case $1 in
    217         @*)
    218           func_at_file "${1#@}" -EXTRACT "$archive"
    219           ;;
    220         *)
    221           func_file_conv "$1"
    222           $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
    223           ;;
    224       esac
    225     done
    226   else
    227     $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
    228     do
    229       $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
    230     done
    231   fi
    232 
    233 elif test -n "$quick$replace"; then
    234   if test ! -f "$orig_archive"; then
    235     if test -z "$create"; then
    236       echo "$me: creating $orig_archive"
    237     fi
    238     orig_archive=
    239   else
    240     orig_archive=$archive
    241   fi
    242 
    243   for member
    244   do
    245     case $1 in
    246     @*)
    247       func_file_conv "${1#@}"
    248       set x "$@" "@$file"
    249       ;;
    250     *)
    251       func_file_conv "$1"
    252       set x "$@" "$file"
    253       ;;
    254     esac
    255     shift
    256     shift
    257   done
    258 
    259   if test -n "$orig_archive"; then
    260     $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
    261   else
    262     $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
    263   fi
    264 
    265 elif test -n "$list"; then
    266   if test ! -f "$orig_archive"; then
    267     func_error "archive not found"
    268   fi
    269   $AR -NOLOGO -LIST "$archive" || exit $?
    270 fi
    271