diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index be9bacd..7334f56 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -10,6 +10,7 @@ jobs: build: strategy: matrix: + mode: [ debug, release ] include: - arch: riscv64 qemu-pkg: qemu-system-misc @@ -36,10 +37,10 @@ jobs: components: clippy, rust-src - name: Run Clippy - run: make clippy ARCH=${{ matrix.arch }} + run: make clippy ARCH=${{ matrix.arch }} MODE=${{ matrix.mode }} - name: Test - run: make test ARCH=${{ matrix.arch }} + run: make test ARCH=${{ matrix.arch }} MODE=${{ matrix.mode }} - name: Build - run: make kernel ARCH=${{ matrix.arch }} + run: make kernel ARCH=${{ matrix.arch }} MODE=${{ matrix.mode }} diff --git a/Makefile b/Makefile index 5348d1b..db434d8 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ ARCH ?= riscv64 +MODE ?= debug ifeq ($(ARCH), riscv64) BUILD_TARGET := riscv64imac-unknown-none-elf @@ -7,6 +8,12 @@ else $(error Invalid TARGET: $(ARCH)) endif +ifeq ($(MODE), release) + CARGO_BUILD_ARGS += --release +else ifneq ($(MODE), debug) + $(error Invalid MODE: $(MODE)) +endif + RUSTFLAGS += -Crelocation-model=static RUSTFLAGS += -Ccode-model=medium #RUSTFLAGS += -Ctarget-feature=+relax @@ -19,6 +26,13 @@ CARGO_BUILD_ARGS += -Zbuild-std=core,compiler_builtins,alloc CARGO_BUILD_ARGS += -Zbuild-std-features=compiler-builtins-mem CARGO_BUILD_ARGS += $(CARGO_TARGET_ARGS) +QEMU = qemu-system-$(ARCH) + +QEMU_ARGS = -nographic -serial mon:stdio -smp 1 +QEMU_ARGS += -machine virt # TODO: override by $(BOARD) +QEMU_ARGS += -kernel target/$(BUILD_TARGET)/$(MODE)/kernel +QEMU_ARGS += -initrd build/init.cpio + kernel: env RUSTFLAGS="$(RUSTFLAGS)" cargo build --bin kernel $(CARGO_BUILD_ARGS) @@ -36,7 +50,7 @@ kernel-test-dump: @env RUSTFLAGS="$(RUSTFLAGS)" cargo test $(CARGO_TARGET_ARGS) --bin=kernel --no-run --message-format=json kernel-asm: kernel - riscv64-elf-objdump -d target/$(BUILD_TARGET)/debug/kernel | c++filt -t > kernel.asm + riscv64-elf-objdump -d target/$(BUILD_TARGET)/$(MODE)/kernel | c++filt -t > kernel.asm build-target: @echo $(BUILD_TARGET) @@ -45,32 +59,9 @@ clean: cargo clean qemu: kernel - qemu-system-$(ARCH) \ - -nographic -machine virt -serial mon:stdio -smp 1 \ - -kernel target/$(BUILD_TARGET)/debug/kernel + $(QEMU) $(QEMU_ARGS) qemu-gdb: kernel - qemu-system-$(ARCH) \ - -nographic -machine virt -serial mon:stdio -smp 1 \ - -kernel target/$(BUILD_TARGET)/debug/kernel \ - -s -S + $(QEMU) $(QEMU_ARGS) -s -S -replay.qcow2: - qemu-img create -f qcow2 replay.qcow2 1G - -qemu-record: kernel replay.qcow2 - qemu-system-$(ARCH) \ - -nographic -machine virt -serial mon:stdio -smp 1 \ - -kernel target/$(BUILD_TARGET)/debug/kernel \ - -icount shift=auto,rr=record,rrfile=replay.bin,rrsnapshot=init \ - -drive file=replay.qcow2,if=none,id=rr - -qemu-replay: kernel replay.qcow2 - qemu-system-$(ARCH) \ - -nographic -machine virt -serial mon:stdio -smp 1 \ - -kernel target/$(BUILD_TARGET)/debug/kernel \ - -icount shift=auto,rr=replay,rrfile=replay.bin,rrsnapshot=init \ - -drive file=replay.qcow2,if=none,id=rr \ - -s -S - -.PHONY: kernel clippy test kernel-test-dump kernel-asm build-target clean qemu qemu-gdb qemu-record qemu-replay +.PHONY: kernel clippy test kernel-test-dump kernel-asm build-target clean qemu qemu-gdb