| 
									
										
										
										
											2025-05-28 14:41:02 -05:00
										 |  |  | # === Config ===
 | 
					
						
							| 
									
										
										
										
											2025-06-27 14:48:06 -05:00
										 |  |  | TARGET       := boot/espresso.elf | 
					
						
							| 
									
										
										
										
											2025-05-28 14:41:02 -05:00
										 |  |  | ISO          := boot/espresso.iso | 
					
						
							|  |  |  | CC           := i686-elf-gcc | 
					
						
							|  |  |  | AS           := i686-elf-as | 
					
						
							|  |  |  | NASM         := nasm | 
					
						
							| 
									
										
										
										
											2025-10-20 21:57:30 -05:00
										 |  |  | QEMU_MKE_IMG := qemu-img create -f raw espresso.img 64M | 
					
						
							| 
									
										
										
										
											2025-06-13 18:03:39 -05:00
										 |  |  | MKFS_VFAT    := sudo mkfs.vfat | 
					
						
							| 
									
										
										
										
											2025-06-27 14:48:06 -05:00
										 |  |  | MKFS_FLAGS   := -F 32 -S 512 | 
					
						
							| 
									
										
										
										
											2025-05-28 14:41:02 -05:00
										 |  |  | NASMFLAGS    := -f elf32 | 
					
						
							|  |  |  | WNOFLAGS     := -Wno-discarded-qualifiers | 
					
						
							| 
									
										
										
										
											2025-10-20 21:57:30 -05:00
										 |  |  | CFLAGS       := -std=gnu99 -ffreestanding -O2 -Wall -Wextra -msse $(WNOFLAGS) -nostdlib -nostartfiles -include kincl.h | 
					
						
							|  |  |  | LDFLAGS      := -T linker.ld -ffreestanding -O2 -nostdlib -nostartfiles | 
					
						
							| 
									
										
										
										
											2025-07-01 20:39:38 -05:00
										 |  |  | QEMUFLAGS    := -boot d -cdrom $(ISO) -drive file=espresso.img,format=raw,if=ide,readonly=off,rerror=report,werror=report -cpu qemu32,sse4.1 | 
					
						
							| 
									
										
										
										
											2025-10-20 21:57:30 -05:00
										 |  |  | QEMUFLGS_EXT := -vga std -d int,cpu_reset -D qemu.log -no-reboot #-singlestep | 
					
						
							|  |  |  | MOR_QEMUFLGS := -net none -netdev user,id=n0 -device rtl8139,netdev=n0 -serial file:serial.log | 
					
						
							| 
									
										
										
										
											2025-05-28 14:41:02 -05:00
										 |  |  | SRC_DIRS     := kernel drivers lib | 
					
						
							|  |  |  | INCLUDE_DIRS := include | 
					
						
							| 
									
										
										
										
											2025-07-04 14:23:29 -05:00
										 |  |  | ARCH_DIR     := arch | 
					
						
							|  |  |  | X86_ARCH_DIR := $(ARCH_DIR)/x86 | 
					
						
							|  |  |  | X86_BOOT_DIR := $(X86_ARCH_DIR)/boot | 
					
						
							| 
									
										
										
										
											2025-05-28 14:41:02 -05:00
										 |  |  | INCLUDES     := $(addprefix -I, $(INCLUDE_DIRS)) | 
					
						
							|  |  |  | ISO_DIR      := isodir | 
					
						
							|  |  |  | BOOT_DIR     := $(ISO_DIR)/boot | 
					
						
							|  |  |  | GRUB_DIR     := $(BOOT_DIR)/grub | 
					
						
							|  |  |  | GRUB_CFG     := grub.cfg | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # === File collection ===
 | 
					
						
							|  |  |  | C_SRCS       := $(foreach dir, $(SRC_DIRS), $(shell find $(dir) -name '*.c')) | 
					
						
							| 
									
										
										
										
											2025-07-04 14:23:29 -05:00
										 |  |  | S_SRCS       := $(foreach dir, $(ARCH_DIR), $(shell find $(dir) -name '*.s')) | 
					
						
							|  |  |  | NASM_SRCS    := $(foreach dir, $(ARCH_DIR), $(shell find $(dir) -name '*.asm')) | 
					
						
							| 
									
										
										
										
											2025-05-28 14:41:02 -05:00
										 |  |  | CRTI_OBJ     := crti.o | 
					
						
							|  |  |  | CRTBEGIN_OBJ := $(shell $(CC) $(CFLAGS) -print-file-name=crtbegin.o) | 
					
						
							|  |  |  | CRTEND_OBJ   := $(shell $(CC) $(CFLAGS) -print-file-name=crtend.o) | 
					
						
							|  |  |  | CRTN_OBJ     := crtn.o | 
					
						
							|  |  |  | OBJS         := $(C_SRCS:.c=.o) $(S_SRCS:.s=.o) $(NASM_SRCS:.asm=.o) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OBJ_LINK_LIST := $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(OBJS) $(CRTEND_OBJ) $(CRTN_OBJ) | 
					
						
							|  |  |  | INTERNAL_OBJS := $(CRTI_OBJ) $(OBJS) $(CRTN_OBJ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # === Build all targets ===
 | 
					
						
							|  |  |  | build: all iso run | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-04 14:23:29 -05:00
										 |  |  | # === Build all targets and clean ===
 | 
					
						
							| 
									
										
										
										
											2025-07-07 10:41:05 -05:00
										 |  |  | buildc: all iso run clean | 
					
						
							| 
									
										
										
										
											2025-07-04 14:23:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-28 14:41:02 -05:00
										 |  |  | # === Default target ===
 | 
					
						
							|  |  |  | all: $(TARGET) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-20 21:57:30 -05:00
										 |  |  | # === Debug build ===
 | 
					
						
							|  |  |  | debug: | 
					
						
							|  |  |  | 	$(MAKE) clean | 
					
						
							|  |  |  | 	$(MAKE) CFLAGS="$(CFLAGS) -D_DEBUG" $(TARGET) | 
					
						
							| 
									
										
										
										
											2025-07-04 14:23:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-28 14:41:02 -05:00
										 |  |  | # === Linking ===
 | 
					
						
							| 
									
										
										
										
											2025-07-04 14:23:29 -05:00
										 |  |  | $(TARGET): ./arch/x86/boot/boot.o $(filter-out boot.o, $(OBJ_LINK_LIST)) | 
					
						
							| 
									
										
										
										
											2025-05-28 14:41:02 -05:00
										 |  |  | 	@mkdir -p $(dir $@) | 
					
						
							|  |  |  | 	$(CC) $(LDFLAGS) -o $@ $^ -lgcc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # === Compiling C files ===
 | 
					
						
							|  |  |  | %.o: %.c | 
					
						
							|  |  |  | 	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # === Assembling S files ===
 | 
					
						
							|  |  |  | %.o: %.s | 
					
						
							|  |  |  | 	$(AS) $< -o $@ | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | %.o: %.asm | 
					
						
							|  |  |  | 	$(NASM) $(NASMFLAGS) $< -o $@ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # === ISO generation ===
 | 
					
						
							|  |  |  | iso: $(TARGET) | 
					
						
							|  |  |  | 	@grub-file --is-x86-multiboot $(TARGET) && echo "multiboot confirmed" || (echo "not multiboot" && exit 1) | 
					
						
							|  |  |  | 	mkdir -p $(GRUB_DIR) | 
					
						
							|  |  |  | 	cp $(TARGET) $(BOOT_DIR)/ | 
					
						
							|  |  |  | 	cp $(GRUB_CFG) $(GRUB_DIR)/ | 
					
						
							|  |  |  | 	grub-mkrescue -o $(ISO) $(ISO_DIR) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # === Run in QEMU ===
 | 
					
						
							|  |  |  | run: iso | 
					
						
							| 
									
										
										
										
											2025-10-20 21:57:30 -05:00
										 |  |  | 	@if [ ! -f espresso.img ]; then \
 | 
					
						
							|  |  |  | 		$(QEMU_MKE_IMG); \
 | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 	@echo | 
					
						
							|  |  |  | 	qemu-system-i386 $(QEMUFLAGS) $(QEMUFLGS_EXT) $(MOR_QEMUFLGS) | 
					
						
							| 
									
										
										
										
											2025-07-01 20:39:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-28 14:41:02 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | # === Clean all build artifacts ===
 | 
					
						
							|  |  |  | clean: | 
					
						
							|  |  |  | 	rm -f $(INTERNAL_OBJS) $(TARGET) $(ISO) | 
					
						
							|  |  |  | 	rm -rf $(ISO_DIR) | 
					
						
							|  |  |  | 	rm -f espresso.img | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-20 21:57:30 -05:00
										 |  |  | .PHONY: all clean iso run debug build buildc |