Merge branch 'riscv' into 'master'

Riscv64gc support in the build scripts

See merge request redox-os/redox!1512
This commit is contained in:
Jeremy Soller 2024-10-06 15:23:47 +00:00
commit 46bdb863f0
4 changed files with 139 additions and 49 deletions

View file

@ -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 = {}

View file

@ -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)

View file

@ -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)/$</configure" \
--target="$(TARGET)" \
--program-prefix="$(TARGET)-" \
--target="$(GNU_TARGET)" \
$(GCC_ARCH) \
--program-prefix="$(GNU_TARGET)-" \
--prefix="" \
--disable-werror \
&& \
@ -142,8 +149,9 @@ else
cd "$<-freestanding-build" && \
export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \
"$(ROOT)/$</configure" \
--target="$(TARGET)" \
--program-prefix="$(TARGET)-" \
--target="$(GNU_TARGET)" \
$(GCC_ARCH) \
--program-prefix="$(GNU_TARGET)-" \
--prefix="" \
--disable-nls \
--enable-languages=c,c++ \
@ -157,7 +165,7 @@ else
mv "$@.partial" "$@"
endif
$(PREFIX)/rust-freestanding-install: $(ROOT)/rust | $(PREFIX)/binutils-install $(CONTAINER_TAG)
$(PREFIX)/rust-freestanding-install: $(ROOT)/rust/configure | $(PREFIX)/binutils-install $(CONTAINER_TAG)
ifeq ($(PODMAN_BUILD),1)
$(PODMAN_RUN) $(MAKE) $@
else
@ -166,7 +174,7 @@ else
cp -r "$(PREFIX)/binutils-install" "$@.partial"
cd "$(PREFIX)/rust-freestanding-build" && \
export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \
"$</configure" \
"$<" \
--prefix="/" \
--disable-docs \
--disable-download-ci-llvm \
@ -174,7 +182,7 @@ else
--enable-extended \
--enable-lld \
--enable-llvm-static-stdcpp \
--set 'llvm.targets=AArch64;X86' \
--set 'llvm.targets=AArch64;X86;RISCV' \
--set 'llvm.experimental-targets=' \
--tools=cargo,src \
&& \
@ -205,10 +213,10 @@ else
cd "$<" && \
export PATH="$(PREFIX_BASE_PATH):$(PREFIX_FREESTANDING_PATH):$$PATH" && \
export CARGO="env -u CARGO -u RUSTUP_TOOLCHAIN cargo" && \
export CC_$(subst -,_,$(TARGET))="$(TARGET)-gcc -isystem $(ROOT)/$@.partial/$(TARGET)/include" && \
export CC_$(subst -,_,$(TARGET))="$(GNU_TARGET)-gcc -isystem $(ROOT)/$@.partial/$(GNU_TARGET)/include" && \
$(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" "$@"
@ -224,11 +232,12 @@ else
cd "$<-build" && \
export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \
"$(ROOT)/$</configure" \
--target="$(TARGET)" \
--program-prefix="$(TARGET)-" \
--target="$(GNU_TARGET)" \
$(GCC_ARCH) \
--program-prefix="$(GNU_TARGET)-" \
--prefix="" \
--with-sysroot \
--with-build-sysroot="$(ROOT)/$(PREFIX)/relibc-freestanding-install/$(TARGET)" \
--with-build-sysroot="$(ROOT)/$(PREFIX)/relibc-freestanding-install/$(GNU_TARGET)" \
--with-native-system-header-dir="/include" \
--disable-multilib \
--disable-nls \
@ -238,8 +247,8 @@ else
--enable-threads=posix \
&& \
$(MAKE) -j `$(NPROC)` all-gcc all-target-libgcc all-target-libstdc++-v3 && \
$(MAKE) -j `$(NPROC)` install-gcc install-target-libgcc install-target-libstdc++-v3 DESTDIR="$(ROOT)/$@.partial" && \
rm $(ROOT)/$@.partial/$(TARGET)/lib/*.la
$(MAKE) -j `$(NPROC)` install-gcc install-target-libgcc install-target-libstdc++-v3 DESTDIR="$(ROOT)/$@.partial"
rm $(ROOT)/$@.partial/$(GNU_TARGET)/lib/*.la
rm -rf "$<-build"
cd "$@.partial" && $(PREFIX_STRIP)
touch "$@.partial"
@ -254,17 +263,17 @@ $(PREFIX)/gcc-install.tar.gz: $(PREFIX)/gcc-install
--directory="$<" \
.
$(PREFIX)/rust-install: $(ROOT)/rust | $(PREFIX)/gcc-install $(PREFIX)/relibc-freestanding-install $(CONTAINER_TAG)
$(PREFIX)/rust-install: $(ROOT)/rust/configure | $(PREFIX)/gcc-install $(PREFIX)/relibc-freestanding-install $(CONTAINER_TAG)
ifeq ($(PODMAN_BUILD),1)
$(PODMAN_RUN) $(MAKE) $@
else
rm -rf "$(PREFIX)/rust-build" "$@.partial" "$@"
mkdir -p "$(PREFIX)/rust-build"
cp -r "$(PREFIX)/gcc-install" "$@.partial"
cp -r "$(PREFIX)/relibc-freestanding-install/$(TARGET)" "$@.partial"
cp -r "$(PREFIX)/relibc-freestanding-install/$(GNU_TARGET)" "$@.partial"
cd "$(PREFIX)/rust-build" && \
export PATH="$(ROOT)/$@.partial/bin:$$PATH" && \
"$</configure" \
"$<" \
--prefix="/" \
--disable-docs \
--disable-download-ci-llvm \

View file

@ -52,6 +52,30 @@ else ifeq ($(ARCH),aarch64)
ifneq ($(usb),no)
QEMUFLAGS+=-device qemu-xhci -device usb-kbd -device usb-tablet
endif
else ifeq ($(ARCH),riscv64gc)
live=no
efi=yes
audio=no
vga=no # virtio-gpu-pci
net=bridge
QEMU_ARCH=riscv64
# QEMU_MACHINE=virt for ACPI mode instead of DTB
QEMU_MACHINE=virt,acpi=off
# QEMU_MACHINE:=${QEMU_MACHINE},aclint=on
# QEMU_MACHINE:=${QEMU_MACHINE},aia=aplic
# QEMU_MACHINE:=${QEMU_MACHINE},aia=aplic-imsic
QEMU_SMP?=4
QEMU_MEM?=2048
QEMU_CPU=max
disk?=nvme
PFLASH0=/usr/share/qemu-efi-riscv64/RISCV_VIRT_CODE.fd
PFLASH1=/usr/share/qemu-efi-riscv64/RISCV_VIRT_VARS.fd
ifneq ($(vga),no)
QEMUFLAGS+=-device ramfb
endif
ifneq ($(usb),no)
QEMUFLAGS+=-device qemu-xhci -device usb-kbd -device usb-tablet
endif
else
$(error Unsupported ARCH for QEMU "$(ARCH)"))
endif
@ -128,19 +152,22 @@ else ifeq ($(gpu),multi)
QEMUFLAGS+=-display sdl -vga std -device secondary-vga
else ifeq ($(gpu),virtio)
QEMUFLAGS+=-vga virtio
else ifeq ($(vga),virtio-gpu-pci)
QEMUFLAGS+= -vga virtio-gpu-pci
endif
EXTRA_DISK=$(BUILD)/extra.img
disk?=ata
ifeq ($(disk),ata)
# For i386, ata will use ided
# For aarch64 and x86_64, ata will use ahcid
QEMUFLAGS+= \
-drive file=$(DISK),format=raw \
-drive file=$(BUILD)/extra.img,format=raw
-drive file=$(EXTRA_DISK),format=raw
else ifeq ($(disk),nvme)
QEMUFLAGS+= \
-drive file=$(DISK),format=raw,if=none,id=drv0 -device nvme,drive=drv0,serial=NVME_SERIAL \
-drive file=$(BUILD)/extra.img,format=raw,if=none,id=drv1 -device nvme,drive=drv1,serial=NVME_EXTRA
-drive file=$(EXTRA_DISK),format=raw,if=none,id=drv1 -device nvme,drive=drv1,serial=NVME_EXTRA
else ifeq ($(disk),usb)
QEMUFLAGS+= \
-drive if=none,id=usbstick,format=raw,file=$(DISK) \
@ -148,11 +175,12 @@ else ifeq ($(disk),usb)
else ifeq ($(disk),virtio)
QEMUFLAGS+= \
-drive file=$(DISK),format=raw,if=virtio \
-drive file=$(BUILD)/extra.img,format=raw,if=virtio
-drive file=$(EXTRA_DISK),format=raw,if=virtio
else ifeq ($(disk),cdrom)
QEMUFLAGS+= \
-boot d -cdrom $(DISK) \
-drive file=$(BUILD)/extra.img,format=raw
-drive file=$(EXTRA_DISK),format=raw
else ifeq ($(disk),sdcard)
QEMUFLAGS+=-drive file=$(DISK),if=sd,format=raw
endif
@ -173,7 +201,37 @@ ifeq ($(UNAME),Darwin)
QEMUFLAGS+=-cpu $(QEMU_CPU)
endif
$(BUILD)/extra.img:
ifneq ($(PFLASH0),)
QEMUFLAGS+=-drive if=pflash,format=raw,unit=0,file=$(PFLASH0),readonly=on
endif
ifneq ($(PFLASH1),)
QEMUFLAGS+=-drive if=pflash,format=raw,unit=1,file=$(BUILD)/fw_vars.bin
endif
.PHONY: qemu-deps
qemu-deps: $(DISK)
ifeq ($(disk),usb)
else ifeq ($(disk),sdcard)
else
qemu-deps: $(EXTRA_DISK)
endif
qemu-deps:$(FIRMWARE)
qemu-deps: $(PFLASH0)
ifneq ($(PFLASH1),)
qemu-deps: $(BUILD)/fw_vars.bin
.PRECIOUS: $(BUILD)/fw_vars.bin
$(BUILD)/fw_vars.bin: $(PFLASH1)
cp "$<" "$@"
endif
$(EXTRA_DISK):
truncate -s 1g $@
$(BUILD)/raspi3bp_uboot.rom:
@ -187,20 +245,25 @@ $(BUILD)/qemu_uboot.rom:
Please install the qemu-efi-aarch64 package or use efi=no to download U-Boot instead.\n" \
&& exit 1
qemu: $(DISK) $(FIRMWARE) $(BUILD)/extra.img
/usr/share/qemu-efi-riscv64/RISCV_VIRT_CODE.fd /usr/share/qemu-efi-riscv64/RISCV_VIRT_VARS.fd:
echo "\n\n\nMissing $@ UEFI firmware file.\n\
Please install the qemu-efi-riscv64 package.\n"
&& exit 1
qemu: qemu-deps
$(QEMU) $(QEMUFLAGS)
# You probably want to use disk=no when using the *_extra targets
qemu_extra: $(FIRMWARE) $(BUILD)/extra.img
qemu_extra: qemu-deps
$(QEMU) $(QEMUFLAGS) \
-drive file=$(BUILD)/extra.img,format=raw
-drive file=$(EXTRA_DISK),format=raw
qemu_nvme_extra: $(FIRMWARE) $(BUILD)/extra.img
qemu_nvme_extra: qemu-deps
$(QEMU) $(QEMUFLAGS) \
-drive file=$(BUILD)/extra.img,format=raw,if=none,id=drv1 -device nvme,drive=drv1,serial=NVME_EXTRA
-drive file=$(EXTRA_DISK),format=raw,if=none,id=drv1 -device nvme,drive=drv1,serial=NVME_EXTRA
#additional steps for $(DISK) are required!!!
qemu_raspi: $(FIRMWARE) $(DISK)
qemu_raspi: qemu-deps
$(QEMU) -M raspi3b -smp 4,cores=1 \
-kernel $(FIRMWARE) \
-serial stdio -display none