diff options
Diffstat (limited to 'dh')
-rwxr-xr-x | dh | 28 |
1 files changed, 22 insertions, 6 deletions
@@ -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}; |