Support for build-drivers as alternatives to debian/rules
=========================================================

Status: draft, experimental

Summary
-------

This is currently an exploratory and experimental way to replace the current
debian/rules usage with alternative interfaces for building packages.

It relies on a new Build-Driver field honored by dpkg-buildpackage, but that
might eventually disappear or change semantics.

Background
----------

Our current packaging methods are built around the concept of a Makefile
(debian/rules), which must contain every bit of logic needed to produce
debs. Historically, this involved duplicating various runes in every
package and then spending decades updating the runes in every package
as we got wiser. Over time there have been many attempts to centralize
these runes in package helpers such as debstd (obsolete), dbs (obsolete),
yada (obsolete), debhelper (still in use) and cdbs (still in use).

Despite these improvements, our state of the art packaging flow suffers
from this awkward "assume-nothing-do-everything" design. There are many
cases where dpkg has the only "official" tools to implement a feature
(e.g. dpkg-gencontrol and dpkg-deb), but we still expect that the helper
tools manage all orchestration of calling these tools in the right order.
Furthermore, the "Makefile as an entry point" also neuters any efficient
communication between dpkg tools and the underlying helper, as it
introduces an impedance layer which forces us to reparse the same files
multiple times, does not make it possible to guarantee a sanitized build
environment for the packaging, complicates our ability to enable certain
features transparently or (in debhelper's case) via compat bumps, and
also forces us into imperative packaging flows (making it difficult for
lintian to spot issues). As "recent" examples we can mention "build-arch"
targets, updating XXFLAGS to include basic hardening, and the
Rules-Requires-Root field.

All of these things complicate the lower packaging stack, inhibits our
ability to deploy various performance optimizations and neuters our
ability to make packaging simpler.
