Wed Aug 17 18:45:16 2022 UTC ()
lintpkgsrc: cleanup: untangle parsing of .include directives


(rillig)
diff -r1.115 -r1.116 pkgsrc/pkgtools/lintpkgsrc/files/lintpkgsrc.pl

cvs diff -r1.115 -r1.116 pkgsrc/pkgtools/lintpkgsrc/files/lintpkgsrc.pl (expand / switch to unified diff)

--- pkgsrc/pkgtools/lintpkgsrc/files/lintpkgsrc.pl 2022/08/17 18:36:10 1.115
+++ pkgsrc/pkgtools/lintpkgsrc/files/lintpkgsrc.pl 2022/08/17 18:45:16 1.116
@@ -1,15 +1,15 @@ @@ -1,15 +1,15 @@
1#!@PERL5@ 1#!@PERL5@
2# $NetBSD: lintpkgsrc.pl,v 1.115 2022/08/17 18:36:10 rillig Exp $ 2# $NetBSD: lintpkgsrc.pl,v 1.116 2022/08/17 18:45:16 rillig Exp $
3 3
4# Written by David Brownlee <abs@netbsd.org>. 4# Written by David Brownlee <abs@netbsd.org>.
5# 5#
6# Caveats: 6# Caveats:
7# The 'Makefile parsing' algorithm used to obtain package versions and 7# The 'Makefile parsing' algorithm used to obtain package versions and
8# DEPENDS information is geared towards speed rather than perfection, 8# DEPENDS information is geared towards speed rather than perfection,
9# though it has gotten somewhat better over time, it only parses the 9# though it has gotten somewhat better over time, it only parses the
10# simpler Makefile conditionals. 10# simpler Makefile conditionals.
11# 11#
12# TODO: Handle fun DEPENDS like avifile-devel with 12# TODO: Handle fun DEPENDS like avifile-devel with
13# {qt2-designer>=2.2.4,qt2-designer-kde>=2.3.1nb1} 13# {qt2-designer>=2.2.4,qt2-designer-kde>=2.3.1nb1}
14 14
15use v5.36; 15use v5.36;
@@ -441,37 +441,38 @@ sub parse_makefile_line_include($file, $ @@ -441,37 +441,38 @@ sub parse_makefile_line_include($file, $
441 return; 441 return;
442 } 442 }
443 443
444 $incfile = realpath($1) . $2; 444 $incfile = realpath($1) . $2;
445 return if $included->{$incfile}; 445 return if $included->{$incfile};
446 446
447 $opt{L} and print "inc $incfile\n"; 447 $opt{L} and print "inc $incfile\n";
448 $included->{$incfile} = 1; 448 $included->{$incfile} = 1;
449 449
450 if (!open(FILE, $incfile)) { 450 if (!open(FILE, $incfile)) {
451 verbose("Cannot open '$incfile' (from $file): $_ $!\n"); 451 verbose("Cannot open '$incfile' (from $file): $_ $!\n");
452 return; 452 return;
453 } 453 }
454 
455 # FIXME: .CURDIR doesn't change, but .PARSEDIR does. 
456 my $NEWCURDIR = $incfile; 
457 $NEWCURDIR =~ s#/[^/]*$##; 
458 push @$incdirs, $NEWCURDIR 
459 unless grep { $_ eq $NEWCURDIR } @$incdirs; 
460 unshift @$lines, ".CURDIR=" . $vars->{'.CURDIR'}; 
461 chomp(my @inc_lines = <FILE>); 454 chomp(my @inc_lines = <FILE>);
462 unshift @$lines, @inc_lines; 
463 unshift @$lines, ".CURDIR=$NEWCURDIR"; 
464 close(FILE); 455 close(FILE);
 456
 457 my $new_curdir = dirname $incfile;
 458 push @$incdirs, $new_curdir
 459 unless grep { $_ eq $new_curdir } @$incdirs;
 460
 461 # FIXME: .CURDIR doesn't change, but .PARSEDIR does.
 462 unshift @$lines,
 463 ".CURDIR=$new_curdir",
 464 @inc_lines,
 465 ".CURDIR=" . $vars->{'.CURDIR'};
