tianole/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)