.PHONY: all install clean

CC        = mpicc
CFLAGS    = -O2 -std=gnu99 -Wall -Wpointer-arith -fopenmp -I../include -I$(TLOG_DIR)
GPUCC     = nvcc
GPUCFLAGS = -arch=sm_20 -O3
LIBDIR    = /usr/local/lib
RANLIB    = ranlib
AR        = ar
ARFLAGS   = cru
MKDIR_P   = install -m 755 -d
INSTALL   = install
TLOG_DIR  = ../../libtlog/src_mpi
LIBXMP    = libxmp.a
HEADERS   = ../include/xmp_internal.h ../include/xmp_constant.h ../include/xmp_data_struct.h \
            ../include/xmp_math_function.h
OBJECTS   = xmp_lib.o xmp_util.o xmp_world.o xmp_nodes_stack.o xmp_nodes.o xmp_template.o \
	    xmp_barrier.o xmp_reduce.o xmp_bcast.o xmp_align.o xmp_shadow.o xmp_array_section.o \
	    xmp_loop.o xmp_gmove.o xmp_math_function.o xmp_runtime.o xmp_tlog_runtime.o xmp_io.o \
	    xmp_reflect.o xmp_pack_vector.o xmp_intrinsic.o xmp_section_desc.o xmp_sort.o xmp_async.o

FALSE            = 1
TRUE             = 0
IS_GASNET        = 1
IS_MPI3_ONESIDED = 0
IS_FJRDMA        = 1
IS_KCOMPUTER     = 1
IS_FX10          = 1
IS_FX100         = 1
IS_MPI3_ASYNC    = 0
IS_LIBBLAS       = 1
IS_SSL2BLAMP     = 1
IS_INTELMKL      = 1
IS_TCA           = 1
IS_XACC          = 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_GASNET), $(TRUE))
	OBJECTS += xmp_onesided.o xmp_onesided_gasnet.o xmp_coarray.o xmp_coarray_utils.o xmp_coarray_local.o \
		   xmp_coarray_local_utils.o xmp_post_wait.o xmp_post_wait_gasnet.o \
	           xmp_coarray_gasnet.o xmp_coarray_gasnet_utils.o xmp_lock_unlock.o xmp_lock_unlock_gasnet.o \
		   xmp_intrinsic_gasnet.o
	CFLAGS  += -D_XMP_GASNET
else
ifeq ($(IS_MPI3_ONESIDED), $(TRUE))
#xmp_coarray_mpi_util.o xmp_lock_unlock.o xmp_lock_unlock_mpi.o
	OBJECTS += xmp_onesided.o xmp_onesided_mpi.o xmp_coarray.o xmp_coarray_utils.o xmp_coarray_local.o \
		   xmp_coarray_local_utils.o xmp_post_wait.o xmp_post_wait_mpi.o \
	           xmp_coarray_mpi.o xmp_intrinsic_mpi.o
	CFLAGS += -D_XMP_MPI3_ONESIDED
endif	
endif
ifeq ($(IS_FJRDMA), $(TRUE))
	OBJECTS += xmp_onesided.o xmp_onesided_fjrdma.o xmp_coarray.o xmp_coarray_utils.o xmp_coarray_local.o \
		   xmp_coarray_local_utils.o xmp_post_wait.o xmp_post_wait_fjrdma.o \
		   xmp_coarray_fjrdma.o xmp_coarray_fjrdma_utils.o xmp_intrinsic_fjrdma.o
	CFLAGS  += -D_XMP_FJRDMA
endif

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

ifeq ($(IS_LIBBLAS), $(TRUE))
	CFLAGS += -D_XMP_LIBBLAS
endif

ifeq ($(IS_SSL2BLAMP), $(TRUE))
	CFLAGS += -D_XMP_SSL2BLAMP
endif

ifeq ($(IS_INTELMKL), $(TRUE))
	CFLAGS += -D_XMP_INTELMKL
endif

ifeq ($(IS_TCA), $(TRUE))
#  xmp_coarray_gasnet_utils.o xmp_lock_unlock_gasnet.o xmp_lock_unlock.o
	OBJECTS += xmp_onesided.o xmp_onesided_tca.o xmp_coarray.o xmp_coarray_utils.o xmp_coarray_local.o \
		   xmp_coarray_local_utils.o xmp_post_wait.o xmp_post_wait_tca.o \
		   xmp_coarray_tca.o xmp_reflect_tca.o
	CFLAGS  += -D_XMP_TCA
endif

ifeq ($(IS_XACC), $(TRUE))
	OBJECTS  += xmp_reflect_acc.o xmp_reduce_acc.o xmp_bcast_acc.o xmp_reflect_gpu.o xmp_reduce_gpu.o \
	            xmp_gpu_pack.o xmp_gmove_acc.o xmp_coarray_acc.o
	CFLAGS   += -D_XMP_XACC -I/include
	GPUCC     = nvcc
	GPUCFLAGS = -arch=sm_20 -O3
.SUFFIXES : .o .cu
.cu.o:
	$(GPUCC) $(GPUCFLAGS) -I../include -c $@ $<
endif

all: $(LIBXMP)
$(OBJECTS): $(HEADERS)

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

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

install: $(LIBXMP)
	$(MKDIR_P) $(LIBDIR)
	$(INSTALL) $^ $(LIBDIR)

clean:
	rm -f *~ *.core core core.* *.o $(LIBXMP)

