[Nix-dev] How to help remedy build errors of Haskell packages in Nixpkgs

Mateusz Kowalczyk fuuzetsu at fuuzetsu.co.uk
Sun Aug 10 22:47:44 CEST 2014


On 08/10/2014 10:40 PM, Peter Simons wrote:
> Hi Mateusz,
> 
>  > Say a package version no longer builds with <recent GHC version> and
>  > upstream won't fix it or can't fix it to work with that version for
>  > some reason, what's the way to go about only blacklisting the broken
>  > GHC versions?
> 
> Hydra builds Haskell packages only with the "latest stable release" of
> GHC, which is 7.8.3 at the moment. Packages that don't compile with that
> particular compiler should not request a Hydra build. That is
> accomplished by adding the attribute
> 
>   hydraPlatforms = self.stdenv.lib.platforms.none;
> 
> to the "meta" section of the Nix expression. It's okay to make that
> change manually to the expression -- hackage4nix will keep that choice
> intact when re-generating the file.
> 
>  > What [is] the recommended way to edit the Haskell package expressions.
> 
> Personally, I don't use a compiled version of cabal2nix. I have a
> checked-out copy of the cabal2nix repository lying around in my home and
> use wrapper scripts to run the tool directly from source code. (The
> scripts are attached to the end of this message for your information.)
> 
> Now, some attributes can be changed manually in the Nix expression
> directly without going through cabal2nix. Those attributes are:
> 
>  - doCheck
>  - noHaddock
>  - jailbreak
>  - meta.maintainers
>  - meta.platforms
>  - meta.hydraPlatforms
> 
> When hackage4nix is run, it will always try to extract the current
> values for those attributes from the expressions found in Nixpkgs and
> re-use in the re-generation process. As a rule of thumb, you can make
> edits to a Haskell expression, and then run hackage4nix ~/src/nixpkgs to
> check that your changes are not overwritten. (I explained that workflow
> in more detail in my previous message.) If the changes remain untouched,
> everything is fine.
> 
> Furthermore, the following attributes can be edited manually in Nix
> expressions if the values apply only to the particular version of the
> package that you're editing:
> 
>  - {pre|post}Configure
>  - {pre|post}Install
>  - patchPhase
>  - patches
>  - meta.broken
> 
> If hackage4nix sees any of those attributes in a Nix expression, it will
> not touch the file, so these values will never be overwritten. When the
> package is updated, however, these values will be lost!
> 
> A typical use-case is this: suppose package "Foobar" has a bug that can
> be fixed by running a simple 'sed' command in the patchPhase hook. If
> that patch is added to the Nix expression, then it will stay in there,
> but when the new version comes out, the patch will be gone -- which is
> the behavior you want because you've reported that bug upstream and the
> next release will fix it, right? :-)
> 
> Last but not least, there are attributes that you cannot change manually
> at all. Those are:
> 
>  - buildDepends
>  - buildTools
>  - extraLibraries
>  - pkgconfigDepends
>  - testDepends
> 
> Any change to these attributes will be lost when hackage4nix
> re-generates the file. If you want to mess with the contents of these
> attributes, then you must modify the cabal2nix source code. The
> following types of patches occur most frequently:
> 
>  - A cabal file calls a system library "libfoo", but in Nixpkgs that
>    library is called "foo", so the generated Nix file comes out with a
>    function argument that cannot be resolved. This type of issue can be
>    fixed by passing an appropriate override in the haskell-packages.nix
>    file, or, preferably, by adding an appropriate mapping to:
> 
>      https://github.com/NixOS/cabal2nix/blob/master/src/Cabal2Nix/Name.hs
> 
>  - You want enable a Cabal flag that's not enabled by default (or
>    disable one that's enabled by default). This is simply a matter of
>    adding the configuration for the package to:
> 
>      https://github.com/NixOS/cabal2nix/blob/master/src/Cabal2Nix/Flags.hs
> 
>  - The Cabal file is outright broken, i.e. it doesn't specify all
>    required build tools (for example: Perl, cpphs, etc. are missing
>    frequently), it specifies an incorrect set of dependencies, etc. Now,
>    this kind of stuff must be reported upstream, obviously, but you can
>    work around these issue by messing with the generated build
>    instructions in the post-process hook at:
> 
>      https://github.com/NixOS/cabal2nix/blob/master/src/Cabal2Nix/PostProcess.hs
> 
> I hope this helps,
> Peter
> 
> 
> 
> 
> _______________________________________________
> nix-dev mailing list
> nix-dev at lists.science.uu.nl
> http://lists.science.uu.nl/mailman/listinfo/nix-dev
> 

OK, that's a great answer, thanks! One remaining question I have is
about whether we should be attempting to make failing packages build.
Consider the log at [1]. It seems like it would be easy to fix with a
patch file doing the extra imports or whatever it takes. Is doing this
encouraged? It's not a nix problem so it seems we shouldn't implement a
fix ourselves. For now I marked that package as broken and sent an
e-mail to the maintainer.

[1]: http://hydra.cryp.to/build/164802/log/raw

-- 
Mateusz K.


More information about the nix-dev mailing list