OBJDIRS += test test/lwip test/btree

.PRECIOUS: $(OBJDIR)/test/%.o

#TEST_COVERAGE_CFLAGS	:= --coverage
#TEST_COVERAGE_LDFLAGS	:= -lgcov

TEST_KERN_CFLAGS := -g -DJOS_KERNEL -I$(TOP) -I$(TOP)/kern -I$(TOP)/$(OBJDIR)  \
		    $(TEST_COVERAGE_CFLAGS)
TEST_USER_CFLAGS := \
	-g -DJOS_USER -DJOS_TEST -I$(TOP) -I$(TOP)/$(OBJDIR) \
	-D__STDC_FORMAT_MACROS \
	-I$(TOP)/pkg/lwip/include \
	-I$(TOP)/pkg/lwip/include/ipv4 \
	-I$(TOP)/pkg/lwip/lnx64 \
        -I$(TOP)/kern

DISK_TEST_SRCS := \
	error.c printfmt.c sha1.c arc4.c bf60.c sysstring.c \
	log.c hashtable.c freelist.c dstack.c \
	btree_delete.c btree_node.c btree_insert.c btree_manager.c cache.c \
	pbtree.c pbtree_frm.c btree_search.c btree.c btree_traverse.c btree_debug.c \
	disk.c mem.c misc.c lock.c rand.c \
	disk-test.c
DISK_TEST_OBJS := $(patsubst %.c, $(OBJDIR)/ktest/%.o, $(DISK_TEST_SRCS))

FILESERVER_TEST_SRCS := fileserver-test.c fileserver.c error.c printfmt.c
FILESERVER_TEST_OBJS := $(patsubst %.c, $(OBJDIR)/test/%.o, $(FILESERVER_TEST_SRCS))

FILECLIENT_TEST_SRCS := fileclient-test.c fileclient.c error.c printfmt.c
FILECLIENT_TEST_OBJS := $(patsubst %.c, $(OBJDIR)/test/%.o, $(FILECLIENT_TEST_SRCS))

SSL_BENCH_SRCS := ssl-bench.c error.c printfmt.c
SSL_BENCH_OBJS := $(patsubst %.c, $(OBJDIR)/test/%.o, $(SSL_BENCH_SRCS))

SOCK_BENCH_SRCS := sock_bench.c netbench.c error.c printfmt.c sysstring.c
SOCK_BENCH_OBJS := $(patsubst %.c, $(OBJDIR)/test/%.o, $(SOCK_BENCH_SRCS))

SOCK_CLIENT_SRCS := sock_client.c netbench.c error.c printfmt.c sysstring.c
SOCK_CLIENT_OBJS := $(patsubst %.c, $(OBJDIR)/test/%.o, $(SOCK_CLIENT_SRCS))

BTREE2_TEST_SRCS := btree2-test.c btree2-sys.c \
	biter.c btree.c bxutil.c bnode.c desc.c  \
	insert.c search.c delete.c verify.c \
	error.c printfmt.c sha1.c arc4.c bf60.c rand.c sysstring.c

BTREE2_TEST_OBJS := $(patsubst %.c, $(OBJDIR)/test/%.o, $(BTREE2_TEST_SRCS))
		    
LWIP_BENCH_SRCS := sock_bench.c netbench.c error.c printfmt.c sysstring.c
LWIP_BENCH_OBJS := $(patsubst %.c, $(OBJDIR)/test/lwip/%.o, $(LWIP_BENCH_SRCS))
LWIP_LNX64_LIB := $(OBJDIR)/lnx64/lib/liblwip.a

DIS_OBJS := djprotx.o djprot.o bcast.o cpplabel.o error.o sysstring.o \
	    backtrace.o string.o djdebug.o directexec.o djarpc.o \
	    djfs_posix.o djkey.o delegator.o cryptconn.o perf.o djlabel.o strtou64.o
DIS_OBJS := $(patsubst %.o, $(OBJDIR)/test/%.o, $(DIS_OBJS))

## Kernel-code build rules

$(OBJDIR)/ktest/%.o: test/%.cc
	@mkdir -p $(@D)
	$(NCC) $(TEST_KERN_CFLAGS) -c -o $@ $<

$(OBJDIR)/ktest/%.o: lib/%.cc
	@mkdir -p $(@D)
	$(NCC) $(TEST_KERN_CFLAGS) -c -o $@ $<

$(OBJDIR)/ktest/%.o: lib/%.c
	@mkdir -p $(@D)
	$(NCC) $(TEST_KERN_CFLAGS) -c -o $@ $< $(CSTD)

$(OBJDIR)/ktest/%.o: kern/kern/%.c
	@mkdir -p $(@D)
	$(NCC) $(TEST_KERN_CFLAGS) -c -o $@ $< $(CSTD)

$(OBJDIR)/ktest/%.o: kern/btree/%.c
	@mkdir -p $(@D)
	$(NCC) $(TEST_KERN_CFLAGS) -c -o $@ $< $(CSTD)

$(OBJDIR)/ktest/disk-test: $(DISK_TEST_OBJS)
	$(NCC) -o $@ $(DISK_TEST_OBJS) -lstdc++ $(TEST_COVERAGE_LDFLAGS)

## User-code build rules

$(OBJDIR)/test/%.o: test/%.cc
	@mkdir -p $(@D)
	$(NCC) $(TEST_USER_CFLAGS) -c -o $@ $<

$(OBJDIR)/test/%.o: user/%.cc
	@mkdir -p $(@D)
	$(NCC) $(TEST_USER_CFLAGS) -c -o $@ $<

$(OBJDIR)/test/%.o: lib/%.cc
	@mkdir -p $(@D)
	$(NCC) $(TEST_USER_CFLAGS) -c -o $@ $<

$(OBJDIR)/test/%.o: lib/%.c
	@mkdir -p $(@D)
	$(NCC) $(TEST_USER_CFLAGS) -c -o $@ $< $(CSTD)

$(OBJDIR)/test/fileserver-test: $(FILESERVER_TEST_OBJS)
	$(NCC) -o $@ $(FILESERVER_TEST_OBJS) -lstdc++
	
$(OBJDIR)/test/fileclient-test: $(FILECLIENT_TEST_OBJS)
	$(NCC) -o $@ $(FILECLIENT_TEST_OBJS) -lstdc++

$(OBJDIR)/test/httpd-test: test/httpd-test.cc
	@mkdir -p $(@D)
	$(NCC) -o $@ $< -lstdc++ -lssl -lcrypto

$(OBJDIR)/test/ssl-bench: $(SSL_BENCH_OBJS)
	@mkdir -p $(@D)
	$(NCC) -o $@ $(SSL_BENCH_OBJS) -lstdc++ -lssl -lpthread

$(OBJDIR)/test/sock_bench: $(SOCK_BENCH_OBJS)
	@mkdir -p $(@D)
	$(NCC) -o $@ $(SOCK_BENCH_OBJS) -lstdc++ -lpthread

$(OBJDIR)/test/sock_client: $(SOCK_CLIENT_OBJS)
	@mkdir -p $(@D)
	$(NCC) -o $@ $(SOCK_CLIENT_OBJS) -lstdc++ -lpthread

## Flume, for distributed stuff
FLUME_SRC	 := /home/nickolai/src/flume/linux
FLUME_RUN	 := /disk/nickolai/flume/run
FLUME_NCC_CFLAGS := -DUSE_FLUME=1 -g -fno-stack-protector \
		    -I$(FLUME_SRC) -I$(FLUME_SRC)/include \
		    -I$(FLUME_SRC)/build-tree/obj/prot \
		    -include $(FLUME_SRC)/include/flume_features.h
FLUME_NCC_LDFLAGS := \
	-L/usr/local/lib/sfslite/shared \
	-Wl,--rpath -Wl,/usr/local/lib/sfslite/shared \
	-Wl,--rpath -Wl,$(FLUME_RUN)/lib/shared \
	-Wl,--rpath -Wl,$(FLUME_RUN)/rlib/shared \
	$(FLUME_SRC)/build-tree/obj/libc/libc.so.6 \
	$(FLUME_SRC)/build-tree/obj/ld.so/ld.so \
	$(FLUME_SRC)/build-tree/obj/libflume-ev/.libs/libflume-ev.so \
	$(FLUME_SRC)/build-tree/obj/srv/libflume-srv/.libs/libflume-srv.so \
	$(FLUME_SRC)/build-tree/obj/clnt/libflumeclnt/.libs/libflumeclnt_c.so \
	$(FLUME_SRC)/build-tree/obj/clnt/libflumeclnt/.libs/libflumeclnt_cxx.so \
	-ltame -lsfsmisc -larpc -lsfscrypt -lasync -lgmp -lsvc

$(OBJDIR)/test/flume-hello.o $(OBJDIR)/test/flume-hellorun.o: $(OBJDIR)/test/%.o: test/%.c
	@mkdir -p $(@D)
	$(NCC) $(FLUME_NCC_CFLAGS) -c -o $@ $<

$(OBJDIR)/test/flume-hello $(OBJDIR)/test/flume-hellorun: $(OBJDIR)/test/%: $(OBJDIR)/test/%.o
	$(NCC) -o $@ $< $(FLUME_NCC_LDFLAGS)

## Flume-ified perl
FLUME_PERL_SRCS := \
	av.c deb.c doio.c doop.c dump.c globals.c gv.c hv.c \
	mg.c miniperlmain.c op.c reentr.c pad.c perl.c perlio.c \
	perly.c pp.c pp_ctl.c pp_hot.c pp_sys.c pp_pack.c \
	pp_sort.c regcomp.c regexec.c run.c scope.c sv.c \
	taint.c toke.c numeric.c locale.c universal.c utf8.c \
	util.c perlapi.c xsutils.c
FLUME_PERL_OBJS := $(patsubst %.c,$(OBJDIR)/test/flumeperl_%.o,$(FLUME_PERL_SRCS))
FLUME_PERL_CFLAGS := -DPERL_CORE -DPERL_MICRO -DSTANDARD_C -DPERL_USE_SAFE_PUTENV

$(FLUME_PERL_OBJS): $(OBJDIR)/test/flumeperl_%.o: $(ACPKG_BUILDDIR)/perl-5.8.8/%.c
	@mkdir -p $(@D)
	$(NCC) $(FLUME_NCC_CFLAGS) $(FLUME_PERL_CFLAGS) -c -o $@ $<

$(OBJDIR)/test/flumeperl: $(FLUME_PERL_OBJS)
	$(NCC) -o $@ $^ -lm

## Distributed stuff
DIS_NCC_CFLAGS  := -I/usr/local/include/sfslite -I/usr/local/include
DIS_NCC_LDFLAGS := -L/usr/local/lib/sfslite -L/usr/local/lib \
		   -Wl,--rpath -Wl,/usr/local/lib/sfslite

$(OBJDIR)/test/%.o: kern/kern/%.c $(DIS_HEADERS)
	@mkdir -p $(@D)
	$(NCC) $(DIS_NCC_CFLAGS) $(TEST_USER_CFLAGS) -c -o $@ $<

$(OBJDIR)/test/%.o: dj/%.cc $(DIS_HEADERS)
	@mkdir -p $(@D)
	$(NCC) $(DIS_NCC_CFLAGS) $(TEST_USER_CFLAGS) -c -o $@ $<

$(OBJDIR)/test/%.o: $(OBJDIR)/dj/%.C $(DIS_HEADERS)
	@mkdir -p $(@D)
	$(NCC) $(DIS_NCC_CFLAGS) $(TEST_USER_CFLAGS) -c -o $@ $<

$(OBJDIR)/test/%: $(DIS_OBJS) $(OBJDIR)/test/%.o
	@mkdir -p $(@D)
	$(NCC) $(DIS_NCC_LDFLAGS) -o $@ $^ -lsfsmisc -lsvc -lsfscrypt -larpc -lasync -lgmp -lstdc++ -lm -lresolv

## Distributed stuff with Flume
$(OBJDIR)/test/flume-%.o: dj/%.cc $(DIS_HEADERS)
	@mkdir -p $(@D)
	$(NCC) $(DIS_NCC_CFLAGS) $(TEST_USER_CFLAGS) $(FLUME_NCC_CFLAGS) -c -o $@ $<

$(OBJDIR)/test/flume-djd: $(DIS_OBJS) $(OBJDIR)/test/flume-djd.o $(OBJDIR)/test/flume-djflume.o
	@mkdir -p $(@D)
	$(NCC) $(DIS_NCC_LDFLAGS) -o $@ $^ $(FLUME_NCC_LDFLAGS) \
		-lsfsmisc -lsvc -lsfscrypt -larpc -lasync -lgmp \
		-lstdc++ -lm -lresolv

## lwip bench rules
$(OBJDIR)/test/lwip/%.o: user/%.cc
	@mkdir -p $(@D)
	$(NCC) $(TEST_USER_CFLAGS) -DLWIP_LIB -c -o $@ $<

$(OBJDIR)/test/lwip/%.o: lib/%.cc
	@mkdir -p $(@D)
	$(NCC) $(TEST_USER_CFLAGS) -DLWIP_LIB -c -o $@ $<

$(OBJDIR)/test/lwip/%.o: lib/%.c
	@mkdir -p $(@D)
	$(NCC) $(TEST_USER_CFLAGS) -DLWIP_LIB -c -o $@ $< $(CSTD)

$(OBJDIR)/test/lwip_bench: $(LWIP_BENCH_OBJS) $(LWIP_LNX64_LIB)
	@mkdir -p $(@D)
	$(NCC) -o $@ $(LWIP_BENCH_OBJS) $(LWIP_LNX64_LIB) -lstdc++ -lpthread -lrt

## btree2
BTREE2_INC := -I$(TOP)/test/

$(OBJDIR)/test/%.o: test/btree/%.c
	@mkdir -p $(@D)
	$(NCC) $(BTREE2_INC) -DBTREE_PRIV -c -o $@ $< $(CSTD)

$(OBJDIR)/test/btree2-test.o: test/btree2-test.cc
	@mkdir -p $(@D)
	$(NCC) $(TEST_USER_CFLAGS) $(BTREE2_INC) -c -o $@ $<

$(OBJDIR)/test/btree2-sys.o: test/btree2-sys.c
	@mkdir -p $(@D)
	$(NCC) $(TEST_USER_CFLAGS) $(BTREE2_INC) -c -o $@ $< $(CSTD)

$(OBJDIR)/test/btree2-test: $(BTREE2_TEST_OBJS) 
	@mkdir -p $(@D)
	$(NCC) -o $@ $(BTREE2_TEST_OBJS) -lstdc++ -ldmalloc
