You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
270 lines
5.7 KiB
270 lines
5.7 KiB
#! /bin/sh |
|
# Wrapper for Microsoft lib.exe |
|
|
|
me=ar-lib |
|
scriptversion=2012-03-01.08; # UTC |
|
|
|
# Copyright (C) 2010-2014 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
|
|
|