=head1 SYNOPSIS
-B<dh> sequence [B<--with> 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
options can override this behavior.
If debian/rules contains a target with a name like "override_I<dh_command>",
-then when it gets to that command in the sequence, dh will run that
-target from the rules file, rather than running the actual command. The
-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.)
+then when it would notmally run I<dh_command>, dh will instead call that
+target. The override target can then run the command with additional options,
+or run entirely different commands instead. See examples below. (Note that to
+use this feature, you should Build-Depend on debhelper 7.0.50 or above.)
=head1 OPTIONS
=over 4
-=item B<--with> I<addon>
+=item B<--with> I<addon>[,I<addon>,...]
Add the debhelper commands specified by the given addon to appropriate places
in the sequence of commands that is run. This option can be repeated more
-than once, and is used when there is a third-party package that provides
+than once, or multiple addons can be listed, separated by commas.
+This is used when there is a third-party package that provides
debhelper commands. See the PROGRAMMING file for documentation about
the sequence addon interface.
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.
Run all commands in the sequence that have yet to be run.
+=item B<--no-act>
+
+Prints commands that would run for a given sequence, but does not run them.
+
=back
All other options passed to dh are passed on to each command it runs. This
can be used to set an option like "-v" or "-X" or "-N", as well as for more
specialised options.
-=head1 COMMAND SPECIFICATION
-
-I<cmd> can be a full name of a debhelper command, or a substring. It'll first
-search for a command in the sequence exactly matching the name, to avoid any
-ambiguity. If there are multiple substring matches, the last one in the
-sequence will be used.
+In the above options, I<cmd> can be a full name of a debhelper command, or
+a substring. It'll first search for a command in the sequence exactly
+matching the name, to avoid any ambiguity. If there are multiple substring
+matches, the last one in the sequence will be used.
=cut
%:
dh --with python-central $@
+Here is how to force use of perl's Module::Build build system,
+which can be necessary if debhelper wrongly detects that the package
+uses MakeMaker.
+
+ #!/usr/bin/make -f
+ %:
+ dh --buildsystem=perl_build $@
+
To patch your package using quilt, you can tell dh to use quilt's dh
sequence addons like this:
%:
dh --with quilt $@
+Here is an example of overriding where the dh_auto_* commands find
+the package's source, for a package where the source is located in a
+subdirectory.
+
+ #!/usr/bin/make -f
+ %:
+ dh --sourcedirectory=src $@
+
+Finally, here is a way to prevent dh from running several commands
+that you don't want it to run, by defining empty override targets for each
+command.
+
+ #!/usr/bin/make -f
+ %:
+ dh $@
+
+ # Commands not to run:
+ override_dh_auto_test override_dh_compress override_dh_fixperms:
+
=cut
# Stash this away before init modifies it.
# python-support is enabled by default, at least for now
# (and comes first so python-central loads later and can disable it).
unshift @ARGV, "--with=python-support";
+
+# Disable complaints about unknown options for both dh and the commands
+# it runs. This is done because dh accepts and passes on options that may
+# be specific to only some debhelper commands.
+$ENV{DH_IGNORE_UNKNOWN_OPTIONS}=1;
init(options => {
"until=s" => \$dh{UNTIL},
"remaining" => \$dh{REMAINING},
"with=s" => sub {
my ($option,$value)=@_;
- push @{$dh{WITH}},$value;
+ push @{$dh{WITH}},split(",", $value);
},
"without=s" => sub {
my ($option,$value)=@_;
@{$dh{WITH}} = grep { $_ ne $value } @{$dh{WITH}};
},
+ "l" => \$dh{LIST},
+ "list" => \$dh{LIST},
});
inhibit_log();
+# If make is using a jobserver, but it is not available
+# to this process, clean out MAKEFLAGS. This avoids
+# ugly warnings when calling make.
+if (is_make_jobserver_unavailable()) {
+ clean_jobserver_makeflags();
+}
+
# Definitions of sequences.
my %sequences;
$sequences{build} = [qw{
dh_installcatalogs
dh_installcron
dh_installdebconf
- dh_installcatalogs
dh_installemacsen
dh_installifupdown
dh_installinfo
dh_gconf
dh_icons
dh_perl
- dh_scrollkeeper
dh_usrlocal
dh_link
}, @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: $@");
}
}
$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 ".
# Need to handle logging for overriden commands here,
# because the actual debhelper command may not have
# been run by the rules file target.
- my %packages=map { $_ => 1 } @packages;
- map { delete $packages{$_} } @exclude;
- write_log($override_command, keys %packages);
+ # (But avoid logging for dh_clean since it removes
+ # the log earlier.)
+ if ($override_command ne 'dh_clean') {
+ my %packages=map { $_ => 1 } @packages;
+ map { delete $packages{$_} } @exclude;
+ write_log($override_command, keys %packages);
+ }
}
}
}