Hi Sean and other policy editors,

it may appear strange to resume a thread that was last discussed seven 
years ago. Yet, we picked up this matter at the Würzburg sprint and 
iterated a lot on the proposal refining and extending it to cover all 
Multi-Arch values.

On Sat, Oct 14, 2017 at 02:53:50PM -0700, Sean Whitton wrote:
> If we are finished with our definitions for `no` and `foreign`, I think
> it would be worth releasing them in Policy, of course with a caveat
> saying "there are other possible values".  I say this as a package
> maintainer would has benefitted from reading your descriptions of
> `foreign` and `no`.  These are useful and should be out there.

I am really sorry I failed to follow up back then as I really do agree 
that having something in policy would help a lot.

You'll fine the result of two days of discussion and iteration among 
Jochen, josch, Holger and myself attached.

Kind regards

Jochen, josch and Helmut
diff --git a/policy/ch-controlfields.rst b/policy/ch-controlfields.rst
index 3151816..d43acac 100644
--- a/policy/ch-controlfields.rst
+++ b/policy/ch-controlfields.rst
@@ -1307,6 +1307,150 @@ This list is intentionally incomplete. You should consult the
 documentation of the tool or package in question for which keywords it
 defines and when they are needed.
 
+.. _s-f-Multi-Arch:
+
+``Multi-Arch``
+~~~~~~~~~~~~~~
+
+A Debian installation may combine packages from multiple architectures.
+The ``Multi-Arch`` header enables individual packages to declare their
+support for this feature. It may occur only in the control file of a
+binary package or in the per-package fields paragraph of a source
+package control file. The semantics of permitted values are ``no``
+(default), ``foreign``, ``same`` and ``allowed`` as described
+individually.
+
+.. _s-f-Multi-Arch-no:
+
+``Multi-Arch: no``
+^^^^^^^^^^^^^^^^^^
+
+When satisfying a dependency (using ``Depends``, ``Pre-Depends``,
+``Provides``, ``Recommends``, or ``Suggests``), the architecture of the
+depender and the architecture of the dependee being thus marked are
+required to be equal. For negative dependency relations (``Breaks``,
+``Conflicts``, and ``Replaces``) the architecture does not have to match
+for the relation to take effect.  Architecture-independent packages are
+treated as if they had the architecture value of the installed `dpkg`
+package.  Furthermore, multiple instances of a package with the same
+name and different architectures are not considered coinstallable.
+
+Note that due to limitations in the archive management software, this
+value cannot currently be specified explicitly in binary package control
+files.
+
+``Multi-Arch: foreign``
+^^^^^^^^^^^^^^^^^^^^^^^
+
+A binary package may be marked with a ``Multi-Arch: foreign`` control
+header if the provided interfaces are independent of the architecture of
+the package. Any provided virtual packages (see :ref:`s-virtual`)
+inherit this property. Given this header value, dependencies on this
+package are considered satisfied even when the depender's architecture
+differs from the marked package.
+
+There are five main areas that can contribute to the interface of a
+package and if any of them provides an architecture-dependent interface,
+a package must not be marked with ``Multi-Arch: foreign``.
+
+- The installed files of a package: Architecture-dependent packages may
+  install different sets of files or files with different content for
+  multiple architectures and these differences may contribute to the
+  interface (e.g. an endianess-dependent database file).  For
+  architecture-independent binary packages, there is aspect does not
+  apply.
+
+- The behavior of installed files of a package: When interfacing with
+  installed files by executing them, their behavior may contribute to
+  the provided interface.  For instance, interfacing with shared and
+  static libraries necessarily is architecture-dependent.  Whilst binary
+  executables generally differ with architectures, the exposed interface
+  (for example the command line interface, the content on standard
+  input/output, the way they process files) may be independent of the
+  architecture used to execute.  In that case, their interface may be
+  considered architecture-independent.
+
+- Maintainer scripts and triggers: A package may behave in an
+  architecture dependent way, when the maintainer scripts or invoked
+  triggers behave differently on different architectures. For instance,
+  byte-compiling source files into architecture-dependent bytecode
+  during ``postinst`` may turn the interface of a package
+  architecture-dependent.
+
+- The dependencies of a package: A package may expose functionality of
+  other packages by depending on them. In general, an executable does
+  not expose its linked shared libraries and therefore they do not
+  usually contribute to the interface. On the other hand, the whole
+  point of transitional packages is to expose such functionality.
+  Likewise, development packages for shared libraries necessarily expose
+  their own dependencies.
+
+- Implicit and foreign dependencies of a package: Essential packages are
+  implicitly depended upon and need not show up in ``Depends``. Yet
+  their behaviour can be architecture-dependent. For instance, using
+  ``dpkg --print-architecture`` can be used to emit the native
+  architecture even though ``dpkg`` is marked ``Multi-Arch: foreign``.
+  Similarly, calling ``pkgconf`` (without a prefix) will behave
+  differently on different architectures as its search path is
+  architecture-dependent even though ``pkgconf-bin`` is considered
+  ``Multi-Arch: foreign``.
+
+The interfaces of a package are determined by its maintainer.  However,
+some packages might expose architecture dependencies when other packages
+use them in a manner not intended by the maintainer.  This can happen
+when it is not clear which parts of the package are its interfaces.
+
+In such cases, where the package satisfies the criterion for
+``Multi-Arch: foreign`` but might expose architecture dependency,
+because it is not clear which parts of the package are its interfaces,
+the interfaces of the package should be described in the file
+``debian/README.multiarch``.
+
+Conversely, justifying the use of functionality that is not covered by
+its offered interface with a dependency on such a package is not
+allowed.
+
+``Multi-Arch: same``
+^^^^^^^^^^^^^^^^^^^^
+
+Multiple binary packages with the same name and version may be installed
+concurrently if all of them carry this header valued ``same``. Any set
+of packages with matching name and version being thus marked must
+support two properties.
+
+- All filenames that are present in multiple of these packages must
+  contain bit-identical content across architectures. [#]_
+
+  For files whose name is unique within this set, no such requirement
+  exists. Therefore, such packages usually install most of their files
+  below ``/usr/lib/${DEB_HOST_MULTIARCH}``.
+
+- The maintainer scripts must be prepared to be configured or
+  deconfigured multiple times. In particular, ``postrm`` must consider
+  that another instance may still be present. It may check the
+  ``DPKG_MAINTSCRIPT_PACKAGE_REFCOUNT`` environment variable set by
+  ``dpkg``.
+
+``Multi-Arch: allowed``
+^^^^^^^^^^^^^^^^^^^^^^^
+
+A package annotated this way behaves as if it were annotated with the
+``no`` value except that a depender may now append ``:any`` to the
+package name in a dependency relation field. In that case, the
+dependency is considered satisfied even when the architecture of the
+depender differs from the dependee's. Dependencies carrying a ``:any``
+suffix can only be satisfied by packages marked ``Multi-Arch: allowed``.
+
+This value should be used rarely for cases where the package can be used
+in an architecture-dependent way or in an architecture-independent way
+and the decision of which applies is deferred to the depender. The most
+common use is with programming language interpreters that enable loading
+architecture-dependent plugins.
+
+Since removing this value tends to break reverse dependencies that
+employ ``:any``, uses of it should be discussed with
+*debian-de...@lists.debian.org* first.
+
 .. _s5.7:
 
 User-defined fields
@@ -1443,3 +1587,9 @@ details.
 
 .. [#]
    That is, the parts which are not the ``.dsc``.
+
+.. [#]
+   As an exception, the ``libc6`` package is marked ``Multi-Arch: same``
+   despite not fully complying with this requirement, because the
+   location of the dynamic loader is not universally unique and cannot
+   be changed without breakig ABI.

Reply via email to