Haskell package guidelines
32-bit – CLR – CMake – Cross – DKMS – Eclipse – Electron – Font – Free Pascal – GNOME – Go – Haskell – Java – KDE – Kernel – Lisp – Meson – MinGW – Node.js – Nonfree – OCaml – Perl – PHP – Python – R – Ruby – Rust – Shell – VCS – Web – Wine
This document aims to cover standards and guidelines for producing good Haskell packages on Arch.
Until this document is written, contact User:Felixonmars.
Package naming
For Haskell libraries, use haskell-libraryname
usually the same name as on hackage.
Architecture
See PKGBUILD#arch.
Every Haskell library or program is architecture-dependent.
Source
The preferred source of a Haskell program or library is from hackage. PKGBUILD#source source=()
array should use the following URL template:
https://hackage.haskell.org/packages/archive/$_hkgname/$pkgver/$_hkgname-$pkgver.tar.gz
Note that a custom _hkgname
variable is used instead of pkgname
since Haskell packages are generally prefixed with haskell-. This variable can generically be defined as follows:
_hkgname=stm-delay
Rebuild order
When a Haskell library changes its build flags or is updated, all dependent packages need to be rebuilt. The genrebuild tool can be used to find out what needs rebuilding and how. Example usage:
$ ./genrebuild -H haskell-basement
Using arch-hs
arch-hs is provided to automate PKGBUILD
generation and maintenance.
To generate a series of PKGBUILD
s for a Hackage package (and its unpackaged dependencies):
$ arch-hs -o /path/to/workdir library_name
To compare dependencies and other packaging metadata for updating an existing package:
$ arch-hs-diff library_name old_version new_version
To compare Arch [community] package versions and their corresponding Hackage package versions:
$ arch-hs-sync check
Note that arch-hs
uses cabal-install to maintain Hackage databases, so please update your cabal-install database regularly to keep them fresh:
$ cabal update
PKGBUILD library example
Packaging a Haskell library is different from packaging a Haskell program, the libraries packaged in Arch Linux are meant to be used by packaged Haskell programs.
PKGBUILD
# Maintainer: Your Name <youremail@domain.com> _hkgname=stm-delay pkgname=haskell-stm-delay pkgver= pkgrel=1 license=() arch=('x86_64') url="https://hackage.haskell.org/package/$_hkgname" depends=(ghc-libs) makedepends=(ghc) source=("https://hackage.haskell.org/packages/archive/$_hkgname/$pkgver/$_hkgname-$pkgver.tar.gz") sha256sums=() build() { cd "$_hkgname-$pkgver" runhaskell Setup configure -O --enable-shared --enable-executable-dynamic --disable-library-vanilla \ --prefix=/usr --docdir="/usr/share/doc/$pkgname" --enable-tests \ --dynlibdir=/usr/lib --libsubdir=\$compiler/site-local/\$pkgid \ --ghc-option=-optl-Wl\,-z\,relro\,-z\,now \ --ghc-option='-pie' runhaskell Setup build $MAKEFLAGS runhaskell Setup register --gen-script runhaskell Setup unregister --gen-script sed -i -r -e "s|ghc-pkg.*update[^ ]* |&'--force' |" register.sh sed -i -r -e "s|ghc-pkg.*unregister[^ ]* |&'--force' |" unregister.sh } check() { cd "$_hkgname-$pkgver" runhaskell Setup test } package() { cd "$_hkgname-$pkgver" install -D -m744 register.sh "$pkgdir/usr/share/haskell/register/$pkgname.sh" install -D -m744 unregister.sh "$pkgdir/usr/share/haskell/unregister/$pkgname.sh" runhaskell Setup copy --destdir="$pkgdir" install -D -m644 "LICENSE" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" rm -f "${pkgdir}/usr/share/doc/${pkgname}/LICENSE" }