## Makefile.in for ICU tests
## Copyright (C) 2016 and later: Unicode, Inc. and others.
## License & terms of use: http://www.unicode.org/copyright.html
## 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

@FUZZER_TRUE@FUZZER=fuzzer

@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

# no testdata without tools..
@TOOLS_TRUE@TESTDATA = testdata

# 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) $(FUZZER)

## 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 "----------------------------------------"; \
	echo $SUBDIRS \
	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

