#===============================================================================
# KLU/MATLAB/Makefile
#===============================================================================

default: all

include ../../UFconfig/UFconfig.mk

# with CHOLMOD and supporting functions (CAMD, CCOLAMD, METIS)
I = -I. -I../../AMD/Include -I../../COLAMD/Include \
    -I../Include -I../../UFconfig -I../../BTF/Include -I../User \
    -I../../CCOLAMD/Include -I../../CAMD/Include \
    -I$(METIS_PATH)/Lib -I../../CHOLMOD/Include

all: klu

MX = $(MEX) -DDLONG -DNLARGEFILE $(I)

distclean: purge

purge: clean
	- $(RM) *.mex* rename.h

clean:
	- $(RM) $(CLEAN)

#===============================================================================

AMD_INC = ../../AMD/Include/amd.h ../../AMD/Include/amd_internal.h

AMD = \
	amd_1.o \
	amd_2.o \
	amd_aat.o \
	amd_control.o \
	amd_defaults.o \
	amd_dump.o \
	amd_global.o \
	amd_info.o \
	amd_order.o \
	amd_postorder.o \
	amd_post_tree.o \
	amd_preprocess.o \
	amd_valid.o

$(AMD): $(AMD_INC)
amd_1.o: ../../AMD/Source/amd_1.c
	$(MX) -c $<

amd_2.o: ../../AMD/Source/amd_2.c
	$(MX) -c $<

amd_aat.o: ../../AMD/Source/amd_aat.c
	$(MX) -c $<

amd_control.o: ../../AMD/Source/amd_control.c
	$(MX) -c $<

amd_defaults.o: ../../AMD/Source/amd_defaults.c
	$(MX) -c $<

amd_dump.o: ../../AMD/Source/amd_dump.c
	$(MX) -c $<

amd_global.o: ../../AMD/Source/amd_global.c
	$(MX) -c $<

amd_info.o: ../../AMD/Source/amd_info.c
	$(MX) -c $<

amd_order.o: ../../AMD/Source/amd_order.c
	$(MX) -c $<

amd_postorder.o: ../../AMD/Source/amd_postorder.c
	$(MX) -c $<

amd_post_tree.o: ../../AMD/Source/amd_post_tree.c
	$(MX) -c $<

amd_preprocess.o: ../../AMD/Source/amd_preprocess.c
	$(MX) -c $<

amd_valid.o: ../../AMD/Source/amd_valid.c
	$(MX) -c $<

#===============================================================================

CAMD_INC = ../../CAMD/Include/camd.h ../../CAMD/Include/camd_internal.h

CAMD = \
	camd_1.o \
	camd_2.o \
	camd_aat.o \
	camd_control.o \
	camd_defaults.o \
	camd_dump.o \
	camd_global.o \
	camd_info.o \
	camd_order.o \
	camd_postorder.o \
	camd_preprocess.o \
	camd_valid.o

$(CAMD): $(CAMD_INC)

camd_1.o: ../../CAMD/Source/camd_1.c
	$(MX) -c $<

camd_2.o: ../../CAMD/Source/camd_2.c
	$(MX) -c $<

camd_aat.o: ../../CAMD/Source/camd_aat.c
	$(MX) -c $<

camd_control.o: ../../CAMD/Source/camd_control.c
	$(MX) -c $<

camd_defaults.o: ../../CAMD/Source/camd_defaults.c
	$(MX) -c $<

camd_dump.o: ../../CAMD/Source/camd_dump.c
	$(MX) -c $<

camd_global.o: ../../CAMD/Source/camd_global.c
	$(MX) -c $<

camd_info.o: ../../CAMD/Source/camd_info.c
	$(MX) -c $<

camd_order.o: ../../CAMD/Source/camd_order.c
	$(MX) -c $<

camd_postorder.o: ../../CAMD/Source/camd_postorder.c
	$(MX) -c $<

camd_post_tree.o: ../../CAMD/Source/camd_post_tree.c
	$(MX) -c $<

camd_preprocess.o: ../../CAMD/Source/camd_preprocess.c
	$(MX) -c $<

camd_valid.o: ../../CAMD/Source/camd_valid.c
	$(MX) -c $<

#===============================================================================

COLAMD_INC = ../../COLAMD/Include/colamd.h

COLAMD = colamd.o colamd_global.o

$(COLAMD): $(COLAMD_INC)

colamd.o: ../../COLAMD/Source/colamd.c
	$(MX) -c $<

colamd_global.o: ../../COLAMD/Source/colamd_global.c
	$(MX) -c $<

#===============================================================================

CCOLAMD_INC = ../../CCOLAMD/Include/ccolamd.h

CCOLAMD = ccolamd.o ccolamd_global.o

$(CCOLAMD): $(CCOLAMD_INC)

ccolamd.o: ../../CCOLAMD/Source/ccolamd.c
	$(MX) -c $<

ccolamd_global.o: ../../CCOLAMD/Source/ccolamd_global.c
	$(MX) -c $<

#===============================================================================

# patch METIS 4.0.1
rename.h: $(METIS_PATH)/Lib/rename.h
	echo '/* do not edit this file; generated by KLU/MATLAB/Makefile */' > rename.h
	echo '#undef log2' >> rename.h
	echo '#include "$(METIS_PATH)/Lib/rename.h"' >> rename.h
	echo '#undef log2' >> rename.h
	echo '#define log2 METIS__log2' >> rename.h
	echo '#include "mex.h"' >> rename.h
	echo '#define malloc mxMalloc' >> rename.h
	echo '#define free mxFree' >> rename.h
	echo '#define calloc mxCalloc' >> rename.h
	echo '#define realloc mxRealloc' >> rename.h

METIS_INC = rename.h \
	$(METIS_PATH)/Lib/defs.h \
	$(METIS_PATH)/Lib/macros.h \
	$(METIS_PATH)/Lib/metis.h \
	$(METIS_PATH)/Lib/proto.h \
	$(METIS_PATH)/Lib/rename.h \
	$(METIS_PATH)/Lib/struct.h 

METIS = \
	balance.o \
	bucketsort.o \
	ccgraph.o \
	coarsen.o \
	compress.o \
	debug.o \
	estmem.o \
	fm.o \
	fortran.o \
	frename.o \
	graph.o \
	initpart.o \
	kmetis.o \
	kvmetis.o \
	kwayfm.o \
	kwayrefine.o \
	kwayvolfm.o \
	kwayvolrefine.o \
	match.o \
	mbalance2.o \
	mbalance.o \
	mcoarsen.o \
	memory.o \
	mesh.o \
	meshpart.o \
	mfm2.o \
	mfm.o \
	mincover.o \
	minitpart2.o \
	minitpart.o \
	mkmetis.o \
	mkwayfmh.o \
	mkwayrefine.o \
	mmatch.o \
	mmd.o \
	mpmetis.o \
	mrefine2.o \
	mrefine.o \
	mutil.o \
	myqsort.o \
	ometis.o \
	parmetis.o \
	pmetis.o \
	pqueue.o \
	refine.o \
	separator.o \
	sfm.o \
	srefine.o \
	stat.o \
	subdomains.o \
	timing.o \
	util.o

$(METIS): $(METIS_INC)

balance.o: $(METIS_PATH)/Lib/balance.c
	$(MX) -c $<

bucketsort.o: $(METIS_PATH)/Lib/bucketsort.c
	$(MX) -c $<

ccgraph.o: $(METIS_PATH)/Lib/ccgraph.c
	$(MX) -c $<

coarsen.o: $(METIS_PATH)/Lib/coarsen.c
	$(MX) -c $<

compress.o: $(METIS_PATH)/Lib/compress.c
	$(MX) -c $<

debug.o: $(METIS_PATH)/Lib/debug.c
	$(MX) -c $<

estmem.o: $(METIS_PATH)/Lib/estmem.c
	$(MX) -c $<

fm.o: $(METIS_PATH)/Lib/fm.c
	$(MX) -c $<

fortran.o: $(METIS_PATH)/Lib/fortran.c
	$(MX) -c $<

frename.o: $(METIS_PATH)/Lib/frename.c
	$(MX) -c $<

graph.o: $(METIS_PATH)/Lib/graph.c
	$(MX) -c $<

initpart.o: $(METIS_PATH)/Lib/initpart.c
	$(MX) -c $<

kmetis.o: $(METIS_PATH)/Lib/kmetis.c
	$(MX) -c $<

kvmetis.o: $(METIS_PATH)/Lib/kvmetis.c
	$(MX) -c $<

kwayfm.o: $(METIS_PATH)/Lib/kwayfm.c
	$(MX) -c $<

kwayrefine.o: $(METIS_PATH)/Lib/kwayrefine.c
	$(MX) -c $<

kwayvolfm.o: $(METIS_PATH)/Lib/kwayvolfm.c
	$(MX) -c $<

kwayvolrefine.o: $(METIS_PATH)/Lib/kwayvolrefine.c
	$(MX) -c $<

match.o: $(METIS_PATH)/Lib/match.c
	$(MX) -c $<

mbalance2.o: $(METIS_PATH)/Lib/mbalance2.c
	$(MX) -c $<

mbalance.o: $(METIS_PATH)/Lib/mbalance.c
	$(MX) -c $<

mcoarsen.o: $(METIS_PATH)/Lib/mcoarsen.c
	$(MX) -c $<

memory.o: $(METIS_PATH)/Lib/memory.c
	$(MX) -c $<

mesh.o: $(METIS_PATH)/Lib/mesh.c
	$(MX) -c $<

meshpart.o: $(METIS_PATH)/Lib/meshpart.c
	$(MX) -c $<

mfm2.o: $(METIS_PATH)/Lib/mfm2.c
	$(MX) -c $<

mfm.o: $(METIS_PATH)/Lib/mfm.c
	$(MX) -c $<

mincover.o: $(METIS_PATH)/Lib/mincover.c
	$(MX) -c $<

minitpart2.o: $(METIS_PATH)/Lib/minitpart2.c
	$(MX) -c $<

minitpart.o: $(METIS_PATH)/Lib/minitpart.c
	$(MX) -c $<

mkmetis.o: $(METIS_PATH)/Lib/mkmetis.c
	$(MX) -c $<

mkwayfmh.o: $(METIS_PATH)/Lib/mkwayfmh.c
	$(MX) -c $<

mkwayrefine.o: $(METIS_PATH)/Lib/mkwayrefine.c
	$(MX) -c $<

mmatch.o: $(METIS_PATH)/Lib/mmatch.c
	$(MX) -c $<

mmd.o: $(METIS_PATH)/Lib/mmd.c
	$(MX) -c $<

mpmetis.o: $(METIS_PATH)/Lib/mpmetis.c
	$(MX) -c $<

mrefine2.o: $(METIS_PATH)/Lib/mrefine2.c
	$(MX) -c $<

mrefine.o: $(METIS_PATH)/Lib/mrefine.c
	$(MX) -c $<

mutil.o: $(METIS_PATH)/Lib/mutil.c
	$(MX) -c $<

myqsort.o: $(METIS_PATH)/Lib/myqsort.c
	$(MX) -c $<

ometis.o: $(METIS_PATH)/Lib/ometis.c
	$(MX) -c $<

parmetis.o: $(METIS_PATH)/Lib/parmetis.c
	$(MX) -c $<

pmetis.o: $(METIS_PATH)/Lib/pmetis.c
	$(MX) -c $<

pqueue.o: $(METIS_PATH)/Lib/pqueue.c
	$(MX) -c $<

refine.o: $(METIS_PATH)/Lib/refine.c
	$(MX) -c $<

separator.o: $(METIS_PATH)/Lib/separator.c
	$(MX) -c $<

sfm.o: $(METIS_PATH)/Lib/sfm.c
	$(MX) -c $<

srefine.o: $(METIS_PATH)/Lib/srefine.c
	$(MX) -c $<

stat.o: $(METIS_PATH)/Lib/stat.c
	$(MX) -c $<

subdomains.o: $(METIS_PATH)/Lib/subdomains.c
	$(MX) -c $<

timing.o: $(METIS_PATH)/Lib/timing.c
	$(MX) -c $<

util.o: $(METIS_PATH)/Lib/util.c
	$(MX) -c $<

#===============================================================================

CHOLMOD_INC = \
	../../CHOLMOD/Include/cholmod_blas.h \
	../../CHOLMOD/Include/cholmod_cholesky.h \
	../../CHOLMOD/Include/cholmod_complexity.h \
	../../CHOLMOD/Include/cholmod_config.h \
	../../CHOLMOD/Include/cholmod_core.h \
	../../CHOLMOD/Include/cholmod.h \
	../../CHOLMOD/Include/cholmod_internal.h \
	../../CHOLMOD/Include/cholmod_io64.h \
	../../CHOLMOD/Include/cholmod_partition.h \
	../../CHOLMOD/Include/cholmod_template.h

CHOLMOD = \
	cholmod_amd.o \
	cholmod_analyze.o \
	cholmod_colamd.o \
	cholmod_etree.o \
	cholmod_postorder.o \
	cholmod_rowcolcounts.o \
	cholmod_aat.o \
	cholmod_add.o \
	cholmod_band.o \
	cholmod_change_factor.o \
	cholmod_common.o \
	cholmod_complex.o \
	cholmod_copy.o \
	cholmod_dense.o \
	cholmod_error.o \
	cholmod_factor.o \
	cholmod_memory.o \
	cholmod_sparse.o \
	cholmod_transpose.o \
	cholmod_triplet.o \
	cholmod_camd.o \
	cholmod_ccolamd.o \
	cholmod_csymamd.o \
	cholmod_metis.o \
	cholmod_nesdis.o

