1#!/bin/sh
2#
3# Script to make an offline archive for debugging with libdwfl-based tools.
4#
5#	make-debug-archive ARCHIVE {options}
6#	make-debug-archive --kernel [--force] [RELEASE]
7#
8# Valid options are those listed under 'Input selection options'
9# by running @UNSTRIP@ --help.
10#
11# The archive installed by --kernel be used automatically by -K.
12# An offline archive can be used via -e in any tool that accepts those options.
13#
14
15UNSTRIP=${UNSTRIP:-@UNSTRIP@}
16AR=${AR:-@AR@}
17SUDO=${SUDO:-/usr/bin/sudo}
18
19LS=/bin/ls
20RM=/bin/rm
21MV=/bin/mv
22MKDIR=/bin/mkdir
23XARGS=/usr/bin/xargs
24
25outdir=${TMPDIR:-/tmp}/debugar$$
26
27usage()
28{
29  echo "Usage: $0 ARCHIVE {options}"
30  echo "   or: $0 --kernel [--sudo] [--force] [RELEASE]"
31  echo
32  echo "Valid options are listed under 'Input selection options'"
33  echo "when running: $UNSTRIP --help"
34  echo
35  echo "The --kernel form updates the file used by -K if the"
36  echo "kernel installation has changed, or always with --force."
37  echo "With --sudo, touches the installed file via $SUDO."
38}
39
40fatal_usage()
41{
42  usage >&2
43  exit 2
44}
45
46script_version()
47{
48  echo "`basename $0` (@PACKAGE_NAME@) @PACKAGE_VERSION@"
49  echo "Copyright (C) 2007 Red Hat, Inc."
50  echo "This is free software; see the source for copying conditions."
51  echo "There is NO warranty; not even for MERCHANTABILITY or"
52  echo "FITNESS FOR A PARTICULAR PURPOSE."
53  echo "Written by Roland McGrath."
54}
55
56sudo=
57kernel=no
58force_kernel=no
59while [ $# -gt 0 ]; do
60  case "x$1" in
61  x--help) usage; exit 0 ;;
62  x--version) script_version; exit 0 ;;
63  x--kernel) kernel=yes ;;
64  x--force) force_kernel=yes ;;
65  x--sudo) sudo=$SUDO ;;
66  *) break ;;
67  esac
68  shift
69done
70
71if [ $kernel = no ] && [ $force_kernel = yes -o -n "$sudo" ]; then
72  usage
73fi
74
75if [ $kernel = yes ]; then
76  if [ $# -eq 0 ]; then
77    release=`uname -r`
78  elif [ $# -eq 1 ]; then
79    release=$1
80  else
81    fatal_usage
82  fi
83
84  dir=/usr/lib/debug/lib/modules/$release
85  archive=$dir/debug.a
86  dep=/lib/modules/$release/modules.dep
87
88  if [ ! -d $dir ]; then
89    echo >&2 "$0: $dir not installed"
90    exit 1
91  fi
92
93  # Without --force, bail if the kernel installation is not newer.
94  # This file is normally touched by installing new kernels or modules.
95  if [ $force_kernel = no -a "$archive" -nt "$dep" ]; then
96    exit 0
97  fi
98
99  # We have to kill the old one first, because our own -K would use it.
100  [ ! -e "$archive" ] || $sudo $RM -f "$archive" || exit
101
102  set "$archive" "-K$release"
103fi
104
105if [ $# -lt 2 ]; then
106  fatal_usage
107fi
108
109archive="$1"
110shift
111
112case "$archive" in
113/*) ;;
114*) archive="`/bin/pwd`/$archive" ;;
115esac
116
117if [ -z "$sudo" ]; then
118  new_archive="$archive.new"
119else
120  new_archive="$outdir.a"
121fi
122
123$RM -f "$new_archive" || exit
124
125trap '$RM -rf "$outdir" "$new_archive"' 0 1 2 15
126
127$MKDIR "$outdir" &&
128$UNSTRIP -d "$outdir" -m -a -R "$@" &&
129(cd "$outdir" && $LS | $XARGS $AR cq "$new_archive") &&
130$sudo $MV -f "$new_archive" "$archive"
131
132exit
133