# regress/Makefile[.in] - regression test Makefile
# 
#  This file is part of adns, which is Copyright Ian Jackson
#  and contributors (see the file INSTALL for full details).
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 3, or (at your option)
#  any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software Foundation.

srcdir=		@srcdir@
VPATH=		@srcdir@

PROGS_SYSDEP=	@PROGS_HAVE_TSEARCH@

CLIENTS=	adnstest adnshost adnslogres $(PROGS_SYSDEP)
AUTOCHDRS=	harness.h hsyscalls.h hredirect.h
AUTOCSRCS=	hrecord.c hplayback.c hcommon.c hfuzzraw.c
include		../settings.make
include		$(srcdir)/../src/adns.make

DIRCFLAGS=	-I../src -I$(srcdir) -I$(srcdir)/../src

HCPPFLAGS=	-DADNS_REGRESS_TEST -I.
#HCPPFLAGS+=	-DFUZZRAW_SYNC

REDIRLIBOBJS=	$(addsuffix _d.o, $(basename $(LIBOBJS)))
HARNLOBJS=	hcommon.o $(REDIRLIBOBJS)
TARGETS=	$(addsuffix _record, $(CLIENTS)) \
		$(addsuffix _playback, $(CLIENTS)) \
		$(addsuffix _fuzz, $(CLIENTS)) \
		$(addsuffix _fuzzraw, $(CLIENTS))
ADH_OBJS=	adh-main_c.o adh-opts_c.o adh-query_c.o
ALL_OBJS=	$(HARNLOBJS) dtest.o hrecord.o hplayback.o hnonfuzz.o hfuzz.o

.PRECIOUS:	$(AUTOCSRCS) $(AUTOCHDRS)

all install uninstall: $(TARGETS)

ALL_TESTS:=$(patsubst $(srcdir)/case-%.sys,%,$(wildcard $(srcdir)/case-*.sys))

check:		$(TARGETS) $(addprefix check-,$(ALL_TESTS))
		@echo
		@echo 'all tests passed or maybe skipped.'

checkfuzz:		$(TARGETS) \
			$(addprefix checkfuzz-,$(ALL_TESTS)) \
			$(addprefix checkfuzzraw-,$(ALL_TESTS))
		@echo
		@echo 'all fuzzes passed or maybe skipped.'
# this target is mostly useful as prep work for running the fuzzer;
# it doesn't really test any of adns

fuzzcat.d:	checkfuzz
		$(srcdir)/categorisefuzz $(ALL_TESTS)
		perl -ne 'print $$1,"\n" while m/\"([^"% ]{2,})\"/g' \
			$(srcdir)/../src/*.[ch] $(srcdir)/../client/*.[ch] \
		| sort -u >fuzzcat.d/dictionary
		perl -p -e 'chomp;' \
			-e 's/[^0-9a-z-_]/sprintf "\\x%02x", ord $$&/ige;' \
			-e 's/^/l$$.="/; ' \
			-e 's/$$/"\n/;' \
			fuzzcat.d/dictionary >fuzzcat.d/dictionary.afl

check-%:	case-%.sys
		@srcdir=$(srcdir) $(srcdir)/r1test $* || test $$? = 5

fuzz-%:		case-%.sys $(TARGETS) make1fuzz shlib
		srcdir=$(srcdir) $(srcdir)/make1fuzz $*

fuzzraw-%:	fuzz-%

.PRECIOUS: fuzz-%

checkfuzz-%:	fuzz-% $(TARGETS)
		@srcdir=$(srcdir) $(srcdir)/check1fuzz $<

checkfuzzraw-%:	fuzz-% $(TARGETS)
		@srcdir=$(srcdir) $(srcdir)/check1fuzz $<

LINK_CMD=	$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

%_record:	%_c.o hrecord.o hnonfuzz.o $(HARNLOBJS)
		$(LINK_CMD)

%_playback:	%_c.o hplayback.o hnonfuzz.o $(HARNLOBJS)
		$(LINK_CMD)

%_fuzz:		%_c.o hplayback.o hfuzz.o $(HARNLOBJS)
		$(LINK_CMD)

%_fuzzraw:	%_c.o hfuzzraw.o hfuzz.o $(HARNLOBJS)
		$(LINK_CMD)

.SECONDARY: $(addsuffix _c.o, $(filter-out adnshost, $(CLIENTS)))
# Without this, make will remove <client>_c.o after building <client>.
# This wastes effort.  (Debian bug #4073.)
#
# Also, it exposes us to a bug (in make 3.81, at least) which can
# cause make to run the rule for building <client> without building
# <client>_c.o!  (Debian #756123.)
#
# See also Savannah #29620, http://savannah.gnu.org/bugs/index.php?29620

adnshost_%:	$(ADH_OBJS) h%.o hnonfuzz.o $(HARNLOBJS)
		$(LINK_CMD)

adnshost_fuzz:	$(ADH_OBJS) hplayback.o hfuzz.o $(HARNLOBJS)
		$(LINK_CMD)

adnshost_fuzzraw: $(ADH_OBJS) hfuzzraw.o hfuzz.o $(HARNLOBJS)
		$(LINK_CMD)

%_d.o:		$(srcdir)/../src/%.c hredirect.h hsyscalls.h
		$(CC) $(CFLAGS) $(HCPPFLAGS) -c -g -o $@ $<

%_c.o:		$(srcdir)/../client/%.c hredirect.h hsyscalls.h
		$(CC) $(CFLAGS) $(HCPPFLAGS) -I $(srcdir)/../src -c -g -o $@ $<

$(ALL_OBJS):	$(srcdir)/../src/adns.h $(srcdir)/../src/internal.h
$(ALL_OBJS):	harness.h hsyscalls.h
$(ADH_OBJS):	$(srcdir)/../client/adnshost.h

%::	%.m4 hmacros.i4 hsyscalls.i4
	$(M4) -P -I$(srcdir) $< >$@-a.new
	sed -e 's/hm_comma/,/g; s/hm_squote/'\''/g; /^[	 ]*$$/d' <$@-a.new >$@-b.new
	@mv -f $@-b.new $(srcdir)/$@; rm -f $@-a.new
