74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
|  | # === Config ===
 | ||
|  | TARGET       := boot/espresso.bin | ||
|  | ISO          := boot/espresso.iso | ||
|  | CC           := i686-elf-gcc | ||
|  | AS           := i686-elf-as | ||
|  | NASM         := nasm | ||
|  | QEMU_MKE_IMG := qemu-img create -f raw espresso.img 64M | ||
|  | NASMFLAGS    := -f elf32 | ||
|  | CFLAGS       := -std=gnu99 -ffreestanding -O2 -Wall -Wextra -msse | ||
|  | LDFLAGS      := -T linker.ld -ffreestanding -O2 -nostdlib | ||
|  | SRC_DIRS     := kernel drivers src lib | ||
|  | INCLUDE_DIRS := include | ||
|  | 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')) | ||
|  | S_SRCS       := boot.s crti.s crtn.s misc_asm.s | ||
|  | NASM_SRCS    := idt.asm isr128.asm gdt.asm isr_stub_table.asm | ||
|  | 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 clean | ||
|  | 
 | ||
|  | # === Default target ===
 | ||
|  | all: $(TARGET) | ||
|  | 
 | ||
|  | # === Linking ===
 | ||
|  | $(TARGET): boot.o $(filter-out boot.o, $(OBJ_LINK_LIST)) | ||
|  | 	@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 | ||
|  | 	$(QEMU_MKE_IMG) | ||
|  | 	qemu-system-i386 -kernel $(TARGET) -drive file=espresso.img,format=raw,if=ide,readonly=off,rerror=report,werror=report -cpu qemu32,sse2 #-singlestep | ||
|  | 
 | ||
|  | # === Clean all build artifacts ===
 | ||
|  | clean: | ||
|  | 	rm -f $(INTERNAL_OBJS) $(TARGET) $(ISO) | ||
|  | 	rm -rf $(ISO_DIR) | ||
|  | 
 | ||
|  | .PHONY: all clean iso run | ||
|  | 
 |