Skip to content

Commit aac763e

Browse files
committed
rust: make workdirs more coherent amongst various cargo invocations
* Always execute cargo from the same place so that relative paths to CWD always are the same. * Always use the "same depth" target dir, so that relative paths to the c-sources and files built by cmake stays the same. * Give clippy its own target dir so that we don't have to wipe it before every run
1 parent a92c32a commit aac763e

File tree

1 file changed

+43
-13
lines changed

1 file changed

+43
-13
lines changed

src/CMakeLists.txt

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -252,16 +252,22 @@ else()
252252
set(RUST_TARGET_ARCH_DIR .)
253253
endif()
254254

255-
set(RUST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/rust/target)
255+
set(RUST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/rust)
256256
set(LIBBITBOX02_RUST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/rust/bitbox02-rust-c)
257257
set(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
260262
add_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)
328347
endif()
@@ -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

Comments
 (0)