INSTALL_DIR?=..
libdir=`([ -d /usr/lib64 ] && echo lib64) || echo lib`
LANG=C
CC=gcc -fopenmp
#CC=icc -openmp
CFLAGS+=-std=c99 -O2 -g -fPIC -Wall -pedantic
LDFLAGS=-lffindex -L.
ifdef FFINDEX_STATIC
	LDFLAGS+=-static
	FFINDEX_OBJECTS=libffindex.a
else
	FFINDEX_OBJECTS=libffindex.so libffindex.so.0.1 
endif

#-Wl,--version-script=libffindex.map

ifdef HAVE_MPI
all: ffindex_apply_mpi ffindex_apply ffindex_from_fasta ffindex_get ffindex_build ffindex_modify libffindex.a libffindex.so
else
all: ffindex_apply ffindex_from_fasta ffindex_get ffindex_build ffindex_modify libffindex.a libffindex.so
endif

ffindex.o: ffindex.c ffindex.h ffutil.h

ffindex_apply: $(FFINDEX_OBJECTS) ffindex_apply.o ffindex.h

ffindex_apply_mpi: $(FFINDEX_OBJECTS) ffindex_apply_mpi.o ffindex.h
	mpicc $(CFLAGS) -I $(MPI_INCLUDE) -o $@  ffindex_apply_mpi.o $(LDFLAGS)

ffindex_apply_mpi.o: ffindex_apply_mpi.c ffindex.h
	mpicc $(CFLAGS) -I $(MPI_INCLUDE) -c ffindex_apply_mpi.c -o $@ 

ffindex_from_fasta: $(FFINDEX_OBJECTS) ffindex_from_fasta.o ffindex.h
	$(CC) -o $@ ffindex_from_fasta.o $(LDFLAGS) -L. -lffindex

ffindex_get: $(FFINDEX_OBJECTS) ffindex_get.o ffindex.h
	$(CC) -o $@ ffindex_get.o $(LDFLAGS) -L. -lffindex

ffindex_build: $(FFINDEX_OBJECTS) ffindex_build.o ffindex.h
	$(CC) -o $@ ffindex_build.o $(LDFLAGS) -L. -lffindex

ffindex_modify: $(FFINDEX_OBJECTS) ffindex_modify.o ffindex.h
	$(CC) -o $@ ffindex_modify.o $(LDFLAGS) -L. -lffindex

libffindex.so.0.1: ffindex.o ffutil.o
	$(CC) -Wl,-z,defs -shared -Wl,-soname,libffindex.so.0.1 -o libffindex.so.0.1 ffindex.o ffutil.o -lc

libffindex.so: libffindex.so.0.1
	ln -sf libffindex.so.0.1 libffindex.so

libffindex.a: ffindex.o ffutil.o
	ar rcs libffindex.a ffutil.o ffindex.o 

test:
	rm -f /tmp/test.data /tmp/test.ffindex
	LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_build -s /tmp/test.data /tmp/test.ffindex ../test/data ../test/data2
	LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get  /tmp/test.data /tmp/test.ffindex a b foo | tee /tmp/test.out
	LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_modify -u /tmp/test.ffindex b
	LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get  /tmp/test.data /tmp/test.ffindex a b foo | tee /tmp/test-unlink.out
	LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_build -a -s /tmp/test.data /tmp/test.ffindex ../test/testfile
	@echo ======== compare results =========
	diff /tmp/test.out test.should
	diff /tmp/test-unlink.out test-unlink.should
	@echo ======== error handling ==========
	@echo
	LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get  /tmp/test.data /tmp/test.ffindex nonexistquery b foo || echo
	LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get  /nonexist/data /tmp/test.ffindex a foo || echo
	LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./ffindex_get  /tmp/test.data /nonexist/index a foo || echo

time:
	LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" zsh -c "time ./ffindex_get  ../test_big/nr20_11Jan10_a3m_db ../test_big/nr20_11Jan10_a3m_db.ffindex BABBAMIBA.a3m KARDUZEBA.a3m HARPAQIBA.a3m WOQQATEBA.a3m BEBRAQIBA.a3m GIRSAKEBA.a3m NAQTIFIBA.a3m BIWCIQABA.a3m > /dev/null"

clean:
	rm -f ffindex.o ffutil.o ffindex_build ffindex_build.o ffindex_get ffindex_get.o libffindex.so libffindex.so.0.1 ffindex_modify ffindex_modify.o \
		libffindex.a  ffindex_from_fasta.o ffindex_from_fasta ffindex_apply_mpi.o ffindex_apply.o

install:
	mkdir -p $(INSTALL_DIR)/bin
	mkdir -p $(INSTALL_DIR)/$(libdir)
	mkdir -p $(INSTALL_DIR)/include
	install ffindex_get $(INSTALL_DIR)/bin/ffindex_get
	install ffindex_build $(INSTALL_DIR)/bin/ffindex_build
	install ffindex_modify $(INSTALL_DIR)/bin/ffindex_modify
	install ffindex_from_fasta $(INSTALL_DIR)/bin/ffindex_from_fasta
	install ffindex_apply $(INSTALL_DIR)/bin/ffindex_apply
	install libffindex.so.0.1 $(INSTALL_DIR)/$(libdir)/libffindex.so.0.1
	install libffindex.a $(INSTALL_DIR)/$(libdir)/libffindex.a
	ln -sf libffindex.so.0.1 $(INSTALL_DIR)/$(libdir)/libffindex.so
	install ffindex.h $(INSTALL_DIR)/include/ffindex.h
	install ffutil.h $(INSTALL_DIR)/include/ffutil.h
ifdef HAVE_MPI
	install ffindex_apply_mpi $(INSTALL_DIR)/bin/ffindex_apply_mpi
endif

deinstall:
	rm -f $(INSTALL_DIR)/bin/ffindex_get $(INSTALL_DIR)/bin/ffindex_build $(INSTALL_DIR)/bin/ffindex_modify \
		$(INSTALL_DIR)/$(libdir)/libffindex.so.0.1 $(INSTALL_DIR)/$(libdir)/libffindex.a \
		$(INSTALL_DIR)/$(libdir)/libffindex.so $(INSTALL_DIR)/include/ffindex.h $(INSTALL_DIR)/include/ffutil.h\
		$(INSTALL_DIR)/bin/ffindex_from_fasta
	rmdir $(INSTALL_DIR)/bin || true
	rmdir $(INSTALL_DIR)/$(libdir) || true
	rmdir $(INSTALL_DIR)/include || true
