117 lines
2.7 KiB
Makefile
117 lines
2.7 KiB
Makefile
SHELL := /bin/bash
|
|
|
|
CC := clang
|
|
ELF_LD := ld.lld
|
|
LD := lld-link
|
|
ARCH ?= x86_64
|
|
|
|
ifeq ($(ARCH),x86_64)
|
|
ARCH_DIR := arch/x86
|
|
EFI_ARCH_TARGET := x86_64-unknown-windows
|
|
KERNEL_ARCH_TARGET := x86_64-unknown-none-elf
|
|
BOOT_EFI_NAME := BOOTX64.EFI
|
|
else
|
|
$(error Unsupported ARCH '$(ARCH)')
|
|
endif
|
|
|
|
BUILD_DIR := build
|
|
EFI_DIR := $(BUILD_DIR)/image/EFI/BOOT
|
|
BOOT_EFI := $(EFI_DIR)/$(BOOT_EFI_NAME)
|
|
BOOT_OBJ := $(BUILD_DIR)/arch/boot/main.obj
|
|
KERNEL_ELF := $(BUILD_DIR)/image/kernel.elf
|
|
KERNEL_OBJS := $(BUILD_DIR)/arch/kernel/entry.o $(BUILD_DIR)/kernel/main.o
|
|
DEBUG_LOG := $(BUILD_DIR)/debug.log
|
|
OVMF_CODE ?= /usr/share/OVMF/OVMF_CODE_4M.fd
|
|
OVMF_VARS_TEMPLATE ?= /usr/share/OVMF/OVMF_VARS_4M.fd
|
|
OVMF_VARS := $(BUILD_DIR)/OVMF_VARS.fd
|
|
|
|
CFLAGS := \
|
|
-target $(EFI_ARCH_TARGET) \
|
|
-ffreestanding \
|
|
-fshort-wchar \
|
|
-mno-red-zone \
|
|
-fno-stack-protector \
|
|
-fno-builtin \
|
|
-Wall \
|
|
-Wextra \
|
|
-Werror \
|
|
-Iinclude \
|
|
-I$(ARCH_DIR)/include
|
|
|
|
KERNEL_CFLAGS := \
|
|
-target $(KERNEL_ARCH_TARGET) \
|
|
-ffreestanding \
|
|
-fno-stack-protector \
|
|
-fno-builtin \
|
|
-fno-pic \
|
|
-mno-red-zone \
|
|
-Wall \
|
|
-Wextra \
|
|
-Werror \
|
|
-Iinclude \
|
|
-I$(ARCH_DIR)/include
|
|
|
|
KERNEL_ASFLAGS := \
|
|
-target $(KERNEL_ARCH_TARGET) \
|
|
-ffreestanding
|
|
|
|
LDFLAGS := \
|
|
/subsystem:efi_application \
|
|
/entry:efi_main \
|
|
/nodefaultlib \
|
|
/dll \
|
|
/machine:x64 \
|
|
/out:$(BOOT_EFI)
|
|
|
|
KERNEL_LDFLAGS := \
|
|
-m elf_x86_64 \
|
|
-nostdlib \
|
|
-T $(ARCH_DIR)/kernel/linker.ld \
|
|
-o $(KERNEL_ELF)
|
|
|
|
.PHONY: all clean run run-headless dirs
|
|
|
|
all: $(BOOT_EFI) $(KERNEL_ELF)
|
|
|
|
dirs:
|
|
mkdir -p $(BUILD_DIR)/arch/boot $(BUILD_DIR)/arch/kernel $(BUILD_DIR)/kernel $(EFI_DIR)
|
|
|
|
$(BOOT_OBJ): $(ARCH_DIR)/boot/main.c $(ARCH_DIR)/include/efi.h include/tianole/boot_info.h include/tianole/elf.h | dirs
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
$(BOOT_EFI): $(BOOT_OBJ) | dirs
|
|
$(LD) $(LDFLAGS) $<
|
|
|
|
$(BUILD_DIR)/arch/kernel/entry.o: $(ARCH_DIR)/kernel/entry.S | dirs
|
|
$(CC) $(KERNEL_ASFLAGS) -c $< -o $@
|
|
|
|
$(BUILD_DIR)/kernel/main.o: kernel/main.c include/tianole/boot_info.h | dirs
|
|
$(CC) $(KERNEL_CFLAGS) -c $< -o $@
|
|
|
|
$(KERNEL_ELF): $(KERNEL_OBJS) $(ARCH_DIR)/kernel/linker.ld | dirs
|
|
$(ELF_LD) $(KERNEL_LDFLAGS) $(KERNEL_OBJS)
|
|
|
|
$(OVMF_VARS): | dirs
|
|
cp $(OVMF_VARS_TEMPLATE) $@
|
|
|
|
run: $(BOOT_EFI) $(OVMF_VARS)
|
|
qemu-system-x86_64 \
|
|
-drive if=pflash,format=raw,readonly=on,file=$(OVMF_CODE) \
|
|
-drive if=pflash,format=raw,file=$(OVMF_VARS) \
|
|
-drive format=raw,file=fat:rw:$(BUILD_DIR)/image
|
|
|
|
run-headless: $(BOOT_EFI) $(OVMF_VARS)
|
|
rm -f $(DEBUG_LOG)
|
|
qemu-system-x86_64 \
|
|
-display none \
|
|
-nodefaults \
|
|
-no-reboot \
|
|
-drive if=pflash,format=raw,readonly=on,file=$(OVMF_CODE) \
|
|
-drive if=pflash,format=raw,file=$(OVMF_VARS) \
|
|
-drive format=raw,file=fat:rw:$(BUILD_DIR)/image \
|
|
-debugcon file:$(DEBUG_LOG) \
|
|
-global isa-debugcon.iobase=0xe9
|
|
|
|
clean:
|
|
rm -rf $(BUILD_DIR)
|