summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile76
1 files changed, 47 insertions, 29 deletions
diff --git a/Makefile b/Makefile
index 7c41b4d..e44eb1b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,37 +1,55 @@
-.DEFAULT_GOAL := macaroni.iso
+CC := i686-elf-gcc
+AS := nasm
+QEMU := qemu-system-x86_64
+LIMINE ?= /opt/homebrew/share/limine
-LIMINE_SHARE = /opt/homebrew/share/limine/
+CFLAGS := -std=c11 -ffreestanding -O0 -g -Wall -Wextra -Iinclude -MMD -MP
+ASFLAGS := -felf32
+LDFLAGS := -T linker.ld -ffreestanding -O0 -nostdlib
+LDLIBS := -lgcc
-BUILD_OUT = build
-ASM = nasm
-ASM_FLAGS = -felf32
-CFLAG = -std=c11 -ffreestanding -O0 -Wall -Wextra
-CC = i686-elf-gcc
-BINFLAG = -T linker.ld -ffreestanding -O0 -nostdlib
+BUILD := build
+OBJ := $(BUILD)/obj
+ISO := $(BUILD)/iso
+BIN := $(BUILD)/macaroni.bin
+IMAGE := $(BUILD)/macaroni.iso
-boot.o: src/boot.asm
- ${ASM} ${ASM_FLAGS} src/boot.asm -o ${BUILD_OUT}/boot.o
+SRCS := $(shell find src -name '*.c' -o -name '*.asm')
+OBJS := $(SRCS:src/%=$(OBJ)/%.o)
-kernel.o: src/kernel.c
- ${CC} -c src/kernel.c -o ${BUILD_OUT}/kernel.o ${CFLAG}
+LIMINE_FILES := limine-bios-cd.bin limine-bios.sys limine-uefi-cd.bin
-macaroni.bin: boot.o kernel.o
- ${CC} -o ${BUILD_OUT}/macaroni.bin ${BINFLAG} ${BUILD_OUT}/*.o
+.PHONY: all bin demo clean
+all: $(IMAGE)
+bin: $(BIN)
-macaroni.iso: macaroni.bin
- mkdir -p ${BUILD_OUT}/iso
- cp ${BUILD_OUT}/macaroni.bin ${BUILD_OUT}/iso/macaroni.bin
- printf "timeout: 0\n/macaroni\n protocol: multiboot1\n kernel_path: boot():/macaroni.bin\n" > ${BUILD_OUT}/iso/limine.conf
- cp ${LIMINE_SHARE}/limine-bios-cd.bin ${LIMINE_SHARE}/limine-bios.sys ${LIMINE_SHARE}/limine-uefi-cd.bin ${BUILD_OUT}/iso/
- xorriso -as mkisofs -R -r -J -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table \
- --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label \
- ${BUILD_OUT}/iso -o ${BUILD_OUT}/macaroni.iso
- limine bios-install ${BUILD_OUT}/macaroni.iso
+demo: $(IMAGE)
+ $(QEMU) -cdrom $<
-.PHONY: demo
-demo: macaroni.iso
- qemu-system-x86_64 -cdrom ${BUILD_OUT}/macaroni.iso
-
-.PHONY: clean
clean:
- rm -rf ${BUILD_OUT}/**
+ rm -rf $(OBJ) $(ISO) $(BIN) $(IMAGE)
+
+$(OBJ)/%.c.o: src/%.c
+ @mkdir -p $(@D)
+ $(CC) $(CFLAGS) -c $< -o $@
+
+$(OBJ)/%.asm.o: src/%.asm
+ @mkdir -p $(@D)
+ $(AS) $(ASFLAGS) $< -o $@
+
+$(BIN): $(OBJS) linker.ld
+ $(CC) $(LDFLAGS) $(OBJS) -o $@ $(LDLIBS)
+
+$(ISO)/limine.conf:
+ @mkdir -p $(@D)
+ printf 'timeout: 0\n/macaroni\n protocol: multiboot1\n kernel_path: boot():/macaroni.bin\n' > $@
+
+$(IMAGE): $(BIN) $(ISO)/limine.conf
+ cp $(BIN) $(addprefix $(LIMINE)/,$(LIMINE_FILES)) $(ISO)/
+ xorriso -as mkisofs -R -r -J -b limine-bios-cd.bin -no-emul-boot \
+ -boot-load-size 4 -boot-info-table --efi-boot limine-uefi-cd.bin \
+ -efi-boot-part --efi-boot-image --protective-msdos-label \
+ $(ISO) -o $@
+ limine bios-install $@
+
+-include $(OBJS:.o=.d)