50 Commits

Author SHA1 Message Date
d9921b3bcf Build Rust crate with Nix via crane sub-flake
Move Rust build into its own flake at rust/flake.nix using crane, and
reference it as an input from the top-level flake. The Haskell build
gets the Rust artifacts (header + static lib) via a haskell.nix
override that symlinks them into place before configure.

Use Cabal's Cgarnet_rs naming convention for extra-bundled-libraries
to satisfy the shared library install phase naming requirements.

Also extract inputs.nix, default.nix, and shell.nix for flake-compat
(nix-build / nix-shell) support.
2026-03-25 16:29:32 +09:00
George Thomas
c228354a13 Use nix-haskell and provide source-repository-packages to Cabal in shell 2026-03-24 16:01:44 +00:00
George Thomas
52f0a49d87 Fix build script to work correctly on clean checkout 2026-03-24 15:29:36 +00:00
George Thomas
df1f73eb8a Script the full build 2026-03-24 11:24:40 +00:00
George Thomas
6bb06b117f Symlink static lib instead of copying
This means we need to run the script much less often.
2026-03-24 11:24:40 +00:00
George Thomas
649c1b466f Revert "Ditch Bash script for custom setup"
This reverts commit 1f1c0d959da699ce04f7951ecbcdb7976c8c0750.

This doesn't work well with multi-component builds. For example, it requires `"haskell.sessionLoading": "singleComponent"` in VSCode, which makes HLS work less reliably.
2026-03-24 11:24:40 +00:00
George Thomas
b79a4c0804 Ditch Bash script for custom setup 2026-03-24 11:24:40 +00:00
George Thomas
b68d6257d3 Move bindings generation to Rust build script 2026-03-24 11:24:40 +00:00
George Thomas
b94e8ef11b Make staged imports consistent 2026-03-24 11:24:40 +00:00
George Thomas
4ecd0b16e2 Drop build hooks in favour of just using bundled libraries properly
The script addition is a bit hacky, but there's no obvious straightforward arch/version-independent way to get most of the build path. And eventually, once issues with HLS etc. are sorted out we will revert to using Cabal hooks anyway.
2026-03-23 23:06:29 +00:00
George Thomas
ddb9c300cf Switch to Hooks API instead of using cabal configure hack for lib/include dirs 2026-03-23 22:57:34 +00:00
George Thomas
718554cb2e Bump hs-bindgen for record-dot support 2026-03-19 11:34:50 +00:00
George Thomas
a018cc389a Generate header in Rust build output directory 2026-02-20 09:53:12 +00:00
George Thomas
96ec5c1cb1 Switch to Template Haskell mode for hs-bindgen 2026-02-20 09:08:16 +00:00
George Thomas
20b47594c6 Avoid IO for tree sum 2026-02-19 21:35:35 +00:00
George Thomas
71e4ffaede Make Rust tree type polymorphic 2026-02-19 21:28:00 +00:00
George Thomas
58005ee261 Refactor to use continuation monad 2026-02-19 21:18:37 +00:00
George Thomas
ca063b1dd6 Rename tree types 2026-02-19 21:11:58 +00:00
George Thomas
261acca8a4 Define nicer Rust tree type and coerce 2026-02-19 21:11:23 +00:00
George Thomas
55a781eeb8 Add tree example 2026-02-19 20:44:04 +00:00
George Thomas
06767e17ea Add newline for consistency 2026-02-19 19:37:46 +00:00
George Thomas
2a80e5b219 Minor simplification 2026-02-19 17:22:15 +00:00
George Thomas
e977181252 Avoid typedefs
This makes the header simpler, and silences `hs-bindgen` notices about "squashed" typedefs.
2026-02-19 17:22:15 +00:00
George Thomas
9ca4f615d8 Use simpler tagged union translation
Avoids the worst part of the header hack, and makes Haskell wrapper simpler.
2026-02-19 17:22:15 +00:00
George Thomas
5019af701f Mark pure function 2026-02-19 17:22:15 +00:00
George Thomas
5907a064a7 Use fixed-width integers
Even though `Int` and `isize` should be the same in practice, we can't cleanly convert, as the type information isn't quite there. And anyway, strictly speaking per the report, `Int` is only guaranteed to hold 30 bits.

Note that this is essentially unchanged even if we specify `usize_is_size_t = true` for `cbindgen`.
2026-02-19 17:19:28 +00:00
George Thomas
024b6aec87 Implement function with return value 2026-02-19 16:29:52 +00:00
George Thomas
40bb939302 Stick to Rust debug builds in shell to avoid C lib dir confusion 2026-02-19 16:29:52 +00:00
George Thomas
ddc8b9097d Avoid absolute path hack 2026-02-19 16:29:52 +00:00
George Thomas
25875c7dc1 Move Haskell package to top level 2026-02-19 16:29:52 +00:00
George Thomas
2bab0ff94e Rename Haskell.nix flake input 2026-02-19 16:29:52 +00:00
George Thomas
7d90990b74 Bump flake inputs 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
97a4f1c359 Disable dead code warning for whole Rust file 2026-02-19 16:29:52 +00:00
George Thomas
d8c12b5418 Call struct function with different arguments 2026-02-19 16:29:52 +00:00
George Thomas
0e54cccd74 Create manual high level wrapper 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
13b9324bc4 Simplify use sites by passing by value 2026-02-19 16:29:52 +00:00
George Thomas
5f1e49c4ce Use ByteString 2026-02-19 16:29:52 +00:00
George Thomas
7e09c1d681 Add more complex data types 2026-02-19 16:29:52 +00:00
George Thomas
0a1911862f Expose explicit C interface
We drop the tools specifically designed for Haskell and Rust together, in favour of general tools for using each with C.

Namely, we use Mozilla's `cbindgen` for generating header files from the Rust source, and Well-Typed's new `hs-bindgen` tool for generating Haskell from those header files.

The Rust code here is essentially the result of expanding the old macro, then inlining and renaming internals.

The most important thing here is that we're now relying solely on robust well-maintained tools.
2026-02-19 16:29:41 +00:00
George Thomas
60f5f23b2d Move Haskell executable in to subdirectory 2026-02-19 13:57:14 +00:00
George Thomas
400960b0be Remove empty other-modules 2026-02-19 13:57:14 +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
ff8826d758 Fix authorship info 2026-02-19 13:57:14 +00:00
George Thomas
4ed5c5e1ae Simplify .gitignore 2026-02-19 13:57:14 +00:00
George Thomas
f664efc0e2 Remove stray Git submodule config 2026-02-19 13:56:00 +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