]> Git — Sourcephile - julm/worksheets.git/blob - flake.nix
update
[julm/worksheets.git] / flake.nix
1 # SPDX-FileCopyrightText: 2025 Julien Moutinho <julm+worksheets@sourcephile.fr>
2 # SPDX-License-Identifier: CC0-1.0
3 {
4 description = "Worksheet";
5 inputs = {
6 nixpkgs.url = "github:NixOS/nixpkgs/9cb344e96d5b6918e94e1bca2d9f3ea1e9615545";
7 git-hooks.url = "github:cachix/git-hooks.nix";
8 git-hooks.inputs.nixpkgs.follows = "nixpkgs";
9 symantic-base = {
10 url = "git://git.sourcephile.fr/haskell/symantic-base.git";
11 flake = false;
12 };
13 ipa-hs = {
14 url = "git+file:///home/julm/work/sourcephile/haskell/worksheets/libs/ipa-hs";
15 flake = false;
16 };
17 };
18 outputs =
19 inputs:
20 let
21 pkg = "worksheets";
22 lib = inputs.nixpkgs.lib;
23 fileInputs =
24 with lib.fileset;
25 toSource {
26 root = ./.;
27 fileset = unions [
28 ./worksheets.cabal
29 #./ChangeLog.md
30 #./Readme.md
31 ./LICENSES
32 (fileFilter (file: lib.any file.hasExt [ "hs" ]) ./src)
33 (fileFilter (file: lib.any file.hasExt [ "css" ]) ./data/styles)
34 (fileFilter (
35 file:
36 lib.any file.hasExt [
37 "hs"
38 "html"
39 "txt"
40 ]
41 ) ./tests)
42 #(fileFilter (file: lib.any file.hasExt [ "hs" ]) ./app)
43 ];
44 };
45 # Helper to build for each system in `lib.systems.flakeExposed`.
46 perSystem =
47 f:
48 lib.genAttrs lib.systems.flakeExposed (
49 system:
50 f rec {
51 inherit system;
52 #pkgs = import inputs.nixpkgs { inherit system; };
53 pkgs = inputs.nixpkgs.legacyPackages.${system};
54 haskellPackages = pkgs.haskellPackages.extend (
55 with pkgs.haskell.lib;
56 finalHaskellPkgs: previousHaskellPkgs: {
57 ${pkg} = buildFromSdist (finalHaskellPkgs.callCabal2nix pkg fileInputs { });
58 anki-tools = null;
59 symantic-base = finalHaskellPkgs.callCabal2nix "symantic-base" inputs.symantic-base { };
60 #ipa = doJailbreak (unmarkBroken previousHaskellPkgs.ipa);
61 ipa = doJailbreak (finalHaskellPkgs.callCabal2nix "ipa-hs" inputs.ipa-hs { });
62 python-pickle = dontCheck (doJailbreak (unmarkBroken previousHaskellPkgs.python-pickle));
63 hs-speedscope = doJailbreak (unmarkBroken previousHaskellPkgs.hs-speedscope);
64 }
65 );
66 }
67 );
68 in
69 {
70 # `nix -L build`
71 packages = perSystem (
72 { haskellPackages, pkgs, ... }:
73 pkgs
74 // {
75 default = haskellPackages.${pkg};
76 }
77 );
78 # `nix -L develop` or `direnv allow`
79 devShells = perSystem (
80 {
81 pkgs,
82 haskellPackages,
83 system,
84 ...
85 }:
86 {
87 default = haskellPackages.shellFor {
88 packages = ps: [ ps.${pkg} ];
89 nativeBuildInputs = [
90 haskellPackages.cabal-fmt
91 haskellPackages.cabal-install
92 haskellPackages.eventlog2html
93 haskellPackages.ghc-gc-tune
94 haskellPackages.ghcid
95 haskellPackages.haskell-language-server
96 haskellPackages.hlint
97 #haskellPackages.hs-speedscope
98 #pkgs.git-chglog
99 pkgs.reuse
100 pkgs.xdot
101 pkgs.gnuplot
102 pkgs.fswatch
103 ]
104 ++ inputs.self.checks.${system}.git-hooks-check.enabledPackages;
105 withHoogle = false;
106 shellHook = ''
107 ${inputs.self.checks.${system}.git-hooks-check.shellHook}
108 '';
109 };
110 }
111 );
112 # `nix flake check`
113 checks = perSystem (
114 args: with args; {
115 git-hooks-check = inputs.git-hooks.lib.${system}.run {
116 src = ./.;
117 hooks = {
118 cabal-fmt.enable = true;
119 fourmolu.enable = true;
120 hlint.enable = true;
121 nixfmt-rfc-style.enable = true;
122 ormolu.settings.cabalDefaultExtensions = true;
123 ormolu.settings.defaultExtensions = [
124 "ImportQualifiedPost"
125 "TypeApplications"
126 ];
127 reuse = {
128 enable = true;
129 entry = "${pkgs.reuse}/bin/reuse lint";
130 pass_filenames = false;
131 };
132 };
133 };
134 }
135 );
136 # `nix fmt`
137 formatter = perSystem (
138 args:
139 with args;
140 let
141 config = inputs.self.checks.${system}.git-hooks-check.config;
142 inherit (config) package configFile;
143 script = ''
144 ${lib.getExe package} run --all-files --config ${configFile}
145 '';
146 in
147 pkgs.writeShellScriptBin "pre-commit-run" script
148 );
149 };
150 }