* Include modifications to nixpkgs and static-haskell-nix as patches. * use the patched static-haskell-nix version * Add cachix postgrest
90 lines
3.2 KiB
Nix
90 lines
3.2 KiB
Nix
# Turn a Haskell source package (given its name and source) into a derivation
|
|
# for a fully static executable.
|
|
{ nixpkgs, compiler, name, src, patches }:
|
|
let
|
|
# The nh2/static-haskell-nix project does all the hard work for us for
|
|
# building static Haskell executables. We apply a patch for PostgREST below
|
|
# until the respective pull request is merged. See:
|
|
# https://github.com/nh2/static-haskell-nix/pull/91
|
|
# statix-haskell-nix builds everything based on Musl instead of glibc, so
|
|
# there will be a _lot_ to rebuild if you don't use a binary cache.
|
|
static-haskell-nix =
|
|
let
|
|
rev = "749707fc90b781c3e653e67917a7d571fe82ae7b";
|
|
in
|
|
builtins.fetchTarball {
|
|
url = "https://github.com/nh2/static-haskell-nix/archive/${rev}.tar.gz";
|
|
sha256 = "155spda2lww378bhx68w6dxwqd5y6s9kin3qbgl2m23r3vmk3m3w";
|
|
};
|
|
|
|
patched-static-haskell-nix =
|
|
patches.applyPatches "patched-static-haskell-nix" static-haskell-nix
|
|
[
|
|
patches.static-haskell-nix-postgrest-libpq
|
|
];
|
|
|
|
haskellPackagesOverrides =
|
|
lib: final: prev:
|
|
{
|
|
# Add our source package.
|
|
"${name}" = prev.callCabal2nix name src {};
|
|
|
|
# cabal2nix depends on Cabal 3.0.*, while our pinned version of Nixpkgs
|
|
# only provides 2.4 or 3.2. So we pinned 3.0.0.0 in ./Cabal.nix
|
|
cabal2nix =
|
|
prev.cabal2nix.overrideScope
|
|
(self: super: { Cabal = self.callPackage ./Cabal.nix {}; });
|
|
|
|
# Pinned version of protolude.
|
|
protolude =
|
|
prev.callPackage ../overlays/haskell-packages/protolude.nix {};
|
|
|
|
# The tests for the packages below took a long time on static
|
|
# builds, so we disable them for now - to be investigated.
|
|
happy = lib.dontCheck prev.happy;
|
|
};
|
|
|
|
# This overlay adds our source package and applies adjustments to the
|
|
# derivation of other packages that it depends on. The overlay applies to
|
|
# Haskell packages for the given compiler, which we will later use
|
|
# with the static-haskell-nix survey.
|
|
overlay =
|
|
self: super:
|
|
# Override the set of Haskell packages at
|
|
# pkgs.haskell.packages."${compiler}".
|
|
{
|
|
haskell = super.haskell // {
|
|
packages = super.haskell.packages // {
|
|
"${compiler}" =
|
|
super.haskell.packages."${compiler}".override
|
|
{ overrides = haskellPackagesOverrides self.haskell.lib; };
|
|
};
|
|
};
|
|
};
|
|
|
|
patchedNixpkgs =
|
|
patches.applyPatches "patched-nixpkgs" nixpkgs
|
|
[
|
|
patches.nixpkgs-revert-ghc-bootstrap
|
|
];
|
|
|
|
# Apply our overlay to the given pkgs.
|
|
normalPkgs =
|
|
(import patchedNixpkgs {}).appendOverlays [ overlay ];
|
|
|
|
# Each version of GHC needs a specific version of Cabal.
|
|
defaultCabalPackageVersionComingWithGhc =
|
|
{
|
|
ghc883 = "Cabal_3_2_0_0";
|
|
}."${compiler}";
|
|
|
|
# Let the static-haskell-nix project do the hard work of deriving a set of
|
|
# fully static Haskell executables, including one for the our source package
|
|
# that we added through the overlay.
|
|
survey =
|
|
import "${patched-static-haskell-nix}/survey"
|
|
{ inherit normalPkgs compiler defaultCabalPackageVersionComingWithGhc; };
|
|
in
|
|
# Return the fully static derivation of our source package.
|
|
survey.haskellPackages."${name}"
|