ASMCC = nasm
CC = gcc
LD = ld
CFLAGS = -m64 -ffreestanding -fno-stack-protector -nostdlib -nostartfiles -O2
LDFLAGS = -T kernel/linker.ld -nostdlib
SRCS = kernel/main.c kernel/vga.c kernel/pmm.c kernel/idt.c kernel/ps2.c kernel/timer.c
OBJS = $(SRCS:.c=.o) kernel/idt_asm.o kernel/multiboot.o kernel/entry.o modules/example_mod.o
all: kernel.bin
kernel/entry.o: kernel/entry.asm
$(ASMCC) -f elf64 kernel/entry.asm -o kernel/entry.o
kernel/multiboot.o: kernel/multiboot.asm
$(ASMCC) -f elf64 kernel/multiboot.asm -o kernel/multiboot.o
kernel/idt_asm.o: kernel/idt.S
$(CC) -c kernel/idt.S -o kernel/idt_asm.o
kernel/%.o: kernel/%.c
$(CC) $(CFLAGS) -c $< -o $@
modules/example_mod.o: modules/example_mod.c
$(CC) $(CFLAGS) -c modules/example_mod.c -o modules/example_mod.o
kernel.bin: $(OBJS)
$(LD) $(LDFLAGS) -o kernel.bin $(OBJS)
iso:
mkdir -p iso/boot/grub
cp kernel.bin iso/boot/kernel.bin
printf 'set timeout=0\nset default=0\nmenuentry "CrystalOS" { multiboot2 /boot/kernel.bin }\n' > iso/boot/grub/grub.cfg
grub-mkrescue -o crystalos.iso iso
start:
qemu-system-x86_64 -cdrom crystalos.iso -m 512 -serial stdio -display sdl
clean:
rm -f $(OBJS) kernel.bin crystalos.iso