0,0 → 1,270 |
#! /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 |