# Compiler
CC = gcc 

# Debug or Release
DEBUG = -g
RELEASE = -O3 -DNDEBUG
EXEC = ${RELEASE}

# Compiler options
CFLAGS = -pipe -fno-exceptions -fstack-protector -Wl,-z,relro -Wl,-z,now\
		-fvisibility=hidden -W -Wall -Wno-unused-parameter\
		-Wno-unused-function -Wno-unused-label -Wpointer-arith -Wformat\
		-Wreturn-type -Wsign-compare -Wmultichar -Wformat-nonliteral\
		-Winit-self -Wuninitialized -Wno-deprecated -Wformat-security -Werror\
		-pedantic -pedantic-errors ${EXEC} -fPIC -I../Measure -march=native\
		-Wl,-rpath=../Measure 

CVER = -std=c99

# FLAGS
FLAGS_VALGRIND = -DRUPIFY

LD_FLAGS= -L../Measure -lmeasure

# Log name
LOG = VALGRIND_LOG

# Executeable name
NAME = main 

SRC = main.c xutil.c bitvector.c naive.c naive_popcount.c classic.c popcount.c\
	  clark.c

OBJ = ${SRC:.c=.o}
ASM = ${SRC:.c=.S}

# what we are trying to build
all: $(NAME)
asm: $(ASM)

# linkage
$(NAME): ${OBJ}
	@echo 
	@echo ================ [Linking] ================ 
	@echo
	$(CC) ${CFLAGS} ${CVER} $(FLAGS_VALGRIND) -o $@ $^ -lm -mpopcnt ${LD_FLAGS}
	@echo
	@echo ================ [${NAME} compiled succesfully] ================ 
	@echo

%.S: %.c
	@echo
	@echo ================ [Building Assembly] ================
	@echo
	$(CC) $(CFLAGS) $(CVER) -c $< -S -o $@
	@echo
	@echo OK [$<] - [$@]
	@echo

# compile every source file
%.o: %.c
	@echo
	@echo ================ [Building Object] ================
	@echo
	$(CC) $(CFLAGS) $(CVER) -c $< -o $@
	@echo
	@echo OK [$<] - [$@]
	@echo

valgrind: clean all
	@echo
	@echo ================ [Executing $(NAME) using Valgrind] ================
	@echo
	valgrind -v --leak-check=full --log-file="$(LOG)" --track-origins=yes \
	--show-reachable=yes ./$(NAME)
	@echo
	@echo ================ [Log] ================
	@echo
	less $(LOG)
	@echo

run: clean all
	@echo
	@echo ================ [Executing $(NAME)] ================
	@echo
	./$(NAME)

clean:
	@echo
	@echo ================ [Cleaning $(NAME)] ================
	@echo
	rm -f *.o *~ $(LOG) $(NAME)

count:
	@echo
	@echo ================ [Counting lines in $(NAME)] ================
	@echo
	sloccount .
