diff options
-rw-r--r-- | debhelper.pod | 7 | ||||
-rw-r--r-- | debian/changelog | 5 | ||||
-rwxr-xr-x | dh | 200 |
3 files changed, 161 insertions, 51 deletions
diff --git a/debhelper.pod b/debhelper.pod index d61cc84..d54bf4e 100644 --- a/debhelper.pod +++ b/debhelper.pod @@ -552,7 +552,12 @@ ${misc:Pre-Depends} =item - -B<dh_auto_configure> does not include the source package name +dh supports use of standard targets in debian/rules without needing +to manually define the dependencies between targets there. + +=item - + +<dh_auto_configure> does not include the source package name in --libexecdir when using autoconf. =back diff --git a/debian/changelog b/debian/changelog index 35692da..d22e50e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,11 @@ debhelper (8.1.7) UNRELEASED; urgency=low * Fix example. Closes: #627534 * Fix error message. Closes: #628053 * dh_movefiles: Optimise use of xargs. Closes: #627737 + * dh: In v9, any standard rules file targets, including build-arch, + build-indep, build, install, etc, can be defined in debian/rules + without needing to explicitly tell make the dependencies between + the targets. Closes: #629139 + (Thanks, Roger Leigh) * dh_auto_configure: In v9, does not include the source package name in --libexecdir when using autoconf. Closes: #541458 @@ -240,9 +240,9 @@ L<dh_listpackages(1)> to test what is being built. For example: endif Finally, remember that you are not limited to using override targets in the -rules file when using B<dh>. You can also explicitly define the regular +rules file when using B<dh>. You can also explicitly define any of the regular rules file targets when it makes sense to do so. A common reason to do this -is if your package needs different B<build-arch> and B<build-indep> targets. +is when your package needs different B<build-arch> and B<build-indep> targets. For example, a package with a long document build process can put it in B<build-indep>. @@ -250,15 +250,17 @@ B<build-indep>. %: dh $@ - binary: binary-arch binary-indep ; - binary-arch:: build-arch - binary-indep:: build-indep - build: build-arch build-indep ; build-indep: $(MAKE) docs build-arch: $(MAKE) bins +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 with +compatability level v9. This example would be more complicated with +earlier compatability levels. + =head1 INTERNALS If you're curious about B<dh>'s internals, here's how it works under the hood. @@ -273,6 +275,9 @@ that is in the specified sequence. It then continues with the next command in the sequence. The B<--until>, B<--before>, B<--after>, and B<--remaining> options can override this behavior. +A sequence can also run dependent targets in debian/rules. For +example, the "binary" sequence runs the "install" target. + 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 @@ -319,21 +324,52 @@ if (is_make_jobserver_unavailable()) { 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; -$sequences{build} = [qw{ +my @bd_minimal = qw{ + dh_testdir +}; +my @bd = qw{ dh_testdir dh_auto_configure dh_auto_build dh_auto_test -}], -$sequences{'build-indep'} = [@{$sequences{build}}]; -$sequences{'build-arch'} = [@{$sequences{build}}]; -$sequences{clean} = [qw{ - dh_testdir - dh_auto_clean - dh_clean -}]; +}; +my @i_minimal = qw{ + dh_testroot +}; my @i = qw{ dh_testroot dh_prep @@ -376,9 +412,6 @@ my @i = qw{ dh_compress dh_fixperms }; -$sequences{'install'} = [@{$sequences{build}}, @i]; -$sequences{'install-indep'} = [@{$sequences{'build-indep'}}, @i]; -$sequences{'install-arch'} = [@{$sequences{'build-arch'}}, @i]; my @ba=qw{ dh_strip dh_makeshlibs @@ -390,9 +423,48 @@ my @b=qw{ dh_md5sums dh_builddeb }; -$sequences{binary} = [@{$sequences{install}}, @ba, @b]; -$sequences{'binary-indep'} = [@{$sequences{'install-indep'}}, @b]; -$sequences{'binary-arch'} = [@{$sequences{'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; @@ -481,6 +553,7 @@ sub list_addons { exit 0; } +# Load addons, which can modify sequences. foreach my $addon (@{$dh{WITH}}) { my $mod="Debian::Debhelper::Sequence::$addon"; $mod=~s/-/_/g; @@ -490,36 +563,11 @@ foreach my $addon (@{$dh{WITH}}) { } } -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"; -} -if ($sequence eq 'debian/rules' || - $sequence =~ /^override_dh_/) { - # make -B causes the rules file to be run as a target. - # Also support completly empty override targets. - exit 0; -} -elsif (! exists $sequences{$sequence}) { +if (! exists $sequences{$sequence}) { error "Unknown sequence $sequence (choose from: ". join(" ", sort keys %sequences).")"; } -my @sequence=@{$sequences{$sequence}}; +my @sequence=optimize_sequence(@{$sequences{$sequence}}); # The list of all packages that can be acted on. my @packages=@{$dh{DOPACKAGES}}; @@ -645,7 +693,19 @@ sub run { # run them instead of running the command directly. my $override_command; my $has_explicit_target = rules_explicit_target("override_".$command); - if (defined $has_explicit_target) { + + 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 + # commands. + $override_command=$command; + delete $ENV{DH_INTERNAL_OPTIONS}; + delete $ENV{DH_INTERNAL_OVERRIDE}; + $command="debian/rules"; + @options=$rules_target; + } + elsif (defined $has_explicit_target) { $override_command=$command; # Check if target isn't noop if ($has_explicit_target) { @@ -704,6 +764,46 @@ sub run { } } +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; @@ -719,7 +819,7 @@ sub rules_explicit_target { 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:/) { |