export CC = i686-elf-gcc
export AS = i686-elf-as
export LD = i686-elf-ld

ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))

KERN_SOURCES := $(shell find kernel/ -name \*.c)
MOD_SOURCES := $(shell find mod/ -name \*.c)

export COMMON = -ffreestanding -O2
export WARNINGS = -std=gnu90 -Wall -Wextra -Wpedantic -Werror
export OFLAGS = -I$(ROOT_DIR)/include

QEMUFLAGS = -kernel pgos_kern
QEMUDBGFLAGS = -d int -no-shutdown -no-reboot

# The actual build

.PHONY: run
run-debug: pgos_kern
	qemu-system-x86_64 $(QEMUFLAGS) $(QEMUDBGFLAGS)

.PHONY: run
run: pgos_kern
	qemu-system-x86_64 $(QEMUFLAGS)

pgos_kern: lkernel.o boot.o intr.o
	$(CC) -o $@ boot.o intr.o lkernel.o $(COMMON) -T linker.ld -nostdlib -lgcc

lkernel.o: $(KERN_SOURCES)
	$(CC) -o $@ $(KERN_SOURCES) $(MOD_SOURCES) $(COMMON) $(WARNINGS) $(OFLAGS) -nostdlib -lgcc -r

boot.o: kernel/boot.S
	$(AS) -o boot.o kernel/boot.S

intr.o: kernel/intr.S
	$(AS) -o intr.o kernel/intr.S

# Cross compiler

.PHONY: toolchain-debug
toolchain-debug: gdb gcc
	rm -rf src

	@echo "Installed gcc, libgcc, gdb and binutils. Enjoy your cross compiler, in $$HOME/opt/cross/bin!"

.PHONY: toolchain
toolchain: binutils gcc
	rm -rf src

	@echo "Installed gcc, libgcc and binutils. Enjoy your cross compiler, in $$HOME/opt/cross/bin!"

.PHONY: binutils
binutils:
	scripts/binutils.sh

.PHONY: gdb
gdb: binutils
	scripts/gdb.sh

.PHONY: gcc
gcc: binutils
	scripts/gcc.sh

# Misc
.PHONY: clean
clean:
	rm -rf *.o *.o.tmp # Intermediate objects
	rm -rf pgos_romfs # If romfs building failed
	cd mod && $(MAKE) clean # More trash in subdirectories

.PHONY: fullclean
fullclean: clean
	rm -rf pgos_kern pgos-romfs
