62 lines
1.7 KiB
Markdown
62 lines
1.7 KiB
Markdown
# rpsdk-mix-c-rs-zig
|
|
|
|
Mix C, Rust and Zig in a Raspberry Pico SDK (CMake) project.
|
|
|
|
Yeah.
|
|
|
|
## Usage
|
|
|
|
Don't.
|
|
|
|
Other than that,
|
|
|
|
### Add Rust code to your project
|
|
|
|
```cmake
|
|
set(RUST_TARGET thumbv6m-none-eabi)
|
|
set(RUST_CPU cortex-m0plus)
|
|
list(APPEND BINDGEN_CFLAGS "--use-core" "--rust-edition=2021")
|
|
list(APPEND RUST_CFLAGS "--edition=2021")
|
|
include(cmake/rust-obj.cmake)
|
|
add_rust_object(${PROJECT}
|
|
# rust top level module
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/rustcode.rs
|
|
# optional: path to header file to use for c2rs bindgen stuff (currently limited to one, sorry)
|
|
${CMAKE_CURRENT_SOURCE_DIR}/inc/clib.h
|
|
)
|
|
```
|
|
|
|
Bindgen and CBindgen are used automatically to generate C headers from the Rust
|
|
code, and vice versa.
|
|
|
|
### Add Zig code to your project
|
|
|
|
```cmake
|
|
set(ZIG_TARGET thumb-freestanding-gnueabi)
|
|
set(ZIG_CPU cortex_m0plus)
|
|
list(APPEND ZIG_CFLAGS "-ffunction-sections" "-fdata-sections")
|
|
include(cmake/zig-obj.cmake)
|
|
add_zig_object(${PROJECT}
|
|
# zig top level module
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/zigcode.zig
|
|
)
|
|
```
|
|
|
|
## Known issues and limitations
|
|
|
|
* Sometimes, compilation fails with `rustc` failing to copy an object file to
|
|
the destination path. Reason for this is unknown, just retrying the build
|
|
seems to work.
|
|
* References between Zig and Rust code aren't really possible automatically
|
|
(can't generate Rust via Bindgen from Zig-generated headers, or include
|
|
Bindgen-generated C headers in Zig code). This is because Zig can't generate
|
|
these headers without also compiling the code.
|
|
* Only one C header can be Bindgen'ed per Rust "root" module/crate (one crate
|
|
gets compiled into an object file and included in the main link).
|
|
|
|
## License
|
|
|
|
```
|
|
be gay, do crimes, death to america
|
|
```
|