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