#!/usr/bin/make -f
# -*- makefile -*-

# The structure follows debian/rules of the python-opentelemetry source
# package: every upstream sub-project is built, installed and tested in its
# own loop iteration. Refer to README.Debian!

#export DH_VERBOSE = 1

SPHINXOPTS := -E -N

export TMP_DIST-PACKAGES_FOLDER=$(CURDIR)/.pybuild/dist-packages/build

PYTHON_OPENTELEMETRY_PACKAGES=\
opentelemetry-instrumentation \
$(NULL)

PYTHON_OPENTELEMETRY_UTIL_PACKAGES=\
opentelemetry-util-http \
$(NULL)

PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGES=\
opentelemetry-instrumentation-aiohttp-client \
opentelemetry-instrumentation-aiohttp-server \
opentelemetry-instrumentation-asgi \
opentelemetry-instrumentation-aws-lambda \
opentelemetry-instrumentation-django \
opentelemetry-instrumentation-fastapi \
opentelemetry-instrumentation-flask \
opentelemetry-instrumentation-httpx \
opentelemetry-instrumentation-requests \
opentelemetry-instrumentation-system-metrics \
opentelemetry-instrumentation-wsgi \
$(NULL)

PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGES=\
opentelemetry-propagator-aws-xray \
$(NULL)

%:
	dh $@

override_dh_clean:
	dh_clean
	rm -rf .pybuild
	find -type d -name ".pytest_cache" -exec rm -rf {} \; -prune
	find -type d -name "__pycache__" -exec rm -rf {} \; -prune

override_dh_auto_build:
	for PYTHON_OPENTELEMETRY_PACKAGE in $(PYTHON_OPENTELEMETRY_PACKAGES); do \
	    echo "\n########\n# Building package $${PYTHON_OPENTELEMETRY_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_PACKAGE} ;\
	    dh_auto_build --buildsystem=pybuild --sourcedirectory $${PYTHON_OPENTELEMETRY_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_UTIL_PACKAGE in $(PYTHON_OPENTELEMETRY_UTIL_PACKAGES); do \
	    echo "\n########\n# Building package $${PYTHON_OPENTELEMETRY_UTIL_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} ;\
	    dh_auto_build --buildsystem=pybuild --sourcedirectory util/$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE in $(PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGES); do \
	    echo "\n########\n# Building package $${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} ;\
	    dh_auto_build --buildsystem=pybuild --sourcedirectory instrumentation/$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE in $(PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGES); do \
	    echo "\n########\n# Building package $${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} ;\
	    dh_auto_build --buildsystem=pybuild --sourcedirectory propagator/$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} ;\
	done
	# The sub-projects import each other (e.g. django needs wsgi and
	# util-http), so for the tests we copy all of them into one folder we
	# can use as PYTHONPATH.
	mkdir .pybuild/dist-packages && \
	for FOLDER in `find .pybuild/cpython3_3.*_opentelemetry-*/ -maxdepth 1 -type d -name build`; do \
	    echo "Copy $${FOLDER} -> .pybuild/dist-packages" ;\
	    cp -a $${FOLDER} .pybuild/dist-packages ;\
	done

override_dh_auto_install:
	for PYTHON_OPENTELEMETRY_PACKAGE in $(PYTHON_OPENTELEMETRY_PACKAGES); do \
	    echo "\n########\n# Installing package $${PYTHON_OPENTELEMETRY_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_PACKAGE} ;\
	    dh_auto_install --buildsystem=pybuild --sourcedirectory $${PYTHON_OPENTELEMETRY_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_UTIL_PACKAGE in $(PYTHON_OPENTELEMETRY_UTIL_PACKAGES); do \
	    echo "\n########\n# Installing package $${PYTHON_OPENTELEMETRY_UTIL_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} ;\
	    dh_auto_install --buildsystem=pybuild --sourcedirectory util/$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE in $(PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGES); do \
	    echo "\n########\n# Installing package $${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} ;\
	    dh_auto_install --buildsystem=pybuild --sourcedirectory instrumentation/$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE in $(PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGES); do \
	    echo "\n########\n# Installing package $${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} ;\
	    dh_auto_install --buildsystem=pybuild --sourcedirectory propagator/$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} ;\
	done
