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