DEFAULT_TARGET!=../echo-default-target.sh
TARGET?=$(DEFAULT_TARGET)
TARGETARCH!=../target_to_arch.sh $(TARGET)

CFLAGS?=-O2 -g
CPPFLAGS?=
LDFLAGS?=
LIBS?=

DESTDIR?=
PREFIX?=/usr/local
EXEC_PREFIX?=$(PREFIX)
BOOTDIR?=$(EXEC_PREFIX)/boot
INCLUDEDIR?=$(PREFIX)/include

CFLAGS:=$(CFLAGS) -ffreestanding -Wall -Wextra
CPPFLAGS:=$(CPPFLAGS) -D__is_kernel -Iinclude
LDFLAGS:=$(LDFLAGS)
LIBS:=$(LIBS) -nostdlib -lk -lgcc

ARCHDIR=arch/$(TARGETARCH)

include $(ARCHDIR)/make.config

CFLAGS:=$(CFLAGS) $(KERNEL_ARCH_CFLAGS)
CPPFLAGS:=$(CPPFLAGS) $(KERNEL_ARCH_CPPFLAGS)
LDFLAGS:=$(LDFLAGS) $(KERNEL_ARCH_LDFLAGS)
LIBS:=$(LIBS) $(KERNEL_ARCH_LIBS)

KERNEL_OBJS=\
						$(KERNEL_ARCH_OBJS) \
						kernel/kernel.o \

OBJS=\
		 $(ARCHDIR)/crti.o \
		 $(ARCHDIR)/crtbegin.o \
		 $(KERNEL_OBJS) \
		 $(ARCHDIR)/crtend.o \
		 $(ARCHDIR)/crtn.o \

LINK_LIST=\
					$(LDFLAGS) \
					$(ARCHDIR)/crti.o \
					$(ARCHDIR)/crtbegin.o \
					$(KERNEL_OBJS) \
					$(LIBS) \
					$(ARCHDIR)/crtend.o \
					$(ARCHDIR)/crtn.o \

.PHONY: all clean install install-headers install-kernel
.SUFFIXES: .o .c .S .asm

all: sillyos.kernel

sillyos.kernel: $(OBJS) $(ARCHDIR)/linker.ld
	$(CC) -T $(ARCHDIR)/linker.ld -o $@ $(CFLAGS) $(LINK_LIST)
	grub-file --is-x86-multiboot $@

$(ARCHDIR)/crtbegin.o $(ARCHDIR)/crtend.o:
	OBJ=`$(CC) $(CFLAGS) $(LDFLAGS) -print-file-name=$(@F)` && cp "$$OBJ" $@

.c.o:
	$(CC) -MD -c $< -o $@ -std=gnu11 $(CFLAGS) $(CPPFLAGS)

.S.o:
	$(CC) -MD -c $< -o $@ $(CFLAGS) $(CPPFLAGS)

.asm.o:
	$(NASM) -f elf32 $< -o $@ 

clean:
	rm -f sillyos.kernel
	rm -f $(OBJS) *.o */*.o */*/*.o
	rm -f $(OBJS:.o=.d) *.d */*.d */*/*.d

install: install-headers install-kernel

install-headers:
	mkdir -p $(DESTDIR)$(INCLUDEDIR)
	cp -R --preserve=timestamps include/. $(DESTDIR)$(INCLUDEDIR)/.

install-kernel: sillyos.kernel
	mkdir -p $(DESTDIR)$(BOOTDIR)
	cp sillyos.kernel $(DESTDIR)$(BOOTDIR)

-include $(OBJS:.o=.d)
