CXX ?= g++
NVCC ?= nvcc

CXXFLAGS ?= -O3 -std=c++17 -march=native -pthread -Wall -Wextra -Wpedantic
NVCCFLAGS ?= -O3 -std=c++17

CORE_HEADERS := slime_solver_core.hpp ../include/slime/solver_core.hpp

.PHONY: all clean test

all: slime_pattern_cpp slime_pattern_cuda slime_position_cuda slime_position_residue_cuda slime_bruteforce_cpp_bench slime_bruteforce_cuda_bench

slime_pattern_cpp: slime_pattern_cpp.cpp $(CORE_HEADERS)
	$(CXX) $(CXXFLAGS) -o $@ slime_pattern_cpp.cpp

slime_pattern_cuda: slime_pattern_cuda.cu $(CORE_HEADERS)
	$(NVCC) $(NVCCFLAGS) -o $@ slime_pattern_cuda.cu

slime_position_cuda: slime_position_cuda.cu $(CORE_HEADERS)
	$(NVCC) $(NVCCFLAGS) -o $@ slime_position_cuda.cu

slime_position_residue_cuda: slime_position_residue_cuda.cu $(CORE_HEADERS)
	$(NVCC) $(NVCCFLAGS) -o $@ slime_position_residue_cuda.cu

slime_bruteforce_cpp_bench: slime_bruteforce_cpp_bench.cpp $(CORE_HEADERS)
	$(CXX) $(CXXFLAGS) -o $@ slime_bruteforce_cpp_bench.cpp

slime_bruteforce_cuda_bench: slime_bruteforce_cuda_bench.cu $(CORE_HEADERS)
	$(NVCC) $(NVCCFLAGS) -o $@ slime_bruteforce_cuda_bench.cu

test: slime_pattern_cpp
	python3 -m unittest discover -s . -p 'test_*.py'
	./slime_pattern_cpp verify --seed 61692151016558 --x 51069 --z 419124 -n 5
	./slime_pattern_cpp roots --x 51069 --z 419124 -n 5 --bits 24
	./slime_pattern_cpp upper --lower35 16420645998 --x 51069 --z 419124 -n 5

clean:
	rm -f slime_pattern_cpp slime_pattern_cuda slime_position_cuda slime_position_residue_cuda slime_bruteforce_cpp_bench slime_bruteforce_cuda_bench