465} 466}
466 467
467sub parse_makefile_line_var($varname, $op, $value, $vars) { 468sub parse_makefile_line_var($varname, $op, $value, $vars) {
468 if ($op eq ':=') { 469 if ($op eq ':=') {
469 $vars->{$varname} = expand_exprs($value, $vars); 470 $vars->{$varname} = expand_exprs($value, $vars);
470 } elsif ($op eq '+=' && defined $vars->{$varname}) { 471 } elsif ($op eq '+=' && defined $vars->{$varname}) {
471 $vars->{$varname} .= " $value"; 472 $vars->{$varname} .= " $value";
472 } elsif ($op eq '?=' && defined $vars->{$varname}) { 473 } elsif ($op eq '?=' && defined $vars->{$varname}) {
473 # Do nothing. 474 # Do nothing.
474 } else { 475 } else {
475 $vars->{$varname} = $value; 476 $vars->{$varname} = $value;
476 } 477 }
477 debug($op eq '=' 478 debug($op eq '='
@@ -660,42 +661,44 @@ sub parse_makefile_vars($file, $cwd = un @@ -660,42 +661,44 @@ sub parse_makefile_vars($file, $cwd = un
660 661
661 if ($opt{D}) { 662 if ($opt{D}) {
662 print "Before expansion:\n"; 663 print "Before expansion:\n";
663 foreach my $varname (sort keys %vars) { 664 foreach my $varname (sort keys %vars) {
664 print "\t$varname = $vars{$varname}\n"; 665 print "\t$varname = $vars{$varname}\n";
665 } 666 }
666 } 667 }
667 debug("$file: expand"); 668 debug("$file: expand");
668 669
669 # Handle variable substitutions FRED = a-${JIM:S/-/-b-/} 670 # Handle variable substitutions FRED = a-${JIM:S/-/-b-/}
670 671
671 for (my $loop = 1; $loop != 0;) { 672 for (my $loop = 1; $loop != 0;) {
672 $loop = 0; 673 $loop = 0;
673 foreach my $key (keys %vars) { 674 foreach my $varname (keys %vars) {
674 next if index($vars{$key}, '$') == -1; 675 next if index($vars{$varname}, '$') == -1;
675 676
676 $_ = expand_exprs($vars{$key}, \%vars); 677 $_ = expand_exprs($vars{$varname}, \%vars);
677 if ($_ ne $vars{$key}) { 678 if ($_ ne $vars{$varname}) {
678 $vars{$key} = $_; 679 $vars{$varname} = $_;
679 $loop = 1; 680 $loop = 1;
680 681
681 } elsif ($vars{$key} =~ m#\$\{([\w.]+):([CS]([^{}])[^{}\3]+\3[^{}\3]*\3[g1]*(|:[^{}]+)|U[^{}]+)\}#) { 682 } elsif ($vars{$varname} =~ m#\$\{([\w.]+):([CS]([^{}])[^{}\3]+\3[^{}\3]*\3[g1]*(|:[^{}]+)|U[^{}]+)\}#) {
682 $loop ||= expand_modifiers($file, $key, $`, $1, $2, $', \%vars); 683 $loop ||= expand_modifiers($file, $varname, $`, $1, $2, $', \%vars);
683 } 684 }
684 } 685 }
685 } 686 }
686 687
687 foreach my $key (keys %vars) { 688 foreach my $varname (keys %vars) {
688 $vars{$key} =~ s/$magic_undefined//; 689 # XXX: Removing only the first magic string is strange; either
 690 # all of them or none of them should be removed.
 691 $vars{$varname} =~ s/$magic_undefined//;
689 } 692 }
690 \%vars; 693 \%vars;
691} 694}
692 695
693sub get_default_makefile_vars() { 696sub get_default_makefile_vars() {
694 697
695 chomp($_ = `uname -srm`); 698 chomp($_ = `uname -srm`);
696 ( 699 (
697 $default_vars->{OPSYS}, 700 $default_vars->{OPSYS},
698 $default_vars->{OS_VERSION}, 701 $default_vars->{OS_VERSION},
699 $default_vars->{MACHINE} 702 $default_vars->{MACHINE}
700 ) = split; 703 ) = split;
701 $default_vars->{MACHINE} 704 $default_vars->{MACHINE}