@@ -252,16 +252,22 @@ else()
252252 set (RUST_TARGET_ARCH_DIR .)
253253endif ()
254254
255- set (RUST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} /rust/ target )
255+ set (RUST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} /rust)
256256set (LIBBITBOX02_RUST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} /rust/bitbox02-rust-c)
257257set (LIBBITBOX02_RUST ${LIBBITBOX02_RUST} PARENT_SCOPE)
258258
259259# Generate c-headers for the rust library
260+ # Working dir must be set to the rust workspace so that cargo finds the
261+ # configuration for vendoring sources
260262add_custom_target (rust-cbindgen
261263 # cbindgen can automatically create the metadata, but it does so without the `--offline` flag.
262264 # The workaround is to manually create and pass the metadata.
263265 COMMAND
264- ${CARGO} metadata --offline > ${CMAKE_CURRENT_BINARY_DIR} /rust-metadata
266+ ${CARGO}
267+ metadata
268+ --offline
269+ --manifest-path ${LIBBITBOX02_RUST_SOURCE_DIR} /Cargo.toml
270+ > ${CMAKE_CURRENT_BINARY_DIR} /rust-metadata
265271 COMMAND
266272 ${CBINDGEN}
267273 --quiet
@@ -270,9 +276,12 @@ add_custom_target(rust-cbindgen
270276 --profile release
271277 --metadata ${CMAKE_CURRENT_BINARY_DIR} /rust-metadata
272278 ${LIBBITBOX02_RUST_SOURCE_DIR}
273- WORKING_DIRECTORY ${LIBBITBOX02_RUST_SOURCE_DIR}
279+ WORKING_DIRECTORY
280+ ${CMAKE_CURRENT_SOURCE_DIR} /rust
274281 BYPRODUCTS
275282 ${CMAKE_CURRENT_BINARY_DIR} /rust/rust.h
283+ COMMENT
284+ "Generating ${CMAKE_CURRENT_BINARY_DIR} /rust/rust.h"
276285)
277286
278287# Test rust crates that contain business logic. Avoid testing crates that depend on hardware.
@@ -290,15 +299,23 @@ if(NOT CMAKE_CROSSCOMPILING)
290299 FIRMWARE_VERSION_SHORT=${FIRMWARE_VERSION}
291300 RUSTFLAGS="${RUSTFLAGS_TESTS} "
292301 # only one test thread because of unsafe concurrent access to `SafeData`, `mock_sd()` and `mock_memory()`. Using mutexes instead leads to mutex poisoning and very messy output in case of a unit test failure.
293- ${CARGO} test $<$<BOOL :${CMAKE_VERBOSE_MAKEFILE} >:-v> --all -features --target -dir ${RUST_BINARY_DIR} /all -features ${RUST_CARGO_FLAGS} -- --nocapture --test -threads 1
294- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} /rust/
302+ ${CARGO}
303+ test
304+ $<$<BOOL :${CMAKE_VERBOSE_MAKEFILE} >:-v>
305+ --all -features
306+ --manifest-path ${CMAKE_CURRENT_SOURCE_DIR} /rust/Cargo.toml
307+ --target -dir ${RUST_BINARY_DIR} /all -features
308+ --
309+ --nocapture
310+ --test -threads 1
311+ WORKING_DIRECTORY
312+ ${CMAKE_CURRENT_SOURCE_DIR} /rust
313+ DEPENDS
314+ ${CMAKE_CURRENT_BINARY_DIR} /rust/rust.h
295315 )
296316 add_dependencies (rust-test generate-protobufs bitbox_merged fatfs)
297317
298318 add_custom_target (rust-clippy
299- COMMAND
300- # Force clippy to fully re-run. It is bad at figuring out when to run again and when to use caches.
301- ${CARGO} clean --target -dir ${RUST_BINARY_DIR}
302319 COMMAND
303320 ${CMAKE_COMMAND} -E env
304321 CMAKE_SYSROOT=${CMAKE_SYSROOT}
@@ -307,7 +324,8 @@ if(NOT CMAKE_CROSSCOMPILING)
307324 ${CARGO} clippy
308325 $<$<BOOL :${CMAKE_VERBOSE_MAKEFILE} >:-v>
309326 --all -features
310- --target -dir ${RUST_BINARY_DIR} /all -features
327+ --manifest-path ${CMAKE_CURRENT_SOURCE_DIR} /rust/Cargo.toml
328+ --target -dir ${RUST_BINARY_DIR} /clippy
311329 --release
312330 --tests
313331 -- # disabled linters:
@@ -322,7 +340,8 @@ if(NOT CMAKE_CROSSCOMPILING)
322340 -A clippy::enum_variant_names
323341 -A clippy::derive_partial_eq_without_eq
324342 -A clippy::forget_non_drop
325- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} /rust/
343+ WORKING_DIRECTORY
344+ ${CMAKE_CURRENT_SOURCE_DIR} /rust
326345 )
327346 add_dependencies (rust-clippy generate-protobufs)
328347endif ()
@@ -397,13 +416,23 @@ foreach(type ${RUST_LIBS})
397416 FIRMWARE_VERSION_SHORT=${FIRMWARE_VERSION}
398417 $<$<BOOL :${SCCACHE_PROGRAM} >:RUSTC_WRAPPER=${SCCACHE_PROGRAM} >
399418 RUSTC_BOOTSTRAP=1
400- ${CARGO} build $<$<BOOL :${CMAKE_VERBOSE_MAKEFILE} >:-vv> --offline --features target -${type} $<$<OR :$<STREQUAL :${CMAKE_BUILD_TYPE} ,DEBUG>,$<STREQUAL :${type} ,factory-setup>>:,rtt> --target -dir ${RUST_BINARY_DIR} /feature-${type} ${RUST_CARGO_FLAGS} ${RUST_TARGET_ARCH_ARG}
419+ ${CARGO}
420+ build
421+ $<$<BOOL :${CMAKE_VERBOSE_MAKEFILE} >:-vv>
422+ --offline
423+ --features target -${type} $<$<OR :$<STREQUAL :${CMAKE_BUILD_TYPE} ,DEBUG>,$<STREQUAL :${type} ,factory-setup>>:,rtt>
424+ --manifest-path ${LIBBITBOX02_RUST_SOURCE_DIR} /Cargo.toml
425+ --target -dir ${RUST_BINARY_DIR} /feature-${type}
426+ ${RUST_CARGO_FLAGS}
427+ ${RUST_TARGET_ARCH_ARG}
401428 COMMAND
402429 ${CMAKE_COMMAND} -E copy_if_different ${lib} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} /lib${type} _rust_c.a
403430 # DEPFILES are only supported with the Ninja build tool
404431 #DEPFILE ${RUST_BINARY_DIR}/feature-${type}/${RUST_TARGET_ARCH_DIR}/${RUST_PROFILE}/libbitbox02_rust_c.d
405- WORKING_DIRECTORY ${LIBBITBOX02_RUST_SOURCE_DIR}
432+ WORKING_DIRECTORY
433+ ${CMAKE_CURRENT_SOURCE_DIR} /rust
406434 COMMENT "Building Rust library lib${type} _rust_c.a"
435+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR} /rust/rust.h
407436 )
408437 add_custom_target (${type} -rust-target DEPENDS ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} /lib${type} _rust_c.a)
409438 add_library (${type} _rust_c STATIC IMPORTED GLOBAL )
@@ -423,7 +452,8 @@ if(CMAKE_CROSSCOMPILING)
423452 ${CARGO} doc --document-private -items --target -dir ${CMAKE_BINARY_DIR} /docs-rust --target thumbv7em-none-eabi
424453 COMMAND
425454 ${CMAKE_COMMAND} -E echo "See docs at file://${CMAKE_BINARY_DIR} /docs-rust/thumbv7em-none-eabi/doc/bitbox02_rust/index.html"
426- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} /rust
455+ WORKING_DIRECTORY
456+ ${CMAKE_CURRENT_SOURCE_DIR} /rust
427457 )
428458
429459 set (STACK_SIZE "0x10000" CACHE STRING "Specify stack size for bootloader/firmware" )
0 commit comments