Files
haskell.nix/docs/dev/removing-with-package-wrapper.md
Rodney Lorrimar b4b18edeec Docs improvements (#171)
- Dev note about nixpkgs pin
- More information about selecting a GHC version for cabal projects
- A little bit more information about cross compiling, but this is still incomplete.
2019-06-12 10:18:38 +10:00

67 lines
2.4 KiB
Markdown

# `ghcWithPackages` wrapper removal
The current [Nixpkgs Haskell infrastructure][nixpkgs-haskell] and `haskell.nix` both
provide a `ghcWithPackages` derivation which contains shell script
wrappers that wrap `ghc` and `ghc-pkg`.
In the Nixpkgs Haskell infrastructure, the wrapper scripts are used
for building Haskell packages. However, in `haskell.nix`, the wrappers
are only used for development environments.
The wrapper scripts provide a `ghc` command that "knows" about the
package set and has all Haskell package dependencies available to it.
We would like to remove the wrapper scripts, but it's currently not
possible to configure all build tools using environment variables
alone.
## Plain `ghc`
When using `ghc` or `ghci` by itself, the `GHC_ENVIRONMENT` variable
can point to a configuration file containing an exact package
set. This works quite well.
## `ghc-pkg`
The package tool `ghc-pkg` does not recognize `GHC_ENVIRONMENT`, but
does recognize a `GHC_PACKAGE_PATH` pointing to a `package.conf.d`.
This works well. However, the `cabal` command will refuse to start if
`GHC_PACKAGE_PATH` is set.
## `Setup.hs`
When invoking `Setup.hs configure`, the package database is provided
with the `--package-db` argument and exact dependencies in the package
set can be provided as `--dependency` arguments.
The `haskell.nix` component builder uses `Setup.hs` with these
command-line options to build Haskell packages.
## `cabal new-build`
Cabal-install will observe the `CABAL_CONFIG` environment variable,
which points to a cabal config file. This config file can provide a
`package-db` value, but it can't specify exact versions of packages.
Cabal is designed to solve dependencies, not simply take the package
set which is given to it.
Therefore, `cabal` does not use `GHC_ENVIRONMENT`, but instead creates
its own environment file. It will not accept `--dependency` arguments.
As far as I know, the best way to force `cabal` to take a pre-computed
package set is to use a `new-freeze` file. However there is no
environment variable (or config file entry) which can specify a path
to a freeze file.
Specifying a `package-db` path in the cabal config file is not enough
for it to successfully resolve dependencies.
As mentioned before, `cabal` does not work when `GHC_PACKAGE_PATH` is
set. The best way to work around this is to wrap `ghc` and `ghc-pkg`
in shell scripts.
[nixpkgs-haskell]: https://nixos.org/nixpkgs/manual/#users-guide-to-the-haskell-infrastructure