So that make commands in the riscv-gnu-toolchain build dir work right. Otherwise, a make check or make all in work/riscv-gnu-toolchain will build a newlib toolchain which is confusing.
		
			
				
	
	
		
			156 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| RISCV ?= $(CURDIR)/toolchain
 | |
| PATH := $(RISCV)/bin:$(PATH)
 | |
| ISA ?= rv64imafdc
 | |
| ABI ?= lp64d
 | |
| 
 | |
| srcdir := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
 | |
| srcdir := $(srcdir:/=)
 | |
| confdir := $(srcdir)/conf
 | |
| wrkdir := $(CURDIR)/work
 | |
| 
 | |
| toolchain_srcdir := $(srcdir)/riscv-gnu-toolchain
 | |
| toolchain_wrkdir := $(wrkdir)/riscv-gnu-toolchain
 | |
| toolchain_dest := $(CURDIR)/toolchain
 | |
| 
 | |
| buildroot_srcdir := $(srcdir)/buildroot
 | |
| buildroot_wrkdir := $(wrkdir)/buildroot
 | |
| buildroot_tar := $(buildroot_wrkdir)/images/rootfs.tar
 | |
| 
 | |
| sysroot_stamp := $(wrkdir)/.sysroot
 | |
| sysroot := $(wrkdir)/sysroot
 | |
| 
 | |
| linux_srcdir := $(srcdir)/linux
 | |
| linux_wrkdir := $(wrkdir)/linux
 | |
| linux_defconfig := $(confdir)/linux_defconfig
 | |
| 
 | |
| vmlinux := $(linux_wrkdir)/vmlinux
 | |
| vmlinux_stripped := $(linux_wrkdir)/vmlinux-stripped
 | |
| 
 | |
| pk_srcdir := $(srcdir)/riscv-pk
 | |
| pk_wrkdir := $(wrkdir)/riscv-pk
 | |
| bbl := $(pk_wrkdir)/bbl
 | |
| bin := $(wrkdir)/bbl.bin
 | |
| hex := $(wrkdir)/bbl.hex
 | |
| 
 | |
| fesvr_srcdir := $(srcdir)/riscv-fesvr
 | |
| fesvr_wrkdir := $(wrkdir)/riscv-fesvr
 | |
| libfesvr := $(fesvr_wrkdir)/prefix/lib/libfesvr.so
 | |
| 
 | |
| spike_srcdir := $(srcdir)/riscv-isa-sim
 | |
| spike_wrkdir := $(wrkdir)/riscv-isa-sim
 | |
| spike := $(spike_wrkdir)/prefix/bin/spike
 | |
| 
 | |
| target := riscv64-unknown-linux-gnu
 | |
| 
 | |
| .PHONY: all
 | |
| all: $(hex)
 | |
| 	@echo
 | |
| 	@echo This image has been generated for an ISA of $(ISA) and an ABI of $(ABI)
 | |
| 	@echo Find the SD-card image in work/bbl.bin
 | |
| 	@echo Program it with: dd if=work/bbl.bin of=/dev/sd-your-card bs=1M
 | |
| 	@echo
 | |
| 
 | |
| $(toolchain_dest)/bin/$(target)-gcc: $(toolchain_srcdir)
 | |
| 	mkdir -p $(toolchain_wrkdir)
 | |
| 	cd $(toolchain_wrkdir); $(toolchain_srcdir)/configure \
 | |
| 		--prefix=$(toolchain_dest) \
 | |
| 		--with-arch=$(ISA) \
 | |
| 		--with-abi=$(ABI) \
 | |
| 		--enable-linux
 | |
| 	$(MAKE) -C $(toolchain_wrkdir)
 | |
| 	sed 's/^#define LINUX_VERSION_CODE.*/#define LINUX_VERSION_CODE 263682/' -i $(toolchain_dest)/sysroot/usr/include/linux/version.h
 | |
| 
 | |
| $(buildroot_tar): $(buildroot_srcdir) $(RISCV)/bin/$(target)-gcc
 | |
| 	$(MAKE) -C $< RISCV=$(RISCV) PATH=$(PATH) O=$(buildroot_wrkdir) riscv64_defconfig
 | |
| 	$(MAKE) -C $< RISCV=$(RISCV) PATH=$(PATH) O=$(buildroot_wrkdir)
 | |
| 
 | |
| .PHONY: buildroot-menuconfig
 | |
| buildroot-menuconfig: $(buildroot_srcdir)
 | |
| 	$(MAKE) -C $< O=$(buildroot_wrkdir) menuconfig
 | |
| 
 | |
| $(sysroot_stamp): $(buildroot_tar)
 | |
| 	mkdir -p $(sysroot)
 | |
| 	tar -xpf $< -C $(sysroot) --exclude ./dev --exclude ./usr/share/locale
 | |
| 	touch $@
 | |
| 
 | |
| $(linux_wrkdir)/.config: $(linux_defconfig) $(linux_srcdir)
 | |
| 	mkdir -p $(dir $@)
 | |
