Improve meson's detection of perl build flags

The current method of detecting perl build flags breaks if the path to
perl contains a space. This change makes two improvements. First,
instead of getting a list of ldflags and ccdlflags and then trying to
filter those out of the reported ldopts, we tell perl to suppress
reporting those in the first instance. Second, it tells perl to parse
those and output them, one per line. Thus any space on the option in a
file name, for example, is preserved.

Issue reported off-list by Muralikrishna Bandaru

Discussion: https://postgr.es/01117f88-f465-bf6c-9362-083bd72ca305@dunslane.net

Backpatch to release 16.
This commit is contained in:
Andrew Dunstan 2024-09-14 10:26:25 -04:00
parent bc46104fc9
commit 76f2a0e547
1 changed files with 12 additions and 13 deletions

View File

@ -1072,20 +1072,19 @@ if not perlopt.disabled()
# Config's ccdlflags and ldflags. (Those are the choices of those who # Config's ccdlflags and ldflags. (Those are the choices of those who
# built the Perl installation, which are not necessarily appropriate # built the Perl installation, which are not necessarily appropriate
# for building PostgreSQL.) # for building PostgreSQL.)
ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip() perl_ldopts = run_command(perl, '-e', '''
undesired = run_command(perl_conf_cmd, 'ccdlflags', check: true).stdout().split() use ExtUtils::Embed;
undesired += run_command(perl_conf_cmd, 'ldflags', check: true).stdout().split() use Text::ParseWords;
# tell perl to suppress including these in ldopts
*ExtUtils::Embed::_ldflags =*ExtUtils::Embed::_ccdlflags = sub { return ""; };
# adding an argument to ldopts makes it return a value instead of printing
# print one of these per line so splitting will preserve spaces in file names.
# shellwords eats backslashes, so we need to escape them.
(my $opts = ldopts(undef)) =~ s!\\!\\\\!g;
print "$_\n" foreach shellwords($opts);
''',
check: true).stdout().strip().split('\n')
perl_ldopts = []
foreach ldopt : ldopts.split(' ')
if ldopt == '' or ldopt in undesired
continue
endif
perl_ldopts += ldopt.strip('"')
endforeach
message('LDFLAGS recommended by perl: "@0@"'.format(ldopts))
message('LDFLAGS for embedding perl: "@0@"'.format(' '.join(perl_ldopts))) message('LDFLAGS for embedding perl: "@0@"'.format(' '.join(perl_ldopts)))
perl_dep_int = declare_dependency( perl_dep_int = declare_dependency(