#!/usr/bin/make -f

export DH_VERBOSE=1
export DEB_BUILD_OPTIONS=noddebs

# Bazel wants to create stuff in $HOME
# Workaround so it can run in pbuilder
export HOME=$(shell mktemp -d)

# Fails in cowbuilder too because this variable
# is not removed inside the chroot
unexport JAVA_HOME

# 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 | egrep '^Version:' | cut -f 2 -d ' ')
DIST_NAME    := $(shell lsb_release -si)
DIST_RELEASE := $(shell lsb_release -sc)
DIST_VERSION := $(shell lsb_release -sr)

PY2VERS	:= $(shell pyversions -rv)
PY3VERS	:= $(shell py3versions -rv)

PY2PACKAGES := $(shell dh_listpackages --arch | grep '^python-')
PY3PACKAGES := $(shell dh_listpackages --arch | grep '^python3-')
PY3PACKAGES += tensorflow-tools

# See ./tensorflow/tools/pip_package/setup.py for dependencies
# It's an absolute nightmare to deal with dh_pythonN, bazel shitty
# build system, python3.6, etc, so I'll just handle that by myself
#
# First I'll compute interpreter dependencies like python3 >= 3.5~, python3 << 3.7
# According to pyversions/py3versions
#
# Then I'll turn this into python2custom:Depends and python3custom:Depends substvars
#
#
#
# Tensorflow 1.4.0 release:
# 
# * Not addind enum34 >= 1.1.6: It's not used anywhere in the src tree
#   https://github.com/tensorflow/tensorflow/commit/c98ecd18f6e294feaf9c9e059c12dee33fc2df84
#
# * Not bumping numpy to >= 1.12.1: It'll break Xenial compat and I cannot found in any commit referenced
#   below. I think TF guys just bump to latest version without giving a shit if it's required or not
#   https://github.com/tensorflow/tensorflow/commit/6e3e7d18f42cb4237ce6dbe2ffd0f9f158c36daf
PY2MINVER := $(shell pyversions -rv -rv | rev | cut -d' ' -f1 | rev)
PY2MAXSUP := $(shell pyversions -rv -rv | cut -d' ' -f1)
PY2MAXVER := $(shell python -c 'print(float('$(PY2MAXSUP)') + 0.1)')
PY3MINVER := $(shell py3versions -rv -rv | rev | cut -d' ' -f1 | rev)
PY3MAXSUP := $(shell py3versions -rv -rv | cut -d' ' -f1)
PY3MAXVER := $(shell python -c 'print(float('$(PY3MAXSUP)') + 0.1)')
SUBSTVARS_PY2DEPS := -Vpython2custom:Depends="python (>= $(PY2MINVER)~), python (<< $(PY2MAXVER)),
SUBSTVARS_PY2DEPS += python-enum34,
SUBSTVARS_PY2DEPS += python-numpy (>= 1.11.0),
SUBSTVARS_PY2DEPS += python-six (>= 1.10.0),
SUBSTVARS_PY2DEPS += python-protobuf (>= 3.3.0),
SUBSTVARS_PY2DEPS += python-tensorboard (>= 0.4.0~),
SUBSTVARS_PY2DEPS += python-tensorboard (<< 0.5.0~),
# These ones is for python2 only, see upstream setup.py
SUBSTVARS_PY2DEPS += python-mock (>= 2.0.0),
SUBSTVARS_PY2DEPS += python-backports.weakref (>= 1.0~rc1)"
SUBSTVARS_PY3DEPS := -Vpython3custom:Depends="python3 (>= $(PY3MINVER)~), python3 (<< $(PY3MAXVER)),
SUBSTVARS_PY3DEPS += python3-numpy (>= 1.11.0),
SUBSTVARS_PY3DEPS += python3-six (>= 1.10.0),
SUBSTVARS_PY3DEPS += python3-protobuf (>= 3.3.0),
SUBSTVARS_PY3DEPS += python3-tensorboard (>= 0.4.0~),
SUBSTVARS_PY3DEPS += python3-tensorboard (<< 0.5.0~)"

# Various set of CPU optimization
OPTFLAGS1 := -mavx -mavx2 -mfma -msse4.1 -msse4.2
OPTFLAGS2 := -mavx -msse4.1 -msse4.2

