| @@ -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 | |
15 | use v5.36; | | 15 | use 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 | |
467 | sub parse_makefile_line_var($varname, $op, $value, $vars) { | | 468 | sub 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 | |
693 | sub get_default_makefile_vars() { | | 696 | sub 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} |