#!/usr/bin/make -f
#export DH_VERBOSE=1

export DEB_BUILD_MAINT_OPTIONS = hardening=+all

include /usr/share/dpkg/default.mk

# OpenVDB AX is a beast to compile on some low mem arches such as mipsel (https://bugs.debian.org/1025144)
# Do not build AX on alpha & hppa since no LLVM
AX_ARCHS=amd64 arm64 armel armhf i386 mips64el ppc64el s390x arc hurd-i386 ia64 kfreebsd-amd64 kfreebsd-i386 m68k powerpc ppc64 riscv64 sh4 sparc64 x32
ifneq (,$(filter $(DEB_HOST_ARCH), $(AX_ARCHS)))
  WITH_AX=ON
else
  WITH_AX=OFF
endif

WITH_VDB_TOOL=ON
ifneq (,$(filter $(DEB_HOST_ARCH), mipsel))
  WITH_VDB_TOOL=OFF
endif

# Lower max parallel jobs always:
DH_FLAGS = --max-parallel=2

ifneq (,$(filter $(DEB_HOST_ARCH), armel armhf arm64 ppc64el))
  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77728
  DEB_CXXFLAGS_MAINT_APPEND += -Wno-psabi
endif

# default setting
WITH_EXPLICIT_INSTANTIATION=ON

# `virtual memory exhausted: Cannot allocate memory` is the new ICE
ifeq ($(DEB_BUILD_ARCH_BITS),32)
# Lower memory requirements on architectures with only 2 GB address space
WITH_EXPLICIT_INSTANTIATION=OFF
ifneq (,$(filter $(DEB_HOST_ARCH), mipsel))
  # smaller debug packages:
  CXXFLAGS := $(CXXFLAGS:-g=-g1)
  CXXFLAGS := $(CXXFLAGS:-O2=-O1)
  DEB_CXXFLAGS_MAINT_APPEND += --param ggc-min-expand=10
  # makes linking slower, so it shouldn't be enabled when not needed:
  DEB_LDFLAGS_MAINT_APPEND += -Wl,--no-keep-memory -Wl,--reduce-memory-overhead
  # openvdb.cc:(.text+0x7c): relocation truncated to fit: R_MIPS_CALL16 against `pthread_once@@GLIBC_2.34'
  DEB_CXXFLAGS_MAINT_APPEND += -mxgot
  DH_FLAGS = --max-parallel=1
else ifneq (,$(filter $(DEB_HOST_ARCH), armel))
  # smaller debug packages:
  CXXFLAGS := $(CXXFLAGS:-g=-g1)
  CXXFLAGS := $(CXXFLAGS:-O2=-Os)
  DEB_CXXFLAGS_MAINT_APPEND += --param ggc-min-expand=10
else
  # reduce memory pressure also on i386 buildds:
  CXXFLAGS := $(CXXFLAGS:-g=-g1)
  CXXFLAGS := $(CXXFLAGS:-O2=-Os)
  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78971
  DEB_CXXFLAGS_MAINT_APPEND += --param ggc-min-expand=20
endif
endif

VER_FULL = $(DEB_VERSION_UPSTREAM)
VER_SONAME = $(shell echo $(DEB_VERSION_UPSTREAM) | cut -f1-2 -d.)

# technically the following should reduce the amount of symbols being exported,
# it turns out this does not work in practice:
# https://bugs.debian.org/997080
#DEB_CFLAGS_MAINT_APPEND += -fvisibility=hidden -fvisibility-inlines-hidden
#DEB_CXXFLAGS_MAINT_APPEND += -fvisibility=hidden -fvisibility-inlines-hidden

export DEB_CXXFLAGS_MAINT_APPEND
export DEB_LDFLAGS_MAINT_APPEND

# deduce documentation option (build-indep target)
ifeq (,$(filter %-doc,$(shell dh_listpackages)))
  BUILDDOC = OFF
else ifneq (,$(filter nodoc,$(DEB_BUILD_OPTIONS)))
  BUILDDOC = OFF
else
  BUILDDOC = ON
endif

# remove test if specified:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
  BUILDTEST = ON
  ifeq ($(WITH_AX),ON)
    BUILDTEST_AX = ON
  else
    BUILDTEST_AX = OFF
  endif
