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