CC=g++
CASM=nasm
CCUDA=/usr/local/cuda/bin/nvcc -arch=sm_10 `pkg-config --cflags --libs opencv` 
CXXFLAGS= -ggdb `pkg-config --cflags --libs opencv`
PATHCPP = cpp/
PATHCUDA = cuda/
PATHASM = asm/

cpp= brillo.CPP brillohisto.CPP eliminarcanales.CPP gaussEscalada.CPP gaussSimple.CPP greyscale.CPP intercambiar.CPP interpolacion.CPP laplace.CPP pixelizar.CPP  rangeOperator.CPP rgbtohsl.CPP sobel.CPP
asm= brillo.ASM brillohisto.ASM eliminarcanales.ASM gaussEscalada.ASM gaussSimple.ASM greyscale.ASM intercambiar.ASM interpolacion.ASM laplace.ASM pixelizar.ASM  rangeOperator.ASM sobel.ASM
cuda= pixelizar.CUDA sobel.CUDA interpolacion.CUDA intercambiar.CUDA greyscale.CUDA rangeOperator.CUDA rgbtohsl.CUDA gaussSimple.CUDA gaussEscalada.CUDA brillo.CUDA laplace.CUDA eliminarcanales.CUDA
video= rangeOperator.Video laplace.Video greyscale.Video gaussSimple.Video gaussEscalada.Video eliminarcanales.Video brillo.Video interpolacion.Video intercambiar.Video sobel.Video pixelizar.Video rgbtohsl.Video

.PHONY: all clean

all: $(cpp) $(asm) $(cuda) $(video)

#Target de los .cu
%.CUDA: $(PATHCUDA)%.cu $(PATHCPP)%.cpp $(PATHCPP)utils.h 
	@ echo -ne Compilando $*CUDA 0%...
	@ $(CCUDA) -c $(PATHCUDA)$*.cu -o $*CUDA.o
	@ echo -ne 25%...
	@ $(CC) $(CXXFLAGS) -c $(PATHCPP)$*.cpp -o $*.o -D _Cuda
	@ echo -ne 75%...
	@ $(CC) $(CXXFLAGS) -L/usr/local/cuda/lib -lcudart $*.o $*CUDA.o -o $*CUDA -D _Cuda
	@ echo 100%

#Target de los .asm
%.ASM: $(PATHASM)%.asm $(PATHCPP)%.cpp $(PATHCPP)utils.h
	@ echo -ne Compilando $*ASM 0%...
	@ $(CASM) -felf -g -F dwarf $(PATHASM)$*.asm -o $*.o
	@ echo -ne 50%...
	@ $(CC) $(CXXFLAGS) -o $*ASM $*.o $(PATHCPP)$*.cpp -D _Asm
	@ echo 100%

#Target de los .cpp
%.CPP: $(PATHCPP)%.cpp $(PATHCPP)utils.h
	@ echo -ne Compilando $* 0%...
	@ $(CC) $(CXXFLAGS) $(PATHCPP)$*.cpp -o $* -D _Cpp
	@ echo 100%

#El caso de rgbtohsl lo trato por separado
rgbtohsl.Video: $(PATHCUDA)rgbtohsl.cu $(PATHCPP)rgbtohsl.cpp $(PATHCPP)utils.h 
	@ echo -ne Compilando rgbtohslVideoCUDA 0%...
	@ $(CCUDA) -c $(PATHCUDA)rgbtohsl.cu -o rgbtohslCUDA.o
	@ echo -ne 33%...
	@ $(CC) $(CXXFLAGS) -c $(PATHCPP)rgbtohsl.cpp -o rgbtohsl.o -D _Cuda -D _Video
	@ echo -ne 66%...
	@ $(CC) $(CXXFLAGS) -L/usr/local/cuda/lib -lcudart rgbtohsl.o rgbtohslCUDA.o -o rgbtohslVideoCUDA -D _Cuda -D _Video
	@ echo 100%
	@ echo -ne Compilando rgbtohslVideo 0%...
	@ $(CC) $(CXXFLAGS) $(PATHCPP)rgbtohsl.cpp -o rgbtohslVideo -D _Cpp -D _Video
	@ echo 100%
	
#Target de los .asm y .cpp para video
%.Video: $(PATHCUDA)%.cu $(PATHCPP)%.cpp $(PATHASM)%.asm $(PATHCPP)utils.h 
	@ echo -ne Compilando $*VideoCUDA 0%...
	@ $(CCUDA) -c $(PATHCUDA)$*.cu -o $*CUDA.o
	@ echo -ne 33%...
	@ $(CC) $(CXXFLAGS) -c $(PATHCPP)$*.cpp -o $*.o -D _Cuda -D _Video
	@ echo -ne 66%...
	@ $(CC) $(CXXFLAGS) -L/usr/local/cuda/lib -lcudart $*.o $*CUDA.o -o $*VideoCUDA -D _Cuda -D _Video
	@ echo 100%
	@ echo -ne Compilando $*VideoASM 0%...
	@ $(CASM) -felf -g -F dwarf $(PATHASM)$*.asm -o $*.o
	@ echo -ne 50%...
	@ $(CC) $(CXXFLAGS) -o $*VideoASM $*.o $(PATHCPP)$*.cpp -D _Asm -D _Video
	@ echo 100%
	@ echo -ne Compilando $*Video 0%...
	@ $(CC) $(CXXFLAGS) $(PATHCPP)$*.cpp -o $*Video -D _Cpp -D _Video
	@ echo 100%

clean:
	@ echo Borrando archivos
	@ rm -f *.o
	@ rm -f $(patsubst %.CPP,%,$(cpp))
	@ rm -f $(patsubst %.ASM,%ASM,$(asm))
	@ rm -f $(patsubst %.CUDA,%CUDA,$(cuda))
	@ rm -f $(patsubst %.Video,%Video,$(video))
	@ rm -f $(patsubst %.Video,%VideoASM,$(video))
	@ rm -f $(patsubst %.Video,%VideoCUDA,$(video))
