]> git.donarmstrong.com Git - debhelper.git/commitdiff
Smart debian/rules parser for dh.
authorModestas Vainius <modestas@vainius.eu>
Mon, 16 Feb 2009 22:56:04 +0000 (00:56 +0200)
committerJoey Hess <joey@gnu.kitenet.net>
Tue, 17 Feb 2009 05:47:01 +0000 (00:47 -0500)
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>
dh

diff --git a/dh b/dh
index 4191d0be8e217f4dc0af737e8896fbc186721ae2..25ca87de0406754241ea2e7d707a72cc9355e572 100755 (executable)
--- 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};