[Nix-dev] A Journey into the Haskell NG infrastructure: Part I
Thomas Hunger
tehunger at gmail.com
Fri Jan 9 18:02:37 CET 2015
This is really cool!
I changed my sandbox code to look like the following. Is that how it's
intended to be used?
{ haskellngPackages ? (import <nixpkgs> {}).haskellngPackages,
pkgs ? (import <nixpkgs> {}).pkgs }:
let
env = haskellngPackages.ghcWithPackages (p: [
p.text
p.mtl
p.transformers
p.warp
p.cabal-install
]);
in
pkgs.myEnvFun {
name = "hello-world-wide-web";
buildInputs = [ env ];
}
On 9 January 2015 at 15:46, Peter Simons <simons at cryp.to> wrote:
> Dear Haskellers `intersect` Nixers,
>
> this is the first installment of a series of postings to describe technical
> aspects of the re-factored Haskell infrastructure. When this is all done, I
> intend to use these articles to create some kind of *gasp* user
> documentation
> for the Nixpkgs manual. So I encourage everyone to point out of omissions
> and
> technical errors, or to ask for clarification if something is vague or
> misleading. I've chosen an FAQ-style approach because I felt that this is
> easiest for me to write. Hopefully this translates into the document being
> easy
> to read, too! Here we go ...
>
> Why should I care about this "new infrastructure"?
> --------------------------------------------------
>
> The new code will break evaluation of any Haskell-related configuration
> you
> may have in ~/.nixpkgs/config.nix or /etc/nixos/configuration.nix.
>
> Privately generated cabal2nix expressions will cease to compile.
>
> Installations that rely on ghc-wrapper finding GHC libraries
> automatically in
> your ~/.nix-profile are obsolete. If you use this approach, you won't be
> able
> to update your profile anymore.
>
>
> Duh, I don't want that!
> -----------------------
>
> You can stick to the established 'haskellPackages' set, if you prefer.
> The
> new code exists separately in 'haskellngPackages', and it's invisible to
> "nix-env -i <package-name>" and "nix-env -u". If you don't make a
> conscious
> effort to switch, you won't see any of it.
>
>
> So I'll never have to update if I don't want to?
> ------------------------------------------------
>
> My guess is that 'haskellPackages' and 'haskellngPackages' will co-exist
> for
> a while. Personally, I switched to Haskell NG, though, and I won't
> maintain
> any packages in the old hierarchy anymore. I suppose other contributors
> will
> do the same thing. Once you've converted your setup to
> 'haskellngPackages',
> there's no reason to look back, really.
>
> In other words, you don't have to convert your setup *right now*, but at
> some
> point in the future you will probably have to.
>
>
> Is it difficult to migrate to Haskell NG?
> -----------------------------------------
>
> Users of 'ghcWithPackages' can easily switch back and forth between both
> package sets. Your ~/.nixpkgs/config.nix file probably defines an
> attribute
> like this one:
>
> | {
> | packageOverrides = super: let self = super.pkgs; in
> | {
> | haskellEnv = self.haskellPackages.ghcWithPackages (p: with p; [
> | async attoparsec caseInsensitive fgl GLUT GLURaw haskellSrc
> | ]);
> | };
> | }
>
> Change this definition as follows to switch to Haskell NG:
>
> | {
> | provideOldHaskellAttributeNames = true;
> |
> | packageOverrides = super: let self = super.pkgs; in
> | {
> | haskellEnv = self.haskellngPackages.ghcWithPackages (p: with p; [
> | async attoparsec caseInsensitive fgl GLUT GLURaw haskellSrc
> | ]);
> | };
> | }
>
> There are only two differences: the "ng" bit in the name of the package
> set,
> and the new 'provideOldHaskellAttributeNames' config attribute. (Note
> that
> this lives at the top level of ~/.nixpkgs/config.nix -- not inside of
> 'packageOverrides'.)
>
> Users of the ghc-wrapper have to make a greater effort, I'm afraid,
> because
> ghc-wrapper no longer exists in the NG code. You'll have to switch to
> 'ghcWithPackages' first. You may find this article helpful for the
> process:
> <http://permalink.gmane.org/gmane.linux.distributions.nixos/15161>.
>
>
> What does 'provideOldHaskellAttributeNames' do?
> -----------------------------------------------
>
> The package 'cabal-install' has the attribute 'cabalInstall' in the old
> package set. In the new one, however, the attribute is now called
> 'cabal-install' -- just like the package. provideOldHaskellAttributeNames
> enables a compatibility layer that defins the old camel-case style names
> on
> top of the new ones. This allows you to use the same configuration for
> both
> the new and old package sets.
>
> Once you feel ready to migrate permanently to NG code, you can switch the
> compatibility layer off, to ensure that all your definition use the new
> names
> consistently.
>
>
> Why is the ghc-wrapper gone?
> ----------------------------
>
> ghc-wrapper's underlying promise is that you can install a random Haskell
> package into your Nix profile, and GHC will pick it up from there
> automatically. Now, this worked reasonably well for many packages, but
> for
> may other packages it didn't work, and those cases caused us a lot
> trouble,
> bug reports, and heated discussions in the past, and we ended up adding
> more
> and more layers of plumbing around xmonad, ghc-mod, and whatnot in an
> attempt
> to rescue the idea that GHC would somehow find packages automatically
> without
> being told about them.
>
> In the NG infrastructure, this whole notion has been abandoned. The
> proper
> way to install ghc is trough the 'ghcWithPackages' function. It knows
> about
> exactly those packages that you tell it to. It's slightly more effort to
> define your Haskell environment this way, but what you get in return for
> this
> extra effort is a totally deterministic compiler that doesn't depend on
> any
> wrapper scripts, it produces predictable results independent of what
> else you
> may or may not have installed, and it interacts just fine with
> cabal-install
> -- something the ghc-wrapper never managed to get right.
>
>
> When will the new code be available?
> ------------------------------------
>
> It already is. 'haskellngPackages' was introduced to 'master' by commit
> 54baa53d on 2015-01-07, and it has now been picked up by the "unstable"
> channel.
>
>
> Why would I want to migrate? What are the advantages?
> -----------------------------------------------------
>
> The NG package set contains the latest version of every package available
> from Hackage, plus some older versions that we need to make legacy stuff
> compile. In total, we deliver in excess of 7,500 packages. Just look at
>
>
> https://raw.githubusercontent.com/NixOS/nixpkgs/master/pkgs/development/haskell-modules/hackage-packages.nix
>
> if you don't believe it. The 'hackage-packages.nix' file is generated
> automatically by the hackage2nix utility -- which I'll describe in
> detail in
> a later installment --, and it allows us to easily track Hackage on a
> daily
> basis if we want to.
>
> Haskell NG supports GHC 7.10.x.
>
> Haskell NG allows you to configure the hell out of your installation.
> You can
> add new packages easily, you can build your own customized package sets,
> you
> can change Cabal flags, compiler arguments, or any other aspect of how a
> package is built by means of the 'overrideCabal' function without
> editing the
> source of Nixpgs. The file
>
>
> https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/configuration-common.nix
>
> illustrates this point nicely.
>
> It's possible to specify deep overrides with 'overrideScope', which I'll
> describe in detail in a later installment. To get a first impression,
> check
> out
>
>
> https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/configuration-ghc-7.8.x.nix#L61
>
> for a concrete example of a deep override that replaces the version of
> mtl
> 2.1.x with 2.2.x in the context of the 'amazonka' package family.
>
>
> Is there a binary cache available for the NG packages?
> ------------------------------------------------------
>
> Haskelll NG is built by
> http://hydra.nixos.org/jobset/nixpkgs/haskell-updates
> and http://hydra.cryp.to/jobset/nixpkgs/haskell-ng. You can get
> binaries from
> these servers by adding the command line flags
>
> --option extra-binary-caches http://hydra.nixos.org
> --option extra-binary-caches http://hydra.cryp.to
>
> to your invocations of nix-build, nix-env, etc.
>
> The normal binary cache that backs the "unstable" channel does not yet
> have
> binaries for NG.
>
>
> Does Haskell NG support compilers other than GHC 7.8.4?
> -------------------------------------------------------
>
> Yes, there is a family of package sets 'haskell-ng.packages.ghcXYZ' that
> define package sets for GHC versions 6.10.4, 6.12.3, 7.0.4, 7.2.2, 7.4.2,
> 7.6.3, 7.8.4, and HEAD a.k.a. 7.10.1-rc1. For example, to install a
> version
> of GHC 7.6.3, define
>
> ghc763Env = self.haskell-ng.packages.ghc763.ghcWithPackages (p: with
> p; [
> mtl network parallel parsec QuickCheck random regex-base regex-compat
> regex-posix stm syb text zlib alex cabal-install cpphs happy
> ghc-paths
> monad-par
> ]);
>
> in ~/.nixpkgs/config.nix. Note that the compiler-specific package sets do
> *not* have the compatibility layer. Inside of
> 'haskell-ng.packages.ghcXYZ',
> only the new attribute names exist!
>
> Furthermore, the package sets for GHC 7.6.3, 7.8.4, and 7.10.1-r1 are the
> only ones that can be expected to work. I have never tested any pre-7.6.3
> compiler. Getting those package sets to work well is almost certainly
> going
> to be a bit of an effort.
>
>
> What can I do to help develop Haskell NG?
> -----------------------------------------
>
> Use it!
>
> Switch your configuration to the 'haskellngPackages' package set and try
> whether you can update your profile to the new version. If you cannot,
> then
> please report the issue in this e-mail thread so that we can try to
> figure
> out what's going wrong.
>
> As of today, we can compile approximately 50% of Hackage successfully.
> See
> http://hydra.nixos.org/jobset/nixpkgs/haskell-updates for the current
> state
> of affairs. Obviously, we would like to get that percentage way up!
> Patches,
> bug reports, and feature requests will help us accomplish that.
>
>
> Have fun,
> Peter
>
> _______________________________________________
> nix-dev mailing list
> nix-dev at lists.science.uu.nl
> http://lists.science.uu.nl/mailman/listinfo/nix-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.science.uu.nl/pipermail/nix-dev/attachments/20150109/5432f3e9/attachment-0001.html
More information about the nix-dev
mailing list