#-------------------------------------------------------------------------------
# Define Program, Program Directory, Program Version, Install Directories, and
# Target Names ... set mode to default (empty)
#-------------------------------------------------------------------------------
PROGRAM				= SLBM_JNI
PROG_NAM			= SLBM_JNI

JSOURCE_DIR			= gov/sandia/gnem/slbmjni/
CCSOURCE_DIR		= cc/src/
CCINCLUDE_DIR		= cc/include/

JNIINCLUDE_DIR		= ${JAVA_HOME}/include
SLBMINCLUDE_DIR		= ../SLBM/include

LIB_DIR				= ../lib/
CLASSPATH_DIR		= src/gov/sandia/gnem/slbmjni/

CCSOURCES			= cc/src/pglJavaUtil.cc \
						cc/src/SlbmInterfaceJNI.cc


CCOBJECTS			= pglJavaUtil.o \
					SlbmInterfaceJNI.o

CV = @

# Determine OS
OS := $(shell uname -s)
ifeq (${OS},Linux)
	OS = linux
endif
ifeq (${OS},Darwin)
	OS = darwin
endif
ifeq (${OS},SunOS)
	OS = sunos
endif

# OS-specific compiler variables
ifeq ($(OS),sunos)   
	CC = CC
	CCFLAGS = -Kpic -xO5 -dalign -fns -fsimple=2 -ftrap=%none
	JNIINCLUDEOS_DIR = ${JAVA_HOME}/include/solaris 
	COMMAND = ${CV} ${CC} -G -Bdynamic -o ${LIB_DIR}libslbmjni.so -L${LIB_DIR} -lslbm -lm -lCrun -lCstd ${CCOBJECTS}
	VERSION_FLAG = -V
endif
ifeq ($(OS),linux)
	CC = gcc
	CCFLAGS = -fPIC -O3 -ffast-math -fno-trapping-math
	JNIINCLUDEOS_DIR = ${JAVA_HOME}/include/linux
	COMMAND = ${CV} ${CC} -shared -o ${LIB_DIR}libslbmjni.so -L${LIB_DIR} -lslbm -lm -lstdc++ ${CCOBJECTS}
	VERSION_FLAG = --version
endif
ifeq ($(OS),darwin)
	CC = gcc
	JNIINCLUDEOS_DIR = ${JAVA_HOME}/include
	COMMAND = ${CV} ${CC} -dynamiclib -o ${LIB_DIR}libslbmjni.jnilib -L${LIB_DIR} -lslbm -lm -lstdc++ ${CCOBJECTS}
	VERSION_FLAG = --version
endif

#-------------------------------------------------------------------------------
# targets
#-------------------------------------------------------------------------------

# build the c++ jni library and the java jar file.
all : info slbmjnilib cleanobjs  javajar done

pglJavaUtil.o :
	${CV} echo "Compiling pglJavaUtil.cc"
	${CV} ${CC} ${CCFLAGS} -I${CCINCLUDE_DIR} -I${JNIINCLUDE_DIR} -I${JNIINCLUDEOS_DIR} -I${SLBMINCLUDE_DIR} -c ${CCSOURCE_DIR}pglJavaUtil.cc
	${CV} echo ""

SlbmInterfaceJNI.o:
	${CV} echo "Compiling SlbmInterfaceJNI.cc"
	${CV} ${CC} ${CCFLAGS} -I${CCINCLUDE_DIR} -I${JNIINCLUDE_DIR} -I${JNIINCLUDEOS_DIR} -I${SLBMINCLUDE_DIR} -c ${CCSOURCE_DIR}SlbmInterfaceJNI.cc
	${CV} echo ""

# build the c++ jni library but not the java jar file.
slbmjni : info slbmjnilib cleanobjs done

slbmjnilib: ${CCOBJECTS}
	${CV} echo "building shared library libslbmjni.so"
	${COMMAND}

cleanobjs :
	${CV} echo "removing object files"
	rm -f pglJavaUtil.o
	rm -f SlbmInterfaceJNI.o
	${CV} echo ""

# build the java jar file.
 javajar:
	${CV} echo "Building slbmjni.jar file"
	@ cd java/SlbmInterface/src; \
	javac -classpath ${CLASSPATH_DIR} ${JSOURCE_DIR}GreatCircleData.java \
	${JSOURCE_DIR}GridProfile.java \
	${JSOURCE_DIR}GridWeight.java \
	${JSOURCE_DIR}QueryProfile.java \
	${JSOURCE_DIR}ZhaoParameters.java \
	${JSOURCE_DIR}SLBMException.java \
	${JSOURCE_DIR}QueryNeighborInfo.java \
	${JSOURCE_DIR}SlbmInterface.java;
	@ cd java/SlbmInterface/src; \
	jar -cf ../../../../lib/slbmjni.jar ${JSOURCE_DIR}SLBMException.class ${JSOURCE_DIR}GridProfile.class ${JSOURCE_DIR}QueryProfile.class \
	${JSOURCE_DIR}ZhaoParameters.class ${JSOURCE_DIR}SLBMException.class ${JSOURCE_DIR}SlbmInterface.class ${JSOURCE_DIR}GridWeight.class \
	${JSOURCE_DIR}GreatCircleData.class ${JSOURCE_DIR}QueryNeighborInfo.class
	@ rm -f GreatCircleData.class
	@ rm -f GridProfile.class
	@ rm -f GridWeight.class
	@ rm -f QueryProfile.class
	@ rm -f ZhaoParameters.class
	@ rm -f SLBMException.class
	@ rm -f SlbmInterface.class
	@ rm -f QueryNeighborInfo.class
	${CV} echo ""

info :
	@ echo "========================================="
	@ echo "Building" $(PROG_NAM) "on" $(OS)
	@ $(CC) $(VERSION_FLAG)
	$(CV) echo JAVA_HOME = $(JAVA_HOME)
	$(CV) java -version
	@ echo ""

done :
	@echo "Done building" $(PROG_NAM)
	@ echo ""
