#  Description: Use make as buildsystem instead of Gradle to
#  avoid a circular dependencies between gradle and native-platform.
#  This is very minimalistic Makefile so it will only work for
#  Debian use case for now.
#  Author: Damien Raude-Morvan <drazzib@debian.org>
#  Adapted for Fedora by: gil cattaneo <puntogil@libero.it>
CXX ?= g++
STRIP ?= strip
JAVA_HOME ?= /usr/lib/jvm/default-java
JOPT_JAR ?= /usr/share/java/joptsimple.jar
JTARGET ?= 1.5
JSOURCE ?= 1.5

IDIR=src/shared/headers
MAINCPPDIR=src/main/cpp
SHAREDCPPDIR=src/shared/cpp
CURSESCPPDIR=src/curses/cpp
JSRCDIR=src/main/java
BUILD=build
IGEN=$(BUILD)/headers
JCLASSESDIR=$(BUILD)/classes
JDOCDIR=$(BUILD)/docs/javadoc
ODIR=$(BUILD)/binaries
JAR=$(BUILD)/native-platform.jar
JAR_ARCH=$(BUILD)/native-platform-linux.jar

INCLUDE=-I$(IDIR) -I$(IGEN) -I/usr/include -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux

_OBJ_STD = freebsd.o generic.o generic_posix.o linux.o osx.o posix.o unix_strings.o win.o
_OBJ_CURSES = curses.o generic.o generic_posix.o osx.o unix_strings.o
OBJ_STD = $(patsubst %,$(ODIR)/%,$(_OBJ_STD))
OBJ_CURSES = $(patsubst %,$(ODIR)/%,$(_OBJ_CURSES))
JAVA_SRC_FILEPATHS = $(shell find $(JSRCDIR) -name "*.java" -print)
JAVA_SRC_NO_INTERNAL_FILEPATHS = $(shell find $(JSRCDIR) -name "*.java" ! -path "*/internal/*" -print)

.PHONY: clean jar javadoc

build: $(ODIR)/libnative-platform.so $(ODIR)/libnative-platform-curses.so jar javadoc

$(ODIR)/libnative-platform.so: $(OBJ_STD)
	$(CXX) -shared -fPIC $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $^
	$(STRIP) $@

$(ODIR)/libnative-platform-curses.so: $(OBJ_CURSES)
	$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -fPIC -o $@ $^ -lcurses
	$(STRIP) $@

$(JCLASSESDIR)/%.class: $(JAVA_SRC_FILEPATHS)
	mkdir -p $(JCLASSESDIR)
	javac -source $(JTARGET) -target $(JSOURCE) -d $(JCLASSESDIR) -classpath $(JOPT_JAR) $(JAVA_SRC_FILEPATHS)

javadoc: $(JAVA_SRC_NO_INTERNAL_FILEPATHS)
	mkdir -p $(JDOCDIR)
	javadoc -d $(JDOCDIR) -classpath $(JOPT_JAR) $(JAVA_SRC_NO_INTERNAL_FILEPATHS)

jar: $(JCLASSESDIR)/%.class
	mkdir -p $(JDOCDIR)
	(cd $(JCLASSESDIR) ; jar cf ../../$(JAR) .)

$(ODIR)/%.o: $(MAINCPPDIR)/*.cpp $(SHAREDCPPDIR)/*.cpp $(CURSESCPPDIR)/*.cpp $(IGEN)/native.h
	mkdir -p $(ODIR)
	$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(INCLUDE) -fPIC -c -o $(ODIR)/curses.o src/curses/cpp/curses.cpp
	$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(INCLUDE) -fPIC -c -o $(ODIR)/freebsd.o src/main/cpp/freebsd.cpp
	$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(INCLUDE) -fPIC -c -o $(ODIR)/linux.o src/main/cpp/linux.cpp
	$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(INCLUDE) -fPIC -c -o $(ODIR)/posix.o src/main/cpp/posix.cpp
	$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(INCLUDE) -fPIC -c -o $(ODIR)/win.o src/main/cpp/win.cpp
	$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(INCLUDE) -fPIC -c -o $(ODIR)/generic.o src/shared/cpp/generic.cpp
	$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(INCLUDE) -fPIC -c -o $(ODIR)/generic_posix.o src/shared/cpp/generic_posix.cpp
	$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(INCLUDE) -fPIC -c -o $(ODIR)/osx.o src/shared/cpp/osx.cpp
	$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(INCLUDE) -fPIC -c -o $(ODIR)/unix_strings.o src/shared/cpp/unix_strings.cpp

$(IGEN)/native.h: $(JCLASSESDIR)/%.class
	mkdir -p $(IGEN)
	javah -o $(IGEN)/native.h -classpath $(JCLASSESDIR) \
	net.rubygrapefruit.platform.internal.jni.NativeLibraryFunctions \
	net.rubygrapefruit.platform.internal.jni.PosixFileFunctions \
	net.rubygrapefruit.platform.internal.jni.PosixFileSystemFunctions \
	net.rubygrapefruit.platform.internal.jni.PosixProcessFunctions \
	net.rubygrapefruit.platform.internal.jni.PosixTerminalFunctions \
	net.rubygrapefruit.platform.internal.jni.TerminfoFunctions \
	net.rubygrapefruit.platform.internal.jni.WindowsConsoleFunctions \
	net.rubygrapefruit.platform.internal.jni.WindowsHandleFunctions \
	net.rubygrapefruit.platform.internal.jni.WindowsRegistryFunctions

clean:
	-rm -rf $(BUILD)
