# Pactor64 — Raspberry Pi 5 Makefile (AArch64) # Pure clang toolchain — no GNU tools # ============================================================ CC = clang-21 LD = ld.lld-21 OBJCOPY = llvm-objcopy-21 OBJDUMP = llvm-objdump-21 READELF = llvm-readelf-21 NM = llvm-nm-21 STRIP = llvm-strip-21 TARGET = --target=aarch64-none-elf CPU = -mcpu=cortex-a76 CC_FLAGS = $(TARGET) $(CPU) \ -O2 -Wall -Wextra \ -ffreestanding -fno-builtin -fno-stack-protector \ -fno-pic -fno-pie \ -mgeneral-regs-only \ -nostdlib -nostdinc \ -Iinclude AS_FLAGS = $(TARGET) $(CPU) \ -ffreestanding LD_FLAGS = -T linker.ld -nostdlib --static BUILD_DIR = build KERNEL_IMG = $(BUILD_DIR)/kernel8.img KERNEL_ELF = $(BUILD_DIR)/pactor64.kernel # Source files ASM_SRC = kernel/entry.S C_SRC = kernel/main.c ASM_OBJ = $(patsubst %,$(BUILD_DIR)/%.o,$(ASM_SRC)) C_OBJ = $(patsubst %,$(BUILD_DIR)/%.o,$(C_SRC)) OBJS = $(ASM_OBJ) $(C_OBJ) # ============================================================ # Targets # ============================================================ .PHONY: all clean run verify all: $(KERNEL_IMG) @echo "=========================================" @echo " Pi 5 kernel: $(KERNEL_IMG)" @echo " Size: $$(stat -c%s $(KERNEL_IMG)) bytes" @echo "=========================================" $(KERNEL_IMG): $(KERNEL_ELF) $(OBJCOPY) -O binary $< $@ $(KERNEL_ELF): $(OBJS) linker.ld $(LD) $(LD_FLAGS) -o $@ $(OBJS) # Assembly files $(BUILD_DIR)/%.S.o: %.S | $(BUILD_DIR) @mkdir -p $(dir $@) $(CC) $(AS_FLAGS) -c $< -o $@ # C files $(BUILD_DIR)/%.c.o: %.c | $(BUILD_DIR) @mkdir -p $(dir $@) $(CC) $(CC_FLAGS) -c $< -o $@ $(BUILD_DIR): mkdir -p $@ clean: rm -rf $(BUILD_DIR) # Verify multiboot (not applicable for Pi, but check ELF) verify: $(KERNEL_ELF) $(READELF) -h $< | grep -E "Class|Machine|Entry" $(OBJDUMP) -d $< | head -20 # Copy to SD card (mount point as argument) # Usage: make deploy SD=/media/sdcard deploy: $(KERNEL_IMG) @if [ -z "$(SD)" ]; then echo "Usage: make deploy SD=/path/to/sdcard"; exit 1; fi cp $(KERNEL_IMG) $(SD)/kernel8.img cp boot/config.txt $(SD)/config.txt @echo "Deployed to $(SD)" # Disassemble disasm: $(KERNEL_ELF) $(OBJDUMP) -d $< # QEMU emulation (limited — Pi 5 not fully supported in QEMU) # Use: make qemu (requires qemu-system-aarch64) run: @echo "To run on Pi 5: copy kernel8.img + config.txt to SD card" @echo "To emulate: qemu-system-aarch64 -M raspi3b -kernel $(KERNEL_IMG) -serial stdio"