| 1 |
# Pactor64 — Raspberry Pi 5 Makefile (AArch64) |
| 2 |
# Pure clang toolchain — no GNU tools |
| 3 |
# ============================================================ |
| 4 |
|
| 5 |
CC = clang-21 |
| 6 |
LD = ld.lld-21 |
| 7 |
OBJCOPY = llvm-objcopy-21 |
| 8 |
OBJDUMP = llvm-objdump-21 |
| 9 |
READELF = llvm-readelf-21 |
| 10 |
NM = llvm-nm-21 |
| 11 |
STRIP = llvm-strip-21 |
| 12 |
|
| 13 |
TARGET = --target=aarch64-none-elf |
| 14 |
CPU = -mcpu=cortex-a76 |
| 15 |
|
| 16 |
CC_FLAGS = $(TARGET) $(CPU) \ |
| 17 |
-O2 -Wall -Wextra \ |
| 18 |
-ffreestanding -fno-builtin -fno-stack-protector \ |
| 19 |
-fno-pic -fno-pie \ |
| 20 |
-mgeneral-regs-only \ |
| 21 |
-nostdlib -nostdinc \ |
| 22 |
-Iinclude |
| 23 |
|
| 24 |
AS_FLAGS = $(TARGET) $(CPU) \ |
| 25 |
-ffreestanding |
| 26 |
|
| 27 |
LD_FLAGS = -T linker.ld -nostdlib --static |
| 28 |
|
| 29 |
BUILD_DIR = build |
| 30 |
KERNEL_IMG = $(BUILD_DIR)/kernel8.img |
| 31 |
KERNEL_ELF = $(BUILD_DIR)/pactor64.kernel |
| 32 |
|
| 33 |
# Source files |
| 34 |
ASM_SRC = kernel/entry.S |
| 35 |
C_SRC = kernel/main.c |
| 36 |
ASM_OBJ = $(patsubst %,$(BUILD_DIR)/%.o,$(ASM_SRC)) |
| 37 |
C_OBJ = $(patsubst %,$(BUILD_DIR)/%.o,$(C_SRC)) |
| 38 |
OBJS = $(ASM_OBJ) $(C_OBJ) |
| 39 |
|
| 40 |
# ============================================================ |
| 41 |
# Targets |
| 42 |
# ============================================================ |
| 43 |
|
| 44 |
.PHONY: all clean run verify |
| 45 |
|
| 46 |
all: $(KERNEL_IMG) |
| 47 |
@echo "=========================================" |
| 48 |
@echo " Pi 5 kernel: $(KERNEL_IMG)" |
| 49 |
@echo " Size: $$(stat -c%s $(KERNEL_IMG)) bytes" |
| 50 |
@echo "=========================================" |
| 51 |
|
| 52 |
$(KERNEL_IMG): $(KERNEL_ELF) |
| 53 |
$(OBJCOPY) -O binary $< $@ |
| 54 |
|
| 55 |
$(KERNEL_ELF): $(OBJS) linker.ld |
| 56 |
$(LD) $(LD_FLAGS) -o $@ $(OBJS) |
| 57 |
|
| 58 |
# Assembly files |
| 59 |
$(BUILD_DIR)/%.S.o: %.S | $(BUILD_DIR) |
| 60 |
@mkdir -p $(dir $@) |
| 61 |
$(CC) $(AS_FLAGS) -c $< -o $@ |
| 62 |
|
| 63 |
# C files |
| 64 |
$(BUILD_DIR)/%.c.o: %.c | $(BUILD_DIR) |
| 65 |
@mkdir -p $(dir $@) |
| 66 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 67 |
|
| 68 |
$(BUILD_DIR): |
| 69 |
mkdir -p $@ |
| 70 |
|
| 71 |
clean: |
| 72 |
rm -rf $(BUILD_DIR) |
| 73 |
|
| 74 |
# Verify multiboot (not applicable for Pi, but check ELF) |
| 75 |
verify: $(KERNEL_ELF) |
| 76 |
$(READELF) -h $< | grep -E "Class|Machine|Entry" |
| 77 |
$(OBJDUMP) -d $< | head -20 |
| 78 |
|
| 79 |
# Copy to SD card (mount point as argument) |
| 80 |
# Usage: make deploy SD=/media/sdcard |
| 81 |
deploy: $(KERNEL_IMG) |
| 82 |
@if [ -z "$(SD)" ]; then echo "Usage: make deploy SD=/path/to/sdcard"; exit 1; fi |
| 83 |
cp $(KERNEL_IMG) $(SD)/kernel8.img |
| 84 |
cp boot/config.txt $(SD)/config.txt |
| 85 |
@echo "Deployed to $(SD)" |
| 86 |
|
| 87 |
# Disassemble |
| 88 |
disasm: $(KERNEL_ELF) |
| 89 |
$(OBJDUMP) -d $< |
| 90 |
|
| 91 |
# QEMU emulation (limited — Pi 5 not fully supported in QEMU) |
| 92 |
# Use: make qemu (requires qemu-system-aarch64) |
| 93 |
run: |
| 94 |
@echo "To run on Pi 5: copy kernel8.img + config.txt to SD card" |
| 95 |
@echo "To emulate: qemu-system-aarch64 -M raspi3b -kernel $(KERNEL_IMG) -serial stdio" |
| 96 |
|