.PHONY: all install clean

CC           = mpicc
FC           = mpif90
FCFLAGS      = -O2 -fopenmp -ffree-form -fcray-pointer
XMP_INC_DIR  = ../../libxmp/include
XMPF_INC_DIR = ../include
CFLAGS       = -I$(XMPF_INC_DIR) -I$(XMP_INC_DIR) -I../../include -O2 -std=gnu99 -Wall -Wpointer-arith -fopenmp
LDFLAGS      = 
TARGET       = x86_64-unknown-linux-gnu
MKDIR_P      = install -m 755 -d
INSTALL      = install
RANLIB       = ranlib
AR           = ar
ARFLAGS      = cru
LIBDIR       = /usr/local/lib
INCDIR       = /usr/local/include
WORKDIR      = ./include_work
LIBXMPF      = libxmpf.a
F_MAIN_O     = xmpf_main.o
HEADERS   = $(XMPF_INC_DIR)/xmpf_internal.h $(XMPF_INC_DIR)/xmpf_internal_coarray.h \
	    $(XMP_INC_DIR)/xmp.h $(XMP_INC_DIR)/xmp_internal.h $(XMP_INC_DIR)/xmp_func_decl.h \
	    ../../include/config.h
OBJECTS   = xmpf_array.o xmpf_async.o xmpf_gcomm.o xmpf_gmove.o xmpf_index.o xmpf_lib.o \
	    xmpf_loop.o xmpf_misc.o xmpf_nodes.o xmpf_pack.o xmpf_reflect.o xmpf_sort.o \
	    xmpf_task.o xmpf_template.o \
            xmpf_coarray.o xmpf_coarray_alloc.o \
	    xmpf_coarray_wrap.o xmpf_coarray_alloc_wrap.o \
            xmpf_coarray_put.o xmpf_coarray_get.o xmpf_coarray_atomic.o \
	    xmpf_coarray_put_wrap.o xmpf_coarray_get_wrap.o xmpf_coarray_atomic_wrap.o \
	    xmpf_coarray_lib.o xmpf_coarray_reduction.o \
            xmpf_coarray_decl.o $(F_MAIN_O)

FALSE            = 1
TRUE             = 0
IS_CRAY          = 1
IS_GASNET        = 1
IS_MPI3_ONESIDED = 0
IS_FJRDMA        = 1
IS_MPI3_ASYNC    = 0
IS_POWERPC       = 1
IS_SUPERUX       = 1
IS_KCOMPUTER     = 1
IS_FX10          = 1
IS_FX100         = 1

ifeq ($(IS_KCOMPUTER), $(TRUE))
        CFLAGS += -D_KCOMPUTER
endif
ifeq ($(IS_FX10), $(TRUE))
        CFLAGS += -D_FX10
endif
ifeq ($(IS_FX100), $(TRUE))
        CFLAGS += -D_FX100
endif

ifeq ($(IS_CRAY), $(TRUE))
    XMPF_COARRAY_DECL = XMPF_COARRAY_DECL.mod
else
    XMPF_COARRAY_DECL = xmpf_coarray_decl.mod
endif

ifeq ($(IS_GASNET), $(TRUE))
    CFLAGS  += -D_XMP_GASNET
ifeq ($(IS_POWERPC), $(TRUE))
    FCFLAGS += -WF,-D_XMP_GASNET
else
    FCFLAGS += -D_XMP_GASNET
endif
endif

ifeq ($(IS_MPI3_ONESIDED), $(TRUE))
    CFLAGS  += -D_XMP_MPI3_ONESIDED
    FCFLAGS += -D_XMP_MPI3_ONESIDED
endif

ifeq ($(IS_MPI3_ASYNC), $(TRUE))
    CFLAGS += -D_XMP_MPI3
endif

ifeq ($(IS_FJRDMA), $(TRUE))
    CFLAGS  += -D_XMP_FJRDMA
    FCFLAGS += -D_XMP_FJRDMA
endif

ifeq ($(IS_SUPERUX), $(TRUE))
    COARRAY_SYNC_H = xmp_coarray_sync_sxace.h
else
    COARRAY_SYNC_H = xmp_coarray_sync.h
endif

%.f90: %.f90.sh
	bash $< $(TARGET) > $@

%.F90: %.F90.sh
	bash $< $(TARGET) > $@

all: $(LIBXMPF)

$(LIBXMPF): $(F_MAIN_O) $(OBJECTS)
	rm -f $@
	$(AR) $(ARFLAGS) $@ $^
	$(RANLIB) $@

.c.o:
	$(CC) $(CFLAGS) $< -c

$(OBJECTS): $(HEADERS)

.SUFFIXES : .o .f90
.f90.o: 
	$(FC) $(FCFLAGS) $< -c

.SUFFIXES : .o .F90
.F90.o:
	$(FC) $(FCFLAGS) $< -c

$(XMPF_COARRAY_DECL) xmpf_coarray_decl.o: xmpf_coarray_decl.f90
	rm -rf $(WORKDIR)
	$(MKDIR_P) $(WORKDIR)
	$(INSTALL) ../include/*.h $(WORKDIR)
	$(INSTALL) ../include/$(COARRAY_SYNC_H) $(WORKDIR)/xmp_coarray_sync.h
	$(FC) $(FCFLAGS) -c -I $(WORKDIR) $<

install: $(F_MAIN_O) $(LIBXMPF) $(XMPF_COARRAY_DECL)
	$(MKDIR_P) $(LIBDIR) $(INCDIR)
	$(INSTALL) $(F_MAIN_O) $(LIBXMPF) $(LIBDIR)
	$(INSTALL) $(XMPF_COARRAY_DECL) $(INCDIR)

clean:
	rm -f xmpf_coarray_put_wrap.f90 xmpf_coarray_get_wrap.f90 \
	      xmpf_coarray_alloc_wrap.f90 xmpf_coarray_reduction.F90
	rm -rf $(WORKDIR) *~ *.o $(LIBXMPF) *.mod

