## Makefile.in for ICU tests
## Copyright (c) 1999-2013, 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

# 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

## 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 $@.FAIL ; false )
	-@touch $@.PASS
	-@echo "PASSED: $* (other tests may still be running..)"

# print out status
pcheck: $(STATUS_FILES)
	@goods= ; \
	bads= ; \
	echo "---------------"; \
	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

