This page contains guidelines which are no longer relevant to Fedora, but still apply to EPEL packages. These guidelines are designed to avoid conflict with the larger Fedora Packaging Guidelines, but should any conflicts occur, these guidelines should take precedence (on EPEL packages).
As a reminder, these guidelines only apply to EPEL packages, not to Fedora packages.
Rich Dependencies
Neither RPM nor Yum in either EPEL-7 or EPEL-6 supports rich (or Boolean) dependencies.
The %license tag
RHEL6 does not include a definition of the %license
macro, so the epel-rpm-macros
package (which is present for every build) will map it to %doc
. This renders it unnecessary to define %license
by hand. However, due to bugs in the SCL macros, this definition will not exist if the SCL macros package is present on the system. This should not affect packages when they are built in the build system, but users who do have have the SCL macros installed may see issues when building such packages locally.
Limited Arch Packages
When RHEL ships a package for only a subset of available arches, it's possibly for EPEL to ship that same package in order to satisfy dependencies in the other arches in EPEL. In order to do this:
- Make sure the package is not shipped for all architectures. The valid architectures are:
- EPEL6: i686, ppc64, x86_64
- EPEL7: aarch64, ppc64, ppc64le, x86_64.
- Make sure the package meets the Fedora licensing and distribution rules. Nothing non-free or under an unacceptable license.
- Notify the epel-devel list of your intention to add this package.
- Change the release of the package to have a leading 0. EXAMPLE: RHEL has foobar-1.0-1, you change it to foobar-1.0-0.1 for EPEL.
- Add a Changelog entry that the package was added to EPEL and has a 0 leading version to keep it older than RHEL.
- Request the branch you need (el6 or epel7) using
fedpkg request-branch
. - Import and build your package, submit as update.
- Watch the RHEL version of the package. When it updates, you should update the EPEL version too. You should never update other than that.
NOTE: Do not add ExclusiveArch tags, this will break building on the other architectures!
EPEL 6
SysV initscripts
SysV initscripts are used only in EPEL6. Packages for EPEL7 and later MUST provide systemd units as described in Packaging:Systemd.
Provides and Requires Filtering
Generic Filtering on EPEL6
On EPEL6, the version of rpm is too old to support the Fedora methods of filtering Provides and Requires. Please the older guidelines instead: EPEL:Packaging_Autoprovides_and_Requires_Filtering
In %prep (preferred)
Filtering can be done entirely in the SPEC file, in the %prep section:
%prep %setup -q -n Foo-%{version} cat << \EOF > %{name}-prov #!/bin/sh %{__perl_provides} $* |\ sed -e '/perl(unwanted_provide)/d' EOF %global __perl_provides %{_builddir}/%{name}-%{version}/%{name}-prov chmod +x %{__perl_provides} cat << \EOF > %{name}-req #!/bin/sh %{__perl_requires} $* |\ sed -e '/perl(unwanted_require)/d' EOF %global __perl_requires %{_builddir}/%{name}-%{version}/%{name}-req chmod +x %{__perl_requires}
External filtering
Or the script can be placed in an external file and referenced from the specfile. This is worse than the above because the full path of the to-be-overridden script needs to be hardcoded into the file, ignoring the system rpmbuild config. It is, however, the method used by a significant number of existing packages.
Source98: filter-provides.sh Source99: filter-requires.sh %global __perl_provides %{SOURCE98} %global __perl_requires %{SOURCE99}
where filter-provides.sh contains:
#!/bin/sh /usr/lib/rpm/perl.prov $* | sed -e '/perl(unwanted_provide)/d'
and filter-requires.sh contains:
#!/bin/sh /usr/lib/rpm/perl.req $* | sed -e '/perl(unwanted_require)/d'
PHP PEAR Macros
In EPEL6, the "%{pear_macrodir}" macro is not defined. The simplest fix is to add this line to your spec file:
%{!?pear_metadir: %global pear_metadir %{pear_phpdir}}
Alternately, simply use %{pear_phpdir} instead.
Scriptlets
Fedora has been moving towards the use of file triggers and away from requiring that packagers cut and paste scriptlets into loads of packages. These scriptlets would still be needed for EPEL, and as scriptlets are no longer needed in any Fedora release, they're moved here.
On EPEL 7 and older, ldconfig MUST be called properly in order to regenerate the dynamic linker's cache. If the package or subpackage has no existing %post
or %postun
scriptlets, simply include the %ldconfig_scriptlets
macro on its own line before the %files list.
[...] %install # Install the program %ldconfig_scriptlets libs %files libs %license GPL [...]
Using the %ldconfig_scriptlets
macro will automatically generate a dependency on ldconfig where necessary. The macro will do nothing at all in Fedora.
If the package or subpackage already has existing %post
or %postun
scriptlet, then use of %ldconfig_scriptlets
will cause an error. You can use %ldconfig_post
or %ldconfig_postun
individually to generate a scriptlet which doesn't already conflict.
Within an existing %post
or %postun
scriptlet, use %{?ldconfig}
on its own line to call ldconfig on those releases which need it. This will do nothing when not needed. When calling ldconfig in this way, you MUST also have the proper dependency on /sbin/ldconfig: Requires(post): /sbin/ldconfig
and/or Requires(postun): /sbin/ldconfig
as appropriate. (This will generate an unnecessary dependency on releases which do not strictly need it, but this does no harm.)
GSettings Schema
GSettings is the configuration system used by the GNOME 3 desktop. It replaces the older GConf system, which was used in GNOME 2. GSettings has pluggable backends, the 'native' one for GNOME is using DConf to store settings. The GSettings API and utilities are part of the glib2 package.
Programs which use GSettings install schema information including default values in the directory %{_datadir}/glib-2.0/schemas. Schema files are xml files with the extension .gschema.xml. At runtime, GSettings uses the schemas in a compiled binary (but arch-neutral) form, which is created by running the glib-compile-schemas utility. /usr/bin/glib-compile-schemas must be run whenever the set of installed schemas changes.
%postun if [ $1 -eq 0 ] ; then /usr/bin/glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || : fi %posttrans /usr/bin/glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
gdk-pixbuf loaders
gdk-pixbuf is a library that is part of the gdk-pixbuf2 package. It is for loading images in various formats in GNOME. gdk-pixbuf can be extended by implementing loaders for image formats in loadable modules. These loadable modules have to be installed in %{_libdir}/gdk-pixbuf-2.0/2.10.0/loaders. To avoid opening all modules in that directory unnecessarily, gdk-pixbuf maintains a cache with information about the available modules in the text file %{_libdir}/gdk-pixbuf-2.0/2.10.0/loaders.cache. This cache file needs to be updated when the set of installed modules changes, by calling the /usr/bin/gdk-pixbuf-query-loaders binary. Multilib considerations force us to install the binary in -32 and -64 variants.
The scriptlets to maintain the cache file are:
%postun /usr/bin/gdk-pixbuf-query-loaders-%{__isa_bits} --update-cache &> /dev/null || : %post if [ $1 -eq 1 ] ; then # For upgrades, the cache will be regenerated by the new package's %postun /usr/bin/gdk-pixbuf-query-loaders-%{__isa_bits} --update-cache &> /dev/null || : fi
Note the use of %{__isa_bits}, which is an rpm macro that expands to either 32 or 64, depending on the architecture of the package.
GTK+ modules
The GTK+ toolkit (in the gtk3 package) can be extended by loadable modules which can provide theme engines, input methods, print backends or other functionality. These modules have to be installed in subdirectories of %{_libdir}/gtk-3.0 or %{_libdir}/gtk-3.0/3.0.0. For the input methods, GTK+ maintains a cache in the text file %{_libdir}/gtk-3.0/3.0.0/immodules.cache. This cache file needs to be updated when the set of installed input methods changes, by calling the gtk-query-immodules-3.0 binary. Multilib considerations force us to install the binary in -32 and -64 variants.
The scriptlets to maintain the cache file are:
%postun /usr/bin/gtk-query-immodules-3.0-%{__isa_bits} --update-cache &> /dev/null || : %post if [ $1 -eq 1 ] ; then # For upgrades, the cache will be regenerated by the new package's %postun /usr/bin/gtk-query-immodules-3.0-%{__isa_bits} --update-cache &> /dev/null || : fi
The 3.0 in the binary name is there because gtk2 has its own utility for the same purpose, called gtk-query-immodules-2.0. Note the use of %{__isa_bits}, which is an rpm macro that expands to either 32 or 64, depending on the architecture of the package.
GIO modules
GIO is a library that is part of the glib2 package. It is a low-level part of the GNOME stack. GIO can be extended by implementing extension points in loadable modules. These loadable modules have to be installed in %{_libdir}/gio/modules. To avoid opening all modules in that directory unnecessarily, GIO maintains a cache with information about the available modules in the text file giomodule.cache in the same directory. This cache file needs to be updated when the set of installed modules changes, by calling the gio-querymodules binary. Multilib considerations force us to install the binary in -32 and -64 variants.
The scriptlets to maintain the cache file are:
%postun /usr/bin/gio-querymodules-%{__isa_bits} %{_libdir}/gio/modules &> /dev/null || : %post # We run this after every install or upgrade because of a cornercase # when installing the second architecture of a multilib package /usr/bin/gio-querymodules-%{__isa_bits} %{_libdir}/gio/modules || :
Note the use of %{__isa_bits}, which is an rpm macro that expands to either 32 or 64, depending on the architecture of the package.
mimeinfo
Use this when a package drops an XML file in %{_datadir}/mime/packages.
%post /bin/touch --no-create %{_datadir}/mime/packages &>/dev/null || : %postun if [ $1 -eq 0 ] ; then /usr/bin/update-mime-database %{_datadir}/mime &> /dev/null || : fi %posttrans /usr/bin/update-mime-database %{?fedora:-n} %{_datadir}/mime &> /dev/null || :
Note that similarly to the gtk-update-icon-cache code, these scriptlets should be run only if the user has update-mime-info installed and without a specific Requires: shared-mime-info. If shared-mime-info is not installed, update-mime-database won't be run when this package is installed. This does not matter because it will be run when the shared-mime-info package is installed.
desktop-database
Use this when a desktop entry has a MimeType key.
%post /usr/bin/update-desktop-database &> /dev/null || : %postun /usr/bin/update-desktop-database &> /dev/null || :
Note: This scriptlet follows the same convention as mimeinfo files and gtk-icon-cache. Namely, the spec file should not Require desktop-file-utils for this. For older releases, one should
Requires(post): desktop-file-utils Requires(postun): desktop-file-utils
(See http://bugzilla.redhat.com/180898 and http://bugzilla.redhat.com/180899)
Icon Cache
If an application installs icons into one of the subdirectories in %{_datadir}/icons/
(such as hicolor
in the following examples), icon caches must be updated so that the installed icons show up in menus right after package installation. This consists of updating the timestamp of the top-level icon directory where the icons were installed, and running gtk-update-icon-cache
. 'touch'ing the top-level dir is done so that environments compatible with the Icon theme specification can refresh their caches, and gtk-update-icon-cache
which is additionally required for GNOME also does its work based on the dir timestamp.
Note that no dependencies should be added for this. If gtk-update-icon-cache is not available, there's nothing that would be needing the cache update, ditto if "touch" is not available, there's nothing that would benefit from icon cache updates installed yet either. Not adding the dependency on gtk-update-icon-cache (ie. gtk2 >= 2.6.0) or "touch" makes it easier to use the package (or the same specfile) on systems where it's not available nor needed, such as older distro versions or (very) trimmed down installations, and generally results in less entries in specfiles, rpmdb, and repo metadatas.
%post /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : %postun if [ $1 -eq 0 ] ; then /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : fi %posttrans /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :