1 #! /bin/sh 2 # Wrapper for Microsoft lib.exe 3 4 me=ar-lib 5 scriptversion=2012-03-01.08; # UTC 6 7 # Copyright (C) 2010-2017 Free Software Foundation, Inc. 8 # Written by Peter Rosin <peda (at] 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 <http://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 (at] gnu.org> or send patches to 30 # <automake-patches (at] gnu.org>. 31 32 33 # func_error message 34 func_error () 35 { 36 echo "$me: $1" 1>&2 37 exit 1 38 } 39 40 file_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. 45 func_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*) 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) 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. 85 func_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 99 case $1 in 100 '') 101 func_error "no command. Try '$0 --help' for more information." 102 ;; 103 -h | --h*) 104 cat <<EOF 105 Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...] 106 107 Members may be specified in a file named with @FILE. 108 EOF 109 exit $? 110 ;; 111 -v | --v*) 112 echo "$me, version $scriptversion" 113 exit $? 114 ;; 115 esac 116 117 if test $# -lt 3; then 118 func_error "you must specify a program, an action and an archive" 119 fi 120 121 AR=$1 122 shift 123 while : 124 do 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 144 done 145 orig_archive=$1 146 shift 147 func_file_conv "$orig_archive" 148 archive=$file 149 150 # strip leading dash in $action 151 action=${action#-} 152 153 delete= 154 extract= 155 list= 156 quick= 157 replace= 158 index= 159 create= 160 161 while test -n "$action" 162 do 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#?} 179 done 180 181 case $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 ;; 190 esac 191 192 if 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 209 elif 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" | sed -e 's/\\/\\\\/g' | while read member 228 do 229 $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $? 230 done 231 fi 232 233 elif test -n "$quick$replace"; then 234 if test ! -f "$orig_archive"; then 235 if test -z "$create"; then 236 echo "$me: creating $orig_archive" 237 fi 238 orig_archive= 239 else 240 orig_archive=$archive 241 fi 242 243 for member 244 do 245 case $1 in 246 @*) 247 func_file_conv "${1#@}" 248 set x "$@" "@$file" 249 ;; 250 *) 251 func_file_conv "$1" 252 set x "$@" "$file" 253 ;; 254 esac 255 shift 256 shift 257 done 258 259 if test -n "$orig_archive"; then 260 $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $? 261 else 262 $AR -NOLOGO -OUT:"$archive" "$@" || exit $? 263 fi 264 265 elif test -n "$list"; then 266 if test ! -f "$orig_archive"; then 267 func_error "archive not found" 268 fi 269 $AR -NOLOGO -LIST "$archive" || exit $? 270 fi 271