This file contains a summary of changes to Haskell.nix and nix-tools
that will impact users.
Cabal projects now use the more granular Unit IDs from plan.json
to identify packages. This allows for different versions of a
package to be used when building built-tool-depends
and setup
dependencies.
Overrides in the modules
argument apply to all versions of
the package. However to make this work we needed to make
each packages.somepackage
an option (instead of using an
attrsOf
the submodule type).
It is now an error to override a package that is not in the
plan. This can be a problem if different GHC versions, target
platforms, or cabal flag settings cause the package to be
excluded from the plan. Adding package-keys
can tell
haskell.nix to include the option anyway:
modules = [{
# Tell haskell.nix that `somepackage` may exist.
package-keys = ["somepackage"];
# Now the following will not cause an error even
# if `somepackage` is not in the plan
packages.somepackage.flags.someflag = true;
}];
There is a helper function you can use to add package-keys
for all of the builtins.attrNames
of packages
:
modules = [(pkgs.haskell-nix.haskellLib.addPackageKeys {
packages.somepackage.flags.someflag = true;
})];
Do not use the module's pkgs
arg to look addPackageKeys
up
though or it will result an infinite recursion
error.
Code that uses options.packages
will also need to be updated.
For instance the following code that uses options.packages
to set --Werror
for local packages:
({ lib, ... }: {
options.packages = lib.mkOption {
type = lib.types.attrsOf (lib.types.submodule (
{ config, lib, ... }:
lib.mkIf config.package.isLocal
{
configureFlags = [ "--ghc-option=-Werror"];
}
));
};
})
Now needs to do it for each of the entry in config.package-keys
instead of using attrsOf
:
({ config, lib, ... }: {
options.packages = lib.genAttrs config.package-keys (_:
lib.mkOption {
type = lib.types.submodule (
{ config, lib, ... }:
lib.mkIf config.package.isLocal
{
configureFlags = [ "--ghc-option=-Werror"];
}
);
});
})
Haskell.nix now respects the pre-existing
packages selected
by the cabal planner. The selection made by the planner
is used to set nonReinstallablePkgs
.
Instead setting nonReinstallablePkgs
and reinstallableLibGhc
haskell.nix projects should add constraints
to the cabal project.
For instance to force the use of the pre-exising
text
package add:
constraints: text installed
To make sure text
is reinstalled use:
constraints: text source
The pre-existing
ghc
will now be used by default as
that is what cabal
will choose (haskell.nix used to choose
reinstallableLibGhc=true
by default).
To allow cabal to choose reinstalling ghc
add:
allow-boot-library-installs: True
To force cabal to choose reinstalling:
constraints: ghc source
allow-boot-library-installs: True
It may also need allow-newer: ghc:Cabal
Haskell.nix will no longer parse the cabal.project
file to
determine the index-state
. This decision was made due to
the function's inability to handle more than one index-state
or a qualified index-state
as the first index-state
field in the file.
As a result, there will be some drawbacks:
-
There will no longer be a warning in the trace output if an index state is not found.
-
Even if the
index-state:
in thecabal.project
has not changed, the plan will be recomputed when hackage.nix is bumped. However, this is not expected to be a problem since plan recomputations are typically quick. -
project.index-state
cannot be used to obtain the foundindex-state
. However, the parse function is still available if required (haskell-nix.haskellLib.parseIndexState).
-
Removed reliance on
builtins.currentSystem
. It was used it to providepkgs.evalPackages
via an overlay that it used to run derivations used in imports from derivation (IFDs).These derivations are now run on
buildPackages
by default.Passsing
evalPackages
to a project function will change where all the derivations used in IFDs are run for that project (including shell tools): evalPackages = import nixpkgs haskellNix.nixpkgsArgs;Passing
evalSystem
instead will use create a suitablenixpkgs
usingpkgs.path
andpkgs.overlay
: evalSystem = "x86_64-linux"; or evalSystem = builtins.currentSystem;The
haskellLib.cleanGit
function is also affected by this change. If you are cross compiling and usingcleanGit
you should probably do something like: pkgs = import nixpkgs haskellNix.nixpkgsArgs; evalPackages = import nixpkgs (haskellNix.nixpkgsArgs // { system = evalSystem; }); p = pkgs.pkgsCross.mingwW64.haskell-nix.cabalProject { inherit evalPackages; src = evalPackages.haskell-nix.haskellLib.cleanGit { src = ./.; }; };
- Removed lookupSha256 argument from project functions.
Pass a
sha256map
instead. - Added better support for
repository
incabal.project
. These blocks should now work without the need for passingextra-hackages
andextra-hackage-tarballs
.
- Included dependencies of haskell.nix that were tracked in
nix/sources.json
as flake inputs (flake.lock
replacesnix/sources.json
). - Uses
flake-compat
to continue to provide a compatible interface for non flake projects.
source-repository-package
references incabal.project
files are now left as asource-repository-package
when calculating the theplan-nix
forcabalProject
based functions. This makes haskell.nix match the behaviour ofcabal
better. Materialized files for projects that usesource-repository-package
references will need to be updated.- Only planned components are included in a haskell.nix cabal project.
If cabal solver does not include the component in the
plan.json
file it will not be present inhsPkgs.pkg.components
. - When the same package occurs more than once in a plan.json file the latest version is picked by haskell.nix.
- Project arguments are now validated with the Nix module system. If unexpected argments are passed to a project function this may now result in an error.
- Add
.dwarf
to build any component with DWARF dubug info on linux (ghc >=8.10.2). - Pass
enableDWARF
toshellFor
for to get a shell where all the components are the.dwarf
ones.
ghcOptions
has been moved from package and is now a list of strings. old: packages.x.package.ghcOptions = "someGHCoption"; new: packages.x.ghcOptions = ["someGHCoption"]; To specify ghcOptions for all packages: ghcOptions = ["someGHCoption"]; For a single component: packages.x.compoents.library.ghcOptions = ["someGHCoption"];
- Removed older versions of haskell-language-server from custom-tools (0.8.0 is in hackage so we can still get that version).
- Added support for cross package refs (with a project). Relative directory references between packages within a project should now work.
- Added
includeSiblings
tocleanSourceWith
. Whentrue
it prevents thesubDir
arg from causing filtering of other directories. - Added
keepGitDir
tocleanGit
to allow.git
directory to be kept (useful for components that use thegithash
package).
- Renamed
otherShells
arg forshellFor
to `inputsFrom
- The
shellFor
makeConfigFiles
ghcWithHoogle
andghcWithPackages
functions have been removed fromproject.hsPkgs
. Instead access them fromproject
itself (e.g. changep.hsPkgs.shellFor
top.shellFor
). - The reflex-platform like
project.shells.ghc
has been removed. If needed, add something likep // { shells.ghc = p.shellFor {} }
toshell.nix
.
- Added
${targetPrefix}cabal
wrapper script for running cross compilers inshellFor
. otherShells
arg added toshellFor
.
- Passing
tools.hoogle
toshellFor
with a value suitable forhaskel-nix.tool
will use the specifiedhoogle
insideshellFor
. This allows for materialization ofhoogle
.
- Passing
compiler-nix-name
to project functions forstack.yaml
based projects now overrides the compiler used (was ignored before).
- Added the ability to generate coverage reports for packages and projects.
- Added the
doCoverage
module option that allows users to choose packages to enable coverage for. - Added a
doCoverage
flag to the component builder that outputs HPC information when coverage is enabled. - Added test for coverage.
- Removed
components.all
, usesymlinkJoin
on components.exes orshellFor
if you need a shell. - Added
components
argument toshellFor
.
- Added GHC 8.8.4 and replaced 8.8.3 in tests and as the ghc used to build nix-tools for stack projects.
- Changed
haskell-nix.roots
andp.roots
to single derivations.
- Removed
sources.nixpkgs-default
, usesources.nixpkgs
instead. - Removed
./nixpkgs
directory, use(import ./. {}).sources
or./nix/sources.nix
instead. - Removes V1 interface for details on how to fix old code see: #709
- Removed defaultCompilerNixName.
- cabalProject, cabalProject', hackage-project and hackage-package
now require a
compiler-nix-name
argument. haskell-nix.tool
and.tools
now require acompiler-nix-name
argument. New functionsp.tool
andp.tools
(where p is a project) do not. LikeshellFor { tools = ... }
they will use the compiler nix name from the project (including stack projects where it is derived from the resolver).haskell-nix.alex
andhaskell-nix.happy
have been removed. Usep.tool "alex" "3.2.5"
orshellFor { tools = { alex = "3.2.5"; } }
.haskell-nix.nix-tools
->haskell-nix.nix-tools.ghc883
(it includes the hpack exe now).haskell-nix.cabal-install
->p.tool "cabal" "3.2.0.0"
orshellFor { tools = { cabal = "3.2.0.0"; } }
haskell-nix.haskellNixRoots
->haskell-nix.roots ghc883
orp.roots
- Haddock docs are now built in their own derivation when needed (not as part
of the component build).
They should build automatically when something (such as
shellFor
) attempts to accesses the.doc
attribute of component.
- Fix overlays/bootstrap.nix to provide LLVM 6, not LLVM 5, to ghc-8.6.X compilers.
- Changed the
cleanSourceHaskell
to accept an attrset ofsrc
and (optional)name
parameters. This allows you to keep the source derivation name constant, so that your builds are always cached. Usage ofcleanSourceHaskell
will need to be updated.
shellFor
no longer setsCABAL_CONFIG
by default. This avoids surprising users, but means that Cabal may select a plan which is different to your Haskell.nix package set. If you would like the old behaviour, useshellFor { exactDeps = true; }
.
- Add the
haskellLib.collectComponents
function.
- Add
ghcWithPackages
andghcWithHoogle
to hsPkgs (documentation. - Benchmark components can now build successfully.
- Reduced the closure bloat of nix-tools, and added closure size limit to CI.
- Added more reference documentation and set up auto-generated documentation for Module Options.
- Miscellaneous bug fixes.
- Several additions to the documentation.
- More information about getting nix-tools, Haskell.nix, pinning.
- Updates the stack-to-nix and cabal-to-nix guides.
- Adds a section on development environments.
- Adds a little information about cross compilation.
- Adds a (partially complete) reference section (command line manuals, library reference).
- Symlinks the changelog into the documentation pages.
- Added
shellFor
function to package set.
- Added
snaphots
andhaskellPackages
attributes to the Haskell.nix top-level.
- Add the
cleanSourceHaskell
utility function to the Haskell.nix top-level.
- Add the
callCabalProjectToNix
function, which uses "import from derivation" (IFD) so that nix-tools doesn't need to be run manually. - The
hackage.nix
update process has changed, so that Cabal index state hashes are also included in the generated repo.
- Remove Travis CI in favour of Buildkite.
- Add the
callStackToNix
function, which uses "import from derivation" (IFD) so thatstack-to-nix
doesn't need to be run manually.
-
overlays
was renamed toextras
in #79 to prevent confusion between the notion of Nix overlays.Therefore
plan-pkgs
andstack-pkgs
as generated byplan-to-nix
andstack-to-nix
will exposeextras
instead ofoverlay
. SimilarlymkStackPkgSet
,mkPkgSet
andmkCabalProjectPkgSet
take apkg-def-extras
instead ofpkg-def-overlay
argument. If you are usingiohk-nix
, theiohk-overlay
was parameter was renamed toiohk-extras
.