145 lines
5.5 KiB
Makefile
145 lines
5.5 KiB
Makefile
CFLAGS = -Iinclude -Iefi/inc -ffreestanding -fno-stack-protector -fno-stack-check -fshort-wchar -mno-red-zone -std=c17 -Wwrite-strings -fcf-protection=none
|
|
CXXFLAGS = -Iinclude -Iefi/inc -ffreestanding -fno-stack-protector -fno-stack-check -fshort-wchar -mno-red-zone -maccumulate-outgoing-args -std=c++17 -Wwrite-strings -fcf-protection=none
|
|
LDFLAGS = -shared -Bsymbolic -Tefi/gnuefi/elf_x86_64_efi.lds
|
|
LDLIBS = --no-undefined
|
|
|
|
KERNEL_CXXFLAGS = $(CXXFLAGS) -DGNU_EFI_USE_MS_ABI -fno-pic
|
|
KERNEL_LDFLAGS = -Tkernel/kernel.ld -no-pie -z max-page-size=0x1000
|
|
|
|
EFI_CFLAGS = -Iefi/inc -Iefi/inc/x86_64 -Iefi/inc/protocol \
|
|
-ffreestanding -fno-stack-protector -fno-stack-check \
|
|
-fshort-wchar -mno-red-zone -maccumulate-outgoing-args \
|
|
-fPIC -fno-strict-aliasing -Wall -Wextra -Wstrict-prototypes \
|
|
-DGNU_EFI_USE_MS_ABI -DCONFIG_x86_64 -std=c11 -O2 -g \
|
|
-fcf-protection=none
|
|
|
|
BOOT_OBJ = build/boot.o
|
|
|
|
KERNEL_CPP = kernel/entry.cpp kernel/main.cpp kernel/serial.cpp kernel/fs.cpp \
|
|
kernel/memory/heap.cpp kernel/memory/pmm.cpp \
|
|
kernel/scheduler/scheduler.cpp \
|
|
kernel/interrupt/gdt.cpp kernel/interrupt/idt.cpp \
|
|
kernel/interrupt/pic.cpp kernel/interrupt/pit.cpp \
|
|
kernel/graphics/layer.cpp \
|
|
graphics/context.cpp graphics/draw.cpp \
|
|
fonts/pixel_font.cpp
|
|
KERNEL_ASM = kernel/scheduler/context_switch.S kernel/interrupt/isr.S kernel/interrupt/idt_helpers.S
|
|
KERNEL_OBJ = $(KERNEL_CPP:%.cpp=build/%.o) $(KERNEL_ASM:%.S=build/%.o)
|
|
|
|
EFI_TOP_C = $(wildcard efi/lib/*.c)
|
|
EFI_TOP_S = $(wildcard efi/lib/*.S)
|
|
EFI_X86_C = $(wildcard efi/lib/x86_64/*.c)
|
|
EFI_X86_S = $(wildcard efi/lib/x86_64/*.S)
|
|
EFI_RT_C = $(wildcard efi/lib/runtime/*.c)
|
|
|
|
EFI_CRT0_OBJ = build/efi/gnuefi/crt0-efi-x86_64.o
|
|
EFI_RELOC_OBJ = build/efi/gnuefi/reloc_x86_64.o
|
|
EFI_TOP_OBJ = $(EFI_TOP_C:efi/lib/%.c=build/efi/lib/%.o) $(EFI_TOP_S:efi/lib/%.S=build/efi/lib/%.o)
|
|
EFI_X86_OBJ = $(EFI_X86_C:efi/lib/x86_64/%.c=build/efi/lib/x86_64/%.o) $(EFI_X86_S:efi/lib/x86_64/%.S=build/efi/lib/x86_64/%.o)
|
|
EFI_RT_OBJ = $(EFI_RT_C:efi/lib/runtime/%.c=build/efi/lib/runtime/%.o)
|
|
EFI_OBJ = $(EFI_CRT0_OBJ) $(EFI_RELOC_OBJ) $(EFI_TOP_OBJ) $(EFI_X86_OBJ) $(EFI_RT_OBJ)
|
|
|
|
all: _bd $(EFI_OBJ) $(BOOT_OBJ) $(KERNEL_OBJ)
|
|
@echo "* Linking bootloader..."
|
|
@ld $(LDFLAGS) $(EFI_OBJ) $(BOOT_OBJ) -o build/boot.so $(LDLIBS)
|
|
@objcopy -j .text -j .sdata -j .data -j .rodata -j .dynamic -j .dynsym -j .rel -j .rela -j .rel.* -j .rela.* -j .reloc --output-target efi-app-x86_64 --subsystem=10 build/boot.so build/BOOTX64.EFI
|
|
@echo "* Linking Kernel.elf..."
|
|
@ld $(KERNEL_LDFLAGS) $(KERNEL_OBJ) -o build/Kernel.elf
|
|
@echo "Done."
|
|
|
|
_bd:
|
|
@mkdir -p build/graphics build/kernel build/fonts build/kernel/memory \
|
|
build/kernel/scheduler build/kernel/interrupt build/kernel/graphics \
|
|
build/efi/lib build/efi/lib/x86_64 build/efi/lib/runtime build/efi/gnuefi
|
|
|
|
$(EFI_CRT0_OBJ): efi/gnuefi/crt0-efi-x86_64.S | _bd
|
|
@echo "Compile AS $<"
|
|
@gcc $(EFI_CFLAGS) -c $< -o $@
|
|
|
|
$(EFI_RELOC_OBJ): efi/gnuefi/reloc_x86_64.c | _bd
|
|
@echo "Compile C $<"
|
|
@gcc $(EFI_CFLAGS) -c $< -o $@
|
|
|
|
build/efi/lib/%.o: efi/lib/%.c | _bd
|
|
@echo "Compile C $<"
|
|
@gcc $(EFI_CFLAGS) -c $< -o $@
|
|
|
|
build/efi/lib/%.o: efi/lib/%.S | _bd
|
|
@echo "Compile AS $<"
|
|
@gcc $(EFI_CFLAGS) -c $< -o $@
|
|
|
|
build/efi/lib/x86_64/%.o: efi/lib/x86_64/%.c | _bd
|
|
@echo "Compile C $<"
|
|
@gcc $(EFI_CFLAGS) -c $< -o $@
|
|
|
|
build/efi/lib/x86_64/%.o: efi/lib/x86_64/%.S | _bd
|
|
@echo "Compile AS $<"
|
|
@gcc $(EFI_CFLAGS) -c $< -o $@
|
|
|
|
build/efi/lib/runtime/%.o: efi/lib/runtime/%.c | _bd
|
|
@echo "Compile C $<"
|
|
@gcc $(EFI_CFLAGS) -c $< -o $@
|
|
|
|
build/%.o: %.c
|
|
@echo "Compile C $<"
|
|
@gcc $(CFLAGS) -c $< -o $@
|
|
|
|
build/kernel/%.o: kernel/%.cpp | _bd
|
|
@echo "Compile CPP $<"
|
|
@g++ $(KERNEL_CXXFLAGS) -c $< -o $@
|
|
|
|
build/kernel/memory/%.o: kernel/memory/%.cpp | _bd
|
|
@echo "Compile CPP $<"
|
|
@g++ $(KERNEL_CXXFLAGS) -c $< -o $@
|
|
|
|
build/kernel/scheduler/%.o: kernel/scheduler/%.cpp | _bd
|
|
@echo "Compile CPP $<"
|
|
@g++ $(KERNEL_CXXFLAGS) -c $< -o $@
|
|
|
|
build/kernel/scheduler/%.o: kernel/scheduler/%.S | _bd
|
|
@echo "Compile AS $<"
|
|
@gcc -Iinclude -Iefi/inc -ffreestanding -fno-stack-protector -fno-stack-check \
|
|
-fshort-wchar -mno-red-zone -fcf-protection=none -c $< -o $@
|
|
|
|
build/kernel/interrupt/%.o: kernel/interrupt/%.cpp | _bd
|
|
@echo "Compile CPP $<"
|
|
@g++ $(KERNEL_CXXFLAGS) -c $< -o $@
|
|
|
|
build/kernel/interrupt/%.o: kernel/interrupt/%.S | _bd
|
|
@echo "Compile AS $<"
|
|
@gcc -Iinclude -Iefi/inc -ffreestanding -fno-stack-protector -fno-stack-check \
|
|
-fshort-wchar -mno-red-zone -fcf-protection=none -c $< -o $@
|
|
|
|
build/graphics/%.o: graphics/%.cpp | _bd
|
|
@echo "Compile CPP $<"
|
|
@g++ $(KERNEL_CXXFLAGS) -c $< -o $@
|
|
|
|
build/fonts/%.o: fonts/%.cpp | _bd
|
|
@echo "Compile CPP $<"
|
|
@g++ $(KERNEL_CXXFLAGS) -c $< -o $@
|
|
|
|
vdir: all
|
|
@mkdir -p vdir/EFI/BOOT vdir/sys
|
|
@cp build/BOOTX64.EFI vdir/EFI/BOOT
|
|
@cp build/Kernel.elf vdir/
|
|
@cp -r resources vdir/sys/
|
|
|
|
disk: vdir
|
|
@echo "* Building FAT32 disk image (128 MiB)..."
|
|
@dd if=/dev/zero of=build/disk.img bs=1M count=128 status=none
|
|
@mformat -i build/disk.img -F -T 262144 -h 16 -s 32 ::
|
|
@mmd -i build/disk.img ::/EFI ::/EFI/BOOT ::/sys
|
|
@mcopy -i build/disk.img -s vdir/EFI/BOOT/BOOTX64.EFI ::/EFI/BOOT/
|
|
@mcopy -i build/disk.img -s vdir/Kernel.elf ::/
|
|
@mcopy -i build/disk.img -s vdir/sys/resources ::/sys/
|
|
|
|
run: disk
|
|
@echo "Launching QEMU"
|
|
@qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -net none -drive file=build/disk.img,index=0,format=raw -serial file:serial.log -s -S
|
|
|
|
clean:
|
|
@echo "Cleaning old files"
|
|
@rm -rf build vdir
|
|
|
|
.PHONY: all vdir disk run clean _bd
|