CC=gcc
NASM=nasm
LD=ld

ifeq ($(DEBUG), 1)
	CFLAGS=-ggdb -fPIC -Wall -DDEBUG
	LDFLAGS=-g
	NASMCFLAGS=-g -f elf64
	#PYTHON=python3dm
	PYTHON=python3-dbg
else
	CFLAGS=-fPIC -Wall -Werror
	LDFLAGS=-s
	NASMCFLAGS=-f elf64
	PYTHON=python3
endif

PYTHON_CONFIG=$(PYTHON)-config
PYTHON_CFLAGS=`$(PYTHON_CONFIG) --includes` `$(PYTHON_CONFIG) --cflags`
PYTHON_LDFLAGS=-shared  -fPIC `$(PYTHON_CONFIG) --libs` `$(PYTHON_CONFIG) --ldflags|cut -d' ' -f1,2`

C_SOURCES=$(wildcard *.c)
C_OBJS=$(patsubst %.c,%.o,$(C_SOURCES))
HEADERS=$(wildcard *.h)
ASM_SOURCES=$(wildcard *.asm)
ASM_OBJS=$(patsubst %.asm,%.o,$(ASM_SOURCES))
OBJS=$(ASM_OBJS) $(C_OBJS)
LIB=pyrpn.so

all: .deps pyrpn.so

$(C_OBJS): %.o: %.c $(HEADERS)
	$(CC) $(PYTHON_CFLAGS) $(CFLAGS) -c -o $@ $<

$(ASM_OBJS): %.o: %.asm $(HEADERS)
	$(NASM) $(NASMCFLAGS) -o $@ $<

$(LIB): $(OBJS)
	$(LD) $(LDFLAGS) $(PYTHON_LDFLAGS) -o $@ $^

# Doxygen documentation
doc: doc/.doxygen.stamp

Doxyfile: Doxyfile.mk
	echo "PROJECT_NUMBER        = `cat VERSION`_rev:`git rev-parse --short HEAD`" > $@
	cat $< >> $@

doc/.doxygen.stamp: $(wildcard *.c) $(wildcard *.h) Doxyfile
	touch doc/.doxygen.stamp
	doxygen 1>/dev/null
	echo "Documentation in file://`pwd`/doc/html/index.html"

# Dependencies checking
.deps: check_deps.sh
	sh check_deps.sh "$(CC)" "$(LD)" "$(NASM)" "$(PYTHON)" "$(PYTHON_CONFIG)" && touch .deps

.PHONY: clean distclean checks runtest unittest benchmark

checks: runtest unittest benchmark

benchmark: $(LIB)
	PYTHONPATH=`pwd` $(PYTHON) tests/benchmark.py 0x500 0x2000;  \
		PYTHONPATH=`pwd` $(PYTHON) tests/benchmark.py 0x500 0x4000;
		   

unittest: $(LIB)
	PYTHONPATH=`pwd` $(PYTHON) -m unittest -v -f

runtest:
	make -C tests

clean:
	-rm -fv $(OBJS) $(LIB) test;\
	rm -fRv doc/.doxygen.stamp doc/* Doxyfile;\
	make -C tests clean

distclean: clean
	-rm -vf .deps;\
	rm -Rvf tests/__pycache__;

