=head1 SYNOPSIS
-B<dh> sequence [B<--with> I<addon>[,I<addon>,...]] [B<--until> I<cmd>] [B<--before> I<cmd>] [B<--after> I<cmd>] [B<--remaining>] [S<I<debhelper options>>]
+B<dh> sequence [B<--with> I<addon>[,I<addon>,...]] [B<--list>] [B<--until> I<cmd>] [B<--before> I<cmd>] [B<--after> I<cmd>] [B<--remaining>] [S<I<debhelper options>>]
=head1 DESCRIPTION
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
The inverse of --with, disables using the given addon.
+=item B<--list>, B<-l>
+
+List all available addons.
+
=item B<--until> I<cmd>
Run commands in the sequence until and including I<cmd>, then stop.
my ($option,$value)=@_;
@{$dh{WITH}} = grep { $_ ne $value } @{$dh{WITH}};
},
+ "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{
dh_installcatalogs
dh_installcron
dh_installdebconf
- dh_installcatalogs
dh_installemacsen
dh_installifupdown
dh_installinfo
}, @b];
$sequences{'binary-arch'} = [@{$sequences{binary}}];
+# Additional command options
+my %command_opts;
+
# sequence addon interface
sub _insert {
my $offset=shift;
}
}
+sub add_command {
+ my $command=shift;
+ 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") {
+ my $name = basename($module_path);
+ $name =~ s/\.pm$//;
+ $name =~ s/_/-/g;
+ $addons{$name} = 1;
+ }
+ }
+ }
+
+ for my $name (sort keys %addons) {
+ print "$name\n";
+ }
+
+ exit 0;
+}
+
foreach my $addon (@{$dh{WITH}}) {
my $mod="Debian::Debhelper::Sequence::$addon";
$mod=~s/-/_/g;
eval "use $mod";
if ($@) {
- error("--with $addon not supported or failed to load module $mod");
+ error("unable to load addon $addon: $@");
}
}
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;
# 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;
$override_command=$command;
# This passes the options through to commands called
# inside the target.
- $ENV{DH_INTERNAL_OPTIONS}=join(" ", @options);
+ $ENV{DH_INTERNAL_OPTIONS}=join("\x1e", @options);
$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 ".