## 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
@LAYOUT_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

