@@ -10,4 +10,74 @@ if (CONFIG_ARDUINO_API)
1010 add_subdirectory(cores)
1111 add_subdirectory(libraries)
1212 zephyr_include_directories(${variant_dir})
13+
14+ # quote from https://github.com/zephyrproject-rtos/zephyr-lang-rust/blob/main/CMakeLists.txt
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+
1383endif()
0 commit comments