Skip to content

Commit

Permalink
fix: update flake, refactor, add scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
deemp committed Sep 26, 2023
1 parent ef31534 commit 85ee750
Show file tree
Hide file tree
Showing 9 changed files with 392 additions and 108 deletions.
10 changes: 10 additions & 0 deletions default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
let t = (import
(
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in
fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
}
)
{ src = ./.; }
).defaultNix; in t // t.packages.${builtins.currentSystem}
72 changes: 61 additions & 11 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

99 changes: 34 additions & 65 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
{
inputs = {
flake-utils.url = "github:numtide/flake-utils";
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
nixpkgs.url = "github:NixOS/nixpkgs/e1b4c97ed4ce160afd9ef1574b6a2ff168482f2a";
miso = {
url = "github:dmjio/miso/5c66ed20818ce4aff81aaefbd5789007717923eb";
url = "github:dmjio/miso/49edf0677253bbcdd473422b5dd5b4beffd83910";
flake = false;
};
flake-compat = {
url = "github:edolstra/flake-compat";
flake = false;
};
nix-filter.url = "github:numtide/nix-filter";
jsaddle = {
url = "github:ghcjs/jsaddle";
flake = false;
};
};
Expand All @@ -12,84 +21,44 @@
pkgs = inputs.nixpkgs.legacyPackages.${system};

rzk = "rzk";
try-rzk = "try-rzk";
ghcVersion = "ghc927";

# select a Haskell package set for a specified GHC version
hpkgs = pkgs.haskell.packages.${ghcVersion};

inherit (pkgs.haskell.lib) overrideCabal;

# Provide overrides
# https://nixos.wiki/wiki/Haskell#Overrides
# An override should include a local package into the Haskell package set
override = {
overrides = self: super: {
${rzk} = overrideCabal (self.callCabal2nix rzk ./${rzk} { }) (x: {
librarySystemDepends = [ pkgs.alex pkgs.happy ] ++ (x.librarySystemDepends or [ ]);
});
${try-rzk} = overrideCabal (self.callCabal2nix try-rzk ./${try-rzk} { }) (x: {
executableSystemDepends = [ self.ghcjs-prim self.ghcjs-base ] ++ (x.executableSystemDepends or [ ]);
});
};
};
hpkgs_ = hpkgs.override override;

# Get all dependencies of local Haskell packages excluding these local packages
# This approach is useful for cases when a local package A depends on a local package B
# In this case, package B won't be built by Nix as a dependency of A
getHaskellPackagesDeps = someHaskellPackages: let l = pkgs.lib.lists; in (l.subtractLists someHaskellPackages (l.concatLists (map (package: l.concatLists (__attrValues package.getCabalDeps)) someHaskellPackages)));

# build a GHC with the dependencies of local Haskell packages
ghcForPackages = localHaskellPackageNames: hpkgs_.ghcWithPackages (ps: (getHaskellPackagesDeps (map (x: ps.${x}) localHaskellPackageNames) ++ [ ps.haskell-language-server ])); # Why provide HLS here - https://github.com/NixOS/nixpkgs/issues/225895#issuecomment-1509991742
rzk-js = "rzk-js";
ghcVersion = "ghc962";
rzk-src = (inputs.nix-filter {
root = ./${rzk};
include = [ "app" "src" "test" "package.yaml" ];
});
rzk-js-src = (inputs.nix-filter {
root = ./${rzk-js};
include = [ "Main.hs" "${rzk-js}.cabal" ];
});

# GHC with dependencies of local Haskell packages
ghc = ghcForPackages [ rzk try-rzk ];

# tools that should be available in a development shell
tools = [
pkgs.cabal-install
pkgs.hpack
# haskell-language-server is already available as a GHC package
ghc
pkgs.nodejs_18
];

misoNix = (import "${inputs.miso.outPath}/default.nix" { inherit system; });
pkgsMiso = misoNix.pkgs;

# TODO add jsaddle version of the app
# https://github.com/dmjio/miso/tree/master/sample-app-jsaddle
# try-rzk-dev =
# let
# pkgsDev = pkgsMiso.haskell.packages.ghc865;
# rzk = pkgsDev.callPackage rzk/rzk.nix { inherit (pkgs) hpack; };
# in
# pkgsDev.callCabal2nix try-rzk ./${try-rzk} { miso = misoNix.miso-jsaddle; rzk = rzk; };
usual = import ./nix/usual.nix { inherit inputs pkgs rzk rzk-src ghcVersion tools; };
ghcjs = import ./nix/ghcjs.nix { inherit inputs pkgs scripts rzk rzk-src rzk-js rzk-js-src ghcVersion tools; };
scripts = import ./nix/scripts.nix { inherit pkgs packages; };

try-rzk-exe =
let
pkgsRelease = pkgsMiso.haskell.packages.ghcjs;
rzk = pkgsRelease.callPackage rzk/rzk.nix { inherit (pkgs) hpack; };
in
pkgsRelease.callCabal2nix try-rzk ./${try-rzk} { rzk = rzk; };

packages = {
rzk = hpkgs_.${rzk};
try-rzk = try-rzk-exe;
};
default = usual.packages.default;
rzk = usual.packages.${rzk};
rzk-js = ghcjs.packages.${rzk-js};
} // scripts;

