#If these variables are set to empty, that means that package is not installed.
NTL_DIR=/usr/local
GMP_DIR=/usr/local
ZNPOLY_DIR=/usr/local

CC = gcc
CFLAGS = -O2 -DNDEBUG

TEST_ALGS = ck fft $(if $(NTL_DIR),ntl) $(if $(ZNPOLY_DIR),znpoly)
CHECK_ALG = $(if $(NTL_DIR),ntl,$(if $(ZNPOLY_DIR),znpoly,ck))
TEST_OUT = $(patsubst %,out-%.txt,$(TEST_ALGS))
TEST_RUNS = $(patsubst %,%_test,$(TEST_ALGS))
HEADERS = lsmul.h classikar_body.c
EXES = test-ck test-fft gen-testdata
SOURCES = basic.c classikar.c fft.c $(patsubst %,%.c,$(EXES))
OBJECTS = $(patsubst %.c,%.o,$(SOURCES))
TOCLEAN = $(OBJECTS) $(EXES) $(TEST_OUT) test-ntl test-znpoly testcases.txt

.PHONY: clean tests $(TEST_RUNS)

tests: $(TEST_RUNS)

$(TEST_RUNS): %_test: out-%.txt out-$(CHECK_ALG).txt
	-diff $+ > /dev/null

$(TEST_OUT): out-%.txt: testcases.txt test-%
	time ./test-$* $< $@

testcases.txt: gen-testdata
	./gen-testdata $@

test-ck: classikar.o
test-fft: fft.o
classikar.o: classikar_body.c

$(EXES): %: %.o basic.o
	$(CC) $^ -o $@ $(CFLAGS)

$(OBJECTS): %.o: %.c lsmul.h
	$(CC) -c $< -o $@ $(CFLAGS)

ifneq ($(strip $(NTL_DIR)),)
test-ntl: test-ntl.cc
	g++ $< -o $@ $(CFLAGS) $(patsubst %,-I%/include,$(GMP_DIR) $(NTL_DIR)) \
	$(patsubst %,-L%/lib,$(GMP_DIR) $(NTL_DIR)) \
	-pipe -lntl $(if $(GMP_DIR),-lgmp) -lm
endif

ifneq ($(strip $(ZNPOLY_DIR)),)
test-znpoly: test-znpoly.c
	$(CC) $< basic.o -o $@ $(patsubst %,-I%/include,$(GMP_DIR) $(ZNPOLY_DIR)) \
	$(patsubst %,-L%/lib,$(GMP_DIR) $(ZNPOLY_DIR)) $(CFLAGS) \
	-pipe -lzn_poly $(if $(GMP_DIR),-lgmp) -lm
endif

clean:
	-rm -f $(TOCLEAN)
