diff options
author | Modestas Vainius <modestas@vainius.eu> | 2009-10-28 15:49:34 -0400 |
---|---|---|
committer | Joey Hess <joey@gnu.kitenet.net> | 2009-10-28 15:49:34 -0400 |
commit | dace0773fe5f66fdf040f54383322e21a65fa1e8 (patch) | |
tree | d03e084c1980708e31773b1b422cfec4e5546c7d /dh | |
parent | 834d95aaba24e5cee1c5a74078a09443f5e122a7 (diff) |
Support parallel building in makefile buildsystem
1) Add routine to Dh_Lib (used by dh and makefile.pm) which is capable of
detecting make jobserver and job control options from the MAKEFLAGS environment
variable. It also generates and returns a clean up MAKEFLAGS from these
options.
2) Add --parallel option to build system framework which allows source packages
to specify that they support parallel building. Optional value for this option is
the number of maximum parallel process to allow. However, the actual number of
parallel process (if any) for the specific build is determined from
DEB_BUILD_OPTIONS env variable as specified by Debian Policy.
By default (no --parallel option) parallel is neither enabled nor disabled
(depends on the external environment). However, dh may pass --parallel to
dh_auto_* implicitly in case 4) described below.
3) Add parallel support for makefile buildsystem. This implementation
forcefully starts a new make job server (or disables parallel) for the number
of process requested. If --parallel was not passed to the build system at all,
the build system will only clean up MAKEFLAGS from stale jobserver options to
avoid pointless make warnings.
4) If dh detects that it is being run by dpkg-buildpackage -jX and it is NOT
run with "+" prefix from debian/rules (i.e. jobserver is not reachable), it
enables --parallel implicitly. This closes: #532805.
Signed-off-by: Modestas Vainius <modestas@vainius.eu>
Diffstat (limited to 'dh')
-rwxr-xr-x | dh | 44 |
1 files changed, 43 insertions, 1 deletions
@@ -41,6 +41,13 @@ override target can then run the command with additional options, or run entirely different commands instead. (Note that to use this feature, you should Build-Depend on debhelper 7.0.50 or above.) +dh passes --parallel to dh_auto_* commands if it detects being run by the +C<dpkg-buildpackage -jX> command, but a job server of the parent I<make> +(presumably debian/rules) is not reachable. Nonetheless, it is highly +recommended to pass --parallel/-j option to dh explicitly to indicate that a +source package supports parallel building. See L<debhelper(7)/"BUILD SYSTEM +OPTIONS"> for more information. + =head1 OPTIONS =over 4 @@ -222,9 +229,33 @@ init(options => { }, "l" => \$dh{LIST}, "list" => \$dh{LIST}, + "j:i" => \$dh{PARALLEL}, + "parallel:i" => \$dh{PARALLEL}, }); inhibit_log(); +# Parallel defaults to "unset" unless unavailable --jobserver-fds is detected +# in MAKEFLAGS. This typically means dpkg-buildpackage was called with a -jX +# option. Then -jX in MAKEFLAGS gets "consumed" by make invocation of +# debian/rules and "converted" to --jobserver-fds. If jobserver is +# unavailable, dh was probably called via debian/rules without "+" prefix (so +# make has closed jobserver FDs). In such a case, MAKEFLAGS is cleaned from the +# offending --jobserver-fds option in order to prevent further make invocations +# from spitting warnings and disabling job support. +my ($status, $makeflags) = get_make_jobserver_status(); +if ($status eq "jobserver-unavailable") { + # Stop make from spitting pointless job control warnings + if (defined $makeflags) { + $ENV{MAKEFLAGS} = $makeflags; + } + else { + delete $ENV{MAKEFLAGS}; + } + # Enable parallel (no maximum) if the package doesn't since it appears this + # dh is called via dpkg-buildpackage -jX. + $dh{PARALLEL} = 0 if !defined $dh{PARALLEL}; +} + # Definitions of sequences. my %sequences; $sequences{build} = [qw{ @@ -431,7 +462,12 @@ while (@ARGV_orig) { shift @ARGV_orig; next; } - elsif ($opt =~ /^--?(no-act|remaining|(after|until|before|with|without)=)/) { + elsif ($opt =~ /^--?(no-act|remaining|(after|until|before|with|without|parallel)=)/) { + next; + } + elsif ($opt =~ /^(-j|--parallel)$/) { + # Argument to -j/--parallel is optional. + shift @ARGV_orig if @ARGV_orig > 0 && $ARGV_orig[0] =~ /^\d+$/; next; } push @options, $opt; @@ -512,6 +548,12 @@ sub run { # to prevent them from being acted on. push @options, map { "-N$_" } @exclude; + # Pass --parallel to dh_auto_* commands if requested + if (defined $dh{PARALLEL} && ($dh{PARALLEL} == 0 || $dh{PARALLEL} > 1) + && $command =~ /^dh_auto_/) { + push @options, "--parallel" . ($dh{PARALLEL} > 1 ? "=$dh{PARALLEL}" : ""); + } + # Check for override targets in debian/rules and # run them instead of running the command directly. my $override_command; |