#!/bin/sh
#
# Script to make an offline archive for debugging with libdwfl-based tools.
#
#	make-debug-archive ARCHIVE {options}
#	make-debug-archive --kernel [--force] [RELEASE]
#
# Valid options are those listed under 'Input selection options'
# by running /usr/bin/eu-unstrip --help.
#
# The archive installed by --kernel be used automatically by -K.
# An offline archive can be used via -e in any tool that accepts those options.
#

UNSTRIP=${UNSTRIP:-/usr/bin/eu-unstrip}
AR=${AR:-/usr/bin/eu-ar}
SUDO=${SUDO:-/usr/bin/sudo}

LS=/bin/ls
RM=/bin/rm
MV=/bin/mv
MKDIR=/bin/mkdir
XARGS=/usr/bin/xargs

outdir=${TMPDIR:-/tmp}/debugar$$

usage()
{
  echo "Usage: $0 ARCHIVE {options}"
  echo "   or: $0 --kernel [--sudo] [--force] [RELEASE]"
  echo
  echo "Valid options are listed under 'Input selection options'"
  echo "when running: $UNSTRIP --help"
  echo
  echo "The --kernel form updates the file used by -K if the"
  echo "kernel installation has changed, or always with --force."
  echo "With --sudo, touches the installed file via $SUDO."
}

fatal_usage()
{
  usage >&2
  exit 2
}

script_version()
{
  echo "`basename $0` (elfutils) 0.164"
  echo "Copyright (C) 2007 Red Hat, Inc."
  echo "This is free software; see the source for copying conditions."
  echo "There is NO warranty; not even for MERCHANTABILITY or"
  echo "FITNESS FOR A PARTICULAR PURPOSE."
  echo "Written by Roland McGrath."
}

sudo=
kernel=no
force_kernel=no
while [ $# -gt 0 ]; do
  case "x$1" in
  x--help) usage; exit 0 ;;
  x--version) script_version; exit 0 ;;
  x--kernel) kernel=yes ;;
  x--force) force_kernel=yes ;;
  x--sudo) sudo=$SUDO ;;
  *) break ;;
  esac
  shift
done

if [ $kernel = no ] && [ $force_kernel = yes -o -n "$sudo" ]; then
  usage
fi

if [ $kernel = yes ]; then
  if [ $# -eq 0 ]; then
    release=`uname -r`
  elif [ $# -eq 1 ]; then
    release=$1
  else
    fatal_usage
  fi

  dir=/usr/lib/debug/lib/modules/$release
  archive=$dir/debug.a
  dep=/lib/modules/$release/modules.dep

  if [ ! -d $dir ]; then
    echo >&2 "$0: $dir not installed"
    exit 1
  fi

  # Without --force, bail if the kernel installation is not newer.
  # This file is normally touched by installing new kernels or modules.
  if [ $force_kernel = no -a "$archive" -nt "$dep" ]; then
    exit 0
  fi

  # We have to kill the old one first, because our own -K would use it.
  [ ! -e "$archive" ] || $sudo $RM -f "$archive" || exit

  set "$archive" "-K$release"
fi

if [ $# -lt 2 ]; then
  fatal_usage
fi

archive="$1"
shift

case "$archive" in
/*) ;;
*) archive="`/bin/pwd`/$archive" ;;
esac

if [ -z "$sudo" ]; then
  new_archive="$archive.new"
else
  new_archive="$outdir.a"
fi

$RM -f "$new_archive" || exit

trap '$RM -rf "$outdir" "$new_archive"' 0 1 2 15

$MKDIR "$outdir" &&
$UNSTRIP -d "$outdir" -m -a -R "$@" &&
(cd "$outdir" && $LS | $XARGS $AR cq "$new_archive") &&
$sudo $MV -f "$new_archive" "$archive"

exit
