|  | #! /bin/sh | 
|  | # Wrapper for Microsoft lib.exe | 
|  |  | 
|  | me=ar-lib | 
|  | scriptversion=2012-03-01.08; # UTC | 
|  |  | 
|  | # Copyright (C) 2010-2017 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 |