1: #! /bin/sh
2: # Wrapper for Microsoft lib.exe
3:
4: me=ar-lib
5: scriptversion=2012-03-01.08; # UTC
6:
7: # Copyright (C) 2010-2018 Free Software Foundation, Inc.
8: # Written by Peter Rosin <peda@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@gnu.org> or send patches to
30: # <automake-patches@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: file_conv=mingw
55: ;;
56: CYGWIN*)
57: file_conv=cygwin
58: ;;
59: *)
60: file_conv=wine
61: ;;
62: esac
63: fi
64: case $file_conv in
65: mingw)
66: file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
67: ;;
68: cygwin)
69: file=`cygpath -m "$file" || echo "$file"`
70: ;;
71: wine)
72: file=`winepath -w "$file" || echo "$file"`
73: ;;
74: esac
75: ;;
76: esac
77: }
78:
79: # func_at_file at_file operation archive
80: # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
81: # for each of them.
82: # When interpreting the content of the @FILE, do NOT use func_file_conv,
83: # since the user would need to supply preconverted file names to
84: # binutils ar, at least for MinGW.
85: func_at_file ()
86: {
87: operation=$2
88: archive=$3
89: at_file_contents=`cat "$1"`
90: eval set x "$at_file_contents"
91: shift
92:
93: for member
94: do
95: $AR -NOLOGO $operation:"$member" "$archive" || exit $?
96: done
97: }
98:
99: case $1 in
100: '')
101: func_error "no command. Try '$0 --help' for more information."
102: ;;
103: -h | --h*)
104: cat <<EOF
105: Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
106:
107: Members may be specified in a file named with @FILE.
108: EOF
109: exit $?
110: ;;
111: -v | --v*)
112: echo "$me, version $scriptversion"
113: exit $?
114: ;;
115: esac
116:
117: if test $# -lt 3; then
118: func_error "you must specify a program, an action and an archive"
119: fi
120:
121: AR=$1
122: shift
123: while :
124: do
125: if test $# -lt 2; then
126: func_error "you must specify a program, an action and an archive"
127: fi
128: case $1 in
129: -lib | -LIB \
130: | -ltcg | -LTCG \
131: | -machine* | -MACHINE* \
132: | -subsystem* | -SUBSYSTEM* \
133: | -verbose | -VERBOSE \
134: | -wx* | -WX* )
135: AR="$AR $1"
136: shift
137: ;;
138: *)
139: action=$1
140: shift
141: break
142: ;;
143: esac
144: done
145: orig_archive=$1
146: shift
147: func_file_conv "$orig_archive"
148: archive=$file
149:
150: # strip leading dash in $action
151: action=${action#-}
152:
153: delete=
154: extract=
155: list=
156: quick=
157: replace=
158: index=
159: create=
160:
161: while test -n "$action"
162: do
163: case $action in
164: d*) delete=yes ;;
165: x*) extract=yes ;;
166: t*) list=yes ;;
167: q*) quick=yes ;;
168: r*) replace=yes ;;
169: s*) index=yes ;;
170: S*) ;; # the index is always updated implicitly
171: c*) create=yes ;;
172: u*) ;; # TODO: don't ignore the update modifier
173: v*) ;; # TODO: don't ignore the verbose modifier
174: *)
175: func_error "unknown action specified"
176: ;;
177: esac
178: action=${action#?}
179: done
180:
181: case $delete$extract$list$quick$replace,$index in
182: yes,* | ,yes)
183: ;;
184: yesyes*)
185: func_error "more than one action specified"
186: ;;
187: *)
188: func_error "no action specified"
189: ;;
190: esac
191:
192: if test -n "$delete"; then
193: if test ! -f "$orig_archive"; then
194: func_error "archive not found"
195: fi
196: for member
197: do
198: case $1 in
199: @*)
200: func_at_file "${1#@}" -REMOVE "$archive"
201: ;;
202: *)
203: func_file_conv "$1"
204: $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
205: ;;
206: esac
207: done
208:
209: elif test -n "$extract"; then
210: if test ! -f "$orig_archive"; then
211: func_error "archive not found"
212: fi
213: if test $# -gt 0; then
214: for member
215: do
216: case $1 in
217: @*)
218: func_at_file "${1#@}" -EXTRACT "$archive"
219: ;;
220: *)
221: func_file_conv "$1"
222: $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
223: ;;
224: esac
225: done
226: else
227: $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
228: do
229: $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
230: done
231: fi
232:
233: elif test -n "$quick$replace"; then
234: if test ! -f "$orig_archive"; then
235: if test -z "$create"; then
236: echo "$me: creating $orig_archive"
237: fi
238: orig_archive=
239: else
240: orig_archive=$archive
241: fi
242:
243: for member
244: do
245: case $1 in
246: @*)
247: func_file_conv "${1#@}"
248: set x "$@" "@$file"
249: ;;
250: *)
251: func_file_conv "$1"
252: set x "$@" "$file"
253: ;;
254: esac
255: shift
256: shift
257: done
258:
259: if test -n "$orig_archive"; then
260: $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
261: else
262: $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
263: fi
264:
265: elif test -n "$list"; then
266: if test ! -f "$orig_archive"; then
267: func_error "archive not found"
268: fi
269: $AR -NOLOGO -LIST "$archive" || exit $?
270: fi
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>