ifeq (,$(filter nodoc,$(DEB_BUILD_OPTIONS)))
	# Generate the manual pages of the two scripts from their --help output,
	# see README.Debian. The modules are taken from the build folder: at this
	# point pybuild has installed them in versioned dist-packages folders,
	# dh_python3 only moves them to usr/lib/python3/dist-packages later.
	# help2man ignores the exit status and would make a manual page out of a
	# traceback, so the scripts are run once first to fail the build early.
	mkdir -p .pybuild/man
	set -e ;\
	export PYTHONPATH=`ls -d $(CURDIR)/.pybuild/cpython3_3.*_opentelemetry-instrumentation/build | head -n1` ;\
	export COLUMNS=1000 NO_COLOR=1 ;\
	debian/python3-opentelemetry-instrumentation/usr/bin/opentelemetry-bootstrap --version ;\
	debian/python3-opentelemetry-instrumentation/usr/bin/opentelemetry-instrument --version ;\
	help2man --no-info --no-discard-stderr \
	    --name="detect installed libraries and list OpenTelemetry instrumentations for them" \
	    --include=debian/opentelemetry-bootstrap.h2m \
	    --output=.pybuild/man/opentelemetry-bootstrap.1 \
	    "debian/help2man-wrapper debian/python3-opentelemetry-instrumentation/usr/bin/opentelemetry-bootstrap" ;\
	help2man --no-info --no-discard-stderr \
	    --name="run a Python program with OpenTelemetry auto-instrumentation" \
	    --include=debian/opentelemetry-instrument.h2m \
	    --output=.pybuild/man/opentelemetry-instrument.1 \
	    "debian/help2man-wrapper debian/python3-opentelemetry-instrumentation/usr/bin/opentelemetry-instrument"
endif

# The tests directory is passed explicitly, otherwise pytest picks up the
# testpaths of the repository-root pytest.ini, which points at the falcon
# instrumentation.
#
# A failing test suite does not stop the loops: all suites run, and the build
# fails at the end if any of them failed.
#
# The base package is tested against its own build dir only, like upstream
# does. Its auto_instrumentation tests load every installed instrumentor
# entry point, which with the shared folder imports django and breaks
# test_utils.py::UnwrapTestCase::test_noop_if_module_not_imported.
override_dh_auto_test:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
	set -e ;\
	for PYTHON_OPENTELEMETRY_PACKAGE in $(PYTHON_OPENTELEMETRY_PACKAGES); do \
	    echo "\n#######################\n# Run tests for $${PYTHON_OPENTELEMETRY_PACKAGE}\n#######################\n" ;\
	    cd $(CURDIR)/$${PYTHON_OPENTELEMETRY_PACKAGE} ;\
	    PYTHONPATH=`ls -d $(CURDIR)/.pybuild/cpython3_3.*_$${PYTHON_OPENTELEMETRY_PACKAGE}/build | head -n1` python3 -m pytest tests || echo $$PWD >> $(CURDIR)/.pybuild/tests-failed ;\
	done
	set -e ;\
	for PYTHON_OPENTELEMETRY_UTIL_PACKAGE in $(PYTHON_OPENTELEMETRY_UTIL_PACKAGES); do \
	    echo "\n#######################\n# Run tests for $${PYTHON_OPENTELEMETRY_UTIL_PACKAGE}\n#######################\n" ;\
	    cd $(CURDIR)/util/$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} ;\
	    PYTHONPATH=$(TMP_DIST-PACKAGES_FOLDER) python3 -m pytest tests || echo $$PWD >> $(CURDIR)/.pybuild/tests-failed ;\
	done
	set -e ;\
	for PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE in $(PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGES); do \
	    echo "\n#######################\n# Run tests for $${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE}\n#######################\n" ;\
	    cd $(CURDIR)/instrumentation/$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} ;\
	    PYTHONPATH=$(TMP_DIST-PACKAGES_FOLDER) python3 -m pytest tests || echo $$PWD >> $(CURDIR)/.pybuild/tests-failed ;\
	done
	set -e ;\
	for PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE in $(PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGES); do \
	    echo "\n#######################\n# Run tests for $${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE}\n#######################\n" ;\
	    cd $(CURDIR)/propagator/$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} ;\
	    PYTHONPATH=$(TMP_DIST-PACKAGES_FOLDER) python3 -m pytest tests || echo $$PWD >> $(CURDIR)/.pybuild/tests-failed ;\
	done
	test ! -e $(CURDIR)/.pybuild/tests-failed || { echo "Failed test suites:"; cat $(CURDIR)/.pybuild/tests-failed; false; }
endif

# Like in python-opentelemetry, the documentation is built in the
# dh_sphinxdoc override, with the shared folder of all built sub-projects as
# PYTHONPATH so sphinx.autodoc finds the modules.
override_dh_sphinxdoc:
ifeq (,$(findstring nodoc, $(DEB_BUILD_OPTIONS)))
	cd .pybuild && \
	PYTHONPATH=$(TMP_DIST-PACKAGES_FOLDER) && \
	export PYTHONPATH && \
	    python3 -m sphinx -b html $(SPHINXOPTS) ../docs $(CURDIR)/debian/python-opentelemetry-contrib-doc/usr/share/doc/python-opentelemetry-contrib-doc/html
	    rm $(CURDIR)/debian/python-opentelemetry-contrib-doc/usr/share/doc/python-opentelemetry-contrib-doc/html/.nojekyll
	dh_sphinxdoc
endif
