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