#!/usr/bin/make -f
# -*- mode: makefile; coding: utf-8 -*-

# See also: skimage

# This was used as last resort to advance the python3.10 transition by Paul Gevers in NMU, disable the tests during build (see: #1003165)
# export DEB_BUILD_OPTIONS += nocheck

include /usr/share/dpkg/architecture.mk

PY3VER  ?= $(shell py3versions -vd)
PY3VERS ?= $(shell py3versions -vr)

export DEB_BUILD_MAINT_OPTIONS := hardening=+all

export DEB_CFLAGS_MAINT_APPEND :=
export DEB_LDFLAGS_MAINT_APPEND := -Wl,--as-needed

ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
  JOBS := $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
else
  JOBS := 1
endif
export JOBS := $(JOBS)
export JOBLIB_MULTIPROCESSING=0

# things in the doc building and tests try to access stuff in HOME (https://bugs.debian.org/915078)
export HOME=$(CURDIR)/tmp

# don't run network tests at build time
EXCLUDE_TESTS = not test_load_boston_alternative and \
                not test_fetch_openml and \
                not test_missing_values_pandas and \
                not test_illegal_column and \
                not test_dataset_with_openml_warning and \
                not test_string_attribute_without_dataframe and \
                not test_warn_ignore_attribute and \
                not test_raises_illegal_multitarget and \
                not test_fetch_nonexiting and \
                not test_decode_emotions and \
                not test_decode_cpu and \
                not test_decode_anneal and \
                not test_decode_iris and \
                not test_dataset_with_openml_error and \
                not test_convert_arff_data_dataframe_warning_low_memory_pandas
# Until https://github.com/scikit-learn/scikit-learn/issues/17798
# is not solved
EXCLUDE_TEST += and not sklearn.ensemble._weight_boosting.AdaBoostRegressor

IGNORE_ERRORS=
ERROR_LOG=record
#we rather want to record the test suite errors in build log than ignoring the potentially failing tests
ifeq ($(ERROR_LOG),ignore)
# Some tests are known to fail randomly so need to be excluded ATM
ifeq ($(DEB_HOST_ARCH),arm64)
  # A bit aggressive exclusion of some tests which exhibit a problem I have no time to deal with on arm64
  EXCLUDE_TESTS += and not test_dump
endif

# Its a shame that nobody cares for all architectures but we do not have the manpower to fix all tests
ifeq ($(DEB_HOST_ARCH),armel)
  # Ignored due to bug #1003165
  EXCLUDE_TESTS += and not test_tfidf_no_smoothing
endif

# Until these are fixed:
# https://github.com/scikit-learn/scikit-learn/issues/16443
# https://github.com/scikit-learn/scikit-learn/issues/13052
## armhf is in a really bad state,  The log says "Fatal Python error: Bus error".  This really needs to be investigated
ifeq ($(DEB_HOST_ARCH),armhf)
  EXCLUDE_TESTS += and not test_check_estimators_stacking_estimator
  EXCLUDE_TESTS += and not test_check_estimators_voting_estimator
  EXCLUDE_TESTS += and not test_apply_path_readonly_all_trees
  EXCLUDE_TESTS += and not test_check_estimator
  EXCLUDE_TESTS += and not test_check_estimator_clones
  EXCLUDE_TESTS += and not test_check_estimator_pairwise
  EXCLUDE_TESTS += and not test_novelty_true_common_tests
  # This is actually a test generator, so this skips a *lot* of tests
  EXCLUDE_TESTS += and not test_common
endif

# Its a shame that nobody cares for all architectures but we do not have the manpower to fix all tests
ifeq ($(DEB_HOST_ARCH),mips64el)
  # Ignored due to bug #1003165
  EXCLUDE_TESTS += and not test_lasso_lars_vs_R_implementation
endif

# TBD. See https://bugs.debian.org/967977
ifeq ($(DEB_HOST_ARCH),s390x)
  EXCLUDE_TESTS += and not test_gaussian_kde
  EXCLUDE_TESTS += and not test_gaussian_kde
endif
ifeq ($(DEB_HOST_ARCH),alpha)
  EXCLUDE_TESTS += and not test_gaussian_kde
endif

# Same test, but not entirely the same results as above. Assuming same cause
ifeq ($(DEB_HOST_ARCH),i386)
  EXCLUDE_TESTS += and not test_gaussian_kde
  EXCLUDE_TESTS += and not test_y_multioutput
endif


# Until https://github.com/scikit-learn/scikit-learn/issues/19230 is open
ifeq ($(DEB_HOST_ARCH),i368)
  EXCLUDE_TESTS += and not test_convergence_dtype_consistency
endif

else
# for all architectures that are known to have failures in test suite we are ignoring these
ifeq ($(DEB_HOST_ARCH),$(filter $(DEB_HOST_ARCH), i386 mipsel mips64el hppa armel armhf arm64 ppc64 ppc64el s390x alpha riscv64 amd64))
  # Ignored due to bug #1003165
IGNORE_ERRORS= || true
endif
endif

# This is used by patch sphinx-doc-no-download.patch to prevent the sphinx
# doc build from downloading datasets, while not breaking the actual download
# functionality when user runs the same function. Disabling downloads also
# makes the build slightly faster. See also #1015805
export DEBIAN_POLICY_SECTION_4_9_NO_NETWORK_ACCESS=1

%:
	dh $@ --with python3,sphinxdoc --buildsystem pybuild

%-arch:
	dh $@ --with python3 --buildsystem pybuild

clean:
	dh $@ --with python3 --buildsystem pybuild

