Makefile

Commit: 2a3b0c04 Author: jokerz Raw Copy
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