summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorModestas Vainius <modestas@vainius.eu>2009-02-17 00:56:04 +0200
committerJoey Hess <joey@gnu.kitenet.net>2009-02-17 00:47:01 -0500
commit3d774a91dd355f8236c63bd81fc4dfe5fa88219d (patch)
treec024c5980e6c350f5c940e897e4ea3f6a0ed498e
parent0f3f59fe6058edfda4010dc88bd3b8aa3ae70a6d (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>
-rwxr-xr-xdh28
1 files changed, 22 insertions, 6 deletions
diff --git a/dh b/dh
index 4191d0be..25ca87de 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, "<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};