$(CHOLMOD): $(CHOLMOD_INC)

CH = -DNSUPERNODAL -DNMODIFY -DNMATRIXOPS -DNCHECK

cholmod_amd.o: ../../CHOLMOD/Cholesky/cholmod_amd.c
	$(MX) $(CH) -c $<

cholmod_analyze.o: ../../CHOLMOD/Cholesky/cholmod_analyze.c
	$(MX) $(CH) -c $<

cholmod_colamd.o: ../../CHOLMOD/Cholesky/cholmod_colamd.c
	$(MX) $(CH) -c $<

cholmod_etree.o: ../../CHOLMOD/Cholesky/cholmod_etree.c
	$(MX) $(CH) -c $<

cholmod_postorder.o: ../../CHOLMOD/Cholesky/cholmod_postorder.c
	$(MX) $(CH) -c $<

cholmod_rowcolcounts.o: ../../CHOLMOD/Cholesky/cholmod_rowcolcounts.c
	$(MX) $(CH) -c $<

cholmod_aat.o: ../../CHOLMOD/Core/cholmod_aat.c
	$(MX) $(CH) -c $<

cholmod_add.o: ../../CHOLMOD/Core/cholmod_add.c
	$(MX) $(CH) -c $<

cholmod_band.o: ../../CHOLMOD/Core/cholmod_band.c
	$(MX) $(CH) -c $<

cholmod_change_factor.o: ../../CHOLMOD/Core/cholmod_change_factor.c \
	../../CHOLMOD/Core/t_cholmod_change_factor.c
	$(MX) $(CH) -c $<

cholmod_common.o: ../../CHOLMOD/Core/cholmod_common.c
	$(MX) $(CH) -c $<

cholmod_complex.o: ../../CHOLMOD/Core/cholmod_complex.c
	$(MX) $(CH) -c $<

cholmod_copy.o: ../../CHOLMOD/Core/cholmod_copy.c
	$(MX) $(CH) -c $<

cholmod_dense.o: ../../CHOLMOD/Core/cholmod_dense.c \
	../../CHOLMOD/Core/t_cholmod_dense.c
	$(MX) $(CH) -c $<

cholmod_error.o: ../../CHOLMOD/Core/cholmod_error.c
	$(MX) $(CH) -c $<

cholmod_factor.o: ../../CHOLMOD/Core/cholmod_factor.c
	$(MX) $(CH) -c $<

cholmod_memory.o: ../../CHOLMOD/Core/cholmod_memory.c
	$(MX) $(CH) -c $<

cholmod_sparse.o: ../../CHOLMOD/Core/cholmod_sparse.c
	$(MX) $(CH) -c $<

cholmod_transpose.o: ../../CHOLMOD/Core/cholmod_transpose.c \
	../../CHOLMOD/Core/t_cholmod_transpose.c
	$(MX) $(CH) -c $<

cholmod_triplet.o: ../../CHOLMOD/Core/cholmod_triplet.c \
	../../CHOLMOD/Core/t_cholmod_triplet.c
	$(MX) $(CH) -c $<

cholmod_camd.o: ../../CHOLMOD/Partition/cholmod_camd.c
	$(MX) $(CH) -c $<

cholmod_ccolamd.o: ../../CHOLMOD/Partition/cholmod_ccolamd.c
	$(MX) $(CH) -c $<

cholmod_csymamd.o: ../../CHOLMOD/Partition/cholmod_csymamd.c
	$(MX) $(CH) -c $<

cholmod_metis.o: ../../CHOLMOD/Partition/cholmod_metis.c
	$(MX) $(CH) -c $<

cholmod_nesdis.o: ../../CHOLMOD/Partition/cholmod_nesdis.c
	$(MX) $(CH) -c $<

#===============================================================================

BTF_INC = ../../BTF/Include/btf.h ../../BTF/Include/btf_internal.h

BTF = btf_maxtrans.o btf_order.o btf_strongcomp.o

$(BTF): $(BTF_INC)

btf_maxtrans.o: ../../BTF/Source/btf_maxtrans.c
	$(MX) -c $<

btf_order.o: ../../BTF/Source/btf_order.c
	$(MX) -c $<

btf_strongcomp.o: ../../BTF/Source/btf_strongcomp.c
	$(MX) -c $<

#===============================================================================

KLU_INC = ../Include/klu.h ../Include/klu_internal.h ../Include/klu_version.h \
	../User/klu_cholmod.h