override_dh_clean:
	dh_clean
	rm -rf .pytest_cache build scikit_learn.egg-info tmp
	-mv PKG-INFO-BAK PKG-INFO
	rm -f debian/build-stamp-*
	for i in $$(find -name '*.pyx'); do \
		rm -f $${i%.*}.c $${i%.*}.cpp; \
	done
	for i in $$(find -name '*.pyx.in'); do \
		rm -f $${i%.*}; \
	done
ifneq (,$(filter python-sklearn-doc,$(shell dh_listpackages)))
	+$(MAKE) -C doc clean
endif

override_dh_auto_configure:
	mkdir -p tmp
	-mv PKG-INFO PKG-INFO-BAK
	python$(PY3VER) setup.py config
# 	dh_auto_configure
	mv PKG-INFO-BAK PKG-INFO
	# Provide bootstrap links even at build process - otherwise sphinx fails
	mkdir -p doc/themes/scikit-learn-modern/static/css/vendor/
	ln -s /usr/share/javascript/bootstrap4/css/bootstrap.min.css doc/themes/scikit-learn-modern/static/css/vendor/bootstrap.min.css
	mkdir -p doc/themes/scikit-learn-modern/static/js/vendor
	ln -s /usr/share/javascript/bootstrap4/js/bootstrap.min.js doc/themes/scikit-learn-modern/static/js/vendor/bootstrap.min.js

# Ensure sample and test data are copied to .pybuild
define PYBUILD_AFTER_BUILD
  for d in tests/data data descr images; do
    rm -rf {build_dir}/sklearn/datasets/$$d;
    ln -s {dir}/sklearn/datasets/$$d {build_dir}/sklearn/datasets/$$d;
  done;
endef
export PYBUILD_AFTER_BUILD
# Only with the default Python 3, additionally use pybuild to run
# sphinx once the build is complete.
ifeq (,$(filter nodoc,$(DEB_BUILD_OPTIONS)))
define PYBUILD_AFTER_BUILD_python$(PY3VER)
  $(PYBUILD_AFTER_BUILD)
  PYTHONPATH={build_dir} \
  http_proxy='127.0.0.1.9' \
  https_proxy='127.0.0.1.9' \
  SPHINXBUILD="python$(PY3VER) -m sphinx" \
  $(MAKE) -C doc html SPHINXOPTS="-j $(JOBS)" || true;
  [ -d doc/_build/html ]
endef
export PYBUILD_AFTER_BUILD_python$(PY3VER)
endif
override_dh_auto_build-arch:
	# Don't try to build docs in the arch build, so unset that hook
	env -u PYBUILD_AFTER_BUILD_python$(PY3VER) \
		dh_auto_build


export PYBUILD_TEST_PYTEST := 1
export PYBUILD_TEST_ARGS_python3 := -m "not network" -v --color=no -k "$(EXCLUDE_TESTS)"
define PYBUILD_BEFORE_TEST
  (mv $(CURDIR)/sklearn/conftest.py $(CURDIR)/sklearn/conftest.py.test; \
   mv $(CURDIR)/sklearn/datasets/tests/conftest.py $(CURDIR)/sklearn/datasets/tests/conftest.py.test; \
   cd {build_dir} && python{version} -c 'import sklearn; sklearn.show_versions()')
endef
export PYBUILD_BEFORE_TEST
define PYBUILD_AFTER_TEST
  (mv $(CURDIR)/sklearn/conftest.py.test $(CURDIR)/sklearn/conftest.py; \
   mv $(CURDIR)/sklearn/datasets/tests/conftest.py.test $(CURDIR)/sklearn/datasets/tests/conftest.py)
endef
export PYBUILD_AFTER_TEST

# Nothing to do for indep
override_dh_auto_test-indep:


override_dh_auto_test-arch:
	dh_auto_test -a $(IGNORE_ERRORS)

export PYBUILD_AFTER_INSTALL = rm -f {destdir}/{install_dir}/_configtest*
override_dh_auto_install:
	dh_auto_install
	# cleanup python3 cache (mixing python3 subversions)
	-find debian/tmp -name "__pycache__" -exec rm -r {} +


override_dh_installdocs-arch:
	dh_installdocs -A README*.rst

override_dh_installdocs-indep:
	dh_installdocs -A README*.rst
ifneq (,$(filter python-sklearn-doc,$(shell dh_listpackages)))
	docdir=debian/python-sklearn-doc/usr/share/doc/python-sklearn-doc; \
	if [ -e $$docdir/stable ] ; then \
	mv \
		$$docdir/stable $$docdir/html; \
	fi
endif
	if [ -e debian/README.Debian.$(DEB_HOST_ARCH) ] ; then dh_installdocs -A debian/README.Debian.$(DEB_HOST_ARCH) ; fi

override_dh_installchangelogs:
	dh_installchangelogs doc/whats_new.rst

# remove .so libraries from main package, and call dh_numpy*
_dh_python%:
	-find debian/python$(*:2=)-sklearn/usr/lib -name "*.so" -delete;

	dh_numpy$(*:2=) -ppython$(*:2=)-sklearn-lib
	dh_python$*

override_dh_python3: _dh_python3

## immediately useable documentation and exemplar scripts/data
override_dh_compress:
	dh_compress -X.py -X.html -X.pdf -X.css -X.jpg -X.txt -X.js -X.json -X.rtc

override_dh_sphinxdoc-indep:
	@# no need to filter out this call, if sphinxdoc is not used it won't be called.
	dh_sphinxdoc -Xsearchtools.js