else
  BUILDTEST = OFF
  BUILDTEST_AX = OFF
endif

# notes:
# - https://github.com/AcademySoftwareFoundation/openvdb/issues/144#issuecomment-508984426
# - Force tbbmalloc for simplicity since jemalloc breaks python plugins. (#951704)
CONCURRENT_MALLOC = Tbbmalloc
ifneq (,$(filter noopt,$(DEB_BUILD_OPTIONS)))
  CONCURRENT_MALLOC = None
endif

WITH_CUDA ?= OFF

# https://bugs.debian.org/1025142
WITH_RPATH ?= OFF

# cannot use cmake+ninja because of -doc package:
%:
	dh $@ --with python3 --buildsystem=cmake $(DH_FLAGS)

MPL: LICENSE
	cp -f $< $@

PYVERS := $(shell py3versions -rd)

CMAKE_EXTRA_FLAGS = \
	-DBUILD_TEST:BOOL=$(BUILDTEST) \
	-DCMAKE_SKIP_RPATH:BOOL=ON \
	-DCONCURRENT_MALLOC:STRING=$(CONCURRENT_MALLOC) \
	-DNANOVDB_BUILD_BENCHMARK:BOOL=OFF \
	-DNANOVDB_BUILD_EXAMPLES:BOOL=OFF \
	-DNANOVDB_BUILD_UNITTESTS:BOOL=$(BUILDTEST) \
	-DNANOVDB_CUDA_KEEP_PTX:BOOL=$(WITH_CUDA) \
	-DNANOVDB_USE_CUDA:BOOL=$(WITH_CUDA) \
	-DNANOVDB_USE_INTRINSICS:BOOL=ON \
	-DNANOVDB_USE_OPENVDB:BOOL=ON \
	-DOPENVDB_AX_STATIC:BOOL=OFF \
	-DOPENVDB_BUILD_AX:BOOL=$(WITH_AX) \
	-DOPENVDB_BUILD_AX_GRAMMAR:BOOL=$(WITH_AX) \
	-DOPENVDB_BUILD_AX_UNITTESTS:BOOL=$(BUILDTEST_AX) \
	-DOPENVDB_BUILD_DOCS:BOOL=$(BUILDDOC) \
	-DOPENVDB_BUILD_NANOVDB:BOOL=ON \
	-DOPENVDB_BUILD_PYTHON_MODULE:BOOL=ON \
	-DOPENVDB_BUILD_PYTHON_UNITTESTS:BOOL=$(BUILDTEST) \
	-DOPENVDB_BUILD_UNITTESTS:BOOL=$(BUILDTEST) \
	-DOPENVDB_BUILD_VDB_AX:BOOL=$(WITH_AX) \
	-DOPENVDB_BUILD_VDB_LOD:BOOL=ON \
	-DOPENVDB_BUILD_VDB_RENDER:BOOL=ON \
	-DOPENVDB_BUILD_VDB_TOOL:BOOL=$(WITH_VDB_TOOL) \
	-DOPENVDB_BUILD_VDB_VIEW:BOOL=ON \
	-DOPENVDB_CORE_STATIC:BOOL=OFF \
	-DOPENVDB_ENABLE_RPATH:BOOL=$(WITH_RPATH) \
	-DOPENVDB_TOOL_USE_EXR:BOOL=ON \
	-DOPENVDB_TOOL_USE_JPG:BOOL=ON \
	-DOPENVDB_TOOL_USE_NANO:BOOL=ON \
	-DOPENVDB_TOOL_USE_PNG:BOOL=ON \
	-DPython_EXECUTABLE:FILEPATH=/usr/bin/$(PYVERS) \
	-DUSE_AX:BOOL=$(WITH_AX) \
	-DUSE_BLOSC:BOOL=ON \
	-DUSE_EXPLICIT_INSTANTIATION:BOOL=$(WITH_EXPLICIT_INSTANTIATION) \
	-DUSE_EXR:BOOL=ON \
	-DUSE_IMATH_HALF:BOOL=ON \
	-DUSE_LOG4CPLUS:BOOL=ON \
	-DUSE_NANOVDB:BOOL=ON \
	-DUSE_NUMPY:BOOL=ON \
	-DUSE_PNG:BOOL=ON \

