NVCC ?= nvcc
CXX ?= g++
ARCH ?= sm_86

CXXFLAGS = -O3 -std=c++17 -Wall -pthread -fPIC -Iinclude -Isrc
NVCCFLAGS = -O3 -std=c++14 -arch=$(ARCH) --use_fast_math -Xcompiler -fPIC,-Wall -Iinclude -Isrc

LIB_DIR = lib
BIN_DIR = bin
BUILD_DIR = build

SHARED_LIB = $(LIB_DIR)/libcudaslicer_offset.so
STATIC_LIB = $(LIB_DIR)/libcudaslicer_offset.a
BENCH_BIN = $(BIN_DIR)/gpu_slicer_c_bench

all: $(SHARED_LIB) $(STATIC_LIB) $(BENCH_BIN)

$(BUILD_DIR)/gpu_offset.o: src/gpu_offset.cu include/gpu_offset.h src/cpu_offset.h src/vectorizer.h | $(BUILD_DIR)
	$(NVCC) $(NVCCFLAGS) -c $< -o $@

$(BUILD_DIR)/gpu_sdf.o: src/gpu_sdf.cu include/gpu_sdf.h include/gpu_offset.h src/vectorizer.h | $(BUILD_DIR)
	$(NVCC) $(NVCCFLAGS) -c $< -o $@

$(BUILD_DIR)/cpu_offset.o: src/cpu_offset.cpp src/cpu_offset.h src/vectorizer.h include/gpu_offset.h | $(BUILD_DIR)
	$(CXX) $(CXXFLAGS) -c $< -o $@

$(BUILD_DIR)/stl_slicer.o: src/stl_slicer.cpp src/stl_slicer.h include/gpu_offset.h | $(BUILD_DIR)
	$(CXX) $(CXXFLAGS) -c $< -o $@

$(BUILD_DIR)/main_bench.o: src/main_bench.cpp src/stl_slicer.h include/gpu_offset.h | $(BUILD_DIR)
	$(CXX) $(CXXFLAGS) -c $< -o $@

$(SHARED_LIB): $(BUILD_DIR)/gpu_offset.o $(BUILD_DIR)/gpu_sdf.o $(BUILD_DIR)/cpu_offset.o | $(LIB_DIR)
	$(NVCC) -shared -arch=$(ARCH) -o $@ $^ -lcudart

$(STATIC_LIB): $(BUILD_DIR)/gpu_offset.o $(BUILD_DIR)/gpu_sdf.o $(BUILD_DIR)/cpu_offset.o | $(LIB_DIR)
	ar rcs $@ $^

$(BENCH_BIN): $(BUILD_DIR)/main_bench.o $(BUILD_DIR)/stl_slicer.o $(SHARED_LIB) | $(BIN_DIR)
	$(CXX) $(CXXFLAGS) $(BUILD_DIR)/main_bench.o $(BUILD_DIR)/stl_slicer.o -L$(LIB_DIR) -lcudaslicer_offset -lcudart -Wl,-rpath,'$$ORIGIN/../lib' -o $@

$(BUILD_DIR) $(LIB_DIR) $(BIN_DIR):
	mkdir -p $@

clean:
	rm -rf $(BUILD_DIR) $(LIB_DIR) $(BIN_DIR)

.PHONY: all clean
