Re: dh-python (pybuild + dh_py*) documentation
> > Can you be more specific about what's missing?
>
> I for one lack a high level presentation of how the various bits work together
here's what I got so far (I wanted to provide it as
/usr/share/doc/dh-python/README). I stopped working on it because now I
have to prove dh-python is not responsible for maintainers that override
dh_auto_install and rm egg-info or new "features" in python3.5
--
evil general Piotr (Brutus: or is it caezar now?)
dh-python
=========
dh-python provides various tools that help packaging Python related files in Debian.
* pybuild is a tool that implements dh sequencer's dh_auto_foo commands (but it
can be used outside dh as well). It builds and installs files.
* dh_python2 / dh_python3 / dh_pypy are tools that take what pybuild produces
and generate runtime dependencies, maintainer scripts (and fix some common
mistakes, like installing files into site-packages instead of dist-packages,
/usr/local/bin/ shebangs, removes .py files from -dbg packages, etc.)
To translate requires.txt (file installed in dist-packages/foo.egg-info/)
into Debian dependencies, a list of packages that provide given Egg
distribution is used. If dependency is not found there, dpkg -S is used (i.e.
given dependency has to be installed, you need it in Build-Depends in order
to run tests anyway). See `dependencies` section in dh_python3's manpage for
more details.
* dh_python2 works on ./debian/python-foo/ files and other binary packages that
have ${python:Depends} in Depends fields.
It ignores Python 3.X and PyPy specific directories.
See dh_python2 manpage for more details.
* dh_python3 works on ./debian/python3-foo/ files and other binary packages that
have ${python3:Depends} in Depends fields.
It ignores Python 2.X and PyPy specific directories.
See dh_python3 manpage for more details.
* dh_pypy works on ./debian/pypy-foo/ files and other binary packages that
have ${pypy:Depends} in Depends fields.
It ignores Python 2.X and Python 3.X specific directories.
See dh_pypy manpage for more details.
how it works together
----------------------
Simplified workflow looks like this:
.. code:: python
# dh_auto_clean stage
for interpreter in REQUESTED_INTERPRETERS:
for version in REQUESTED_VERSIONS:
PYBUILD_BEFORE_CLEAN
pybuild --clean
PYBUILD_AFTER_CLEAN
plenty_of_other_dh_foo_tools_invoked_here
# dh_auto_configure stage
for interpreter in REQUESTED_INTERPRETERS:
for version in REQUESTED_VERSIONS:
PYBUILD_BEFORE_CONFIGURE
pybuild --configure
PYBUILD_AFTER_CONFIGURE
plenty_of_other_dh_foo_tools_invoked_here
# dh_auto_build stage
for interpreter in REQUESTED_INTERPRETERS:
for version in REQUESTED_VERSIONS:
PYBUILD_BEFORE_BUILD
pybuild --build
PYBUILD_AFTER_BUILD
plenty_of_other_dh_foo_tools_invoked_here
# dh_auto_test stage
for interpreter in REQUESTED_INTERPRETERS:
for version in REQUESTED_VERSIONS:
PYBUILD_BEFORE_TEST
pybuild --test
PYBUILD_AFTER_TEST
plenty_of_other_dh_foo_tools_invoked_here
# dh_auto_install stage
for interpreter in REQUESTED_INTERPRETERS:
for version in REQUESTED_VERSIONS:
PYBUILD_BEFORE_INSTALL
pybuild --install
PYBUILD_AFTER_INSTALL
plenty_of_other_dh_foo_tools_invoked_here
dh_python2
dh_python3
dh_pypy
plenty_of_other_dh_foo_tools_invoked_here
pybuild --$step
~~~~~~~~~~~~~~~
This command is autodetected, it currently supports distutils, autotools, cmake
and a custom build system where you can define your own set of commands. Why do
we need it? dh_auto_foo doesn't know each command has to be invoked for each
interpreter and version.
REQUESTED_INTERPRETERS
~~~~~~~~~~~~~~~~~~~~~~
is parsed from Build-Depends if --buildsystem=pybuild is set, if it's not: you
have to pass --interpreter to pybuild (more in its manpage)
* python{3,}-all{,-dev} - all cPython interpreters (for packages that provide
public modules / extensions)
* python{3,}-all-dbg - all cPython debug interpreters (if -dbg package is provided)
* python{3,} - default cPython or closest to default interpreter only (use
this if you build Python application)
* python{3,}-dbg - default cPython debug (or closest to the default one) only
* pypy - PyPy interpreter (use this )
REQUESTED_VERSIONS
~~~~~~~~~~~~~~~~~~
is parsed from X-Python{,3}-Version and Build-Depends (the right X-*-Version is
parsed based on interpreters listed in B-D, see above) See also Debian Python
Policy for X-Python-Version description.
BEFORE and AFTER commands
~~~~~~~~~~~~~~~~~~~~~~~~~
can be different for each interpreter and/or version examples:
* `PYBUILD_AFTER_BUILD_python3.5=rm {destdir}/{build_dir}/foo/bar2X.py`
* `PYBUILD_BEFORE_INSTALL_python3=touch {destdir}/{install_dir}/foo/bar/__init__.py`
These commands should be used if overriding dh_auto_foo is not enough (example
below)
override_dh_auto_install:
before_auto_install_commands
dh_auto_install
after_auto_install_commands
See pybuild manpage for more details (search for `BUILD SYSTEM ARGUMENTS`)
overrides
~~~~~~~~~
How to override pybuild autodetected options:
* each pybuild call can be disabled (for given interpretter, version or stage)
See pybuild manpage for more details (search for --disable description).
* you can pass options in override_dh_auto_foo via
`dh_auto_foo -- pybuild_options`
or
`PYBUILD_$OPTION=foo dh_auto_bar`
* `export PYBUILD_$OPTION=foo` in debian/rules
* overrode_dh_python3:
dh_python3 --shebang=/usr/bin/python3
See pybuild's manpage for more details
Reply to: