108 lines
2.2 KiB
Makefile
108 lines
2.2 KiB
Makefile
BUILD=./build
|
|
|
|
# Default rule
|
|
.PHONY: default
|
|
default: $(BUILD)/disk.img
|
|
|
|
# Remove all build files
|
|
.PHONY: clean
|
|
clean:
|
|
rm -drf $(BUILD)
|
|
cd tetros; cargo clean
|
|
|
|
#
|
|
# MARK: disk
|
|
#
|
|
|
|
# Compile tetros as a library
|
|
# (so that we can link it with a custom linker script)
|
|
LIB_SRC = ./tetros/Cargo.toml ./tetros/Cargo.lock $(shell find ./tetros/src -type f)
|
|
$(BUILD)/tetros.lib: $(LIB_SRC)
|
|
@mkdir -p $(BUILD)
|
|
cd tetros && \
|
|
env RUSTFLAGS="-C soft-float" \
|
|
cargo rustc \
|
|
-Z build-std=core \
|
|
-Z build-std-features=compiler-builtins-mem \
|
|
--target "./targets/x86-unknown-none.json" \
|
|
--lib \
|
|
--release \
|
|
-- \
|
|
--emit link="$(CURDIR)/$@"
|
|
|
|
# Link tetros using custom linker script
|
|
BIOS_LD = ./tetros/linkers/x86-unknown-none.ld
|
|
$(BUILD)/tetros.elf: $(BUILD)/tetros.lib $(BIOS_LD)
|
|
ld \
|
|
-m elf_i386 \
|
|
--gc-sections \
|
|
-z max-page-size=0x1000 \
|
|
-T "$(BIOS_LD)" \
|
|
-o "$@" \
|
|
"$<"
|
|
|
|
objcopy --only-keep-debug "$@" "$@.sym"
|
|
objcopy --strip-debug "$@"
|
|
|
|
# Wrap tetros in BIOS loader
|
|
# Parameters:
|
|
# - BIOS_SRC: source directory of bios assembly
|
|
# - STAGE2_SECTOR: the index of the first sector of the stage 2 binary on the disk
|
|
BIOS_SRC = ./bios
|
|
STAGE2_SECTOR = 1
|
|
$(BUILD)/disk.img: $(wildcard $(BIOS_SRC)/*.asm) $(BUILD)/tetros.elf
|
|
@mkdir -p "$(BUILD)"
|
|
nasm \
|
|
-f bin \
|
|
-D STAGE3=$(BUILD)/tetros.elf \
|
|
-D STAGE2_SECTOR=$(STAGE2_SECTOR) \
|
|
-o "$@" \
|
|
-l "$@.lst" \
|
|
-i "$(BIOS_SRC)" \
|
|
"$(BIOS_SRC)/main.asm"
|
|
|
|
#
|
|
# MARK: qemu
|
|
#
|
|
# Do not use `-enable-kvm` or `-cpu host`,
|
|
# this confuses gdb.
|
|
#
|
|
|
|
.PHONY: qemu
|
|
qemu: $(BUILD)/disk.img
|
|
qemu-system-i386 \
|
|
-d cpu_reset \
|
|
-no-reboot \
|
|
-smp 1 -m 2048 \
|
|
-machine q35 \
|
|
-net none \
|
|
-serial stdio \
|
|
-fda "$<"
|
|
|
|
# Same as qemu, but with no dependency.
|
|
# Used for remote dev, where build box != run box.
|
|
.PHONY: qemu-remote
|
|
qemu-remote:
|
|
qemu-system-i386 \
|
|
-d cpu_reset \
|
|
-no-reboot \
|
|
-smp 1 -m 2048 \
|
|
-machine q35 \
|
|
-net none \
|
|
-serial stdio \
|
|
-fda "$(BUILD)/disk.img"
|
|
|
|
# Same as qemu, but with gdb options
|
|
.PHONY: qemu-gdb
|
|
qemu-gdb: $(BUILD)/disk.img
|
|
qemu-system-i386 \
|
|
-d cpu_reset \
|
|
-no-reboot \
|
|
-smp 1 -m 2048 \
|
|
-machine q35 \
|
|
-net none \
|
|
-serial stdio \
|
|
-fda "$<" \
|
|
-gdb tcp::26000 \
|
|
-S
|