#!/usr/bin/make -f
# -*- makefile-gmake -*-
#
# import for DEB_HOST_MULTIARCH
include /usr/share/dpkg/architecture.mk

# In anticipation of a future version of r-cran.mk
origRsubdir=r/
debRreposname=cran
cranNameOrig=arrow
cranName=arrow
#include /usr/share/dh-r/r-cran.mk
ifeq ($(builttimeStamp),)
  builttime       := $(shell dpkg-parsechangelog -l$(CURDIR)/debian/changelog | awk -F': ' '/Date/ {print $$2}')
  builttimeStamp  := "--built-timestamp=\"$(builttime)\""
endif


SOVERSION=2300
PY3DEFAULT := $(shell py3versions -d)


export DH_VERBOSE=1
export DH_OPTIONS

export DEB_BUILD_MAINT_OPTIONS   = reproducible=-timeless hardening=+bindnow
export DEB_CFLAGS_MAINT_APPEND   = -Wall -pedantic
export DEB_CXXFLAGS_MAINT_APPEND = -Wall
export DEB_CPPFLAGS_MAINT_APPEND =
export DEB_LDFLAGS_MAINT_APPEND  =

export PYARROW_CXXFLAGS = $(shell dpkg-buildflags --get CPPFLAGS)

# For CMAKE output not to hide executed commands
export VERBOSE=1

ifeq ($(DEB_HOST_ARCH),amd64)
export PYARROW_CMAKE_OPTIONS = -DARROW_SIMD_LEVEL=NONE
ARROW_SIMD_FLAG = -DARROW_SIMD_LEVEL=NONE
endif

BUILD_TYPE=release

%:
	dh $@ --with python3

override_dh_auto_configure:
	@echo " *** Build flags *** $$(date '+%Y-%m-%dT%H:%M:%S')"
	@echo "  CFLAGS:   $$(dpkg-buildflags --get CFLAGS)"
	@echo "  CXXFLAGS: $$(dpkg-buildflags --get CXXFLAGS)"
	@echo "  CPPFLAGS: $$(dpkg-buildflags --get CPPFLAGS)"
	@echo "  LDFLAGS:  $$(dpkg-buildflags --get LDFLAGS)"
	#  Not explicitly specifying default setting
	#  -DARROW_S3=OFF
	#  Build failure:
	#  -DARROW_JEMALLOC_USE_SHARED=ON
	#  -DARROW_JEMALLOC=OFF			\
	#
	# Settings from https://arrow.apache.org/docs/developers/cpp/building.html
	dh_auto_configure			\
	  --sourcedirectory=cpp			\
	  --builddirectory=cpp_build		\
	  --buildsystem=cmake+ninja		\
	  --					\
	  -DCMAKE_VERBOSE_MAKEFILE=ON   	\
	  -DARROW_BUILD_BENCHMARKS=OFF		\
	  -DARROW_BUILD_EXAMPLES=OFF		\
	  -DARROW_BUILD_INTEGRATION=OFF		\
	  -DARROW_BUILD_TESTS=OFF       	\
	  -DARROW_BUILD_UTILITIES=OFF		\
	  -DARROW_ACERO=ON			\
	  -DARROW_ENABLE_TIMING_TESTS=OFF	\
	  -DARROW_FUZZING=OFF			\
	  -DARROW_CUDA=OFF              	\
	  -DARROW_CSV=ON			\
	  -DARROW_COMPUTE=ON			\
	  -DARROW_DATASET=ON			\
	  -DARROW_DEPENDENCY_SOURCE=SYSTEM	\
	  -DARROW_FILESYSTEM=ON			\
	  -DARROW_FLIGHT=ON			\
	  -DARROW_GANDIVA=ON			\
	  -DARROW_GCS=OFF               	\
	  -DARROW_HDFS=ON			\
	  -DARROW_IPC=OFF			\
	  -DARROW_JSON=ON			\
	  -DARROW_MIMALLOC=ON			\
	  -DARROW_ORC=OFF			\
	  -DARROW_PARQUET=ON			\
	  -DARROW_PYTHON=ON			\
	  $(ARROW_SIMD_FLAG)			\
	  -DARROW_SUBSTRAIT=OFF			\
	  -DARROW_TENSORFLOW=OFF		\
	  -DARROW_USE_CCACHE=OFF		\
	  -DARROW_USE_ASAN=OFF			\
	  -DARROW_USE_TSAN=OFF			\
	  -DARROW_USE_UBSAN=OFF			\
	  -DARROW_VERBOSE_THIRDPARTY_BUILD=ON	\
	  -DARROW_WITH_BROTLI=OFF		\
	  -DARROW_WITH_BZ2=ON			\
	  -DARROW_WITH_LZ4=ON			\
	  -DARROW_WITH_SNAPPY=ON		\
	  -DARROW_WITH_RE2=ON			\
	  -DARROW_WITH_UTF8PROC=ON		\
	  -DARROW_WITH_ZLIB=ON			\
	  -DARROW_WITH_ZSTD=ON			\
	  -DCMAKE_INSTALL_PREFIX=/usr/      	\
	  -DCMAKE_BUILD_TYPE=$(BUILD_TYPE)

override_dh_auto_build:
	@echo " *** BUILD CPP *** $$(date '+%Y-%m-%dT%H:%M:%S')"
	dh_auto_build				\
	  --sourcedirectory=cpp			\
	  --builddirectory=cpp_build		\
	  --buildsystem=cmake+ninja

override_dh_auto_install:

	@echo " *** INSTALL CPP *** $$(date '+%Y-%m-%dT%H:%M:%S')"
	env					\
	  LD_LIBRARY_PATH=$(CURDIR)/cpp_build/$(BUILD_TYPE)	\
	  VERBOSE=1                             \
	dh_auto_install				\
	   --sourcedirectory=cpp		\
	   --builddirectory=cpp_build		\
	   --buildsystem=cmake+ninja

	@echo " *** Building and installing R package *** $$(date '+%Y-%m-%dT%H:%M:%S')"
	mkdir -p debian/tmp/usr/lib/R/site-library
	cd r && env \
		ARROW_R_DEV=true \
		PKG_CONFIG="pkg-config --define-variable=prefix=$(CURDIR)/debian/tmp/usr" \
		PKG_CONFIG_PATH=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig \
		LD_LIBRARY_PATH=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH) \
		R_MAKEVARS_SITE=$(CURDIR)/debian/r-makevars.site \
		VERBOSE=1 \
	R CMD INSTALL $(builttimeStamp) --library=../debian/tmp/usr/lib/R/site-library/ .

	@echo " *** INSTALL PYTHON *** $$(date '+%Y-%m-%dT%H:%M:%S')"
	env	Arrow_DIR=$(CURDIR)/debian/tmp/usr \
		ArrowAcero_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/ArrowAcero \
		ArrowCompute_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/ArrowCompute \
		ArrowDataset_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/ArrowDataset \
		ArrowFlight_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/ArrowFlight \
		Gandiva_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/Gandiva \
		Parquet_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/Parquet \
		CMAKE_VERBOSE_MAKEFILE=ON	\
		PKG_CONFIG_PATH=cpp_build/src/arrow/release/ \
		VERBOSE=1			\
	dh_auto_install				\
	  --buildsystem=pybuild			\
	  --sourcedirectory=python		\
	  --builddirectory=python

	@echo " *** Clean cache directories - whereever they are *** $$(date '+%Y-%m-%dT%H:%M:%S')"
	find debian/ -name __pycache__ -type d | xargs -r rm -r

	@echo " *** Clean cache directories - remnants in debian/tmp *** $$(date '+%Y-%m-%dT%H:%M:%S')"
	rm -rf debian/tmp/usr/lib/python*/dist-packages/.pytest_cache/
	# Consolidate non-Python-version-specific files from python3.X/ to python3/
	mkdir -p debian/tmp/usr/lib/python3/dist-packages/pyarrow/
	# Bridge libs: copy from default python3.X (identical across versions), delete all
	cp -a debian/tmp/usr/lib/$(PY3DEFAULT)/dist-packages/pyarrow/libarrow_python*.so.* \
	   debian/tmp/usr/lib/python3/dist-packages/pyarrow/
	find debian/tmp/usr/lib/python3.*/dist-packages/pyarrow/ \
	    \( -name "libarrow_python.so*" -o -name "libarrow_python_flight.so*" \) -delete
	# include/ and src/: move from default python3.X, delete rest
	mv debian/tmp/usr/lib/$(PY3DEFAULT)/dist-packages/pyarrow/include \
	   debian/tmp/usr/lib/python3/dist-packages/pyarrow/
	rm -rf debian/tmp/usr/lib/python3.*/dist-packages/pyarrow/include
	mv debian/tmp/usr/lib/$(PY3DEFAULT)/dist-packages/pyarrow/src \
	   debian/tmp/usr/lib/python3/dist-packages/pyarrow/
	rm -rf debian/tmp/usr/lib/python3.*/dist-packages/pyarrow/src


