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