devShells = {
default = pkgs.mkShell {
shellHook = "export LANG=C.utf8";
buildInputs = tools;
default = usual.devShells.default;
ghcjs = ghcjs.devShells.default;
release = pkgs.mkShell {
buildInputs = [ scripts.release-rzk-playground ];
};
ghcjs = try-rzk-exe.env.overrideAttrs (old: {
buildInputs = old.buildInputs ++ [ pkgs.cabal-install pkgs.hpack ];
});
};
in
{
inherit packages devShells;
inherit packages devShells usual ghcjs;
});

nixConfig = {
Expand Down
77 changes: 77 additions & 0 deletions nix/ghcjs.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
{ inputs, pkgs, scripts, rzk, rzk-js, rzk-src, rzk-js-src, ghcVersion, tools }:
let
inherit (pkgs.haskell.lib) overrideCabal;
misoNix = (import "${inputs.miso.outPath}/default.nix" { inherit (pkgs) system; });
pkgsMiso = misoNix.pkgs;

hpkgs =
# This isn't equivalent to `pkgsMiso.haskell.packages.ghcjs.override` ([link](https://nixos.wiki/wiki/Haskell#Overrides))
# but avoids multiple rebuilds
pkgsMiso.haskell.packages.ghcjs //
{
rzk = overrideCabal
(hpkgs.callCabal2nix rzk rzk-src { })
(x: {
isLibrary = true;
isExecutable = false;
doCheck = false;
doHaddock = false;
libraryToolDepends = [ pkgs.hpack pkgs.alex pkgs.happy ] ++ (x.libraryToolDepends or [ ]);
testToolDepends = [ pkgs.hpack pkgs.alex pkgs.happy ] ++ (x.testToolDepends or [ ]);
prePatch = "hpack --force";
});
rzk-js = overrideCabal
(hpkgs.callCabal2nix rzk-js rzk-js-src { inherit (hpkgs) rzk; })
(x: {
postInstall = (x.postInstall or "") + ''
cp $out/bin/${rzk-js} .
rm -r $out
cp ${rzk-js} $out
'';
});
};

hpkgsGHCJS_8_10_7 = pkgs.haskell.packages.ghcjs810.override ({
overrides = final: prev: {
integer-gmp = final.integer-gmp_1_1;
rzk = overrideCabal
(final.callCabal2nix rzk rzk-src { })
(x: {
isLibrary = true;
isExecutable = false;
doCheck = false;
doHaddock = false;
libraryToolDepends = [ pkgs.hpack pkgs.alex pkgs.happy ] ++ (x.libraryToolDepends or [ ]);
testToolDepends = [ pkgs.hpack pkgs.alex pkgs.happy ] ++ (x.testToolDepends or [ ]);
prePatch = "hpack --force";
});
rzk-js = overrideCabal
(final.callCabal2nix rzk-js rzk-js-src { inherit (final) rzk; })
(x: {
postInstall = (x.postInstall or "") + ''
rm -r $out/bin/${rzk-js}.jsexe
'';
});
};
});

packages = {
inherit (hpkgs) rzk rzk-js;

# Currently not buildable
rzk_8_10_7 = hpkgsGHCJS_8_10_7.rzk;
rzk-js_8_10_7 = hpkgsGHCJS_8_10_7;
};

devShells = {
default = (hpkgs.shellFor {
packages = _: [ hpkgs.${rzk} hpkgs.${rzk-js} ];
nativeBuildInputs = tools ++ [ scripts.build-rzk-js ];
}).overrideAttrs (x: {
buildInputs = builtins.filter (p: (p.name or "") != "ghc-8.6.4") (x.buildInputs or [ ]);
});
};
in
{
inherit hpkgs devShells packages hpkgsGHCJS_8_10_7;
}
Loading

0 comments on commit 85ee750

Please sign in to comment.