.PHONY: all debug release clean

VENDOR_EXISTS := $(shell test -d vendor && echo 1 || echo 0)
CARGO_OFFLINE = $(if $(filter 1,$(VENDOR_EXISTS)),--offline,)

NCCL_VERSION := nccl-2.27.7-1
NCCL_TAR     := ./vendor/$(NCCL_VERSION).tar.gz
NCCL_DIR     := ./target/$(NCCL_VERSION)
NCCL_PATCH   := ./patch/0001-local-reconstruction-via-lighthouse.patch

COMPUTE_CAP := $(shell nvidia-smi --query-gpu=compute_cap --format=csv,noheader | head -n1 | tr -d '.')

NVCC_GENCODE := -gencode=arch=compute_$(COMPUTE_CAP),code=sm_$(COMPUTE_CAP)

all: release

debug: build_nccl
	@cargo build $(CARGO_OFFLINE)

release: build_nccl
	@cargo build --release $(CARGO_OFFLINE)

clean:
	@cargo clean --quiet

build_nccl: $(NCCL_DIR)/.built

$(NCCL_DIR)/.built:
	@echo ">>> Extracting NCCL..."
	@mkdir -p ./target
	@tar -zxvf $(NCCL_TAR) -C ./target

	@echo ">>> Applying NCCL patch..."
	@cd $(NCCL_DIR) && git init && git apply $(abspath $(NCCL_PATCH)) && rm -rf .git

	@echo ">>> Building NCCL (compute capability = $(COMPUTE_CAP))"
	@cd $(NCCL_DIR) && \
		make -j src.build NVCC_GENCODE="$(NVCC_GENCODE)"

	@touch $@