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.
This commit is contained in:
parent
b1821fd8ea
commit
03633046cc
14
config/riscv64gc/minimal.toml
Normal file
14
config/riscv64gc/minimal.toml
Normal 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 = {}
|
34
mk/config.mk
34
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)
|
||||
|
|
55
mk/prefix.mk
55
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)/$</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 \
|
||||
|
|
85
mk/qemu.mk
85
mk/qemu.mk
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue