]> git.donarmstrong.com Git - debhelper.git/blobdiff - dh
split get_make_jobserver_status into two functions
[debhelper.git] / dh
diff --git a/dh b/dh
index 2e7385f4ec7f286bd197c53bc388087a899fc5dd..a233db4a8ef44369ffd521b177e5ce2d775d4256 100755 (executable)
--- a/dh
+++ b/dh
@@ -8,7 +8,6 @@ dh - debhelper command sequencer
 
 use strict;
 use Debian::Debhelper::Dh_Lib;
-use File::Spec;
 
 =head1 SYNOPSIS
 
@@ -42,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
@@ -223,9 +229,26 @@ 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.
+if (is_make_jobserver_unavailable()) {
+       clean_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{
@@ -254,7 +277,6 @@ $sequences{install} = [@{$sequences{build}}, qw{
        dh_installcatalogs
        dh_installcron
        dh_installdebconf
-       dh_installcatalogs
        dh_installemacsen
        dh_installifupdown
        dh_installinfo
@@ -294,6 +316,9 @@ $sequences{binary} = [@{$sequences{install}}, qw{
 }, @b];
 $sequences{'binary-arch'} = [@{$sequences{binary}}];
 
+# Additional command options
+my %command_opts;
+
 # sequence addon interface
 sub _insert {
        my $offset=shift;
@@ -334,11 +359,32 @@ sub add_command {
        my $sequence=shift;
        unshift @{$sequences{$sequence}}, $command;
 }
+sub add_command_options {
+       my $command=shift;
+       push @{$command_opts{$command}}, @_;
+}
+sub remove_command_options {
+       my $command=shift;
+       if (@_) {
+               # Remove only specified options
+               if (my $opts = $command_opts{$command}) {
+                       foreach my $opt (@_) {
+                               $opts = [ grep { $_ ne $opt } @$opts ];
+                       }
+                       $command_opts{$command} = $opts;
+               }
+       }
+       else {
+               # Clear all additional options
+               delete $command_opts{$command};
+       }
+}
 
 if ($dh{LIST}) {
        my %addons;
 
        for my $inc (@INC) {
+               eval q{use File::Spec};
                my $path = File::Spec->catdir($inc, "Debian/Debhelper/Sequence");
                if (-d $path) {
                        for my $module_path (glob "$path/*.pm") {
@@ -362,7 +408,7 @@ foreach my $addon (@{$dh{WITH}}) {
        $mod=~s/-/_/g;
        eval "use $mod";
        if ($@) {
-               error("--with $addon not supported or failed to load module $mod");
+               error("unable to load addon $addon: $@");
        }
 }
 
@@ -409,7 +455,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;
@@ -490,6 +541,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;
@@ -501,6 +558,10 @@ sub run {
                $command="debian/rules";
                @options="override_".$override_command;
        }
+       else {
+               # Pass additional command options if any
+               unshift @options, @{$command_opts{$command}} if exists $command_opts{$command};
+       }
 
        # 3 space indent lines the command being run up under the 
        # sequence name after "dh ".