%:
dh $@ --with quilt
+In order to override standard build flags, export appropriate environment
+variables as documented in the L<dpkg-buildflags(1)> manual page. They will be
+preferred over directly exported their counterparts (CFLAGS, CXXFLAGS, LDFLAGS
+etc.). For example, to append -Wall to the standard CFLAGS and CXXFLAGS, use:
+
+ #!/usr/bin/make -f
+ export DEB_CFLAGS_APPEND = -Wall
+ export DEB_CXXFLAGS_APPEND = -Wall
+
+ %:
+ dh $@
+
Here is an example of overriding where the B<dh_auto_>I<*> commands find
the package's source, for a package where the source is located in a
subdirectory.
Note that in the example above, dh will arrange for "debian/rules build"
to call your build-indep and build-arch targets. You do not need to
-explicitly define the dependencies in the rules file when using dh.
+explicitly define the dependencies in the rules file when using dh with
+compatability level v9. This example would be more complicated with
+earlier compatability levels.
=head1 INTERNALS
A sequence can also run dependent targets in debian/rules. For
example, the "binary" sequence runs the "install" target.
+B<dh> sets environment variables listed by B<dpkg-buildflags>, unless
+they are already set. It supports DEB_BUILD_OPTIONS=noopt too.
+
B<dh> uses the B<DH_INTERNAL_OPTIONS> environment variable to pass information
through to debhelper commands that are run inside override targets. The
contents (and indeed, existence) of this environment variable, as the name
bundling => 0,
);
inhibit_log();
-
+set_buildflags();
# If make is using a jobserver, but it is not available
# to this process, clean out MAKEFLAGS. This avoids
clean_jobserver_makeflags();
}
+# Process the sequence parameter.
+my $sequence;
+if (! compat(7)) {
+ # From v8, the sequence is the very first parameter.
+ $sequence=shift @ARGV_orig;
+ if ($sequence=~/^-/) {
+ error "Unknown sequence $sequence (options should not come before the sequence)";
+ }
+}
+else {
+ # Before v8, the sequence could be at any position in the parameters,
+ # so was what was left after parsing.
+ $sequence=shift;
+ if (defined $sequence) {
+ @ARGV_orig=grep { $_ ne $sequence } @ARGV_orig;
+ }
+}
+if (! defined $sequence) {
+ error "specify a sequence to run";
+}
+# make -B causes the rules file to be run as a target.
+# Also support completly empty override targets.
+# Note: it's not safe to use rules_explicit_target before this check,
+# since it causes dh to be run.
+my $dummy_target="debhelper-fail-me";
+if ($sequence eq 'debian/rules' ||
+ $sequence =~ /^override_dh_/ ||
+ $sequence eq $dummy_target) {
+ exit 0;
+}
+
+
# Definitions of sequences.
my %sequences;
my @bd_minimal = qw{
dh_auto_configure
dh_auto_build
dh_auto_test
- };
-# rules:build-arch and rules:build-indep are not called by build,
-# as an optimisation (code below will adjust this if explicit targets exist).
-$sequences{build} = [@bd];
-$sequences{'build-indep'} = [@bd];
-$sequences{'build-arch'} = [@bd];
-$sequences{clean} = [qw{
- dh_testdir
- dh_auto_clean
- dh_clean
-}];
+};
my @i_minimal = qw{
dh_testroot
};
dh_compress
dh_fixperms
};
-# The install sequences will call rules:build before running
-# the standard sequence. rules:install-arch and rules:install-indep
-# are not called by install, as an optimisation (code below will adjust
-# this if explicit targets exist).
-$sequences{'install'} = ['rules:build', @i, 'rules:install-arch', 'rules:install-indep'];
-$sequences{'install-indep'} = ['rules:build-indep', @i];
-$sequences{'install-arch'} = ['rules:build-arch', @i];
my @ba=qw{
dh_strip
dh_makeshlibs
dh_md5sums
dh_builddeb
};
-# The binary sequences will call 'debian/rules install' before running
-# the standard sequence.
-$sequences{binary} = ['rules:install', 'rules:binary-arch', 'rules:binary-indep'];
-$sequences{'binary-indep'} = ['rules:install-indep', @b];
-$sequences{'binary-arch'} = ['rules:install-arch', @ba, @b];
+$sequences{clean} = [qw{
+ dh_testdir
+ dh_auto_clean
+ dh_clean
+}];
+$sequences{'build-indep'} = [@bd];
+$sequences{'build-arch'} = [@bd];
+if (! compat(8)) {
+ # From v9, sequences take standard rules targets into account.
+ if (rules_explicit_target('build-arch') ||
+ rules_explicit_target('build-indep')) {
+ # run sequences separately
+ $sequences{build} = [@bd_minimal, rules("build-arch"), rules("build-indep")];
+ }
+ else {
+ # run standard sequence (this is faster)
+ $sequences{build} = [@bd];
+ }
+ $sequences{'install-indep'} = [rules("build-indep"), @i];
+ $sequences{'install-arch'} = [rules("build-arch"), @i];
+ if (rules_explicit_target('install-arch') ||
+ rules_explicit_target('install-indep')) {
+ # run sequences separately
+ $sequences{'install'} = [rules("build"), @i_minimal, rules("install-arch"), rules("install-indep")];
+ }
+ else {
+ # run standard sequence (this is faster)
+ $sequences{'install'} = [rules("build"), @i, rules("install-arch"), rules("install-indep")];
+ }
+ $sequences{'binary-indep'} = [rules("install-indep"), @b];
+ $sequences{'binary-arch'} = [rules("install-arch"), @ba, @b];
+ $sequences{binary} = [rules("install"), rules("binary-arch"), rules("binary-indep")];
+}
+else {
+ $sequences{build} = [@bd];
+ $sequences{'install'} = [@{$sequences{build}}, @i];
+ $sequences{'install-indep'} = [@{$sequences{'build-indep'}}, @i];
+ $sequences{'install-arch'} = [@{$sequences{'build-arch'}}, @i];
+ $sequences{binary} = [@{$sequences{install}}, @ba, @b];
+ $sequences{'binary-indep'} = [@{$sequences{'install-indep'}}, @b];
+ $sequences{'binary-arch'} = [@{$sequences{'install-arch'}}, @ba, @b];
+}
# Additional command options
my %command_opts;
exit 0;
}
+# Load addons, which can modify sequences.
foreach my $addon (@{$dh{WITH}}) {
my $mod="Debian::Debhelper::Sequence::$addon";
$mod=~s/-/_/g;
}
}
-my $sequence;
-if (! compat(7)) {
- # From v8, the sequence is the very first parameter.
- $sequence=shift @ARGV_orig;
- if ($sequence=~/^-/) {
- error "Unknown sequence $sequence (options should not come before the sequence)";
- }
-}
-else {
- # Before v8, the sequence could be at any position in the parameters,
- # so was what was left after parsing.
- $sequence=shift;
- if (defined $sequence) {
- @ARGV_orig=grep { $_ ne $sequence } @ARGV_orig;
- }
-}
-if (! defined $sequence) {
- error "specify a sequence to run";
-}
-# make -B causes the rules file to be run as a target.
-# Also support completly empty override targets.
-# Note: it's not safe to use rules_explicit_target before this check.
-if ($sequence eq 'debian/rules' ||
- $sequence =~ /^override_dh_/) {
- exit 0;
-}
-elsif (! exists $sequences{$sequence}) {
+if (! exists $sequences{$sequence}) {
error "Unknown sequence $sequence (choose from: ".
join(" ", sort keys %sequences).")";
}
-
-# If debian/rules defines build-arch or build-indep, run sequences separately.
-if (rules_explicit_target('build-arch') ||
- rules_explicit_target('build-indep')) {
- $sequences{build} = [@bd_minimal, 'rules:build-arch', 'rules:build-indep'];
-}
-# If debian/rules defines install-arch or install-indep, run sequences
-# separately.
-if (rules_explicit_target('install-arch') ||
- rules_explicit_target('install-indep')) {
- $sequences{'install'} = ['rules:build', @i_minimal, 'rules:install-arch', 'rules:install-indep'];
-}
-
-my @sequence=@{$sequences{$sequence}};
+my @sequence=optimize_sequence(@{$sequences{$sequence}});
# The list of all packages that can be acted on.
my @packages=@{$dh{DOPACKAGES}};
# to prevent them from being acted on.
push @options, map { "-N$_" } @exclude;
- # If the command has a rules: prefix, run debian/rules with
- # the remainder as the target.
- my $rules_target = undef;
- if ($command =~ /^rules:(.*)/) {
- $rules_target = $1;
- }
-
# Check for override targets in debian/rules and
# run them instead of running the command directly.
my $override_command;
my $has_explicit_target = rules_explicit_target("override_".$command);
+ my $rules_target = rules_target($command);
if (defined $rules_target) {
# Don't pass DH_ environment variables, since this is
# a fresh invocation of debian/rules and any sub-dh
}
}
+sub optimize_sequence {
+ my @sequence;
+ my %seen;
+ my $add=sub {
+ # commands can appear multiple times when sequences are
+ # inlined together; only the first should be needed
+ my $command=shift;
+ if (! $seen{$command}) {
+ $seen{$command}=1;
+ push @sequence, $command;
+ }
+ };
+ foreach my $command (@_) {
+ my $rules_target=rules_target($command);
+ if (defined $rules_target &&
+ ! defined rules_explicit_target($rules_target)) {
+ # inline the sequence for this implicit target
+ $add->($_) foreach optimize_sequence(@{$sequences{$rules_target}});
+ }
+ else {
+ $add->($command);
+ }
+ }
+ return @sequence;
+}
+
+sub rules_target {
+ my $command=shift;
+ if ($command =~ /^debian\/rules\s+(.*)/) {
+ return $1
+ }
+ else {
+ return undef;
+ }
+}
+
+sub rules {
+ return "debian/rules ".join(" ", @_);
+}
+
{
my %targets;
my $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 |");
+ open(MAKE, "LC_ALL=C make -Rrnpsf debian/rules $dummy_target 2>/dev/null |");
while (<MAKE>) {
if ($processing_targets) {
if (/^# Not a target:/) {