diff --git a/garnet.cabal b/garnet.cabal index 981915b..296eb7e 100644 --- a/garnet.cabal +++ b/garnet.cabal @@ -6,6 +6,13 @@ author: Patrick Aldis maintainer: george.thomas@obsidian.systems patrick.aldis@obsidian.systems +-- aha, nice, this does fix recompilation checking +extra-source-files: + rust/target/debug/garnet_rs.h +-- that could be problematic given file is gitignored? unfortunately this doesn't work +-- tbf, I haven't even looked up the docs, just saw the autocompletion +-- extra-tmp-files: +-- rust/target/debug/garnet_rs.h common common default-language: GHC2024 @@ -43,6 +50,9 @@ library GarnetRs.Wrapped hs-source-dirs: lib include-dirs: rust/target/debug + -- HLS gives up entirely when the header is malformed if we do this + -- and anyway, I don't think it gives us dependency tracking like `extra-source-files` does + -- includes: garnet_rs.h extra-bundled-libraries: Cgarnet_rs build-depends: hs-bindgen, diff --git a/lib/GarnetRs/Raw.hs b/lib/GarnetRs/Raw.hs index 61312fa..a1e2dc1 100644 --- a/lib/GarnetRs/Raw.hs +++ b/lib/GarnetRs/Raw.hs @@ -29,7 +29,15 @@ import HsBindgen.TH import Language.Haskell.TH import System.Process +import Control.Monad.IO.Class (MonadIO (liftIO)) +import Language.Haskell.TH.Syntax (addDependentFile) +import System.Directory.Extra (getCurrentDirectory) + do + -- not sure this does anything - hs-bindgen should already be doing the tracking, and the issues are from elsewhere + -- dir <- liftIO getCurrentDirectory + -- liftIO $ print dir + -- addDependentFile $ dir <> "/rust/target/debug/garnet_rs.h" systemDirs <- -- TODO bit of a hack map (Dir . T.unpack . T.strip) . concatMap (takeWhile (maybe False ((== ' ') . fst) . T.uncons) . dropWhile T.null . T.lines) diff --git a/project.nix b/project.nix index ffcffbe..cf124f0 100644 --- a/project.nix +++ b/project.nix @@ -19,6 +19,8 @@ }; overrides = [ ({ pkgs, ... }: { + # TODO get this upstreamed: + # https://input-output-hk.github.io/haskell.nix/tutorials/pkg-map.html#mapping-in-haskellnix packages.libclang-bindings.components.library = { build-tools = [ pkgs.llvmPackages.llvm ]; libs = [ pkgs.llvmPackages.libclang ]; diff --git a/rust/build.rs b/rust/build.rs index d93e5bb..d875866 100644 --- a/rust/build.rs +++ b/rust/build.rs @@ -2,6 +2,22 @@ use std::env; use std::path::PathBuf; fn main() { + // this doesn't make _much_ difference really, since this is our only Rust source file + // but it seems it's probably better than not having it + // what we really want is to tell Rust to only regenerate the header file if the Rust code actually compiles + // but we don't have that flexibility + // and it's an issue because cbindgen tries to be fault-tolerant in some ways that don't even seem to make sense + // + // e.g. mis-spell "Option" as "Option" and you get + // void print_optional(Optio x); + // instead of + // void print_optional(const int8_t *x); + // and that's only an issue because in HLS TH dependent-file watching gives up after an error + // i.e. once the containing splice has thrown an exception once, the containing file needs a manual edit to kick it + // P.S. strings to stdout?! what a terrible API + // don't get me started in the discoverability of actually then using the terminal for debugging: + // println!("cargo::warning={:?}", env::var("OUT_DIR")); + println!("cargo::rerun-if-changed=lib.rs"); let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let profile = env::var("PROFILE").unwrap(); cbindgen::Builder::new()