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