CC := gcc
CPP := gcc -xc -E
#DEBUG := -g
#PROFILE := -pg
CFLAGS := ${DEBUG} ${PROFILE} -O3 -Wall
OS := ${shell uname}
ifeq (${OS},Linux)
CFLAGS += -DLOCAL_BPF_HEADERS
endif
ifeq (${OS},OpenBSD)
OBJ_FORMAT := aoutb
else
OBJ_FORMAT := elf
endif

# Defining INSECURE is for testing only!!!
CFLAGS += -DINSECURE

#Give user a chance to override the default CFLAGS defined above.
#(But note additional flags are also added later, e.g., for apvsync.)
CFLAGS += ${OVERRIDE}

ifneq (${OS},Linux)
CFLAGS += -I/usr/local/BerkeleyDB.3.2/include -I/usr/local/include \
	-L /usr/local/lib
VPATH = /usr/local/BerkeleyDB.3.2/lib
else
CFLAGS += -I/usr/include/pcap
endif

PROGS := bpf/make_data
PROGS += crypto/example crypto/make_conv_key crypto/make_endpoint_key \
	crypto/make_segment_key
PROGS += listen/listen
PROGS += decrypt/decrypt decrypt/decrypt_packets decrypt/make_histogram \
	decrypt/make_pcap_histogram decrypt/get_packet_densities \
	decrypt/get_conversation_info decrypt/crypt_simple_file \
	decrypt/decrypt_segment decrypt/translate_addresses_pcap
PROGS += dump/pkt_dump
PROGS += pilot/make_key
PROGS += util/apvsync util/logmonitor util/spit

all: ${PROGS}

bpf/make_data: bpf/make_data.o bpf/parse_bpf.o

bpf/parse_bpf.o: bpf/parse_bpf.h

CRYPTO_OBJS := crypto/crypto.o des/desgnu.o des/desspa.o des/deskey.o \
        crypto/rijndael/rijndael-alg-fst.o crypto/gladman/aes.o \
	crypto/gladman/aes_tab.o

CACHE_OBJS := dump/cache.o dump/btree.o dump/list.o dump/hash.o -ldb

crypto/rijndael/rijndael-alg-fst.o: CFLAGS += -O3 -DFULL_UNROLL

crypto/gladman/aes.tmp: crypto/gladman/aes.asm
	-${CPP} $< | sed 's/section \.text use32/section \.text/'> $@

crypto/gladman/aes_tab.tmp: crypto/gladman/aes_tab.asm
	sed < $< 's/section \.text use32/section \.text/' >$@

crypto/gladman/aes.o: crypto/gladman/aes.tmp
	nasm -f ${OBJ_FORMAT} $< -o $@

crypto/gladman/aes_tab.o: crypto/gladman/aes_tab.tmp
	nasm -f ${OBJ_FORMAT} $< -o $@

crypto/example: ${CRYPTO_OBJS} crypto/example.o

crypto/make_conv_key: ${CRYPTO_OBJS} crypto/make_conv_key.o

crypto/make_endpoint_key: ${CRYPTO_OBJS} crypto/make_endpoint_key.o

crypto/make_segment_key: ${CRYPTO_OBJS} crypto/make_segment_key.o

crypto/crypto_file.o: crypto/crypto_file.h

crypto/crypto.o: crypto/crypto.h

decrypt/translate_addresses_pcap: decrypt/translate_addresses_pcap.o \
${CACHE_OBJS} ${CRYPTO_OBJS} bpf/parse_bpf.o -lpcap

decrypt/decrypt: decrypt/decrypt.o ${CRYPTO_OBJS} ${CACHE_OBJS} \
bpf/parse_bpf.o crypto/crypto_file.o

decrypt/decrypt_packets: decrypt/decrypt_packets.o bpf/parse_bpf.o \
crypto/crypto_file.o ${CRYPTO_OBJS} ${CACHE_OBJS}

decrypt/decrypt_segment: decrypt/decrypt_segment.o ${CRYPTO_OBJS} \
crypto/crypto_file.o ${CACHE_OBJS} bpf/parse_bpf.o

decrypt/get_conversation_info: decrypt/get_conversation_info.o \
bpf/parse_bpf.o crypto/crypto_file.o ${CRYPTO_OBJS} ${CACHE_OBJS}

decrypt/make_histogram: decrypt/make_histogram.o decrypt/histogram.o \
bpf/parse_bpf.o crypto/crypto_file.o ${CRYPTO_OBJS} ${CACHE_OBJS}

decrypt/histogram.o: decrypt/histogram.h

decrypt/make_pcap_histogram: decrypt/make_pcap_histogram.o \
decrypt/histogram.o -lpcap

decrypt/get_packet_densities: decrypt/get_packet_densities.o ${CRYPTO_OBJS} \
${CACHE_OBJS} bpf/parse_bpf.o crypto/crypto_file.o

decrypt/crypt_simple_file: decrypt/crypt_simple_file.o ${CRYPTO_OBJS}

des/desspa.c: des/gensp
	des/gensp a >des/desspa.c

des/gensp: des/gensp.c

des/desgnu.o: des/desgnu.s
	${CPP} des/desgnu.s | tr -d '"' | sed -e '/^#/d' | as -o des/desgnu.o

des/des3gnu.o: des3gnu.s
	${CPP} des/des3gnu.s |tr -d '"' | sed -e '/^#/d' | as -o des/des3gnu.o

dump/pkt_dump: ${CRYPTO_OBJS} ${CACHE_OBJS} dump/pkt_dump.o dump/sample.o \
bpf/parse_bpf.o

dump/list.o: dump/list.h

dump/cache.o: dump/cache.h

dump/sample.o: dump/packet.h

dump/btree.o: dump/btree.h

ifeq (${OS},Linux)
listen/listen: listen/lin_listen.o listen/lin_packet.o listen/segnames.o \
bpf/parse_bpf.o
	${CC} ${CFLAGS} $^ -o $@
else
listen/listen: listen/listen.o listen/bpf.o
endif

listen/bpf.o: listen/bpf.h

listen/lin_listen.o: listen/lin_packet.h listen/segnames.h

listen/lin_packet.o: listen/lin_packet.h

listen/segnames.o: listen/segnames.h

#move make_key to crypto?

pilot/make_key: pilot/make_key.o ${CRYPTO_OBJS}

util/apvsync: CFLAGS += -DAPV_SLOTS=35 -DAPV_DRIVES=1 -O0
util/apvsync: util/apvsync.o

ifeq (${OS},Linux)
util/logmonitor: util/logmonitor.o util/sig.o

util/sig.o: util/sig.h
else
util/logmonitor: util/logmonitor.o
endif

util/sig.o: util/sig.h

util/spit: util/spit.c
	${CC} ${CFLAGS} `libnet-config --defines` util/spit.c -o util/spit \
	`libnet-config --libs`

SUBDIRS = bpf crypto crypto/gladman crypto/rijndael decrypt des dump listen \
	pilot util

.PHONY: clean
clean:
	rm -f ${PROGS} ${SUBDIRS:%=%/*.o} crypto/gladman/*.tmp des/desspa.c \
	des/gensp


dist: clean
	CURRENT=`pwd`; \
	CURRENT=`basename $$CURRENT`; \
	cd ..; \
	FILELIST=`find $$CURRENT -type f -print | grep -v -f $$CURRENT/excludelist`; \
	CMD="tar -zcf $$CURRENT/apv.tar.gz $$FILELIST"; \
	echo $$CMD; \
	$$CMD;