# FPBFS with GCC 7
# But obviously, it's using gcc when building without CUDA
# and gcc-4.9 (per request) when enabling CUDA. Older GCC fails to recognize
# this option
OPTFLAGS1_NO_CUDA := $(OPTFLAGS1)
OPTFLAGS2_NO_CUDA := $(OPTFLAGS2)
GCC_VERSION := $(shell gcc -dumpversion)
ifeq ($(shell dpkg --compare-versions $(GCC_VERSION) ge 7 && echo yes),yes)
  OPTFLAGS1_NO_CUDA += -Wno-error=stringop-overflow
  OPTFLAGS2_NO_CUDA += -Wno-error=stringop-overflow
endif

# OpenMPI install folder
# Can be either multiarch for recent distro, or /usr/lib for older ones
OPENMPI_VERSION := $(shell dpkg-query -W -f='$${Version}' libopenmpi-dev)
ifeq ($(shell dpkg --compare-versions $(OPENMPI_VERSION) ge 1.10 && echo yes),yes)
  OPENMPI_BASE := $(shell test -d /usr/lib/x86_64-linux-gnu/openmpi && echo /usr/lib/x86_64-linux-gnu/openmpi || echo /usr/lib/openmpi)
  OPENMPI_ENABLE := Yes
  # Workaround building with Debian package
  # https://github.com/tensorflow/tensorflow/issues/11903#issuecomment-332718012
  #
  # Only append to CUDA flags because MPI is not supported without CUDA
  # https://github.com/tensorflow/tensorflow/issues/14811
  OPTFLAGS1 += -DOMPI_SKIP_MPICXX=1
  OPTFLAGS2 += -DOMPI_SKIP_MPICXX=1
else
  OPENMPI_ENABLE := No
endif

# CUDA related configuration
CUDNN_PACKAGE := $(shell dpkg-query -W -f='$${Package}' libcudnn?)
CUDNN_VERSION := $(shell dpkg-query -W -f='$${Version}' libcudnn?)
CUDNN_MAJOR_VERSION := $(shell dpkg-query -W -f='$${Version}' libcudnn? | cut -d. -f1,2)
NVVM_PACKAGE := $(shell dpkg-query -W -f='$${Package}' libnvvm?)

CUDA_VERSION    := $(shell dpkg-query -W -f='$${Version}' nvidia-cuda-toolkit | cut -d. -f1,2)
CUDA_REQ_LIBS   := libcublas libcudart libcufft libcurand libcusolver
# List of CUDA level according to CUDA version
ifeq ($(CUDA_VERSION),9.1)
CUDA_CAP	:= 3.0,3.5,3.7,5.0,5.2,5.3,6.0,6.1,7.0
else ifeq ($(CUDA_VERSION),9.0)
CUDA_CAP	:= 3.0,3.5,3.7,5.0,5.2,5.3,6.0,6.1,7.0
else ifeq ($(CUDA_VERSION),8.0)
CUDA_CAP        := 3.0,3.5,3.7,5.0,5.2,5.3,6.0,6.1
else ifeq ($(CUDA_VERSION),7.5)
# 6.0 and 6.1 not supported
CUDA_CAP        := 3.0,3.5,3.7,5.0,5.2,5.3
else
CUDA_CAP        := Unsupported CUDA $(CUDA_VERSION). Please fix debian/rules
endif
SUBSTVARS_CUDNN := -Vcudnn:Depends="$(CUDNN_PACKAGE) (= $(CUDNN_VERSION))"

# 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.0 && echo yes),yes)
  CUDACC	:= /usr/bin/gcc-6
  CUDACXX	:= /usr/bin/g++-6
else
  CUDACC	:= /usr/bin/gcc-4.9
  CUDACXX	:= /usr/bin/g++-4.9
endif
export CUDACC
export CUDACXX

# If enabled, set MKL DNN to the fake path we're going to build
export TF_MKL_ROOT=$(CURDIR)/mkldnn

%:
	dh $@ --with python2,python3


### Prepare CUDA stuff so it looks like a tarball coming from nvidia
cuda-$(CUDA_VERSION):
	
