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