# If the libraries (AMD, COLAMD, CAMD, CCOLAMD, metis, and CHOLMOD) are not
# yet built, use "make local ; make install" in SuiteSparse first.  Then "make"
# to compile and run all tests.
#
# This test requires BTF, METIS, CHOLMOD, AMD, COLAMD, CAMD, and CCOLAMD.

default: all

# for statement coverage, picky tests
C = gcc -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
   	-Wredundant-decls -Wnested-externs -Wdisabled-optimization \
	-std=c11 -g --coverage -fprofile-abs-path -fexceptions \
	-fopenmp

LDLIBS = -L../../lib \
    ../../lib/libsuitesparseconfig.so \
    ../../lib/libamd.so \
    ../../lib/libcolamd.so \
    ../../lib/libcamd.so \
    ../../lib/libccolamd.so \
    ../../lib/libcholmod.so \
    -lm -lrt \
    -Wl,-rpath=../../lib -lstdc++

I = -I../../include/suitesparse -I../Include -I../User -I../../BTF/Include -I../Source -I/usr/local/cuda/include

all: klutest klultest
	- ./klultests > klultests.out
	- ./klutests > klutests.out
	- ./coverage

valgrind: klutest klultest
	- ./vklutests > klutests.out
	- ./vklultests > klultests.out
	- ./coverage

purge: clean

distclean: clean

clean:
	- $(RM) klutest klultest *.out klu_*.c user_*.c btf_*.c *.o *.gcda \
            klu.c *.gcno *.gcov gmon.out

INC =  \
	../Include/klu.h \
	../Include/klu_internal.h \
	../Include/klu_version.h

BTFOBJ = \
	btf_order.o \
	btf_maxtrans.o \
	btf_strongcomp.o \
	btf_l_order.o \
	btf_l_maxtrans.o \
	btf_l_strongcomp.o

KLUOBJ = \
	klu_analyze.o \
	klu_analyze_given.o \
	klu_defaults.o \
	klu_free_symbolic.o \
	klu_memory.o \
	klu.o \
	klu_diagnostics.o \
	klu_dump.o \
	klu_factor.o \
	klu_free_numeric.o \
	klu_kernel.o \
	klu_extract.o \
	klu_refactor.o \
	klu_scale.o \
	klu_solve.o \
	klu_tsolve.o \
	klu_z.o \
	klu_z_diagnostics.o \
	klu_z_dump.o \
	klu_z_factor.o \
	klu_z_free_numeric.o \
	klu_z_kernel.o \
	klu_z_extract.o \
	klu_z_refactor.o \
	klu_z_scale.o \
	klu_z_solve.o \
	klu_z_tsolve.o \
	klu_l_analyze.o \
	klu_l_analyze_given.o \
	klu_l_defaults.o \
	klu_l_free_symbolic.o \
	klu_l_memory.o \
	klu_l.o \
	klu_l_diagnostics.o \
	klu_l_dump.o \
	klu_l_factor.o \
	klu_l_free_numeric.o \
	klu_l_kernel.o \
	klu_l_extract.o \
	klu_l_refactor.o \
	klu_l_scale.o \
	klu_l_solve.o \
	klu_l_tsolve.o \
	klu_zl.o \
	klu_zl_diagnostics.o \
	klu_zl_dump.o \
	klu_zl_factor.o \
	klu_zl_free_numeric.o \
	klu_zl_kernel.o \
	klu_zl_extract.o \
	klu_zl_refactor.o \
	klu_zl_scale.o \
	klu_zl_solve.o \
	klu_zl_tsolve.o

KLUCHOLMODOBJ = user_klu_cholmod.o user_klu_l_cholmod.o

OBJ = $(BTFOBJ) $(KLUOBJ) $(KLUCHOLMODOBJ)

$(OBJ): $(INC)

klutest: $(OBJ) klutest.c
	$(C) $(I) klutest.c -o klutest $(OBJ) $(LDLIBS)

klultest: $(OBJ) klultest.c klutest.c
	$(C) $(I) klultest.c -o klultest $(OBJ) $(LDLIBS)

klu.c:
	- ln -s ../Source/$@

klu_%.c:
	- ln -s ../Source/$@

user_%.c:
	- ln -s ../User/$*.c user_$*.c

btf_%.c:
	- ln -s ../../BTF/Source/$@

.c.o:
	$(C) -c $(I) $*.c

.PRECIOUS: klu_%.c btf_%.c user_%.c

