SHELL = /bin/sh

prefix = /usr/local
exec_prefix = ${prefix}
bindir = ${exec_prefix}/bin
libdir = /usr/local/lib
includedir = ${prefix}/include

INSTALLDIRS =\
$(bindir)\
$(libdir)\
$(includedir)

INSTALL = /usr/bin/install -c
INSTALL_PROGRAM = ${INSTALL}
INSTALL_DATA = ${INSTALL} -m 644

MPI = no
# only matters if MPI = yes
VIAFILE = no
CC = gcc
CFLAGS = -g -O2 -Wall -pedantic -D_GNU_SOURCE -std=c99
CFLAGS_TRIANGLE = -O2 -w -ffloat-store
CFLAGS_VULNERABLE = -ffloat-store
LDFLAGS = 

AR = ar
ARFLAGS = cr

MLIB = -lm

SRC_LIB =\
delaunay.c\
hash.c\
istack.c\
lpi.c\
minell.c\
nnai.c\
nnpi.c\
nncommon.c\
nncommon-vulnerable.c\
preader.c\
version.c\
nnhpi_customized.c

HDR_LIB =\
delaunay.h\
delaunay_internal.h\
hash.h\
istack.h\
istack_internal.h\
minell.h\
nan.h\
nn.h\
nnpi.h\
preader.h

SRC_NNBATHY=\
nnbathy.c
HDR_NNBATHY =

PROGRAMS =\
minell\
nnbathy\

TESTS=\
nnai_test\
nnphi_test\
ht_test

OBJ_LIB = $(SRC_LIB:.c=.o)

all: libnn.so libnnhpi_customized.so $(PROGRAMS)

minell: minell.c
	$(CC) -o minell minell.c -DME_STANDALONE $(CFLAGS) -I. $(LDFLAGS) $(MLIB)

ifeq ($(MPI), yes)
delaunay.o: override CC = mpicc
delaunay.o: override CFLAGS += -DMPI -DUSE_SHMEM
nnbathy: override CC = mpicc
nnbathy: override CFLAGS += -DMPI -DUSE_SHMEM
ifeq ($(VIAFILE), yes)
nnbathy: override CFLAGS += -DVIAFILE
SRC_NNBATHY += distribute.c
HDR_NNBATHY += distribute.h
endif
else
nnbathy: override CFLAGS += -DNN_SERIAL
endif

nnbathy: libnn.so nnbathy.c $(SRC_NNBATHY) $(HDR_NNBATHY)
	$(CC) -o nnbathy $(SRC_NNBATHY) $(CFLAGS) -I. -L. -lnn $(MLIB)

standalone: override LDFLAGS+=-static
standalone: $(PROGRAMS)
	strip $(PROGRAMS)

libnn.so: triangle.o $(OBJ_LIB)
	$(CC) -shared -fPIC -o libnn.so triangle.o $(OBJ_LIB)

libnnhpi_customized.so: libnn.so nnhpi_customized.o
	$(CC) -shared -fPIC -o libnnhpi_customized.so nnhpi_customized.o -I. -L. -lnn $(MLIB)

nncommon-vulnerable.o: override CFLAGS+=$(CFLAGS_VULNERABLE)

triangle.o: triangle.c triangle.h
	$(CC) -c -DTRILIBRARY $(CFLAGS_TRIANGLE) -I. -fPIC triangle.c

tests: libnn.so $(TESTS)

nnai_test:
	$(CC) -o nnai_test nnai.c -DNNAI_TEST $(CFLAGS) -I. -L. $(MLIB) -lnn

nnphi_test:
	$(CC) -o nnphi_test nnpi.c -DNNPHI_TEST $(CFLAGS) -I. -L. $(MLIB) -lnn

ht_test:
	$(CC) -o ht_test hash.c -DHT_TEST $(CFLAGS) -I. $(MLIB)

%.o: %.c makefile $(HDR_LIB)
	$(CC) $(CFLAGS) -fPIC -c $< -o $@

clean:
	rm -f *.o libnn.so libnnhpi_customized.so $(PROGRAMS) $(TESTS) *~ core

configclean:
	rm -f config.h makefile config.cache config.status config.log

ex1clean:
	cd examples/1; make clean;

ex2clean:
	cd examples/2; make clean;

ex3clean:
	cd examples/3; make clean;

ex4clean:
	cd examples/4; make clean;

ex5clean:
	cd examples/5; make clean;

ex6clean:
	cd examples/6; make clean;

distclean: clean configclean ex1clean ex2clean ex3clean ex4clean ex5clean ex6clean

indent:
	indent -T FILE -T NN_ALGORITHM -T point -T delaunay -Tdsearch -T lpi -T nnpi -T nnhpi -T indexedpoint -T nnai -T ht_bucket -T hashtable -T istack -T triangle -T triangle_neighbours -T circle -T nn_weights -T lweights -T minell -T specs -T reader -T preader -T grid $(SRC_LIB) $(SRC_NNBATHY) $(HDR_NNBATHY)
	rm -f *~
