Makefile

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