contrib/packaging/debian/rules
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 08 Jul 2021 04:29:36 +0200
changeset 47610 f89d3050dcd5
parent 46844 2fd5e0054dd9
child 49066 8d7eaff92f9c
permissions -rwxr-xr-x
resolve: use the `parentchange` context manager to apply merge action In an ideal world, we would not have to do that. However, we are miles away from being ready to not have to do it. So we add this context manager alongside a long comment. This will help use to get to the point were have two distinct API with strict rules about when to call them. Differential Revision: https://phab.mercurial-scm.org/D11074

#!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
# export DH_VERBOSE=1

# By default we build a .deb where the native components are built with the
# current "default" version of py3 on the build machine. If you wish to build a
# .deb that has native components built for multiple versions of py3:
#
#   1. install python3.x and python3.x-dev for each version you want
#   2. set DEB_HG_MULTI_VERSION=1 or DEB_HG_PYTHON_VERSIONS in your environment
#      (if both are set, DEB_HG_PYTHON_VERSIONS has precedence)
#
# If you choose `DEB_HG_MULTI_VERSION=1`, it will build for every "supported"
# version of py3 that's installed on the build machine. This may not be equal to
# the actual versions that are installed, see the comment above where we set
# DEB_HG_PYTHON_VERSIONS below. If you choose to set `DEB_HG_PYTHON_VERSIONS`
# yourself, set it to a space-separated string of python version numbers, like:
#   DEB_HG_PYTHON_VERSIONS="3.7 3.8" make deb
DEB_HG_MULTI_VERSION?=0

# Set to 1 to make /usr/bin/hg a symlink to chg, and move hg to
# /usr/lib/mercurial/hg.
DEB_HG_CHG_BY_DEFAULT?=0

CPUS=$(shell cat /proc/cpuinfo | grep -E ^processor | wc -l)

# By default, only build for the version of python3 that the system considers
# the 'default' (which should be the one invoked by just running 'python3'
# without a minor version). If DEB_HG_PYTHON_VERSIONS is set, this is ignored.
ifeq ($(DEB_HG_MULTI_VERSION), 1)
	# If we're building for multiple versions, use all of the "supported" versions
	# on the build machine. Note: the mechanism in use here (`py3versions`) is the
	# recommended one, but it relies on a file written by the python3-minimal
	# package, and this file is not dynamic and does not account for manual
	# installations, just the ones that would be installed by `python3-all`. This
	# includes the `-i` flag, which claims it's to list all "installed" versions,
	# but it doesn't. This was quite confusing, hence this tale of woe. :)
	DEB_HG_PYTHON_VERSIONS?=$(shell py3versions -vs)
else
	# If we're building for only one version, identify the "default" version on
	# the build machine and use that when building; this is just so that we don't
	# have to duplicate the rules below for multi-version vs. single-version. The
	# shebang line will still be /usr/bin/python3 (no minor version).
	DEB_HG_PYTHON_VERSIONS?=$(shell py3versions -vd)
endif

ifeq ($(DEB_HG_CHG_BY_DEFAULT), 1)
	# Important: the "real" hg must have a 'basename' of 'hg'. Otherwise, hg
	# behaves differently when setting $HG and breaks aliases that use that.
	export HGPATH=/usr/lib/mercurial/hg
endif

export HGPYTHON3=1
export PYTHON=python3

%:
	dh $@ --with python3

# Note: testing can be disabled using the standard `DEB_BUILD_OPTIONS=nocheck`
override_dh_auto_test:
	http_proxy='' dh_auto_test -- TESTFLAGS="-j$(CPUS)"

override_dh_python3:
	dh_python3 --shebang=/usr/bin/python3

override_dh_auto_clean:
	$(MAKE) cleanbutpackages
	$(MAKE) -C contrib/chg clean

override_dh_auto_build:
	$(MAKE) all
	$(MAKE) -C contrib/chg all

# Build the native extensions for a specfic python3 version (which must be
# installed on the build machine).
install-python%:
	python$* setup.py install --root "$(CURDIR)"/debian/mercurial --install-layout=deb

# Build the final package. This rule has a dependencies section that causes the
# native extensions to be compiled for every version of python3 listed in
# DEB_HG_PYTHON_VERSIONS.
override_dh_auto_install: $(DEB_HG_PYTHON_VERSIONS:%=install-python%)
	# chg
	make -C contrib/chg \
		DESTDIR="$(CURDIR)"/debian/mercurial \
		PREFIX=/usr \
		install
	make install-doc PREFIX="$(CURDIR)"/debian/mercurial/usr
	cp contrib/hg-ssh "$(CURDIR)"/debian/mercurial/usr/bin
	mkdir -p "$(CURDIR)"/debian/mercurial/usr/share/mercurial
	cp contrib/hgk "$(CURDIR)"/debian/mercurial/usr/share/mercurial
	mkdir -p "$(CURDIR)"/debian/mercurial/etc/mercurial/hgrc.d/
	cp contrib/packaging/debian/*.rc "$(CURDIR)"/debian/mercurial/etc/mercurial/hgrc.d/
	# completions
	mkdir -p "$(CURDIR)"/debian/mercurial/usr/share/bash-completion/completions
	cp contrib/bash_completion "$(CURDIR)"/debian/mercurial/usr/share/bash-completion/completions/hg
	mkdir -p "$(CURDIR)"/debian/mercurial/usr/share/zsh/vendor-completions
	cp contrib/zsh_completion "$(CURDIR)"/debian/mercurial/usr/share/zsh/vendor-completions/_hg
	if [ "$(DEB_HG_CHG_BY_DEFAULT)" -eq 1 ]; then \
		mkdir -p "$(CURDIR)"/debian/mercurial/usr/lib/mercurial; \
		mv "$(CURDIR)"/debian/mercurial/usr/bin/hg "$(CURDIR)"/debian/mercurial/usr/lib/mercurial/hg; \
		ln -s chg "$(CURDIR)"/debian/mercurial/usr/bin/hg; \
	fi