Add pkgs.haskell.lib.readDirectory utility

This adds a `readDirectory` utility that can be used to "slurp" a directory
full of `cabal2nix`-generated files and transform them into a Haskell package
override set.  The main use of this is so that users don't have to write:

```
{ overrides = self: super: {
    foo = self.callPackage ./path/to/foo.nix { };

    bar = self.callPackage ./path/to/bar.nix { };

    ...
  };
}
```

Instead, they can write:

```
{ overrides = pkgs.haskell.lib.readDirectory ./path/to;
}
```

This is a an alternative to `packageSourceOverrides` which primarily addresses
the following use cases:

* The desired package is not yet available in `all-cabal-hashes` (perhaps the
  user is pinned to an older revision of `nixpkgs`)
* The default `cabal2nix` invocation used by `packageSourceOverrides`
  does not use the desired `cabal2nix` flags
* The user wants to avoid the use of import-from-derivation
This commit is contained in:
Gabriel Gonzalez 2018-07-03 09:25:15 -07:00
parent 208091b31b
commit e57fd11bb4

View file

@ -382,4 +382,23 @@ rec {
allPkgconfigDepends;
};
# Utility to convert a directory full of `cabal2nix`-generated files into a
# package override set
#
# readDirectory : Directory -> HaskellPackageOverrideSet
readDirectory =
directory:
self: super:
let
haskellPaths = builtins.attrNames (builtins.readDir directory);
toKeyVal = file: {
name = builtins.replaceStrings [ ".nix" ] [ "" ] file;
value = self.callPackage (directory + "/${file}") { };
};
in
builtins.listToAttrs (map toKeyVal haskellPaths);
}