CXXFLAGS = -std=gnu++11 -lstdc++ $(CFLAGS) $(do-sys-includes)
CFLAGS = $(autodepend) -g -Wall -Wno-pointer-arith
ASFLAGS = -g

sys-includes = $(jdkbase)/include $(jdkbase)/include/linux
autodepend = -MD $(@.o=.d) -MT $@

do-sys-includes = $(foreach inc, $(sys-includes), -isystem $(inc))

all: loader.bin

loader.bin: arch/x64/boot32.o arch/x64/loader32.ld
	$(LD) -nostartfiles -static -nodefaultlibs -o $@ \
	    $(filter-out %.bin, $(^:%.ld=-T %.ld))

arch/x64/boot32.o: loader.elf

fs = fs/fs.o fs/bootfs.o bootfs.o

drivers = drivers/vga.o drivers/console.o
drivers += $(fs)
drivers += mmu.o
drivers += elf.o

objects = exceptions.o
objects += entry.o
objects += mutex.o
objects += pthread.o

libc = libc/string/strcmp.o

libstdc++.a = $(shell $(CXX) -static -print-file-name=libstdc++.a)
libsupc++.a = $(shell $(CXX) -static -print-file-name=libsupc++.a)
libgcc_s.a = $(shell $(CXX) -static -print-libgcc-file-name)

loader.elf: arch/x64/boot.o arch/x64/loader.ld loader.o runtime.o $(drivers) \
        $(objects) dummy-shlib.so \
		$(libc) bootfs.bin
	$(LD) -o $@ \
		-Bdynamic --export-dynamic \
	    $(filter-out %.bin, $(^:%.ld=-T %.ld)) \
	    $(libstdc++.a) $(libsupc++.a) $(libgcc_s.a) libunwind.a

dummy-shlib.so: dummy-shlib.o
	$(CXX) -nodefaultlibs -shared -o $@ $^

jdk-jni.h := $(shell rpm -ql java-1.7.0-openjdk-devel | grep include/jni.h$$)
jdkbase := $(jdk-jni.h:%/include/jni.h=%)

bootfs.bin: scripts/mkbootfs.py bootfs.manifest
	scripts/mkbootfs.py -o $@ -d $@.d -m bootfs.manifest \
		-D jdkbase=$(jdkbase)

bootfs.o: bootfs.bin

runtime.o: ctype-data.h

ctype-data.h: gen-ctype-data
	./gen-ctype-data > $@

clean:
	find -name '*.[od]' | xargs rm
	rm -f loader.elf loader.bin

-include $(shell find -name '*.d')