This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 788f91c677 tools/[Rust|D]: Fix the Rust and D Builds for QEMU RISC-V
788f91c677 is described below

commit 788f91c6771e829d1b60ceffeb975d81c68e2c4f
Author: Lup Yuen Lee <[email protected]>
AuthorDate: Tue Aug 6 18:44:49 2024 +0800

    tools/[Rust|D]: Fix the Rust and D Builds for QEMU RISC-V
    
    This PR fixes the build for Rust Apps and D Apps on QEMU RISC-V. Previously 
the Rust Build selected the [incorrect Rust Target 
riscv64i-unknown-none-elf](https://lupyuen.github.io/articles/rust5#rust-target-is-incorrect).
 Now the Rust Build selects the correct Rust Target: riscv64gc-unknown-none-elf.
    
    This PR also fixes the 32-bit RISC-V Target for D Apps. D Targets 
("riscv32") are named differently from Rust Targets ("riscv32gc"), this PR 
restores the correct Target Names.
    
    Note that Rust Apps won't build correctly for QEMU RISC-V 32-bit. This 
requires a [Rust Custom Target for 
riscv32gc](https://lupyuen.github.io/articles/rust4#custom-target-for-rust), 
which will make the NuttX Makefiles much more complicated.
    
    Also note that `hello_d` won't build correctly for 64-bit `rv-virt:nsh64`. 
To date, NuttX has never supported 64-bit RISC-V for D Apps.
    
    Modified Files:
    
    `tools/Rust.defs`: Rename the RISC-V ISA `imafdc` to `gc` for Rust Targets
    
    `tools/D.defs`: Exclude the RISC-V ISA for D Targets
---
 tools/D.defs    | 30 ++++++++++--------------------
 tools/Rust.defs | 37 +++++++++++++++++++++----------------
 2 files changed, 31 insertions(+), 36 deletions(-)

diff --git a/tools/D.defs b/tools/D.defs
index 1f317daa02..f46c41def6 100644
--- a/tools/D.defs
+++ b/tools/D.defs
@@ -46,28 +46,18 @@ ifeq ($(CONFIG_ARCH_SIM),y)
     DFLAGS += -mtriple=$(LLVM_ARCHTYPE)-apple-$(LLVM_ABITYPE)
   endif
 else ifeq ($(CONFIG_ARCH_RISCV),y)
-  # Traget triple is riscv[32|64][isa]-unknown-none-elf
+  # Target triple is riscv[32|64]-unknown-none-elf
+  DFLAGS += -mtriple=$(LLVM_ARCHTYPE)-unknown-none-elf
+  DFLAGS += -mattr=+m,+a,+f,+d,+c
 
-  D_ARCHTYPE = $(LLVM_ARCHTYPE)i
-  ifeq ($(CONFIG_ARCH_RV_ISA_M),y)
-    D_ARCHTYPE := $(D_ARCHTYPE)m
+  # Handle ABI and CPU
+  ifeq ($(CONFIG_ARCH_RV32),y)
+    DFLAGS += -mcpu=generic-rv32
+    DFLAGS += -mabi=ilp32d
+  else ifeq ($(CONFIG_ARCH_RV64),y)
+    DFLAGS += -mcpu=generic-rv64
+    DFLAGS += -mabi=lp64d
   endif
-  ifeq ($(CONFIG_ARCH_RV_ISA_A),y)
-    D_ARCHTYPE := $(D_ARCHTYPE)a
-  endif
-  ifeq ($(CONFIG_ARCH_RV_ISA_F),y)
-    D_ARCHTYPE := $(D_ARCHTYPE)f
-  endif
-  ifeq ($(CONFIG_ARCH_RV_ISA_D),y)
-    D_ARCHTYPE := $(D_ARCHTYPE)d
-  endif
-  ifeq ($(CONFIG_ARCH_RV_ISA_C),y)
-    D_ARCHTYPE := $(D_ARCHTYPE)c
-  endif
-
-  DFLAGS += -mtriple=$(D_ARCHTYPE)-unknown-none-elf
-  DFLAGS += -mattr=+m,+a,+f,+d,+c -mabi=ilp32d
-  DFLAGS += -mcpu=generic-rv32
 else
   # For arm, but there are some other archs not support yet,
   # such as xtensa, x86 bare metal, etc.
diff --git a/tools/Rust.defs b/tools/Rust.defs
index 3a762e9a6b..1e055e3c5d 100644
--- a/tools/Rust.defs
+++ b/tools/Rust.defs
@@ -45,23 +45,28 @@ ifeq ($(CONFIG_ARCH_SIM),y)
     RUSTFLAGS += --target $(LLVM_ARCHTYPE)-apple-$(LLVM_ABITYPE)
   endif
 else ifeq ($(CONFIG_ARCH_RISCV),y)
-  # Traget triple is riscv[32|64][isa]-unknown-none-elf
+  # Target triple is riscv[32|64][isa]-unknown-none-elf
+  # "imafdc" becomes "gc"
 
-  RUST_ARCHTYPE = $(LLVM_ARCHTYPE)i
-  ifeq ($(CONFIG_ARCH_RV_ISA_M),y)
-    RUST_ARCHTYPE := $(RUST_ARCHTYPE)m
-  endif
-  ifeq ($(CONFIG_ARCH_RV_ISA_A),y)
-    RUST_ARCHTYPE := $(RUST_ARCHTYPE)a
-  endif
-  ifeq ($(CONFIG_ARCH_RV_ISA_F),y)
-    RUST_ARCHTYPE := $(RUST_ARCHTYPE)f
-  endif
-  ifeq ($(CONFIG_ARCH_RV_ISA_D),y)
-    RUST_ARCHTYPE := $(RUST_ARCHTYPE)d
-  endif
-  ifeq ($(CONFIG_ARCH_RV_ISA_C),y)
-    RUST_ARCHTYPE := $(RUST_ARCHTYPE)c
+  ifeq 
($(CONFIG_ARCH_RV_ISA_M)$(CONFIG_ARCH_RV_ISA_A)$(CONFIG_ARCH_FPU)$(CONFIG_ARCH_DPFPU)$(CONFIG_ARCH_RV_ISA_C),yyyyy)
+    RUST_ARCHTYPE = $(LLVM_ARCHTYPE)gc
+  else
+    RUST_ARCHTYPE = $(LLVM_ARCHTYPE)i
+    ifeq ($(CONFIG_ARCH_RV_ISA_M),y)
+      RUST_ARCHTYPE := $(RUST_ARCHTYPE)m
+    endif
+    ifeq ($(CONFIG_ARCH_RV_ISA_A),y)
+      RUST_ARCHTYPE := $(RUST_ARCHTYPE)a
+    endif
+    ifeq ($(CONFIG_ARCH_FPU),y)
+      RUST_ARCHTYPE := $(RUST_ARCHTYPE)f
+    endif
+    ifeq ($(CONFIG_ARCH_DPFPU),y)
+      RUST_ARCHTYPE := $(RUST_ARCHTYPE)d
+    endif
+    ifeq ($(CONFIG_ARCH_RV_ISA_C),y)
+      RUST_ARCHTYPE := $(RUST_ARCHTYPE)c
+    endif
   endif
 
   RUSTFLAGS += --target $(RUST_ARCHTYPE)-unknown-none-elf

Reply via email to