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

CC ?= cc

CPP ?= cc
CC1 ?= cc
AS ?= cc
AR ?= ar
LD ?= cc
LIBC ?= libc.a

TESTSETDIR = $(TESTROOTDIR)/testset

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

TESTLIB = libtest.a

all :		test

include $(TESTROOTDIR)/Makefile.stdio
include $(TESTROOTDIR)/Makefile.stdlib
include $(TESTROOTDIR)/Makefile.string
include $(TESTROOTDIR)/Makefile.ctype

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

COBJ = $(CSRC:.c=.co)
CEXE = $(CSRC:.c=.cexe)
COUT = $(CSRC:.c=.cout)
NPRE = $(NSRC:.c=.i)
NASM = $(NSRC:.c=.s)
NOBJ = $(NSRC:.c=.no)
NEXE = $(NSRC:.c=.nexe)
NOUT = $(NSRC:.c=.nout)

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

PFLAGS  =
PFLAGS += -fno-inline
PFLAGS += $(POPTFLAGS)

CFLAGS  =
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 .s .i .cout .cexe .co .o .c
.PRECIOUS: $(TESTLIBOBJS) $(COBJ) $(CEXE) $(NSRC) $(NPRE) $(NASM) $(NOBJ) $(NEXE)

test :		nout

testset :	.testset

.testset :
		$(MAKE) allclean
		$(MAKE) cout
		$(MAKE) cobj.clean
		$(MAKE) cexe.clean
		$(MAKE) clean

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

$(CEXE) :	$(TESTLIB)

$(NEXE) :	$(TESTLIB)

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

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

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

.co.cexe :
		$(CC) $< $(GFLAGS) $(LFLAGS) -o $@

.cexe.cout :
		$< > $@

.S.s :
		$(CPP) $(GFLAGS) $(PFLAGS) -nostdinc -I$(INCDIR) $< -o $@

.c.i :
		$(CPP) $(GFLAGS) $(PFLAGS) -nostdinc -I$(INCDIR) $< -o $@

.i.s :
		$(CC1) $< -o $@

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

.no.nexe :
		$(LD) $(LIBDIR)/nlcrt.o $< $(GFLAGS) $(LFLAGS) \
			-L$(LIBDIR) -lnlc -nodefaultlibs -nostartfiles -static -o $@

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

cobj :		$(COBJ)

cexe :		$(CEXE)

cout :		$(COUT)

nsrc :		$(NSRC)

npre :		$(NPRE)

nasm :		$(NASM)

nobj :		$(NOBJ)

nexe :		$(NEXE)

nout :		$(NOUT)

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

cobj.clean :
		rm -f $(COBJ)

cexe.clean :
		rm -f $(CEXE)

cout.clean :
		rm -f $(COUT)

nsrc.clean :
		rm -f $(NSRC)

npre.clean :
		rm -f $(NPRE)

nasm.clean :
		rm -f $(NASM)

nobj.clean :
		rm -f $(NOBJ)

nexe.clean :
		rm -f $(NEXE)

nout.clean :
		rm -f $(NOUT)

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

allclean :	clean cobj.clean cexe.clean cout.clean
