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