.PHONY: all install clean tests clean-tests run-tests tests-F2003 clean-tests-F2003 run-tests-F2003 large-tests clean-large-tests run-large-tests release remote-tests distclean submit-tests submit1-tests submit2-tests submit3-tests submit4-tests showlog-tests cleanlog-tests submit-large-tests showlog-large-tests cleanlog-large-tests

INSTALL=install
BINDIR=/usr/local/bin
SUBDIRS=xcodeml-tools libxmp/include libxmp/src libxmpf/include libxmpf/src libxmp/src_threads \
	libtlog/src_threads libtlog/src_mpi XcodeML-Exc-Tools interfaces Driver/src

FALSE=1
TRUE=0
USER=$(shell whoami)

IS_SUPERUX=1
ifeq ($(IS_SUPERUX), $(FALSE))
    SUBDIRS+=libompc/src libompf/src
endif

IS_ACC=1
ifeq ($(IS_ACC), $(TRUE))
    SUBDIRS+=libacc/src libacc/include
endif

all:
	@for subdir in $(SUBDIRS) ; do \
	  $(MAKE) -C $$subdir ; \
	  if test $$? -ne 0; then exit 1; fi ; \
	done

install:
	@for subdir in $(SUBDIRS) ; do \
	  $(MAKE) -C $$subdir install ; \
	  if test $$? -ne 0; then exit 1; fi ; \
	done; \

clean:
	@for subdir in $(SUBDIRS) ; do \
	  $(MAKE) -C $$subdir clean ; \
	  if test $$? -ne 0; then exit 1; fi; \
	done

BASE_TESTDIR = "tests/XMP/"
TESTDIRS1    = "global-view/array/C" "global-view/array/F" "global-view/bcast/C" "global-view/bcast/F" \
	       "global-view/loop/C"  "global-view/loop/F"  "global-view/reduction/C" "global-view/reduction/F" \
	       "global-view/shadow-reflect/C" "global-view/shadow-reflect/F" "global-view/task/C"  "global-view/task/F"
TESTDIRS2    = "global-view/template_fix/C"   "global-view/template_fix/F"   "global-view/gmove/C" "global-view/gmove/F" \
	       "global-view/inquiry/C"   "global-view/inquiry/F" "global-view/gblock/C"    "global-view/gblock/F"
TESTDIRS3  =   "global-view/align/C"     "global-view/align/F" "global-view/intrinsic/F" \
	       "global-view/util/C"      "global-view/util/F/" "others/C" "others/F"
IS_MPI3_ASYNC=0
ifeq ($(IS_MPI3_ASYNC), $(TRUE))
   TESTDIRS3 += "global-view/async/C" "global-view/async/F"
endif
BASE_LARGE_TESTDIR = "tests/XMP/LARGE-SIZE-TESTS"
LARGE_TESTDIRS = "others/C"

# "global-view/intrinsic/C/" includes imaginary numbers.
# But SUPERUX and POWERPC cannot deal with imaginary numbers.
IS_SUPERUX_OR_POWERPC=1
ifeq ($(IS_SUPERUX_OR_POWERPC), $(FALSE))
   TESTDIRS3 += "global-view/intrinsic/C"
endif

TESTDIRS4 = "local-view/coarray/C" "local-view/other/C" "local-view/other/F" \
	    "local-view/coarray/F/STRUCT" \
	    "local-view/coarray/F/MIX" "local-view/coarray/F/ALLOC" "local-view/coarray/F/LIB" \
	    "local-view/coarray/F/GET" "local-view/coarray/F/PUT" "local-view/coarray/F/SCOPE" \
	    "local-view/coarray/F/CFOLD"

TESTDIRS  = $(TESTDIRS1) $(TESTDIRS2) $(TESTDIRS3) $(TESTDIRS4)
TESTF2003DIR = $(BASE_TESTDIR)/Fortran2003

IS_GASNET=1
ifeq ($(IS_GASNET), $(TRUE))
   TESTDIRS_GAS = "local-view/post-wait/C" "local-view/lock-unlock/C" "local-view/intrinsic/C"
   TESTDIRS += $(TESTDIRS_GAS)
   LARGE_TESTDIRS += "local-view/coarray/C/"
   TEST_DEFS = "ONESIDED_LAYER=GASNET"
else
   TESTDIRS_GAS = 
endif

IS_FJRDMA=1
ifeq ($(IS_FJRDMA), $(TRUE))
   TESTDIRS_FJR = "local-view/post-wait/C" 
   TESTDIRS += $(TESTDIRS_FJR)
   LARGE_TESTDIRS += "local-view/coarray/C/"
   TEST_DEFS = "ONESIDED_LAYER=FJRDMA"
else
   TESTDIRS_FJR = 
endif

IS_MPI3_ONESIDED=0
ifeq ($(IS_MPI3_ONESIDED), $(TRUE))
   TESTDIRS_MP3 = 
   TESTDIRS += $(TESTDIRS_MP3)
   LARGE_TESTDIRS += "local-view/coarray/C/"
   TEST_DEFS = "ONESIDED_LAYER=MPI3"
