| @@ -1,15 +1,15 @@ | | | @@ -1,15 +1,15 @@ |
1 | #!@PERL5@ | | 1 | #!@PERL5@ |
2 | # $NetBSD: lintpkgsrc.pl,v 1.126 2022/08/19 05:06:26 rillig Exp $ | | 2 | # $NetBSD: lintpkgsrc.pl,v 1.127 2022/08/19 05:20:27 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; |
| @@ -941,63 +941,67 @@ sub package_globmatch($pkgmatch) { | | | @@ -941,63 +941,67 @@ sub package_globmatch($pkgmatch) { |
941 | $matchver = undef; | | 941 | $matchver = undef; |
942 | last; | | 942 | last; |
943 | } | | 943 | } |
944 | } | | 944 | } |
945 | } | | 945 | } |
946 | | | 946 | |
947 | ($matchpkgname, $matchver); | | 947 | ($matchpkgname, $matchver); |
948 | | | 948 | |
949 | } else { | | 949 | } else { |
950 | ($pkgmatch, 'missing'); | | 950 | ($pkgmatch, 'missing'); |
951 | } | | 951 | } |
952 | } | | 952 | } |
953 | | | 953 | |
| | | 954 | sub make_show_vars($pkgdir) { |
| | | 955 | debug("Running '$conf_make' in '$pkgdir'"); |
| | | 956 | my $pid = open3(\*WTR, \*RDR, \*ERR, |
| | | 957 | "cd $pkgdir || exit 1; $conf_make show-vars VARNAMES=PKGNAME"); |
| | | 958 | if (!$pid) { |
| | | 959 | warn "$pkgdir: Unable to run make: $!"; |
| | | 960 | } else { |
| | | 961 | close(WTR) or die; |
| | | 962 | my @errors = <ERR>; |
| | | 963 | close(ERR) or die; |
| | | 964 | my $makepkgname = <RDR>; |
| | | 965 | close(RDR) or die; |
| | | 966 | wait; |
| | | 967 | chomp @errors; |
| | | 968 | if (@errors) { warn "\n$pkgdir: @errors\n"; } |
| | | 969 | |
| | | 970 | if ($makepkgname =~ /(.*)-(\d.*)/) { |
| | | 971 | return $makepkgname; |
| | | 972 | } |
| | | 973 | } |
| | | 974 | |
| | | 975 | undef; |
| | | 976 | } |
| | | 977 | |
954 | # Parse a pkgsrc package makefile and return the pkgname and set variables | | 978 | # Parse a pkgsrc package makefile and return the pkgname and set variables |
955 | # | | 979 | # |
956 | sub parse_makefile_pkgsrc($file) { | | 980 | sub parse_makefile_pkgsrc($file) { |
957 | my $vars = parse_makefile_vars($file, undef); | | 981 | my $vars = parse_makefile_vars($file, undef); |
958 | defined $vars or return undef; # Missing Makefile. | | 982 | defined $vars or return undef; # Missing Makefile. |
959 | | | 983 | |
960 | my $pkgname = $vars->{PKGNAME}; | | 984 | my $pkgname = $vars->{PKGNAME}; |
961 | my $distname = $vars->{DISTNAME}; | | 985 | my $distname = $vars->{DISTNAME}; |
962 | | | 986 | |
963 | debug("$file: PKGNAME=$pkgname") if defined $pkgname; | | 987 | debug("$file: PKGNAME=$pkgname") if defined $pkgname; |
964 | debug("$file: DISTNAME=$distname") if defined $distname; | | 988 | debug("$file: DISTNAME=$distname") if defined $distname; |
965 | | | 989 | |
966 | $pkgname = $distname unless defined $pkgname; | | 990 | $pkgname = $distname unless defined $pkgname; |
967 | | | 991 | |
968 | if (!defined $pkgname || $pkgname =~ /\$/ || $pkgname !~ /(.*)-(\d.*)/) { | | 992 | if (!defined $pkgname || $pkgname =~ /\$/ || $pkgname !~ /(.*)-(\d.*)/) { |
969 | | | 993 | my $makepkgname = make_show_vars(dirname $file); |
970 | # invoke make here as a last resort | | 994 | $pkgname = $makepkgname if defined $makepkgname; |
971 | my $pkgdir = dirname $file; | | | |
972 | debug("Running '$conf_make' in '$pkgdir'"); | | | |
973 | my $pid = open3(\*WTR, \*RDR, \*ERR, | | | |
974 | "cd $pkgdir || exit 1; $conf_make show-vars VARNAMES=PKGNAME"); | | | |
975 | if (!$pid) { | | | |
976 | warn "$file: Unable to run make: $!"; | | | |
977 | } else { | | | |
978 | close(WTR) or die; | | | |
979 | my @errors = <ERR>; | | | |
980 | close(ERR) or die; | | | |
981 | my $makepkgname = <RDR>; | | | |
982 | close(RDR) or die; | | | |
983 | wait; | | | |
984 | chomp @errors; | | | |
985 | if (@errors) { warn "\n$file: @errors\n"; } | | | |
986 | | | | |
987 | if ($makepkgname =~ /(.*)-(\d.*)/) { | | | |
988 | $pkgname = $makepkgname; | | | |
989 | } | | | |
990 | } | | | |
991 | } | | 995 | } |
992 | | | 996 | |
993 | defined $pkgname or return (); | | 997 | defined $pkgname or return (); |
994 | | | 998 | |
995 | $pkgname = canonicalize_pkgname($pkgname); | | 999 | $pkgname = canonicalize_pkgname($pkgname); |
996 | | | 1000 | |
997 | my $pkgrevision = $vars->{PKGREVISION}; | | 1001 | my $pkgrevision = $vars->{PKGREVISION}; |
998 | if (defined $pkgrevision && $pkgrevision !~ /^\s*$/) { | | 1002 | if (defined $pkgrevision && $pkgrevision !~ /^\s*$/) { |
999 | if ($pkgrevision =~ /^\$\{ (?: | | 1003 | if ($pkgrevision =~ /^\$\{ (?: |
1000 | _CVS_PKGVERSION | | | 1004 | _CVS_PKGVERSION | |
1001 | _GIT_PKGVERSION | | | 1005 | _GIT_PKGVERSION | |
1002 | _HG_PKGVERSION_CMD | | | 1006 | _HG_PKGVERSION_CMD | |
1003 | _SVN_PKGREVISION_CMD) :.* \}$ /x) { | | 1007 | _SVN_PKGREVISION_CMD) :.* \}$ /x) { |