Haskell Packaging Guidelines

This page documents the guidelines and conventions for packaging Haskell projects in Fedora.

GHC (Glasgow Haskell Compiler) is the current mainstream Haskell compiler.
Most Haskell packages are released on Hackage and use the Cabal package system. So the current guidelines mostly focus on packaging for GHC using Cabal.

Spec file templates

There are three types of Haskell Cabal packages: binary only (Bin), library only (Lib), and binary and library (BinLib):

Standardizing the packaging lowers the maintenance burden considerably across Fedora's Haskell packages.
Spec files in line with these templates can be generated automatically by the cabal-rpm packaging tool which also adds dependencies listed in the package's cabal configuration file.
Most packages should then build, though for some Cabal packages
it may be necessary to specify some additional BuildRequires and/or Requires, and to check non-Haskell devel dependencies.

Naming

Haskell Bin and BinLib packages should follow the usual Fedora Package Naming Guidelines for base package naming: ie follow the upstream name. Examples include projects like darcs and xmonad. BinLib packages should subpackage their libraries with naming following Lib packages.

For example the xmonad BinLib package has library subpackages

ghc-xmonad for the shared library, and

ghc-xmonad-devel for devel files and the static library.

The names of Haskell Lib packages built for ghc are prefixed by "ghc-". For example the zlib library package is named ghc-zlib, and the QuickCheck library is named ghc-QuickCheck.

If a library is packaged for more than one Haskell compiler or interpreter, the base name should instead be prefixed with haskell, e.g. haskell-X11. Such a package would then have subpackages for each compiler and/or interpreter it is built for (e.g. ghc-X11, hugs98-X11, etc).

Headers

The macro pkg_name is used to carry the name of the upstream library package (i.e. without the Fedora "ghc-" prefix).
It should be defined at the top of Lib and BinLib packages:

%global pkg_name <package>

The macros common_summary and common_description are used as the basis
for Summary and Description respectively for the Lib and BinLib base and subpackages.
It is recommended to define them otherwise simple generic text based on pkg_name will be used for the subpackages.

Shared and static library linking

GHC uses static libraries by default, but now also supports shared libraries on some platforms. Lib and BinLib packages should provide static, shared, and profiling libraries:

the shared library lives in the base library package, and

the static and profiling library and header files in the -devel subpackage.

Because GHC still assumes static versions of libraries are installed they need to be in the devel subpackage and it doesn't make sense to subpackage them yet.

Executables in Bin and BinLib packages should be dynamically linked to shared libraries.

Note that executables in BinLib packages are currently staticly linked against the library in their own package, but will be dynamically linked against other dependent libraries.

Some particular packages may do user compilation during runtime in which case they will need Requires as well as BuildRequires for their dependencies: examples include xmonad and yi which require their devel package to be present to allow users to relink their configuration or customization.

RPM Macros

The templates all have buildrequires for ghc-rpm-macros, which provides macros.ghc to assist with packaging Haskell Cabal packages.

The main commonly used macros are:

%ghc_bin_build, %ghc_lib_build

%ghc_bin_install, %ghc_lib_install

%ghc_devel_package, %ghc_devel_description

%ghc_package, %ghc_description

%ghc_devel_post_postun

%ghc_files

They are used in the templates and explained in more detail below.

Generally the macros should just work and do the right thing, but if necessary
a macro can be replaced by its expansion
and then tweaked in order to get a package to build for Fedora.

Bin packages

Bin package executables are dynamically linked to shared Haskell libraries when available, but this can be overridden if necessary by defining the ghc_without_dynamic macro.

%ghc_bin_build is used to configure and build bin packages. It runs:

%global debug_package %{nil}: debuginfo is disabled since ghc's output is not in DWARF format.

%cabal_configure: configure the package for building and dynamic linking.

%cabal build: builds the package.

%ghc_bin_install is used to install bin packages. It runs:

%cabal_install: installs the package.

%ghc_strip_dynlinked: strips the dynamically linked binary.

Lib and BinLib packages

BinLib package executables are dynamically linked to other shared Haskell libraries when available, but this can be overridden if necessary by defining the ghc_without_dynamic macro.

%ghc_lib_build is used to configure, build and generate documentation for Lib and BinLib packages. It runs:

%global debug_package %{nil}: debuginfo is disabled since ghc's output is not in DWARF format.

%cabal_configure --ghc -p: configures the package for building with ghc and profiling. Libraries should build profiling versions of their static libraries.