LU_SRCDIR=libudi
LU_BUILDDIR=$(BUILDROOT)/libudi
LU_DIRFILE=$(BUILDROOT)/libudi/.directory

LU_INCLUDE= -I $(LU_SRCDIR)/include
LU_INCLUDE_B= -i $(LU_SRCDIR)/include

# for the tests
T_LUDI_SRCDIR=libudi
T_LUDI_BUILDDIR=$(TESTDIR)/libudi
T_LUDI_DIRFILE=$(T_LUDI_BUILDDIR)/.directory
LIBUDITESTCC = -I ./include/common -I ./include/$(ARCH)-$(TYPE) -I $(LU_SRCDIR)/include

$(LU_DIRFILE): $(BUILDROOT)/.directory $(LU_SRCDIR)/Makefile include/common/udi.h
	@echo [mkdir] $(LU_BUILDDIR)
	@mkdir -p $(LU_BUILDDIR)
	@touch $(LU_DIRFILE)

LIBUDI_HEADERS+=include/common/udi.h
LIBUDI_HEADERS+=include/common/udi_physio.h
LIBUDI_HEADERS+=include/common/_PDCLIB_int.h
LIBUDI_HEADERS+=libudi/include/udi_env.h

include $(LU_SRCDIR)/buf/Makefile
include $(LU_SRCDIR)/cb/Makefile
include $(LU_SRCDIR)/dbg/Makefile
include $(LU_SRCDIR)/endian/Makefile
include $(LU_SRCDIR)/gio/Makefile
include $(LU_SRCDIR)/imc/Makefile
include $(LU_SRCDIR)/mem_mgmt/Makefile
include $(LU_SRCDIR)/meta/Makefile
include $(LU_SRCDIR)/mgmt/Makefile
include $(LU_SRCDIR)/pio/Makefile
include $(LU_SRCDIR)/queue/Makefile

include $(LU_SRCDIR)/environment/Makefile

$(LU_BUILDDIR)/libudi.a: $(LU_LIBFILES) $(LU_ARCH_LIBFILES) $(LU_DIRFILE)
	@echo [$(AR)] $@
	@-rm $(LU_BUILDDIR)/libudi.a
	@$(AR) rcs $(LU_BUILDDIR)/libudi.a $(LU_LIBFILES) $(LU_ARCH_LIBFILES)

LU_HOSTEDLIBFILES=$(patsubst %.o,%.ho,$(LU_LIBFILES) $(LU_HOSTED_LIBFILES))
$(LU_BUILDDIR)/libhostedudi.a: $(LU_HOSTEDLIBFILES) $(LU_DIRFILE)
	@echo [$(HOSTAR)] $@
	@-rm $(LU_BUILDDIR)/libhostedudi.a
	@$(HOSTAR) rcs $(LU_BUILDDIR)/libhostedudi.a $(LU_HOSTEDLIBFILES)

$(LU_BUILDDIR)/libtest.o: $(LU_SRCDIR)/libtest.c $(LU_DIRFILE)
	@echo [$(CC)] $@
	@$(CC) $(CCPARMS) $(CFLAGS)  $< -o $@

$(LU_BUILDDIR)/libtest.elf: $(LU_BUILDDIR)/libtest.o $(LU_LIBFILES) $(LU_ARCH_LIBFILES) $(LU_DIRFILE)
	@echo [$(LD)] $@
	@$(LD) $(LDPARMS) $(LU_LIBFILES) $(LU_BUILDDIR)/libtest.o -o $@

# tool build

$(LU_BUILDDIR)/udigen: $(LU_SRCDIR)/util/genparse.c $(LU_SRCDIR)/util/genfree.c $(LU_SRCDIR)/util/genemit.c $(LU_SRCDIR)/util/udigen.c $(LU_SRCDIR)/util/udigen.h $(LU_DIRFILE)
	@echo [$(HOSTCC)] $@
	@$(HOSTCC) $(LU_SRCDIR)/util/genparse.c $(LU_SRCDIR)/util/genfree.c $(LU_SRCDIR)/util/genemit.c $(LU_SRCDIR)/util/udigen.c -o $@

# Hosted build

T_LUDI_LIBFILES = $(subst $(LU_BUILDDIR),$(T_LUDI_BUILDDIR),$(LU_LIBFILES))

$(T_LUDI_BUILDDIR)/libudi.a: $(T_LUDI_LIBFILES) $(T_LUDI_DIRFILE)
	@echo [$(HOSTAR)] $@
	@$(RM) $(T_LUDI_BUILDDIR)/libudi.a
	@$(HOSTAR) rcs $(T_LUDI_BUILDDIR)/libudi.a $(T_LUDI_LIBFILES)

$(T_LUDI_DIRFILE): $(TESTDIRFILE) $(LU_SRCDIR)/Makefile
	@echo [mkdir] $(T_LUDI_BUILDDIR)
	@mkdir -p $(T_LUDI_BUILDDIR)
	@touch $(T_LUDI_DIRFILE)

#test rules

TESTDEPS += test-libudi-funcs

test-libudi-funcs: $(TESTDIRFILE) $(T_LUDI_BUILDDIR)/libudi.a
	@echo Testing libudi functions
	@echo Testing libudi functions > $(TESTDIR)/libuditest.log
	-@files=`find libudi/ -mindepth 2 -iname "*.c"`; \
		rc=0; count=0; ec=0; \
		for file in $$files; do \
			echo $$file >> $(TESTDIR)/libuditest.log 2>&1; \
			rm ./$(TESTDIR)/libuditest.exe 2> /dev/null; \
			rm ./$(TESTDIR)/libuditest 2> /dev/null; \
			echo $(HOSTCC) $(HOSTCCPARMS) -DTEST $(LIBUDITESTCC) -L $(T_LUDI_BUILDDIR) $$file -o $(TESTDIR)/libuditest -ludi >> $(TESTDIR)/libuditest.log 2>&1; \
			$(HOSTCC) $(HOSTCCPARMS) -DTEST $(LIBUDITESTCC) -L $(T_LUDI_BUILDDIR) $$file -o $(TESTDIR)/libuditest -ludi >> $(TESTDIR)/libuditest.log 2>&1; \
			if [ -x ./$(TESTDIR)/libuditest ]; then \
				./$(TESTDIR)/libuditest; \
				testcase=`expr $$? != 0`; \
				echo -e '*\c'; \
			else \
				testcase=0; \
				echo -e '!\c'; \
				ec=`expr $$ec + 1`; \
			fi;\
			rc=`expr $$rc + $$testcase`; \
			count=`expr $$count + 1`; done; \
		echo; \
		sc=`expr $$count - $$rc - $$ec`; \
		echo "Tests executed: $$count  Succeeded: $$sc  Tests failed: $$rc  Compilation errors:  $$ec"
	@echo
