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