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