
# Makefile for the JNI to the LTI library.
# You need the variable AXIOMROOT set to where the root of the
# Axiom source tree is. The Java source files are expected in
# $(AXIOMROOT)/java/sources/de/rwth_aachen/techinfo/ltilib
# You also need to manually create a link for jniVector.h and
# jniMatrix.h (This should be done automatically).
# For the JNI to work, you have to add the directories in which
# liblti.so and libltiMatrix.so and libltiVector.so reside to
# your LD_LIBRARY_PATH.
# $Id: Makefile,v 1.37 2003/02/25 16:22:30 wickel Exp $

include config.mk

RELEASE = YES

# For new versions of gcc, <limits> already exists, but in older
# versions a replacement is needed
CC_MAJOR:=$(shell echo `$(CC) --version | sed -e 's/\..*//;'`)

ifeq "$(CC_MAJOR)" "2"
  VPATHADDON=:_/linux/g++
else
  VPATHADDON=
endif

VPATHADDON += :_/misc/lamath

# Directories with source file code (.h and .cpp)

VPATH:=_/src/basics:_/src/math:_/src/imgProc:_/src/io:_/src/ioBasics:_/src/io/png:_/src/io/jpeg:_/src/viewer:_/src/system:_/src/classifiers:_/linux/workbench$(VPATHADDON)

LTIJAVASRC = $(LTISRC)/de/rwth_aachen/techinfo/ltilib

#USELAPACK = YES

#include ../../lamath/LApack.inc

CXXINCLUDE = -I. $(patsubst %,-I%,$(patsubst _/%,$(LTIBASE)/%,$(subst :, ,$(VPATH))))

JNISRC = $(wildcard *.cpp)
JNIHEADERS = $(wildcard jni*.h)
JNILIBSRC = $(patsubst %.h,%.cpp,$(JNIHEADERS))

CXXFLAGSDEB = -c -g -march=i686 -mcpu=i686 -Wall -ansi -Wundef -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_REENTRANT -D_DEBUG -fpic
CXXFLAGSREL = -c -O3 -march=i686 -mcpu=i686 -Wall -ansi -Wundef -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_REENTRANT -DNDEBUG -fpic

ifeq "$(RELEASE)" "YES"
LTIOBJDIR = $(LTIBASE)/obj/release
LTILIB = ltinvr
LTILIBFILE = $(LTIBASE)/lib/libltimathr.a
#LAMATHLIB = ltilamathr
#LAMATHLIBFILE = $(LTIBASE)/lib/libltilamathr.a
CXXFLAGS=$(CXXFLAGSREL)
else
LTIOBJDIR = $(LTIBASE)/obj/debug
LTILIB = ltinvd
LTILIBFILE = $(LTIBASE)/lib/libltimathd.a
#LAMATHLIB = ltilamathd
#LAMATHLIBFILE = $(LTIBASE)/lib/libltilamathd.a
CXXFLAGS=$(CXXFLAGSDEB)
endif

CC = @echo "Compiling $< " ; g++ $(CXXFLAGS) $(CXXINCLUDE) $(JNIINCLUDE)
LN = @echo "Linking $@ " ; g++  -shared -L$(LTIBASE)/lib

all: jniltilib

dep: javacode
	gcc -MM $(CXXINCLUDE) -I.. $(JNIINCLUDE) $(JNISRC) > Dependencies

