CPP = g++
ASM = nasm
ASMFLAGS=-f elf64 -g -F dwarf
DBG = gdb
CFLAGS=-g -std=c++11 -ggdb -Wall -pedantic -lpthread
OPENCV_LIB=`pkg-config --cflags --libs opencv`

CPP_OBJS=../codigo/funciones/funciones.o
CPP_SRC=../codigo/funciones/funciones.cpp

ASM_OBJS=../codigo/asm/convolucion_suavizado.o ../codigo/asm/convolucion_gradiente.o

# para medir tiempos con relacion votaciones radio
BIN_TIEMPO_RELACION_VOTACIONES_RADIO=tiempos_relacion_votaciones_radio

# para medir complejidad con bordes
BIN_TIEMPO_CANTIDAD_BORDES=tiempos_cantidad_bordes

# para medir robustes del algoritmo
BIN_ROBUSTES=robustes

# para medir tiempos
BIN_THREADS=tiempos_threads

# para comparar c++ y assembly
BIN_COMPARAR_CPP_ASM=comparar_cpp_asm

# para medir tiempos umbral borde
BIN_UMBRAL_BORDES=tiempos_umbral_bordes

.PHONY: all clean

# linking
 
$(BIN_TIEMPO_RELACION_VOTACIONES_RADIO): $(BIN_TIEMPO_RELACION_VOTACIONES_RADIO).o $(CPP_OBJS) $(ASM_OBJS)
	$(CPP) $(CFLAGS) $(BIN_TIEMPO_RELACION_VOTACIONES_RADIO).o $(CPP_OBJS) $(ASM_OBJS) -o $@ $(OPENCV_LIB)

$(BIN_TIEMPO_CANTIDAD_BORDES): $(BIN_TIEMPO_CANTIDAD_BORDES).o $(CPP_OBJS) $(ASM_OBJS)
	$(CPP) $(CFLAGS) $(BIN_TIEMPO_CANTIDAD_BORDES).o $(CPP_OBJS) $(ASM_OBJS) -o $@ $(OPENCV_LIB)

$(BIN_ROBUSTES): $(BIN_ROBUSTES).o $(CPP_OBJS) $(ASM_OBJS)
	$(CPP) $(CFLAGS) $(BIN_ROBUSTES).o $(CPP_OBJS) $(ASM_OBJS) -o $@ $(OPENCV_LIB)

$(BIN_THREADS): $(BIN_THREADS).o $(CPP_OBJS) $(ASM_OBJS)
	$(CPP) $(CFLAGS) $(BIN_THREADS).o $(CPP_OBJS) $(ASM_OBJS) -o $@ $(OPENCV_LIB)

$(BIN_COMPARAR_CPP_ASM): $(BIN_COMPARAR_CPP_ASM).o $(CPP_OBJS) $(ASM_OBJS)
	$(CPP) $(CFLAGS) $(BIN_COMPARAR_CPP_ASM).o $(CPP_OBJS) $(ASM_OBJS) -o $@ $(OPENCV_LIB)

$(BIN_UMBRAL_BORDES): $(BIN_UMBRAL_BORDES).o $(CPP_OBJS) $(ASM_OBJS)
	$(CPP) $(CFLAGS) $(BIN_UMBRAL_BORDES).o $(CPP_OBJS) $(ASM_OBJS) -o $@ $(OPENCV_LIB)

# compiling

$(BIN_TIEMPO_RELACION_VOTACIONES_RADIO).o: $(BIN_TIEMPO_RELACION_VOTACIONES_RADIO).cpp
	$(CPP) $(CFLAGS) -c -o $@ $<

$(BIN_THREADS).o: $(BIN_THREADS).cpp
	$(CPP) $(CFLAGS) -c -o $@ $<

$(BIN_COMPARAR_CPP_ASM).o: $(BIN_COMPARAR_CPP_ASM).cpp
	$(CPP) $(CFLAGS) -c -o $@ $<

$(BIN_ROBUSTES).o: $(BIN_ROBUSTES).cpp
	$(CPP) $(CFLAGS) -c -o $@ $<

$(BIN_TIEMPO_CANTIDAD_BORDES).o: $(BIN_TIEMPO_CANTIDAD_BORDES).cpp
	$(CPP) $(CFLAGS) -c -o $@ $<

$(BIN_UMBRAL_BORDES).o: $(BIN_UMBRAL_BORDES).cpp
	$(CPP) $(CFLAGS) -c -o $@ $<

# compiling hough

$(CPP_OBJS): $(CPP_SRC)
	$(CPP) $(CFLAGS) -c -o $@ $<
	
../codigo/asm/convolucion_suavizado.o: ../codigo/asm/convolucion_suavizado.asm
	$(ASM) $(ASMFLAGS) -o $@ $<
	
../codigo/asm/convolucion_gradiente.o: ../codigo/asm/convolucion_gradiente.asm
	$(ASM) $(ASMFLAGS) -o $@ $<

# cleaning

clean:
	rm -f $(CPP_OBJS)
	rm -f $(ASM_OBJS)
	rm -f $(BIN_TIEMPO_RELACION_VOTACIONES_RADIO).o
	rm -f $(BIN_TIEMPO_RELACION_VOTACIONES_RADIO)
	rm -f $(BIN_ROBUSTES).o
	rm -f $(BIN_ROBUSTES)
	rm -f $(BIN_TIEMPO_CANTIDAD_BORDES).o
	rm -f $(BIN_TIEMPO_CANTIDAD_BORDES)
	rm -f $(BIN_THREADS).o
	rm -f $(BIN_THREADS)
	rm -f $(BIN_COMPARAR_CPP_ASM).o
	rm -f $(BIN_COMPARAR_CPP_ASM)
	rm -f $(BIN_UMBRAL_BORDES).o
	rm -f $(BIN_UMBRAL_BORDES)