VDB_MANPAGES = debian/vdb_lod.1 debian/vdb_print.1 debian/vdb_render.1 debian/vdb_view.1
ifeq ($(WITH_VDB_TOOL),ON)
  VDB_MANPAGES += debian/vdb_tool.1
endif

pkg_arun = libopenvdb-ax-tools
pkg_nrun = libnanovdb-tools
pkg_orun = libopenvdb-tools
pkg_alib = libopenvdb-ax$(VER_SONAME)t64
pkg_olib = libopenvdb$(VER_SONAME)t64
pkg_adev = libopenvdb-ax-dev
pkg_ndev = libnanovdb-dev
pkg_odev = libopenvdb-dev
pkg_doc = libopenvdb-doc
pkg_py  = python3-openvdb

override_dh_auto_configure:
	dh_auto_configure -- $(CMAKE_EXTRA_FLAGS)
override_dh_installdocs: MPL
	dh_installdocs -A $^
override_dh_clean:
	dh_clean doc/doxygen_sqlite3.db
	dh_clean debian/*.1

override_dh_auto_test-arch:
	timeout 2h dh_auto_test -- $(TESTOPS) || true
override_dh_install-arch: manpages
	# update manpage listing:
	for manpage in $(VDB_MANPAGES); do \
		echo $$manpage >> debian/libopenvdb-tools.manpages \
		; \
	done
	dh_numpy3 --package=$(pkg_py)
	dh_install -p$(pkg_arun) debian/tmp/usr/bin/vdb_ax usr/bin
	dh_install -p$(pkg_nrun) debian/tmp/usr/bin/nano* usr/bin
	dh_install -p$(pkg_orun) -Xax debian/tmp/usr/bin/vdb* usr/bin
	dh_install -p$(pkg_alib) debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libopenvdb_ax.so.$(VER_FULL)
	dh_install -p$(pkg_alib) debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libopenvdb_ax.so.$(VER_SONAME)
	dh_install -p$(pkg_olib) debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libopenvdb.so.$(VER_FULL)
	dh_install -p$(pkg_olib) debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libopenvdb.so.$(VER_SONAME)
	dh_install -p$(pkg_adev) debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libopenvdb_ax.so
	dh_install -p$(pkg_odev) debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/libopenvdb.so
	dh_install -p$(pkg_odev) debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake
	dh_install -p$(pkg_adev) debian/tmp/usr/include/openvdb_ax* usr/include
	dh_install -p$(pkg_ndev) debian/tmp/usr/include/nanovdb* usr/include
	dh_install -p$(pkg_odev) -Xax debian/tmp/usr/include/openvdb* usr/include
	dh_install -p$(pkg_py)  debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/$(PYVERS)/dist-packages/pyopenvdb.so      usr/lib/$(PYVERS)/dist-packages/

override_dh_auto_build-indep:
	dh_auto_build -- doc
override_dh_auto_test-indep:
	# No tests needed for docs
override_dh_auto_install-indep:
	dh_auto_install -- -C doc
override_dh_install-indep:
	dh_install -p$(pkg_doc) debian/tmp/usr/share/doc/OpenVDB/html usr/share/doc/libopenvdb-doc/

#override_dh_shlibdeps:
#	dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info

debian/%.1: debian/%.1.in
	LD_PRELOAD= LD_LIBRARY_PATH=./debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH) help2man --version-string=$(VER_FULL) --include=$< --output=$@ --no-info --no-discard-stderr ./debian/tmp/usr/bin/`basename $@ .1`
	echo "Done generation $@"

.PHONY: manpages vdb_manpages vdb_ax_manpages nano_manpages

vdb_manpages: $(VDB_MANPAGES)
vdb_ax_manpages: debian/vdb_ax.1
nano_manpages: debian/nanovdb_convert.1 debian/nanovdb_print.1 debian/nanovdb_validate.1
ifeq ($(WITH_AX),ON)
manpages: vdb_manpages nano_manpages vdb_ax_manpages
else
manpages: vdb_manpages nano_manpages
endif

debian/control: debian/control.in
	sed -e "s/@AX_ARCHS@/$(AX_ARCHS)/g" $< > $@

get-orig-source:
	uscan --verbose --force-download --rename --repack