| 	cp -p $< $@
 | |
| 	$(MAKE) -C $(linux_srcdir) O=$(linux_wrkdir) ARCH=riscv olddefconfig
 | |
| 	echo $(ISA)
 | |
| 	echo $(filter rv32%,$(ISA))
 | |
| ifeq (,$(filter rv%c,$(ISA)))
 | |
| 	sed 's/^.*CONFIG_RISCV_ISA_C.*$$/CONFIG_RISCV_ISA_C=n/' -i $@
 | |
| 	$(MAKE) -C $(linux_srcdir) O=$(linux_wrkdir) ARCH=riscv olddefconfig
 | |
| endif
 | |
| ifeq ($(ISA),$(filter rv32%,$(ISA)))
 | |
| 	sed 's/^.*CONFIG_ARCH_RV32I.*$$/CONFIG_ARCH_RV32I=y/' -i $@
 | |
| 	sed 's/^.*CONFIG_ARCH_RV64I.*$$/CONFIG_ARCH_RV64I=n/' -i $@
 | |
| 	$(MAKE) -C $(linux_srcdir) O=$(linux_wrkdir) ARCH=riscv olddefconfig
 | |
| endif
 | |
| 
 | |
| $(vmlinux): $(linux_srcdir) $(linux_wrkdir)/.config $(sysroot_stamp)
 | |
| 	$(MAKE) -C $< O=$(linux_wrkdir) \
 | |
| 		CONFIG_INITRAMFS_SOURCE="$(confdir)/initramfs.txt $(sysroot)" \
 | |
| 		CONFIG_INITRAMFS_ROOT_UID=$(shell id -u) \
 | |
| 		CONFIG_INITRAMFS_ROOT_GID=$(shell id -g) \
 | |
| 		ARCH=riscv \
 | |
| 		vmlinux
 | |
| 
 | |
| $(vmlinux_stripped): $(vmlinux)
 | |
| 	$(target)-strip -o $@ $<
 | |
| 
 | |
| .PHONY: linux-menuconfig
 | |
| linux-menuconfig: $(linux_wrkdir)/.config
 | |
| 	$(MAKE) -C $(linux_srcdir) O=$(dir $<) ARCH=riscv menuconfig savedefconfig
 | |
| 
 | |
| $(bbl): $(pk_srcdir) $(vmlinux_stripped)
 | |
| 	rm -rf $(pk_wrkdir)
 | |
| 	mkdir -p $(pk_wrkdir)
 | |
| 	cd $(pk_wrkdir) && $</configure \
 | |
| 		--host=$(target) \
 | |
| 		--with-payload=$(vmlinux_stripped) \
 | |
| 		--enable-logo \
 | |
| 		--with-logo=$(abspath conf/sifive_logo.txt)
 | |
| 	CFLAGS="-mabi=$(ABI) -march=$(ISA)" $(MAKE) -C $(pk_wrkdir)
 | |
| 
 | |
| $(bin): $(bbl)
 | |
| 	$(target)-objcopy -S -O binary --change-addresses -0x80000000 $< $@
 | |
| 
 | |
| $(hex):	$(bin)
 | |
| 	xxd -c1 -p $< > $@
 | |
| 
 | |
| $(libfesvr): $(fesvr_srcdir)
 | |
| 	rm -rf $(fesvr_wrkdir)
 | |
| 	mkdir -p $(fesvr_wrkdir)
 | |
| 	mkdir -p $(dir $@)
 | |
| 	cd $(fesvr_wrkdir) && $</configure \
 | |
| 		--prefix=$(dir $(abspath $(dir $@)))
 | |
| 	$(MAKE) -C $(fesvr_wrkdir)
 | |
| 	$(MAKE) -C $(fesvr_wrkdir) install
 | |
| 	touch -c $@
 | |
| 
 | |
| $(spike): $(spike_srcdir) $(libfesvr)
 | |
| 	rm -rf $(spike_wrkdir)
 | |
| 	mkdir -p $(spike_wrkdir)
 | |
| 	mkdir -p $(dir $@)
 | |
| 	cd $(spike_wrkdir) && $</configure \
 | |
| 		--prefix=$(dir $(abspath $(dir $@))) \
 | |
| 		--with-fesvr=$(dir $(abspath $(dir $(libfesvr))))
 | |
| 	$(MAKE) -C $(spike_wrkdir)
 | |
| 	$(MAKE) -C $(spike_wrkdir) install
 | |
| 	touch -c $@
 | |
| 
 | |
| .PHONY: sysroot vmlinux bbl
 | |
| sysroot: $(sysroot)
 | |
| vmlinux: $(vmlinux)
 | |
| bbl: $(bbl)
 | |
| 
 | |
| .PHONY: clean
 | |
| clean:
 | |
| 	rm -rf -- $(wrkdir) $(toolchain_dest)
 | |
| 
 | |
| .PHONY: sim
 | |
| sim: $(spike) $(bbl)
 | |
| 	$(spike) --isa=$(ISA) -p4 $(bbl)
 |