Difference between revisions of "Haskell package guidelines"

From ArchWiki
Jump to: navigation, search
([haskell]: Recommended puttin [haskell] above [extra])
m (cabal2pkgbuild: renamed to cabal2arch.)
 
(53 intermediate revisions by 21 users not shown)
Line 1: Line 1:
 
[[Category:Package development]]
 
[[Category:Package development]]
[[it:Haskell Package Guidelines]]
+
[[it:Haskell package guidelines]]
{{Package Guidelines}}
+
[[ja:Haskell パッケージガイドライン]]
 +
{{Expansion|Please help improve this article by creating reasonable [[Creating packages|package creation guidelines]] for [[Haskell]] packages. The previous content on this page, which was unrelated to packaging guidelines, has been moved to [[ArchHaskell]].}}
  
[[Wikipedia:Haskell|Haskell]] is well supported on Arch Linux, with GHC and other key tools available via the [[Official Repositories|official repositories]], a growing number of packages made available by the ArchHaskell group, and a large part of [http://hackage.haskell.org hackage.haskell.org]'s library database [https://aur.archlinux.org/packages.php?O=0&K=haskell- available in the AUR].
+
{{Package guidelines}}
  
The community around Haskell on Arch is active and well organized, but your help is always welcome.
+
This document aims to cover standards and guidelines for producing good [[Haskell]] [[Creating packages|packages]] on Arch.
  
== Community ==
+
== cabal2arch ==
All the details on the [[ArchHaskell]] group is available on its own page.
+
  
== Haskell Packages ==
+
{{AUR|cabal2arch}}, available in the [[AUR]], may be used to automatically generate Arch packages from [[Haskell#cabal-install|cabal]] build files. It is a wrapper around [https://github.com/magthe/cblrepo cblrepo]. Generally there should be one package (i.e., one [[PKGBUILD]]) per {{ic|.cabal}} file for a package.
The core Haskell tools are available in the core system (extra):
+
 
+
=== [extra] ===
+
* [https://www.archlinux.org/packages/?arch=x86_64&repo=Extra&q=haskell&last_update=&limit=50 Haskell packages in the core system]
+
 
+
Our policy for [extra] is to provide the Haskell platform, and popular Haskell applications.
+
 
+
=== [community] ===
+
* [https://www.archlinux.org/packages/?arch=x86_64&repo=Community&q=haskell&last_update=&limit=50 other popular Haskell packages]
+
 
+
[community] provides additional packages that are popular and not part of the Haskell platform, such as [[xmonad]].
+
 
+
=== [haskell] ===
+
The [haskell] repository is the official repository of packages maintained by the ArchHaskell team. This repository represents the last tier of stability, before resorting to the packages in the AUR, or perhaps building packages yourself with cabal2arch. [haskell] can be accessed by adding the following entry to {{ic|/etc/pacman.conf}}:
+
 
+
[haskell]
+
Server = http://xsounds.org/~haskell/$arch
+
 
+
The set of packages in the [haskell] repository is derived from the '''habs''' tree officially located [https://github.com/archhaskell/habs here]. A tool called [https://github.com/magthe/cblrepo cblrepo] is used to keep the '''habs''' tree synchronized with the official Haskell packages from [http://hackage.haskell.org/packages/hackage.html Hackage].
+
 
+
Putting [haskell] above [extra] will ensure that the packages from [haskell] take precedence, in case of duplicate packages in the two repositories.
+
 
+
=== AUR ===
+
* [https://aur.archlinux.org/packages.php?O=0&K=haskell- Haskell packages in the AUR]
+
 
+
A huge number (almost 2000) packages built from http://hackage.haskell.org.
+
 
+
These generally improve on installing directly from Hackage as they resolve required C libraries. They can be installed as, for example:
+
 
+
# paktahn -S haskell-csv
+
 
+
Anything not found here can be installed via {{pkg|cabal-install}} directly from Hackage.
+
 
+
Unfortunately, many of the packages in the AUR are outdated due to a lack of resources. In practice, one uses the cabal2arch program to create [[PKGBUILD]]s directly from Hackage.
+
 
+
== Guidelines ==
+
In almost all cases, cabalised Haskell packages can be automatically translated into Arch packages, via the cabal2arch tool.  It is strongly recommended that you use the latest released version of this tool, as it implements the packaging policy for Haskell packages.  You can get it in several ways:
+
 
+
* Add the [haskell] repository to {{ic|/etc/pacman.conf}} and use [[pacman]] to install the latest release.
+
* Download and build the {{AUR|cabal2arch}} package from the [[Arch User Repository|AUR]].
+
* Install directly from Hackage using {{ic|cabal install cabal2arch}}.
+
 
+
===cabal2arch: an example===
+
This example illustrates how to create a new package with cabal2arch. We will make a new package for the document formatter Pandoc:
+
 
+
First, set the name and email address to be used in the generated PKGBUILD:
+
 
+
export ARCH_HASKELL='My Name <my.name@domain.org>'
+
 
+
Second, find [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/pandoc the hackage page for Pandoc], then identify the link to the .cabal file. Use this link as an argument to cabal2arch:
+
 
+
{{bc|<nowiki>
+
% cd /tmp
+
% cabal2arch http://hackage.haskell.org/packages/archive/pandoc/1.6.0.1/pandoc.cabal
+
Using /tmp/tmp.D7HAJJx2js/pandoc.cabal
+
Feeding the PKGBUILD to `makepkg -g`...
+
==> Retrieving Sources...
+
  -> Downloading pandoc-1.6.0.1.tar.gz...
+
--2011-05-14 07:25:39--  http://hackage.haskell.org/packages/archive/pandoc/1.6.0.1/pandoc-1.6.0.1.tar.gz
+
Resolving hackage.haskell.org... 69.30.63.204
+
Connecting to hackage.haskell.org|69.30.63.204|:80... connected.
+
HTTP request sent, awaiting response... 200 OK
+
Length: 355477 (347K) [application/x-tar]
+
Saving to: “pandoc-1.6.0.1.tar.gz.part”
+
 
+
    0K .......... .......... .......... .......... .......... 14%  210K 1s
+
    50K .......... .......... .......... .......... .......... 28%  393K 1s
+
  100K .......... .......... .......... .......... .......... 43%  338K 1s
+
  150K .......... .......... .......... .......... .......... 57%  419K 0s
+
  200K .......... .......... .......... .......... .......... 72%  404K 0s
+
  250K .......... .......... .......... .......... .......... 86%  554K 0s
+
  300K .......... .......... .......... .......... .......  100%  506K=0.9s
+
 
+
2011-05-14 07:25:40 (369 KB/s) - “pandoc-1.6.0.1.tar.gz.part” saved [355477/355477]
+
 
+
==> Generating checksums for source files...
+
</nowiki>}}
+
 
+
Checking what was created:
+
 
+
% ls
+
haskell-pandoc
+
% cd haskell-pandoc
+
% ls
+
haskell-pandoc.install PKGBUILD
+
 
+
You can now inspect the PKGBUILD and install script for the library:
+
 
+
{{bc|<nowiki>
+
# Maintainer:
+
_hkgname=pandoc
+
pkgname=haskell-pandoc
+
pkgver=1.6.0.1
+
pkgrel=1
+
pkgdesc="Conversion between markup formats"
+
url="http://hackage.haskell.org/package/${_hkgname}"
+
license=('GPL')
+
arch=('i686' 'x86_64')
+
makedepends=()
+
depends=('ghc' 'haskell-http=4000.1.1' 'haskell-bytestring=0.9.1.10' 'haskell-containers=0.4.0.0' 'haskell-directory=1.1.0.0' 'haskell-extensible-exceptions=0.1.1.2' 'haskell-filepath=1.2.0.0' 'haskell-mtl=2.0.1.0' 'haskell-network=2.3.0.2' 'haskell-old-time=1.0.0.6' 'haskell-parsec=3.1.1' 'haskell-pretty=1.0.1.2' 'haskell-process=1.0.1.5' 'haskell-random=1.0.0.3' 'haskell-syb=0.3' 'haskell-texmath<0.5' 'haskell-utf8-string>=0.3' 'haskell-xhtml=3000.2.0.1' 'haskell-xml<1.4' 'haskell-zip-archive<0.2')
+
options=('strip')
+
source=(http://hackage.haskell.org/packages/archive/${_hkgname}/${pkgver}/${_hkgname}-${pkgver}.tar.gz)
+
install=${pkgname}.install
+
md5sums=('d19a630462595941b3100dff6f839aa3')
+
build() {
+
    cd ${srcdir}/${_hkgname}-${pkgver}
+
    runhaskell Setup configure -O ${PKGBUILD_HASKELL_ENABLE_PROFILING:+-p } --enable-split-objs --enable-shared \
+
      --prefix=/usr --docdir=/usr/share/doc/${pkgname} --libsubdir=\$compiler/site-local/\$pkgid
+
    runhaskell Setup build
+
    runhaskell Setup haddock
+
    runhaskell Setup register  --gen-script
+
    runhaskell Setup unregister --gen-script
+
    sed -i -r -e "s|ghc-pkg.*unregister[^ ]* |&'--force' |" unregister.sh
+
}
+
package() {
+
    cd ${srcdir}/${_hkgname}-${pkgver}
+
    install -D -m744 register.sh  ${pkgdir}/usr/share/haskell/${pkgname}/register.sh
+
    install    -m744 unregister.sh ${pkgdir}/usr/share/haskell/${pkgname}/unregister.sh
+
    install -d -m755 ${pkgdir}/usr/share/doc/ghc/html/libraries
+
    ln -s /usr/share/doc/${pkgname}/html ${pkgdir}/usr/share/doc/ghc/html/libraries/${_hkgname}
+
    runhaskell Setup copy --destdir=${pkgdir}
+
}
+
</nowiki>}}
+
 
+
It follows the conventions for Haskell packages:
+
 
+
* Libraries are prefixed with {{ic|haskell-}}
+
* All libraries that the package depend on are listed (libraries shipped with GHC are dealt with by having the {{pkg|ghc}} package provide them)
+
* It uses cabal to generate a post-install register/unregister script, with a standard name.
+
* We use haddock to build the documentation.
+
 
+
All Haskell libraries should follow these naming conventions, and using the latest release of cabal2arch will ensure this is the case.
+
 
+
{{Note|Beginning with {{AUR|cabal2arch}} 1.1-2, a new environment variable, {{ic|PKGBUILD_HASKELL_ENABLE_PROFILING}}, is generated into the PKGBUILD. If this variable is of non-zero length, such as "1" or "true", then profiling builds will occur. Thus, if a user desires profiling, then it is advised to export this environment variable in a file such as {{ic|~/.bashrc}} or {{ic|~/.zshrc}}.}}
+
 
+
===Guidelines for Libraries===
+
In general, each .cabal file should map to one PKGBUILD. The following conventions hold:
+
 
+
* libraries have their cabal names prefixed with {{ic|haskell-}}
+
* all libraries have a dependency on {{pkg|ghc}}
+
* all libraries that are depended on must be listed in the {{ic|depends}} array in the PKGBUILD
+
* be careful about dependencies from gtk2hs: cairo, svg, glib, gtk. These are all provided by the {{pkg|gtk2hs}} package, not , e.g. "haskell-cairo"
+
 
+
Registering Haskell libraries is done via a register hook, see above.
+
 
+
===Guidelines for Programs ===
+
* Have their normal name. Examples: hmp3, xmonad, ghc, cabal-install
+
 
+
* Be careful about dynamically linked run-time dependencies on C. For example, all GHC-produced binaries have a run-time dependency on 'gmp'. OpenGL or GtT-based binaries will have additional 'depends'. cabal2arch will attempt to work out the C dependencies, but there may be others implied by Haskell dependencies that are missed.
+
 
+
* Use executable stripping, {{ic|--enable-executable-stripping}}. cabal2arch will do this automatically.
+
 
+
== Haskell Build Order ==
+
* haskell-x11 update: haskell-x11-xft -> xmonad -> xmonad-contrib
+

Latest revision as of 13:14, 20 August 2016

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Please help improve this article by creating reasonable package creation guidelines for Haskell packages. The previous content on this page, which was unrelated to packaging guidelines, has been moved to ArchHaskell. (Discuss in Talk:Haskell package guidelines#)
Package creation guidelines

CLRCrossEclipseFree PascalGNOMEGoHaskellJavaKDEKernelLispMinGWNode.jsNonfreeOCamlPerlPHPPythonRubyVCSWebWine

This document aims to cover standards and guidelines for producing good Haskell packages on Arch.

cabal2arch

cabal2archAUR, available in the AUR, may be used to automatically generate Arch packages from cabal build files. It is a wrapper around cblrepo. Generally there should be one package (i.e., one PKGBUILD) per .cabal file for a package.