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