1 /*! \page builddependencies Generating build dependencies automatically
3 As we start updating packages for the next Red Hat distro, I'd like to see
4 packages start to make use of build dependencies. Basically build
5 dependencies are just like install dependencies, but they are resolved
6 against the build system just after parsing the spec file. Syntactically,
7 build dependencies look just like install dependencies in a spec file with
16 All the above dependencies include versions, files, existence/range tests, etc.
17 The build dependency checking can also be turned off with --nodeps if necessary
18 just like install dependency checking can. Eventually, build dependencies will
19 be automated in rpm, but the major impediment to that effort is the engineering
20 required to maintain the pretense that src rpm's are "noarch".
22 Meanwhile, I've added a package called "InDependence-1.0" to powertools-6.2
23 that may be of use in detecting build dependencies that can be added to
24 spec files as part of rebuilding packages for Red Hat 6.2.
26 Here's a short example of how to generate the package/file names that were used
27 while building gnorpm using InDependence:
30 rpm -U /mnt/rpm/comps/powertools/6.2/i386/InDependence-1.0-3.i386.rpm
31 rpm -i /mnt/rpm/comps/dist/6.2/SRPMS/gnorpm-0.9-11.src.rpm
33 dep -detail rpmbuild -ba gnorpm.spec >& xxx
35 (the build will take longer since both dep and strace are pigs)
37 grep -- '::' xxx > yyy
41 Aside: The dep perl wrapper is a "pig" only because it's exec'ing
43 in order to turn filenames into package names. There are easier/faster
44 ways to get this information...
46 There's no way to speed up the
47 /sbin/strace -q -etrace=open,execve -o ...
48 command itself. The eventual implementation in rpm will snatch the
49 same open/execve syscalls using LD_PRELOAD.
51 Patches cheerfully accepted :-)
54 Here's what's in yyy (PACKAGE::FILE format):
57 ORBit-devel-0.4.95-2::/usr/bin/orbit-config
58 XFree86-libs-3.3.5-6::/usr/X11R6/lib/libICE.so.6
59 XFree86-libs-3.3.5-6::/usr/X11R6/lib/libSM.so.6
60 XFree86-libs-3.3.5-6::/usr/X11R6/lib/libX11.so.6
61 XFree86-libs-3.3.5-6::/usr/X11R6/lib/libXext.so.6
62 audiofile-0.1.9-1::/usr/lib/libaudiofile.so.0
63 autoconf-2.13-5::/usr/bin/autoconf
64 autoconf-2.13-5::/usr/bin/autoheader
65 autoconf-2.13-5::/usr/share/autoconf/acgeneral.m4
66 autoconf-2.13-5::/usr/share/autoconf/autoconf.m4f
67 automake-1.4-5::/usr/bin/aclocal
68 automake-1.4-5::/usr/bin/automake
69 bash-1.14.7-16::/bin/sh
70 bash-1.14.7-16::/etc/bashrc
71 binutils-2.9.1.0.23-7::/usr/bin/strip
72 binutils-2.9.1.0.23-7::/usr/lib/libbfd-2.9.1.0.24.so
73 binutils-2.9.1.0.23-7::/usr/lib/libopcodes-2.9.1.0.24.so
74 bzip2-0.9.5c-1::/usr/lib/libbz2.so.0
75 dev-2.7.10-2::/dev/null
76 diffutils-2.7-16::/usr/bin/cmp
77 egcs-1.1.2-25::/usr/bin/gcc
78 egcs-1.1.2-25::/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs
79 esound-0.2.14-1::/usr/lib/libesd.so.0
80 file-3.27-3::/usr/bin/file
81 file-3.27-3::/usr/share/magic
82 fileutils-4.0-8::/bin/chgrp
83 fileutils-4.0-8::/bin/chmod
84 fileutils-4.0-8::/bin/chown
85 fileutils-4.0-8::/bin/cp
86 fileutils-4.0-8::/bin/ln
87 fileutils-4.0-8::/bin/ls
88 fileutils-4.0-8::/bin/mkdir
89 fileutils-4.0-8::/bin/mv
90 fileutils-4.0-8::/bin/rm
91 fileutils-4.0-8::/usr/bin/install
92 findutils-4.1-32::/usr/bin/xargs
93 gawk-3.0.4-1::/bin/awk
94 gawk-3.0.4-1::/bin/gawk
95 gettext-0.10.35-13::/usr/bin/xgettext
96 glib-1.2.5-1::/usr/lib/libglib-1.2.so.0
97 glib-1.2.5-1::/usr/lib/libgmodule-1.2.so.0
98 glib-devel-1.2.5-1::/usr/bin/glib-config
99 glibc-2.1.2-13::/etc/localtime
100 glibc-2.1.2-13::/etc/nsswitch.conf
101 glibc-2.1.2-13::/lib/ld-linux.so.2
102 glibc-2.1.2-13::/lib/libc.so.6
103 glibc-2.1.2-13::/lib/libcrypt.so.1
104 glibc-2.1.2-13::/lib/libdb.so.2
105 glibc-2.1.2-13::/lib/libdl.so.2
106 glibc-2.1.2-13::/lib/libm.so.6
107 glibc-2.1.2-13::/lib/libnsl.so.1
108 glibc-2.1.2-13::/lib/libnss_dns.so.2
109 glibc-2.1.2-13::/lib/libnss_files.so.2
110 glibc-2.1.2-13::/lib/libnss_nis.so.2
111 glibc-2.1.2-13::/lib/libnss_nisplus.so.2
112 glibc-2.1.2-13::/lib/libresolv.so.2
113 glibc-2.1.2-13::/usr/bin/ldd
114 gnome-libs-1.0.54-1::/usr/lib/libart_lgpl.so.2
115 gnome-libs-1.0.54-1::/usr/lib/libgnome.so.32
116 gnome-libs-1.0.54-1::/usr/lib/libgnomesupport.so.0
117 gnome-libs-1.0.54-1::/usr/lib/libgnomeui.so.32
118 gnome-libs-devel-1.0.54-1::/usr/bin/gnome-config
119 grep-2.3-2::/bin/egrep
120 grep-2.3-2::/bin/fgrep
121 grep-2.3-2::/bin/grep
122 gtk+-1.2.5-2::/usr/lib/libgdk-1.2.so.0
123 gtk+-1.2.5-2::/usr/lib/libgtk-1.2.so.0
124 imlib-1.9.7-1::/usr/lib/libgdk_imlib.so.1
125 libghttp-1.0.4-1::/usr/lib/libghttp.so.1
126 libtool-1.3.3-1::/usr/bin/libtoolize
127 libtool-1.3.3-1::/usr/share/libtool/config.guess
128 libtool-1.3.3-1::/usr/share/libtool/config.sub
129 libtool-1.3.3-1::/usr/share/libtool/ltconfig
130 libtool-1.3.3-1::/usr/share/libtool/ltmain.sh
131 libxml-1.4.0-1::/usr/lib/libxml.so.1
132 libxml-devel-1.4.0-1::/usr/bin/xml-config
133 m4-1.4-12::/usr/bin/m4
134 make-3.77-6::/usr/bin/make
135 mktemp-1.5-1::/bin/mktemp
136 net-tools-1.53-1::/bin/hostname
137 patch-2.5-9::/usr/bin/patch
138 rootfiles-5.2-5::/root/.bashrc
139 rpm-3.0.4-0.16::/bin/rpm
140 rpm-3.0.4-0.16::/usr/lib/librpm.so.0
141 rpm-3.0.4-0.16::/usr/lib/rpm/find-provides
142 rpm-3.0.4-0.16::/usr/lib/rpm/find-requires
143 rpm-3.0.4-0.16::/usr/lib/rpm/macros
144 rpm-3.0.4-0.16::/usr/lib/rpm/rpmpopt
145 rpm-3.0.4-0.16::/usr/lib/rpm/rpmrc
147 setup-2.0.5-1::/etc/group
148 setup-2.0.5-1::/etc/host.conf
149 setup-2.0.5-1::/etc/passwd
150 sh-utils-2.0-1::/bin/basename
151 sh-utils-2.0-1::/bin/false
152 sh-utils-2.0-1::/bin/sleep
153 sh-utils-2.0-1::/bin/true
154 sh-utils-2.0-1::/usr/bin/expr
155 sh-utils-2.0-1::/usr/bin/id
156 texinfo-3.12h-2::/usr/bin/makeinfo
157 textutils-2.0-2::/bin/cat
158 textutils-2.0-2::/bin/sort
159 textutils-2.0-2::/usr/bin/cut
160 textutils-2.0-2::/usr/bin/tr
161 zlib-1.1.3-5::/usr/lib/libz.so.1
164 The information can be used to generate build prerequisites. What is still
165 needed is a sensible approach on
168 1) eliminating obvious common dependencies (e.g. libtool, egcs).
169 2) identifying (and removing for now) per-platform build dependencies.
170 3) deciding on whether to add the build dependency on a file or on the
171 package that contains the file.
172 4) if adding a dependency on a package, choosing version ranges as
176 but that's up to individual packagers.