ifeq (,$(filter nocuda,$(DEB_BUILD_PROFILES)))
	# Prepare tree
	mkdir -p "$(CURDIR)/$@/lib64"
	mkdir -p "$(CURDIR)/$@/include"
	mkdir -p "$(CURDIR)/$@/bin"
	mkdir -p "$(CURDIR)/$@/extras/CUPTI/lib64"
	mkdir -p "$(CURDIR)/$@/extras/CUPTI/include"
	
	# Real libraries
	for package in $(CUDA_REQ_LIBS); do \
		for file in `dpkg -L "$${package}$(CUDA_VERSION)"`; do \
			if `echo "$${file}" | grep -q '^/usr/lib/x86_64-linux-gnu/'`; then \
				base_filename=`basename "$${file}"`; \
				ln -s "$${file}" "$(CURDIR)/$@/lib64/"; \
			fi \
		done \
	done
	
	# .so links and headers in nvidia-cuda-dev package
	# Not sure why but .so ln sometimes say the file already exists
	for file in `dpkg -L "nvidia-cuda-dev"`; do \
		if `echo "$${file}" | grep -q '^/usr/lib/x86_64-linux-gnu/'`; then \
			base_filename=`basename "$${file}"`; \
			ln -s "$${file}" "$(CURDIR)/$@/lib64/" || true; \
		elif `echo "$${file}" | grep -q '^/usr/include/'`; then \
			base_filename=`basename "$${file}"`; \
			ln -s "$${file}" "$(CURDIR)/$@/include/"; \
		fi \
	done
	
	# tools in nvidia-cuda-toolkit package
	for file in `dpkg -L "nvidia-cuda-toolkit"`; do \
		if `echo "$${file}" | grep -q '^/usr/bin/'`; then \
			base_filename=`basename "$${file}"`; \
			ln -s "$${file}" "$(CURDIR)/$@/bin/"; \
		fi \
	done
	
	# Same shit for libcupti
	for file in `dpkg -L "libcupti$(CUDA_VERSION)"`; do \
		if `echo "$${file}" | grep -q '^/usr/lib/x86_64-linux-gnu/'`; then \
			base_filename=`basename "$${file}"`; \
			ln -s "$${file}" "$(CURDIR)/$@/extras/CUPTI/lib64/"; \
		fi \
	done \
	
	for file in `dpkg -L "libcupti-dev"`; do \
		if `echo "$${file}" | grep -q '^/usr/lib/x86_64-linux-gnu/'`; then \
			base_filename=`basename "$${file}"`; \
			ln -s "$${file}" "$(CURDIR)/$@/extras/CUPTI/lib64/"; \
		elif `echo "$${file}" | grep -q '^/usr/include/'`; then \
			base_filename=`basename "$${file}"`; \
			ln -s "$${file}" "$(CURDIR)/$@/extras/CUPTI/include/"; \
		fi \
	done
	
	# Thanks to release 1.3.0 it's now even unable to detect cudnn correctly (was working before, lol)
	for file in `dpkg -L "$(CUDNN_PACKAGE)"`; do \
		if `echo "$${file}" | grep -q '^/usr/lib/x86_64-linux-gnu/'`; then \
			base_filename=`basename "$${file}"`; \
			ln -s "$${file}" "$(CURDIR)/$@/lib64/"; \
		fi \
	done \
	
	for file in `dpkg -L "$(CUDNN_PACKAGE)-dev"`; do \
		if `echo "$${file}" | grep -q '^/usr/lib/x86_64-linux-gnu/'`; then \
			base_filename=`basename "$${file}"`; \
			ln -s "$${file}" "$(CURDIR)/$@/lib64/"; \
		elif `echo "$${file}" | grep -q '^/usr/include/'`; then \
			base_filename=`basename "$${file}"`; \
			ln -s "$${file}" "$(CURDIR)/$@/include/"; \
		fi \
	done
	# For some amazingly wrong reason it's not looking for .so.6 but .so.6.0 uh ?
	ln -s $(CURDIR)/$@/lib64/libcudnn.so.$(CUDNN_MAJOR_VERSION).* $(CURDIR)/$@/lib64/libcudnn.so.$(CUDNN_MAJOR_VERSION)
	
	# 1.3.0 shit again, used to be detected just fine, not anymore, lol
	mkdir -p $(CURDIR)/$@/nvvm
	for file in `dpkg -L "$(NVVM_PACKAGE)"`; do \
		if `echo "$${file}" | grep -q '^/usr/lib/x86_64-linux-gnu/'`; then \
			base_filename=`basename "$${file}"`; \
			ln -s "$${file}" "$(CURDIR)/$@/nvvm/"; \
		fi \
	done
