LC_SRCDIR=libc
LC_BUILDDIR=$(BUILDROOT)/libc
LC_DIRFILE=$(BUILDROOT)/libc/.directory

$(LC_DIRFILE): $(BUILDROOT)/.directory $(LC_SRCDIR)/Makefile
	@echo [mkdir] $(LC_BUILDDIR)
	@mkdir -p $(LC_BUILDDIR)
	@touch $(LC_DIRFILE)

LIBC_HEADERS+=include/common/assert.h
LIBC_HEADERS+=include/common/ctype.h
LIBC_HEADERS+=include/common/float.h
#LIBC_HEADERS+=include/common/iso646.h
LIBC_HEADERS+=include/common/limits.h
LIBC_HEADERS+=include/common/locale.h
LIBC_HEADERS+=include/common/math.h
LIBC_HEADERS+=include/common/stdarg.h
#LIBC_HEADERS+=include/common/stdbool.h
LIBC_HEADERS+=include/common/stddef.h
LIBC_HEADERS+=include/common/stdint.h
LIBC_HEADERS+=include/common/stdio.h
LIBC_HEADERS+=include/common/stdlib.h
LIBC_HEADERS+=include/common/wchar.h
LIBC_HEADERS+=include/common/wctype.h
LIBC_HEADERS+=include/common/_PDCLIB_wstdio.h
LIBC_HEADERS+=include/common/_PDCLIB_glue.h
LIBC_HEADERS+=include/common/_PDCLIB_int.h
LIBC_HEADERS+=include/common/_PDCLIB_test.h

include $(LC_SRCDIR)/ctype/Makefile
include $(LC_SRCDIR)/interface/Makefile
include $(LC_SRCDIR)/locale/Makefile
include $(LC_SRCDIR)/math/Makefile
include $(LC_SRCDIR)/pdclib/Makefile
include $(LC_SRCDIR)/stdio/Makefile
include $(LC_SRCDIR)/stdlib/Makefile
include $(LC_SRCDIR)/string/Makefile
include $(LC_SRCDIR)/wchar/Makefile

$(LC_BUILDDIR)/libc.a: $(LC_LIBFILES) $(LC_DIRFILE)
	@echo [$(AR)] $@
	@-rm $(LC_BUILDDIR)/libc.a
	@$(AR) rcs $(LC_BUILDDIR)/libc.a $(LC_LIBFILES)
	
	
	
$(LC_BUILDDIR)/libtest.o: $(LC_SRCDIR)/libtest.c $(LC_DIRFILE)
	@echo [$(CC)] $@
	@$(CC) $(CCPARMS) $(CFLAGS)  $< -o $@
	
$(LC_BUILDDIR)/libtest.elf: $(LC_BUILDDIR)/libtest.o $(LC_LIBFILES) $(LC_DIRFILE)
	@echo [$(LD)] $@
	@$(LD) $(LDPARMS) $(LC_LIBFILES) $(LC_BUILDDIR)/libtest.o -o $@

#
# Testing part
#

.PHONY: test-libc-funcs test-libc-integrity test-libc-linkage
TESTDEPS += test-libc-linkage
TESTDEPS += test-libc-integrity
TESTDEPS += test-libc-funcs

test-libc-funcs: $(TESTDIRFILE)
	@echo Testing libc functions
	@echo Testing libc functions > $(TESTDIR)/libctest.log
	-@files=`find libc/ -mindepth 2 -iname "*.c"`; \
		rc=0; count=0; ec=0; \
		for file in $$files; do \
			echo $$file >> $(TESTDIR)/libctest.log 2>&1; \
			$(HOSTCC) $(HOSTCCPARMS) -DTEST -I ./include/common -I ./include/ia-pc $$file -o $(TESTDIR)/libctest >> $(TESTDIR)/libctest.log 2>&1; \
			if [ -x ./$(TESTDIR)/libctest ]; then \
				./$(TESTDIR)/libctest; \
				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

test-libc-integrity:
	@echo Testing libc integrity
	-@rc=0; count=0; \
		for file in $(LIBC_HEADERS); do \
			echo -e '*\c'; \
			$(CC) $(CCPARMS) $$file -o /dev/null; \
			testcase=`expr $$? != 0`; \
			rc=`expr $$rc + $$testcase`; \
			count=`expr $$count + 1`; \
		done; \
		echo; \
		echo "Tests executed: $$count  Tests failed: $$rc";
	@echo

test-libc-linkage:
	@echo Testing libc linkage completeness
	-@make $(LC_BUILDDIR)/libtest.elf > /dev/null
