💾 Archived View for frosch03.de › 2013-02-08-CabalFile.gmi captured on 2021-12-04 at 18:04:22. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2021-11-30)

-=-=-=-=-=-=-

Cabal File

Was ist cabal

Hackage, oder auch hackageDB ist Haskells Packetdatenbank und enthält mittlerweile über 5000 Bibliotheken. Hat man Haskell auf seinem Rechner installiert, so wird man früher oder später an den Punkt kommen, neue Library's installieren zu wollen.

Das Problem ist nun, dass die Bibliotheken untereinander voneinander abhängen. Diese Abhängigkeiten können mitunter äußerst verzweigt und vielschichtig sein, so dass es einen enormen Aufwand bedarf, neue Bibliotheken zu installieren.

Damit dieser Aufwand nicht mehr von einem Menschen von Hand betrieben werden muss, haben sich Paketverwaltungs-Tools etabliert und das nicht nur bei Betriebssystems-Distributionen. Was pacman für Arch-Linux ist, ist cabal für Haskell.

Pakete mit cabal installieren

Um mit cabal arbeiten zu können muss dieses Tool auf dem System installiert sein. Unter Arch-Linux existiert cabal-install als installierbares Paket und würde mittels

pacman -Suy cabal-install 

installiert werden. Auch die anderen Distributionen bieten Installationspakete für cabal an. Im Falle das es keine Installationspakete für cabal geben sollte, lässt sich cabal auch von Hand aus den Quellen übersetzen.

Cabal hält eine Liste der aktuell installierbaren Paketen bereit. Bevor in irgend einer Weise mit cabal gearbeitet wird, ist es ratsam diese Liste zu aktualisieren. So kann Fehler vorgebeugt werden, die unter Umständen aus veralteten Paketinformationen heraus enstehen.

cabal update 

aktualisiert die Paketliste.

Ein Paket mithilfe von cabal zu installieren ist nicht besonders schwierig. Ist der Name des Paketes schon bekannt (z.B. arrows), so wird ein das Paket über folgenden Aufruf installiert:

cabal install arrows 

Der exakte Name eines Paketes lässt sich herausfinden. Der Befehl:

cabal list 

gibt sämtliche Pakete aus, die in der Liste der installierbaren Pakete stehen. Da dies natürlich viel zu viele Informationen sind, ist es sinnvoller, die Ergebnismenge einzuschränken:

cabal list arrow 

Einzig anzeigen welche Pakete aktuell auf dem System installiert sind, lässt sich mittels cabal nicht. Hierzu kann das Tool ghc-pkg bemüht werden.

ghc-pkg list 

liefert eine Liste all der Pakte die auf dem System installiert sind. Dabei wird auch angezeigt, wo das Paket installiert ist. Es wird hier unterschieden zwischen einer lokalen, also benutzerweiten, Installation, sowie einer systemweiten Installation.

Die Deinstallation eines Paketes erfolgt ebenso über ghc-pkg mittels:

ghc-pkg unregister old-time-1.1.0.0 

Eigene Pakete und .cabal

Um sich die Arbeit mit eigenen Paketen in Haskell zu erleichtern, ist es ebenso möglich, seine Pakete fit für cabal zu machen. Hierzu wird ein .cabal-File benötigt, dass im Verzeichnis des Paketes liegt.

Diese Datei beschreibt das Paket für den Paketverwalter. Enthalten sind Informationen zu:

Paketinformationen wie der Name des Paketes, die Version in der sich die Software befindet, eine kurze textuelle Beschreibung, eine Kategorie in die das Paket gehört, sowie die Lizenz unter die Software vertrieben wird:

name: VHDL
version: 0.0
description: Using Arrows to describe Hardware and to generate VHDL code
license: BSD3
category: Testing 

Autorinformationen sind der Name des Autor, die Email-Adresse des Paketverwalters sowie die URL zu einer Webseite über die Software:

author: Matthias Brettschneider
maintainer: frosch03@gmail.com
homepage: http://github.com/frosch03

Übersetzungsinformationen wie der Typ des Paketes und die benötigte cabal-version:

cabal-version: >=1.2
build-type: Simple 

Library-Abschnitt: Dieser legt fest, ob und wie Paketabschnitte behandelt werden. exposed-modules: wird gefolgt von einer Liste mit Modulen, die im Paket verwendet werden und die nach Außen bekannt gegeben werden sollen. build-depends legt fest, von welchen Paketen dieses Paket abhängt. Diese Information kann nur das Paket enthalten, oder einen mindest Version mit angeben:

Library build-depends:
  base3
exposed-modules:
  Circuit
  Circuit.Arrow
  Circuit.Auxillary
  Circuit.Descriptor
  Circuit.Defaults 

Executable-Abschnitt: Hier wird wenn nötig beschrieben, ob und woraus ein executable-File erzeugt wird. Hinter main-is: wird die Datei angegeben, welche das Main-Modul enthält. Die Liste hinter other-modules: legt eine Liste von Modulen fest, die nach Außen hin nicht sichtbar sind, aber vom Main-Modul verwendet werden.

Executable Beispiel
main-is: Beispiel.hs
other-modules:
  Circuit
  Circuit.Arrow
  Circuit.Auxillary
  Circuit.Descriptor
  Circuit.Defaults 

die Details zum .cabal-File lassen sich in der Dokumentation(1) zu cabal nachlesen.

(1) http://www.haskell.org/cabal/users-guide/

Zusätzlich zum .cabal-File wird noch eine Setup.hs benötigt. Dieses File sieht so aus:

import Distribution.Simple
main = defaultMain 

Mithilfe dieser beiden Files ist es nun Möglich, die Software zu übersetzten. Hierzu wird auf der Konsole mittels

cabal configure 

das Paket konfiguriert. Kompilieren lässt es sich dann mit:

cabal build 

Auch lassen sich jetzt mittels cabal alle weiteren Optionen verwenden wie zum Beispiel das erzeugen von Dokumentationen aus dem Quelltext:

cabal haddock 

Abschließend

Das arbeiten mit Cabal habe ich selber lange Zeit überhaupt nicht in Betracht gezogen. Erst seit dem ich gerne aus meinen Sourcen die .html-Dokumentation haben wollte, musste ich mir Gedanken zu cabal machen. Allerdings bereue ich hier nichts, denn letztlich handelt es sich hier um enorm wenig Aufwand, der mit einem ganzen Sack voll toller neuer Kleinigkeiten belohnt wird.

Ich denke in Zukunft werde ich alle weiteren Haskell-Projekte immer direkt mit .cabal Files ausstatten, um so von Anfang an mit Cabal zu arbeiten.

Das Repository indem sich das weiter oben genannte .cabal File befindet findet man hier:

https://github.com/frosch03/arrowVHDL