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