else
   TESTDIRS_MP3 = 
endif

tests: 
	@for subdir in $(TESTDIRS) ; do \
	  $(MAKE) $(TEST_DEFS) -C $(BASE_TESTDIR)/$$subdir ; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

clean-tests:
	@for subdir in $(TESTDIRS) ; do \
	  (cd $(BASE_TESTDIR)/$$subdir && $(MAKE) $(TEST_DEFS) clean ) ;\
	done

run-tests:
	@for subdir in $(TESTDIRS); do \
	  $(MAKE) $(TEST_DEFS) run -C $(BASE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

tests-F2003:
	@$(MAKE) $(TEST_DEFS) -C $(TESTF2003DIR)

clean-tests-F2003:
	cd $(TESTF2003DIR) && $(MAKE) $(TEST_DEFS) clean

run-tests-F2003:
	$(MAKE) $(TEST_DEFS) run -C $(TESTF2003DIR)

submit-tests:
	@for subdir in $(TESTDIRS); do \
	  $(MAKE) $(TEST_DEFS) submit -C $(BASE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

submit1-tests:
	@for subdir in $(TESTDIRS1); do \
	  $(MAKE) $(TEST_DEFS) submit -C $(BASE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

submit2-tests:
	@for subdir in $(TESTDIRS2); do \
	  $(MAKE) $(TEST_DEFS) submit -C $(BASE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

submit3-tests:
	@for subdir in $(TESTDIRS3); do \
	  $(MAKE) $(TEST_DEFS) submit -C $(BASE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

submit4-tests:
	@for subdir in $(TESTDIRS4) $(TESTDIRS_GAS) $(TESTDIRS_FJR) $(TESTDIRS_MP3) ; do \
	  $(MAKE) $(TEST_DEFS) submit -C $(BASE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

showlog-tests:
	@for subdir in $(TESTDIRS); do \
	  $(MAKE) $(TEST_DEFS) showlog -C $(BASE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

cleanlog-tests:
	@for subdir in $(TESTDIRS); do \
	  $(MAKE) $(TEST_DEFS) cleanlog -C $(BASE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

large-tests:
	@for subdir in $(LARGE_TESTDIRS) "global-view/gmove/C" "global-view/gmove/F"; do \
	  $(MAKE) $(TEST_DEFS) -C $(BASE_LARGE_TESTDIR)/$$subdir ; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

clean-large-tests:
	@for subdir in $(LARGE_TESTDIRS) "global-view/gmove/C" "global-view/gmove/F"; do \
	  (cd $(BASE_LARGE_TESTDIR)/$$subdir && $(MAKE) $(TEST_DEFS) clean ) ;\
	done

run-large-tests:
	@for subdir in $(LARGE_TESTDIRS); do \
	  $(MAKE) $(TEST_DEFS) run -C $(BASE_LARGE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

submit-large-tests:
	@for subdir in $(LARGE_TESTDIRS) "global-view/gmove/C" "global-view/gmove/F"; do \
	  $(MAKE) $(TEST_DEFS) submit -C $(BASE_LARGE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

showlog-large-tests:
	@for subdir in $(LARGE_TESTDIRS) "global-view/gmove/C" "global-view/gmove/F"; do \
	  $(MAKE) $(TEST_DEFS) showlog -C $(BASE_LARGE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

cleanlog-large-tests:
	@for subdir in $(LARGE_TESTDIRS) "global-view/gmove/C" "global-view/gmove/F"; do \
	  $(MAKE) $(TEST_DEFS) cleanlog -C $(BASE_LARGE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

PACKAGE_NAME = omnicompiler-$(VERSION)
WORKDIR = /tmp/$(PACKAGE_NAME)
release:
	@make clean; make clean-tests; \
	if [ -e $(WORKDIR) ]; then \
	  echo "Exist ! $(WORKDIR). Please delete it."; exit 1; \
	fi; \
	cp -a . $(WORKDIR); cd $(WORKDIR); sh autogen.sh; \
	if [ "${NIGHTLY_BUILD}" = "true" ]; then ./configure NIGHTLY_BUILD=$(VERSION); \
	else ./configure; fi; \
	rm -rf autom4te.cache config.status config.log confdefs.h; \
	rm -rf .git .gitignore .gitmodules xcodeml-tools/.git xcodeml-tools/.gitignore; \
	make clean; make clean-tests; \
	cd /tmp; tar cjf $(PACKAGE_NAME).tar.bz2 $(PACKAGE_NAME); \
	echo "Created /tmp/$(PACKAGE_NAME).tar.bz2"; \
	rm -rf $(WORKDIR)


remote-tests:
	@bash ./tests/XMP/scripts/remote-tests.sh $(USER)

remote-tests-short:
	@bash ./tests/XMP/scripts/remote-tests.sh $(USER) short

distclean: clean
	rm -rf config.status config.log autom4te.cache confdefs.h
