For some compilation scenarios it is required to build-depend on a different set of binary packages than specified in the Build-Depends line. The two most important scenarios are:
- Bootstrapping (for breaking build dependency cycles) and
- Cross building (for source packages having different build dependencies during cross building than during native building)
We propose an extension of the Build-Depends field syntax. This extension allows to mark build dependencies as being needed or not needed when a specific profile is activated. We also propose the introduction of a new field called "Profile" which aids in marking binary packages as being built or not built while a certain profile is activated or having been built with a certain set of profiles activated.
Build-Depends syntax extension
We propose a syntax which in practice looks as follows:
Build-Depends: foo (>= 1.0) [i386 arm] [!profile.stage1], bar
Our proposal extends the architecture restriction syntax in square brackets from a single disjunctive list of architectures to a conjunctive list of logical disjunctions (a conjunctive normal form expression). Each clause of the conjunction is enclosed in square brackets. Every literal inside square brackets is a logical disjunction. The above example would therefore make the source package build depend on foo if the host architecture is either i386 or amd64 and if the profile named "stage1" is not active.
Every literal in a disjunction follows the following regular expression:
The first group is called a namespace and we propose the namespace "profile" to support build profiles. The second group is called a label and for the "profile" namespace we propose as initial labels "stage1", "stage2" and "cross".
The other already existing namespace would be "arch" for architectures. For backwards compatibility it is allowed to specify architecture labels without the "arch" namespace in front. The following is therefore equivalent:
Build-Depends: foo [i386 arm64] Build-Depends: foo [arch.i385 arch.arm64]
These literals can be negated by using an exclamation mark as a prefix. We propose that literals inside a disjunction can individually be negated or not. To provide backwards compatibility, a disjunction which only contains architecture lables without their "arch" namespace must either be all negated or all positive. The following statements would therefore be legal:
Build-Depends: foo [profile.stage1 !profile.cross]
But the following would be illegal as it was before:
Build-Depends: foo [i386 !amd64]
We propose that literals of different namespaces can be mixed within a disjunction. Therefore, the following would be legal:
Build-Depends foo [arch.i386 !profile.cross]