Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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-2013 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 <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@gnu.org> or send patches to
  30. # <automake-patches@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.