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.)
-
-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.
+then when it would normally 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
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
#!/usr/bin/make -f
%:
- dh --with python-central $@
+ 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:
#!/usr/bin/make -f
%:
- dh --with quilt $@
+ 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. It also forces use of perl's Module::Build build system,
-which can be necessary if debhelper wrongly detects that the package
-uses MakeMaker.
+subdirectory.
#!/usr/bin/make -f
%:
- dh --sourcedirectory=src --buildsystem=perl_build $@
+ dh $@ --sourcedirectory=src
+
+And here is an example of how to tell the dh_auto_* commands to build
+in a subdirectory, which will be removed on clean.
+
+ #!/usr/bin/make -f
+ %:
+ dh $@ --builddirectory=build
+
+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
# (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},
- "after=s" => \$dh{AFTER},
- "before=s" => \$dh{BEFORE},
- "remaining" => \$dh{REMAINING},
- "with=s" => sub {
- my ($option,$value)=@_;
- push @{$dh{WITH}},split(",", $value);
- },
- "without=s" => sub {
- my ($option,$value)=@_;
- @{$dh{WITH}} = grep { $_ ne $value } @{$dh{WITH}};
+ "until=s" => \$dh{UNTIL},
+ "after=s" => \$dh{AFTER},
+ "before=s" => \$dh{BEFORE},
+ "remaining" => \$dh{REMAINING},
+ "with=s" => sub {
+ my ($option,$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},
},
- "l" => \$dh{LIST},
- "list" => \$dh{LIST},
- "j:i" => \$dh{PARALLEL},
- "parallel:i" => \$dh{PARALLEL},
-});
+ # Disable complaints about unknown options; they are passed on the
+ # debhelper commands.
+ ignore_unknown_options => 1,
+);
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};
+
+# 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.
shift @ARGV_orig;
next;
}
- elsif ($opt =~ /^--?(no-act|remaining|(after|until|before|with|without|parallel)=)/) {
+ elsif ($opt =~ /^--?(no-act|remaining|(after|until|before|with|without)=)/) {
next;
}
- elsif ($opt =~ /^(-j|--parallel)$/) {
- # Argument to -j/--parallel is optional.
- shift @ARGV_orig if @ARGV_orig > 0 && $ARGV_orig[0] =~ /^\d+$/;
- next;
+ elsif ($opt=~/^-/) {
+ push @options, "-O".$opt;
+ }
+ elsif (@options) {
+ if ($options[$#options]=~/^-O--/) {
+ $options[$#options].="=".$opt;
+ }
+ else {
+ $options[$#options].=$opt;
+ }
}
- push @options, $opt;
}
# Figure out at what point in the sequence to start for each package.
# 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;
- if (rules_explicit_target("override_".$command)) {
+ my $has_explicit_target = rules_explicit_target("override_".$command);
+ if (defined $has_explicit_target) {
$override_command=$command;
- # This passes the options through to commands called
- # inside the target.
- $ENV{DH_INTERNAL_OPTIONS}=join("\x1e", @options);
- $command="debian/rules";
- @options="override_".$override_command;
+ # Check if target isn't noop
+ if ($has_explicit_target) {
+ # This passes the options through to commands called
+ # inside the target.
+ $ENV{DH_INTERNAL_OPTIONS}=join("\x1e", @options);
+ $command="debian/rules";
+ @options="override_".$override_command;
+ }
+ else {
+ $command = undef;
+ }
}
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 ".
- print " ".escape_shell($command, @options)."\n";
+ if (defined $command) {
+ # 3 space indent lines the command being run up under the
+ # sequence name after "dh ".
+ print " ".escape_shell($command, @options)."\n";
+ }
+ else {
+ print " ", "# Skipping ", $override_command, " - empty override", "\n";
+ }
if (! $dh{NO_ACT}) {
- my $ret=system($command, @options);
- if ($ret >> 8 != 0) {
- exit $ret >> 8;
- }
- elsif ($ret) {
- exit 1;
+ if (defined $command) {
+ my $ret=system($command, @options);
+ if ($ret >> 8 != 0) {
+ exit $ret >> 8;
+ }
+ elsif ($ret) {
+ exit 1;
+ }
}
if (defined $override_command) {
sub rules_explicit_target {
# Checks if a specified target exists as an explicit target
- # in debian/rules.
+ # in debian/rules.
+ # undef is returned if target does not exist, 0 if target is noop
+ # and 1 if target has dependencies or executes commands.
my $target=shift;
-
- if (! $rules_parsed) {
+
+ if (! $rules_parsed) {
my $processing_targets = 0;
my $not_a_target = 0;
+ my $current_target;
open(MAKE, "LC_ALL=C make -Rrnpsf debian/rules debhelper-fail-me 2>/dev/null |");
while (<MAKE>) {
if ($processing_targets) {
$not_a_target = 1;
}
else {
- if (!$not_a_target && /^([^#:]+)::?/) {
- # Target is defined.
- # NOTE: if it is a depenency
- # of .PHONY it will be
- # defined too but that's ok.
- $targets{$1} = 1;
+ if (!$not_a_target && /^([^#:]+)::?\s*(.*)$/) {
+ # Target is defined. NOTE: if it is a depenency of
+ # .PHONY it will be defined too but that's ok.
+ # $2 contains target dependencies if any.
+ $current_target = $1;
+ $targets{$current_target} = ($2) ? 1 : 0;
+ }
+ else {
+ if (defined $current_target) {
+ if (/^#/) {
+ # Check if target has commands to execute
+ if (/^#\s*commands to execute/) {
+ $targets{$current_target} = 1;
+ }
+ }
+ else {
+ # Target parsed.
+ $current_target = undef;
+ }
+ }
}
# "Not a target:" is always followed by
# a target name, so resetting this one
# here is safe.
$not_a_target = 0;
}
- } elsif (/^# Files$/) {
+ }
+ elsif (/^# Files$/) {
$processing_targets = 1;
}
}
$rules_parsed = 1;
}
- return exists $targets{$target};
+ return $targets{$target};
}
}