10 Commits

Author SHA1 Message Date
George Thomas
927bf229a4 move bindings generation to Rust build script
bit cleaner, esp. as less hardcoding of "debug" path

instant updates all the way through to Haskell when we change Rust code
(this wasn't actually working at all before even when we did manually run the script, because TH file-dependency tracking seemed to get confused with the way that the Bash code moved a file to the header path rather than editing it)

should update to point to my comment on hs-bindgen

actually, isn't there a race condition here? the header files are generated before the new Rust code is actually compiled, and Cabal could in theory end up still linking against the old output

hardcoding "target" isn't great, though we do already do so in the Cabal file
there seems to be no env var for it though
docs suggest we're supposed to use OUT_DIR, but that has an unpredictable path... we could output the dir somewhere I suppose, and configure Cabal to use that, but that adds a fair bit of complexity

look in to https://doc.rust-lang.org/cargo/reference/build-scripts.html#change-detection?
bit blunt compared to e.g. Cabal Hooks, and anyway I think in the long run I'll be ditching `build.rs`, as discussed above
2026-03-19 11:35:00 +00:00
George Thomas
718554cb2e Bump hs-bindgen for record-dot support 2026-03-19 11:34:50 +00:00
George Thomas
96ec5c1cb1 Switch to Template Haskell mode for hs-bindgen 2026-02-20 09:08:16 +00:00
George Thomas
2bab0ff94e Rename Haskell.nix flake input 2026-02-19 16:29:52 +00:00
George Thomas
56370bb8a4 Reformat 2026-02-19 16:29:52 +00:00
George Thomas
b9e2e59174 Refactor Nix flake inputs 2026-02-19 16:29:52 +00:00
George Thomas
f1ec06fcca Add Bash script dependencies to Nix shell 2026-02-19 16:29:52 +00:00
George Thomas
7bb41f6825 Call Rust from Haskell with cargo-cabal and hs-bindgen
See https://sraka.xyz/posts/hs-bindgen-introduction.html.

For now, this is a shell-based workflow, rather than using Nix to build everything, i.e. `nix develop` works but `nix build` doesn't. And `cargo build` has to be called manually to create the C library, rather than `cabal` being clever enough to invoke it itself.

We ran `cargo cabal init` from the `rust` directory (`nix shell github:yvan-sraka/cargo-cabal`), which generated `hsbindgen.toml` (which we use), and `Setup.lhs` (which just added `extra-lib-dirs`, and with the wrong paths, so we dspecify those statically instead in `garnet.cabal`). We also follow its advice to use `staticlib`.

Also, after we ran the first `cargo build` (requiring a `mkdir rust/src` before it would run), we took the generated the Haskell file, and moved the main contents in to `Main.hs` manually.
2026-02-19 13:57:14 +00:00
George Thomas
2640c75baf Format Nix file 2026-02-18 14:31:54 +00:00
39283930d5 Initial 2026-02-17 14:57:34 +00:00