Merge branch 'staging-next' into staging
[NixPkgs.git] / doc / languages-frameworks / haskell.section.md
blob5d7796b554de42451f82dce8469e0592b59ef9fb
1 # Haskell {#haskell}
3 The Haskell infrastructure in Nixpkgs has two main purposes: The primary purpose
4 is to provide a Haskell compiler and build tools as well as infrastructure for
5 packaging Haskell-based packages.
7 The secondary purpose is to provide support for Haskell development environments
8 including prebuilt Haskell libraries. However, in this area sacrifices have been
9 made due to self-imposed restrictions in Nixpkgs, to lessen the maintenance
10 effort and to improve performance. (More details in the subsection
11 [Limitations.](#haskell-limitations))
13 ## Available packages {#haskell-available-packages}
15 The compiler and most build tools are exposed at the top level:
17 * `ghc` is the default version of GHC
18 * Language specific tools: `cabal-install`, `stack`, `hpack`, …
20 Many “normal” user facing packages written in Haskell, like `niv` or `cachix`,
21 are also exposed at the top level, and there is nothing Haskell specific to
22 installing and using them.
24 All of these packages are originally defined in the `haskellPackages` package
25 set and are re-exposed with a reduced dependency closure for convenience.
26 (see `justStaticExecutables` or `separateBinOutput` below)
28 The `haskellPackages` set includes at least one version of every package from
29 Hackage as well as some manually injected packages. This amounts to a lot of
30 packages, so it is hidden from `nix-env -qa` by default for performance reasons.
31 You can still list all packages in the set like this:
33 ```console
34 $ nix-env -f '<nixpkgs>' -qaP -A haskellPackages
35 haskellPackages.a50                                                         a50-0.5
36 haskellPackages.AAI                                                         AAI-0.2.0.1
37 haskellPackages.aasam                                                       aasam-0.2.0.0
38 haskellPackages.abacate                                                     abacate-0.0.0.0
39 haskellPackages.abc-puzzle                                                  abc-puzzle-0.2.1
40
41 ```
42 Also, the `haskellPackages` set is included on [search.nixos.org].
44 The attribute names in `haskellPackages` always correspond with their name on
45 Hackage. Since Hackage allows names that are not valid Nix without escaping,
46 you need to take care when handling attribute names like `3dmodels`.
48 For packages that are part of [Stackage] (a curated set of known to be
49 compatible packages), we use the version prescribed by a Stackage snapshot
50 (usually the current LTS one) as the default version. For all other packages we
51 use the latest version from [Hackage](https://hackage.org) (the repository of
52 basically all open source Haskell packages). See [below](#haskell-available-
53 versions) for a few more details on this.
55 Roughly half of the 16K packages contained in `haskellPackages` don’t actually
56 build and are [marked as broken semi-automatically](https://github.com/NixOS/nixpkgs/blob/haskell-updates/pkgs/development/haskell-modules/configuration-hackage2nix/broken.yaml).
57 Most of those packages are deprecated or unmaintained, but sometimes packages
58 that should build, do not build. Very often fixing them is not a lot of work.
60 <!--
61 TODO(@sternenseemann):
62 How you can help with that is
63 described in [Fixing a broken package](#haskell-fixing-a-broken-package).
64 -->
66 `haskellPackages` is built with our default compiler, but we also provide other
67 releases of GHC and package sets built with them. You can list all available
68 compilers like this:
70 ```console
71 $ nix-env -f '<nixpkgs>' -qaP -A haskell.compiler
72 haskell.compiler.ghc810                  ghc-8.10.7
73 haskell.compiler.ghc90                   ghc-9.0.2
74 haskell.compiler.ghc925                  ghc-9.2.5
75 haskell.compiler.ghc926                  ghc-9.2.6
76 haskell.compiler.ghc927                  ghc-9.2.7
77 haskell.compiler.ghc92                   ghc-9.2.8
78 haskell.compiler.ghc945                  ghc-9.4.5
79 haskell.compiler.ghc946                  ghc-9.4.6
80 haskell.compiler.ghc947                  ghc-9.4.7
81 haskell.compiler.ghc94                   ghc-9.4.8
82 haskell.compiler.ghc963                  ghc-9.6.3
83 haskell.compiler.ghc96                   ghc-9.6.4
84 haskell.compiler.ghc98                   ghc-9.8.1
85 haskell.compiler.ghcHEAD                 ghc-9.9.20231121
86 haskell.compiler.ghc8107Binary           ghc-binary-8.10.7
87 haskell.compiler.ghc865Binary            ghc-binary-8.6.5
88 haskell.compiler.ghc924Binary            ghc-binary-9.2.4
89 haskell.compiler.integer-simple.ghc8107  ghc-integer-simple-8.10.7
90 haskell.compiler.integer-simple.ghc810   ghc-integer-simple-8.10.7
91 haskell.compiler.native-bignum.ghc90     ghc-native-bignum-9.0.2
92 haskell.compiler.native-bignum.ghc902    ghc-native-bignum-9.0.2
93 haskell.compiler.native-bignum.ghc925    ghc-native-bignum-9.2.5
94 haskell.compiler.native-bignum.ghc926    ghc-native-bignum-9.2.6
95 haskell.compiler.native-bignum.ghc927    ghc-native-bignum-9.2.7
96 haskell.compiler.native-bignum.ghc92     ghc-native-bignum-9.2.8
97 haskell.compiler.native-bignum.ghc928    ghc-native-bignum-9.2.8
98 haskell.compiler.native-bignum.ghc945    ghc-native-bignum-9.4.5
99 haskell.compiler.native-bignum.ghc946    ghc-native-bignum-9.4.6
100 haskell.compiler.native-bignum.ghc947    ghc-native-bignum-9.4.7
101 haskell.compiler.native-bignum.ghc94     ghc-native-bignum-9.4.8
102 haskell.compiler.native-bignum.ghc948    ghc-native-bignum-9.4.8
103 haskell.compiler.native-bignum.ghc963    ghc-native-bignum-9.6.3
104 haskell.compiler.native-bignum.ghc96     ghc-native-bignum-9.6.4
105 haskell.compiler.native-bignum.ghc964    ghc-native-bignum-9.6.4
106 haskell.compiler.native-bignum.ghc98     ghc-native-bignum-9.8.1
107 haskell.compiler.native-bignum.ghc981    ghc-native-bignum-9.8.1
108 haskell.compiler.native-bignum.ghcHEAD   ghc-native-bignum-9.9.20231121
109 haskell.compiler.ghcjs                   ghcjs-8.10.7
112 Each of those compiler versions has a corresponding attribute set built using
113 it. However, the non-standard package sets are not tested regularly and, as a
114 result, contain fewer working packages. The corresponding package set for GHC
115 9.4.5 is `haskell.packages.ghc945`. In fact `haskellPackages` is just an alias
116 for `haskell.packages.ghc964`:
118 ```console
119 $ nix-env -f '<nixpkgs>' -qaP -A haskell.packages.ghc927
120 haskell.packages.ghc927.a50                                                         a50-0.5
121 haskell.packages.ghc927.AAI                                                         AAI-0.2.0.1
122 haskell.packages.ghc927.aasam                                                       aasam-0.2.0.0
123 haskell.packages.ghc927.abacate                                                     abacate-0.0.0.0
124 haskell.packages.ghc927.abc-puzzle                                                  abc-puzzle-0.2.1
128 Every package set also re-exposes the GHC used to build its packages as `haskell.packages.*.ghc`.
130 ### Available package versions {#haskell-available-versions}
132 We aim for a “blessed” package set which only contains one version of each
133 package, like [Stackage], which is a curated set of known to be compatible
134 packages. We use the version information from Stackage snapshots and extend it
135 with more packages. Normally in Nixpkgs the number of building Haskell packages
136 is roughly two to three times the size of Stackage. For choosing the version to
137 use for a certain package we use the following rules:
139 1. By default, for `haskellPackages.foo` is the newest version of the package
140 `foo` found on [Hackage](https://hackage.org), which is the central registry
141 of all open source Haskell packages. Nixpkgs contains a reference to a pinned
142 Hackage snapshot, thus we use the state of Hackage as of the last time we
143 updated this pin.
144 2. If the [Stackage] snapshot that we use (usually the newest LTS snapshot)
145 contains a package, [we use instead the version in the Stackage snapshot as
146 default version for that package.](https://github.com/NixOS/nixpkgs/blob/haskell-updates/pkgs/development/haskell-modules/configuration-hackage2nix/stackage.yaml)
147 3. For some packages, which are not on Stackage, we have if necessary [manual
148 overrides to set the default version to a version older than the newest on
149 Hackage.](https://github.com/NixOS/nixpkgs/blob/haskell-updates/pkgs/development/haskell-modules/configuration-hackage2nix/main.yaml)
150 4. For all packages, for which the newest Hackage version is not the default
151 version, there will also be a `haskellPackages.foo_x_y_z` package with the
152 newest version. The `x_y_z` part encodes the version with dots replaced by
153 underscores. When the newest version changes by a new release to Hackage the
154 old package will disappear under that name and be replaced by a newer one under
155 the name with the new version. The package name including the version will
156 also disappear when the default version e.g. from Stackage catches up with the
157 newest version from Hackage. E.g. if `haskellPackages.foo` gets updated from
158 1.0.0 to 1.1.0 the package `haskellPackages.foo_1_1_0` becomes obsolete and
159 gets dropped.
160 5. For some packages, we also [manually add other `haskellPackages.foo_x_y_z`
161 versions](https://github.com/NixOS/nixpkgs/blob/haskell-updates/pkgs/development/haskell-modules/configuration-hackage2nix/main.yaml),
162 if they are required for a certain build.
164 Relying on `haskellPackages.foo_x_y_z` attributes in derivations outside
165 nixpkgs is discouraged because they may change or disappear with every package
166 set update.
167 <!-- TODO(@maralorn) We should add a link to callHackage, etc. once we added
168 them to the docs. -->
170 All `haskell.packages.*` package sets use the same package descriptions and the same sets
171 of versions by default. There are however GHC version specific override `.nix`
172 files to loosen this a bit.
174 ### Dependency resolution {#haskell-dependency-resolution}
176 Normally when you build Haskell packages with `cabal-install`, `cabal-install`
177 does dependency resolution. It will look at all Haskell package versions known
178 on Hackage and tries to pick for every (transitive) dependency of your build
179 exactly one version. Those versions need to satisfy all the version constraints
180 given in the `.cabal` file of your package and all its dependencies.
182 The [Haskell builder in nixpkgs](#haskell-mkderivation) does no such thing.
183 It will take as input packages with names off the desired dependencies
184 and just check whether they fulfill the version bounds and fail if they don’t
185 (by default, see `jailbreak` to circumvent this).
187 The `haskellPackages.callPackage` function does the package resolution.
188 It will, e.g., use `haskellPackages.aeson`which has the default version as
189 described above for a package input of name `aeson`. (More general:
190 `<packages>.callPackage f` will call `f` with named inputs provided from the
191 package set `<packages>`.)
192 While this is the default behavior, it is possible to override the dependencies
193 for a specific package, see
194 [`override` and `overrideScope`](#haskell-overriding-haskell-packages).
196 ### Limitations {#haskell-limitations}
198 Our main objective with `haskellPackages` is to package Haskell software in
199 nixpkgs. This entails some limitations, partially due to self-imposed
200 restrictions of nixpkgs, partially in the name of maintainability:
202 * Only the packages built with the default compiler see extensive testing of the
203   whole package set. For other GHC versions only a few essential packages are
204   tested and cached.
205 * As described above we only build one version of most packages.
207 The experience using an older or newer packaged compiler or using different
208 versions may be worse, because builds will not be cached on `cache.nixos.org`
209 or may fail.
211 Thus, to get the best experience, make sure that your project can be compiled
212 using the default compiler of nixpkgs and recent versions of its dependencies.
214 A result of this setup is, that getting a valid build plan for a given
215 package can sometimes be quite painful, and in fact this is where most of the
216 maintenance work for `haskellPackages` is required. Besides that, it is not
217 possible to get the dependencies of a legacy project from nixpkgs or to use a
218 specific stack solver for compiling a project.
220 Even though we couldn’t use them directly in nixpkgs, it would be desirable
221 to have tooling to generate working Nix package sets from build plans generated
222 by `cabal-install` or a specific Stackage snapshot via import-from-derivation.
223 Sadly we currently don’t have tooling for this. For this you might be
224 interested in the alternative [haskell.nix] framework, which, be warned, is
225 completely incompatible with packages from `haskellPackages`.
227 <!-- TODO(@maralorn) Link to package set generation docs in the contributors guide below. -->
229 ## `haskellPackages.mkDerivation` {#haskell-mkderivation}
231 Every haskell package set has its own haskell-aware `mkDerivation` which is used
232 to build its packages. Generally you won't have to interact with this builder
233 since [cabal2nix][cabal2nix] can generate packages
234 using it for an arbitrary cabal package definition. Still it is useful to know
235 the parameters it takes when you need to
236 [override](#haskell-overriding-haskell-packages) a generated Nix expression.
238 `haskellPackages.mkDerivation` is a wrapper around `stdenv.mkDerivation` which
239 re-defines the default phases to be haskell aware and handles dependency
240 specification, test suites, benchmarks etc. by compiling and invoking the
241 package's `Setup.hs`. It does *not* use or invoke the `cabal-install` binary,
242 but uses the underlying `Cabal` library instead.
244 ### General arguments {#haskell-derivation-args}
246 `pname`
247 : Package name, assumed to be the same as on Hackage (if applicable)
249 `version`
250 : Packaged version, assumed to be the same as on Hackage (if applicable)
252 `src`
253 : Source of the package. If omitted, fetch package corresponding to `pname`
254 and `version` from Hackage.
256 `sha256`
257 : Hash to use for the default case of `src`.
259 `revision`
260 : Revision number of the updated cabal file to fetch from Hackage.
261 If `null` (which is the default value), the one included in `src` is used.
263 `editedCabalFile`
264 : `sha256` hash of the cabal file identified by `revision` or `null`.
266 `configureFlags`
267 : Extra flags passed when executing the `configure` command of `Setup.hs`.
269 `buildFlags`
270 : Extra flags passed when executing the `build` command of `Setup.hs`.
272 `haddockFlags`
273 : Extra flags passed to `Setup.hs haddock` when building the documentation.
275 `doCheck`
276 : Whether to execute the package's test suite if it has one. Defaults to `true` unless cross-compiling.
278 `doBenchmark`
279 : Whether to execute the package's benchmark if it has one. Defaults to `false`.
281 `doHoogle`
282 : Whether to generate an index file for [hoogle][hoogle] as part of
283 `haddockPhase` by passing the [`--hoogle` option][haddock-hoogle-option].
284 Defaults to `true`.
286 `doHaddockQuickjump`
287 : Whether to generate an index for interactive navigation of the HTML documentation.
288 Defaults to `true` if supported.
290 `doInstallIntermediates`
291 : Whether to install intermediate build products (files written to `dist/build`
292 by GHC during the build process). With `enableSeparateIntermediatesOutput`,
293 these files are instead installed to [a separate `intermediates`
294 output.][multiple-outputs] The output can then be passed into a future build of
295 the same package with the `previousIntermediates` argument to support
296 incremental builds. See [“Incremental builds”](#haskell-incremental-builds) for
297 more information. Defaults to `false`.
299 `enableLibraryProfiling`
300 : Whether to enable [profiling][profiling] for libraries contained in the
301 package. Enabled by default if supported.
303 `enableExecutableProfiling`
304 : Whether to enable [profiling][profiling] for executables contained in the
305 package. Disabled by default.
307 `profilingDetail`
308 : [Profiling detail level][profiling-detail] to set. Defaults to `exported-functions`.
310 `enableSharedExecutables`
311 : Whether to link executables dynamically. By default, executables are linked statically.
313 `enableSharedLibraries`
314 : Whether to build shared Haskell libraries. This is enabled by default unless we are using
315 `pkgsStatic` or shared libraries have been disabled in GHC.
317 `enableStaticLibraries`
318 : Whether to build static libraries. Enabled by default if supported.
320 `enableDeadCodeElimination`
321 : Whether to enable linker based dead code elimination in GHC.
322 Enabled by default if supported.
324 `enableHsc2hsViaAsm`
325 : Whether to pass `--via-asm` to `hsc2hs`. Enabled by default only on Windows.
327 `hyperlinkSource`
328 : Whether to render the source as well as part of the haddock documentation
329 by passing the [`--hyperlinked-source` flag][haddock-hyperlinked-source-option].
330 Defaults to `true`.
332 `isExecutable`
333 : Whether the package contains an executable.
335 `isLibrary`
336 : Whether the package contains a library.
338 `jailbreak`
339 : Whether to execute [jailbreak-cabal][jailbreak-cabal] before `configurePhase`
340 to lift any version constraints in the cabal file. Note that this can't
341 lift version bounds if they are conditional, i.e. if a dependency is hidden
342 behind a flag.
344 `enableParallelBuilding`
345 : Whether to use the `-j` flag to make GHC/Cabal start multiple jobs in parallel.
347 `maxBuildCores`
348 : Upper limit of jobs to use in parallel for compilation regardless of
349 `$NIX_BUILD_CORES`. Defaults to 16 as Haskell compilation with GHC currently
350 sees a [performance regression](https://gitlab.haskell.org/ghc/ghc/-/issues/9221)
351 if too many parallel jobs are used.
353 `doCoverage`
354 : Whether to generate and install files needed for [HPC][haskell-program-coverage].
355 Defaults to `false`.
357 `doHaddock`
358 : Whether to build (HTML) documentation using [haddock][haddock].
359 Defaults to `true` if supported.
361 `testTarget`
362 : Name of the test suite to build and run. If unset, all test suites will be executed.
364 `preCompileBuildDriver`
365 : Shell code to run before compiling `Setup.hs`.
367 `postCompileBuildDriver`
368 : Shell code to run after compiling `Setup.hs`.
370 `preHaddock`
371 : Shell code to run before building documentation using haddock.
373 `postHaddock`
374 : Shell code to run after building documentation using haddock.
376 `coreSetup`
377 : Whether to only allow core libraries to be used while building `Setup.hs`.
378 Defaults to `false`.
380 `useCpphs`
381 : Whether to enable the [cpphs][cpphs] preprocessor. Defaults to `false`.
383 `enableSeparateBinOutput`
384 : Whether to install executables to a separate `bin` output. Defaults to `false`.
386 `enableSeparateDataOutput`
387 : Whether to install data files shipped with the package to a separate `data` output.
388 Defaults to `false`.
390 `enableSeparateDocOutput`
391 : Whether to install documentation to a separate `doc` output.
392 Is automatically enabled if `doHaddock` is `true`.
394 `enableSeparateIntermediatesOutput`
395 : When `doInstallIntermediates` is true, whether to install intermediate build
396 products to a separate `intermediates` output. See [“Incremental
397 builds”](#haskell-incremental-builds) for more information. Defaults to
398 `false`.
400 `allowInconsistentDependencies`
401 : If enabled, allow multiple versions of the same Haskell package in the
402 dependency tree at configure time. Often in such a situation compilation would
403 later fail because of type mismatches. Defaults to `false`.
405 `enableLibraryForGhci`
406 : Build and install a special object file for GHCi. This improves performance
407 when loading the library in the REPL, but requires extra build time and
408 disk space. Defaults to `false`.
410 `previousIntermediates`
411 : If non-null, intermediate build artifacts are copied from this input to
412 `dist/build` before performing compiling. See [“Incremental
413 builds”](#haskell-incremental-builds) for more information. Defaults to `null`.
415 `buildTarget`
416 : Name of the executable or library to build and install.
417 If unset, all available targets are built and installed.
419 ### Specifying dependencies {#haskell-derivation-deps}
421 Since `haskellPackages.mkDerivation` is intended to be generated from cabal
422 files, it reflects cabal's way of specifying dependencies. For one, dependencies
423 are grouped by what part of the package they belong to. This helps to reduce the
424 dependency closure of a derivation, for example benchmark dependencies are not
425 included if `doBenchmark == false`.
427 `setup*Depends`
428 : dependencies necessary to compile `Setup.hs`
430 `library*Depends`
431 : dependencies of a library contained in the package
433 `executable*Depends`
434 : dependencies of an executable contained in the package
436 `test*Depends`
437 : dependencies of a test suite contained in the package
439 `benchmark*Depends`
440 : dependencies of a benchmark contained in the package
442 The other categorization relates to the way the package depends on the dependency:
444 `*ToolDepends`
445 : Tools we need to run as part of the build process.
446 They are added to the derivation's `nativeBuildInputs`.
448 `*HaskellDepends`
449 : Haskell libraries the package depends on.
450 They are added to `propagatedBuildInputs`.
452 `*SystemDepends`
453 : Non-Haskell libraries the package depends on.
454 They are added to `buildInputs`
456 `*PkgconfigDepends`
457 : `*SystemDepends` which are discovered using `pkg-config`.
458 They are added to `buildInputs` and it is additionally
459 ensured that `pkg-config` is available at build time.
461 `*FrameworkDepends`
462 : Apple SDK Framework which the package depends on when compiling it on Darwin.
464 Using these two distinctions, you should be able to categorize most of the dependency
465 specifications that are available:
466 `benchmarkFrameworkDepends`,
467 `benchmarkHaskellDepends`,
468 `benchmarkPkgconfigDepends`,
469 `benchmarkSystemDepends`,
470 `benchmarkToolDepends`,
471 `executableFrameworkDepends`,
472 `executableHaskellDepends`,
473 `executablePkgconfigDepends`,
474 `executableSystemDepends`,
475 `executableToolDepends`,
476 `libraryFrameworkDepends`,
477 `libraryHaskellDepends`,
478 `libraryPkgconfigDepends`,
479 `librarySystemDepends`,
480 `libraryToolDepends`,
481 `setupHaskellDepends`,
482 `testFrameworkDepends`,
483 `testHaskellDepends`,
484 `testPkgconfigDepends`,
485 `testSystemDepends` and
486 `testToolDepends`.
488 That only leaves the following extra ways for specifying dependencies:
490 `buildDepends`
491 : Allows specifying Haskell dependencies which are added to `propagatedBuildInputs` unconditionally.
493 `buildTools`
494 : Like `*ToolDepends`, but are added to `nativeBuildInputs` unconditionally.
496 `extraLibraries`
497 : Like `*SystemDepends`, but are added to `buildInputs` unconditionally.
499 `pkg-configDepends`
500 : Like `*PkgconfigDepends`, but are added to `buildInputs` unconditionally.
502 `testDepends`
503 : Deprecated, use either `testHaskellDepends` or `testSystemDepends`.
505 `benchmarkDepends`
506 : Deprecated, use either `benchmarkHaskellDepends` or `benchmarkSystemDepends`.
508 The dependency specification methods in this list which are unconditional
509 are especially useful when writing [overrides](#haskell-overriding-haskell-packages)
510 when you want to make sure that they are definitely included. However, it is
511 recommended to use the more accurate ones listed above when possible.
513 ### Meta attributes {#haskell-derivation-meta}
515 `haskellPackages.mkDerivation` accepts the following attributes as direct
516 arguments which are transparently set in `meta` of the resulting derivation. See
517 the [Meta-attributes section](#chap-meta) for their documentation.
519 * These attributes are populated with a default value if omitted:
520     * `homepage`: defaults to the Hackage page for `pname`.
521     * `platforms`: defaults to `lib.platforms.all` (since GHC can cross-compile)
522 * These attributes are only set if given:
523     * `description`
524     * `license`
525     * `changelog`
526     * `maintainers`
527     * `broken`
528     * `hydraPlatforms`
530 ### Incremental builds {#haskell-incremental-builds}
532 `haskellPackages.mkDerivation` supports incremental builds for GHC 9.4 and
533 newer with the `doInstallIntermediates`, `enableSeparateIntermediatesOutput`,
534 and `previousIntermediates` arguments.
536 The basic idea is to first perform a full build of the package in question,
537 save its intermediate build products for later, and then copy those build
538 products into the build directory of an incremental build performed later.
539 Then, GHC will use those build artifacts to avoid recompiling unchanged
540 modules.
542 For more detail on how to store and use incremental build products, see
543 [Gabriella Gonzalez’ blog post “Nixpkgs support for incremental Haskell
544 builds”.][incremental-builds] motivation behind this feature.
546 An incremental build for [the `turtle` package][turtle] can be performed like
549 ```nix
551   pkgs = import <nixpkgs> {};
552   inherit (pkgs) haskell;
553   inherit (haskell.lib.compose) overrideCabal;
555   # Incremental builds work with GHC >=9.4.
556   turtle = haskell.packages.ghc944.turtle;
558   # This will do a full build of `turtle`, while writing the intermediate build products
559   # (compiled modules, etc.) to the `intermediates` output.
560   turtle-full-build-with-incremental-output = overrideCabal (drv: {
561     doInstallIntermediates = true;
562     enableSeparateIntermediatesOutput = true;
563   }) turtle;
565   # This will do an incremental build of `turtle` by copying the previously
566   # compiled modules and intermediate build products into the source tree
567   # before running the build.
568   #
569   # GHC will then naturally pick up and reuse these products, making this build
570   # complete much more quickly than the previous one.
571   turtle-incremental-build = overrideCabal (drv: {
572     previousIntermediates = turtle-full-build-with-incremental-output.intermediates;
573   }) turtle;
575   turtle-incremental-build
578 ## Development environments {#haskell-development-environments}
580 In addition to building and installing Haskell software, nixpkgs can also
581 provide development environments for Haskell projects. This has the obvious
582 advantage that you benefit from `cache.nixos.org` and no longer need to compile
583 all project dependencies yourself. While it is often very useful, this is not
584 the primary use case of our package set. Have a look at the section
585 [available package versions](#haskell-available-versions) to learn which
586 versions of packages we provide and the section
587 [limitations](#haskell-limitations), to judge whether a `haskellPackages`
588 based development environment for your project is feasible.
590 By default, every derivation built using
591 [`haskellPackages.mkDerivation`](#haskell-mkderivation) exposes an environment
592 suitable for building it interactively as the `env` attribute. For example, if
593 you have a local checkout of `random`, you can enter a development environment
594 for it like this (if the dependencies in the development and packaged version
595 match):
597 ```console
598 $ cd ~/src/random
599 $ nix-shell -A haskellPackages.random.env '<nixpkgs>'
600 [nix-shell:~/src/random]$ ghc-pkg list
601 /nix/store/a8hhl54xlzfizrhcf03c1l3f6l9l8qwv-ghc-9.2.4-with-packages/lib/ghc-9.2.4/package.conf.d
602     Cabal-3.6.3.0
603     array-0.5.4.0
604     base-4.16.3.0
605     binary-0.8.9.0
606     …
607     ghc-9.2.4
608     …
611 As you can see, the environment contains a GHC which is set up so it finds all
612 dependencies of `random`. Note that this environment does not mirror
613 the environment used to build the package, but is intended as a convenient
614 tool for development and simple debugging. `env` relies on the `ghcWithPackages`
615 wrapper which automatically injects a pre-populated package-db into every
616 GHC invocation. In contrast, using `nix-shell -A haskellPackages.random` will
617 not result in an environment in which the dependencies are in GHCs package
618 database. Instead, the Haskell builder will pass in all dependencies explicitly
619 via configure flags.
621 `env` mirrors the normal derivation environment in one aspect: It does not include
622 familiar development tools like `cabal-install`, since we rely on plain `Setup.hs`
623 to build all packages. However, `cabal-install` will work as expected if in
624 `PATH` (e.g. when installed globally and using a `nix-shell` without `--pure`).
625 A declarative and pure way of adding arbitrary development tools is provided
626 via [`shellFor`](#haskell-shellFor).
628 When using `cabal-install` for dependency resolution you need to be a bit
629 careful to achieve build purity. `cabal-install` will find and use all
630 dependencies installed from the packages `env` via Nix, but it will also
631 consult Hackage to potentially download and compile dependencies if it can’t
632 find a valid build plan locally. To prevent this you can either never run
633 `cabal update`, remove the cabal database from your `~/.cabal` folder or run
634 `cabal` with `--offline`. Note though, that for some usecases `cabal2nix` needs
635 the local Hackage db.
637 Often you won't work on a package that is already part of `haskellPackages` or
638 Hackage, so we first need to write a Nix expression to obtain the development
639 environment from. Luckily, we can generate one very easily from an already
640 existing cabal file using `cabal2nix`:
642 ```console
643 $ ls
644 my-project.cabal src …
645 $ cabal2nix ./. > my-project.nix
648 The generated Nix expression evaluates to a function ready to be
649 `callPackage`-ed. For now, we can add a minimal `default.nix` which does just
650 that:
652 ```nix
653 # Retrieve nixpkgs impurely from NIX_PATH for now, you can pin it instead, of course.
654 { pkgs ? import <nixpkgs> {} }:
656 # use the nixpkgs default haskell package set
657 pkgs.haskellPackages.callPackage ./my-project.nix { }
660 Using `nix-build default.nix` we can now build our project, but we can also
661 enter a shell with all the package's dependencies available using `nix-shell
662 -A env default.nix`. If you have `cabal-install` installed globally, it'll work
663 inside the shell as expected.
665 ### shellFor {#haskell-shellFor}
667 Having to install tools globally is obviously not great, especially if you want
668 to provide a batteries-included `shell.nix` with your project. Luckily there's a
669 proper tool for making development environments out of packages' build
670 environments: `shellFor`, a function exposed by every haskell package set. It
671 takes the following arguments and returns a derivation which is suitable as a
672 development environment inside `nix-shell`:
674 `packages`
675 : This argument is used to select the packages for which to build the
676 development environment. This should be a function which takes a haskell package
677 set and returns a list of packages. `shellFor` will pass the used package set to
678 this function and include all dependencies of the returned package in the build
679 environment. This means you can reuse Nix expressions of packages included in
680 nixpkgs, but also use local Nix expressions like this: `hpkgs: [
681 (hpkgs.callPackage ./my-project.nix { }) ]`.
683 `nativeBuildInputs`
684 : Expects a list of derivations to add as build tools to the build environment.
685 This is the place to add packages like `cabal-install`, `doctest` or `hlint`.
686 Defaults to `[]`.
688 `buildInputs`
689 : Expects a list of derivations to add as library dependencies, like `openssl`.
690 This is rarely necessary as the haskell package expressions usually track system
691 dependencies as well. Defaults to `[]`. (see also
692 [derivation dependencies](#haskell-derivation-deps))
694 `withHoogle`
695 : If this is true, `hoogle` will be added to `nativeBuildInputs`.
696 Additionally, its database will be populated with all included dependencies,
697 so you'll be able search through the documentation of your dependencies.
698 Defaults to `false`.
700 `genericBuilderArgsModifier`
701 : This argument accepts a function allowing you to modify the arguments passed
702 to `mkDerivation` in order to create the development environment. For example,
703 `args: { doCheck = false; }` would cause the environment to not include any test
704 dependencies. Defaults to `lib.id`.
706 `doBenchmark`
707 : This is a shortcut for enabling `doBenchmark` via `genericBuilderArgsModifier`.
708 Setting it to `true` will cause the development environment to include all
709 benchmark dependencies which would be excluded by default. Defaults to `false`.
711 One neat property of `shellFor` is that it allows you to work on multiple
712 packages using the same environment in conjunction with
713 [cabal.project files][cabal-project-files].
714 Say our example above depends on `distribution-nixpkgs` and we have a project
715 file set up for both, we can add the following `shell.nix` expression:
717 ```nix
718 { pkgs ? import <nixpkgs> {} }:
720 pkgs.haskellPackages.shellFor {
721   packages = hpkgs: [
722     # reuse the nixpkgs for this package
723     hpkgs.distribution-nixpkgs
724     # call our generated Nix expression manually
725     (hpkgs.callPackage ./my-project/my-project.nix { })
726   ];
728   # development tools we use
729   nativeBuildInputs = [
730     pkgs.cabal-install
731     pkgs.haskellPackages.doctest
732     pkgs.cabal2nix
733   ];
735   # Extra arguments are added to mkDerivation's arguments as-is.
736   # Since it adds all passed arguments to the shell environment,
737   # we can use this to set the environment variable the `Paths_`
738   # module of distribution-nixpkgs uses to search for bundled
739   # files.
740   # See also: https://cabal.readthedocs.io/en/latest/cabal-package.html#accessing-data-files-from-package-code
741   distribution_nixpkgs_datadir = toString ./distribution-nixpkgs;
745 <!-- TODO(@sternenseemann): deps are not included if not selected -->
747 ### haskell-language-server {#haskell-language-server}
749 To use HLS in short: Install `pkgs.haskell-language-server` e.g. in
750 `nativeBuildInputs` in `shellFor` and use the `haskell-language-server-wrapper`
751 command to run it. See the [HLS user guide] on how to configure your text
752 editor to use HLS and how to test your setup.
754 HLS needs to be compiled with the GHC version of the project you use it
757 ``pkgs.haskell-language-server`` provides
758 ``haskell-language-server-wrapper``, ``haskell-language-server``
759 and ``haskell-language-server-x.x.x``
760 binaries, where ``x.x.x`` is the GHC version for which it is compiled. By
761 default, it only includes binaries for the current GHC version, to reduce
762 closure size. The closure size is large, because HLS needs to be dynamically
763 linked to work reliably. You can override the list of supported GHC versions
764 with e.g.
766 ```nix
767 pkgs.haskell-language-server.override { supportedGhcVersions = [ "90" "94" ]; }
769 Where all strings `version` are allowed such that
770 `haskell.packages.ghc${version}` is an existing package set.
772 When you run `haskell-language-server-wrapper` it will detect the GHC
773 version used by the project you are working on (by asking e.g. cabal or
774 stack) and pick the appropriate versioned binary from your path.
776 Be careful when installing HLS globally and using a pinned nixpkgs for a
777 Haskell project in a `nix-shell`. If the nixpkgs versions deviate to much
778 (e.g., use different `glibc` versions) the `haskell-language-server-?.?.?`
779 executable will try to detect these situations and refuse to start. It is
780 recommended to obtain HLS via `nix-shell` from the nixpkgs version pinned in
781 there instead.
783 The top level `pkgs.haskell-language-server` attribute is just a convenience
784 wrapper to make it possible to install HLS for multiple GHC versions at the
785 same time. If you know, that you only use one GHC version, e.g., in a project
786 specific `nix-shell` you can use
787 `pkgs.haskellPackages.haskell-language-server` or
788 `pkgs.haskell.packages.*.haskell-language-server` from the package set you use.
790 If you use `nix-shell` for your development environments remember to start your
791 editor in that environment. You may want to use something like `direnv` and/or an
792 editor plugin to achieve this.
794 ## Overriding Haskell packages {#haskell-overriding-haskell-packages}
796 ### Overriding a single package {#haskell-overriding-a-single-package}
798 <!-- TODO(@sternenseemann): we should document /somewhere/ that base == null etc. -->
800 Like many language specific subsystems in nixpkgs, the Haskell infrastructure
801 also has its own quirks when it comes to overriding. Overriding of the *inputs*
802 to a package at least follows the standard procedure. For example, imagine you
803 need to build `nix-tree` with a more recent version of `brick` than the default
804 one provided by `haskellPackages`:
806 ```nix
807 haskellPackages.nix-tree.override {
808   brick = haskellPackages.brick_0_67;
812 <!-- TODO(@sternenseemann): This belongs in the next section
813 One common problem you may run into with such an override is the build failing
814 with “abort because of serious configure-time warning from Cabal”. When scrolling
815 up, you'll usually notice that Cabal noticed that more than one versions of the same
816 package was present in the dependency graph. This typically causes a later compilation
817 failure (the error message `haskellPackages.mkDerivation` produces tries to save
818 you the time of finding this out yourself, but if you wish to do so, you can
819 disable it using `allowInconsistentDependencies`). Luckily, `haskellPackages` provides
820 you with a tool to deal with this. `overrideScope` creates a new `haskellPackages`
821 instance with the override applied *globally* for this package, so the dependency
822 closure automatically uses a consistent version of the overridden package. E. g.
823 if `haskell-ci` needs a recent version of `Cabal`, but also uses other packages
824 that depend on that library, you may want to use:
826 ```nix
827 haskellPackages.haskell-ci.overrideScope (self: super: {
828   Cabal = self.Cabal_3_6_2_0;
834 The custom interface comes into play when you want to override the arguments
835 passed to `haskellPackages.mkDerivation`. For this, the function `overrideCabal`
836 from `haskell.lib.compose` is used. E.g., if you want to install a man page
837 that is distributed with the package, you can do something like this:
839 ```nix
840 haskell.lib.compose.overrideCabal (drv: {
841   postInstall = ''
842     ${drv.postInstall or ""}
843     install -Dm644 man/pnbackup.1 -t $out/share/man/man1
844   '';
845 }) haskellPackages.pnbackup
848 `overrideCabal` takes two arguments:
850 1. A function which receives all arguments passed to `haskellPackages.mkDerivation`
851    before and returns a set of arguments to replace (or add) with a new value.
852 2. The Haskell derivation to override.
854 The arguments are ordered so that you can easily create helper functions by making
855 use of currying:
857 ```nix
859   installManPage = haskell.lib.compose.overrideCabal (drv: {
860     postInstall = ''
861       ${drv.postInstall or ""}
862       install -Dm644 man/${drv.pname}.1 -t "$out/share/man/man1"
863     '';
864   });
867 installManPage haskellPackages.pnbackup
870 In fact, `haskell.lib.compose` already provides lots of useful helpers for common
871 tasks, detailed in the next section. They are also structured in such a way that
872 they can be combined using `lib.pipe`:
874 ```nix
875 lib.pipe my-haskell-package [
876   # lift version bounds on dependencies
877   haskell.lib.compose.doJailbreak
878   # disable building the haddock documentation
879   haskell.lib.compose.dontHaddock
880   # pass extra package flag to Cabal's configure step
881   (haskell.lib.compose.enableCabalFlag "myflag")
885 #### `haskell.lib.compose` {#haskell-haskell.lib.compose}
887 The base interface for all overriding is the following function:
889 `overrideCabal f drv`
890 : Takes the arguments passed to obtain `drv` to `f` and uses the resulting
891 attribute set to update the argument set. Then a recomputed version of `drv`
892 using the new argument set is returned.
894 <!--
895 TODO(@sternenseemann): ideally we want to be more detailed here as well, but
896 I want to avoid the documentation having to be kept in sync in too many places.
897 We already document this stuff in the mkDerivation section and lib/compose.nix.
898 Ideally this section would be generated from the latter in the future.
901 All other helper functions are implemented in terms of `overrideCabal` and make
902 common overrides shorter and more complicate ones trivial. The simple overrides
903 which only change a single argument are only described very briefly in the
904 following overview. Refer to the
905 [documentation of `haskellPackages.mkDerivation`](#haskell-mkderivation)
906 for a more detailed description of the effects of the respective arguments.
908 ##### Packaging Helpers {#haskell-packaging-helpers}
910 `overrideSrc { src, version } drv`
911 : Replace the source used for building `drv` with the path or derivation given
912 as `src`. The `version` attribute is optional. Prefer this function over
913 overriding `src` via `overrideCabal`, since it also automatically takes care of
914 removing any Hackage revisions.
916 <!-- TODO(@sternenseemann): deprecated
918 `generateOptparseApplicativeCompletions list drv`
919 : Generate and install shell completion files for the installed executables whose
920 names are given via `list`. The executables need to be using `optparse-applicative`
921 for this to work.
924 `justStaticExecutables drv`
925 : Only build and install the executables produced by `drv`, removing everything
926 that may refer to other Haskell packages' store paths (like libraries and
927 documentation). This dramatically reduces the closure size of the resulting
928 derivation. Note that the executables are only statically linked against their
929 Haskell dependencies, but will still link dynamically against libc, GMP and
930 other system library dependencies. If dependencies use their Cabal-generated
931 `Paths_*` module, this may not work as well if GHC's dead code elimination
932 is unable to remove the references to the dependency's store path that module
933 contains.
935 `enableSeparateBinOutput drv`
936 : Install executables produced by `drv` to a separate `bin` output. This
937 has a similar effect as `justStaticExecutables`, but preserves the libraries
938 and documentation in the `out` output alongside the `bin` output with a
939 much smaller closure size.
941 `markBroken drv`
942 : Sets the `broken` flag to `true` for `drv`.
944 `markUnbroken drv`, `unmarkBroken drv`
945 : Set the `broken` flag to `false` for `drv`.
947 `doDistribute drv`
948 : Updates `hydraPlatforms` so that Hydra will build `drv`. This is
949 sometimes necessary when working with versioned packages in
950 `haskellPackages` which are not built by default.
952 `dontDistribute drv`
953 : Sets `hydraPlatforms` to `[]`, causing Hydra to skip this package
954 altogether. Useful if it fails to evaluate cleanly and is causing
955 noise in the evaluation errors tab on Hydra.
957 ##### Development Helpers {#haskell-development-helpers}
959 `sdistTarball drv`
960 : Create a source distribution tarball like those found on Hackage
961 instead of building the package `drv`.
963 `documentationTarball drv`
964 : Create a documentation tarball suitable for uploading to Hackage
965 instead of building the package `drv`.
967 `buildFromSdist drv`
968 : Uses `sdistTarball drv` as the source to compile `drv`. This helps to catch
969 packaging bugs when building from a local directory, e.g. when required files
970 are missing from `extra-source-files`.
972 `failOnAllWarnings drv`
973 : Enables all warnings GHC supports and makes it fail the build if any of them
974 are emitted.
976 <!-- TODO(@sternenseemann):
977 `checkUnusedPackages opts drv`
978 : Adds an extra check to `postBuild` which fails the build if any dependency
979 taken as an input is not used. The `opts` attribute set allows relaxing this
980 check.
983 `enableDWARFDebugging drv`
984 : Compiles the package with additional debug symbols enabled, useful
985 for debugging with e.g. `gdb`.
987 `doStrip drv`
988 : Sets `doStrip` to `true` for `drv`.
990 `dontStrip drv`
991 : Sets `doStrip` to `false` for `drv`.
993 <!-- TODO(@sternenseemann): shellAware -->
995 ##### Trivial Helpers {#haskell-trivial-helpers}
997 `doJailbreak drv`
998 : Sets the `jailbreak` argument to `true` for `drv`.
1000 `dontJailbreak drv`
1001 : Sets the `jailbreak` argument to `false` for `drv`.
1003 `doHaddock drv`
1004 : Sets `doHaddock` to `true` for `drv`.
1006 `dontHaddock drv`
1007 : Sets `doHaddock` to `false` for `drv`. Useful if the build of a package is
1008 failing because of e.g. a syntax error in the Haddock documentation.
1010 `doHyperlinkSource drv`
1011 : Sets `hyperlinkSource` to `true` for `drv`.
1013 `dontHyperlinkSource drv`
1014 : Sets `hyperlinkSource` to `false` for `drv`.
1016 `doCheck drv`
1017 : Sets `doCheck` to `true` for `drv`.
1019 `dontCheck drv`
1020 : Sets `doCheck` to `false` for `drv`. Useful if a package has a broken,
1021 flaky or otherwise problematic test suite breaking the build.
1023 `dontCheckIf condition drv`
1024 : Sets `doCheck` to `false` for `drv`, but only if `condition` applies.
1025 Otherwise it's a no-op. Useful to conditionally disable tests for a package
1026 without interfering with previous overrides or default values.
1028 <!-- Purposefully omitting the non-list variants here. They are a bit
1029 ugly, and we may want to deprecate them at some point. -->
1031 `appendConfigureFlags list drv`
1032 : Adds the strings in `list` to the `configureFlags` argument for `drv`.
1034 `enableCabalFlag flag drv`
1035 : Makes sure that the Cabal flag `flag` is enabled in Cabal's configure step.
1037 `disableCabalFlag flag drv`
1038 : Makes sure that the Cabal flag `flag` is disabled in Cabal's configure step.
1040 `appendBuildFlags list drv`
1041 : Adds the strings in `list` to the `buildFlags` argument for `drv`.
1043 <!-- TODO(@sternenseemann): removeConfigureFlag -->
1045 `appendPatches list drv`
1046 : Adds the `list` of derivations or paths to the `patches` argument for `drv`.
1048 <!-- TODO(@sternenseemann): link dep section -->
1050 `addBuildTools list drv`
1051 : Adds the `list` of derivations to the `buildTools` argument for `drv`.
1053 `addExtraLibraries list drv`
1054 : Adds the `list` of derivations to the `extraLibraries` argument for `drv`.
1056 `addBuildDepends list drv`
1057 : Adds the `list` of derivations to the `buildDepends` argument for `drv`.
1059 `addTestToolDepends list drv`
1060 : Adds the `list` of derivations to the `testToolDepends` argument for `drv`.
1062 `addPkgconfigDepends list drv`
1063 : Adds the `list` of derivations to the `pkg-configDepends` argument for `drv`.
1065 `addSetupDepends list drv`
1066 : Adds the `list` of derivations to the `setupHaskellDepends` argument for `drv`.
1068 `doBenchmark drv`
1069 : Set `doBenchmark` to `true` for `drv`. Useful if your development
1070 environment is missing the dependencies necessary for compiling the
1071 benchmark component.
1073 `dontBenchmark drv`
1074 : Set `doBenchmark` to `false` for `drv`.
1076 `setBuildTargets drv list`
1077 : Sets the `buildTarget` argument for `drv` so that the targets specified in `list` are built.
1079 `doCoverage drv`
1080 : Sets the `doCoverage` argument to `true` for `drv`.
1082 `dontCoverage drv`
1083 : Sets the `doCoverage` argument to `false` for `drv`.
1085 `enableExecutableProfiling drv`
1086 : Sets the `enableExecutableProfiling` argument to `true` for `drv`.
1088 `disableExecutableProfiling drv`
1089 : Sets the `enableExecutableProfiling` argument to `false` for `drv`.
1091 `enableLibraryProfiling drv`
1092 : Sets the `enableLibraryProfiling` argument to `true` for `drv`.
1094 `disableLibraryProfiling drv`
1095 : Sets the `enableLibraryProfiling` argument to `false` for `drv`.
1097 #### Library functions in the Haskell package sets {#haskell-package-set-lib-functions}
1099 Some library functions depend on packages from the Haskell package sets. Thus they are
1100 exposed from those instead of from `haskell.lib.compose` which can only access what is
1101 passed directly to it. When using the functions below, make sure that you are obtaining them
1102 from the same package set (`haskellPackages`, `haskell.packages.ghc944` etc.) as the packages
1103 you are working with or – even better – from the `self`/`final` fix point of your overlay to
1104 `haskellPackages`.
1106 Note: Some functions like `shellFor` that are not intended for overriding per se, are omitted
1107 in this section. <!-- TODO(@sternenseemann): note about ifd section -->
1109 `cabalSdist { src, name ? ... }`
1110 : Generates the Cabal sdist tarball for `src`, suitable for uploading to Hackage.
1111 Contrary to `haskell.lib.compose.sdistTarball`, it uses `cabal-install` over `Setup.hs`,
1112 so it is usually faster: No build dependencies need to be downloaded, and we can
1113 skip compiling `Setup.hs`.
1115 `buildFromCabalSdist drv`
1116 : Build `drv`, but run its `src` attribute through `cabalSdist` first. Useful for catching
1117 files necessary for compilation that are missing from the sdist.
1119 `generateOptparseApplicativeCompletions list drv`
1120 : Generate and install shell completion files for the installed executables whose
1121 names are given via `list`. The executables need to be using `optparse-applicative`
1122 for [this to work][optparse-applicative-completions].
1123 Note that this feature is automatically disabled when cross-compiling, since it
1124 requires executing the binaries in question.
1126 <!--
1128 TODO(@NixOS/haskell): finish these planned sections
1129 ### Overriding the entire package set
1132 ## Import-from-Derivation helpers
1134 * `callCabal2nix`
1135 * `callHackage`, `callHackageDirect`
1136 * `developPackage`
1138 ## Contributing {#haskell-contributing}
1140 ### Fixing a broken package {#haskell-fixing-a-broken-package}
1142 ### Package set generation {#haskell-package-set-generation}
1144 ### Packaging a Haskell project
1146 ### Backporting {#haskell-backporting}
1148 Backporting changes to a stable NixOS version in general is covered
1149 in nixpkgs' `CONTRIBUTING.md` in general. In particular refer to the
1150 [backporting policy](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#criteria-for-backporting-changes)
1151 to check if the change you have in mind may be backported.
1153 This section focuses on how to backport a package update (e.g. a
1154 bug fix or security release). Fixing a broken package works like
1155 it does for the unstable branches.
1159 ## F.A.Q. {#haskell-faq}
1161 ### Why is topic X not covered in this section? Why is section Y missing? {#haskell-why-not-covered}
1163 We have been working on [moving the nixpkgs Haskell documentation back into the
1164 nixpkgs manual](https://github.com/NixOS/nixpkgs/issues/121403). Since this
1165 process has not been completed yet, you may find some topics missing here
1166 covered in the old [haskell4nix docs](https://haskell4nix.readthedocs.io/).
1168 If you feel any important topic is not documented at all, feel free to comment
1169 on the issue linked above.
1171 ### How to enable or disable profiling builds globally? {#haskell-faq-override-profiling}
1173 By default, Nixpkgs builds a profiling version of each Haskell library. The
1174 exception to this rule are some platforms where it is disabled due to concerns
1175 over output size. You may want to…
1177 * …enable profiling globally so that you can build a project you are working on
1178   with profiling ability giving you insight in the time spent across your code
1179   and code you depend on using [GHC's profiling feature][profiling].
1181 * …disable profiling (globally) to reduce the time spent building the profiling
1182   versions of libraries which a significant amount of build time is spent on
1183   (although they are not as expensive as the “normal” build of a Haskell library).
1185 ::: {.note}
1186 The method described below affects the build of all libraries in the
1187 respective Haskell package set as well as GHC. If your choices differ from
1188 Nixpkgs' default for your (host) platform, you will lose the ability to
1189 substitute from the official binary cache.
1191 If you are concerned about build times and thus want to disable profiling, it
1192 probably makes sense to use `haskell.lib.compose.disableLibraryProfiling` (see
1193 [](#haskell-trivial-helpers)) on the packages you are building locally while
1194 continuing to substitute their dependencies and GHC.
1197 Since we need to change the profiling settings for the desired Haskell package
1198 set _and_ GHC (as the core libraries like `base`, `filepath` etc. are bundled
1199 with GHC), it is recommended to use overlays for Nixpkgs to change them.
1200 Since the interrelated parts, i.e. the package set and GHC, are connected
1201 via the Nixpkgs fixpoint, we need to modify them both in a way that preserves
1202 their connection (or else we'd have to wire it up again manually). This is
1203 achieved by changing GHC and the package set in separate overlays to prevent
1204 the package set from pulling in GHC from `prev`.
1206 The result is two overlays like the ones shown below. Adjustable parts are
1207 annotated with comments, as are any optional or alternative ways to achieve
1208 the desired profiling settings without causing too many rebuilds.
1210 <!-- TODO(@sternenseemann): buildHaskellPackages != haskellPackages with this overlay,
1211 affected by https://github.com/NixOS/nixpkgs/issues/235960 which needs to be fixed
1212 properly still.
1215 ```nix
1217   # Name of the compiler and package set you want to change. If you are using
1218   # the default package set `haskellPackages`, you need to look up what version
1219   # of GHC it currently uses (note that this is subject to change).
1220   ghcName = "ghc92";
1221   # Desired new setting
1222   enableProfiling = true;
1226   # The first overlay modifies the GHC derivation so that it does or does not
1227   # build profiling versions of the core libraries bundled with it. It is
1228   # recommended to only use such an overlay if you are enabling profiling on a
1229   # platform that doesn't by default, because compiling GHC from scratch is
1230   # quite expensive.
1231   (final: prev:
1232   let
1233     inherit (final) lib;
1234   in
1236   {
1237     haskell = prev.haskell // {
1238       compiler = prev.haskell.compiler // {
1239         ${ghcName} = prev.haskell.compiler.${ghcName}.override {
1240           # Unfortunately, the GHC setting is named differently for historical reasons
1241           enableProfiledLibs = enableProfiling;
1242         };
1243       };
1244     };
1245   })
1247   (final: prev:
1248   let
1249     inherit (final) lib;
1250     haskellLib = final.haskell.lib.compose;
1251   in
1253   {
1254     haskell = prev.haskell // {
1255       packages = prev.haskell.packages // {
1256         ${ghcName} = prev.haskell.packages.${ghcName}.override {
1257           overrides = hfinal: hprev: {
1258             mkDerivation = args: hprev.mkDerivation (args // {
1259               # Since we are forcing our ideas upon mkDerivation, this change will
1260               # affect every package in the package set.
1261               enableLibraryProfiling = enableProfiling;
1263               # To actually use profiling on an executable, executable profiling
1264               # needs to be enabled for the executable you want to profile. You
1265               # can either do this globally or…
1266               enableExecutableProfiling = enableProfiling;
1267             });
1269             # …only for the package that contains an executable you want to profile.
1270             # That saves on unnecessary rebuilds for packages that you only depend
1271             # on for their library, but also contain executables (e.g. pandoc).
1272             my-executable = haskellLib.enableExecutableProfiling hprev.my-executable;
1274             # If you are disabling profiling to save on build time, but want to
1275             # retain the ability to substitute from the binary cache. Drop the
1276             # override for mkDerivation above and instead have an override like
1277             # this for the specific packages you are building locally and want
1278             # to make cheaper to build.
1279             my-library = haskellLib.disableLibraryProfiling hprev.my-library;
1280           };
1281         };
1282       };
1283     };
1284   })
1288 <!-- TODO(@sternenseemann): write overriding mkDerivation, overriding GHC, and
1289 overriding the entire package set sections and link to them from here where
1290 relevant.
1293 [Stackage]: https://www.stackage.org
1294 [cabal-project-files]: https://cabal.readthedocs.io/en/latest/cabal-project.html
1295 [cabal2nix]: https://github.com/nixos/cabal2nix
1296 [cpphs]: https://Hackage.haskell.org/package/cpphs
1297 [haddock-hoogle-option]: https://haskell-haddock.readthedocs.io/en/latest/invoking.html#cmdoption-hoogle
1298 [haddock-hyperlinked-source-option]: https://haskell-haddock.readthedocs.io/en/latest/invoking.html#cmdoption-hyperlinked-source
1299 [haddock]: https://www.haskell.org/haddock/
1300 [haskell-program-coverage]: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/profiling.html#observing-code-coverage
1301 [haskell.nix]: https://input-output-hk.github.io/haskell.nix/index.html
1302 [HLS user guide]: https://haskell-language-server.readthedocs.io/en/latest/configuration.html#configuring-your-editor
1303 [hoogle]: https://wiki.haskell.org/Hoogle
1304 [incremental-builds]: https://www.haskellforall.com/2022/12/nixpkgs-support-for-incremental-haskell.html
1305 [jailbreak-cabal]: https://github.com/NixOS/jailbreak-cabal/
1306 [multiple-outputs]: https://nixos.org/manual/nixpkgs/stable/#chap-multiple-output
1307 [optparse-applicative-completions]: https://github.com/pcapriotti/optparse-applicative/blob/7726b63796aa5d0df82e926d467f039b78ca09e2/README.md#bash-zsh-and-fish-completions
1308 [profiling-detail]: https://cabal.readthedocs.io/en/latest/cabal-project.html#cfg-field-profiling-detail
1309 [profiling]: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/profiling.html
1310 [search.nixos.org]: https://search.nixos.org
1311 [turtle]: https://hackage.haskell.org/package/turtle