#!/usr/bin/make -f

export DEB_BUILD_OPTIONS=noddebs

# Get version from changelog as well as lsb_release
# to compute unique build version (useful for repo mirroring systems doing file pooling)
PKG_VERSION  := $(shell dpkg-parsechangelog | grep -E '^Version:' | cut -d' ' -f2)
DIST_NAME    := $(shell lsb_release -si)
DIST_RELEASE := $(shell lsb_release -sc)
DIST_VERSION := $(shell lsb_release -sr)
PKG_VERSION_TAG := $(PKG_VERSION)+$(DIST_NAME).$(DIST_RELEASE).$(DIST_VERSION)
SUBSTVARS_BINARY_VERSION := -Vbinary:Version="$(PKG_VERSION_TAG)"
SUBSTVARS_SOURCE_VERSION := -Vsource:Version="$(PKG_VERSION_TAG)"

DEB_TARGET_GNU_TYPE := $(shell dpkg-architecture -qDEB_TARGET_GNU_TYPE)

CUDA_VERSION    := $(shell dpkg-query -W -f='$${Version}' nvidia-cuda-toolkit | cut -d. -f1,2)
# List of CUDA level according to CUDA version
ifeq ($(CUDA_VERSION),10.0)
  COMPUTE_LEVELS := -gencode=arch=compute_30,code=sm_30 \
	            -gencode=arch=compute_35,code=sm_35 \
	            -gencode=arch=compute_37,code=sm_37 \
	            -gencode=arch=compute_50,code=sm_50 \
	            -gencode=arch=compute_52,code=sm_52 \
	            -gencode=arch=compute_60,code=sm_60 \
	            -gencode=arch=compute_61,code=sm_61 \
	            -gencode=arch=compute_70,code=sm_70 \
	            -gencode=arch=compute_70,code=sm_75
else ifeq ($(CUDA_VERSION),9.2)
  COMPUTE_LEVELS := -gencode=arch=compute_30,code=sm_30 \
	            -gencode=arch=compute_35,code=sm_35 \
	            -gencode=arch=compute_37,code=sm_37 \
	            -gencode=arch=compute_50,code=sm_50 \
	            -gencode=arch=compute_52,code=sm_52 \
	            -gencode=arch=compute_60,code=sm_60 \
	            -gencode=arch=compute_61,code=sm_61 \
	            -gencode=arch=compute_70,code=sm_70
else ifeq ($(CUDA_VERSION),9.1)
  COMPUTE_LEVELS := -gencode=arch=compute_30,code=sm_30 \
	            -gencode=arch=compute_35,code=sm_35 \
	            -gencode=arch=compute_37,code=sm_37 \
	            -gencode=arch=compute_50,code=sm_50 \
	            -gencode=arch=compute_52,code=sm_52 \
	            -gencode=arch=compute_60,code=sm_60 \
	            -gencode=arch=compute_61,code=sm_61 \
	            -gencode=arch=compute_70,code=sm_70
else ifeq ($(CUDA_VERSION),9.0)
  COMPUTE_LEVELS := -gencode=arch=compute_30,code=sm_30 \
	            -gencode=arch=compute_35,code=sm_35 \
	            -gencode=arch=compute_37,code=sm_37 \
	            -gencode=arch=compute_50,code=sm_50 \
	            -gencode=arch=compute_52,code=sm_52 \
	            -gencode=arch=compute_60,code=sm_60 \
	            -gencode=arch=compute_61,code=sm_61 \
	            -gencode=arch=compute_70,code=sm_70
else ifeq ($(CUDA_VERSION),8.0)
  COMPUTE_LEVELS := -gencode=arch=compute_30,code=sm_30 \
	            -gencode=arch=compute_35,code=sm_35 \
	            -gencode=arch=compute_37,code=sm_37 \
	            -gencode=arch=compute_50,code=sm_50 \
	            -gencode=arch=compute_52,code=sm_52 \
	            -gencode=arch=compute_60,code=sm_60 \
	            -gencode=arch=compute_61,code=sm_61
else ifeq ($(CUDA_VERSION),7.5)
  COMPUTE_LEVELS := -gencode=arch=compute_30,code=sm_30 \
	            -gencode=arch=compute_35,code=sm_35 \
	            -gencode=arch=compute_37,code=sm_37 \
	            -gencode=arch=compute_50,code=sm_50 \
	            -gencode=arch=compute_52,code=sm_52
else
  $(error Unsupport CUDA version $(CUDA_VERSION). Edit debian/rules.)
endif

# Distrib with CUDA 7.5 or 8.0 will use 4.9
# Newer will use 6.4
ifeq ($(shell dpkg --compare-versions $(CUDA_VERSION) ge 9.2 && echo yes),yes)
  CUDA_CC       := $(shell readlink -f /usr/bin/gcc-7)
  CUDA_CXX       := $(shell readlink -f /usr/bin/g++-7)
else ifeq ($(shell dpkg --compare-versions $(CUDA_VERSION) ge 9.0 && echo yes),yes)
  CUDA_CC       := $(shell readlink -f /usr/bin/gcc-6)
  CUDA_CXX       := $(shell readlink -f /usr/bin/g++-6)
else
  CUDA_CC       := $(shell readlink -f /usr/bin/gcc-4.9)
  CUDA_CXX       := $(shell readlink -f /usr/bin/g++-4.9)
endif

export CC=$(CUDA_CC)
export CXX=$(CUDA_CXX)


%:
	dh $@ --parallel

override_dh_auto_clean:
	dh_auto_clean -- CUDA_HOME=/usr \
	                 CUDA_LIB=/usr/lib/$(DEB_TARGET_GNU_TYPE)
	rm -f build/obj/collectives/device/Makefile.rules

override_dh_auto_build:
	dh_auto_build -- CUDA_HOME=/usr \
	                 CUDA_LIB=/usr/lib/$(DEB_TARGET_GNU_TYPE) \
	                 VERBOSE=1 \
	                 NVCC_GENCODE="$(COMPUTE_LEVELS)" \
	                 DEBUG=0

override_dh_auto_install:
	# Does not handle DESTDIR, multiarch lib path...
	mkdir -p debian/tmp/usr/lib/$(DEB_TARGET_GNU_TYPE)
	mkdir -p debian/tmp/usr/include
	cp -P -v build/lib/* debian/tmp/usr/lib/$(DEB_TARGET_GNU_TYPE)
	cp -v    build/include/* debian/tmp/usr/include

override_dh_auto_test:

override_dh_gencontrol:
	dh_gencontrol -- -v"$(PKG_VERSION_TAG)" $(SUBSTVARS_BINARY_VERSION) $(SUBSTVARS_SOURCE_VERSION)
