# $Id: makefile,v 1.12 2001/08/11 18:24:56 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 \
	CaptureDeviceNotFoundException \
	CaptureDeviceOpenException \
	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
	SO_TARGET = jpcap.dll
endif


all: $(JAVA_CLASSES) $(SO_TARGET)


# 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
	JH = $(subst \,/,${JAVA_HOME})
	INCLUDES = \
		-I${WINPCAP_HOME}/wpcap/libpcap \
		-I${WINPCAP_HOME}/wpcap/libpcap/bpf \
		-I$(JH)/include \
		-I$(JH)/include/win32 \
		-I.
endif

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

# 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 $(INCLUDES) jpcap.c -fPIC -shared -o $@ $(LIBS)
else
OPTFLAGS = -g -O
CFLAGS = -mno-cygwin -shared ${OPTFLAGS}
LDFLAGS = -Wl,--out-implib,libjpcap.a 
$(SO_TARGET): $(PKG_UND)_$(WRAPPER).h jpcap.c
	dlltool --add-stdcall-alias --def jpcap.def \
		--output-exp jpcap.exp --output-lib jpcap.a --dllname jpcap.dll
	gcc $(INCLUDES) -c jpcap.c $(LIBS)
	ld -o jpcap.dll jpcap.exp jpcap.o $(LIBS)
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 -f *.o
	rm -f *.so
	rm -f jpcap
	rm -f $(PKG_UND)_$(WRAPPER).h
	rm -f *~
	rm -f *.class
	rm -f *.dll
	rm -f *.exp
