.PHONY: all install clean tests clean-tests run-tests 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

SUBDIRS=libxmp/include libxmp/src libxmpf/include libxmpf/src libxmp/src_threads \
	C-FrontEnd/src F-FrontEnd/src Driver/src libtlog/src_threads libtlog/src_mpi \
	XcodeML-Common C-BackEnd F-BackEnd XcodeML-Exc-Tools

FALSE=1
TRUE=0
IS_MOD2XMOD=1
ifeq ($(IS_MOD2XMOD), $(TRUE))
    SUBDIRS+=F-FrontEnd/gnu_module
endif

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

IS_ATOOL=1
ifeq ($(IS_ATOOL), $(TRUE))
    SUBDIRS+=Driver/atool
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/xcalablemp/"
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/F" "others/C"
IS_MPI3_ASYNC=0
ifeq ($(IS_MPI3_ASYNC), $(TRUE))
   TESTDIRS3 += "global-view/async/C/" "global-view/async/F/"
endif
BASE_LARGE_TESTDIR = "tests/xcalablemp/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

TESTDIRS  = $(TESTDIRS1) $(TESTDIRS2) $(TESTDIRS3)

IS_GASNET=1
ifeq ($(IS_GASNET), $(TRUE))
   TESTDIRS_GAS = "local-view/post-wait/C" "local-view/coarray/C" "local-view/other/C" "local-view/other/F" \
	          "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" "local-view/lock-unlock/C" "local-view/intrinsic/C"
   TESTDIRS += $(TESTDIRS_GAS)
   LARGE_TESTDIRS += "local-view/coarray/C/"
else
   TESTDIRS_GAS = 
endif

IS_FJRDMA=1
ifeq ($(IS_FJRDMA), $(TRUE))
   TESTDIRS_FJR = "local-view/post-wait/C" "local-view/coarray/C" "local-view/other/C" "local-view/other/F" \
                  "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 += $(TESTDIRS_FJR)
   LARGE_TESTDIRS += "local-view/coarray/C/"
else
   TESTDIRS_FJR = 
endif

IS_MPI3_ONESIDED=0
ifeq ($(IS_MPI3_ONESIDED), $(TRUE))
   TESTDIRS_MP3 = "local-view/coarray/C" "local-view/other/C" "local-view/other/F" \
                  "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 += $(TESTDIRS_MP3)
   LARGE_TESTDIRS += "local-view/coarray/C/"
else
   TESTDIRS_MP3 = 
endif

tests: 
	@for subdir in $(TESTDIRS) ; do \
	  $(MAKE) -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) clean ) ;\
	done

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

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

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

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

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

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

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

cleanlog-tests:
	@for subdir in $(TESTDIRS); do \
	  $(MAKE) 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) -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) clean ) ;\
	done

run-large-tests:
	@for subdir in $(LARGE_TESTDIRS); do \
	  $(MAKE) 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) 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) 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) cleanlog -C $(BASE_LARGE_TESTDIR)$$subdir; \
	  if test $$? -ne 0; then exit 1; fi ;\
	done

PACKAGE_NAME = omnicompiler-$(VERSION)
WORKDIR = /tmp/$(PACKAGE_NAME)
release:
	@if [ -e $(WORKDIR) ]; then \
	  echo "Exist ! $(WORKDIR). Please delete it."; exit 1; \
	fi; \
	cp -a . $(WORKDIR); cd $(WORKDIR); \
	rm -rf .git .gitignore; \
	sh autogen.sh; ./configure; make clean; make clean-tests; \
	cd /tmp; tar cjf $(PACKAGE_NAME).tar.bz2 $(PACKAGE_NAME); \
	echo "/tmp/Created $(PACKAGE_NAME).tar.bz2"; \
	rm -rf $(WORKDIR)

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

distclean: clean
	rm -rf autom4te.cache
