[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: