@@ -2,6 +2,8 @@
22% Peter Simons \<simons@cryp.to\>
33% 2013-06-21
44
5+-------------------------------------------------------------------------------
6+
57# Ablauf der Präsentation
68
791) Vorstellung des Nix Paket-Managers
@@ -17,14 +19,14 @@
1719 - Funktionsweise von `ghc-wrapper`
1820 - Nix in Kombination mit `cabal-dev`
1921
20−3) Erweiterung der Nix Paket-Datenbank
21−
22− - Der `cabal2nix` Konverter
22+3) Erweiterung der Nix Paket-Datenbank mit `cabal2nix`
2323
24244) Continuous-Integration mit der Hydra Build-Farm
2525
26265) Fragen & Antworten
2727
28+-------------------------------------------------------------------------------
29+
2830# Was ist Nix und warum will ich das wissen?
2931
3032- Nix ist ein rein funktionaler Paket-Manager.
@@ -45,7 +47,9 @@
4547
4648- Nix ist freie Software unter GNU LGPL 2.1.
4749
48−# Der Nix Paket-Store
50+-------------------------------------------------------------------------------
51+
52+# Wie sieht eine Nix-Installation aus?
4953
5054- Nix lebt komplett unterhalb des Verzeichnisses `/nix`.
5155
@@ -63,6 +67,8 @@
6367- In `/nix/store` installierte Pakete referenzieren niemals
6468 Dateien außerhalb des Stores.
6569
70+-------------------------------------------------------------------------------
71+
6672# Die Paketdatenbank
6773
6874- Nixpkgs ist eine Sammlung von Build-Rezepten, die in der rein
@@ -80,7 +86,9 @@ funktionalen Sprache *Nix* geschrieben sind.
8086- Nixpkgs bietet verschiedene `mkDerivation`-Wrapper, um die Verwendung
8187von `derivation` vereinfachen.
8288
83−# Das Paket `parsec 3.1.3`
89+-------------------------------------------------------------------------------
90+
91+# Das Paket `parsec-3.1.3`
8492
8593 { cabal, mtl, text }:
8694
@@ -91,7 +99,9 @@ von `derivation` vereinfachen.
9199 buildDepends = [ mtl text ];
92100 })
93101
94−# Installation von `parsec 3.1.3`
102+-------------------------------------------------------------------------------
103+
104+# Installation von `parsec-3.1.3`
95105
96106 $ nix-env -iA haskellPackages.parsec_3_1_3
97107 installing `haskell-parsec-ghc7.6.3-3.1.3'
@@ -104,7 +114,9 @@ von `derivation` vereinfachen.
104114 building path(s) `/nix/store/0xfxh...-user-environment'
105115 created 22 symlinks in user environment
106116
107−# Das Paket für `yesod 1.2.1`
117+-------------------------------------------------------------------------------
118+
119+# Das Paket für `yesod-1.2.1`
108120
109121 { cabal, aeson, blazeHtml, blazeMarkup, dataDefault,
110122 , hamlet monadControl, networkConduit, safe,
@@ -124,9 +136,11 @@ von `derivation` vereinfachen.
124136 ];
125137 })
126138
139+-------------------------------------------------------------------------------
140+
127141# Die Programmiersprache Nix
128142
129−- Nix ist lazy-evaluiertes ungetyptes Lambda-Kalkül.
143+- Nix ist lazy-evaluiertes, ungetyptes Lambda-Kalkül.
130144
131145- Strings: `"hello world"`, `http://example.org/`
132146
@@ -144,3 +158,132 @@ von `derivation` vereinfachen.
144158
145159 let append = { list ? [], element }: list++[element];
146160 in append { list = ["abc" 3]; element = null; }
161+
162+- With-Statements: `with { foo = "foobar"; }; foo`
163+
164+-------------------------------------------------------------------------------
165+
166+# Haskell in Nixpkgs
167+
168+- Unterstützt werden Haskell Platform 2009.2.0.2, 2010.1.0.0,
169+2010.2.0.0, 2011.2.0.0, 2011.2.0.1, 2011.4.0.0, 2012.2.0.0, 2012.4.0.0
170+und 2013.2.0.0 auf Linux und Darwin.
171+
172+- Mehr als 850 Bibliotheken von Hackage:
173+
174+ nix-env -qaP \* | grep haskellPackages
175+
176+- Haskell Platform installieren:
177+
178+ nix-env -iA haskellPackages.haskellPlatform
179+ nix-env -iA haskellPackages_ghc763.haskellPlatform
180+
181+- Pakete von Hackage installieren:
182+
183+ nix-env -iA haskellPackages_ghc763.cabalInstall
184+ nix-env -iA haskellPackages_ghc763.darcs
185+
186+-------------------------------------------------------------------------------
187+
188+# Mehrere GHC Versionen installieren
189+
190+ $ nix-env -p ~/ghc-7.6.3 -iA haskellPackages_ghc763.ghc
191+ $ nix-env -p ~/ghc-7.4.2 -iA haskellPackages_ghc742.ghc
192+ $ nix-env -p ~/ghc-7.0.4 -iA haskellPackages_ghc704.ghc
193+ [...]
194+
195+ $ export PATH=~/ghc-7.6.3/bin:~/ghc-7.4.2/bin:...:$PATH
196+
197+ $ ghc --version
198+ The Glorious Glasgow Haskell Compiler, version 7.6.3
199+
200+ $ ghc-7.0.4 --version
201+ The Glorious Glasgow Haskell Compiler, version 7.0.4
202+
203+-------------------------------------------------------------------------------
204+
205+# Wie findet `ghc` die installierten Bibliotheken?
206+
207+- `ghc-wrapper` findet zur Laufzeit alle Pakete, die im selben Profil
208+installiert sind wie der Wrapper selber.
209+
210+- `ghcWithPackages` baut einen speziellen Wrapper, dessen Paket-Liste
211+statisch konfiguriert ist:
212+
213+ # ~/.nixpkgs/config.nix
214+ {
215+ packageOverrides = pkgs:
216+ {
217+ ghcEnv = with pkgs.haskellPackages_ghc763;
218+ ghcWithPackages (self: [
219+ parsec xmonad hsdns
220+ ]);
221+ };
222+ }
223+
224+- `cabal-install` und `cabal-dev` funktionieren wunderbar mit
225+`ghcWithPackages`, mit `ghc-wapper` aber nur so mittel.
226+
227+-------------------------------------------------------------------------------
228+
229+# Wie erweitert man Nixpkgs um neue Haskell-Pakete?
230+
231+- `cabal2nix` generiert Build-Instruktionen für Nix automatisch:
232+
233+ $ nix-env -iA haskellPackages.cabal2nix
234+ $ cabal2nix cabal://pkgname-version
235+ $ cabal2nix cabal://pkgname # neueste Version
236+
237+- `--no-haddock` schaltet das Generieren der Haddock-Dokumentation aus.
238+
239+- `--no-check` schaltet die Test-Suite aus.
240+
241+- `--jailbreak` löscht in der Cabal-Datei die Versions-Einschränkungen
242+aller Abhängigkeiten.
243+
244+-------------------------------------------------------------------------------
245+
246+# Wie erweitert man Nixpkgs um neue Haskell-Pakete?
247+
248+1) `git checkout git://github.com/NixOS/nixpkgs.git`
249+2) `cd pkgs/development/libraries/haskell`
250+2) `mkdir foobar`
251+3) `cabal2nix cabal://foobar >foobar/default.nix`
252+4) `cd ../../../`
253+5) In `pkgs/top-level/haskell-packages.nix` die Zeile
254+
255+ foobar = callPackage
256+ ../development/libraries/haskell/foobar {};
257+
258+ einfügen.
259+6) `nix-env -f . -iA haskellPackages.foobar`
260+
261+-------------------------------------------------------------------------------
262+
263+# Die Hydra Build-Farm
264+
265+- `http://hydra.nixos.org/` ist die Haupt-Buildfarm von Nix.
266+
267+- Eigene Hydra-Instanzen können über Nix installiert werden.
268+
269+- Im Fehlerfall benachrichtigt Hydra den Inhaber des Pakets.
270+
271+- Alle erfolgreich gebauten Pakete können von Nix-Nutzern in Binärform
272+heruntergeladen werden.
273+
274+- Hydra kann verteilte Builds auf den Plattformen Linux, Darwin, Cygwin,
275+BSD, etc. ausführen.
276+
277+-------------------------------------------------------------------------------
278+
279+# Noch Fragen?
280+
281+- `https://nixos.org/`
282+
283+- `https://github.com/nixos/`
284+
285+- `http://nixos.org/wiki/Haskell`
286+
287+- `nix-dev@lists.science.uu.nl`
288+
289+- `#nixos` auf `irc.freenode.org`