Commit | Line | Data |
---|---|---|
a243b558 JF |
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-2013 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 <http://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 |