272 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			272 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | #! /bin/sh | ||
|  | # Wrapper for Microsoft lib.exe | ||
|  | 
 | ||
|  | me=ar-lib | ||
|  | scriptversion=2019-07-04.01; # UTC | ||
|  | 
 | ||
|  | # Copyright (C) 2010-2020 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 <https://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* | MSYS*) | ||
|  | 	    file_conv=cygwin | ||
|  | 	    ;; | ||
|  | 	  *) | ||
|  | 	    file_conv=wine | ||
|  | 	    ;; | ||
|  | 	esac | ||
|  |       fi | ||
|  |       case $file_conv in | ||
|  | 	mingw) | ||
|  | 	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` | ||
|  | 	  ;; | ||
|  | 	cygwin | msys) | ||
|  | 	  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" | tr -d '\r' | 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 |