From 3d774a91dd355f8236c63bd81fc4dfe5fa88219d Mon Sep 17 00:00:00 2001 From: Modestas Vainius Date: Tue, 17 Feb 2009 00:56:04 +0200 Subject: [PATCH] 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 --- dh | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/dh b/dh index 4191d0b..25ca87d 100755 --- a/dh +++ b/dh @@ -503,17 +503,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, ") { - if (/^([a-zA-Z_]+):/) { - $targets{$1}=1; + open(MAKE, "make -Rrnpsf debian/rules debhelper-fail-me 2>/dev/null |"); + while () { + 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}; -- 2.39.2