BUILD_DIR ?= ./build SRC_DIRS ?= ./src BOOTLOADER_DIR ?= ./asm/boot SRCS := $(shell find $(SRC_DIRS) -name *.cpp -or -name *.c -or -name *.s) OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) DEPS := $(OBJS:.o=.d) INC_DIRS := $(shell find $(SRC_DIRS) -type d) INC_FLAGS := $(addprefix -I,$(INC_DIRS)) CPPFLAGS ?= $(INC_FLAGS) -MMD -MP -g -std=c++17 -Wall # Default makefile target all: os-image run: os-image qemu-system-x86_64 -hda build/os-image.bin # Builds a bootable x86 image that loads the kernel os-image: $(BUILD_DIR)/kernel.bin $(BUILD_DIR)/bootloader.bin cat $(BUILD_DIR)/bootloader.bin $(BUILD_DIR)/kernel.bin > build/os-image.bin # Builds the binary kernel image with the entry prefix $(BUILD_DIR)/kernel.bin: $(BUILD_DIR)/kernel_entry.o $(OBJS) ld -m elf_i386 -o $@ -Ttext 0x1000 --oformat binary $(BUILD_DIR)/kernel_entry.o $(OBJS) # Builds the x86 -> 32-bit bootloader $(BUILD_DIR)/bootloader.bin: $(BOOTLOADER_DIR)/main16.asm cd $(BOOTLOADER_DIR); nasm -f bin -o ../../build/bootloader.bin main16.asm # Builds the kernel entry object file $(BUILD_DIR)/kernel_entry.o: asm/kasm.asm $(MKDIR_P) $(dir $@) cd asm; nasm kasm.asm -f elf -o ../build/kernel_entry.o # Build C++ sources $(BUILD_DIR)/%.cpp.o: %.cpp $(MKDIR_P) $(dir $@) g++ $(CPPFLAGS) $(CXXFLAGS) -m32 -ffreestanding -c $< -o $@ -fno-pie # Build C sources $(BUILD_DIR)/%.c.o: %.c $(MKDIR_P) $(dir $@) gcc $(CFLAGS) $(CXXFLAGS) -m32 -ffreestanding -c $< -o $@ -fno-pie # Clean all build objects .PHONY: clean clean: $(RM) -rf $(BUILD_DIR) -include $(DEPS) MKDIR_P ?= mkdir -p