diff options
Diffstat (limited to 'build-aux/ar-lib')
| -rwxr-xr-x | build-aux/ar-lib | 270 | 
1 files changed, 270 insertions, 0 deletions
| diff --git a/build-aux/ar-lib b/build-aux/ar-lib new file mode 100755 index 0000000..05094d3 --- /dev/null +++ b/build-aux/ar-lib @@ -0,0 +1,270 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2012-03-01.08; # UTC + +# Copyright (C) 2010-2017 Free Software Foundation, Inc. +# Written by Peter Rosin <peda@lysator.liu.se>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + + +# func_error message +func_error () +{ +  echo "$me: $1" 1>&2 +  exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ +  file=$1 +  case $file in +    / | /[!/]*) # absolute file, and not a UNC file +      if test -z "$file_conv"; then +	# lazily determine how to convert abs files +	case `uname -s` in +	  MINGW*) +	    file_conv=mingw +	    ;; +	  CYGWIN*) +	    file_conv=cygwin +	    ;; +	  *) +	    file_conv=wine +	    ;; +	esac +      fi +      case $file_conv in +	mingw) +	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` +	  ;; +	cygwin) +	  file=`cygpath -m "$file" || echo "$file"` +	  ;; +	wine) +	  file=`winepath -w "$file" || echo "$file"` +	  ;; +      esac +      ;; +  esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ +  operation=$2 +  archive=$3 +  at_file_contents=`cat "$1"` +  eval set x "$at_file_contents" +  shift + +  for member +  do +    $AR -NOLOGO $operation:"$member" "$archive" || exit $? +  done +} + +case $1 in +  '') +     func_error "no command.  Try '$0 --help' for more information." +     ;; +  -h | --h*) +    cat <<EOF +Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...] + +Members may be specified in a file named with @FILE. +EOF +    exit $? +    ;; +  -v | --v*) +    echo "$me, version $scriptversion" +    exit $? +    ;; +esac + +if test $# -lt 3; then +  func_error "you must specify a program, an action and an archive" +fi + +AR=$1 +shift +while : +do +  if test $# -lt 2; then +    func_error "you must specify a program, an action and an archive" +  fi +  case $1 in +    -lib | -LIB \ +    | -ltcg | -LTCG \ +    | -machine* | -MACHINE* \ +    | -subsystem* | -SUBSYSTEM* \ +    | -verbose | -VERBOSE \ +    | -wx* | -WX* ) +      AR="$AR $1" +      shift +      ;; +    *) +      action=$1 +      shift +      break +      ;; +  esac +done +orig_archive=$1 +shift +func_file_conv "$orig_archive" +archive=$file + +# strip leading dash in $action +action=${action#-} + +delete= +extract= +list= +quick= +replace= +index= +create= + +while test -n "$action" +do +  case $action in +    d*) delete=yes  ;; +    x*) extract=yes ;; +    t*) list=yes    ;; +    q*) quick=yes   ;; +    r*) replace=yes ;; +    s*) index=yes   ;; +    S*)             ;; # the index is always updated implicitly +    c*) create=yes  ;; +    u*)             ;; # TODO: don't ignore the update modifier +    v*)             ;; # TODO: don't ignore the verbose modifier +    *) +      func_error "unknown action specified" +      ;; +  esac +  action=${action#?} +done + +case $delete$extract$list$quick$replace,$index in +  yes,* | ,yes) +    ;; +  yesyes*) +    func_error "more than one action specified" +    ;; +  *) +    func_error "no action specified" +    ;; +esac + +if test -n "$delete"; then +  if test ! -f "$orig_archive"; then +    func_error "archive not found" +  fi +  for member +  do +    case $1 in +      @*) +        func_at_file "${1#@}" -REMOVE "$archive" +        ;; +      *) +        func_file_conv "$1" +        $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $? +        ;; +    esac +  done + +elif test -n "$extract"; then +  if test ! -f "$orig_archive"; then +    func_error "archive not found" +  fi +  if test $# -gt 0; then +    for member +    do +      case $1 in +        @*) +          func_at_file "${1#@}" -EXTRACT "$archive" +          ;; +        *) +          func_file_conv "$1" +          $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $? +          ;; +      esac +    done +  else +    $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member +    do +      $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $? +    done +  fi + +elif test -n "$quick$replace"; then +  if test ! -f "$orig_archive"; then +    if test -z "$create"; then +      echo "$me: creating $orig_archive" +    fi +    orig_archive= +  else +    orig_archive=$archive +  fi + +  for member +  do +    case $1 in +    @*) +      func_file_conv "${1#@}" +      set x "$@" "@$file" +      ;; +    *) +      func_file_conv "$1" +      set x "$@" "$file" +      ;; +    esac +    shift +    shift +  done + +  if test -n "$orig_archive"; then +    $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $? +  else +    $AR -NOLOGO -OUT:"$archive" "$@" || exit $? +  fi + +elif test -n "$list"; then +  if test ! -f "$orig_archive"; then +    func_error "archive not found" +  fi +  $AR -NOLOGO -LIST "$archive" || exit $? +fi | 
