TESTROOTDIR ?= .
TESTOBJDIR ?= testobj
#TESTOBJDIR ?= /tmp/testobj_nltl
#TESTOBJDIR ?= $(HOME)/tmp/testobj_nltl

NLTL ?= nltl

NLTLOPT =

CC ?= cc

AS ?= cc -c
AR ?= ar
LD ?= cc

TESTSETDIR = $(TESTROOTDIR)/testset

TESTLIBDIR = $(TESTROOTDIR)/lib
TESTLIBOBJS = $(TESTLIBDIR)/lib.o

TESTLIB = libtest.a

all :		test

include $(TESTROOTDIR)/Makefile.syntax
include $(TESTROOTDIR)/Makefile.type
include $(TESTROOTDIR)/Makefile.stack
include $(TESTROOTDIR)/Makefile.memory
include $(TESTROOTDIR)/Makefile.program

NSRC = $(TSRC:$(TESTSETDIR)/%=$(TESTOBJDIR)/%)

TASM = $(TSRC:.tl=.ts)
TOBJ = $(TSRC:.tl=.to)
TEXE = $(TSRC:.tl=.texe)
TOUT = $(TSRC:.tl=.tout)
TERR = $(TSRC:.tl=.terr)
NASM = $(NSRC:.tl=.ns)
NOBJ = $(NSRC:.tl=.no)
NEXE = $(NSRC:.tl=.nexe)
NOUT = $(NSRC:.tl=.nout)
NERR = $(NSRC:.tl=.nerr)

GFLAGS  = -O0
GFLAGS += -g
#GFLAGS += -m32 # for 32bit executable
GFLAGS += $(GOPTFLAGS)

CFLAGS  =
CFLAGS += -fno-inline
CFLAGS += $(COPTFLAGS)

AFLAGS  =
AFLAGS += $(AOPTFLAGS)

LFLAGS  = -L. -ltest
#LFLAGS += -static # To save test directory size, do not use static linking
LFLAGS += $(LOPTFLAGS)

ARFLAGS = ruc
#ARFLAGS = rDc
ARFLAGS += $(AROPTFLAGS)

.SUFFIXES:
.SUFFIXES: .nout .nexe .no .ns .tout .texe .to .ts .tl .o .c
.PRECIOUS: $(TESTLIBOBJS) $(TASM) $(TOBJ) $(TEXE) $(NSRC) $(NASM) $(NOBJ) $(NEXE)

test :		nout

testset :	.testset

.testset :
		$(MAKE) allclean
		$(MAKE) tout
		$(MAKE) tobj.clean
		$(MAKE) texe.clean
		$(MAKE) clean

.c.o :
		$(CC) $(GFLAGS) $(CFLAGS) $< -c -o $@

$(TESTLIB) :	$(TESTLIBOBJS)
		$(AR) $(ARFLAGS) $(TESTLIB) $(TESTLIBOBJS)

$(TEXE) :	$(TESTLIB)

$(NEXE) :	$(TESTLIB)

$(NSRC) :
		mkdir -p `dirname $@`
		cp $(@:$(TESTOBJDIR)/%=$(TESTSETDIR)/%) $@

.tl.ts :
		-$(NLTL) $(NLTLOPT) -o $@ $< 2> $*.terr

.ts.to :
		$(AS) $(GFLAGS) $(AFLAGS) $< -o $@

.to.texe :
		$(CC) $< $(GFLAGS) $(LFLAGS) -o $@

.texe.tout :
		$< > $@

.tl.ns :
		-$(NLTL) $(NLTLOPT) -o $@ $< 2> $*.nerr
		diff -u -U 30 $(@:$(TESTOBJDIR)/%.ns=$(TESTSETDIR)/%.ts) $@
		diff -u -U 30 $(@:$(TESTOBJDIR)/%.ns=$(TESTSETDIR)/%.terr) $*.nerr

.ns.no :
		$(AS) $(GFLAGS) $(AFLAGS) $< -o $@

.no.nexe :
		$(CC) $< $(GFLAGS) $(LFLAGS) -o $@

.nexe.nout :
		$< > $@
		diff -u -U 30 $(@:$(TESTOBJDIR)/%.nout=$(TESTSETDIR)/%.tout) $@

tasm :		$(TASM)

tobj :		$(TOBJ)

texe :		$(TEXE)

tout :		$(TOUT)

nsrc :		$(NSRC)

nasm :		$(NASM)

nobj :		$(NOBJ)

nexe :		$(NEXE)

nout :		$(NOUT)

lib.clean :
		rm -f $(TESTLIBOBJS) $(TESTLIB)

tasm.clean :
		rm -f $(TASM)

tobj.clean :
		rm -f $(TOBJ)

texe.clean :
		rm -f $(TEXE)

tout.clean :
		rm -f $(TOUT)

terr.clean :
		rm -f $(TERR)

nsrc.clean :
		rm -f $(NSRC)

nasm.clean :
		rm -f $(NASM)

nobj.clean :
		rm -f $(NOBJ)

nexe.clean :
		rm -f $(NEXE)

nout.clean :
		rm -f $(NOUT)

nerr.clean :
		rm -f $(NERR)

clean :		lib.clean nsrc.clean nasm.clean nobj.clean nexe.clean nout.clean nerr.clean
		rm -fR $(TESTOBJDIR)

allclean :	clean tasm.clean tobj.clean texe.clean tout.clean terr.clean
