You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.5 KiB

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