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