# Mondriaan Library Makefile

include ../mondriaan.mk

#scrap default rule:
% :: %.c ;

#Dependencies data
OPTIONS=Options
REMEMBRANCE=Remembrance
SORT=Sort ${OPTIONS}
SPARSEMATRIX=SparseMatrix ${OPTIONS} ${SORT}
PERMUTE=Permute ${SPARSEMATRIX} ${REMEMBRANCE}
DISTR_DEPS=${OPTIONS} ${SORT} ${SPARSEMATRIX}
GAINBUCKET=GainBucket ${OPTIONS}
GRAPH=Graph ${GAINBUCKET} ${DISTR_DEPS}
MATCHMATCHERS=MatchMatchers ${OPTIONS} ${MATCH} ${GRAPH}
MATCHINPRODUCT=MatchInproduct ${OPTIONS} ${MATCH} ${GRAPH}
MATCHSTAIRWAY=MatchStairway ${OPTIONS} ${MATCH} ${GRAPH} ${SORT}
MATCH=Match ${OPTIONS} ${GRAPH}
HKLFM=HKLFM ${OPTIONS} ${GRAPH} ${GAINBUCKET} ${MATCH} ${MATCHMATCHERS} ${MATCHSTAIRWAY} ${MATCHINPRODUCT}
DISTRIBUTEMAT=DistributeMat ${GRAPH} ${HKLFM} ${PERMUTE} ${DISTR_DEPS}
DISTRIBUTEVECLIB=DistributeVecLib ${OPTIONS} ${SPARSEMATRIX}
DISTRIBUTEVECGREEDY=DistributeVecGreedy ${OPTIONS} ${SORT} ${DISTRIBUTEVECLIB}
MATALLOC=Matalloc ${OPTIONS}
DISTRIBUTEVECLOCAL=DistributeVecLocal ${SORT} ${MATALLOC} ${DISTRIBUTEVECLIB}
DISTRIBUTEVECOPT2=DistributeVecOpt2 ${OPTIONS} ${MATALLOC} ${DISTRIBUTEVECLIB}
DISTRIBUTEVECORIG=DistributeVecOrig ${OPTIONS} ${DISTRIBUTEVECLIB}
DISTRIBUTEVEC=DistributeVec ${DISTR_DEPS} ${DISTRIBUTEVECGREEDY} \
    ${DISTRIBUTEVECLOCAL} ${DISTRIBUTEVECOPT2} ${DISTRIBUTEVECORIG} \
    ${DISTRIBUTEVECLIB}
DISTRIBUTEVECORIGEQ=DistributeVecOrigEq ${DISTRIBUTEVECORIG}
HEAP=Heap
SUBSETSUM=SubsetSum ${HEAP}
ZEROVOLUMESEARCH=ZeroVolumeSearch ${SUBSETSUM}
DISTRIBUTE=${DISTRIBUTEMAT} ${DISTRIBUTEVEC} ${DISTRIBUTEVECORIGEQ} ${ZEROVOLUMESEARCH}
CARTESIAN=Cartesian ${DISTRIBUTEVECLIB} ${SPARSEMATRIX}
MONDRIAANLIBRARY=${DISTRIBUTE} ${CARTESIAN}

#targets
lib/libMondriaan${MONDRIAANMAJORVERSION}.a: ${MONDRIAANLIBRARY:%=%.c} ${MONDRIAANLIBRARY:%=%.o} Mondriaan.h
	make -r OBJDEPS='${filter %.o,$^}' libMondriaan.target

all: lib/libMondriaan${MONDRIAANMAJORVERSION}.a

%.target: ${OBJDEPS}
	mkdir -p include
	mkdir -p lib
	cp *.h include/
	ar rcs libMondriaan${MONDRIAANMAJORVERSION}.a $^
	mv libMondriaan${MONDRIAANMAJORVERSION}.a lib/

%.o: %.c %.h
	${CC} ${CFLAGS} -c -o $@ ${filter %.c,$^}

%.cstub:
	rm -f ${@:%.cstub=%}.o

veryclean: clean
	rm -rf lib
	rm -rf include

clean: ${MONDRIAANLIBRARY:%=%.cstub}
	rm -f `find . -name 'core'`