######################################################################
#
# Makefile for SOSlib Java binding (2009-07-14)
# (written by Akiya Jouraku <jouraku@bio.keio.ac.jp> )
# (modified by Akira Funahashi <funa@bio.keio.ac.jp> )
#
# * OS
#   + MacOSX
#   + Linux
#
# * required softwares
#   + SWIG 1.3.33 or later
#   + SOSlib CVS HEAD 2008-05-12 or later 
#     (the latest CVS HEAD may not be wrapped by SWIG)
#   + libSBML 3.1.1 or later
#   + Sundials 2.3.0 or later
#   + JDK 
#
######################################################################

DEBUG=

######################################################################
#
# Change paths below for your environment.
#
######################################################################

#SWIG=/usr/bin/swig  # Linux
SWIG=/opt/local/bin/swig # MacOSX
SOSLIB_PACKAGE=org.sbml.soslib
SOSLIB_PATH=`echo ${SOSLIB_PACKAGE} | sed 's,\.,/,g'`

SOSLIB_BASE=/usr/local/soslib
SOSLIB_INCLUDE=${SOSLIB_BASE}/include
SOSLIB_LIB=${SOSLIB_BASE}/lib

LIBSBML_BASE=/usr/local/libsbml341
LIBSBML_INCLUDE=${LIBSBML_BASE}/include
LIBSBML_LIB=${LIBSBML_BASE}/lib

SUNDIAL_BASE=/usr/local/sundials230
SUNDIAL_INCLUDE=${SUNDIAL_BASE}/include
SUNDIAL_LIB=${SUNDIAL_BASE}/lib

#JAVA_BASE=/usr/local/jdk15/
JAVA_BASE=/usr/lib/jvm/java-1.6.0-openjdk
JAVA_INCLUDE=${JAVA_BASE}/include
#JAVA_BASE=/System/Library/Frameworks/JavaVM.framework/Versions/Current
#JAVA_INCLUDE=${JAVA_BASE}/Headers

######################################################################

srcdir=.
objfiles=soslib_wrap.o
java_path=java-files/${SOSLIB_PATH}
javafiles=$(wildcard $(java_path)/*.java)

OBJEXT=o

#
# for MacOS_X (used for generating a universal binary)
#
#ARCH_FLAG=-arch i386 -arch x86_64
#ARCH_FLAG=-arch ppc

CXX=g++
CPPFLAGS=-Wall -g -O2 -fno-strict-aliasing ${ARCH_FLAG}
INCLUDES= -I. -I${SOSLIB_INCLUDE} -I${LIBSBML_INCLUDE} -I${JAVA_INCLUDE} -I${SUNDIAL_INCLUDE}
LDFLAGS=-L${SOSLIB_LIB} -L${LIBSBML_LIB} -L${SUNDIAL_LIB} ${ARCH_FLAG}
#LIBS=-lsbml ${SOSLIB_LIB}/libODES.a -lsundials_cvodes -lsundials_ida -lsundials_kinsol -lsundials_nvecserial
#LIBS=-lsbml -lODES -lsundials_cvodes -lsundials_ida -lsundials_kinsol -lsundials_nvecserial
LIBS=-lsbml ${SOSLIB_LIB}/libODES.a ${SUNDIAL_LIB}/libsundials_cvodes.a ${SUNDIAL_LIB}/libsundials_ida.a ${SUNDIAL_LIB}/libsundials_kinsol.a ${SUNDIAL_LIB}/libsundials_nvecserial.a

######################################################################

HOST_TYPE=$(shell uname -s)

ifeq "$(HOST_TYPE)" "Darwin"
  #
  # MacOS_X
  #
	ARCH_FLAG=-arch i386 -arch x86_64
	JNIEXT=jnilib
  platform_link_flags = -bundle
  INSTALL_NAMETOOL=install_name_tool
	JAVA_BASE=/System/Library/Frameworks/JavaVM.framework/Versions/Current
	JAVA_INCLUDE=${JAVA_BASE}/Headers
else
ifeq "$(HOST_TYPE)" "Linux"
  #
  # Linux
  #
  JNIEXT=so
  platform_link_flags = -shared
  extra_CPPFLAGS=-I${JAVA_INCLUDE}/linux
  LDFLAGS+=-Wl,-rpath,.
endif
endif

# Here follow the generic compilation commands.  (Note: the use of 'sort'
# here is only to remove duplicates, which the 'sort' function does as a
# documented side-effect.)

cxxcompile ?= $(CXX) $(FPIC) $(CPPFLAGS) $(extra_CPPFLAGS) \
        $(CXXFLAGS) $(extra_CXXFLAGS) $(INCLUDES)

define link_shared_lib
    $(CXX) $(LDFLAGS) $(extra_LDFLAGS) $(platform_link_flags) \
        -o $(1) $(objfiles) $(extra_LIBS) $(LIBS)
endef

##########################

SLIB_NAME=libSOSlibJava
SLIB_JAR=SOSlib.jar

all : ${SLIB_NAME}.$(JNIEXT) ${SLIB_JAR} ${INSTALL_NAMETOOL}

${SLIB_NAME}.$(JNIEXT) : $(objfiles)
	$(call link_shared_lib,$@)

soslib_wrap.cpp : soslib.i
	mkdir -p java-files/${SOSLIB_PATH}
	${DEBUG} ${SWIG} -I../swig ${INCLUDES} -c++ -java -package ${SOSLIB_PACKAGE} -outdir java-files/${SOSLIB_PATH} -o soslib_wrap.cpp soslib.i

.cpp.$(OBJEXT) .cxx.$(OBJEXT):
	$(cxxcompile) -c -o $@ $<
#	$(cxxcompile) -MT $@ -MD -MP -c -o $@ $<    # Linux

${SLIB_JAR} : ${java_files}
	javac -classpath ${java_path} ${java_path}/*.java
	(cd java-files; jar cvf ../$@ ${SOSLIB_PATH}/*.class)

install_name_tool: ${SLIB_NAME}.${JNIEXT}
	install_name_tool -change ../libsbml.dylib ./libsbml.dylib ${SLIB_NAME}.${JNIEXT}


clean:
	-rm soslib_wrap.cpp
	-rm soslib_wrap.o
	-rm ${SLIB_NAME}.${JNIEXT}
	-rm ${SLIB_JAR}
	-rm -rf java-files

