# Makefile for secure rtp 
#
# David A. McGrew
# Cisco Systems, Inc.

# targets:
#
# runtest       runs test applications 
# test		builds test applications
# libcrypt.a	static library implementing crypto engine
# libsrtp.a	static library implementing srtp
# clean		removes objects, libs, and executables
# distribution  cleans and builds a .tgz
# tags          builds etags file from all .c and .h files

.PHONY: all test build_table_apps

all: test 

runtest: build_table_apps test
	@echo "running libsrtp test applications..."
	crypto/test/cipher_driver$(EXE) -v >/dev/null
	crypto/test/kernel_driver$(EXE) -v >/dev/null
	test/rdbx_driver$(EXE) -v >/dev/null
	test/srtp_driver$(EXE) -v >/dev/null
	test/roc_driver$(EXE) -v >/dev/null
	test/replay_driver$(EXE) -v >/dev/null
	test/dtls_srtp_driver$(EXE) >/dev/null
	cd test; $(abspath $(srcdir))/test/rtpw_test.sh >/dev/null	
	@echo "libsrtp test applications passed."
	$(MAKE) -C crypto runtest

# makefile variables

CC	= gcc
INCDIR	= -Icrypto/include -I$(srcdir)/include -I$(srcdir)/crypto/include
DEFS	= -DHAVE_CONFIG_H
CPPFLAGS= 
CFLAGS	= -Wall -O4 -fexpensive-optimizations -funroll-loops
LIBS	= 
LDFLAGS	=  -L.
COMPILE = $(CC) $(DEFS) $(INCDIR) $(CPPFLAGS) $(CFLAGS)
SRTPLIB	= -lsrtp

RANLIB	= ranlib
INSTALL	= /usr/bin/install -c

# EXE defines the suffix on executables - it's .exe for Windows, and
# null on linux, bsd, and OS X and other OSes.
EXE	= 
# gdoi is the group domain of interpretation for isakmp, a group key
# management system which can provide keys for srtp
gdoi	= 
# Random source.
RNG_OBJS = rand_source.o

srcdir = .
top_srcdir = .
top_builddir = 

prefix = /usr/local
exec_prefix = ${prefix}
includedir = ${prefix}/include
libdir = ${exec_prefix}/lib


# implicit rules for object files and test apps

%.o: %.c
	$(COMPILE) -c $< -o $@

%$(EXE): %.c
	$(COMPILE) $(LDFLAGS) $< -o $@ $(SRTPLIB) $(LIBS)


# libcrypt.a (the crypto engine) 
ciphers = crypto/cipher/cipher.o crypto/cipher/null_cipher.o      \
          crypto/cipher/aes.o crypto/cipher/aes_icm.o             \
          crypto/cipher/aes_cbc.o

hashes  = crypto/hash/null_auth.o crypto/hash/sha1.o \
          crypto/hash/hmac.o crypto/hash/auth.o # crypto/hash/tmmhv2.o 

replay  = crypto/replay/rdb.o crypto/replay/rdbx.o               \
          crypto/replay/ut_sim.o 

math    = crypto/math/datatypes.o crypto/math/stat.o

ust     = crypto/ust/ust.o 

rng     = crypto/rng/$(RNG_OBJS) crypto/rng/prng.o crypto/rng/ctr_prng.o

err     = crypto/kernel/err.o

kernel  = crypto/kernel/crypto_kernel.o  crypto/kernel/alloc.o   \
          crypto/kernel/key.o $(rng) $(err) # $(ust) 

cryptobj =  $(ciphers) $(hashes) $(math) $(stat) $(kernel) $(replay)

# libsrtp.a (implements srtp processing)

srtpobj = srtp/srtp.o srtp/ekt.o

libsrtp.a: $(srtpobj) $(cryptobj) $(gdoi)
	ar cr libsrtp.a $^
	$(RANLIB) libsrtp.a

# libcryptomath.a contains general-purpose routines that are used to
# generate tables and verify cryptoalgorithm implementations - this
# library is not meant to be included in production code

cryptomath = crypto/math/math.o crypto/math/gf2_8.o 

libcryptomath.a: $(cryptomath)
	ar cr libcryptomath.a $(cryptomath)
	$(RANLIB) libcryptomath.a


# test applications 

crypto_testapp = crypto/test/aes_calc$(EXE) crypto/test/cipher_driver$(EXE) \
	crypto/test/datatypes_driver$(EXE) crypto/test/kernel_driver$(EXE) \
	crypto/test/rand_gen$(EXE) crypto/test/sha1_driver$(EXE) \
	crypto/test/stat_driver$(EXE)

