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