diff options
author | Modestas Vainius <modestas@vainius.eu> | 2009-02-17 00:56:04 +0200 |
---|---|---|
committer | Joey Hess <joey@gnu.kitenet.net> | 2009-02-27 15:11:43 -0500 |
commit | 7aa4f2005122d3255305229374f61fed7ff228dd (patch) | |
tree | f9c1ca90a765984f4282872b4a3aeaea5d843170 /dh | |
parent | e3367a17054a70074c4a225e6073d3743959d05d (diff) |
Smart debian/rules parser for dh.
This parser is based on the output which make -p emits. It's a bit
more slower due to the need to run make itself but it is not dumb.
Signed-off-by: Modestas Vainius <modestas@vainius.eu>
(cherry picked from commit 3d774a91dd355f8236c63bd81fc4dfe5fa88219d)
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}; |