271 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			271 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #! /bin/sh
 | |
| # Wrapper for Microsoft lib.exe
 | |
| 
 | |
| me=ar-lib
 | |
| scriptversion=2012-03-01.08; # UTC
 | |
| 
 | |
| # Copyright (C) 2010-2013 Free Software Foundation, Inc.
 | |
| # 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
 |