ar-lib revision 1.1.1.3 1 #! /bin/sh
2 # Wrapper for Microsoft lib.exe
3
4 me=ar-lib
5 scriptversion=2025-02-03.05; # UTC
6
7 # Copyright (C) 2010-2025 Free Software Foundation, Inc.
8 # Written by Peter Rosin <peda (at] lysator.liu.se>.
9 #
10 # This program is free software; you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation; either version 2, or (at your option)
13 # any later version.
14 #
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 # GNU General Public License for more details.
19 #
20 # You should have received a copy of the GNU General Public License
21 # along with this program. If not, see <https://www.gnu.org/licenses/>.
22
23 # As a special exception to the GNU General Public License, if you
24 # distribute this file as part of a program that contains a
25 # configuration script generated by Autoconf, you may include it under
26 # the same distribution terms that you use for the rest of that program.
27
28 # This file is maintained in Automake, please report
29 # bugs to <bug-automake (at] gnu.org> or send patches to
30 # <automake-patches (at] gnu.org>.
31
32
33 # func_error message
34 func_error ()
35 {
36 echo "$me: $1" 1>&2
37 exit 1
38 }
39
40 file_conv=
41
42 # func_file_conv build_file
43 # Convert a $build file to $host form and store it in $file
44 # Currently only supports Windows hosts.
45 func_file_conv ()
46 {
47 file=$1
48 case $file in
49 / | /[!/]*) # absolute file, and not a UNC file
50 if test -z "$file_conv"; then
51 # lazily determine how to convert abs files
52 case `uname -s` in
53 MINGW*)
54 if test -n "$MSYSTEM" && (cygpath --version) >/dev/null 2>&1; then
55 # MSYS2 environment.
56 file_conv=cygwin
57 else
58 # Original MinGW environment.
59 file_conv=mingw
60 fi
61 ;;
62 MSYS*)
63 # Old MSYS environment, or MSYS2 with 32-bit MSYS2 shell.
64 file_conv=cygwin
65 ;;
66 CYGWIN*)
67 # Cygwin environment.
68 file_conv=cygwin
69 ;;
70 *)
71 file_conv=wine
72 ;;
73 esac
74 fi
75 case $file_conv in
76 mingw)
77 file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
78 ;;
79 cygwin)
80 file=`cygpath -w "$file" || echo "$file"`
81 ;;
82 wine)
83 file=`winepath -w "$file" || echo "$file"`
84 ;;
85 esac
86 ;;
87 esac
88 }
89
90 # func_at_file at_file operation archive
91 # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
92 # for each of them.
93 # When interpreting the content of the @FILE, do NOT use func_file_conv,
94 # since the user would need to supply preconverted file names to
95 # binutils ar, at least for MinGW.
96 func_at_file ()
97 {
98 operation=$2
99 archive=$3
100 at_file_contents=`cat "$1"`
101 eval set x "$at_file_contents"
102 shift
103
104 for member
105 do
106 $AR -NOLOGO $operation:"$member" "$archive" || exit $?
107 done
108 }
109
110 case $1 in
111 '')
112 func_error "no command. Try '$0 --help' for more information."
113 ;;
114 -h | --h*)
115 cat <<EOF
116 Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
117
118 Members may be specified in a file named with @FILE.
119
120 Report bugs to <bug-automake@gnu.org>.
121 GNU Automake home page: <https://www.gnu.org/software/automake/>.
122 General help using GNU software: <https://www.gnu.org/gethelp/>.
123 EOF
124 exit $?
125 ;;
126 -v | --v*)
127 echo "$me (GNU Automake) $scriptversion"
128 exit $?
129 ;;
130 esac
131
132 if test $# -lt 3; then
133 func_error "you must specify a program, an action and an archive"
134 fi
135
136 AR=$1
137 shift
138 while :
139 do
140 if test $# -lt 2; then
141 func_error "you must specify a program, an action and an archive"
142 fi
143 case $1 in
144 -lib | -LIB \
145 | -ltcg | -LTCG \
146 | -machine* | -MACHINE* \
147 | -subsystem* | -SUBSYSTEM* \
148 | -verbose | -VERBOSE \
149 | -wx* | -WX* )
150 AR="$AR $1"
151 shift
152 ;;
153 -nologo | -NOLOGO)
154 # We always invoke AR with -nologo, so don't need to add it again.
155 shift
156 ;;
157 *)
158 action=$1
159 shift
160 break
161 ;;
162 esac
163 done
164 orig_archive=$1
165 shift
166 func_file_conv "$orig_archive"
167 archive=$file
168
169 # strip leading dash in $action
170 action=${action#-}
171
172 delete=
173 extract=
174 list=
175 quick=
176 replace=
177 index=
178 create=
179
180 while test -n "$action"
181 do
182 case $action in
183 d*) delete=yes ;;
184 x*) extract=yes ;;
185 t*) list=yes ;;
186 q*) quick=yes ;;
187 r*) replace=yes ;;
188 s*) index=yes ;;
189 S*) ;; # the index is always updated implicitly
190 c*) create=yes ;;
191 u*) ;; # TODO: don't ignore the update modifier
192 v*) ;; # TODO: don't ignore the verbose modifier
193 *)
194 func_error "unknown action specified"
195 ;;
196 esac
197 action=${action#?}
198 done
199
200 case $delete$extract$list$quick$replace,$index in
201 yes,* | ,yes)
202 ;;
203 yesyes*)
204 func_error "more than one action specified"
205 ;;
206 *)
207 func_error "no action specified"
208 ;;
209 esac
210
211 if test -n "$delete"; then
212 if test ! -f "$orig_archive"; then
213 func_error "archive not found"
214 fi
215 for member
216 do
217 case $1 in
218 @*)
219 func_at_file "${1#@}" -REMOVE "$archive"
220 ;;
221 *)
222 func_file_conv "$1"
223 $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
224 ;;
225 esac
226 done
227
228 elif test -n "$extract"; then
229 if test ! -f "$orig_archive"; then
230 func_error "archive not found"
231 fi
232 if test $# -gt 0; then
233 for member
234 do
235 case $1 in
236 @*)
237 func_at_file "${1#@}" -EXTRACT "$archive"
238 ;;
239 *)
240 func_file_conv "$1"
241 $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
242 ;;
243 esac
244 done
245 else
246 $AR -NOLOGO -LIST "$archive" | tr -d '\r' | sed -e 's/\\/\\\\/g' \
247 | while read member
248 do
249 $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
250 done
251 fi
252
253 elif test -n "$quick$replace"; then
254 if test ! -f "$orig_archive"; then
255 if test -z "$create"; then
256 echo "$me: creating $orig_archive"
257 fi
258 orig_archive=
259 else
260 orig_archive=$archive
261 fi
262
263 for member
264 do
265 case $1 in
266 @*)
267 func_file_conv "${1#@}"
268 set x "$@" "@$file"
269 ;;
270 *)
271 func_file_conv "$1"
272 set x "$@" "$file"
273 ;;
274 esac
275 shift
276 shift
277 done
278
279 if test -n "$orig_archive"; then
280 $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
281 else
282 $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
283 fi
284
285 elif test -n "$list"; then
286 if test ! -f "$orig_archive"; then
287 func_error "archive not found"
288 fi
289 $AR -NOLOGO -LIST "$archive" || exit $?
290 fi
291