clean:
	rm $(TARGETDIR)/*.so *.o jni*.h

javacode:
	cd $(LTIJAVASRC) && make -k all || true

EXTRAOBJS =
EXTRALIBS = -lpthread

# JNI build targets

TARGETS = libltiInterface.so
STATICTARGETS = libltiInterface.a
TARGETDIR = ../lib

TARGETFILES = $(patsubst %,$(TARGETDIR)/%,$(TARGETS))
STATICTARGETFILES = $(patsubst %,$(TARGETDIR)/%,$(STATICTARGETS))

JNIOBJFILES = $(patsubst %.cpp,%.o,$(JNILIBSRC))

jniltilib: javacode $(JNILIBSRC) $(JNIHEADERS) $(TARGETFILES) $(STATICTARGETFILES)

# compile rule
%.o: %.cpp
	$(CC) -o $@ $<

$(TARGETFILES): $(TARGETDIR)/liblti%.so: $(JNIOBJFILES) mathObject.o libBase.o $(LTILIBFILE)
	$(LN) -o $@ $(JNIOBJFILES) mathObject.o libBase.o $(EXTRAOBJS) -L.. $(EXTRALIBS) -l$(LTILIB) $(LIBS)

# do a static link so clients may include the interface into their own
# shared libraries
$(STATICTARGETFILES): $(TARGETDIR)/liblti%.a: $(JNIOBJFILES) mathObject.o libBase.o $(LTILIBFILE)
	ar rs $@ $(JNIOBJFILES) mathObject.o libBase.o $(EXTRAOBJS)

# $(TARGETFILES): $(TARGETDIR)/liblti%.so: jni%.o mathObject.o libBase.o $(LAMATHLIBFILE)
# 	$(LN) -o $@ $< mathObject.o libBase.o $(EXTRAOBJS) -L.. -l$(LAMATHLIB) $(EXTRALIBS)



#$(TARGETDIR)/libltiMatrix.so: jniMatrix.o mathObject.o libBase.o $(MATHLIBFILE)
#	$(LN) $(TARGETDIR)/libltiMatrix.so jniMatrix.o mathObject.o libBase.o \
#        -L.. -l$(MATHLIB)

$(JNILIBSRC): %.cpp: %.h
	checkImpl $*

#jniMatrix.cpp: jniMatrix.h
#	checkImpl jniMatrix

# $(JNIHEADERS): jni%.h: $(LTIJAVASRC)/%.java
# 	cd $(LTIJAVASRC) && make -k all

#jniMatrix.h: $(LTIJAVASRC)/Matrix.java
#	cd $(LTIJAVASRC) && make $(PWD)/jniMatrix.h

#jniMatrix.o: jniMatrix.h jniMatrix.cpp ../math/ltiMatrix.h mathObject.h 
#	$(CC) jniMatrix.cpp


# dependencies for libltiVector.so

# $(TARGETDIR)/libltiVector.so: jniVector.o mathObject.o libBase.o $(MATHLIBFILE)
# 	$(LN) $(TARGETDIR)/libltiVector.so jniVector.o mathObject.o libBase.o \
# 	-L.. -l$(MATHLIB)

# jniVector.cpp: jniVector.h
# 	checkImpl jniVector

# jniVector.h: $(LTIJAVASRC)/Vector.java
# 	cd $(LTIJAVASRC) && make $(PWD)/jniVector.h

# dependencies for libltiRectLocation.so

# $(TARGETDIR)/libltiRectLocation.so: jniRectLocation.o mathObject.o libBase.o $(MATHLIBFILE) \
#                  $(LTIOBJDIR)/ltiLocation.o
# 	$(LN) $(TARGETDIR)/libltiRectLocation.so jniRectLocation.o mathObject.o libBase.o \
# 	$(LTIOBJDIR)/ltiLocation.o -L.. -l$(MATHLIB)

# jniRectLocation.cpp: jniRectLocation.h
# 	checkImpl jniRectLocation

# jniRectLocation.h: $(LTIJAVASRC)/RectLocation.java
# 	cd $(LTIJAVASRC) && make $(PWD)/jniRectLocation.h


#jniVector.o: jniVector.h jniVector.cpp ../math/ltiVector.h mathObject.h
#	$(CC) jniVector.cpp




# dependencies for libltiLAFunctors.so

# $(TARGETDIR)/libltiLAFunctors.so: jniLAFunctors.o libBase.o $(LAMATHLIBFILE) \
#         $(LTIOBJDIR)/ltiTimer.o
# 	$(LN) $(TARGETDIR)/libltiLAFunctors.so jniLAFunctors.o \
#         libBase.o $(LTIOBJDIR)/ltiTimer.o $(LTIOBJDIR)/ltiMutex.o \
#         -L.. -l$(LAMATHLIB) -lpthread

# jniLAFunctors.h: $(LTIJAVASRC)/LAFunctors.java
# 	cd $(LTIJAVASRC) && make $(PWD)/jniLAFunctors.h

# jniLAFunctors.cpp: jniLAFunctors.h
# 	checkImpl jniLAFunctors

#jniLAFunctors.o: jniLAFunctors.h jniLAFunctors.cpp \
#	../math/ltiLinearAlgebraFunctor.h \
#        ../math/ltiLinearAlgebraFunctor_template.h functorCollection.h \
#        ../math/ltiMatrix
#	libBase.h
#	$(CC) jniLAFunctors.cpp


# dependencies for libltiStatFunctors.so

# $(TARGETDIR)/libltiStatFunctors.so: jniStatFunctors.o libBase.o \
#                        $(LAMATHLIBFILE) \
#                        $(LTIOBJDIR)/ltiMutex.o
# 	$(LN) $(TARGETDIR)/libltiStatFunctors.so jniStatFunctors.o \
#                        $(LTIOBJDIR)/ltiMutex.o \
# 	libBase.o -L.. -l$(LAMATHLIB) -lpthread

# jniStatFunctors.h: $(LTIJAVASRC)/StatFunctors.java
# 	cd $(LTIJAVASRC) && make $(PWD)/jniStatFunctors.h

# jniStatFunctors.cpp: jniStatFunctors.h
# 	checkImpl jniStatFunctors


# dependencies for libltiUnaryFunctors.so

# $(TARGETDIR)/libltiUnaryFunctors.so: functorCollection.o jniUnaryFunctors.o libBase.o \
#                         $(MATHLIBFILE)
# 	$(LN) $(TARGETDIR)/libltiUnaryFunctors.so functorCollection.o jniUnaryFunctors.o \
# 	libBase.o -L.. -l$(MATHLIB)

# jniUnaryFunctors.h: $(LTIJAVASRC)/UnaryFunctors.java
# 	cd $(LTIJAVASRC) && make $(PWD)/jniUnaryFunctors.h

# jniUnaryFunctors.cpp: jniUnaryFunctors.h
# 	checkImpl jniUnaryFunctors

#jniUnaryFunctors.o: jniUnaryFunctors.h jniUnaryFunctors.cpp \
#                    libBase.h functorCollection.h \
#                    ../math/ltiScalarFunctor.h \
#                    ../math/ltiScalarFunctor_template.h
#	$(CC) jniUnaryFunctors.cpp


# dependencies for libltiIteratingFunctors.so

# $(TARGETDIR)/libltiIteratingFunctors.so: iterCollection.o jniIteratingFunctors.o \
#                             libBase.o $(MATHLIBFILE)
# 	$(LN) $(TARGETDIR)/libltiIteratingFunctors.so iterCollection.o \
# 	jniIteratingFunctors.o libBase.o -L.. -l$(MATHLIB)

# jniIteratingFunctors.h: $(LTIJAVASRC)/IteratingFunctors.java
# 	cd $(LTIJAVASRC) && make $(PWD)/jniIteratingFunctors.h

# jniIteratingFunctors.cpp: jniIteratingFunctors.h
# 	checkImpl jniIteratingFunctors

#jniIteratingFunctors.o: jniIteratingFunctors.h jniIteratingFunctors.cpp \
#                        ../math/ltiIteratingFunctor.h \
#                        #../math/ltiIteratingFunctor_template.h \
#                        functorCollection.h libBase.h
#	$(CC) jniIteratingFunctors.cpp

#functorCollection.o: functorCollection.cpp functorCollection.h
#	$(CC) functorCollection.cpp

include Dependencies


debug:
	@echo "LTIBASE = $(LTIBASE)" ; \
        echo "VPATH = $(VPATH)" ; \
        echo "LAPACKLIB = $(LAPACKLIB)" ; \
        echo "LAPACKDIR = $(LAPACKDIR)" ; \
        echo "LAPACKDEFS = $(LAPACKDEFS)" ; \
        echo "CXXINCLUDE = $(CXXINCLUDE)"








