# $Id: makefile,v 1.16 2003/09/23 16:54:29 pcharles Exp $
#
#   package net.sourceforge.jpcap.capture
#
PKG = net.sourceforge.jpcap.capture
PKG_DIR = $(subst .,/, $(PKG))
PKG_UND = $(subst .,_, $(PKG))
REL = ../../../..
include ${MAKE_HOME}/os.makefile
include ${MAKE_HOME}/rules.makefile

WRAPPER = PacketCapture

JAVA = \
	PacketCaptureCapable \
	PacketCaptureBase \
	PacketDispatchCapable \
	PacketDispatcher \
	PacketHandler \
	$(WRAPPER) \
	CaptureTest \
	\
	PacketListener \
	RawPacketListener \
	CaptureStatistics \
	\
	CaptureConfigurationException \
	CaptureDeviceInvalidException \
	CaptureDeviceLookupException \
	CaptureDeviceNotFoundException \
	CaptureDeviceOpenException \
	CaptureFileOpenException \
	CapturePacketException \
	InvalidFilterException


JAVA_SOURCE = $(addsuffix .java, $(JAVA))
JAVA_CLASSES = $(addsuffix .class, $(JAVA))

# set shared-object/dll name for unix vs. windows
ifeq ($(OSFLAVOR), UNIX)
	SO_TARGET = libjpcap.so
else
ifeq ($(OSFLAVOR), DARWIN)
	SO_TARGET = libjpcap.jnilib
else
	SO_TARGET = jpcap.dll
endif
endif

# on linux, OSTYPE is Linux and the include subdir is called 'linux'
# on solaris, they match. need to lower case for other os variants?
OTL = $(subst L,l,${OSTYPE})

# on debian linux, make 'linux-gnu' recognizable as linux (.. apologies to RMS)
ifeq ($(OTL), linux-gnu)
	OTL=linux
endif

# set include paths for unix vs. windows
ifeq ($(OSFLAVOR), UNIX)
	INCLUDES = \
		-I/usr/include/pcap \
		-I${JAVA_HOME}/include \
		-I${JAVA_HOME}/include/$(OTL)
else
ifeq ($(OSFLAVOR), DARWIN)
	INCLUDES = -I/usr/include/pcap \
		-I/Library/Java/Home/include 
else
	JH = $(subst \,/,${JAVA_HOME})
	INCLUDES = \
		-I${WINPCAP_HOME}/../WPdpack/Include/ \
		-I$(JH)/include \
		-I$(JH)/include/win32 \
		-I.
endif
endif

# set library paths for unix vs. windows
ifeq ($(OSFLAVOR), UNIX)
	LIBS = -lnsl /usr/lib/libpcap.a
else
ifeq ($(OSFLAVOR), DARWIN)
	LIBS = /usr/lib/libpcap.a
else
	LIBS = ${WINPCAP_HOME}/../WPdpack/Lib/libwpcap.a
	LIBS = -L ${WINPCAP_HOME}/../WPdpack/Lib -lwpcap -lcygwin -lkernel32
	LIBS = -L ${WINPCAP_HOME}/../WPdpack/Lib -lwpcap
endif
endif

all: $(JAVA_CLASSES) $(SO_TARGET)

# build the native component
# NOTE: the -fPIC option below is only required on Solaris?
ifeq ($(OSFLAVOR), UNIX)
$(SO_TARGET): $(PKG_UND)_$(WRAPPER).h jpcap.c
	gcc -Wall $(INCLUDES) jpcap.c -fPIC -shared -o $@ $(LIBS)
else
ifeq ($(OSFLAVOR), DARWIN)
$(SO_TARGET): $(PKG_UND)_$(WRAPPER).h jpcap.c
	gcc -Wall $(INCLUDES) jpcap.c -bundle -flat_namespace -fno-common -o $@ $(LIBS)
else
OPTFLAGS = -g -O
CFLAGS = -DWIN32 -shared ${OPTFLAGS}
LDFLAGS =  -mno-cygwin -Wl,--out-implib,libjpcap.a
$(SO_TARGET): $(PKG_UND)_$(WRAPPER).h jpcap.c
	dlltool --verbose --add-stdcall-alias --def jpcap.def \
		--output-exp jpcap.exp --output-lib jpcap.a --dllname jpcap.dll
	gcc ${CFLAGS} ${LDFLAGS} -o jpcap.dll jpcap.def jpcap.a ${LIBS}
endif
endif

$(PKG_UND)_$(WRAPPER).h: $(WRAPPER).java
	javah -jni $(PKG).$(WRAPPER)
#	javap $(PKG).$(WRAPPER)


# NOTE: to run the class PacketCapture, "." must be included in LD_LIBRARY_PATH
# or wherever libjpcap.so is output
test: all
	java $(PKG).CaptureTest


include ${MAKE_HOME}/targets.makefile
include ${MAKE_HOME}/depend.makefile


# override default clean target to remove stuff generated by the jni compiler
clean:
	rm -fv *.o
	rm -fv *.so
	rm -fv jpcap
	rm -fv $(PKG_UND)_$(WRAPPER).h
	rm -fv *~
	rm -fv *.class
	rm -fv *.dll
	rm -fv *.exp
	rm -fv *.a
	rm -fv *.jnilib
