Sorry I've let this languish rather - too many things to do. But Alkmim tried actually using it and as has been pointed out above there are omissions.
I've been meaning to start a thread on debian-devel to check that there was reasonable consensus around this approach inorder to answer the substantive question of 'are we really doing it this way?'. (And to save us having a long debate on details in this bug prematurely). I've not finished+sent that mail yet, but really will imminently now precise is frozen. In the meatime getting a user+GSOC has prompted an update. :-) BTW that was alkmim's first ever bugrep above so thanks for being nice to him. Attached is a slightly better version which is at least useful enough to work with. I've added manpage info and corrected the broken code round setting $buildstage. So the current interface is that dpkg-buildpackage does not have a comand-line option and just changes its behaviour if DEB_BUILD_OPTIONS=stage=1 is set (syntax copied from parallel=n), whilst dpkg-chceckbuildopts does not do anything with magic ENV vars but takes a --stage=n option. This was because that's how I expect it to be used (cross-building tools set the apropriate DEB_BUILD_OPTIONS item, and things 'just work'), but adding the ENV parsing code to dpkg-checkbuilddepends seemed unnecessary. I'm very happy to take advice on whether this is the right interface semantics to use. Maybe I really should add a --stage=n option to dpkg-buildpackage too? But do we really need more than one way to do this? The old version of the patch didn't work well if stage=1 is set but no Build-Depends-Stage1 is actualy present. (it carefully read no build deps and thus found they were satisfied). Now if falls back to the normal build deps if no staged build-deps are defined. We could declare than an error instead, but that makes it harder to iterate through a package set building and stage1 versions if present. I don't have strong opinions here. Wookey -- Principal hats: Linaro, Emdebian, Wookware, Balloonboard, ARM http://wookware.org/
diff -ur dpkg-1.16.2.original/man/deb-src-control.5 dpkg-1.16.2/man/deb-src-control.5 --- dpkg-1.16.2.original/man/deb-src-control.5 2012-03-19 06:40:08.000000000 +0000 +++ dpkg-1.16.2/man/deb-src-control.5 2012-04-13 02:42:48.181521792 +0100 @@ -135,6 +135,18 @@ in this case. .TP +.BI Build\-Depends\-Stage1: " package-list" +Modfied \fBBuild\-Depends\fP list of packages needed to build the source +package in 'bootstrap stage 1' mode. Staged builds are used to break +build-dependency loops when bootstrapping an architecture. + +.TP +.BI Build\-Depends\-Indep\-Stage1: " package-list" +Modified \fBBuild\-Depends\-Indep\fPA package list for building the source +package in 'bootstrap stage 1' mode. Staged builds are used to break +build-dependency loops when bootstrapping an architecture. + +.TP .BI Build\-Conflicts: " package-list" A list of packages that should not be installed when the package is build, for example because they interfere with the used build system. @@ -146,8 +158,12 @@ The syntax of the .B Build\-Depends -and +, .B Build\-Depends\-Indep +, +.B Build\-Depends\-Stage1 +and +.B Build\-Depends\-Indep\-Stage1 fields is a list of groups of alternative packages. Each group is a list of packages separated by vertical bar (or "pipe") symbols, "|". The groups are separated by commas. Commas are to be read as "AND", and pipes diff -ur dpkg-1.16.2.original/scripts/Dpkg/BuildOptions.pm dpkg-1.16.2/scripts/Dpkg/BuildOptions.pm --- dpkg-1.16.2.original/scripts/Dpkg/BuildOptions.pm 2012-03-19 06:40:08.000000000 +0000 +++ dpkg-1.16.2/scripts/Dpkg/BuildOptions.pm 2012-04-13 03:29:29.027410435 +0100 @@ -121,6 +121,9 @@ } elsif ($key eq 'parallel') { $value = "" if not defined($value); return 0 if $value !~ /^\d*$/; + } elsif ($key eq 'stage') { + $value = "" if not defined($value); + return 1 if $value !~ /^\d*$/; } $self->{'options'}{$key} = $value; diff -ur dpkg-1.16.2.original/scripts/Dpkg/Control/Fields.pm dpkg-1.16.2/scripts/Dpkg/Control/Fields.pm --- dpkg-1.16.2.original/scripts/Dpkg/Control/Fields.pm 2012-03-19 06:40:08.000000000 +0000 +++ dpkg-1.16.2/scripts/Dpkg/Control/Fields.pm 2012-04-13 01:46:59.484916503 +0100 @@ -73,10 +73,20 @@ dependency => 'normal', dep_order => 1, }, + 'Build-Depends-Stage1' => { + allowed => ALL_SRC, + dependency => 'normal', + dep_order => 1, + }, 'Build-Depends-Indep' => { allowed => ALL_SRC, dependency => 'normal', dep_order => 2, + }, + 'Build-Depends-Indep-Stage1' => { + allowed => ALL_SRC, + dependency => 'normal', + dep_order => 2, }, 'Built-Using' => { allowed => ALL_PKG, diff -ur dpkg-1.16.2.original/scripts/dpkg-buildpackage.pl dpkg-1.16.2/scripts/dpkg-buildpackage.pl --- dpkg-1.16.2.original/scripts/dpkg-buildpackage.pl 2012-03-19 06:40:09.000000000 +0000 +++ dpkg-1.16.2/scripts/dpkg-buildpackage.pl 2012-04-13 03:29:31.231421372 +0100 @@ -123,6 +123,7 @@ my $targetarch = my $targetgnusystem = ''; my $call_target = ''; my $call_target_as_root = 0; +my $buildstage = 0; my (@checkbuilddep_opts, @changes_opts, @source_opts); use constant BUILD_DEFAULT => 1; @@ -299,6 +300,9 @@ $build_opts->export(); } +$buildstage = $build_opts->get("stage") if $build_opts->has("stage"); + + my $cwd = cwd(); my $dir = basename($cwd); @@ -362,6 +366,9 @@ if ($admindir) { push @checkbuilddep_opts, "--admindir=$admindir"; } + if ($buildstage) { + push @checkbuilddep_opts, "--stage=$buildstage"; + } system('dpkg-checkbuilddeps', @checkbuilddep_opts); if (not WIFEXITED($?)) { diff -ur dpkg-1.16.2.original/scripts/dpkg-checkbuilddeps.pl dpkg-1.16.2/scripts/dpkg-checkbuilddeps.pl --- dpkg-1.16.2.original/scripts/dpkg-checkbuilddeps.pl 2012-03-19 06:40:09.000000000 +0000 +++ dpkg-1.16.2/scripts/dpkg-checkbuilddeps.pl 2012-04-13 03:46:33.968492845 +0100 @@ -51,6 +51,8 @@ -a arch assume given host architecture --admindir=<directory> change the administrative directory. + --stage=<level> + use build-depends-stage level specified -h, --help show this help message. --version show the version.") . "\n\n" . _g( @@ -61,13 +63,15 @@ my $binary_only=0; my ($bd_value, $bc_value); my $host_arch = get_host_arch(); +my $buildstage=0; if (!GetOptions('B' => \$binary_only, 'help|h' => sub { usage(); exit(0); }, 'version' => \&version, 'd=s' => \$bd_value, 'c=s' => \$bc_value, 'a=s' => \$host_arch, - 'admindir=s' => \$admindir)) { + 'admindir=s' => \$admindir, + 'stage=s' => \$buildstage)) { usage(); exit(2); } @@ -80,10 +84,16 @@ my $facts = parse_status("$admindir/status"); unless (defined($bd_value) or defined($bc_value)) { + my $BD_key="Build-Depends"; + my $BDI_key="Build-Depends-Indep"; + if ($buildstage and defined $fields->{"Build-Depends-Stage".$buildstage}) { + $BD_key="Build-Depends-Stage".$buildstage; + $BDI_key="Build-Depends-Indep-Stage".$buildstage; + } $bd_value = 'build-essential'; - $bd_value .= ", " . $fields->{"Build-Depends"} if defined $fields->{"Build-Depends"}; - if (not $binary_only and defined $fields->{"Build-Depends-Indep"}) { - $bd_value .= ", " . $fields->{"Build-Depends-Indep"}; + $bd_value .= ", " . $fields->{$BD_key} if defined $fields->{$BD_key}; + if (not $binary_only and defined $fields->{$BDI_key}) { + $bd_value .= ", " . $fields->{$BDI_key}; } $bc_value = $fields->{"Build-Conflicts"} if defined $fields->{"Build-Conflicts"}; if (not $binary_only and defined $fields->{"Build-Conflicts-Indep"}) {