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