| 1 |
# Pactor64 Makefile — x86-64 kernel build system |
| 2 |
# Uses GRUB2 as bootloader with multiboot2 protocol |
| 3 |
|
| 4 |
ASM = nasm |
| 5 |
CC = gcc |
| 6 |
LD = ld |
| 7 |
|
| 8 |
# === Kernel flags === |
| 9 |
ASM_FLAGS = -f elf64 |
| 10 |
CC_FLAGS = -std=gnu11 -ffreestanding -fno-builtin -fno-stack-protector \ |
| 11 |
-fno-pic -fno-pie -O2 -Wall -Wextra -mcmodel=kernel \ |
| 12 |
-mno-red-zone -mno-sse -mno-sse2 -mgeneral-regs-only \ |
| 13 |
-nostdlib -nostdinc -Iinclude |
| 14 |
LD_FLAGS = -T linker.ld -nostdlib -z max-page-size=0x1000 |
| 15 |
|
| 16 |
# === Userspace flags === |
| 17 |
UCC_FLAGS = -std=gnu11 -ffreestanding -fno-builtin -fno-stack-protector \ |
| 18 |
-no-pie -O2 -Wall -Wextra -mcmodel=small \ |
| 19 |
-mno-sse -mno-sse2 -mgeneral-regs-only \ |
| 20 |
-nostdlib -nostdinc -Ilibc |
| 21 |
ULD_FLAGS = -T userspace.ld -nostdlib --allow-multiple-definition -z max-page-size=0x1000 |
| 22 |
|
| 23 |
BUILD_DIR = build |
| 24 |
ISO_DIR = $(BUILD_DIR)/iso |
| 25 |
KERNEL_ELF = $(BUILD_DIR)/pactor64.kernel |
| 26 |
ISO_IMAGE = $(BUILD_DIR)/pactor64.iso |
| 27 |
DISK_IMG = $(BUILD_DIR)/pactor64.disk |
| 28 |
|
| 29 |
# Kernel objects |
| 30 |
KERNEL_OBJS = $(BUILD_DIR)/entry.o \ |
| 31 |
$(BUILD_DIR)/isr.o \ |
| 32 |
$(BUILD_DIR)/main.o \ |
| 33 |
$(BUILD_DIR)/idt.o \ |
| 34 |
$(BUILD_DIR)/timer.o \ |
| 35 |
$(BUILD_DIR)/keyboard.o \ |
| 36 |
$(BUILD_DIR)/pmm.o \ |
| 37 |
$(BUILD_DIR)/heap.o \ |
| 38 |
$(BUILD_DIR)/vga.o \ |
| 39 |
$(BUILD_DIR)/shell.o \ |
| 40 |
$(BUILD_DIR)/ext2.o \ |
| 41 |
$(BUILD_DIR)/ata.o \ |
| 42 |
$(BUILD_DIR)/elf.o \ |
| 43 |
$(BUILD_DIR)/syscall.o \ |
| 44 |
$(BUILD_DIR)/syscall_entry.o |
| 45 |
|
| 46 |
# Userspace |
| 47 |
LIBC_OBJS = $(BUILD_DIR)/start_entry.o $(BUILD_DIR)/libc_start.o |
| 48 |
PROG_ELF = $(BUILD_DIR)/programs/hello.elf |
| 49 |
|
| 50 |
.PHONY: all clean run run-disk debug disk iso programs verify |
| 51 |
|
| 52 |
all: $(ISO_IMAGE) |
| 53 |
@echo "=========================================" |
| 54 |
@echo " Pactor64 ISO built: $(ISO_IMAGE)" |
| 55 |
@echo " Kernel: $(KERNEL_ELF)" |
| 56 |
@echo " Programs: $(PROG_ELF)" |
| 57 |
@echo "=========================================" |
| 58 |
|
| 59 |
$(ISO_IMAGE): $(KERNEL_ELF) $(PROG_ELF) boot/grub.cfg |
| 60 |
@mkdir -p $(ISO_DIR)/boot/grub $(ISO_DIR)/programs |
| 61 |
@cp $(KERNEL_ELF) $(ISO_DIR)/boot/pactor64.kernel |
| 62 |
@cp boot/grub.cfg $(ISO_DIR)/boot/grub/grub.cfg |
| 63 |
@cp $(PROG_ELF) $(ISO_DIR)/programs/hello.elf 2>/dev/null || true |
| 64 |
@grub-mkrescue -o $@ $(ISO_DIR) 2>/dev/null |
| 65 |
|
| 66 |
# === Kernel linking === |
| 67 |
$(KERNEL_ELF): $(KERNEL_OBJS) |
| 68 |
$(LD) $(LD_FLAGS) $^ -o $@ |
| 69 |
|
| 70 |
# === Kernel ASM objects === |
| 71 |
$(BUILD_DIR)/entry.o: kernel/entry.asm | $(BUILD_DIR) |
| 72 |
$(ASM) $(ASM_FLAGS) $< -o $@ |
| 73 |
|
| 74 |
$(BUILD_DIR)/isr.o: kernel/isr.asm | $(BUILD_DIR) |
| 75 |
$(ASM) $(ASM_FLAGS) $< -o $@ |
| 76 |
|
| 77 |
$(BUILD_DIR)/syscall_entry.o: kernel/syscall_entry.asm | $(BUILD_DIR) |
| 78 |
$(ASM) $(ASM_FLAGS) $< -o $@ |
| 79 |
|
| 80 |
# === Kernel C objects === |
| 81 |
$(BUILD_DIR)/main.o: kernel/main.c include/pactor64.h | $(BUILD_DIR) |
| 82 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 83 |
|
| 84 |
$(BUILD_DIR)/idt.o: kernel/idt.c include/pactor64.h | $(BUILD_DIR) |
| 85 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 86 |
|
| 87 |
$(BUILD_DIR)/timer.o: kernel/timer.c include/pactor64.h | $(BUILD_DIR) |
| 88 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 89 |
|
| 90 |
$(BUILD_DIR)/keyboard.o: kernel/keyboard.c include/pactor64.h | $(BUILD_DIR) |
| 91 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 92 |
|
| 93 |
$(BUILD_DIR)/pmm.o: kernel/pmm.c include/pactor64.h | $(BUILD_DIR) |
| 94 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 95 |
|
| 96 |
$(BUILD_DIR)/heap.o: kernel/heap.c include/pactor64.h | $(BUILD_DIR) |
| 97 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 98 |
|
| 99 |
$(BUILD_DIR)/vga.o: kernel/vga.c include/pactor64.h | $(BUILD_DIR) |
| 100 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 101 |
|
| 102 |
$(BUILD_DIR)/shell.o: kernel/shell.c include/pactor64.h kernel/ata.h kernel/ext2.h kernel/elf.h kernel/hello_elf.h | $(BUILD_DIR) |
| 103 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 104 |
|
| 105 |
$(BUILD_DIR)/ata.o: kernel/ata.c kernel/ata.h include/pactor64.h | $(BUILD_DIR) |
| 106 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 107 |
|
| 108 |
$(BUILD_DIR)/ext2.o: kernel/ext2.c kernel/ext2.h kernel/ata.h include/pactor64.h | $(BUILD_DIR) |
| 109 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 110 |
|
| 111 |
$(BUILD_DIR)/elf.o: kernel/elf.c kernel/elf.h include/pactor64.h | $(BUILD_DIR) |
| 112 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 113 |
|
| 114 |
$(BUILD_DIR)/syscall.o: kernel/syscall.c kernel/syscall.h include/pactor64.h | $(BUILD_DIR) |
| 115 |
$(CC) $(CC_FLAGS) -c $< -o $@ |
| 116 |
|
| 117 |
# === Userspace libc === |
| 118 |
$(BUILD_DIR)/start_entry.o: /tmp/start_entry.asm | $(BUILD_DIR) |
| 119 |
$(ASM) $(ASM_FLAGS) $< -o $@ |
| 120 |
|
| 121 |
$(BUILD_DIR)/libc_start.o: libc/start.c libc/libc.h | $(BUILD_DIR) |
| 122 |
$(CC) $(UCC_FLAGS) -c $< -o $@ |
| 123 |
|
| 124 |
# === Userspace programs === |
| 125 |
programs: $(PROG_ELF) |
| 126 |
|
| 127 |
$(BUILD_DIR)/programs/hello.elf: $(BUILD_DIR)/programs/hello.o $(LIBC_OBJS) userspace.ld |
| 128 |
@mkdir -p $(BUILD_DIR)/programs |
| 129 |
$(LD) $(ULD_FLAGS) $(BUILD_DIR)/programs/hello.o $(LIBC_OBJS) -o $@ |
| 130 |
|
| 131 |
$(BUILD_DIR)/programs/hello.o: programs/hello.c libc/libc.h | $(BUILD_DIR)/programs |
| 132 |
$(CC) $(UCC_FLAGS) -c $< -o $@ |
| 133 |
|
| 134 |
$(BUILD_DIR)/programs: |
| 135 |
@mkdir -p $@ |
| 136 |
|
| 137 |
$(BUILD_DIR): |
| 138 |
@mkdir -p $@ |
| 139 |
|
| 140 |
clean: |
| 141 |
rm -rf $(BUILD_DIR) |
| 142 |
|
| 143 |
run: $(ISO_IMAGE) |
| 144 |
qemu-system-x86_64 -cdrom $(ISO_IMAGE) -m 512 \ |
| 145 |
-serial mon:stdio -display none -no-reboot |
| 146 |
|
| 147 |
debug: $(ISO_IMAGE) |
| 148 |
qemu-system-x86_64 -cdrom $(ISO_IMAGE) -m 512 \ |
| 149 |
-serial mon:stdio -display none -no-reboot -s -S |
| 150 |
|
| 151 |
# === Disk image === |
| 152 |
disk: $(KERNEL_ELF) $(PROG_ELF) |
| 153 |
@bash scripts/mkdisk.sh |
| 154 |
|
| 155 |
# === Boot from disk image === |
| 156 |
run-disk: disk |
| 157 |
qemu-system-x86_64 -drive file=$(DISK_IMG),format=raw,if=ide -m 512 \ |
| 158 |
-serial mon:stdio -display none -no-reboot |
| 159 |
|
| 160 |
run-disk-gui: disk |
| 161 |
qemu-system-x86_64 -drive file=$(DISK_IMG),format=raw,if=ide -m 512 \ |
| 162 |
-serial mon:stdio -no-reboot |
| 163 |
|
| 164 |
verify: $(KERNEL_ELF) |
| 165 |
@grub-file --is-x86-multiboot2 $(KERNEL_ELF) && echo "VALID multiboot2" || echo "INVALID" |
| 166 |
|