@@ -252,16 +252,22 @@ else()
252
252
set (RUST_TARGET_ARCH_DIR .)
253
253
endif ()
254
254
255
- set (RUST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} /rust/ target )
255
+ set (RUST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} /rust)
256
256
set (LIBBITBOX02_RUST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} /rust/bitbox02-rust-c)
257
257
set (LIBBITBOX02_RUST ${LIBBITBOX02_RUST} PARENT_SCOPE)
258
258
259
259
# 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
260
262
add_custom_target (rust-cbindgen
261
263
# cbindgen can automatically create the metadata, but it does so without the `--offline` flag.
262
264
# The workaround is to manually create and pass the metadata.
263
265
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
265
271
COMMAND
266
272
${CBINDGEN}
267
273
--quiet
@@ -270,9 +276,12 @@ add_custom_target(rust-cbindgen
270
276
--profile release
271
277
--metadata ${CMAKE_CURRENT_BINARY_DIR} /rust-metadata
272
278
${LIBBITBOX02_RUST_SOURCE_DIR}
273
- WORKING_DIRECTORY ${LIBBITBOX02_RUST_SOURCE_DIR}
279
+ WORKING_DIRECTORY
280
+ ${CMAKE_CURRENT_SOURCE_DIR} /rust
274
281
BYPRODUCTS
275
282
${CMAKE_CURRENT_BINARY_DIR} /rust/rust.h
283
+ COMMENT
284
+ "Generating ${CMAKE_CURRENT_BINARY_DIR} /rust/rust.h"
276
285
)
277
286
278
287
# Test rust crates that contain business logic. Avoid testing crates that depend on hardware.
@@ -290,15 +299,23 @@ if(NOT CMAKE_CROSSCOMPILING)
290
299
FIRMWARE_VERSION_SHORT=${FIRMWARE_VERSION}
291
300
RUSTFLAGS="${RUSTFLAGS_TESTS} "
292
301
# 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
295
315
)
296
316
add_dependencies (rust-test generate-protobufs bitbox_merged fatfs)
297
317
298
318
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}
302
319
COMMAND
303
320
${CMAKE_COMMAND} -E env
304
321
CMAKE_SYSROOT=${CMAKE_SYSROOT}
@@ -307,7 +324,8 @@ if(NOT CMAKE_CROSSCOMPILING)
307
324
${CARGO} clippy
308
325
$<$<BOOL :${CMAKE_VERBOSE_MAKEFILE} >:-v>
309
326
--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
311
329
--release
312
330
--tests
313
331
-- # disabled linters:
@@ -322,7 +340,8 @@ if(NOT CMAKE_CROSSCOMPILING)
322
340
-A clippy::enum_variant_names
323
341
-A clippy::derive_partial_eq_without_eq
324
342
-A clippy::forget_non_drop
325
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} /rust/
343
+ WORKING_DIRECTORY
344
+ ${CMAKE_CURRENT_SOURCE_DIR} /rust
326
345
)
327
346
add_dependencies (rust-clippy generate-protobufs)
328
347
endif ()
@@ -397,13 +416,23 @@ foreach(type ${RUST_LIBS})
397
416
FIRMWARE_VERSION_SHORT=${FIRMWARE_VERSION}
398
417
$<$<BOOL :${SCCACHE_PROGRAM} >:RUSTC_WRAPPER=${SCCACHE_PROGRAM} >
399
418
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}
401
428
COMMAND
402
429
${CMAKE_COMMAND} -E copy_if_different ${lib} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} /lib${type} _rust_c.a
403
430
# DEPFILES are only supported with the Ninja build tool
404
431
#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
406
434
COMMENT "Building Rust library lib${type} _rust_c.a"
435
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR} /rust/rust.h
407
436
)
408
437
add_custom_target (${type} -rust-target DEPENDS ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} /lib${type} _rust_c.a)
409
438
add_library (${type} _rust_c STATIC IMPORTED GLOBAL )
@@ -423,7 +452,8 @@ if(CMAKE_CROSSCOMPILING)
423
452
${CARGO} doc --document-private -items --target -dir ${CMAKE_BINARY_DIR} /docs-rust --target thumbv7em-none-eabi
424
453
COMMAND
425
454
${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
427
457
)
428
458
429
459
set (STACK_SIZE "0x10000" CACHE STRING "Specify stack size for bootloader/firmware" )
0 commit comments