/ Makefile
Makefile
  1  # i386 io_uring Kernel Makefile
  2  
  3  CC = i686-elf-gcc
  4  AS = i686-elf-as
  5  LD = i686-elf-ld
  6  OBJCOPY = i686-elf-objcopy
  7  
  8  CFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector \
  9           -nostartfiles -nodefaultlibs -Wall -Wextra -Werror -c \
 10           -Ikernel/include -fno-pic -fno-pie -std=gnu99
 11  
 12  LDFLAGS = -T kernel/linker.ld -melf_i386
 13  
 14  KERNEL_OBJS = build/boot.o \
 15                build/isr.o \
 16                build/gdt_flush.o \
 17                build/user_jump.o \
 18                build/paging_asm.o \
 19                build/kernel.o \
 20                build/gdt.o \
 21                build/idt.o \
 22                build/io_uring.o \
 23                build/syscall.o \
 24                build/memory.o \
 25                build/string.o \
 26                build/test_io_uring.o \
 27                build/fs.o \
 28                build/initrd.o \
 29                build/elf.o \
 30                build/process.o \
 31                build/fd.o \
 32                build/paging.o \
 33                build/vfs.o \
 34                build/keyboard.o \
 35                build/console.o
 36  
 37  all: build/kernel.bin build/initrd.img
 38  
 39  build/%.o: kernel/boot/%.s
 40  	@mkdir -p build
 41  	$(AS) --32 $< -o $@
 42  
 43  build/%.o: kernel/core/%.c
 44  	@mkdir -p build
 45  	$(CC) $(CFLAGS) $< -o $@
 46  
 47  build/%.o: kernel/io_uring/%.c
 48  	@mkdir -p build
 49  	$(CC) $(CFLAGS) $< -o $@
 50  
 51  build/%.o: kernel/lib/%.c
 52  	@mkdir -p build
 53  	$(CC) $(CFLAGS) $< -o $@
 54  
 55  build/%.o: kernel/drivers/%.c
 56  	@mkdir -p build
 57  	$(CC) $(CFLAGS) $< -o $@
 58  
 59  build/kernel.bin: $(KERNEL_OBJS)
 60  	$(LD) $(LDFLAGS) $(KERNEL_OBJS) -o build/kernel.elf
 61  	$(OBJCOPY) -O binary build/kernel.elf build/kernel.bin
 62  
 63  # Build tools
 64  tools/mkinitrd: tools/mkinitrd.c
 65  	@mkdir -p tools
 66  	gcc -o tools/mkinitrd tools/mkinitrd.c
 67  
 68  # Build userspace programs
 69  userspace/simple_shell:
 70  	$(MAKE) -C userspace
 71  
 72  # Build initrd
 73  build/initrd.img: tools/mkinitrd userspace/simple_shell
 74  	# Copy the simple shell program
 75  	@mkdir -p build/initrd_staging
 76  	@cp -L userspace/simple_shell build/initrd_staging/hello_uring
 77  	tools/mkinitrd build/initrd.img build/initrd_staging/hello_uring
 78  	@rm -rf build/initrd_staging
 79  
 80  # Create bootable ISO with GRUB
 81  iso: build/kernel.bin
 82  	@mkdir -p build/iso/boot/grub
 83  	cp build/kernel.bin build/iso/boot/
 84  	echo 'menuentry "io_uring Kernel" {' > build/iso/boot/grub/grub.cfg
 85  	echo '    multiboot /boot/kernel.bin' >> build/iso/boot/grub/grub.cfg
 86  	echo '}' >> build/iso/boot/grub/grub.cfg
 87  	grub-mkrescue -o build/kernel.iso build/iso
 88  
 89  # Run in QEMU
 90  run: build/kernel.bin build/initrd.img
 91  	qemu-system-i386 -kernel build/kernel.elf -initrd build/initrd.img -m 128 -icount 10,align=on
 92  
 93  # Debug with GDB
 94  debug: build/kernel.bin
 95  	qemu-system-i386 -kernel build/kernel.elf -m 128 -s -S &
 96  	gdb -x .gdbinit
 97  
 98  clean:
 99  	rm -rf build tools/mkinitrd
100  	$(MAKE) -C userspace clean
101  
102  .PHONY: all iso run debug clean