| #! /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 |