1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
<sect1 id="ch02-aboutdependencies">
<title>About dependencies</title>
<?dbhtml filename="aboutdependencies.html" dir="chapter02"?>
<!-- Leave this file in the repo until we figure out finally what to do with
dependencies -->
<para>There are a few ways to compile a list of a package's installation
dependencies. What we consider the best way is using the
<command>strace</command> program available at <ulink
url="http://www.wi.leidenuniv.nl/~wichert/strace/"/>.</para>
<para><command>strace</command> is a program that provides a trace of all
system calls made by another program. One of the most useful system calls
to trace when figuring out dependencies is the <emphasis>execve(2)</emphasis>
system call, which is used to execute programs (see its man page for
all the details). Whenever you run a program, be it from a shell or via a
configure script or Makefile file, the execve call is made. If you trace
these calls, you will know what programs were executed behind the
scenes.</para>
<para>Here is a line of output from running a configure script:</para>
<screen>19580 execve("/bin/rm", ["rm", "-f", "conf19538", "conf19538.exe", "conf19538.file"], [/* 26 vars */]) = 0</screen>
<para>This line tells us that the <command>/bin/rm</command> program was
run with a PID of 19580, which command line parameters it was given (rm -f
conf195838 conf19538.exe conf19538.file) and its exit value (0).</para>
<para>For dependency purposes all we care about is that
<command>/bin/rm</command> was run during the configure script, so this is
an installation dependency. Without <command>rm</command>, the script
wouldn't be able to run properly.</para>
<para>Unfortunately, this method is not foolproof. Configure scripts check
for the presense of many programs, but not all of them are considered real
dependencies. For instance, configure scripts may check for the presence of
the <command>autoconf</command> program. It will be listed in the strace
output, but it's not a real installation dependency. A package will in most
if not all cases install just fine without that program. There are other
such false positives.</para>
<para>This means automatic dependency gathering is never accurate. You will
always need to validate the list and figure out the false positives. In
some (rare) cases autoconf might be a real dependency, so you
can't simply ignore all autoconf entries. A manual validation really is a
requirement for an accurate list.</para>
<para>This book is not so verbose as to list exactly which program from which
package is required for a successful installation (we used to, but it had
become too much work to maintain it). The book will contain simply the
names of packages you need to have installed. If you need the verbosity
in the form of "package a needs file b and c from package d", have a look
at <enter URL when it's available>.</para>
</sect1>
|