#!/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)
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_MAJOR_VER    := $(shell dpkg-query -W -f='$${Version}' nvidia-cuda-toolkit | cut -d. -f1,2)
# List of CUDA level according to CUDA version
ifeq ($(CUDA_MAJOR_VER),10.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 \
	            -gencode=arch=compute_70,code=sm_75
  CUDA_CAP_NO_DOT_DOT_SEP := 30.35.37.50.52.60.61.70.75
else ifeq ($(CUDA_MAJOR_VER),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
  CUDA_CAP_NO_DOT_DOT_SEP := 30.35.37.50.52.60.61.70.75
else ifeq ($(CUDA_MAJOR_VER),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
  CUDA_CAP_NO_DOT_DOT_SEP := 30.35.37.50.52.60.61.70
else ifeq ($(CUDA_MAJOR_VER),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
  CUDA_CAP_NO_DOT_DOT_SEP := 30.35.37.50.52.60.61.70
else ifeq ($(CUDA_MAJOR_VER),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
  CUDA_CAP_NO_DOT_DOT_SEP := 30.35.37.50.52.60.61.70
else
  $(error Unsupport CUDA version $(CUDA_MAJOR_VER). 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_MAJOR_VER) 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_MAJOR_VER) 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
  $(error Unsupport CUDA version $(CUDA_MAJOR_VER). Edit debian/rules.)
endif

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

PKG_VERSION_TAG := $(PKG_VERSION)+$(DIST_NAME).$(DIST_VERSION).$(DIST_RELEASE)+Cuda.$(CUDA_MAJOR_VER).Levels.$(CUDA_CAP_NO_DOT_DOT_SEP)

%:
	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 -rv build/lib/* debian/tmp/usr/lib/$(DEB_TARGET_GNU_TYPE)
	cp -rv   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)