endif

mkldnn:
	
ifeq (,$(filter nomkldnn,$(DEB_BUILD_PROFILES)))
	# Prepare a fake tree looking like a shitty hand made install
	mkdir -p "$(CURDIR)/$@/lib"
	mkdir -p "$(CURDIR)/$@/include"
	# TF 1.4.0 even looks for the original license.txt no idea why
	cp -a /usr/share/doc/libmkldnn0-nonfree-mkl/copyright "$(CURDIR)/$@/license.txt"
	
	# Create libs and headers symlinks
	for package in libmkldnn0-nonfree-mkl libmkldnn-nonfree-dev; do \
		for file in `dpkg -L "$${package}"`; do \
			if `echo "$${file}" | grep -q '^/usr/lib/.*so.*'`; then \
				base_filename=`basename "$${file}"`; \
				ln -s "$${file}" "$(CURDIR)/$@/lib/"; \
			elif `echo "$${file}" | grep -q '^/usr/include/'`; then \
				base_filename=`basename "$${file}"`; \
				ln -s "$${file}" "$(CURDIR)/$@/include/"; \
			fi \
		done \
	done
endif

override_dh_auto_configure: cuda-$(CUDA_VERSION) mkldnn

### Build for supported Python 2/3 versions
override_dh_auto_install: $(PY3VERS:%=build-py3-%) $(PY2VERS:%=build-py2-%)

# So what's the hell is going here ?
#
# I'm going to build several time tensorflow with different
# GCC optimization flags.
#
# nVidia CUDA support variants will be built too.
#
# build_pip_package script has been patched to output classic Python
# package without the WHL container.
build-py2-%:
	# It actually useless to rename C extension in Pyhon 2 packages
	# Because it's using different folder for each version anyway
	# However, tensorflow C loader has been patched to load properly renamed
	# So files, so keep the behavior for Python2
	$(eval PYTHON_C_EXT := $(shell /usr/bin/python$* -c 'from imp import get_suffixes, C_EXTENSION; best_suffix = [ suffix for suffix in get_suffixes() if suffix[2] == C_EXTENSION ][0][0]; print(best_suffix)'))
	
	# -mavx -msse4.1 -msse4.2
	$(eval DESTDIR := $(CURDIR)/debian/python-tensorflow-avx-sse42)
	debian/configure-expect.sh $* "$(OPTFLAGS2_NO_CUDA)" No No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" No "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python$*/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python$*/dist-packages/external"
	
ifeq (,$(filter nocuda,$(DEB_BUILD_PROFILES)))
	# -mavx -msse4.1 -msse4.2 CUDA
	$(eval DESTDIR := $(CURDIR)/debian/python-tensorflow-cuda-avx-sse42)
	debian/configure-expect.sh $* "$(OPTFLAGS2)" Yes No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" No "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python$*/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python$*/dist-packages/external"
endif
	
	## -mavx -mavx2 -mfma -msse4.1 -msse4
	$(eval DESTDIR := $(CURDIR)/debian/python-tensorflow-avx2-sse42-fma)
	debian/configure-expect.sh $* "$(OPTFLAGS1_NO_CUDA)" No No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" No "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python$*/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python$*/dist-packages/external"
	
ifeq (,$(filter nomkldnn,$(DEB_BUILD_PROFILES)))
	## -mavx -mavx2 -mfma -msse4.1 -msse4 + Intel MKL DNN
	$(eval DESTDIR := $(CURDIR)/debian/python-tensorflow-avx2-sse42-fma-mkl-dnn)
	debian/configure-expect.sh $* "$(OPTFLAGS1_NO_CUDA)" No No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" Yes "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt --config=mkl //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python$*/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python$*/dist-packages/external"
endif
	
