config/ar-lib
d39cb658
 #! /bin/sh
 # Wrapper for Microsoft lib.exe
 
 me=ar-lib
 scriptversion=2012-03-01.08; # UTC
 
7d330127
 # Copyright (C) 2010-2017 Free Software Foundation, Inc.
d39cb658
 # Written by Peter Rosin <peda@lysator.liu.se>.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2, or (at your option)
 # any later version.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
 # the same distribution terms that you use for the rest of that program.
 
 # This file is maintained in Automake, please report
 # bugs to <bug-automake@gnu.org> or send patches to
 # <automake-patches@gnu.org>.
 
 
 # func_error message
 func_error ()
 {
   echo "$me: $1" 1>&2
   exit 1
 }
 
 file_conv=
 
 # func_file_conv build_file
 # Convert a $build file to $host form and store it in $file
 # Currently only supports Windows hosts.
 func_file_conv ()
 {
   file=$1
   case $file in
     / | /[!/]*) # absolute file, and not a UNC file
       if test -z "$file_conv"; then
 	# lazily determine how to convert abs files
 	case `uname -s` in
 	  MINGW*)
 	    file_conv=mingw
 	    ;;
 	  CYGWIN*)
 	    file_conv=cygwin
 	    ;;
 	  *)
 	    file_conv=wine
 	    ;;
 	esac
       fi
       case $file_conv in
 	mingw)
 	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
 	  ;;
 	cygwin)
 	  file=`cygpath -m "$file" || echo "$file"`
 	  ;;
 	wine)
 	  file=`winepath -w "$file" || echo "$file"`
 	  ;;
       esac
       ;;
   esac
 }
 
 # func_at_file at_file operation archive
 # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
 # for each of them.
 # When interpreting the content of the @FILE, do NOT use func_file_conv,
 # since the user would need to supply preconverted file names to
 # binutils ar, at least for MinGW.
 func_at_file ()
 {
   operation=$2
   archive=$3
   at_file_contents=`cat "$1"`
   eval set x "$at_file_contents"
   shift
 
   for member
   do
     $AR -NOLOGO $operation:"$member" "$archive" || exit $?
   done
 }
 
 case $1 in
   '')
      func_error "no command.  Try '$0 --help' for more information."
      ;;
   -h | --h*)
     cat <<EOF
 Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
 
 Members may be specified in a file named with @FILE.
 EOF
     exit $?
     ;;
   -v | --v*)
     echo "$me, version $scriptversion"
     exit $?
     ;;
 esac
 
 if test $# -lt 3; then
   func_error "you must specify a program, an action and an archive"
 fi
 
 AR=$1
 shift
 while :
 do
   if test $# -lt 2; then
     func_error "you must specify a program, an action and an archive"
   fi
   case $1 in
     -lib | -LIB \
     | -ltcg | -LTCG \
     | -machine* | -MACHINE* \
     | -subsystem* | -SUBSYSTEM* \
     | -verbose | -VERBOSE \
     | -wx* | -WX* )
       AR="$AR $1"
       shift
       ;;
     *)
       action=$1
       shift
       break
       ;;
   esac
 done
 orig_archive=$1
 shift
 func_file_conv "$orig_archive"
 archive=$file
 
 # strip leading dash in $action
 action=${action#-}
 
 delete=
 extract=
 list=
 quick=
 replace=
 index=
 create=
 
 while test -n "$action"
 do
   case $action in
     d*) delete=yes  ;;
     x*) extract=yes ;;
     t*) list=yes    ;;
     q*) quick=yes   ;;
     r*) replace=yes ;;
     s*) index=yes   ;;
     S*)             ;; # the index is always updated implicitly
     c*) create=yes  ;;
     u*)             ;; # TODO: don't ignore the update modifier
     v*)             ;; # TODO: don't ignore the verbose modifier
     *)
       func_error "unknown action specified"
       ;;
   esac
   action=${action#?}
 done
 
 case $delete$extract$list$quick$replace,$index in
   yes,* | ,yes)
     ;;
   yesyes*)
     func_error "more than one action specified"
     ;;
   *)
     func_error "no action specified"
     ;;
 esac
 
 if test -n "$delete"; then
   if test ! -f "$orig_archive"; then
     func_error "archive not found"
   fi
   for member
   do
     case $1 in
       @*)
         func_at_file "${1#@}" -REMOVE "$archive"
         ;;
       *)
         func_file_conv "$1"
         $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
         ;;
     esac
   done
 
 elif test -n "$extract"; then
   if test ! -f "$orig_archive"; then
     func_error "archive not found"
   fi
   if test $# -gt 0; then
     for member
     do
       case $1 in
         @*)
           func_at_file "${1#@}" -EXTRACT "$archive"
           ;;
         *)
           func_file_conv "$1"
           $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
           ;;
       esac
     done
   else
     $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
     do
       $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
     done
   fi
 
 elif test -n "$quick$replace"; then
   if test ! -f "$orig_archive"; then
     if test -z "$create"; then
       echo "$me: creating $orig_archive"
     fi
     orig_archive=
   else
     orig_archive=$archive
   fi
 
   for member
   do
     case $1 in
     @*)
       func_file_conv "${1#@}"
       set x "$@" "@$file"
       ;;
     *)
       func_file_conv "$1"
       set x "$@" "$file"
       ;;
     esac
     shift
     shift
   done
 
   if test -n "$orig_archive"; then
     $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
   else
     $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
   fi
 
 elif test -n "$list"; then
   if test ! -f "$orig_archive"; then
     func_error "archive not found"
   fi
   $AR -NOLOGO -LIST "$archive" || exit $?
 fi