diff --git a/Manual.md b/Manual.md index c8a891ee0ea..699ec9e9127 100644 --- a/Manual.md +++ b/Manual.md @@ -1138,6 +1138,10 @@ for compiling cargo -sys crates. It also adds a `cargo` wrapper that detects and passes builds through `cargo-auditable`. This helper is added by default for packages that use the `cargo` build style. +- `haskell` specifies environment variables for cabal. +This helper is added by default for packages that use the `haskell-stack` or +`cabal` build style. + ### Functions @@ -1698,21 +1702,45 @@ The path to the package's source inside `$GOPATH` is available as #### Haskell packages -We build Haskell package using `stack` from -[Stackage](http://www.stackage.org/), generally the LTS versions. -Haskell templates need to have host dependencies on `ghc` and `stack`, -and set build style to `haskell-stack`. +Haskell packages can be built either with the `cabal` or `haskell-stack` +build style, use whichever is more convenient or better supported by upstream, +sometimes only one of the two is possible. For packages that have haskell +parts but use a different build style like `gnu-makefile`, make sure to use +the `haskell` build helper. -The following variables influence how Haskell packages are built: +The following variables influence how packages are built with cabal: + +- `cabal_index_state`: The state of the hackage cabal index to use for + fetching dependencies. The source package of a haskell project should + come with a freeze file that sets the index state, some also set it in + their cabal project file. If it does not, then this has to be set to an ISO + timestamp in the package template. For example `2025-07-05T14:01:16Z`. +- `configure_args`: Arguments passed to `cabal configure`. The configure step + generates the `cabal.project.local` file. +- `make_build_args`: Arguments passed to `cabal build`. +- `make_build_target`: Target passed to `cabal build`. +- `make_check_args`: Arguments passed to `cabal test`. +- `make_check_target`: Test target passed to cabal instead of "test". +- `make_install_target`: Target passed to `cabal install`. + +And these variables influence how packages are built with stack: - `stackage`: The Stackage version used to build the package, e.g. `lts-3.5`. Alternatively: - You can prepare a `stack.yaml` configuration for the project and put it into `files/stack.yaml`. - - If a `stack.yaml` file is present in the source files, it will be used + - If a `stack.yaml` file is present in the source files, it will be used. - `make_build_args`: This is passed as-is to `stack build ...`, so you can add your `--flag ...` parameters there. +To patch dependencies of haskell packages they have to be fetched explicitly +from hackage by adding them to `distfiles` instead of letting cabal or stack +download them. Once extracted and patched, the path to the patched version +can be added to `packages` in `cabal.project` or `stack.yaml`. +Stack will find them automatically if no `stack.yaml` file exists by scanning +the directory. The build tool will then use the patched version of the +depencency instead of downloading it from hackage. + #### Font packages