ifeq (,$(filter nocuda,$(DEB_BUILD_PROFILES)))
	## -mavx -mavx2 -mfma -msse4.1 -msse4 CUDA
	$(eval DESTDIR := $(CURDIR)/debian/python-tensorflow-cuda-avx2-sse42-fma)
	debian/configure-expect.sh $* "$(OPTFLAGS1)" Yes No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" No "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python$*/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python$*/dist-packages/external"
	
ifeq (,$(filter nomkldnn,$(DEB_BUILD_PROFILES)))
	## -mavx -mavx2 -mfma -msse4.1 -msse4 CUDA + Intel MKL DNN
	$(eval DESTDIR := $(CURDIR)/debian/python-tensorflow-cuda-avx2-sse42-fma-mkl-dnn)
	debian/configure-expect.sh $* "$(OPTFLAGS1)" Yes No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" Yes "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt --config=cuda --config=mkl //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python$*/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python$*/dist-packages/external"
endif
endif
	
	touch $@

build-py3-%:
	# Will rename the generated .so file with proper suffix
	# So different python3 versions can live together
	# Also see "debian/patches/Patch_so_loader_to_use_soabi_version"
	# To see how tensorflow C extensions loader has been patched
	$(eval PYTHON_C_EXT := $(shell /usr/bin/python$* -c 'from imp import get_suffixes, C_EXTENSION; best_suffix = [ suffix for suffix in get_suffixes() if suffix[2] == C_EXTENSION ][0][0]; print(best_suffix)'))
	
	# -mavx -msse4.1 -msse4.2
	$(eval DESTDIR := $(CURDIR)/debian/python3-tensorflow-avx-sse42)
	debian/configure-expect.sh $* "$(OPTFLAGS2_NO_CUDA)" No No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" No "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python3/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	# Dunno what this is, contains header, external Python module... Bazel stuff :D
	rm -rf "$(DESTDIR)/usr/lib/python3/dist-packages/external"
	# Rename C ext to add python version / ABI suffix
	# We need to install command line tools once
	mkdir -p "$(CURDIR)/debian/tensorflow-tools/usr/"
	# In case there's several variants, mv cli tools once only
	test -d "$(CURDIR)/debian/tensorflow-tools/usr/bin/" || mv -v "$(CURDIR)/debian/python3-tensorflow-avx-sse42/usr/bin/" "$(CURDIR)/debian/tensorflow-tools/usr/"
	# Now part of tensorboard package
	rm -f "$(CURDIR)/debian/tensorflow-tools/usr/bin/tensorboard"
	
ifeq (,$(filter nocuda,$(DEB_BUILD_PROFILES)))
	# -mavx -msse4.1 -msse4.2 CUDA
	$(eval DESTDIR := $(CURDIR)/debian/python3-tensorflow-cuda-avx-sse42)
	debian/configure-expect.sh $* "$(OPTFLAGS2)" Yes No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" No "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python3/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python3/dist-packages/external"
endif
	
	## -mavx -mavx2 -mfma -msse4.1 -msse4.2
	$(eval DESTDIR := $(CURDIR)/debian/python3-tensorflow-avx2-sse42-fma)
	debian/configure-expect.sh $* "$(OPTFLAGS1_NO_CUDA)" No No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" No "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python3/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python3/dist-packages/external"
	
ifeq (,$(filter nomkldnn,$(DEB_BUILD_PROFILES)))
	## -mavx -mavx2 -mfma -msse4.1 -msse4.2 + Intel MKL DNN
	$(eval DESTDIR := $(CURDIR)/debian/python3-tensorflow-avx2-sse42-fma-mkl-dnn)
	debian/configure-expect.sh $* "$(OPTFLAGS1_NO_CUDA)" No No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" Yes "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt --config=mkl //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python3/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python3/dist-packages/external"
endif
	
ifeq (,$(filter nocuda,$(DEB_BUILD_PROFILES)))
	## -mavx -mavx2 -mfma -msse4.1 -msse4.2 CUDA
	$(eval DESTDIR := $(CURDIR)/debian/python3-tensorflow-cuda-avx2-sse42-fma)
	debian/configure-expect.sh $* "$(OPTFLAGS1)" Yes No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" No "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python3/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python3/dist-packages/external"
	
