8. Multi-architectural RPM Building
RPM can now be used to build packages for the Intel i386, the Digital Alpha
running Linux, and the Sparc (and others). There are several features that
make building packages on all platforms easy. The first of these is the "optflags"
directive in the
/etc/rpmrc. It can be
used to set flags used when building software to architecture specific values.
Another feature is the "arch" macros in the spec file. They can be used to
do different things depending on the architecture you are building on. Another
feature is the "Exclude" directive in the header.
8.1. Sample spec File
The following is part of the spec file for the "fileutils" package. It is
setup to build on both the Alpha and the Intel.
Summary: GNU
File Utilities
Name: fileutils
Version: 3.16
Release: 1
Copyright: GPL
Group: Utilities/File
Source0: prep.ai.mit.edu:/pub/gnu/fileutils-3.16.tar.gz
Source1: DIR_COLORS
Patch: fileutils-3.16-mktime.patch
%description
These are the
GNU file management utilities. It includes programs
to copy, move,
list, etc, files.
The ls program
in this package now incorporates color ls!
%prep
%setup
%ifarch alpha
%patch -p1
autoconf
%endif
%build
configure --prefix=/usr
--exec-prefix=/
make CFLAGS="$RPM_OPT_FLAGS"
LDFLAGS=-s
%install
rm -f /usr/info/fileutils*
make install
gzip -9nf /usr/info/fileutils*
|
8.2. Optflags
In this example, you see how the "optflags" directive is used from the /etc/rpmrc. Depending on which architecture you
are building on, the proper value is given to RPM_OPT_FLAGS. You must patch
the Makefile for your package to use this variable in place of the normal
directives you might use (like-m486 and -O2). You can get a
better feel for what needs to be done by installing this source package and
then unpacking the source and examine the Makefile. Then look at the patch
for the Makefile and see what changes must be made.
8.3. Macros
The
%ifarch macro is very important
to all of this. Most times you will need to make a patch or two that is specific
to one architecture only. In this case, RPM will allow you to apply that patch
to just one architecture only.
In the above example, fileutils has a patch for 64 bit machines. Obviously,
this should only be applied on the Alpha at the moment. So, we add an
%ifarchmacro around the 64 bit patch like so:
%ifarch axp %patch1 -p1 %endif
|
This will insure that the patch is not applied on any architecture except
the alpha.
8.4. Excluding
Architectures from Packages
So that you can maintain source RPMs in one directory for all platforms,
we have implemented the ability to "exclude" packages from being built on
certain architectures. This is so you can still do things like
rpm --rebuild /usr/src/SRPMS/*.rpm
|
and have the right packages build. If you haven't yet ported an application
to a certain platform, all you have to do is add a line like:
to the header of the spec file of the source package. Then rebuild the package
on the platform that it does build on. You'll then have a source package that
builds on an Intel and can easily be skipped on an Alpha.
8.5. Finishing Up
Using RPM to make multi-architectural packages is usually easier to do than
getting the package itself to build both places. As more of the hard packages
get built this is getting much easier, however. As always, the best help when
you get stuck building an RPM is to look a similar source package.