summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdh28
1 files changed, 22 insertions, 6 deletions
diff --git a/dh b/dh
index d0165c99..e3a5943e 100755
--- a/dh
+++ b/dh
@@ -494,17 +494,33 @@ my $rules_parsed;
sub rules_explicit_target {
# Checks if a specified target exists as an explicit target
# in debian/rules.
- # Currently this is accomplished via a stupid makefile parser.
my $target=shift;
+ my $processing_targets = 0;
+ my $not_a_target = 0;
if (! $rules_parsed) {
- open(IN, "<debian/rules") || warning("dh cannot read debian/rules: $!");
- while (<IN>) {
- if (/^([a-zA-Z_]+):/) {
- $targets{$1}=1;
+ open(MAKE, "make -Rrnpsf debian/rules debhelper-fail-me 2>/dev/null |");
+ while (<MAKE>) {
+ if ($processing_targets) {
+ if (/^# Not a target:/) {
+ $not_a_target = 1;
+ } else {
+ if (!$not_a_target && /^([^#:]+)::?/ && !exists $targets{$1}) {
+ # Target is defined.
+ # NOTE: if it is a depenency of .PHONY it will be
+ # defined too but that's ok.
+ $targets{$1} = 1;
+ }
+ # "Not a target:" is always followed by a target name,
+ # so resetting this one here is safe.
+ $not_a_target = 0;
+ }
+ } elsif (/^# Files$/) {
+ $processing_targets = 1;
}
}
- close IN;
+ close MAKE;
+ $rules_parsed = 1;
}
return exists $targets{$target};