testapp = $(crypto_testapp) test/srtp_driver$(EXE) test/replay_driver$(EXE) \
	  test/roc_driver$(EXE) test/rdbx_driver$(EXE) test/rtpw$(EXE) \
	  test/dtls_srtp_driver$(EXE)

$(testapp): libsrtp.a

test/rtpw$(EXE): test/rtpw.c test/rtp.c test/getopt_s.c
	$(COMPILE) $(LDFLAGS) -o $@ $^ $(LIBS) $(SRTPLIB)

test/srtp_driver$(EXE): test/srtp_driver.c test/getopt_s.c
	$(COMPILE) $(LDFLAGS) -o $@ $^ $(LIBS) $(SRTPLIB)

test/rdbx_driver$(EXE): test/rdbx_driver.c test/getopt_s.c
	$(COMPILE) $(LDFLAGS) -o $@ $^ $(LIBS) $(SRTPLIB)

test/dtls_srtp_driver$(EXE): test/dtls_srtp_driver.c test/getopt_s.c
	$(COMPILE) $(LDFLAGS) -o $@ $^ $(LIBS) $(SRTPLIB)

test: $(testapp)
	@echo "Build done. Please run '$(MAKE) runtest' to run self tests."

memtest: test/srtp_driver
	@test/srtp_driver -v -d "alloc" > tmp
	@grep freed tmp | wc -l > freed
	@grep allocated tmp | wc -l > allocated
	@echo "checking for memory leaks (only works with --enable-stdout)"
	cmp -s allocated freed
	@echo "passed (same number of alloc() and dealloc() calls found)"
	@rm freed allocated tmp

# tables_apps are used to generate the tables used in the crypto
# implementations; these need only be generated during porting, not
# for building libsrtp or the test applications

table_apps = tables/aes_tables 

build_table_apps: $(table_apps)

# in the tables/ subdirectory, we use libcryptomath instead of libsrtp

tables/%: tables/%.c libcryptomath.a 
	$(COMPILE) $(LDFLAGS) $< -o $@ $(LIBS) libcryptomath.a

# the target 'plot' runs the timing test (test/srtp_driver -t) then
# uses gnuplot to produce plots of the results - see the script file
# 'timing'

plot:	test/srtp_driver
	test/srtp_driver -t > timing.dat


# bookkeeping: tags, clean, and distribution

tags:
	etags */*.[ch] */*/*.[ch] 


# documentation - the target libsrtpdoc builds a PDF file documenting
# libsrtp

libsrtpdoc:
	$(MAKE) -C doc

.PHONY: clean superclean distclean install

install:
	@if [ -r $(DESTDIR)$(includedir)/srtp/srtp.h ]; then \
	   echo "you should run 'make uninstall' first"; exit 1;  \
	fi
	$(INSTALL) -d $(DESTDIR)$(includedir)/srtp
	$(INSTALL) -d $(DESTDIR)$(libdir)
	cp $(srcdir)/include/*.h $(DESTDIR)$(includedir)/srtp  
	cp $(srcdir)/crypto/include/*.h $(DESTDIR)$(includedir)/srtp
	if [ "$(srcdir)" != "." ]; then cp crypto/include/*.h $(DESTDIR)$(includedir)/srtp; fi
	if [ -f libsrtp.a ]; then cp libsrtp.a $(DESTDIR)$(libdir)/; fi

uninstall:
	rm -f $(DESTDIR)$(includedir)/srtp/*.h
	rm -f $(DESTDIR)$(libdir)/libsrtp.a
	-rmdir $(DESTDIR)$(includedir)/srtp

clean:
	rm -rf $(cryptobj) $(srtpobj) $(cryptomath) TAGS \
        libcryptomath.a libsrtp.a core *.core test/core
	for a in * */* */*/*; do			\
              if [ -f "$$a~" ] ; then rm -f $$a~; fi;	\
        done;
	for a in $(testapp) $(table_apps); do rm -rf $$a$(EXE); done
	rm -rf *.pict *.jpg *.dat 
	rm -rf freed allocated tmp
	$(MAKE) -C doc clean
	$(MAKE) -C crypto clean


superclean: clean
	rm -rf crypto/include/config.h config.log config.cache config.status \
               Makefile crypto/Makefile doc/Makefile \
               .gdb_history test/.gdb_history .DS_Store
	rm -rf autom4te.cache

distclean: superclean

distname = srtp-$(shell cat VERSION)

distribution: runtest superclean 
	if ! [ -f VERSION ]; then exit 1; fi
	if [ -f ../$(distname).tgz ]; then               \
           mv ../$(distname).tgz ../$(distname).tgz.bak; \
        fi
	cd ..; tar cvzf $(distname).tgz srtp

# EOF
