-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
70 lines (56 loc) · 1.56 KB
/
Copy pathMakefile
File metadata and controls
70 lines (56 loc) · 1.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Tools
NASM = nasm
GCC = gcc
LD = ld
OBJCOPY = objcopy
QEMU = qemu-system-i386
XORRISO = xorriso
# Flags
NASM_FLAGS = -f bin
GCC_FLAGS = -m32 -ffreestanding -fno-pie -c
LD_FLAGS = -m elf_i386 -T linker.ld
QEMU_FLAGS = -cdrom os-image.iso
# Output files
OS_IMAGE = os-image.iso
KERNEL_ELF = kernel.elf
KERNEL_BIN = kernel.bin
BOOT_BIN = boot.bin
# Source files
BOOT_ASM = boot.asm
KERNEL_ASM = kernel.asm
KERNEL_C = kernel.c
LINKER_SCRIPT = linker.ld
# Object files
KERNEL_ASM_OBJ = kernel_asm.o
KERNEL_C_OBJ = kernel_c.o
# Default target
all: $(OS_IMAGE)
# Create ISO with xorriso
$(OS_IMAGE): $(BOOT_BIN) $(KERNEL_BIN)
mkdir -p iso/boot
cp $(BOOT_BIN) iso/boot/boot.bin
cp $(KERNEL_BIN) iso/boot/kernel.bin
$(XORRISO) -as mkisofs -b boot/boot.bin -no-emul-boot -boot-load-size 4 -o $(OS_IMAGE) iso
rm -rf iso
# Convert kernel ELF to binary
$(KERNEL_BIN): $(KERNEL_ELF)
$(OBJCOPY) -O binary $(KERNEL_ELF) $(KERNEL_BIN)
# Link kernel object files
$(KERNEL_ELF): $(KERNEL_ASM_OBJ) $(KERNEL_C_OBJ)
$(LD) $(LD_FLAGS) $(KERNEL_ASM_OBJ) $(KERNEL_C_OBJ) -o $(KERNEL_ELF)
# Assemble bootloader
$(BOOT_BIN): $(BOOT_ASM)
$(NASM) $(NASM_FLAGS) $(BOOT_ASM) -o $(BOOT_BIN)
# Assemble kernel entry
$(KERNEL_ASM_OBJ): $(KERNEL_ASM)
$(NASM) -f elf32 $(KERNEL_ASM) -o $(KERNEL_ASM_OBJ)
# Compile kernel C code
$(KERNEL_C_OBJ): $(KERNEL_C)
$(GCC) $(GCC_FLAGS) $(KERNEL_C) -o $(KERNEL_C_OBJ)
# Run in QEMU
run: $(OS_IMAGE)
$(QEMU) $(QEMU_FLAGS)
# Clean build artifacts
clean:
rm -f $(KERNEL_ASM_OBJ) $(KERNEL_C_OBJ) $(KERNEL_ELF) $(KERNEL_BIN) $(BOOT_BIN) $(OS_IMAGE)
.PHONY: all run clean