ifeq (,$(filter nomkldnn,$(DEB_BUILD_PROFILES)))
	## -mavx -mavx2 -mfma -msse4.1 -msse4.2 CUDA + Intel MKL DNN
	$(eval DESTDIR := $(CURDIR)/debian/python3-tensorflow-cuda-avx2-sse42-fma-mkl-dnn)
	debian/configure-expect.sh $* "$(OPTFLAGS1)" Yes No "$(CURDIR)/cuda-$(CUDA_VERSION)" "$(CUDA_CAP)" "$(CUDA_VERSION)" "$(CUDNN_MAJOR_VERSION)" Yes "$(CURDIR)/mkldnn" "$(OPENMPI_ENABLE)" "$(OPENMPI_BASE)"
	bazel build --config=opt --config=cuda --config=mkl //tensorflow/tools/pip_package:build_pip_package --verbose_failures
	bazel-bin/tensorflow/tools/pip_package/build_pip_package "$(DESTDIR)"
	find "$(DESTDIR)/usr/lib/python3/dist-packages" -name '*.so' -a ! -name '*-linux-gnu.so' -exec /usr/bin/rename.ul --verbose  '.so' '$(PYTHON_C_EXT)' {} \;
	rm -rf "$(DESTDIR)/usr/bin"
	rm -rf "$(DESTDIR)/usr/lib/python3/dist-packages/external"
endif
endif
	
	touch $@

override_dh_auto_clean:
	dh_auto_clean
	rm -f .bazelrc .tf_configure.bazelrc tensorflow/tools/git/gen/spec.json tools/python_bin_path.sh
	rm -f build-py build-py3 build-py2-* build-py3-*
	rm -f bazel-*
	rm -rf cuda-$(CUDA_VERSION)
	rm -rf mkldnn
	rm -rf third_party/eigen3/mkl_include third_party/mkl/include third_party/mkl/libdl.so.2 third_party/mkl/libmklml_intel.so third_party/mkl/libiomp5.so third_party/mkl/mkl.config
	rm -rf third_party/mpi/mpicxx.h third_party/mpi/mpi.h third_party/mpi/mpio.h third_party/mpi/libmpi.so third_party/mpi/mpi_portable_platform.h

override_dh_gencontrol:
	dh_gencontrol -- -v"$(PKG_VERSION)+$(DIST_NAME)-$(DIST_RELEASE)-$(DIST_VERSION)" $(SUBSTVARS_CUDNN) $(SUBSTVARS_PY2DEPS) $(SUBSTVARS_PY3DEPS)

override_dh_strip:

# Those are Python independant libraries, do not rename it
# Otherwise libs linked against will break
# --exclude is supposed to work but I see no code handling
# this option in dh-python, lol :D
override_dh_python2:
	for pkg in $(PY2PACKAGES); do \
	  dh_python2 --exclude=libtensorflow_framework.so --exclude=libforestprotos.so --verbose --package=$${pkg}; \
	  for file in `find $(CURDIR)/debian/$${pkg}/usr/lib/python*/dist-packages/tensorflow/ -name 'libtensorflow_framework.*.so'`; do \
	    dirname=`dirname $${file}`; \
	    mv -v "$${file}" "$${dirname}/libtensorflow_framework.so"; \
	  done; \
	  for file in `find $(CURDIR)/debian/$${pkg}/usr/lib/python*/dist-packages/tensorflow/ -name 'libforestprotos.*.so'`; do \
	    dirname=`dirname $${file}`; \
	    mv -v "$${file}" "$${dirname}/libforestprotos.so"; \
	  done; \
	done
override_dh_python3:
	for pkg in $(PY3PACKAGES); do \
	  dh_python3 --verbose --package=$${pkg}; \
	  for file in `find $(CURDIR)/debian/$${pkg}/usr/lib/python*/dist-packages/tensorflow/ -name 'libtensorflow_framework.*.so'`; do \
	    dirname=`dirname $${file}`; \
	    mv -v "$${file}" "$${dirname}/libtensorflow_framework.so"; \
	  done; \
	  for file in `find $(CURDIR)/debian/$${pkg}/usr/lib/python*/dist-packages/tensorflow/ -name 'libforestprotos.*.so'`; do \
	    dirname=`dirname $${file}`; \
	    mv -v "$${file}" "$${dirname}/libforestprotos.so"; \
	  done; \
	done
