Bug#757760: debian-policy: please document build profiles

Sean Whitton <[email protected]>
Newsgroups gmane.linux.debian.devel.policy
Message-ID <877brz2rhp.fsf__9086.73209357715$1772136935$gmane$org@melete.silentflame.com>
Helmut Grohne [17/Nov 11:39am +01] wrote:
> diff --git a/policy/ch-controlfields.rst b/policy/ch-controlfields.rst
> index 9f06cc9..b492790 100644
> --- a/policy/ch-controlfields.rst
> +++ b/policy/ch-controlfields.rst
> @@ -152,6 +152,8 @@ The fields in the binary package stanzas are:
>
>  -  :ref:`Package-Type <s-f-Package-Type>`
>
> +-  :ref:`Build-Profiles <s-f-Build-Profiles>`
> +
>  The syntax and semantics of the fields are described below.
>
>  These fields are used by ``dpkg-gencontrol`` to generate control files
> @@ -1251,6 +1253,23 @@ or set it to ``binary-targets`` if it has been requested to test
>  whether the package it builds correctly implements the fall-back for
>  legacy builders.
>
> +``Build-Profiles``
> +~~~~~~~~~~~~~~~~~~
> +
> +This field occurs in the binary package sections of a source template
> +control file. It expresses whether the binary package is being
> +produced, given a set of enabled build profiles.  The condition uses
> +the same `restriction formula syntax <s-restrictions>` from the
> +``Build-Depends`` field.
> +
> +If a binary package stanza in a source package template control file
> +does not contain a ``Build-Profiles`` field, then it implicitly means
> +that it builds unconditionally with respect to build profiles.  If a
> +binary package stanza in a source package template control file is
> +annotated with a ``Build-Profiles`` field, then that binary package is
> +generated if and only if the condition expressed by field's value
> +evaluates to true.
> +
>  Remarks
>  ^^^^^^^
>
> diff --git a/policy/ch-relationships.rst b/policy/ch-relationships.rst
> index fb9dae8..89a8277 100644
> --- a/policy/ch-relationships.rst
> +++ b/policy/ch-relationships.rst
> @@ -51,22 +51,73 @@ For example, a list of dependencies might appear as:
>      Version: 1.3.17-1
>      Depends: libc6 (>= 2.2.1), default-mta | mail-transport-agent
>
> -Relationships may be restricted to a certain set of architectures. This
> -is indicated in brackets after each individual package name and the
> -optional version specification. The brackets enclose a non-empty list of
> -Debian architecture names in the format described in
> -:ref:`s-arch-spec`, separated by whitespace. Exclamation
> -marks may be prepended to each of the names. (It is not permitted for
> -some names to be prepended with exclamation marks while others aren't.)
> +.. _s-restrictions
> +
> +Restrictions
> +~~~~~~~~~~~~
> +
> +Relationships may be restricted to a certain set of architectures or
> +build profiles. This is indicated in brackets after each individual
> +package name and the optional version specification. There are two types
> +of restrictions.  Architecture restriction lists are enclosed in a pair
> +of opening and closing square brackets, the specifics of which are
> +`described below <s-architecture-restrictions>`. Build profile
> +restriction lists are enclosed by pairs of opening and closing angle
> +brackets and are also `described in detail below
> +<s-profile-restrictions>`.
> +
> +There can be at most one architecture restriction list per dependency
> +alternative, but there can be more than one build profile restriction
> +list. One or more build profile restriction lists form a build profile
> +restriction formula. If both an architecture restriction list and a
> +build profile restriction formula are to be applied to a dependency
> +alternative, then the architecture restriction list must come before the
> +build profile restriction formula in the field value. The non-empty sets
> +of terms enclosed in either square or angle brackets must be separated
> +by whitespace.
> +
> +Architecture restriction lists and build profile restriction formulas
> +are evaluated differently. Both can be evaluated to booleans, given a
> +host architecture and a set of enabled build profiles. Their results
> +indicate whether the dependency alternative should be considered or
> +ignored. For a dependency alternative to be considered, the architecture
> +restriction list (if any) and the build profile restriction formula (if
> +any) must evaluate to true. A dependency is ignored if none of its
> +alternatives apply.
> +
> +The sense in which a dependency is ignored depends on the field in which
> +the restriction appears.  A restriction in one of the build relationship
> +fields (``Build-Depends``...) that does not match means that the
> +build-dependency is not required to be satisfied for the package to be
> +built.  For example, a restriction might specify that building a package
> +on a certain architecture requires an additional dependency; such a
> +restriction does not match on other architectures, meaning the package
> +can be built there without first installing that additional dependency.
> +
> +A restriction appearing in a field describing relationships between
> +binary packages (such as ``Depends``) must only appear in the source
> +package template control file ``debian/control``.  The dependency is
> +ignored, in the sense that it will not appear in the corresponding
> +binary package control file, if the restriction does not match.
> +
> +.. _s-architecture-restrictions
> +
> +Architecture restrictions
> +^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Architecture restriction lists consist of Debian :ref:`architecture
> +specification strings <s-arch-spec>`.  Exclamation marks may be
> +prepended to each of the names. (It is not permitted for some names to
> +be prepended with exclamation marks while others aren't.)
>
>  For build relationship fields (``Build-Depends``,
>  ``Build-Depends-Indep``, ``Build-Depends-Arch``, ``Build-Conflicts``,
>  ``Build-Conflicts-Indep`` and ``Build-Conflicts-Arch``), if the current
>  Debian host architecture is not in this list and there are no
>  exclamation marks in the list, or it is in the list with a prepended
> -exclamation mark, the package name and the associated version
> -specification are ignored completely for the purposes of defining the
> -relationships.
> +exclamation mark, the restriction list evaluates to false.  This means
> +that the package name and the associated version specification are
> +ignored completely for the purposes of defining the relationships.
>
>  For example:
>
> @@ -134,11 +185,61 @@ is equivalent to ``foo`` on architectures using the Linux kernel and any
>  cpu, ``bar`` on architectures using any kernel and an i386 cpu, and
>  ``baz`` on any architecture using a kernel other than Linux.
>
> -Note that the binary package relationship fields such as ``Depends``
> -appear in one of the binary package stanzas of the template control file,
> -whereas the build-time relationships such as ``Build-Depends`` appear in
> -the source package stanza of the template control file (which is the first
> -section).
> +.. _s-profile-restrictions
> +
> +Build profile restriction formulas
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +A build profile restriction formula is a sequence of build profile
> +restriction lists. In contrast, there must not be more than one
> +architecture restriction list per dependency alternative.  Each list
> +is enclosed in angle brackets (less than sign and greater than
> +sign). Each of the space-separated terms of a restriction list is the
> +possibly-negated name of a build profile. Negation happens by
> +prefixing the name with an exclamation mark. Unlike architecture
> +restriction lists, positive and negative terms may be mixed.
> +
> +A restriction formula may be evaluated as a disjunctive normal form
> +expression, given a set of :ref:`enabled build profiles
> +<s-rules-build-profiles>`. In other words, each term within a
> +restriction list is AND-ed together while the restriction lists in a
> +restriction formula are OR-ed together. Therefore, the order of terms
> +within restriction lists and the order of restriction lists within a
> +restriction formula does not matter. A profile name in a term
> +evaluates to "true" if the profile with its name is enabled for the
> +build and to "false" otherwise. The result may be negated by
> +prefixing the profile name with an exclamation mark.
> +
> +In the following example, the package would depend on ``foo`` when built
> +for ``i386`` or 32-bit ARM architectures and if one of the ``nocheck``
> +and ``cross`` profiles is not enabled by the builder:
> +
> +::
> +
> +    Build-Depends: foo (>= 1.0) [i386 any-arm] <!nocheck> <!cross>, bar
> +
> +In the following example, the source package would build-depend on
> +``foo`` only if both the ``nocheck`` profile and the ``cross`` profile
> +are enabled at the same time.
> +
> +::
> +
> +    Build-Depends: foo <nocheck cross>
> +
> +In the next example, the source package would build-depend on ``foo`` if
> +``nopython`` is disabled and at least one of ``nocheck`` and
> +``noinsttest`` is disabled.
> +
> +::
> +
> +    Build-Depends: foo <!nopython !nocheck> <!nopython !noinsttest>
> +
> +The last example can also be rewritten to this alternative form which is
> +equal in meaning:
> +
> +::
> +
> +    Build-Depends: foo <!nopython !nocheck>, foo <!nopython !noinsttest>
>
>  .. _s-binarydeps:
>
> diff --git a/policy/ch-source.rst b/policy/ch-source.rst
> index a2aa4cc..fed0468 100644
> --- a/policy/ch-source.rst
> +++ b/policy/ch-source.rst
> @@ -621,6 +621,66 @@ order to make it work for your package.
>              # Code to run the package test suite.
>      endif
>
> +.. _s-rules-build-profiles
> +
> +``debian/rules`` and ``DEB_BUILD_PROFILES``
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +If the ``DEB_BUILD_PROFILES`` environment variable is defined during the
> +build of a source package, it specifies which build profiles are
> +enabled. Its value is a space-separated, unordered list of enabled build
> +profile names. By default, no build profiles are enabled. The meaning of
> +the following build profiles has been standardized:
> +
> +``nocheck``
> +    This profile extends the meaning of the ``nocheck`` tag in
> +    ``DEB_BUILD_OPTIONS`` and must not be enabled unless combined with
> +    that tag. In addition to disabling build-time testing, it allows
> +    skipping the installation of dependencies required for those tests
> +    during the build. Note that enabling the profile or the tag must not
> +    functionally change the emitted binary packages and also must not
> +    change the set of binary packages being produced. If tests happen to
> +    be installed into a binary package, consider supporting the
> +    ``noinsttest`` build profile.
> +
> +``noinsttest``
> +    This profile disables the emission of binary packages consisting
> +    entirely of automated tests, manual tests, example/demo programs,
> +    and test tools. Other packages must not functionally change when
> +    this profile is enabled. Note that in many cases, it is only
> +    possible to drop such dependencies used for building when enabling
> +    both the ``noinsttest`` and the ``nocheck`` build profile
> +    concurrently.  Therefore such dependencies tend to be conditional to
> +    ``<!nocheck> <!noinsttest>``.
> +
> +A larger list of commonly used build profiles can be found in the `Build
> +Profile Spec
> +<https://wiki.debian.org/BuildProfileSpec#Registered_profile_names>`_.
> +
> +The following makefile snippet is an example of how to enable python for
> +all builds except when the package is built with the ``nopython`` build
> +profile active.
> +
> +.. code-block:: Makefile
> +
> +    ifneq ($(filter nopython,$(DEB_BUILD_PROFILES)),)
> +        # nopython build profile was activated -- disable python
> +        CONFIGURE_SWITCHES += --disable-python
> +    else
> +        CONFIGURE_SWITCHES += --enable-python
> +    endif
> +
> +Alternatively, one may defer the evaluation of restriction formulas in
> +general (including architecture restrictions) to ``debhelper``.
> +
> +.. code-block:: Makefile
> +
> +    ifneq ($(filter foo,$(shell dh_listpackages)),)
> +        # foo is being built
> +        CONFIGURE_SWITCHES += --enable-foo
> +    else
> +        CONFIGURE_SWITCHES += --disable-foo
> +    endif
>
>  .. _s-debianrules-gainrootapi:

Seconded, but:

- I wonder what you think about upgrading "If tests happen to be
  installed into a binary package, consider supporting the
  ``noinsttest`` build profile." to Policy advice by saying that it is
  *recommended* to do this?  That would be a normative change.

- When you say "the following build profiles has been standardized" I
  will change that to "the following build profiles are standard" to
  make it clear we're standardising them by putting them in Policy, not
  that they are standardised elsewhere.

- I think I wrote a couple of paragraphs so perhaps I could be
  Co-authored-by too? :)

- I will do some other minor wording fixes after committing the change.

Thanks for the updated patch.

-- 
Sean Whitton
signature.asc (application/pgp-signature, 869 B)
-----BEGIN PGP SIGNATURE-----

iQJNBAEBCgA3FiEEm5FwB64DDjbk/CSLaVt65L8GYkAFAmmgqVIZHHNwd2hpdHRv
bkBzcHdoaXR0b24ubmFtZQAKCRBpW3rkvwZiQOL5D/4xucx+Zn4Kl3K4E+C8qMXk
5oFQNRTXRIMl1fdKSCtKUuDHPzsGHJCmkfFoem1oEDbnOL1ZLbMnOSD0VVAE+89e
fjjenZ7c3+6ScqG63j95JW9c3vCSGmvJ3e72tOMSEf/TaZVKktSRo/pmSnCDTiP3
/l1jkEizfecylGbRdH7/75g5Q3Eg0E0DDM2MlkBJ20HmEcYhfa0JAEVw+Jm5UBy4
B+3RIIoKehVZ6gvzyiDJ+4UfcFT+FNclb8X73Zueu5UcyLmvIYzUtHg2wzEHytic
g897VC/5r5MeR/uoxs4SdFP/o4MLyPDVyLzaogOajsNhlHd1MAp8DCRQlGr2K5lC
x/+HYNXpSjFE7jJzEswy9sAyCOAz6mf3aexdl3HZDwqhsi3qh+u8dlz3u122osZU
R5Z/LlXoi+TgTi8n+FQoslaT5XicKnajKcgQor5f53pEiOc7EW02uNiaa/AMm2nx
etL6Ooc//dy1EpXg1dM45UIf1tG6DrOHWpPv/FZsVLkV7+8M78BPMh9feDwYImvR
aoOpJcCPfjY5t94epcwDLdxE44Ur89tnVKKSEoRETTcBKAorHtF5KWTZmvDXvvrC
T/kl1SMCC7SH/jIHahj2VE6RmD1uMECH9CZSwLQc3IRKfuDSHhFFGcCzu/ZaGNgY
YeAVHKiNm/ejfulnbnaxVw==
=KH31
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.