#!/bin/ksh
##
## RPM: find-requires for multi-platforms
## Copyright (c) 2010-2011 SATOH Fumiyasu @ OSS Technology, Inc.
##               <http://www.osstech.co.jp/>
##
## License: GNU General Public License version 2 or later
## Date: 2011-03-01, since 2009-11-10
##

LC_ALL="C"
PATH=/usr/bin:/usr/ccs/bin:/usr/sfw/bin:/bin:/usr/sbin:/sbin
export LC_ALL PATH

pdie() { echo "$0: ERROR: ${1-}" 1>&2; exit "${2-1}"; }

escape_meta()
{
  sed 's/[^a-zA-Z0-9_]/\\&/g'
}

xargs_wrap()
{
  escape_meta |xargs ${1+"$@"}
}

## ======================================================================

vendor_id="${VENDOR_ID:-osstech}"
vendor_prefix="${VENDOR_PREFIX:-/opt/osstech}"

uname=$(uname)
rpm_configdir="${RPM_CONFIGDIR:-/usr/lib/rpm}"

root=""
progress_flag=""

## ----------------------------------------------------------------------

while [ "$#" -gt 0 ]; do
  OPT="$1"; shift
  case "$OPT" in
  --progress)
    progress_flag="yes"
    ;;
  --)
    break
    ;;
  -*)
    pdie "Invalid option: $OPT"
    ;;
  *)
    set -- "$OPT" ${1+"$@"}
    break
    ;;
  esac
done

## ----------------------------------------------------------------------

[ -n "${1+set}" ] && { root="$1"; shift; }

export PATH="$vendor_prefix/bin:$PATH"

## ======================================================================

## Set options for GNU by default

file_opts='-L'
ldd_args_max=''
ldd_lib_re='=>.*/lib'
file_libexec_re=' (executable|shared object|dynamic lib)[, ]'

lib_info() {
  xargs_wrap file $file_opts 2>/dev/null \
  |while read -r file_out; do
    lib="${file_out%%:*}"
    lib_bit=$(echo "$file_out" |sed -n 's|^.* \([0-9]*\)-bit .*|\1|p')
    lib_vers="" ## FIXME
    echo "$lib $lib_bit $lib_vers"
  done
}

## ----------------------------------------------------------------------

## Adjust options for non-GNU systems

case "$uname" in
SunOS)
  file_opts=''
  ;;
AIX)
  file_opts=''
  ldd_args_max='1'
  ldd_lib_re='^[ 	].*/lib'
  lib_info() {
    cat
  }
  ;;
esac

## ======================================================================

trap 'rm -f ${stdin_tmp:+"$stdin_tmp"}' 0 HUP INT QUIT TERM PIPE
stdin_tmp=$(mktemp "/tmp/${0##*/}.XXXXXX") || exit 1

while read -r f; do
  [ -L "$f" ] && continue
  echo "$f"
done \
>"$stdin_tmp"

## ----------------------------------------------------------------------

[ -n "$progress_flag" ] && print -n 'Generating executables and libraries requires...' 1>&2

xargs_wrap file $file_opts <"$stdin_tmp" 2>/dev/null \
|egrep "$file_libexec_re" \
|sed -n 's/:.*$//p' \
|xargs_wrap ${ldd_args_max:+-n$ldd_args_max} ldd 2>/dev/null \
|grep "$ldd_lib_re" \
|sed 's|^.*=>[^/]*||;s| (0x[0-9a-f]*)||;s|//*|/|g' \
|sort -u \
|lib_info \
|while read -r lib lib_bit lib_vers; do
  [ -n "$progress_flag" ] && print -n '.' 1>&2

  case "$lib" in
  $vendor_prefix/*)
    ## Vendor specific libraries
    lib_name="$lib"
    ;;
  *)
    ## OS-bundled libraries
    lib_name="${lib##*/}"
    ;;
  esac

  [ x"$lib_bit" = x"32" ] && lib_bit=""
  [ -z "${lib_name##*/lib$lib_bit/*}" ] && lib_bit=""

  for lib_ver in "" $lib_vers; do
    print -n "$lib_name"
    [ -n "$lib_ver$lib_bit" ] && print -n "($lib_ver)"
    [ -n "$lib_bit" ] && print -n "(${lib_bit}bit)"
    echo
  done
done \
|sort -u

[ -n "$progress_flag" ] && echo " Done." 1>&2

## ----------------------------------------------------------------------

[ -n "$progress_flag" ] && print -n 'Generating others requires by rpmdeps...' 1>&2

"$rpm_configdir/rpmdeps" --requires <"$stdin_tmp" \
|grep -v '^lib'

[ -n "$progress_flag" ] && echo " Done." 1>&2

## ======================================================================

exit 0
