From 254b567412a50576d95f5b7c99ce128991e76357 Mon Sep 17 00:00:00 2001 From: ·𐑑𐑴𐑕𐑑𐑩𐑀 Date: Wed, 10 Dec 2025 13:00:26 +0000 Subject: nix onset --- nix/overlay/default.nix | 13 +++++ nix/overlay/development.nix | 15 ++++++ nix/package/dev-shell.nix | 32 +++++++++++++ nix/package/nixfmt-3-space.nix | 30 ++++++++++++ nix/package/nixtamal.nix | 95 +++++++++++++++++++++++++++++++++++++ nix/package/ocamlformat-rpc-bin.nix | 16 +++++++ 6 files changed, 201 insertions(+) create mode 100644 nix/overlay/default.nix create mode 100644 nix/overlay/development.nix create mode 100644 nix/package/dev-shell.nix create mode 100644 nix/package/nixfmt-3-space.nix create mode 100644 nix/package/nixtamal.nix create mode 100644 nix/package/ocamlformat-rpc-bin.nix (limited to 'nix') diff --git a/nix/overlay/default.nix b/nix/overlay/default.nix new file mode 100644 index 0000000..da6c5a1 --- /dev/null +++ b/nix/overlay/default.nix @@ -0,0 +1,13 @@ +#──────────────────────────────────────────────────────────────────────────────┐ +# SPDX-FileCopyrightText: 2025 toastal β”‚ +# SPDX-License-Identifier: LGPL-2.1-or-later β”‚ +#β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +final: prev: { + nixtamal = final.lib.makeScope final.newScope (self: { + nixtamal = self.callPackage ../package/nixtamal.nix { }; + + default = self.nixtamal; + + __functor = _: self.nixtamal; + }); +} diff --git a/nix/overlay/development.nix b/nix/overlay/development.nix new file mode 100644 index 0000000..b414597 --- /dev/null +++ b/nix/overlay/development.nix @@ -0,0 +1,15 @@ +#──────────────────────────────────────────────────────────────────────────────┐ +# SPDX-FileCopyrightText: 2025 toastal β”‚ +# SPDX-License-Identifier: LGPL-2.1-or-later β”‚ +#β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +final: prev: { + nixtamal = prev.nixtamal.overrideScope ( + final': prev': { + dev-shell = final'.callPackage ../package/dev-shell.nix { }; + + nixfmt-3-space = final'.callPackage ../package/nixfmt-3-space.nix { }; + + ocamlformat-rpc-bin = final'.callPackage ../package/ocamlformat-rpc-bin.nix { }; + } + ); +} diff --git a/nix/package/dev-shell.nix b/nix/package/dev-shell.nix new file mode 100644 index 0000000..4ace75c --- /dev/null +++ b/nix/package/dev-shell.nix @@ -0,0 +1,32 @@ +#──────────────────────────────────────────────────────────────────────────────┐ +# SPDX-FileCopyrightText: 2025 toastal β”‚ +# SPDX-License-Identifier: LGPL-2.1-or-later β”‚ +#β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +{ + mkShell, + kdlfmt, + topiary, + ocamlPackages, + nixtamal, + nixfmt-3-space, + ocamlformat-rpc-bin, +}: + +mkShell { + name = "nixtamal"; + inputsFrom = [ + nixtamal + ]; + packages = [ + kdlfmt + nixfmt-3-space + topiary + + ocamlPackages.alcotest + ocamlPackages.ocaml-lsp + ocamlformat-rpc-bin # πŸ’’ why does the LSP depend on ocamlformatβ€½ + ]; + env = { + TOPIARY_CONFIG_FILE = "${../../.topiary.ncl}"; + }; +} diff --git a/nix/package/nixfmt-3-space.nix b/nix/package/nixfmt-3-space.nix new file mode 100644 index 0000000..fe2b003 --- /dev/null +++ b/nix/package/nixfmt-3-space.nix @@ -0,0 +1,30 @@ +#──────────────────────────────────────────────────────────────────────────────┐ +# SPDX-FileCopyrightText: 2025 toastal β”‚ +# SPDX-License-Identifier: LGPL-2.1-or-later β”‚ +#β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +# I don’t like *this* formatter, but it is *a* formatter. Tweaking it to expand +# to 3 spaces, helps the maker actually read the code since 2 spaces is not +# enough contrast (& Nix magic strings don’t support tabs). +{ + lib, + writeTextFile, + dash, + nixfmt-rfc-style, + stdenvNoCC, +}: + +writeTextFile { + name = "nixfmt-3-space"; + executable = true; + destination = "/bin/nixfmt"; + text = /* sh */ '' + #!${lib.getExe dash} + exec ${lib.getExe nixfmt-rfc-style} --indent=3 "$@" + ''; + checkPhase = '' + runHook preCheck + ${stdenvNoCC.shellDryRun} "$target" + runHook postCheck + ''; + meta.mainProgram = "nixfmt"; +} diff --git a/nix/package/nixtamal.nix b/nix/package/nixtamal.nix new file mode 100644 index 0000000..40806e2 --- /dev/null +++ b/nix/package/nixtamal.nix @@ -0,0 +1,95 @@ +#──────────────────────────────────────────────────────────────────────────────┐ +# SPDX-FileCopyrightText: 2025 toastal β”‚ +# SPDX-License-Identifier: LGPL-2.1-or-later β”‚ +#β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +{ + lib, + coreutils, + python3Packages, + nix-prefetch-darcs, + nix-prefetch-git, + nix-prefetch-pijul, + ocamlPackages, +}: + +ocamlPackages.buildDunePackage { + pname = "nixtamal"; + version = "0.0.1-alpha.1"; + + src = + let + fs = lib.fileset; + + ocaml_project = + file: + lib.lists.elem file.name [ + "dune" + "dune-project" + "dune-workspace" + ] + || file.hasExt "opam"; + + ocaml_src = + file: + lib.lists.any file.hasExt [ + "ml" + "mld" + "mli" + "mly" + ]; + in + fs.toSource { + root = ../..; + fileset = fs.unions [ + ../../LICENSE.txt + (fs.fileFilter (file: file.hasExt "txt") ../../license) + (fs.fileFilter ocaml_project ../..) + (fs.fileFilter ocaml_src ../../bin) + (fs.fileFilter ocaml_src ../../lib) + (fs.fileFilter ocaml_src ../../test) + ]; + }; + + nativeBuildInputs = [ + python3Packages.docutils + # NOTE: no KDL support + python3Packages.pygments + ]; + + buildInputs = [ + # required since the prefetcher scripts presently don’t specify all of + # their inputs + coreutils + nix-prefetch-darcs + nix-prefetch-git + nix-prefetch-pijul + ] + ++ (with ocamlPackages; [ + cmdliner + eio + eio_main + fmt + jingoo + (jsont.override { + withBrr = false; + withBytesrw = true; + }) + kdl + logs + ppx_deriving + saturn + uri + ]); + + doCheck = false; # TODO + + checkInputs = with ocamlPackages; [ + alcotest + ]; + + meta = { + license = with lib.licenses; [ gpl3Plus ]; + platforms = lib.platforms.unix; + mainProgram = "nixtamal"; + }; +} diff --git a/nix/package/ocamlformat-rpc-bin.nix b/nix/package/ocamlformat-rpc-bin.nix new file mode 100644 index 0000000..935c314 --- /dev/null +++ b/nix/package/ocamlformat-rpc-bin.nix @@ -0,0 +1,16 @@ +#──────────────────────────────────────────────────────────────────────────────┐ +# SPDX-FileCopyrightText: 2025 toastal β”‚ +# SPDX-License-Identifier: LGPL-2.1-or-later β”‚ +#β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +# I don’t like ocamlformat as it doesn’t have tab support despite OCaml fully +# supporting tabsβ€Šβ€”β€Šso I use Topiary. However, the OCaml LSP requires +{ + lib, + runCommand, + ocamlformat, +}: + +runCommand "extract-ocamlformat-rpc-bin" { } '' + mkdir -p $out/bin + cp ${lib.getBin ocamlformat}/bin/ocamlformat-rpc $out/bin/ +'' -- cgit v1.2.3