KLU_L = klu_l.o klu_l_kernel.o klu_l_dump.o \
    klu_l_factor.o klu_l_free_numeric.o klu_l_solve.o \
    klu_l_scale.o klu_l_refactor.o \
    klu_l_tsolve.o klu_l_diagnostics.o klu_l_sort.o klu_l_extract.o

KLU_ZL = klu_zl.o klu_zl_kernel.o klu_zl_dump.o \
    klu_zl_factor.o klu_zl_free_numeric.o klu_zl_solve.o \
    klu_zl_scale.o klu_zl_refactor.o \
    klu_zl_tsolve.o klu_zl_diagnostics.o klu_zl_sort.o klu_zl_extract.o

COMMON = klu_free_symbolic.o klu_defaults.o klu_analyze_given.o \
    klu_analyze.o klu_memory.o
    
USER = klu_l_cholmod.o

KLU = $(COMMON) $(KLU_L) $(KLU_ZL) $(USER)

$(KLU): $(KLU_INC)

#-------------------------------------------------------------------------------

klu_l.o: ../Source/klu.c
	$(MX) -c $<
	$(MV) klu.o $@

klu_zl.o: ../Source/klu.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu.o $@

klu_l_kernel.o: ../Source/klu_kernel.c
	$(MX) -c $<
	$(MV) klu_kernel.o $@

klu_zl_kernel.o: ../Source/klu_kernel.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_kernel.o $@

klu_l_sort.o: ../Source/klu_sort.c
	$(MX) -c $<
	$(MV) klu_sort.o $@

klu_zl_sort.o: ../Source/klu_sort.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_sort.o $@

klu_l_diagnostics.o: ../Source/klu_diagnostics.c
	$(MX) -c $<
	$(MV) klu_diagnostics.o $@

klu_zl_diagnostics.o: ../Source/klu_diagnostics.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_diagnostics.o $@

klu_l_dump.o: ../Source/klu_dump.c
	$(MX) -c $<
	$(MV) klu_dump.o $@

klu_zl_dump.o: ../Source/klu_dump.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_dump.o $@

klu_l_factor.o: ../Source/klu_factor.c
	$(MX) -c $<
	$(MV) klu_factor.o $@

klu_zl_factor.o: ../Source/klu_factor.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_factor.o $@

klu_l_free_numeric.o: ../Source/klu_free_numeric.c
	$(MX) -c $<
	$(MV) klu_free_numeric.o $@

klu_zl_free_numeric.o: ../Source/klu_free_numeric.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_free_numeric.o $@

klu_l_extract.o: ../Source/klu_extract.c
	$(MX) -c $<
	$(MV) klu_extract.o $@

klu_zl_extract.o: ../Source/klu_extract.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_extract.o $@

klu_l_refactor.o: ../Source/klu_refactor.c
	$(MX) -c $<
	$(MV) klu_refactor.o $@

klu_zl_refactor.o: ../Source/klu_refactor.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_refactor.o $@

klu_l_scale.o: ../Source/klu_scale.c
	$(MX) -c $<
	$(MV) klu_scale.o $@

klu_zl_scale.o: ../Source/klu_scale.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_scale.o $@

klu_l_solve.o: ../Source/klu_solve.c
	$(MX) -c $<
	$(MV) klu_solve.o $@

klu_zl_solve.o: ../Source/klu_solve.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_solve.o $@

klu_l_tsolve.o: ../Source/klu_tsolve.c
	$(MX) -c $<
	$(MV) klu_tsolve.o $@

klu_zl_tsolve.o: ../Source/klu_tsolve.c
	$(MX) -c -DCOMPLEX $<
	$(MV) klu_tsolve.o $@

#-------------------------------------------------------------------------------

klu_analyze.o: ../Source/klu_analyze.c
	$(MX) -c $<

klu_analyze_given.o: ../Source/klu_analyze_given.c
	$(MX) -c $<

klu_defaults.o: ../Source/klu_defaults.c
	$(MX) -c $<

klu_free_symbolic.o: ../Source/klu_free_symbolic.c
	$(MX) -c $<

klu_memory.o: ../Source/klu_memory.c
	$(MX) -c $<

#-------------------------------------------------------------------------------

klu_l_cholmod.o: ../User/klu_l_cholmod.c
	$(MX) $(CH) -c $<

#===============================================================================

OBJ = $(AMD) $(CAMD) $(COLAMD) $(CCOLAMD) $(METIS) $(CHOLMOD) $(KLU) $(BTF)

klu: klu_mex.c $(OBJ)
	$(MX) -output klu klu_mex.c $(OBJ)

