-include parameters/config.params
-include gpu.make

ifeq "$(CFG_ARCHITECTURE)" ""
        CFG_ARCHITECTURE=32
endif
ifeq "$(CFG_ARCHITECTURE)" "32" 
        ELF=elf
        COPT=-m32 -L/usr/lib32
        CUOPT= --machine 32 -I/usr/local/cuda/include
endif
ifeq "$(CFG_ARCHITECTURE)" "64" 
        ELF=elf64
endif

# GPU
ifeq "$(CUDA_SM)" "" 
        CUDA_SM="-arch=sm_30"
endif

ifeq "$(CFG_DISTRIBUTION)" "debug"
OFLAGS=-ggdb -msse2 $(COPT)
CFLAGS=-Wall -DDEBUG 
NFLAGS=-f $(ELF) -g -F dwarf
CUFLAGS=-g -G $(CUDA_SM) $(CUOPT)
else
OFLAGS=-O2 -msse2 -ftree-vectorize $(COPT)
CFLAGS=-Wall 
NFLAGS=-f $(ELF)
CUFLAGS=-O3 $(CUDA_SM)  $(CUOPT) 
endif

CUDA_SRCS=$(shell ls src/*.cu)
CPP_SRCS=$(shell ls src/*.cpp) 
ASM_SRCS=$(shell ls src/*.asm) 
CUDA_OBJS=$(subst .cu,.o,$(subst src,obj,$(CUDA_SRCS)))
CPP_OBJS=$(subst .cpp,.o,$(subst src,obj,$(CPP_SRCS)))
ASM_OBJS=$(subst .asm,.o,$(subst src,obj,$(ASM_SRCS)))
OBJS=$(ASM_OBJS) $(CPP_OBJS) $(CUDA_OBJS)

all: info bin/main.exe

debug:
	make --no-print-directory CFG_DISTRIBUTION=debug

info:
	@echo "SRCS = $(ASM_SRCS) $(CPP_SRCS) $(CUDA_SRCS)"
	@echo "OBJS = $(OBJS)"
	
bin/main.exe: $(OBJS)
	nvcc --link -o $@ $(OBJS) -lcudart -lrt $(CUOPT) $(CUFLAGS)

obj/%.o: src/%.cu
	nvcc --compile -o $@ $< $(CUFLAGS) 
		
obj/%.o: src/%.cpp
	g++ -c -o $@ $< $(OFLAGS) $(CFLAGS)
	
obj/%.o: src/%.asm
	nasm -o $@ $< $(NFLAGS) 
	
clean:
	rm -rf obj/*.o bin/*.exe
