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