1
0
tetros/Makefile
2025-02-18 20:39:57 +00:00

109 lines
2.3 KiB
Makefile

BUILD=./build
# Default rule
.PHONY: default
default: all
# Remove all build files
.PHONY: clean
clean:
rm -drf $(BUILD)
cd tetros; cargo clean
# Make everything
# (but don't run qemu)
.PHONY: all
all: img
#
# MARK: boot
#
# Compile tetros as library
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 \
--manifest-path="./Cargo.toml" \
-Z build-std=core,alloc \
-Z build-std-features=compiler-builtins-mem \
--target "./targets/x86-unknown-none.json" \
--lib \
--release \
-- \
--emit link="$(CURDIR)/$@"
# Link tetros
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 three-stage BIOS loader
# Parameters:
# - BIOS_SRC: source directory of bios assembly
# - STAGE3: path to linked stage 3 binary
# - STAGE2_SECTOR: the index of the first sector of the stage 2 binary on the disk
BIOS_SRC = ./bios
STAGE2_SECTOR = 5
STAGE3 = $(BUILD)/tetros.elf
$(BUILD)/bios.bin: $(wildcard $(BIOS_SRC)/*.asm) $(STAGE3)
@mkdir -p "$(BUILD)"
nasm \
-f bin \
-D STAGE3=$(STAGE3) \
-D STAGE2_SECTOR=$(STAGE2_SECTOR) \
-o "$@" \
-l "$@.lst" \
-i "$(BIOS_SRC)" \
"$(BIOS_SRC)/main.asm"
# Extract full mbr (first 512 bytes)
$(BUILD)/mbr.bin: $(BUILD)/bios.bin
@mkdir -p "$(BUILD)"
@echo ""
dd if="$<" bs=512 count=1 of="$@"
# Extract stage 2 (rest of file)
$(BUILD)/stage2.bin: $(BUILD)/bios.bin
@mkdir -p "$(BUILD)"
@echo ""
dd if="$<" bs=512 skip=1 of="$@"
#
# MARK: bundle
#
# Make full disk image
.PHONY: img
img: $(BUILD)/disk.img
$(BUILD)/disk.img: $(BUILD)/mbr.bin $(BUILD)/stage2.bin
@mkdir -p $(BUILD)
@echo ""
dd if=/dev/zero of=$@ bs=512 count=32
dd if="$(BUILD)/mbr.bin" of=$@ conv=notrunc bs=512
dd if="$(BUILD)/stage2.bin" of=$@ conv=notrunc seek=5 bs=512
qemu: $(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
# -enable-kvm \
# -cpu host \