/*! \page builddependencies Generating build dependencies automatically As we start updating packages for the next Red Hat distro, I'd like to see packages start to make use of build dependencies. Basically build dependencies are just like install dependencies, but they are resolved against the build system just after parsing the spec file. Syntactically, build dependencies look just like install dependencies in a spec file with "Build" prefixed: \verbatim BuildPrereqs: BuildRequires: BuildConflicts: \endverbatim All the above dependencies include versions, files, existence/range tests, etc. The build dependency checking can also be turned off with --nodeps if necessary just like install dependency checking can. Eventually, build dependencies will be automated in rpm, but the major impediment to that effort is the engineering required to maintain the pretense that src rpm's are "noarch". Meanwhile, I've added a package called "InDependence-1.0" to powertools-6.2 that may be of use in detecting build dependencies that can be added to spec files as part of rebuilding packages for Red Hat 6.2. Here's a short example of how to generate the package/file names that were used while building gnorpm using InDependence: \verbatim rpm -U /mnt/redhat/comps/powertools/6.2/i386/InDependence-1.0-3.i386.rpm rpm -i /mnt/redhat/comps/dist/6.2/SRPMS/gnorpm-0.9-11.src.rpm cd /usr/src/redhat/SPECS dep -detail rpmbuild -ba gnorpm.spec >& xxx ... (the build will take longer since both dep and strace are pigs) ... grep -- '::' xxx > yyy \endverbatim \verbatim Aside: The dep perl wrapper is a "pig" only because it's exec'ing rpm -qf in order to turn filenames into package names. There are easier/faster ways to get this information... There's no way to speed up the /sbin/strace -q -etrace=open,execve -o ... command itself. The eventual implementation in rpm will snatch the same open/execve syscalls using LD_PRELOAD. Patches cheerfully accepted :-) \endverbatim Here's what's in yyy (\::\ format): \verbatim ORBit-devel-0.4.95-2::/usr/bin/orbit-config XFree86-libs-3.3.5-6::/usr/X11R6/lib/libICE.so.6 XFree86-libs-3.3.5-6::/usr/X11R6/lib/libSM.so.6 XFree86-libs-3.3.5-6::/usr/X11R6/lib/libX11.so.6 XFree86-libs-3.3.5-6::/usr/X11R6/lib/libXext.so.6 audiofile-0.1.9-1::/usr/lib/libaudiofile.so.0 autoconf-2.13-5::/usr/bin/autoconf autoconf-2.13-5::/usr/bin/autoheader autoconf-2.13-5::/usr/share/autoconf/acgeneral.m4 autoconf-2.13-5::/usr/share/autoconf/autoconf.m4f automake-1.4-5::/usr/bin/aclocal automake-1.4-5::/usr/bin/automake bash-1.14.7-16::/bin/sh bash-1.14.7-16::/etc/bashrc binutils-2.9.1.0.23-7::/usr/bin/strip binutils-2.9.1.0.23-7::/usr/lib/libbfd-2.9.1.0.24.so binutils-2.9.1.0.23-7::/usr/lib/libopcodes-2.9.1.0.24.so bzip2-0.9.5c-1::/usr/lib/libbz2.so.0 dev-2.7.10-2::/dev/null diffutils-2.7-16::/usr/bin/cmp egcs-1.1.2-25::/usr/bin/gcc egcs-1.1.2-25::/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs esound-0.2.14-1::/usr/lib/libesd.so.0 file-3.27-3::/usr/bin/file file-3.27-3::/usr/share/magic fileutils-4.0-8::/bin/chgrp fileutils-4.0-8::/bin/chmod fileutils-4.0-8::/bin/chown fileutils-4.0-8::/bin/cp fileutils-4.0-8::/bin/ln fileutils-4.0-8::/bin/ls fileutils-4.0-8::/bin/mkdir fileutils-4.0-8::/bin/mv fileutils-4.0-8::/bin/rm fileutils-4.0-8::/usr/bin/install findutils-4.1-32::/usr/bin/xargs gawk-3.0.4-1::/bin/awk gawk-3.0.4-1::/bin/gawk gettext-0.10.35-13::/usr/bin/xgettext glib-1.2.5-1::/usr/lib/libglib-1.2.so.0 glib-1.2.5-1::/usr/lib/libgmodule-1.2.so.0 glib-devel-1.2.5-1::/usr/bin/glib-config glibc-2.1.2-13::/etc/localtime glibc-2.1.2-13::/etc/nsswitch.conf glibc-2.1.2-13::/lib/ld-linux.so.2 glibc-2.1.2-13::/lib/libc.so.6 glibc-2.1.2-13::/lib/libcrypt.so.1 glibc-2.1.2-13::/lib/libdb.so.2 glibc-2.1.2-13::/lib/libdl.so.2 glibc-2.1.2-13::/lib/libm.so.6 glibc-2.1.2-13::/lib/libnsl.so.1 glibc-2.1.2-13::/lib/libnss_dns.so.2 glibc-2.1.2-13::/lib/libnss_files.so.2 glibc-2.1.2-13::/lib/libnss_nis.so.2 glibc-2.1.2-13::/lib/libnss_nisplus.so.2 glibc-2.1.2-13::/lib/libresolv.so.2 glibc-2.1.2-13::/usr/bin/ldd gnome-libs-1.0.54-1::/usr/lib/libart_lgpl.so.2 gnome-libs-1.0.54-1::/usr/lib/libgnome.so.32 gnome-libs-1.0.54-1::/usr/lib/libgnomesupport.so.0 gnome-libs-1.0.54-1::/usr/lib/libgnomeui.so.32 gnome-libs-devel-1.0.54-1::/usr/bin/gnome-config grep-2.3-2::/bin/egrep grep-2.3-2::/bin/fgrep grep-2.3-2::/bin/grep gtk+-1.2.5-2::/usr/lib/libgdk-1.2.so.0 gtk+-1.2.5-2::/usr/lib/libgtk-1.2.so.0 imlib-1.9.7-1::/usr/lib/libgdk_imlib.so.1 libghttp-1.0.4-1::/usr/lib/libghttp.so.1 libtool-1.3.3-1::/usr/bin/libtoolize libtool-1.3.3-1::/usr/share/libtool/config.guess libtool-1.3.3-1::/usr/share/libtool/config.sub libtool-1.3.3-1::/usr/share/libtool/ltconfig libtool-1.3.3-1::/usr/share/libtool/ltmain.sh libxml-1.4.0-1::/usr/lib/libxml.so.1 libxml-devel-1.4.0-1::/usr/bin/xml-config m4-1.4-12::/usr/bin/m4 make-3.77-6::/usr/bin/make mktemp-1.5-1::/bin/mktemp net-tools-1.53-1::/bin/hostname patch-2.5-9::/usr/bin/patch rootfiles-5.2-5::/root/.bashrc rpm-3.0.4-0.16::/bin/rpm rpm-3.0.4-0.16::/usr/lib/librpm.so.0 rpm-3.0.4-0.16::/usr/lib/rpm/find-provides rpm-3.0.4-0.16::/usr/lib/rpm/find-requires rpm-3.0.4-0.16::/usr/lib/rpm/macros rpm-3.0.4-0.16::/usr/lib/rpm/rpmpopt rpm-3.0.4-0.16::/usr/lib/rpm/rpmrc sed-3.02-4::/bin/sed setup-2.0.5-1::/etc/group setup-2.0.5-1::/etc/host.conf setup-2.0.5-1::/etc/passwd sh-utils-2.0-1::/bin/basename sh-utils-2.0-1::/bin/false sh-utils-2.0-1::/bin/sleep sh-utils-2.0-1::/bin/true sh-utils-2.0-1::/usr/bin/expr sh-utils-2.0-1::/usr/bin/id texinfo-3.12h-2::/usr/bin/makeinfo textutils-2.0-2::/bin/cat textutils-2.0-2::/bin/sort textutils-2.0-2::/usr/bin/cut textutils-2.0-2::/usr/bin/tr zlib-1.1.3-5::/usr/lib/libz.so.1 \endverbatim The information can be used to generate build prerequisites. What is still needed is a sensible approach on \verbatim 1) eliminating obvious common dependencies (e.g. libtool, egcs). 2) identifying (and removing for now) per-platform build dependencies. 3) deciding on whether to add the build dependency on a file or on the package that contains the file. 4) if adding a dependency on a package, choosing version ranges as appropriate. \endverbatim but that's up to individual packagers. */