##
##  Copyright (c) 1999-2011, International Business Machines Corporation and
##  others. All Rights Reserved.
##
##
##  THE PURPOSE OF THIS TEST
##
##     This tests all public header files  - as installed.  icu-config needs to be on the PATH
##  
##     To run it simply type 'make check' after ICU is installed. You SHOULD see:
##
##  unicode/uchar.h -	0
##  unicode/uchriter.h -	0
##  unicode/ucnv.h -	0
##
##    .. etc.  Anything other than zero is an error. (except for the deprecation tests, where '1' is the correct value)
##              
##
##  If a header fails the C compile because it's a C++ header, add it to the
##  file named 'cxxfiles.txt' in this directory.
##
##  If a header fails because it is deprecated, add it to the 'dfiles.txt'
##
##

## Source directory information
srcdir = @srcdir@
top_srcdir = @top_srcdir@

top_builddir = ../..
subdir = test/hdrtst

include $(shell icu-config --incfile)
DIRS=$(prefix)/include/unicode
LDIRS=$(prefix)/include/layout
ECHO_T=@ECHO_T@
ECHO_C=@ECHO_C@
ECHO_N=@ECHO_N@

all: 
	@echo Please read this Makefile for more information.
	@echo run \'$(MAKE) check\' to run the test "(use -k if you don't want to stop on errs)"

E_NUM=8
E_D="[1/$(E_NUM)] Deprecated: "
E_C="[2/$(E_NUM)] C  : "
E_CXX="[3/$(E_NUM)] C++: "
E_CXX_L="[4/$(E_NUM)] C++ layout: "
E_DRF="[5/$(E_NUM)] Hide Draft: "
E_DEP="[6/$(E_NUM)] Hide Deprecated: "
E_INT="[7/$(E_NUM)] Hide Internal: "
E_OBS="[8/$(E_NUM)] Hide Obsolete: "

check: dtest ctest cpptest lotest doclean drafttest deprtest internaltest obsoletetest
ifeq ($(MAKECMDGOALS),check)
	$(MAKE) clean
else
	@echo "(not cleaning automatically)"
endif

# break dependency
doclean:
	make clean

cpptest:
	@FAIL=0;for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \
	  incfile=`basename $$file .h` ; \
	  echo "$@ unicode/$$incfile.h" ; \
	  echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.cpp ; \
	  echo 'void junk(){}' >> ht_$$incfile.cpp ; \
          $(COMPILE.cc) -c $(cppflags) ht_$$incfile.cpp || FAIL=1 ; \
	done ;\
	exit $$FAIL

lotest:
	@FAIL=0;for file in $(prefix)/include/layout/*.h; do \
	  incfile=`basename $$file .h` ; \
	  echo "$@ layout/$$incfile.h" ; \
	  echo '#include "'layout/$$incfile'.h"' > ht_$$incfile.cpp ; \
	  echo 'void junk(){}' >> ht_$$incfile.cpp ; \
          $(COMPILE.cc) -c $(cppflags) -I$(prefix)/include/layout ht_$$incfile.cpp || FAIL=1; \
	done ;\
	exit $$FAIL

dtest:
	@FAIL=0;NONE="(No deprecated headers)";for stub in `cat $(srcdir)/dfiles.txt | grep -v '^#'` ; do \
	  file=unicode/$$stub ; \
	  NONE="" ; \
	  incfile=`basename $$file .h` ; \
	  echo "$@ unicode/$$incfile.h" ; \
	  echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.cpp ; \
	  echo 'void junk(){}' >> ht_$$incfile.cpp ; \
	  echo > ht_dep.junk ; \
          $(COMPILE.cc) -c $(cppflags) ht_$$incfile.cpp 2>&1 | sed -e 's/^.*#error[^"]*"//' | fgrep -v ht_ | tee ht_dep.junk | fgrep -v "$$incfile.h header is obsolete" ; \
	  RES=$$? ; \
	  echo $$RES ; \
	  fgrep -q "$$incfile.h header is obsolete" ht_dep.junk || echo "** FAIL Header unicode/$$incfile.h is not obsoleted properly" ; \
	  fgrep -q "$$incfile.h header is obsolete" ht_dep.junk || FAIL=1 ; \
	  rm -f unicode/$$stub ; \
	done ; \
	echo "$@: $$NONE - exit status $$FAIL" ; \
	exit $$FAIL

#  < ht_dep.junk &&  ; \


ctest:
	@echo Building test harness for header files in ../../common and ../../i18n
	@FAIL=0;for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/cxxfiles.txt | tee cfiles.txt`; do \
	  incfile=`basename $$file .h` ; \
	  echo "$@ unicode/$$incfile.h" ; \
	  echo '#include "'unicode/$$incfile'.h"' > ht_$$incfile.c ; \
	  echo 'void junk(void);' >> ht_$$incfile.c ; \
	  echo 'void junk(){}' >> ht_$$incfile.c ; \
          $(COMPILE.c) -c $(cppflags) ht_$$incfile.c || FAIL=1 ; \
	done ;\
	exit $$FAIL

drafttest:
	@FAIL=0;for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \
	  incfile=`basename $$file .h` ; \
	  echo "$@ unicode/$$incfile.h" ; \
	  echo '#define U_HIDE_DRAFT_API' > hd_$$incfile.c; \
	  echo '#include "'unicode/$$incfile'.h"' >> hd_$$incfile.c ; \
	  echo 'void junk(void);' >> hd_$$incfile.c ; \
	  echo 'void junk(){}' >> hd_$$incfile.c ; \
          $(COMPILE.cc) -c $(cppflags) hd_$$incfile.c ||FAIL=1 ; \
	done ;\
	exit $$FAIL

deprtest:
	@FAIL=0; for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \
	  incfile=`basename $$file .h` ; \
	  echo "$@ unicode/$$incfile.h" ; \
	  echo '#define U_HIDE_DEPRECATED_API' > hdp_$$incfile.c; \
	  echo '#include "'unicode/$$incfile'.h"' >> hdp_$$incfile.c ; \
	  echo 'void junk(void);' >> hdp_$$incfile.c ; \
	  echo 'void junk(){}' >> hdp_$$incfile.c ; \
          $(COMPILE.cc) -c $(cppflags) hdp_$$incfile.c || FAIL=1; \
	done ; \
	exit $$FAIL

internaltest:
	@FAIL=0;\
	 for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \
	  incfile=`basename $$file .h` ; \
	  echo "$@ unicode/$$incfile.h" ; \
	  echo '#define U_HIDE_INTERNAL_API' > hin_$$incfile.c; \
	  echo '#include "'unicode/$$incfile'.h"' >> hin_$$incfile.c ; \
	  echo 'void junk(void);' >> hin_$$incfile.c ; \
	  echo 'void junk(){}' >> hin_$$incfile.c ; \
          $(COMPILE.cc) -c $(cppflags) hin_$$incfile.c || FAIL=1 ; \
	done ; \
	exit $$FAIL

obsoletetest:
	@FAIL=0;for file in `ls $(prefix)/include/unicode/*.h | fgrep -v -f $(srcdir)/pfiles.txt`; do \
	  incfile=`basename $$file .h` ; \
	  echo "$@ unicode/$$incfile.h" ; \
	  echo '#define U_HIDE_OBSOLETE_API' > hob_$$incfile.c; \
	  echo '#include "'unicode/$$incfile'.h"' >> hob_$$incfile.c ; \
	  echo 'void junk(void);' >> hob_$$incfile.c ; \
	  echo 'void junk(){}' >> hob_$$incfile.c ; \
          $(COMPILE.cc) -c $(cppflags) hob_$$incfile.c || FAIL=1 ; \
	done ; \
	exit $$FAIL

clean:
	-@echo cleaning..
	-@rm -f *.h *.c *.cpp *.o *.junk cfiles.txt

distclean: clean
	-@rm -f Makefile

Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
	cd $(top_builddir) \
	&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status

.PHONY:	doclean check all cpptest lotest dtest ctest clean distclean

