## Makefile.in for ICU tests
## Copyright (c) 1999-2014, International Business Machines Corporation and
## others. All Rights Reserved.

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

top_builddir = ..

include $(top_builddir)/icudefs.mk

## Build directory information
subdir = test

@ICUIO_TRUE@IOTEST = iotest

# the letest directory depends on layoutex.
# If you have layoutex but not layout, you will be using
# harfbuzz.
@LAYOUTEX_TRUE@LETEST = letest

# status dir
STATUS_TMP = tmp
STATUS_FULL = $(shell pwd)/$(STATUS_TMP)

## Files to remove for 'make clean'
CLEANFILES = *~ $(STATUS_TMP)

SUBDIRS = testdata intltest $(IOTEST) cintltst $(LETEST)

## List of phony targets
.PHONY : everything all all-local all-recursive install install-local		\
install-recursive clean clean-local clean-recursive distclean		\
distclean-local distclean-recursive dist dist-recursive dist-local	\
check check-recursive check-local xcheck xcheck-recursive xcheck-local	\
check-exhaustive check-exhaustive-recursive

## Clear suffix list
.SUFFIXES :

## List of standard targets
everything: all-recursive all-local
all:
ifneq ($(RECURSIVE),YES)
	@echo simply use \`make\' \(or \`make everything\'\) to do all
endif

install: install-recursive install-local
clean: clean-recursive clean-local
distclean : distclean-recursive distclean-local
	$(RMV) hdrtst/Makefile
	$(RMV) perf/convperf/Makefile
	$(RMV) $(STATUS_TMP)

dist: dist-recursive dist-local
check: everything check-recursive check-local
check-recursive: all-recursive
# the xcheck targets create a ../test-*.xml file in JUnit format.
xcheck: everything xcheck-recursive xcheck-local
xcheck-recursive: all-recursive
check-exhaustive: everything check-exhaustive-recursive check-local

## Recursive targets
all-recursive install-recursive clean-recursive distclean-recursive dist-recursive:
	@dot_seen=no; \
	target=`echo $@ | sed s/-recursive//`; \
	list='$(SUBDIRS)'; for subdir in $$list; do \
	  echo "$(MAKE)[$(MAKELEVEL)]: Making \`$$target' in \`$$subdir'"; \
	  if test "$$subdir" = "."; then \
	    dot_seen=yes; \
	    local_target="$$target-local"; \
	  else \
	    local_target="$$target"; \
	  fi; \
	  (cd $$subdir && $(MAKE) $$local_target) || exit; \
	done; \
	if test "$$dot_seen" = "no"; then \
	  $(MAKE) "$$target-local" || exit; \
	fi

xcheck-recursive check-recursive check-exhaustive-recursive:
	@$(MKINSTALLDIRS) $(STATUS_TMP)
	@mystatus=$(STATUS_FULL)/status.$$$$.deleteme ; \
	$(RMV) "$$mystatus".* ; \
	@goods=; \
	bads=; \
	target=`echo $@ | sed s/-recursive//`; \
	list='$(SUBDIRS)'; for subdir in $$list; do \
	  echo "$(MAKE)[$(MAKELEVEL)]: Making \`$$target' in \`$$subdir'"; \
	  local_target="$$target"; \
	  if (cd $$subdir && $(MAKE) $$local_target TEST_STATUS_FILE="$$mystatus.$$subdir" ); then \
	    goods="$$goods $$subdir"; \
          else \
            bads="$$bads $$subdir"; \
          fi; \
	done; \
	for subdir in $$list; do \
	  if [ -f "$$mystatus.$$subdir" ]; then \
	    echo "-------------" ; \
	    echo "| ***     FAILING TEST SUMMARY FOR:              $$subdir  " ; \
	    cat "$$mystatus.$$subdir" ; \
	    echo "| *** END FAILING TEST SUMMARY FOR:              $$subdir" ; \
	    $(RMV) "$$mystatus.$$subdir" ; \
	  fi; \
	done; \
	echo "---------------"; \
	echo "ALL TESTS SUMMARY:"; \
        if test ! "x$$bads" = "x"; then \
	  echo "ok: $$goods"; \
	  echo "===== ERRS: $$bads"; exit 1; \
	else \
	  echo "All tests OK: $$goods"; \
	fi

# pcheck = parallel check. We don't care about the output interleaving,
# just run it as fast as possible.
# todo would be to merge this code into the above non-parallel check.
STATUS_NUM:=$(shell echo $$$$)
MYSTATUS_R=$(STATUS_FULL)/status.$(STATUS_NUM).deleteme
STATUS_FILES=$(SUBDIRS:%=$(MYSTATUS_R).%)

pcheck_setup: testdata
	@$(MKINSTALLDIRS) $(STATUS_TMP)
	$(RMV) "$(MYSTATUS_R)".*
	@echo Beginning parallel make. Output may be interleaved!

$(STATUS_FULL)/status.$(STATUS_NUM).deleteme.%: pcheck_setup
	-@$(MAKE) -C $* TEST_STATUS_FILE=$@ check || ( echo "FAILED: $* (other tests may still be running..)" ; touch $@ ; cp $@ $@.FAIL ; false )
	-@[ ! -f $@.FAIL ] && touch $@.PASS && echo "PASSED: $* (other tests may still be running..)"
	-@touch $@

# print out status
pcheck: $(STATUS_FILES)
	@goods= ; \
	bads= ; \
	echo "----------------------------------------"; \
	for subdir in $(SUBDIRS); do \
	  if [ -s "$(MYSTATUS_R).$$subdir" ]; then \
	    echo "-------------" ; \
	    echo "| ***     FAILING TEST SUMMARY FOR:              $$subdir  " ; \
	    cat "$(MYSTATUS_R).$$subdir" ; \
	    echo "| *** END FAILING TEST SUMMARY FOR:              $$subdir" ; \
	    $(RMV) "$(MYSTATUS_R).$$subdir" ; \
	  fi; \
	done; \
	for subdir in $(SUBDIRS); do \
		if [ -f "$(MYSTATUS_R).$$subdir.FAIL" ]; \
		then \
			bads="$$bads $$subdir" ; \
		elif [ -f "$(MYSTATUS_R).$$subdir.PASS" ]; \
		then \
			goods="$$goods $$subdir" ; \
		else \
			echo "*** subtest did not complete - $$subdir" ; \
			bads="$$bads $$subdir" ; \
		fi ; \
	done ; \
	echo "ALL TESTS SUMMARY:"; \
        if test ! "x$$bads" = "x"; then \
	  echo "(to get non-interleaved err output, use \"$(MAKE) check\" instead.)" ; \
	  echo "ok: $$goods"; \
	  echo "===== ERRS: $$bads"; exit 1; \
	else \
	  echo "All tests OK: $$goods"; \
	fi
	-@$(RMV) "$(MYSTATUS_R)".*

all-local:

install-local:

dist-local:

clean-local:
	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)

distclean-local: clean-local
	$(RMV) Makefile

xcheck-local check-local: all-local

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