override_dh_auto_test:
	@echo " *** Starting tests *** $$(date '+%Y-%m-%dT%H:%M:%S')"
	env	Arrow_DIR=$(CURDIR)/debian/tmp/usr \
		ArrowAcero_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/ArrowAcero \
		ArrowCompute_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/ArrowCompute \
		ArrowDataset_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/ArrowDataset \
		ArrowFlight_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/ArrowFlight \
		Gandiva_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/Gandiva \
		Parquet_DIR=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/Parquet \
		CMAKE_VERBOSE_MAKEFILE=ON	\
		VERBOSE=1			\
		LD_LIBRARY_PATH=$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH) \
	pytest || echo "E: dh_auto_test failed - error ignored."
	#dh_auto_test \
	#  --buildsystem=pybuild \
	#  --sourcedirectory=python || echo "E: dh_auto_test failed - error ignored."

override_dh_auto_clean:
	dh_auto_clean				\
	  --sourcedirectory=cpp			\
	  --builddirectory=cpp_build

	dh_auto_clean				\
	  --buildsystem=pybuild			\
	  --sourcedirectory=python		\
	  --builddirectory=python

	rm -f python/.eggs/README.txt python/pyarrow.egg-info/SOURCES.txt
	rm -rf .pybuild .pytest_cache
	rm -rf cpp_build
	rm -f r/src/Makevars
	rm -rf r_arrow_build
	find . -name "*bin" -type f -delete
	find . -name a.out -delete
	find r/ -name "*.o" -delete
	find r/ -name "*.so" -delete
	rm -f r/inst/*.tar.gz
	rm -f r/*.tar.gz

override_dh_missing:
	#dh_missing --fail-missing
	dh_missing


# libarrow.so: avoid failing with "Unknown DWARF DW_OP_172"
# libgandiva.so: avoid failing with "Unknown DWARF DW_OP_255"
#   See also: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=949296
# plasma-store-server: avoid failing with "Unknown DWARF DW_OP_1"
override_dh_dwz:
	dh_dwz \
		--exclude=libarrow.so \
		--exclude=libgandiva.so \
		--exclude=plasma-store-server

override_dh_makeshlibs:
	dh_makeshlibs -plibarrow$(SOVERSION)
	dh_makeshlibs -plibarrow-acero$(SOVERSION)
	dh_makeshlibs -plibarrow-dataset$(SOVERSION)
	dh_makeshlibs -plibarrow-flight$(SOVERSION)
	dh_makeshlibs -plibparquet$(SOVERSION)
	dh_makeshlibs -plibgandiva$(SOVERSION)
	dh_makeshlibs -ppython3-pyarrow

override_dh_shlibdeps:
	dh_shlibdeps -Npython3-pyarrow \
	    -l$(CURDIR)/debian/libarrow$(SOVERSION)/usr/lib/$(DEB_HOST_MULTIARCH) \
	    -l$(CURDIR)/debian/libarrow-acero$(SOVERSION)/usr/lib/$(DEB_HOST_MULTIARCH) \
	    -l$(CURDIR)/debian/libarrow-dataset$(SOVERSION)/usr/lib/$(DEB_HOST_MULTIARCH) \
	    -l$(CURDIR)/debian/libarrow-flight$(SOVERSION)/usr/lib/$(DEB_HOST_MULTIARCH) \
	    -l$(CURDIR)/debian/libparquet$(SOVERSION)/usr/lib/$(DEB_HOST_MULTIARCH)
	dh_shlibdeps -ppython3-pyarrow \
	    -l$(CURDIR)/debian/python3-pyarrow/usr/lib/python3/dist-packages/pyarrow \
	    -l$(CURDIR)/debian/libarrow$(SOVERSION)/usr/lib/$(DEB_HOST_MULTIARCH) \
	    -l$(CURDIR)/debian/libarrow-acero$(SOVERSION)/usr/lib/$(DEB_HOST_MULTIARCH) \
	    -l$(CURDIR)/debian/libarrow-dataset$(SOVERSION)/usr/lib/$(DEB_HOST_MULTIARCH) \
	    -l$(CURDIR)/debian/libarrow-flight$(SOVERSION)/usr/lib/$(DEB_HOST_MULTIARCH) \
	    -l$(CURDIR)/debian/libparquet$(SOVERSION)/usr/lib/$(DEB_HOST_MULTIARCH)


debian/upstream/signing-key.asc:
	# This is what I had done to create this file - please correct if erroneous
	wget -O - https://downloads.apache.org/arrow/KEYS | gpg --import-keys
	gpg --export -a > debian/upstream/signing-key.asc
