💾 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
⬅️ Previous capture (2021-11-30)
-=-=-=-=-=-=-
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.
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
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
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: