srcdir = @srcdir@
VPATH = @srcdir@

# PROGRAMS includes all test programs built on this platform.
# STDTEST_PORTABLE
#   test programs invoked via standard user interface, run on all platforms
# TESTS
#   test modules invoked through the abts suite (./testall)
# STDTEST_NONPORTABLE
#   test programs invoked via standard user interface, not portable
# OTHER_PROGRAMS
#   programs such as sockperf, that have to be invoked in a special sequence
#   or with special parameters
# TESTALL_COMPONENTS
#   programs such as globalmutexchild which the various TESTS will invoke
#   to validate process creation, pipes, dso mechanisms and so forth

STDTEST_PORTABLE = \
	testlockperf@EXEEXT@ \
	testmutexscope@EXEEXT@ \
	testall@EXEEXT@ \
	sendfile@EXEEXT@

TESTS = testtime.lo teststr.lo testvsn.lo testipsub.lo testshm.lo \
	testmmap.lo testud.lo testtable.lo testsleep.lo testpools.lo \
	testfmt.lo testfile.lo testdir.lo testfileinfo.lo testrand.lo \
	testdso.lo testoc.lo testdup.lo testsockets.lo testproc.lo \
	testpoll.lo testlock.lo testsockopt.lo testpipe.lo testthread.lo \
	testhash.lo testargs.lo testnames.lo testuser.lo testpath.lo \
	testenv.lo testprocmutex.lo testfnmatch.lo testatomic.lo testflock.lo \
	testsock.lo testglobalmutex.lo teststrnatcmp.lo testfilecopy.lo \
	testtemp.lo testlfs.lo testcond.lo testescape.lo testskiplist.lo

OTHER_PROGRAMS = \
	echod@EXEEXT@ \
	sockperf@EXEEXT@

TESTALL_COMPONENTS = \
	globalmutexchild@EXEEXT@ \
	libmod_test.la \
	mod_test.la \
	occhild@EXEEXT@ \
	proc_child@EXEEXT@ \
	readchild@EXEEXT@ \
	sockchild@EXEEXT@ \
	testshmproducer@EXEEXT@ \
	testshmconsumer@EXEEXT@ \
	tryread@EXEEXT@

PROGRAMS = $(TESTALL_COMPONENTS) $(STDTEST_PORTABLE) $(STDTEST_NONPORTABLE) \
	   $(OTHER_PROGRAMS)

TARGETS = $(PROGRAMS)

# bring in rules.mk for standard functionality
@INCLUDE_RULES@

LOCAL_LIBS=../lib@APR_LIBNAME@.la

