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