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