CLEAN_TARGETS = testfile.tmp lfstests/*.bin \
	data/test*.txt data/test*.dat data/apr.testshm.shm

CLEAN_SUBDIRS = internal

INCDIR=../include
INCLUDES=-I$(INCDIR) -I$(srcdir)/../include

# link programs using -no-install to get real executables not
# libtool wrapper scripts which link an executable when first run.
LINK_PROG = $(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) $(LT_LDFLAGS) \
	    @LT_NO_INSTALL@ $(ALL_LDFLAGS) -o $@

# STDTEST_PORTABLE;

abts.lo: $(srcdir)/abts.c $(srcdir)/abts.h $(srcdir)/abts_tests.h \
	 $(srcdir)/testutil.h

testutil.lo: $(srcdir)/abts.c $(srcdir)/abts.h $(srcdir)/abts_tests.h \
	     $(srcdir)/testutil.h

OBJECTS_testall = abts.lo testutil.lo $(TESTS) $(LOCAL_LIBS)
testall@EXEEXT@: $(OBJECTS_testall)
	$(LINK_PROG) $(OBJECTS_testall) $(ALL_LIBS)
# For VPATH builds; where we have no ./data, copy us some data
# if we wait until 'make check', then 'make; ./testall' fails;
	if test ! -d "./data"; then cp -r $(srcdir)/data data; fi

OBJECTS_testlockperf = testlockperf.lo $(LOCAL_LIBS)
testlockperf@EXEEXT@: $(OBJECTS_testlockperf)
	$(LINK_PROG) $(OBJECTS_testlockperf) $(ALL_LIBS)

OBJECTS_testmutexscope = testmutexscope.lo $(LOCAL_LIBS)
testmutexscope@EXEEXT@: $(OBJECTS_testmutexscope)
	$(LINK_PROG) $(OBJECTS_testmutexscope) $(ALL_LIBS)

# OTHER_PROGRAMS;

OBJECTS_echod = echod.lo $(LOCAL_LIBS)
echod@EXEEXT@: $(OBJECTS_echod)
	$(LINK_PROG) $(OBJECTS_echod) $(ALL_LIBS)

OBJECTS_sendfile = sendfile.lo $(LOCAL_LIBS)
sendfile@EXEEXT@: $(OBJECTS_sendfile)
	$(LINK_PROG) $(OBJECTS_sendfile) $(ALL_LIBS)

OBJECTS_sockperf = sockperf.lo $(LOCAL_LIBS)
sockperf@EXEEXT@: $(OBJECTS_sockperf)
	$(LINK_PROG) $(OBJECTS_sockperf) $(ALL_LIBS)

# TESTALL_COMPONENTS;

OBJECTS_globalmutexchild = globalmutexchild.lo $(LOCAL_LIBS)
globalmutexchild@EXEEXT@: $(OBJECTS_globalmutexchild)
	$(LINK_PROG) $(OBJECTS_globalmutexchild) $(ALL_LIBS)

# Note -prefer-pic is only supported with libtool-1.4+
mod_test.lo: $(srcdir)/mod_test.c
	$(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -prefer-pic -o $@ \
	  -c $(srcdir)/mod_test.c

OBJECTS_mod_test = mod_test.lo
mod_test.la: $(OBJECTS_mod_test) $(LOCAL_LIBS)
	$(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) -rpath `pwd` -module \
	  -avoid-version $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ \
	  $(OBJECTS_mod_test) $(LOCAL_LIBS)

OBJECTS_libmod_test = mod_test.lo $(LOCAL_LIBS)
libmod_test.la: $(OBJECTS_libmod_test)
	$(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) -rpath `pwd` \
	  -avoid-version $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ \
	  $(OBJECTS_libmod_test) $(ALL_LIBS)

OBJECTS_occhild = occhild.lo $(LOCAL_LIBS)
occhild@EXEEXT@: $(OBJECTS_occhild)
	$(LINK_PROG) $(OBJECTS_occhild) $(ALL_LIBS)

OBJECTS_proc_child = proc_child.lo $(LOCAL_LIBS)
proc_child@EXEEXT@: $(OBJECTS_proc_child)
	$(LINK_PROG) $(OBJECTS_proc_child) $(ALL_LIBS)

OBJECTS_readchild = readchild.lo $(LOCAL_LIBS)
readchild@EXEEXT@: $(OBJECTS_readchild)
	$(LINK_PROG) $(OBJECTS_readchild) $(ALL_LIBS)

OBJECTS_sockchild = sockchild.lo $(LOCAL_LIBS)
sockchild@EXEEXT@: $(OBJECTS_sockchild)
	$(LINK_PROG) $(OBJECTS_sockchild) $(ALL_LIBS)

OBJECTS_testshmconsumer = testshmconsumer.lo $(LOCAL_LIBS)
testshmconsumer@EXEEXT@: $(OBJECTS_testshmconsumer) $(LOCAL_LIBS)
	$(LINK_PROG) $(OBJECTS_testshmconsumer) $(ALL_LIBS)

OBJECTS_testshmproducer = testshmproducer.lo $(LOCAL_LIBS)
testshmproducer@EXEEXT@: $(OBJECTS_testshmproducer)
	$(LINK_PROG) $(OBJECTS_testshmproducer) $(ALL_LIBS)

OBJECTS_tryread = tryread.lo $(LOCAL_LIBS)
tryread@EXEEXT@: $(OBJECTS_tryread)
	$(LINK_PROG) $(OBJECTS_tryread) $(ALL_LIBS)

check: $(TESTALL_COMPONENTS) $(STDTEST_PORTABLE) $(STDTEST_NONPORTABLE)
	teststatus=0; \
	progfailed=""; \
	for prog in $(STDTEST_PORTABLE) $(STDTEST_NONPORTABLE); do \
		if test "$$prog" = 'sendfile@EXEEXT@'; then \
			for mode in blocking nonblocking timeout; do \
				./$$prog client $$mode startserver 127.0.0.1; \
				status=$$?; \
				if test $$status != 0; then \
					teststatus=$$status; \
					progfailed="$$progfailed '$$prog mode $$mode'"; \
				fi; \
			done; \
	        else \
			./$$prog -v; \
			status=$$?; \
			if test $$status != 0; then \
				teststatus=$$status; \
				progfailed="$$progfailed $$prog"; \
			fi; \
		fi; \
	done; \
	if test $$teststatus != 0; then \
		echo "Programs failed:$$progfailed"; \
	fi; \
	exit $$teststatus

# DO NOT REMOVE
