BDIR=$(realpath  $(CTF_BUILD_DIR))
ifeq (,${BDIR})
  BDIR=$(shell pwd)
endif
export BDIR
export ODIR=$(BDIR)/obj
include $(BDIR)/config.mk
export FCXX
export OFFLOAD_CXX
export LIBS

all: $(BDIR)/lib/libctf.a


EXAMPLES = dft dft_3D gemm gemm_4D scalar trace weigh_4D subworld_gemm \
           permute_multiworld strassen slice_gemm ccsd sparse_permuted_slice qinformatics endomorphism endomorphism_cust endomorphism_cust_sp \
           univar_function univar_transform_cust univar_transform_cust_sp spmv spmm jacobi apsp fft \
           sparse_mp3 bivar_function bivar_transform bivar_function_cust bitonic \
           btwn_central sssp

TESTS = test_suite pgemm_test nonsq_pgemm_test diag_sym sym3 readwrite_test \
        ccsdt_t3_to_t2 ccsdt_map_test multi_tsr_sym diag_ctr readall_test  sy_times_ns repack \
        sptensor_sum speye

BENCHMARKS = nonsq_pgemm_bench bench_contraction bench_nosym_transp bench_redistribution model_trainer

STUDIES = fast_diagram fast_3mm fast_sym fast_sym_4D \
          fast_tensor_ctr fast_sy_as_as_tensor_ctr fast_as_as_sy_tensor_ctr

EXECUTABLES = $(EXAMPLES) $(TESTS) $(BENCHMARKS) $(STUDIES)

export EXAMPLES
export TESTS
export BENCHMARKS
export STUDIES




.PHONY: executables
executables: $(EXECUTABLES)
$(EXECUTABLES): $(BDIR)/lib/libctf.a


.PHONY: examples
examples: $(EXAMPLES)
$(EXAMPLES):
	$(MAKE) $@ -C examples

.PHONY: tests
tests: $(TESTS)
$(TESTS):
	$(MAKE) $@ -C test

.PHONY: bench
bench: $(BENCHMARKS)
$(BENCHMARKS):
	$(MAKE) $@ -C bench

.PHONY: studies
studies: $(STUDIES)
$(STUDIES):
	$(MAKE) $@ -C studies

.PHONY: ctf
ctf:
	$(MAKE) ctf -C src; 

.PHONY: ctflib
ctflib: ctf 
	$(AR) -crs $(BDIR)/lib/libctf.a $(ODIR)/*.o; 

$(BDIR)/lib/libctf.a: src/*/*.cu src/*/*.cxx src/*/*.h Makefile src/Makefile src/*/Makefile $(BDIR)/config.mk
	$(MAKE) ctflib
	
clean: clean_bin clean_lib clean_obj
#	$(MAKE) $@ -C src


test: test_suite
	$(BDIR)/bin/test_suite

test2: test_suite
	mpirun -np 2 $(BDIR)/bin/test_suite

test3: test_suite
	mpirun -np 3 $(BDIR)/bin/test_suite

test4: test_suite
	mpirun -np 4 $(BDIR)/bin/test_suite

test6: test_suite
	mpirun -np 6 $(BDIR)/bin/test_suite

test7: test_suite
	mpirun -np 7 $(BDIR)/bin/test_suite

test8: test_suite
	mpirun -np 8 $(BDIR)/bin/test_suite

clean_bin:
	for comp in $(EXECUTABLES) ; do \
		rm -f $(BDIR)/bin/$$comp ; \
	done 

clean_lib:
	rm -f $(BDIR)/lib/libctf.a

clean_obj:
	rm -f src/*/*.o #DEPRECATED: objs no longer created here, but keep it clean in case of git pull
	rm -f $(ODIR)/*.o