Not to pkgconf levels, but still way faster than what we had Updated patch from what I've shown to people, turns out the second grep wasn't quite working.
This does cache the set_variables_from_env shennanigans, speeding up large processing of recursive files by a large factor (since we keep a cache of relevant env variables, and don't bother setting the same value twice) The optimisation in PkgConfig.pm is sligtly less powerful: we got a marker for variable expansions straight up when we parse a pkgconfig file, before even splitting into lists, so instead of "raw" lists, tag them as NoExpand/ToExpand classes, so that we can forego variable expansion altogether. Please test, this appears to pass regress, and I've just put this into a partial bulk. Index: pkg-config =================================================================== RCS file: /cvs/src/usr.bin/pkg-config/pkg-config,v retrieving revision 1.96 diff -u -p -r1.96 pkg-config --- pkg-config 8 Jun 2023 08:55:27 -0000 1.96 +++ pkg-config 11 Sep 2023 07:11:54 -0000 @@ -279,6 +279,25 @@ if ($mode{cflags} || $mode{libs} || $mod exit $rc; ########################################################################### +sub set_variables_from_env($file) +{ + state (%done, @l); + + if (!defined $done{$file}) { + my $pkg = $file; + + $pkg =~ s/(^.*\/)?(.*?)\.pc$/$2/g; + $pkg = uc($pkg); + if (!@l) { + @l = grep {/PKG_CONFIG_/} keys %ENV; + } + for my $k (grep {/PKG_CONFIG_${pkg}_(\w+)/} @l) { + $variables->{lc($1)} = $ENV{$k}; + } + $done{$file} = 1; + } + +} sub handle_config($p, $op, $v, $list) { @@ -300,22 +319,7 @@ sub handle_config($p, $op, $v, $list) } my $get_props = sub($property) { - my $pkg; - - # See if there's anything in the environment that we need to - # take into account. - ($pkg = $p) =~ s/(^.*\/)?(.*?)\.pc$/$2/g; - $pkg = uc($pkg); - - if (grep {/PKG_CONFIG_${pkg}.*/} keys %ENV) { - # Now that we know we have something to look for, do - # the inefficient iteration. - while (my ($k, $v) = each %ENV) { - if ($k =~ /^PKG_CONFIG_${pkg}_(\w+)/) { - $variables->{lc($1)} = $v; - } - } - } + set_variables_from_env($p); my $deps = $cfg->get_property($property, $variables); return unless defined $deps; Index: OpenBSD/PkgConfig.pm =================================================================== RCS file: /cvs/src/usr.bin/pkg-config/OpenBSD/PkgConfig.pm,v retrieving revision 1.10 diff -u -p -r1.10 PkgConfig.pm --- OpenBSD/PkgConfig.pm 8 Jun 2023 08:55:27 -0000 1.10 +++ OpenBSD/PkgConfig.pm 11 Sep 2023 07:11:54 -0000 @@ -16,6 +16,7 @@ use v5.36; + # interface to the *.pc file format of pkg-config. package OpenBSD::PkgConfig; @@ -72,10 +73,14 @@ sub add_variable($self, $name, $value) sub parse_value($self, $name, $value) { + my $class = "OpenBSD::PkgConfig::NoExpand"; + if ($value =~ m/\$\{.*\}/) { + $class = "OpenBSD::PkgConfig::ToExpand"; + } if (defined $parse->{$name}) { - return $parse->{$name}($value); + return bless $parse->{$name}($value), $class; } else { - return [split /(?<!\\)\s+/o, $value]; + return bless [split /(?<!\\)\s+/o, $value], $class; } } @@ -89,7 +94,7 @@ sub add_property($self, $name, $value) if (defined $value) { $v = $self->parse_value($name, $value); } else { - $v = []; + $v = bless [], "OpenBSD::PkgConfig::NoExpand"; } $self->{properties}{$name} = $v; } @@ -121,8 +126,9 @@ sub read_fh($class, $fh, $name = '') } } if (defined $cfg->{properties}{Libs}) { - $cfg->{properties}{Libs} = - $cfg->compress_list($cfg->{properties}{Libs}); + $cfg->{properties}{Libs} = bless + $cfg->compress_list($cfg->{properties}{Libs}), + ref($cfg->{properties}{Libs}); } return $cfg; } @@ -220,6 +226,9 @@ sub get_property($self, $k, $extra = {}) if (!defined $l) { return undef; } + if ($l->noexpand) { + return [@$l]; + } my $r = []; for my $v (@$l) { my $w = $self->expanded($v, $extra); @@ -263,4 +272,17 @@ sub add_bases($self, $extra) } } +package OpenBSD::PkgConfig::NoExpand; +our @ISA = qw(OpenBSD::PkgConfig); +sub noexpand($) +{ + 1 +} + +package OpenBSD::PkgConfig::ToExpand; +our @ISA = qw(OpenBSD::PkgConfig); +sub noexpand($) +{ + 0 +} 1;