RPM .spec Files
Paul Heinlein
First published on April 5, 2004
Last updated on August 12, 2005
One of my duties at work is building and maintaining software for
systems running the Red Hat and Fedora
Core Linux distributions. The Red Hat
Packaging Manager (rpm
) system is far from
perfect, but it’s still very useful.
Red Hat and Fedora Core ship with an ever-increasing variety of packages, but there are still some useful ones that don’t get included—and a few that do get included but that are out of date for my purposes. So I’ve built my own packages to keep my systems a-hummin’.
The .spec
file
At the heart of the rpm building process is the .spec
file. It governs
how a package is configured, what patches are applied, what files will
be installed and where they’ll be installed, and what system-level
activity needs to take place before and after a package is installed.
Below are some .spec files that I’ve devised. I should note that while the packages they produce work quite well for me, they haven’t been tested in any methodical way.
If you’re looking to build serious production-quality packages, you might be better off studying the .spec files at Fedora Extras, Fresh RPMS, DAG, or ATrpms. The packages at Fedora Extras, in particular, are subjected to a fairly rigorous QA process and are of consistently high quality.
Home-brewed .spec
files
In the .spec
files listed below, you’ll often see reference to a
variable named redhatvers
. It lets me build packages that are
explicitly tied to a certain Red Hat or Fedora release. I define that
variable in /etc/rpm/macros
:
%redhatvers fc2
It shouldn’t make any difference if you don’t have it defined on your system (at least, that’s the theory <grin>).
I leave to you the task of locating and retrieving the source tarballs for each of these packages, though you should find some helpful URLs in the .spec files themselves to get you pointed in the right direction. Happy building!
-
Adobe Acrobat: the universal PDF reader
-
aterm: spry little terminal client with features like transparency
-
cfengine: incredibly powerful configuration management tool
-
conserver: console client and server, useful for managing headless servers
-
cronolog: log-file rotator
-
DOSBox: x86/DOS emulator with sound/graphics
-
GQ: GTK+-based LDAP client
-
Hugs98: a Haskell interpreter
-
LyX: document processor
-
mod_auth_pam: authenticates Apache users against PAM
-
mpack/munpack: utilities for encoding and decoding MIME messages
-
pine: mail client from Univ. of Washington
Building a binary package
I’ll provide the barest of outlines of the procedure you need to follow to build a binary RPM package. If you need more information than I provide, or if something goes wrong, you’ll need to research some of the resources listed in my “getting started” section, below.
Download the .spec
file; it needn’t be put into any specific
directory.
Download any sources and patches needed by the .spec
file and install
them into the RPM source directory.
On Red Hat and Fedora systems, the default path for that directory is
/usr/src/redhat/SOURCES
. You can verify that path by polling rpm
for
the value of the _sourcedir
macro.
rpm --eval '%{_sourcedir}'
Build the source and binary packages.
rpmbuild -ba /path/to/foo.spec
If successful, the rpm-building process will end by telling you the locations of the newly built packages, e.g.,
Wrote: /usr/src/redhat/SRPMS/foo-1.23-1.src.rpm
Wrote: /usr/src/redhat/RPMS/i386/foo-1.23-1.i386.rpm
Wrote: /usr/src/redhat/RPMS/i386/foo-debuginfo-1.23-1.i386.rpm
Install or update the new binary package.
rpm -Uvh /usr/src/redhat/RPMS/i386/foo-1.23-1.i386.rpm
Getting started with RPM building
Someone once asked, “How do I go about learning about all this RPM goodness?” Here’s what I did/do:
-
Read the online copy of Maximum RPM
-
Poke through the
.spec
files in the source packages (SRPMS) that come with your distribution. GNU Midnight Commander (mc
) will do all the cpio magic behind the scenes so you can explore source packages quickly and easily. If you don’t havemc
on your local system, you can unpack an SRPM manually:rpm2cpio foo-1.23.src.rpm | cpio -id
-
Macros are at the core of RPM packaging. There are macros for everything: directory locations, compiler optimizations, etc. On Red Hat and Fedora systems, you’ll want to look at all the
macros
files in the/usr/lib/rpm
directory tree. You can locate them all in one fell swoop:find /usr/lib/rpm -name macros
-
Grok a copy of ``; you’ll learn some cool things about packaging Perl CPAN modules. (Or you can just use
cpan2rpm
and not worry about the details. :-) -
If you end up doing a lot of RPM work, join the rpm-list mailing list. In particular, Jeff Johnson, the lead RPM developer at Red Hat, is very helpful—and usually very quick to answer questions.