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