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