diff --git a/CMakeLists.txt b/CMakeLists.txt index 75ece41..961b7f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,10 +42,47 @@ function(_rust_map_target) elseif(CONFIG_RISCV) if(CONFIG_RISCV_ISA_RV64I) # TODO: Should fail if the extensions don't match. - set(RUST_TARGET "riscv64imac-unknown-none-elf" PARENT_SCOPE) + # We have multiple choices, try to pick the best. + # Note that Rust currently only supports "riscv64gc" and "riscv64imac" targets! + set(RUST_TARGET "riscv64") + if(CONFIG_RISCV_ISA_EXT_G) + set(RUST_TARGET "${RUST_TARGET}g") + else() + set(RUST_TARGET "${RUST_TARGET}i") + if(CONFIG_RISCV_ISA_EXT_M) + set(RUST_TARGET "${RUST_TARGET}m") + endif() + if(CONFIG_RISCV_ISA_EXT_A) + set(RUST_TARGET "${RUST_TARGET}a") + endif() + if(CONFIG_RISCV_ISA_EXT_F) + set(RUST_TARGET "${RUST_TARGET}f") + endif() + if(CONFIG_RISCV_ISA_EXT_D) + set(RUST_TARGET "${RUST_TARGET}d") + endif() + endif() + if(CONFIG_RISCV_ISA_EXT_C) + set(RUST_TARGET "${RUST_TARGET}c") + endif() + set(RUST_TARGET "${RUST_TARGET}-unknown-none-elf" PARENT_SCOPE) elseif(CONFIG_RISCV_ISA_RV32I) - # TODO: We have multiple choices, try to pick the best. - set(RUST_TARGET "riscv32i-unknown-none-elf" PARENT_SCOPE) + # We have multiple choices, try to pick the best. + # Note that Rust currently only supports subsets of "riscv32imafc" targets! + set(RUST_TARGET "riscv32i") + if(CONFIG_RISCV_ISA_EXT_M) + set(RUST_TARGET "${RUST_TARGET}m") + endif() + if(CONFIG_RISCV_ISA_EXT_A) + set(RUST_TARGET "${RUST_TARGET}a") + endif() + if(CONFIG_RISCV_ISA_EXT_F) + set(RUST_TARGET "${RUST_TARGET}f") + endif() + if(CONFIG_RISCV_ISA_EXT_C) + set(RUST_TARGET "${RUST_TARGET}c") + endif() + set(RUST_TARGET "${RUST_TARGET}-unknown-none-elf" PARENT_SCOPE) else() message(FATAL_ERROR "Rust: Unsupported riscv ISA") endif()