You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							270 lines
						
					
					
						
							5.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							270 lines
						
					
					
						
							5.7 KiB
						
					
					
				
								#! /bin/sh
							 | 
						|
								# Wrapper for Microsoft lib.exe
							 | 
						|
								
							 | 
						|
								me=ar-lib
							 | 
						|
								scriptversion=2012-03-01.08; # UTC
							 | 
						|
								
							 | 
						|
								# Copyright (C) 2010-2013 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
							 |