@@ -12,6 +12,74 @@ if (CONFIG_ARDUINO_API)
1212 zephyr_include_directories(${variant_dir} )
1313 zephyr_include_directories(${CMAKE_CURRENT_SOURCE_DIR} /zephyr/blobs/ArduinoCore-API)
1414
15+ function (rust_target_arch RUST_TARGET)
16+ # Map Zephyr targets to LLVM targets.
17+ if (CONFIG_CPU_CORTEX_M)
18+ if (CONFIG_CPU_CORTEX_M0 OR CONFIG_CPU_CORTEX_M0PLUS OR CONFIG_CPU_CORTEX_M1)
19+ set (${RUST_TARGET} "thumbv6m-none-eabi" PARENT_SCOPE)
20+ elseif (CONFIG_CPU_CORTEX_M3)
21+ set (${RUST_TARGET} "thumbv7m-none-eabi" PARENT_SCOPE)
22+ elseif (CONFIG_CPU_CORTEX_M4 OR CONFIG_CPU_CORTEX_M7)
23+ if (CONFIG_FP_HARDABI OR FORCE_FP_HARDABI)
24+ set (${RUST_TARGET} "thumbv7em-none-eabihf" PARENT_SCOPE)
25+ else ()
26+ set (${RUST_TARGET} "thumbv7em-none-eabi" PARENT_SCOPE)
27+ endif ()
28+ elseif (CONFIG_CPU_CORTEX_M23)
29+ set (${RUST_TARGET} "thumbv8m.base-none-eabi" PARENT_SCOPE)
30+ elseif (CONFIG_CPU_CORTEX_M33 OR CONFIG_CPU_CORTEX_M55)
31+ # Not a typo, Zephyr, uses ARMV7_M_ARMV8_M_FP to select the FP even on v8m.
32+ if (CONFIG_FP_HARDABI OR FORCE_FP_HARDABI)
33+ set (${RUST_TARGET} "thumbv8m.main-none-eabihf" PARENT_SCOPE)
34+ else ()
35+ set (${RUST_TARGET} "thumbv8m.main-none-eabi" PARENT_SCOPE)
36+ endif ()
37+
38+ # Todo: The M55 is thumbv8.1m.main-none-eabi, which can be added when Rust
39+ # gain support for this target.
40+ else ()
41+ message (FATAL_ERROR "Unknown Cortex-M target." )
42+ endif ()
43+ elseif (CONFIG_RISCV)
44+ if (CONFIG_RISCV_ISA_RV64I)
45+ # TODO: Should fail if the extensions don't match.
46+ set (${RUST_TARGET} "riscv64imac-unknown-none-elf" PARENT_SCOPE)
47+ elseif (CONFIG_RISCV_ISA_RV32I)
48+ # TODO: We have multiple choices, try to pick the best.
49+ set (${RUST_TARGET} "riscv32i-unknown-none-elf" PARENT_SCOPE)
50+ else ()
51+ message (FATAL_ERROR "Rust: Unsupported riscv ISA" )
52+ endif ()
53+ elseif (CONFIG_ARCH_POSIX AND CONFIG_64BIT AND (${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "x86_64" ))
54+ set (${RUST_TARGET} "x86_64-unknown-none" PARENT_SCOPE)
55+ elseif (CONFIG_ARCH_POSIX AND CONFIG_64BIT AND (${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "aarch64" ))
56+ set (${RUST_TARGET} "aarch64-unknown-none" PARENT_SCOPE)
57+ else ()
58+ message (FATAL_ERROR "Rust: Add support for other target" )
59+ endif ()
60+ endfunction ()
61+
62+ rust_target_arch(RUST_TARGET_TRIPLE)
63+
64+ set (RUST_CRATE_DIR ${CMAKE_CURRENT_SOURCE_DIR} /rust)
65+ set (RUST_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR} /rust)
66+ set (RUST_LIB ${RUST_OUT_DIR} /target /${RUST_TARGET_TRIPLE} /release/libarduinocore_api_rust.a)
67+
68+ add_custom_command (
69+ OUTPUT ${RUST_LIB}
70+ COMMAND ${CMAKE_COMMAND} -E env CARGO_TARGET_DIR=${RUST_OUT_DIR} /target
71+ cargo build --manifest-path ${RUST_CRATE_DIR} /Cargo.toml
72+ --target ${RUST_TARGET_TRIPLE} --release
73+ WORKING_DIRECTORY ${RUST_CRATE_DIR}
74+ COMMENT "Building Rust staticlib for ${RUST_TARGET} "
75+ VERBATIM
76+ )
77+
78+ add_custom_target (arduinocore_api_rust_build ALL DEPENDS ${RUST_LIB} )
79+ add_library (arduinocore_api_rust STATIC IMPORTED GLOBAL )
80+ set_target_properties (arduinocore_api_rust PROPERTIES IMPORTED_LOCATION ${RUST_LIB} )
81+ zephyr_link_libraries(arduinocore_api_rust)
82+
1583 if (CONFIG_CPU_CORTEX_M0PLUS)
1684 set (prebuilt_path ${CMAKE_CURRENT_SOURCE_DIR} /zephyr/blobs/ArduinoCore-API/lib/libarduinocore_api_cortex-m0plus.a)
1785 elseif (CONFIG_CPU_CORTEX_M33)
0 commit comments