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