OK, I've been working on putting some RPM packaging guidelines together
over the past couple of weeks. Since I see that there are all kinds of
people here looking for something to do, I thought I'd post what I have
on RPM guidelines so far. I'm including both the SGML source (it's
named .xml, but don't let that fool you), and the HTML output as a
tar.gz. The links in the HTML don't work, yet, but they will soon.
Enjoy, let me know what you think so far. Thanks,
Greg
--
Troll, troll, troll your post
Gently down the feed
Merrily, merrily troll along
A life is what you need...
<!DOCTYPE Article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<article id="index">
<artheader>
<title>GNOME RPM spec file packaging guidelines</title>
<author>
<firstname>Gregory</firstname>
<surname>Leblanc</surname>
<affiliation>
<orgname>GNOME</orgname>
<orgdiv>GNOME Packaing Project</orgdiv>
<address><email>gleblanc cu-portland edu</email></address>
</affiliation>
</author>
<abstract>
<para>This document attempts to outline the guidelines that GPP
spec files should adhere to. These guidelines are designed to make
spec files that will function on at least Red Hat 6.x and 7.x.
They should also function on Red Hat-like systems with only minor
adjustments. For systems that use RPM but aren't Red Hat-like,
these spec files should serve as a good starting point.</para>
<para>Some knowledge of writing RPM spec files is assumed. The
book Maximum RPM has a good intro to some of the concepts and
syntax used in RPM spec files.</para>
</abstract>
</artheader>
<section id="preamble">
<title>SPEC file preamble</title>
<para>The first section of the spec file is the preamble. This
contains lots of general information about the package, such as the
name, version, source location, and so on. Since the GNOME project
uses autoconf and automake to help ensure that our programs are
portable, we've tried to leverage this into our spec files. We use
autoconf to replace the version number, and to help up manage
package dependancy versions.</para>
<informalexample>
<programlisting role="specfile">
<systemitem class="macro">%define</systemitem> localstatedir <link linkend="localstatedir">/var/lib</link>
Summary: <link linkend="summary"><replaceable>The core programs for the GNOME GUI desktop environment.</replaceable></link>
Name: <link linkend="name"><replaceable>gnome-core</replaceable></link>
Version: <systemitem class="macro">%ver</systemitem>
Release: <systemitem class="macro">%rel</systemitem>
License: <link linkend="license"><replaceable>LGPL</replaceable></link>
Group: <link linkend="group"><replaceable>System Environment/Base</replaceable></link>
Source: <link linkend="source"><replaceable>ftp://ftp.gnome.org/pub/sources/gnome-core/gnome-core-%{ver}.tar.gz</replaceable></link>
BuildRoot: <link linkend="buildroot"><replaceable>%{_tmmpath}/%{name}-%{version}-buildroot</replaceable></link>
URL: <link linkend="url"><replaceable>http://www.gnome.org</replaceable></link>
Prereq: <link linkend="prereq"><replaceable>/sbin/install-info</replaceable></link>
Requires: <link linkend="requires"><replaceable>gtk+ >= @GTK_REQUIRED@, gdk-pixbuf >= @GDK_PIXBUF_REQUIRED@</replaceable></link>
Requires: <link linkend="requires"><replaceable>libglade >= @LIBGLADE_REQUIRED@, libxml</replaceable></link>
Requires: <link linkend="requires"><replaceable>gnome-libs >= @GNOME_LIBS_REQUIRED@</replaceable></link>
Requires: <link linkend="requires"><replaceable>ORBit >= @ORBIT_REQUIRED@</replaceable></link>
Requires: <link linkend="requires"><replaceable>control-center >= @CONTROL_CENTER_REQUIRED@</replaceable></link>
BuildRequires: <link linkend="buildrequires"><replaceable>gtk+-devel >= @GTK_REQUIRED@, libxml-devel</replaceable></link>
BuildRequires: <link linkend="buildrequires"><replaceable>gdk-pixbuf-devel >= @GDK_PIXBUF_REQUIRED@</replaceable></link>
BuildRequires: <link linkend="buildrequires"><replaceable>libglade-devel >= @LIBGLADE_REQUIRED@</replaceable></link>
BuildRequires: <link linkend="buildrequires"><replaceable>scrollkeeper >= @SCROLLKEEPER_REQUIRED@</replaceable></link>
BuildRequires: <link linkend="buildrequires"><replaceable>gnome-libs-devel >= @GNOME_LIBS_REQUIRED@</replaceable></link>
BuildRequires: <link linkend="buildrequires"><replaceable>ORBit-devel >= @ORBIT_REQUIRED@</replaceable></link>
BuildRequires: <link linkend="buildrequires"><replaceable>control-center-devel >= CONTROL_CENTER_REQUIRED@</replaceable></link>
</programlisting>
</informalexample>
<formalpara id="localstatedir">
<title>localstatedir</title>
<para>This line forces <varname>localstatedir</varname> to be set
to <filename class="directory">/var/lib</filename>. This
directory isn't set to FHS compliance by RPM, so we're forced to
override it here.</para>
</formalpara>
<formalpara id="summary">
<title>Summary</title>
<para>This should be a short summary of what the program or
package does. Including the name of the package here is
redundant, so don't do that.</para>
</formalpara>
<formalpara id="name">
<title>Name</title>
<para>This specified the name of the package. It is
case-sensitive, and should match the name of the tarball created
when you run 'make dist'.</para>
</formalpara>
<formalpara id="license">
<title>License</title>
<para>This is the license that the package is distributed under.
Probably GPL or LGPL for most GNOME packages. Many older spec
files erroneously call this field <quote>Copyright</quote>.
Please correct this when you see it.</para>
</formalpara>
<formalpara id="group">
<title>Group</title>
<para>This should be one of the canonical groups from
<filename>/usr/share/doc/rpm-<replaceable>VERSION</replaceable>/GROUPS</filename>.
Please don't make up new groups.</para>
</formalpara>
<formalpara id="source">
<title>Source</title>
<para>You can have multiple <quote>Source</quote> lines. You
should start numbering sources at 0. A tag of simply
<quote>Source</quote> implies 0. You should include a complete
URL to the source package whenever possible.</para>
</formalpara>
<formalpara id="buildroot">
<title>BuildRoot</title>
<para>Make sure you use the special <systemitem
class="macro">%{_tmppath}</systemitem> macro, and not hardcode
<filename class="directory">/tmp</filename> or <filename
class="directory">/var/tmp</filename>. The user may have
configured RPM to put temporary files elsewhere. Use the name and
version macros so that you can build two different versions of the
package at the same time without collisions.</para>
</formalpara>
<formalpara id="url">
<title>URL</title>
<para>Use this tag for the package's homepage, if it has one.</para>
</formalpara>
<formalpara id="prereq">
<title>PreReq</title>
<para>This lists files or packages that are required to be present
<emphasis>before</emphasis> the package can be installed. This is
very important if you're using other programs in <systemitem
class="macro">%pre</systemitem> or <systemitem
class="macro">%post</systemitem> sections.</para>
</formalpara>
<formalpara id="requires">
<title>Requires</title>
<para>If this package requires other packages to be installed in
order to function properly, they should be listed here. Note the
<varname>@GTK_REQUIRED@</varname>, which is defined in
<filename>configure.in</filename>. This ensures that the version
required by the <filename>configure</filename> script is the same
as the version required by RPM. You can specify files here by
their full path, for example <filename>/sbin/ldconfig</filename>.</para>
</formalpara>
<formalpara id="buildrequires">
<title>BuildRequires</title>
<para>This is similar to the PreReq tag, except that it applies to
the build of this package. So, if the package needs some other
package installed the time that <filename>configure</filename> is
run, it should be listed on the BuildRequires line</para>
</formalpara>
</section>
</article>Attachment:
rpm-packaging-guidelines-html.tar.gz
Description: GNU Zip compressed data