From 03633046cc50d6f229721f410166360a5ef42dd2 Mon Sep 17 00:00:00 2001 From: Andrey Turkin Date: Mon, 17 Jun 2024 09:53:19 +0300 Subject: [PATCH] Riscv64gc support in the build scripts This architecture is different from x86/aarch because its rust triplet (riscv64gc-...) differs from gcc/llvm/binutils triplet (more general riscv64-...). Therefore the build scripts have to bridge that mismatch. This introduces new build-time environment variable GNU_TARGET which corresponds to a target used by C world utilities whereas existing TARGET now describes rust target. --- config/riscv64gc/minimal.toml | 14 ++++++ mk/config.mk | 34 +++++++------- mk/prefix.mk | 55 +++++++++++++---------- mk/qemu.mk | 85 ++++++++++++++++++++++++++++++----- 4 files changed, 139 insertions(+), 49 deletions(-) create mode 100644 config/riscv64gc/minimal.toml diff --git a/config/riscv64gc/minimal.toml b/config/riscv64gc/minimal.toml new file mode 100644 index 0000000..1c180e7 --- /dev/null +++ b/config/riscv64gc/minimal.toml @@ -0,0 +1,14 @@ +# Minimal configuration + +include = ["../minimal.toml"] + +# Override the default settings here + +# General settings +[general] +# Filesystem size in MiB +filesystem_size = 128 + +# Package settings +[packages] +# example = {} diff --git a/mk/config.mk b/mk/config.mk index 56113db..2cc78b6 100644 --- a/mk/config.mk +++ b/mk/config.mk @@ -78,6 +78,11 @@ export RUST_COMPILER_RT_ROOT=$(ROOT)/rust/src/llvm-project/compiler-rt ## Userspace variables export TARGET=$(ARCH)-unknown-redox +ifeq ($(ARCH),riscv64gc) + export GNU_TARGET=riscv64-unknown-redox +else + export GNU_TARGET=$(TARGET) +endif BUILD=build/$(ARCH)/$(CONFIG_NAME) INSTALLER=installer/target/release/redox_installer INSTALLER_OPTS= @@ -95,23 +100,22 @@ FSTOOLS_TAG=build/fstools.tag export BOARD ## Cross compiler variables -AR=$(TARGET)-gcc-ar -AS=$(TARGET)-as -CC=$(TARGET)-gcc -CXX=$(TARGET)-g++ -LD=$(TARGET)-ld -NM=$(TARGET)-gcc-nm -OBJCOPY=$(TARGET)-objcopy -OBJDUMP=$(TARGET)-objdump -RANLIB=$(TARGET)-gcc-ranlib -READELF=$(TARGET)-readelf -STRIP=$(TARGET)-strip +AR=$(GNU_TARGET)-gcc-ar +AS=$(GNU_TARGET)-as +CC=$(GNU_TARGET)-gcc +CXX=$(GNU_TARGET)-g++ +LD=$(GNU_TARGET)-ld +NM=$(GNU_TARGET)-gcc-nm +OBJCOPY=$(GNU_TARGET)-objcopy +OBJDUMP=$(GNU_TARGET)-objdump +RANLIB=$(GNU_TARGET)-gcc-ranlib +READELF=$(GNU_TARGET)-readelf +STRIP=$(GNU_TARGET)-strip ## Rust cross compile variables -export AR_$(subst -,_,$(TARGET))=$(TARGET)-ar -export CC_$(subst -,_,$(TARGET))=$(TARGET)-gcc -export CXX_$(subst -,_,$(TARGET))=$(TARGET)-g++ - +export AR_$(subst -,_,$(TARGET)):=$(AR) +export CC_$(subst -,_,$(TARGET)):=$(CC) +export CXX_$(subst -,_,$(TARGET)):=$(CXX) ## If Podman is being used, a container is required ifeq ($(PODMAN_BUILD),1) diff --git a/mk/prefix.mk b/mk/prefix.mk index 9835128..87ab8be 100644 --- a/mk/prefix.mk +++ b/mk/prefix.mk @@ -5,7 +5,7 @@ PREFIX=prefix/$(TARGET) PREFIX_INSTALL=$(PREFIX)/relibc-install PREFIX_PATH=$(ROOT)/$(PREFIX_INSTALL)/bin -BINUTILS_BRANCH=redox-2.41 +BINUTILS_BRANCH=redox-2.43.1 GCC_BRANCH=redox-13.2.0 export PREFIX_RUSTFLAGS=-L $(ROOT)/$(PREFIX_INSTALL)/$(TARGET)/lib @@ -15,11 +15,17 @@ export REDOXER_TOOLCHAIN=$(RUSTUP_TOOLCHAIN) export CC= export CXX= +ifeq ($(TARGET),riscv64gc-unknown-redox) + GCC_ARCH?=--with-arch=rv64gc --with-abi=lp64d +else + GCC_ARCH?= +endif + prefix: $(PREFIX_INSTALL) PREFIX_STRIP=\ - mkdir -p bin libexec "$(TARGET)/bin" && \ - find bin libexec "$(TARGET)/bin" "$(TARGET)/lib" \ + mkdir -p bin libexec "$(GCC_TARGET)/bin" && \ + find bin libexec "$(GCC_TARGET)/bin" "$(GCC_TARGET)/lib" \ -type f \ -exec strip --strip-unneeded {} ';' \ 2> /dev/null @@ -38,14 +44,14 @@ else rm -rf "$@.partial" "$@" cp -r "$(PREFIX)/rust-install" "$@.partial" rm -rf "$@.partial/$(TARGET)/include/"* - cp -r "$(PREFIX)/rust-install/$(TARGET)/include/c++" "$@.partial/$(TARGET)/include/c++" + cp -r "$(PREFIX)/rust-install/$(GNU_TARGET)/include/c++" "$@.partial/$(GNU_TARGET)/include/c++" cp -r "$(PREFIX)/rust-install/lib/rustlib/$(HOST_TARGET)/lib/" "$@.partial/lib/rustlib/$(HOST_TARGET)/" cd "$<" && \ export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \ export CARGO="env -u CARGO cargo" && \ $(MAKE) clean && \ $(MAKE) -j `$(NPROC)` all && \ - $(MAKE) -j `$(NPROC)` install DESTDIR="$(ROOT)/$@.partial/$(TARGET)" + $(MAKE) -j `$(NPROC)` install DESTDIR="$(ROOT)/$@.partial/$(GNU_TARGET)" cd "$@.partial" && $(PREFIX_STRIP) touch "$@.partial" mv "$@.partial" "$@" @@ -76,7 +82,7 @@ $(PREFIX)/rust-install: $(PREFIX)/rust-install.tar.gz else -$(ROOT)/rust: +$(ROOT)/rust/configure: git submodule update --init --recursive --checkout rust PREFIX_BASE_INSTALL=$(PREFIX)/rust-freestanding-install @@ -106,8 +112,9 @@ else mkdir -p "$<-build" "$@.partial" cd "$<-build" && \ "$(ROOT)/$