#! /bin/sh
# Wrapper for Microsoft lib.exe
me=ar-lib
scriptversion=
2025-
02-
03.
05; # UTC
# Copyright (C)
2010-
2025 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*)
if test -n
"$MSYSTEM" && (cygpath --version) >/dev/null
2>&
1; then
# MSYS2 environment.
file_conv=cygwin
else
# Original MinGW environment.
file_conv=mingw
fi
;;
MSYS*)
# Old MSYS environment, or MSYS2 with
32-bit MSYS2 shell.
file_conv=cygwin
;;
CYGWIN*)
# Cygwin environment.
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 -w
"$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.
Report bugs to <bug-automake@gnu.org>.
GNU Automake home page: <
https://www.gnu.org/software/automake/>.
General help using GNU software: <
https://www.gnu.org/gethelp/>.
EOF
exit $?
;;
-v | --v*)
echo
"$me (GNU Automake) $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
;;
-nologo | -NOLOGO)
# We always invoke AR with -nologo, so don
't need to add it again.
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