A (very dirty) configuration example of Project Panama.

moved src-rust into a separate Rust source set; fixed binding generation

bpavuk.neocities.org 8e15261c cb178464

verified
+13 -5
+13 -1
interop-panama/build.gradle.kts
··· 8 8 id("java") 9 9 } 10 10 11 - val rustProjectDir = rootProject.layout.projectDirectory.dir("src-rust") 11 + val rustSources = objects.sourceDirectorySet("rust", "Rust sources").apply { 12 + srcDir("src/main/rust") 13 + include("**/*.rs", "Cargo.toml", "Cargo.lock") 14 + } 15 + 16 + val rustProjectDir = layout.projectDirectory.dir("src/main/rust") 12 17 val rustTargetDir = rustProjectDir.dir("target/debug") 13 18 val rustHeadersDir = rustProjectDir.dir("bindings") 14 19 val jextractOutputDir = layout.buildDirectory.dir("generated/jextract") ··· 25 30 description = "Build src-rust cdylib with Cargo" 26 31 workingDir = rustProjectDir.asFile 27 32 commandLine("cargo", "build") 33 + inputs.files(rustSources) 34 + outputs.dir(layout.projectDirectory.dir("src/main/rust/target")) 28 35 } 29 36 30 37 val copyRustLib by tasks.registering(Copy::class) { ··· 33 40 dependsOn(buildRustCdylib) 34 41 from(rustTargetDir.file(rustLibFileName)) 35 42 into(layout.buildDirectory.dir("native")) 43 + inputs.dir(rustTargetDir) 44 + outputs.dir(layout.buildDirectory.dir("native")) 36 45 } 37 46 38 47 val copyHeaders by tasks.registering(Copy::class) { ··· 41 50 dependsOn(buildRustCdylib) 42 51 from(rustHeadersDir.file("jvm_interop.h")) 43 52 into(layout.buildDirectory.dir("native")) 53 + inputs.dir(rustHeadersDir) 54 + outputs.dir(layout.buildDirectory.dir("native")) 44 55 } 45 56 46 57 // HACK: I'd rather interact with jextract as a build-time dependency, much like ··· 52 63 dependsOn(copyRustLib, copyHeaders) 53 64 val nativeDir = layout.buildDirectory.dir("native").get().asFile 54 65 val nativeLibPath = layout.buildDirectory.dir("native").get().file(rustLibFileName).get().asFile.absolutePath 66 + inputs.dir(nativeDir) 55 67 outputs.dir(jextractOutputDir) 56 68 commandLine( 57 69 "jextract",
src-rust/.gitignore interop-panama/src/main/rust/.gitignore
src-rust/Cargo.lock interop-panama/src/main/rust/Cargo.lock
src-rust/Cargo.toml interop-panama/src/main/rust/Cargo.toml
src-rust/build.rs interop-panama/src/main/rust/build.rs
src-rust/src/lib.rs interop-panama/src/main/rust/src/lib.rs
-1
src-rust/target/.rustc_info.json
··· 1 - {"rustc_fingerprint":7833272153447333061,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.93.0 (254b59607 2026-01-19)\nbinary: rustc\ncommit-hash: 254b59607d4417e9dffbc307138ae5c86280fe4c\ncommit-date: 2026-01-19\nhost: x86_64-unknown-linux-gnu\nrelease: 1.93.0\nLLVM version: 21.1.8\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/nix/store/2w8pppicnsddp3n61ar96cnv3r6iyrdh-rust-mixed\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"11857020428658561806":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/nix/store/2w8pppicnsddp3n61ar96cnv3r6iyrdh-rust-mixed\noff\npacked\nunpacked\n___\ndebug_assertions\nemscripten_wasm_eh\nfmt_debug=\"full\"\noverflow_checks\npanic=\"unwind\"\nproc_macro\nrelocation_model=\"pic\"\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"x87\"\ntarget_has_atomic\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_equal_alignment=\"16\"\ntarget_has_atomic_equal_alignment=\"32\"\ntarget_has_atomic_equal_alignment=\"64\"\ntarget_has_atomic_equal_alignment=\"8\"\ntarget_has_atomic_equal_alignment=\"ptr\"\ntarget_has_atomic_load_store\ntarget_has_atomic_load_store=\"16\"\ntarget_has_atomic_load_store=\"32\"\ntarget_has_atomic_load_store=\"64\"\ntarget_has_atomic_load_store=\"8\"\ntarget_has_atomic_load_store=\"ptr\"\ntarget_has_reliable_f128\ntarget_has_reliable_f16\ntarget_has_reliable_f16_math\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_thread_local\ntarget_vendor=\"unknown\"\nub_checks\nunix\n","stderr":""}},"successes":{}}
-3
src-rust/target/CACHEDIR.TAG
··· 1 - Signature: 8a477f597d28d172789f06886806bc55 2 - # This file is a cache directory tag created by cargo. 3 - # For information about cache directory tags see https://bford.info/cachedir/
src-rust/target/debug/.cargo-lock

This is a binary file and will not be displayed.