//target/ast1060-evb/mctp:mctpThis document explains the changes required to fix the Bazel build:
bazel build --config=k_ast1060_evb //target/ast1060-evb/mctp:mctp
openprot-hal-blocking to a valid remote revisionFile: third_party/crates_io/crates_no_std/Cargo.toml
Problem: The aspeed-ddk crate (fetched from the i2c-core branch of OpenPRoT/aspeed-rust) depends on openprot-hal-blocking from https://github.com/OpenPRoT/openprot. However, commit 7da9c93 on that repo removed all Cargo.toml files — including hal/blocking/Cargo.toml — so Cargo can no longer find the crate at HEAD.
This caused the error:
error: no matching package named `openprot-hal-blocking` found location searched: Git repository https://github.com/OpenPRoT/openprot
Fix: Added a [patch] section that redirects the openprot-hal-blocking dependency to the rusty1968/openprot fork at revision c6cd23a (the last commit before the Cargo.toml files were removed). Cargo requires patches to point to a different source URL, so we cannot patch OpenPRoT/openprot with itself at a different rev — hence the use of the rusty1968 fork (which shares the same commit history).
[patch."https://github.com/OpenPRoT/openprot"] openprot-hal-blocking = { git = "https://github.com/rusty1968/openprot.git", rev = "c6cd23a" }
File: third_party/crates_io/crates_no_std/Cargo.toml
Problem: The alias_hub.BUILD file defines Bazel aliases that route crate names like heapless, nb, fugit, etc. to @oot_crates_no_std//:$CRATE. Bazel's crate_universe only generates top-level targets for direct dependencies listed in Cargo.toml. These crates were only transitive dependencies of aspeed-ddk, so crate_universe did not expose them as named targets.
This caused errors like:
no such target '@@rules_rust++crate+oot_crates_no_std//:heapless'
Fix: Added the following as explicit dependencies in Cargo.toml so that crate_universe generates the corresponding Bazel targets:
| Crate | Version / Source |
|---|---|
heapless | 0.8.0 |
hex-literal | 0.4 |
nb | 1.1.0 |
fugit | 0.3.7 |
openprot-hal-blocking | rusty1968/openprot.git @ c6cd23a |
proposed-traits | rusty1968/proposed_traits.git @ 8564131 |
After adding these, Cargo.lock was regenerated with cargo generate-lockfile.
mctp_stack to mctp_lib in source codeFiles: 8 files under services/mctp/
services/mctp/server/src/lib.rsservices/mctp/server/src/server.rsservices/mctp/server/src/main.rsservices/mctp/server/tests/dispatch.rsservices/mctp/server/tests/echo.rsservices/mctp/transport-i2c/src/lib.rsservices/mctp/transport-i2c/src/sender.rsservices/mctp/transport-i2c/src/receiver.rsProblem: The source code used mctp_stack:: to refer to types from the mctp-lib crate (e.g., mctp_stack::Sender, mctp_stack::Router, mctp_stack::i2c::MctpI2cEncap). However, the crate is named mctp-lib in its Cargo.toml, which Rust normalizes to mctp_lib. Bazel's crate_universe generated the target with crate name mctp_lib, not mctp_stack, so the compiler could not resolve the imports.
This caused:
error[E0432]: unresolved import `mctp_stack` = help: use of unresolved module or unlinked crate `mctp_stack`
Fix: Replaced all occurrences of mctp_stack with mctp_lib across the 8 affected source files. The crate was likely named mctp-stack or aliased as mctp_stack in a previous build system configuration; the Bazel build uses the canonical crate name derived from the package name.
File: target/ast1060-evb/mctp/system.json5
Problem: The vector table region was sized at 1184 bytes (0x4A0), which was calculated for the interrupt vectors plus kernel annotations. With 3 apps (I2C server, MCTP server, MCTP echo client), each contributing thread and stack annotations, the .pw_kernel.annotations.stack section grew to span [0x474, 0x4C3] — 36 bytes past the 0x4A0 boundary. This caused the linker to fail:
ld.lld: error: unable to move location counter (0x4c4) backward to 0x4a0
for section '.VECTOR_TABLE.unused_space'
ld.lld: error: section '.pw_kernel.annotations.stack' will not fit in region
'VECTOR_TABLE': overflowed by 36 bytes
Fix: Increased vector_table_size_bytes from 1184 (0x4A0) to 1280 (0x500) and adjusted flash_start_address from 0x4A0 to 0x500 accordingly. The kernel flash size was recalculated as 0x20000 - 0x500 = 130816 bytes. This provides 96 bytes of headroom for the annotations section.
arch: { vector_table_size_bytes: 1280, // was 1184 }, kernel: { flash_start_address: 0x00000500, // was 0x000004A0 flash_size_bytes: 130816, // was 129888 },
The MCTP crates have unit tests that can be run individually:
bazel test //services/mctp/server:mctp_server_test bazel test //services/mctp/api:mctp_api_test
Note: Using the wildcard bazel test //services/mctp/... will fail because the wildcard also picks up kernel-target binaries (mctp_server, mctp_echo) that depend on pw_kernel/userspace. The userspace crate imports kernel_config, which is a crate generated by the target_codegen rule during a full system image build (e.g., //target/ast1060-evb/mctp:mctp). It is not available when building individual targets outside that context.
To run all MCTP unit tests without hitting this, target the test rules explicitly:
bazel test //services/mctp/server:mctp_server_test //services/mctp/api:mctp_api_test