Hi,

I took some time to look at the Meson build for Postgres. I contribute
some of the time to Meson, itself. Within this patchset you will find
pretty small changes. Most of the commits are attempting to create more
consistency with the surrounding code. I think there is more that can be
done to improve the build a bit like including subprojects for optional
dependencies like lz4, zstd, etc.

While I was reading through the code, I also noticed a few XXX/FIXMEs. I
don't mind taking a look at those in the future, but I think I need more
context for almost all of them since I am brand new to Postgres
development. Since I also have _some_ sway in the Meson community, I can
help get more attention to Meson issues that benefit Postgres. I
currently note 3 Meson issues that are commented in the code for
instance. If anyone ever has any problems or questions about Meson or
specifically the Meson build of Postgres, I am more than happy to
receive an email to see if I can help out.

Highlighting the biggest changes in this patchset:

- Add Meson overrides
- Remove Meson program options for specifying paths

Everything but the last patch could most likely be backported to
previous maintained releases including Meson, though the patchset is
initially targeting the master branch.

-- 
Tristan Partin
Neon (https://neon.tech)
From ae61706e5466b689dfbb3d7d3eafec218547204e Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Tue, 16 May 2023 07:55:03 -0500
Subject: [PATCH postgres v1 01/17] Remove triple-quoted strings

Triple-quoted strings are for multiline strings in Meson. None of the
descriptions that got changed were multiline and the entire file uses
single-line descriptions.
---
 meson_options.txt | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/meson_options.txt b/meson_options.txt
index 5b44a8829d..1ea9729dc2 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -10,19 +10,19 @@ option('blocksize', type : 'combo',
 option('wal_blocksize', type : 'combo',
   choices: ['1', '2', '4', '8', '16', '32', '64'],
   value: '8',
-  description : '''WAL block size, in kilobytes''')
+  description : 'WAL block size, in kilobytes')
 
 option('segsize', type : 'integer', value : 1,
-  description : '''Segment size, in gigabytes''')
+  description : 'Segment size, in gigabytes')
 
 option('segsize_blocks', type : 'integer', value: 0,
-  description : '''Segment size, in blocks''')
+  description : 'Segment size, in blocks')
 
 
 # Miscellaneous options
 
 option('krb_srvnam', type : 'string', value : 'postgres',
-  description : '''Default Kerberos service principal for GSSAPI''')
+  description : 'Default Kerberos service principal for GSSAPI')
 
 option('system_tzdata', type: 'string', value: '',
   description: 'use system time zone data in specified directory')
@@ -32,7 +32,7 @@ option('system_tzdata', type: 'string', value: '',
 
 option('pgport', type : 'integer', value : 5432,
   min: 1, max: 65535,
-  description : '''Default port number for server and clients''')
+  description : 'Default port number for server and clients')
 
 
 # Developer options
-- 

Tristan Partin
Neon (https://neon.tech)

From 63d982604a2c1ee13f290c4cbd6af5e9404e541e Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Tue, 16 May 2023 08:03:31 -0500
Subject: [PATCH postgres v1 02/17] Use consistent casing in Meson option
 descriptions

Meson itself uses capital letters for option descriptions, so follow
that.
---
 meson_options.txt | 90 +++++++++++++++++++++++------------------------
 1 file changed, 45 insertions(+), 45 deletions(-)

diff --git a/meson_options.txt b/meson_options.txt
index 1ea9729dc2..fa823fd088 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -5,7 +5,7 @@
 option('blocksize', type : 'combo',
   choices : ['1', '2', '4', '8', '16', '32'],
   value : '8',
-  description: 'set relation block size in kB')
+  description: 'Set relation block size in kB')
 
 option('wal_blocksize', type : 'combo',
   choices: ['1', '2', '4', '8', '16', '32', '64'],
@@ -25,7 +25,7 @@ option('krb_srvnam', type : 'string', value : 'postgres',
   description : 'Default Kerberos service principal for GSSAPI')
 
 option('system_tzdata', type: 'string', value: '',
-  description: 'use system time zone data in specified directory')
+  description: 'Use system time zone data in specified directory')
 
 
 # Defaults
@@ -38,7 +38,7 @@ option('pgport', type : 'integer', value : 5432,
 # Developer options
 
 option('cassert', type : 'boolean', value: false,
-  description: 'enable assertion checks (for debugging)')
+  description: 'Enable assertion checks (for debugging)')
 
 option('tap_tests', type : 'feature', value : 'auto',
   description : 'Whether to enable tap tests')
@@ -47,43 +47,43 @@ option('PG_TEST_EXTRA', type : 'string', value: '',
   description: 'Enable selected extra tests')
 
 option('atomics', type : 'boolean', value: true,
-  description: 'whether to use atomic operations')
+  description: 'Whether to use atomic operations')
 
 option('spinlocks', type : 'boolean', value: true,
-  description: 'whether to use spinlocks')
+  description: 'Whether to use spinlocks')
 
 
 # Compilation options
 
 option('extra_include_dirs', type : 'array', value: [],
-  description: 'non-default directories to be searched for headers')
+  description: 'Non-default directories to be searched for headers')
 
 option('extra_lib_dirs', type : 'array', value: [],
-  description: 'non-default directories to be searched for libs')
+  description: 'Non-default directories to be searched for libs')
 
 option('extra_version', type : 'string', value: '',
-  description: 'append STRING to the PostgreSQL version number')
+  description: 'Append STRING to the PostgreSQL version number')
 
 option('darwin_sysroot', type : 'string', value: '',
-  description: 'select a non-default sysroot path')
+  description: 'Select a non-default sysroot path')
 
 option('rpath', type : 'boolean', value: true,
-  description: 'whether to embed shared library search path in executables')
+  description: 'Whether to embed shared library search path in executables')
 
 
 # External dependencies
 
 option('bonjour', type : 'feature', value: 'auto',
-  description: 'build with Bonjour support')
+  description: 'Build with Bonjour support')
 
 option('bsd_auth', type : 'feature', value: 'auto',
-  description: 'build with BSD Authentication support')
+  description: 'Build with BSD Authentication support')
 
 option('docs', type : 'feature', value: 'auto',
-  description: 'documentation in HTML and man page format')
+  description: 'Documentation in HTML and man page format')
 
 option('docs_pdf', type : 'feature', value: 'auto',
-  description: 'documentation in PDF format')
+  description: 'Documentation in PDF format')
 
 option('docs_html_style', type : 'combo', choices: ['simple', 'website'],
   description: 'CSS stylesheet for HTML documentation')
@@ -110,102 +110,102 @@ option('libxslt', type : 'feature', value: 'auto',
   description: 'XSLT support in contrib/xml2')
 
 option('llvm', type : 'feature', value: 'disabled',
-  description: 'whether to use llvm')
+  description: 'Whether to use llvm')
 
 option('lz4', type : 'feature', value: 'auto',
   description: 'LZ4 support')
 
 option('nls', type: 'feature', value: 'auto',
-  description: 'native language support')
+  description: 'Native language support')
 
 option('pam', type : 'feature', value: 'auto',
-  description: 'build with PAM support')
+  description: 'Build with PAM support')
 
 option('plperl', type : 'feature', value: 'auto',
-  description: 'build Perl modules (PL/Perl)')
+  description: 'Build Perl modules (PL/Perl)')
 
 option('plpython', type : 'feature', value: 'auto',
-  description: 'build Python modules (PL/Python)')
+  description: 'Build Python modules (PL/Python)')
 
 option('pltcl', type : 'feature', value: 'auto',
-  description: 'build with TCL support')
+  description: 'Build with TCL support')
 
 option('tcl_version', type : 'string', value : 'tcl',
-  description: 'specify TCL version')
+  description: 'Specify TCL version')
 
 option('readline', type : 'feature', value : 'auto',
-  description: 'use GNU Readline or BSD Libedit for editing')
+  description: 'Use GNU Readline or BSD Libedit for editing')
 
 option('selinux', type : 'feature', value : 'disabled',
-  description: 'build with SELinux support')
+  description: 'Build with SELinux support')
 
 option('ssl', type : 'combo', choices : ['auto', 'none', 'openssl'],
   value : 'auto',
-  description: 'use LIB for SSL/TLS support (openssl)')
+  description: 'Use LIB for SSL/TLS support (openssl)')
 
 option('systemd', type : 'feature', value: 'auto',
-  description: 'build with systemd support')
+  description: 'Build with systemd support')
 
 option('uuid', type : 'combo', choices : ['none', 'bsd', 'e2fs', 'ossp'],
   value : 'none',
-  description: 'build contrib/uuid-ossp using LIB')
+  description: 'Build contrib/uuid-ossp using LIB')
 
 option('zlib', type : 'feature', value: 'auto',
-  description: 'whether to use zlib')
+  description: 'Whether to use zlib')
 
 option('zstd', type : 'feature', value: 'auto',
-  description: 'whether to use zstd')
+  description: 'Whether to use zstd')
 
 
 # Programs
 
 option('BISON', type : 'array', value: ['bison', 'win_bison'],
-  description: 'path to bison binary')
+  description: 'Path to bison binary')
 
 option('DTRACE', type : 'string', value: 'dtrace',
-  description: 'path to dtrace binary')
+  description: 'Path to dtrace binary')
 
 option('FLEX', type : 'array', value: ['flex', 'win_flex'],
-  description: 'path to flex binary')
+  description: 'Path to flex binary')
 
 option('FOP', type : 'string', value: 'fop',
-  description: 'path to fop binary')
+  description: 'Path to fop binary')
 
 option('GZIP', type : 'string', value: 'gzip',
-  description: 'path to gzip binary')
+  description: 'Path to gzip binary')
 
 option('LZ4', type : 'string', value: 'lz4',
-  description: 'path to lz4 binary')
+  description: 'Path to lz4 binary')
 
 option('OPENSSL', type : 'string', value: 'openssl',
-  description: 'path to openssl binary')
+  description: 'Path to openssl binary')
 
 option('PERL', type : 'string', value: 'perl',
-  description: 'path to perl binary')
+  description: 'Path to perl binary')
 
 option('PROVE', type : 'string', value: 'prove',
-  description: 'path to prove binary')
+  description: 'Path to prove binary')
 
 option('PYTHON', type : 'array', value: ['python3', 'python'],
-  description: 'path to python binary')
+  description: 'Path to python binary')
 
 option('SED', type : 'string', value: 'gsed',
-  description: 'path to sed binary')
+  description: 'Path to sed binary')
 
 option('STRIP', type : 'string', value: 'strip',
-  description: 'path to strip binary, used for PGXS emulation')
+  description: 'Path to strip binary, used for PGXS emulation')
 
 option('TAR', type : 'string', value: 'tar',
-  description: 'path to tar binary')
+  description: 'Path to tar binary')
 
 option('XMLLINT', type : 'string', value: 'xmllint',
-  description: 'path to xmllint binary')
+  description: 'Path to xmllint binary')
 
 option('XSLTPROC', type : 'string', value: 'xsltproc',
-  description: 'path to xsltproc binary')
+  description: 'Path to xsltproc binary')
 
 option('ZSTD', type : 'string', value: 'zstd',
-  description: 'path to zstd binary')
+  description: 'Path to zstd binary')
 
 option('ZIC', type : 'string', value: 'zic',
-  description: 'path to zic binary, when cross-compiling')
+  description: 'Path to zic binary, when cross-compiling')
-- 

Tristan Partin
Neon (https://neon.tech)

From 1c8d374504ceb0c4051457092f6140ef730fa87d Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Tue, 16 May 2023 08:11:14 -0500
Subject: [PATCH postgres v1 03/17] Use consistent Meson option description
 formats

---
 meson_options.txt | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/meson_options.txt b/meson_options.txt
index fa823fd088..bdc6735332 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -5,7 +5,7 @@
 option('blocksize', type : 'combo',
   choices : ['1', '2', '4', '8', '16', '32'],
   value : '8',
-  description: 'Set relation block size in kB')
+  description: 'Relation block size, in kilobytes')
 
 option('wal_blocksize', type : 'combo',
   choices: ['1', '2', '4', '8', '16', '32', '64'],
@@ -41,16 +41,16 @@ option('cassert', type : 'boolean', value: false,
   description: 'Enable assertion checks (for debugging)')
 
 option('tap_tests', type : 'feature', value : 'auto',
-  description : 'Whether to enable tap tests')
+  description : 'Enable tap tests')
 
 option('PG_TEST_EXTRA', type : 'string', value: '',
   description: 'Enable selected extra tests')
 
 option('atomics', type : 'boolean', value: true,
-  description: 'Whether to use atomic operations')
+  description: 'Use atomic operations')
 
 option('spinlocks', type : 'boolean', value: true,
-  description: 'Whether to use spinlocks')
+  description: 'Use spinlocks')
 
 
 # Compilation options
@@ -68,16 +68,16 @@ option('darwin_sysroot', type : 'string', value: '',
   description: 'Select a non-default sysroot path')
 
 option('rpath', type : 'boolean', value: true,
-  description: 'Whether to embed shared library search path in executables')
+  description: 'Embed shared library search path in executables')
 
 
 # External dependencies
 
 option('bonjour', type : 'feature', value: 'auto',
-  description: 'Build with Bonjour support')
+  description: 'Bonjour support')
 
 option('bsd_auth', type : 'feature', value: 'auto',
-  description: 'Build with BSD Authentication support')
+  description: 'BSD Authentication support')
 
 option('docs', type : 'feature', value: 'auto',
   description: 'Documentation in HTML and man page format')
@@ -110,7 +110,7 @@ option('libxslt', type : 'feature', value: 'auto',
   description: 'XSLT support in contrib/xml2')
 
 option('llvm', type : 'feature', value: 'disabled',
-  description: 'Whether to use llvm')
+  description: 'LLVM support')
 
 option('lz4', type : 'feature', value: 'auto',
   description: 'LZ4 support')
@@ -119,7 +119,7 @@ option('nls', type: 'feature', value: 'auto',
   description: 'Native language support')
 
 option('pam', type : 'feature', value: 'auto',
-  description: 'Build with PAM support')
+  description: 'PAM support')
 
 option('plperl', type : 'feature', value: 'auto',
   description: 'Build Perl modules (PL/Perl)')
@@ -128,33 +128,33 @@ option('plpython', type : 'feature', value: 'auto',
   description: 'Build Python modules (PL/Python)')
 
 option('pltcl', type : 'feature', value: 'auto',
-  description: 'Build with TCL support')
+  description: 'Build with TCL support (PL/TCL)')
 
 option('tcl_version', type : 'string', value : 'tcl',
-  description: 'Specify TCL version')
+  description: 'TCL version')
 
 option('readline', type : 'feature', value : 'auto',
   description: 'Use GNU Readline or BSD Libedit for editing')
 
 option('selinux', type : 'feature', value : 'disabled',
-  description: 'Build with SELinux support')
+  description: 'SELinux support')
 
 option('ssl', type : 'combo', choices : ['auto', 'none', 'openssl'],
   value : 'auto',
   description: 'Use LIB for SSL/TLS support (openssl)')
 
 option('systemd', type : 'feature', value: 'auto',
-  description: 'Build with systemd support')
+  description: 'systemd support')
 
 option('uuid', type : 'combo', choices : ['none', 'bsd', 'e2fs', 'ossp'],
   value : 'none',
-  description: 'Build contrib/uuid-ossp using LIB')
+  description: 'Use LIB for contrib/uuid-ossp support')
 
 option('zlib', type : 'feature', value: 'auto',
-  description: 'Whether to use zlib')
+  description: 'Enable zlib')
 
 option('zstd', type : 'feature', value: 'auto',
-  description: 'Whether to use zstd')
+  description: 'Enable zstd')
 
 
 # Programs
-- 

Tristan Partin
Neon (https://neon.tech)

From c2c40d1c4120b4b3948b00866b13ea0795a49cdd Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Tue, 16 May 2023 08:28:48 -0500
Subject: [PATCH postgres v1 04/17] Attach colon to keyword argument

This matches the style found in the rest of the Meson build description.
---
 meson_options.txt | 138 +++++++++++++++++++++++-----------------------
 1 file changed, 69 insertions(+), 69 deletions(-)

diff --git a/meson_options.txt b/meson_options.txt
index bdc6735332..e9ac70766a 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -2,27 +2,27 @@
 
 # Data layout influencing options
 
-option('blocksize', type : 'combo',
-  choices : ['1', '2', '4', '8', '16', '32'],
-  value : '8',
+option('blocksize', type: 'combo',
+  choices: ['1', '2', '4', '8', '16', '32'],
+  value: '8',
   description: 'Relation block size, in kilobytes')
 
-option('wal_blocksize', type : 'combo',
+option('wal_blocksize', type: 'combo',
   choices: ['1', '2', '4', '8', '16', '32', '64'],
   value: '8',
-  description : 'WAL block size, in kilobytes')
+  description: 'WAL block size, in kilobytes')
 
-option('segsize', type : 'integer', value : 1,
-  description : 'Segment size, in gigabytes')
+option('segsize', type: 'integer', value: 1,
+  description: 'Segment size, in gigabytes')
 
-option('segsize_blocks', type : 'integer', value: 0,
-  description : 'Segment size, in blocks')
+option('segsize_blocks', type: 'integer', value: 0,
+  description: 'Segment size, in blocks')
 
 
 # Miscellaneous options
 
-option('krb_srvnam', type : 'string', value : 'postgres',
-  description : 'Default Kerberos service principal for GSSAPI')
+option('krb_srvnam', type: 'string', value: 'postgres',
+  description: 'Default Kerberos service principal for GSSAPI')
 
 option('system_tzdata', type: 'string', value: '',
   description: 'Use system time zone data in specified directory')
@@ -30,182 +30,182 @@ option('system_tzdata', type: 'string', value: '',
 
 # Defaults
 
-option('pgport', type : 'integer', value : 5432,
+option('pgport', type: 'integer', value: 5432,
   min: 1, max: 65535,
-  description : 'Default port number for server and clients')
+  description: 'Default port number for server and clients')
 
 
 # Developer options
 
-option('cassert', type : 'boolean', value: false,
+option('cassert', type: 'boolean', value: false,
   description: 'Enable assertion checks (for debugging)')
 
-option('tap_tests', type : 'feature', value : 'auto',
-  description : 'Enable tap tests')
+option('tap_tests', type: 'feature', value: 'auto',
+  description: 'Enable tap tests')
 
-option('PG_TEST_EXTRA', type : 'string', value: '',
+option('PG_TEST_EXTRA', type: 'string', value: '',
   description: 'Enable selected extra tests')
 
-option('atomics', type : 'boolean', value: true,
+option('atomics', type: 'boolean', value: true,
   description: 'Use atomic operations')
 
-option('spinlocks', type : 'boolean', value: true,
+option('spinlocks', type: 'boolean', value: true,
   description: 'Use spinlocks')
 
 
 # Compilation options
 
-option('extra_include_dirs', type : 'array', value: [],
+option('extra_include_dirs', type: 'array', value: [],
   description: 'Non-default directories to be searched for headers')
 
-option('extra_lib_dirs', type : 'array', value: [],
+option('extra_lib_dirs', type: 'array', value: [],
   description: 'Non-default directories to be searched for libs')
 
-option('extra_version', type : 'string', value: '',
+option('extra_version', type: 'string', value: '',
   description: 'Append STRING to the PostgreSQL version number')
 
-option('darwin_sysroot', type : 'string', value: '',
+option('darwin_sysroot', type: 'string', value: '',
   description: 'Select a non-default sysroot path')
 
-option('rpath', type : 'boolean', value: true,
+option('rpath', type: 'boolean', value: true,
   description: 'Embed shared library search path in executables')
 
 
 # External dependencies
 
-option('bonjour', type : 'feature', value: 'auto',
+option('bonjour', type: 'feature', value: 'auto',
   description: 'Bonjour support')
 
-option('bsd_auth', type : 'feature', value: 'auto',
+option('bsd_auth', type: 'feature', value: 'auto',
   description: 'BSD Authentication support')
 
-option('docs', type : 'feature', value: 'auto',
+option('docs', type: 'feature', value: 'auto',
   description: 'Documentation in HTML and man page format')
 
-option('docs_pdf', type : 'feature', value: 'auto',
+option('docs_pdf', type: 'feature', value: 'auto',
   description: 'Documentation in PDF format')
 
-option('docs_html_style', type : 'combo', choices: ['simple', 'website'],
+option('docs_html_style', type: 'combo', choices: ['simple', 'website'],
   description: 'CSS stylesheet for HTML documentation')
 
-option('dtrace', type : 'feature', value: 'disabled',
+option('dtrace', type: 'feature', value: 'disabled',
   description: 'DTrace support')
 
-option('gssapi', type : 'feature', value: 'auto',
+option('gssapi', type: 'feature', value: 'auto',
   description: 'GSSAPI support')
 
-option('icu', type : 'feature', value: 'auto',
+option('icu', type: 'feature', value: 'auto',
   description: 'ICU support')
 
-option('ldap', type : 'feature', value: 'auto',
+option('ldap', type: 'feature', value: 'auto',
   description: 'LDAP support')
 
-option('libedit_preferred', type : 'boolean', value: false,
+option('libedit_preferred', type: 'boolean', value: false,
   description: 'Prefer BSD Libedit over GNU Readline')
 
-option('libxml', type : 'feature', value: 'auto',
+option('libxml', type: 'feature', value: 'auto',
   description: 'XML support')
 
-option('libxslt', type : 'feature', value: 'auto',
+option('libxslt', type: 'feature', value: 'auto',
   description: 'XSLT support in contrib/xml2')
 
-option('llvm', type : 'feature', value: 'disabled',
+option('llvm', type: 'feature', value: 'disabled',
   description: 'LLVM support')
 
-option('lz4', type : 'feature', value: 'auto',
+option('lz4', type: 'feature', value: 'auto',
   description: 'LZ4 support')
 
 option('nls', type: 'feature', value: 'auto',
   description: 'Native language support')
 
-option('pam', type : 'feature', value: 'auto',
+option('pam', type: 'feature', value: 'auto',
   description: 'PAM support')
 
-option('plperl', type : 'feature', value: 'auto',
+option('plperl', type: 'feature', value: 'auto',
   description: 'Build Perl modules (PL/Perl)')
 
-option('plpython', type : 'feature', value: 'auto',
+option('plpython', type: 'feature', value: 'auto',
   description: 'Build Python modules (PL/Python)')
 
-option('pltcl', type : 'feature', value: 'auto',
+option('pltcl', type: 'feature', value: 'auto',
   description: 'Build with TCL support (PL/TCL)')
 
-option('tcl_version', type : 'string', value : 'tcl',
+option('tcl_version', type: 'string', value: 'tcl',
   description: 'TCL version')
 
-option('readline', type : 'feature', value : 'auto',
+option('readline', type: 'feature', value: 'auto',
   description: 'Use GNU Readline or BSD Libedit for editing')
 
-option('selinux', type : 'feature', value : 'disabled',
+option('selinux', type: 'feature', value: 'disabled',
   description: 'SELinux support')
 
-option('ssl', type : 'combo', choices : ['auto', 'none', 'openssl'],
-  value : 'auto',
+option('ssl', type: 'combo', choices: ['auto', 'none', 'openssl'],
+  value: 'auto',
   description: 'Use LIB for SSL/TLS support (openssl)')
 
-option('systemd', type : 'feature', value: 'auto',
+option('systemd', type: 'feature', value: 'auto',
   description: 'systemd support')
 
-option('uuid', type : 'combo', choices : ['none', 'bsd', 'e2fs', 'ossp'],
-  value : 'none',
+option('uuid', type: 'combo', choices: ['none', 'bsd', 'e2fs', 'ossp'],
+  value: 'none',
   description: 'Use LIB for contrib/uuid-ossp support')
 
-option('zlib', type : 'feature', value: 'auto',
+option('zlib', type: 'feature', value: 'auto',
   description: 'Enable zlib')
 
-option('zstd', type : 'feature', value: 'auto',
+option('zstd', type: 'feature', value: 'auto',
   description: 'Enable zstd')
 
 
 # Programs
 
-option('BISON', type : 'array', value: ['bison', 'win_bison'],
+option('BISON', type: 'array', value: ['bison', 'win_bison'],
   description: 'Path to bison binary')
 
-option('DTRACE', type : 'string', value: 'dtrace',
+option('DTRACE', type: 'string', value: 'dtrace',
   description: 'Path to dtrace binary')
 
-option('FLEX', type : 'array', value: ['flex', 'win_flex'],
+option('FLEX', type: 'array', value: ['flex', 'win_flex'],
   description: 'Path to flex binary')
 
-option('FOP', type : 'string', value: 'fop',
+option('FOP', type: 'string', value: 'fop',
   description: 'Path to fop binary')
 
-option('GZIP', type : 'string', value: 'gzip',
+option('GZIP', type: 'string', value: 'gzip',
   description: 'Path to gzip binary')
 
-option('LZ4', type : 'string', value: 'lz4',
+option('LZ4', type: 'string', value: 'lz4',
   description: 'Path to lz4 binary')
 
-option('OPENSSL', type : 'string', value: 'openssl',
+option('OPENSSL', type: 'string', value: 'openssl',
   description: 'Path to openssl binary')
 
-option('PERL', type : 'string', value: 'perl',
+option('PERL', type: 'string', value: 'perl',
   description: 'Path to perl binary')
 
-option('PROVE', type : 'string', value: 'prove',
+option('PROVE', type: 'string', value: 'prove',
   description: 'Path to prove binary')
 
-option('PYTHON', type : 'array', value: ['python3', 'python'],
+option('PYTHON', type: 'array', value: ['python3', 'python'],
   description: 'Path to python binary')
 
-option('SED', type : 'string', value: 'gsed',
+option('SED', type: 'string', value: 'gsed',
   description: 'Path to sed binary')
 
-option('STRIP', type : 'string', value: 'strip',
+option('STRIP', type: 'string', value: 'strip',
   description: 'Path to strip binary, used for PGXS emulation')
 
-option('TAR', type : 'string', value: 'tar',
+option('TAR', type: 'string', value: 'tar',
   description: 'Path to tar binary')
 
-option('XMLLINT', type : 'string', value: 'xmllint',
+option('XMLLINT', type: 'string', value: 'xmllint',
   description: 'Path to xmllint binary')
 
-option('XSLTPROC', type : 'string', value: 'xsltproc',
+option('XSLTPROC', type: 'string', value: 'xsltproc',
   description: 'Path to xsltproc binary')
 
-option('ZSTD', type : 'string', value: 'zstd',
+option('ZSTD', type: 'string', value: 'zstd',
   description: 'Path to zstd binary')
 
-option('ZIC', type : 'string', value: 'zic',
+option('ZIC', type: 'string', value: 'zic',
   description: 'Path to zic binary, when cross-compiling')
-- 

Tristan Partin
Neon (https://neon.tech)

From 3aa4f57021447e57707bb63c80c4dff863a8f2ca Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Tue, 16 May 2023 08:33:12 -0500
Subject: [PATCH postgres v1 05/17] Use the not_found_dep constant

Previously in the build description, a not_found_dep was defined. Make
use of it.
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index 096044628c..d6e415d40a 100644
--- a/meson.build
+++ b/meson.build
@@ -558,7 +558,7 @@ endif
 ###############################################################
 
 bonjouropt = get_option('bonjour')
-bonjour = dependency('', required : false)
+bonjour = not_found_dep
 if cc.check_header('dns_sd.h', required: bonjouropt,
     args: test_c_args, include_directories: postgres_inc) and \
    cc.has_function('DNSServiceRegister',
-- 

Tristan Partin
Neon (https://neon.tech)

From ed34dc95b979169e50d11353b480e25d7e9af916 Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Tue, 16 May 2023 09:19:46 -0500
Subject: [PATCH postgres v1 06/17] Remove old comment

That portion of code is not run in the Windows case already given the
structure of the surrounding if statement.
---
 meson.build | 2 --
 1 file changed, 2 deletions(-)

diff --git a/meson.build b/meson.build
index d6e415d40a..3db70fb8a6 100644
--- a/meson.build
+++ b/meson.build
@@ -722,8 +722,6 @@ choke me
     endif
   endif
 
-  # XXX: this shouldn't be tested in the windows case, but should be tested in
-  # the dependency() success case
   if ldap.found() and cc.has_function('ldap_initialize',
       dependencies: ldap, args: test_c_args)
     cdata.set('HAVE_LDAP_INITIALIZE', 1)
-- 

Tristan Partin
Neon (https://neon.tech)

From 75b30d373c26e01e95d7ec4a87e8a19f91b581db Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Tue, 16 May 2023 09:27:06 -0500
Subject: [PATCH postgres v1 07/17] Tie adding C++ support to the llvm Meson
 option

In the event the llvm option is defined to be 'auto', it is possible
that the host machine might not have a C++ compiler. If that is the
case, then we shouldn't continue reaching for the llvm dependency.
---
 meson.build | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/meson.build b/meson.build
index 3db70fb8a6..d266e2eb1f 100644
--- a/meson.build
+++ b/meson.build
@@ -743,19 +743,20 @@ endif
 
 llvmopt = get_option('llvm')
 if not llvmopt.disabled()
-  add_languages('cpp', required: true, native: false)
-  llvm = dependency('llvm', version: '>=3.9', method: 'config-tool', required: llvmopt)
+  if add_languages('cpp', required: llvmopt, native: false)
+    llvm = dependency('llvm', version: '>=3.9', method: 'config-tool', required: llvmopt)
 
-  if llvm.found()
+    if llvm.found()
 
-    cdata.set('USE_LLVM', 1)
+      cdata.set('USE_LLVM', 1)
 
-    cpp = meson.get_compiler('cpp')
+      cpp = meson.get_compiler('cpp')
 
-    llvm_binpath = llvm.get_variable(configtool: 'bindir')
+      llvm_binpath = llvm.get_variable(configtool: 'bindir')
 
-    ccache = find_program('ccache', native: true, required: false)
-    clang = find_program(llvm_binpath / 'clang', required: true)
+      ccache = find_program('ccache', native: true, required: false)
+      clang = find_program(llvm_binpath / 'clang', required: true)
+    endif
   endif
 else
   llvm = not_found_dep
-- 

Tristan Partin
Neon (https://neon.tech)

From d3b51220c88143cc4a87d23d900c13cf28a0105d Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Tue, 16 May 2023 10:27:34 -0500
Subject: [PATCH postgres v1 08/17] Mention the correct way to disable readline
 support

Using false to disable a feature option is incorrect.
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index d266e2eb1f..ca4366988d 100644
--- a/meson.build
+++ b/meson.build
@@ -1132,7 +1132,7 @@ if not get_option('readline').disabled()
       error('''readline header not found
 If you have @0@ already installed, see meson-log/meson-log.txt for details on the
 failure. It is possible the compiler isn't looking in the proper directory.
-Use -Dreadline=false to disable readline support.'''.format(readline_dep))
+Use -Dreadline=disabled to disable readline support.'''.format(readline_dep))
     endif
 
     check_funcs = [
-- 

Tristan Partin
Neon (https://neon.tech)

From 5c3a143dd2a882bdaa3aa2fa4dcb49c39ddc676d Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Wed, 17 May 2023 09:30:54 -0500
Subject: [PATCH postgres v1 09/17] Remove return code check

run_command(check: true) will already handle this.
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index ca4366988d..592f271711 100644
--- a/meson.build
+++ b/meson.build
@@ -385,7 +385,7 @@ install_files = files('src/tools/install_files')
 # https://github.com/mesonbuild/meson/issues/8511
 meson_binpath_r = run_command(python, 'src/tools/find_meson', check: true)
 
-if meson_binpath_r.returncode() != 0 or meson_binpath_r.stdout() == ''
+if meson_binpath_r.stdout() == ''
   error('huh, could not run find_meson.\nerrcode: @0@\nstdout: @1@\nstderr: @2@'.format(
     meson_binpath_r.returncode(),
     meson_binpath_r.stdout(),
-- 

Tristan Partin
Neon (https://neon.tech)

From 6f820f240a6d726c639e121f55823341ae1a9abb Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Wed, 17 May 2023 09:33:18 -0500
Subject: [PATCH postgres v1 10/17] Fix some grammar usage in Meson comments

---
 meson.build | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/meson.build b/meson.build
index 592f271711..e9e03d1ff5 100644
--- a/meson.build
+++ b/meson.build
@@ -150,7 +150,7 @@ cdata.set_quoted('PG_MAJORVERSION', pg_version_major.to_string())
 cdata.set('PG_MAJORVERSION_NUM', pg_version_major)
 cdata.set('PG_MINORVERSION_NUM', pg_version_minor)
 cdata.set('PG_VERSION_NUM', pg_version_num)
-# PG_VERSION_STR is built later, it depends compiler test results
+# PG_VERSION_STR is built later, it depends on compiler test results
 cdata.set_quoted('CONFIGURE_ARGS', '')
 
 
@@ -1675,7 +1675,7 @@ if cc.has_function_attribute('visibility:default') and \
   cdata.set('HAVE_VISIBILITY_ATTRIBUTE', 1)
 
   # Only newer versions of meson know not to apply gnu_symbol_visibility =
-  # inlineshidden to C code as well... Any either way, we want to put these
+  # inlineshidden to C code as well... And either way, we want to put these
   # flags into exported files (pgxs, .pc files).
   cflags_mod += '-fvisibility=hidden'
   cxxflags_mod += ['-fvisibility=hidden', '-fvisibility-inlines-hidden']
-- 

Tristan Partin
Neon (https://neon.tech)

From c89ac6672dd0b914d06f6fe07861300cdf613331 Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Wed, 17 May 2023 09:38:09 -0500
Subject: [PATCH postgres v1 11/17] Pass feature option through to required
 kwarg

Meson understands this already. No need to convert it to a boolean.
---
 meson.build | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/meson.build b/meson.build
index e9e03d1ff5..83bc1c7b25 100644
--- a/meson.build
+++ b/meson.build
@@ -770,8 +770,8 @@ endif
 
 icuopt = get_option('icu')
 if not icuopt.disabled()
-  icu = dependency('icu-uc', required: icuopt.enabled())
-  icu_i18n = dependency('icu-i18n', required: icuopt.enabled())
+  icu = dependency('icu-uc', required: icuopt)
+  icu_i18n = dependency('icu-i18n', required: icuopt)
 
   if icu.found()
     cdata.set('USE_ICU', 1)
@@ -1080,7 +1080,7 @@ if not get_option('readline').disabled()
     readline = dependency(readline_dep, required: false)
     if not readline.found()
       readline = cc.find_library(readline_dep,
-        required: get_option('readline').enabled(),
+        required: get_option('readline'),
         dirs: test_lib_d)
     endif
     if readline.found()
@@ -2540,7 +2540,7 @@ if not nlsopt.disabled()
   # otherwise there'd be lots of
   # "Gettext not found, all translation (po) targets will be ignored."
   # warnings if not found.
-  msgfmt = find_program('msgfmt', required: nlsopt.enabled(), native: true)
+  msgfmt = find_program('msgfmt', required: nlsopt, native: true)
 
   # meson 0.59 has this wrapped in dependency('int')
   if (msgfmt.found() and
-- 

Tristan Partin
Neon (https://neon.tech)

From b35ecb2c8dcd71608f98af1e0ec19d965099ceab Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Wed, 17 May 2023 09:40:02 -0500
Subject: [PATCH postgres v1 12/17] Make finding pkg-config(python3) more
 robust

It is a possibility that the installation can't be found. Checking for
Python.h is redundant with what Meson does internally.

https://github.com/mesonbuild/meson/blob/master/mesonbuild/dependencies/python.py#L218
---
 meson.build | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/meson.build b/meson.build
index 83bc1c7b25..8dbd9b660b 100644
--- a/meson.build
+++ b/meson.build
@@ -1053,15 +1053,13 @@ endif
 ###############################################################
 
 pyopt = get_option('plpython')
+python3_dep = not_found_dep
 if not pyopt.disabled()
   pm = import('python')
-  python3_inst = pm.find_installation(required: pyopt.enabled())
-  python3_dep = python3_inst.dependency(embed: true, required: pyopt.enabled())
-  if not cc.check_header('Python.h', dependencies: python3_dep, required: pyopt.enabled())
-    python3_dep = not_found_dep
+  python3_inst = pm.find_installation(required: pyopt)
+  if python3_inst.found()
+    python3_dep = python3_inst.dependency(embed: true, required: pyopt)
   endif
-else
-  python3_dep = not_found_dep
 endif
 
 
-- 

Tristan Partin
Neon (https://neon.tech)

From d6e3ba0b2b698b39121bbd58af01b99d616a4f8c Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Wed, 17 May 2023 09:43:51 -0500
Subject: [PATCH postgres v1 13/17] Make some Meson style more consistent with
 surrounding code

---
 meson.build             | 17 ++++++++---------
 src/include/meson.build |  2 +-
 2 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/meson.build b/meson.build
index 8dbd9b660b..ba158cb635 100644
--- a/meson.build
+++ b/meson.build
@@ -1145,7 +1145,7 @@ Use -Dreadline=disabled to disable readline support.'''.format(readline_dep))
     foreach func : check_funcs
       found = cc.has_function(func, dependencies: [readline],
         args: test_c_args, include_directories: postgres_inc)
-      cdata.set('HAVE_'+func.to_upper(), found ? 1 : false)
+      cdata.set('HAVE_' + func.to_upper(), found ? 1 : false)
     endforeach
 
     check_vars = [
@@ -1155,7 +1155,7 @@ Use -Dreadline=disabled to disable readline support.'''.format(readline_dep))
     ]
 
     foreach var : check_vars
-      cdata.set('HAVE_'+var.to_upper(),
+      cdata.set('HAVE_' + var.to_upper(),
         cc.has_header_symbol(readline_h, var,
           args: test_c_args, include_directories: postgres_inc,
           prefix: '#include <stdio.h>',
@@ -1310,7 +1310,7 @@ if sslopt in ['auto', 'openssl']
       cdata.set('USE_OPENSSL', 1,
                 description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)')
       cdata.set('OPENSSL_API_COMPAT', '0x10001000L',
-                description: '''Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.''')
+                description: 'Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.')
       ssl_library = 'openssl'
     else
       ssl = not_found_dep
@@ -1598,8 +1598,7 @@ if cc.links('''
 
   if not buggy_int128
     cdata.set('PG_INT128_TYPE', '__int128')
-    cdata.set('ALIGNOF_PG_INT128_TYPE', cc.
-      alignment('__int128', args: test_c_args))
+    cdata.set('ALIGNOF_PG_INT128_TYPE', cc.alignment('__int128', args: test_c_args))
   endif
 endif
 
@@ -1641,8 +1640,8 @@ endif
 # We use <stdbool.h> if we have it and it declares type bool as having
 # size 1.  Otherwise, c.h will fall back to declaring bool as unsigned char.
 if cc.has_type('_Bool', args: test_c_args) \
-  and cc.has_type('bool', prefix: '#include <stdbool.h>', args: test_c_args) \
-  and cc.sizeof('bool', prefix: '#include <stdbool.h>', args: test_c_args) == 1
+    and cc.has_type('bool', prefix: '#include <stdbool.h>', args: test_c_args) \
+    and cc.sizeof('bool', prefix: '#include <stdbool.h>', args: test_c_args) == 1
   cdata.set('HAVE__BOOL', 1)
   cdata.set('PG_USE_STDBOOL', 1)
 endif
@@ -1669,7 +1668,7 @@ endforeach
 
 
 if cc.has_function_attribute('visibility:default') and \
-  cc.has_function_attribute('visibility:hidden')
+    cc.has_function_attribute('visibility:hidden')
   cdata.set('HAVE_VISIBILITY_ATTRIBUTE', 1)
 
   # Only newer versions of meson know not to apply gnu_symbol_visibility =
@@ -3031,7 +3030,7 @@ meson_install_args = meson_args + ['install'] + {
     'muon': []
 }[meson_impl]
 
-# setup tests should  be run first,
+# setup tests should be run first,
 # so define priority for these
 setup_tests_priority = 100
 test('tmp_install',
diff --git a/src/include/meson.build b/src/include/meson.build
index 33c0a5562c..d7e1ecd4c9 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -89,7 +89,7 @@ install_headers(
   'c.h',
   'port.h',
   'postgres_fe.h',
-  install_dir: dir_include_internal
+  install_dir: dir_include_internal,
 )
 
 install_headers(
-- 

Tristan Partin
Neon (https://neon.tech)

From 47394ffd113d4170e955bc033841cb7e18fd3ac4 Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Wed, 17 May 2023 09:44:49 -0500
Subject: [PATCH postgres v1 14/17] Reduce branching on Meson version

This code had a branch depending on Meson version. Instead, we can just
move the system checks to the if statement. I believe this also keeps
selinux and systemd from being looked for on non-Linux systems when
using Meson < 0.59. Before they would be checked, but obviously fail.
---
 meson.build | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/meson.build b/meson.build
index ba158cb635..d92c57249d 100644
--- a/meson.build
+++ b/meson.build
@@ -1190,13 +1190,10 @@ endif
 ###############################################################
 
 selinux = not_found_dep
-selinuxopt = get_option('selinux')
-if meson.version().version_compare('>=0.59')
-  selinuxopt = selinuxopt.disable_auto_if(host_system != 'linux')
+if host_system == 'linux'
+  selinux = dependency('libselinux', required: get_option('selinux'), version: '>= 2.1.10')
+  cdata.set('HAVE_LIBSELINUX', selinux.found() ? 1 : false)
 endif
-selinux = dependency('libselinux', required: selinuxopt, version: '>= 2.1.10')
-cdata.set('HAVE_LIBSELINUX',
-  selinux.found() ? 1 : false)
 
 
 
@@ -1205,12 +1202,10 @@ cdata.set('HAVE_LIBSELINUX',
 ###############################################################
 
 systemd = not_found_dep
-systemdopt = get_option('systemd')
-if meson.version().version_compare('>=0.59')
-  systemdopt = systemdopt.disable_auto_if(host_system != 'linux')
+if host_system == 'linux'
+  systemd = dependency('libsystemd', required: get_option('systemd'))
+  cdata.set('USE_SYSTEMD', systemd.found() ? 1 : false)
 endif
-systemd = dependency('libsystemd', required: systemdopt)
-cdata.set('USE_SYSTEMD', systemd.found() ? 1 : false)
 
 
 
-- 

Tristan Partin
Neon (https://neon.tech)

From c88f32e8f0801c57f01dd7b9cdbac1d1e749a5ea Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Wed, 17 May 2023 09:48:18 -0500
Subject: [PATCH postgres v1 15/17] Use a better error message in an impossible
 case

Meson validates 'choice' options for us, so technically this case is
impossible. A better error message helps people reading the code
understand what is going on in that branch.
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/meson.build b/meson.build
index d92c57249d..6981429b20 100644
--- a/meson.build
+++ b/meson.build
@@ -1340,7 +1340,7 @@ if uuidopt != 'none'
     uuidfunc = 'uuid_export'
     uuidheader = 'uuid.h'
   else
-    error('huh')
+    error('unknown uuid build option value: @0@'.format(uuidopt))
   endif
 
   if not cc.has_header_symbol(uuidheader, uuidfunc, args: test_c_args, dependencies: uuid)
-- 

Tristan Partin
Neon (https://neon.tech)

From 189d3ac3d5593ce3e475813e4830a29bb4e96f70 Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Wed, 17 May 2023 10:36:52 -0500
Subject: [PATCH postgres v1 16/17] Add Meson overrides

Meson has the ability to do transparent overrides when projects are used
as subprojects. For instance, say I am building a Postgres extension. I
can define Postgres to be a subproject of my extension given the
following wrap file:

[wrap-git]
url = https://git.postgresql.org/git/postgresql.git
revision = master
depth = 1

[provide]
dependency_names = libpq

Then in my extension (root project), I can have the following line
snippet:

libpq = dependency('libpq')

This will tell Meson to transparently compile libpq prior to it
compiling my extension (because I depend on libpq) if libpq isn't found
on the host system.

I have also added overrides for the various public-facing exectuables.
Though I don't expect them to get much usage, might as well go ahead and
override them. They can be used by adding the following line to the
aforementioned wrap file:

program_names = initdb, postgres, ...

Then in my extension (root project), I can find them with the following
line:

initdb = find_program('initdb')

Again, initdb will be compiled transparently as my extension gets built
if and only if initdb isn't found on the host system.
---
 src/backend/meson.build                 | 2 ++
 src/bin/initdb/meson.build              | 2 ++
 src/bin/pg_amcheck/meson.build          | 2 ++
 src/bin/pg_archivecleanup/meson.build   | 2 ++
 src/bin/pg_basebackup/meson.build       | 6 ++++++
 src/bin/pg_checksums/meson.build        | 2 ++
 src/bin/pg_config/meson.build           | 2 ++
 src/bin/pg_controldata/meson.build      | 2 ++
 src/bin/pg_ctl/meson.build              | 2 ++
 src/bin/pg_dump/meson.build             | 6 ++++++
 src/bin/pg_resetwal/meson.build         | 2 ++
 src/bin/pg_rewind/meson.build           | 2 ++
 src/bin/pg_test_fsync/meson.build       | 2 ++
 src/bin/pg_test_timing/meson.build      | 2 ++
 src/bin/pg_upgrade/meson.build          | 2 ++
 src/bin/pg_verifybackup/meson.build     | 2 ++
 src/bin/pg_waldump/meson.build          | 2 ++
 src/bin/pgbench/meson.build             | 2 ++
 src/bin/psql/meson.build                | 2 ++
 src/bin/scripts/meson.build             | 6 ++++--
 src/interfaces/ecpg/preproc/meson.build | 2 ++
 src/interfaces/libpq/meson.build        | 2 ++
 22 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/src/backend/meson.build b/src/backend/meson.build
index ccfc382fcf..ac2f66d920 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -147,6 +147,8 @@ postgres = executable('postgres',
 
 backend_targets += postgres
 
+meson.override_find_program('postgres', postgres)
+
 pg_mod_c_args = cflags_mod
 pg_mod_cpp_args = cxxflags_mod
 pg_mod_link_args = ldflags_sl + ldflags_mod
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
index 49743630aa..12b4918e8b 100644
--- a/src/bin/initdb/meson.build
+++ b/src/bin/initdb/meson.build
@@ -23,6 +23,8 @@ initdb = executable('initdb',
 )
 bin_targets += initdb
 
+meson.override_find_program('initdb', initdb)
+
 tests += {
   'name': 'initdb',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
index 2ade5aba03..8694abbf07 100644
--- a/src/bin/pg_amcheck/meson.build
+++ b/src/bin/pg_amcheck/meson.build
@@ -17,6 +17,8 @@ pg_amcheck = executable('pg_amcheck',
 )
 bin_targets += pg_amcheck
 
+meson.override_find_program('pg_amcheck', pg_amcheck)
+
 tests += {
   'name': 'pg_amcheck',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
index 28349db58b..6eecb42b05 100644
--- a/src/bin/pg_archivecleanup/meson.build
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -17,6 +17,8 @@ pg_archivecleanup = executable('pg_archivecleanup',
 )
 bin_targets += pg_archivecleanup
 
+meson.override_find_program('pg_archivecleanup', pg_archivecleanup)
+
 tests += {
   'name': 'pg_archivecleanup',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
index c684622bfb..589c664163 100644
--- a/src/bin/pg_basebackup/meson.build
+++ b/src/bin/pg_basebackup/meson.build
@@ -37,6 +37,8 @@ pg_basebackup = executable('pg_basebackup',
 )
 bin_targets += pg_basebackup
 
+meson.override_find_program('pg_basebackup', pg_basebackup)
+
 
 pg_receivewal_sources = files(
   'pg_receivewal.c',
@@ -56,6 +58,8 @@ pg_receivewal = executable('pg_receivewal',
 )
 bin_targets += pg_receivewal
 
+meson.override_find_program('pg_receivewal', pg_receivewal)
+
 
 pg_recvlogical_sources = files(
   'pg_recvlogical.c',
@@ -75,6 +79,8 @@ pg_recvlogical = executable('pg_recvlogical',
 )
 bin_targets += pg_recvlogical
 
+meson.override_find_program('pg_recvlogical', pg_recvlogical)
+
 tests += {
   'name': 'pg_basebackup',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
index 5528526094..d54e76ae6c 100644
--- a/src/bin/pg_checksums/meson.build
+++ b/src/bin/pg_checksums/meson.build
@@ -18,6 +18,8 @@ pg_checksums = executable('pg_checksums',
 )
 bin_targets += pg_checksums
 
+meson.override_find_program('pg_checksums', pg_checksums)
+
 tests += {
   'name': 'pg_checksums',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
index 7fd7e94e2d..bea966f63e 100644
--- a/src/bin/pg_config/meson.build
+++ b/src/bin/pg_config/meson.build
@@ -17,6 +17,8 @@ pg_config = executable('pg_config',
 )
 bin_targets += pg_config
 
+meson.override_find_program('pg_config', pg_config)
+
 tests += {
   'name': 'pg_config',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
index 03c9d0ae3e..4521828b1f 100644
--- a/src/bin/pg_controldata/meson.build
+++ b/src/bin/pg_controldata/meson.build
@@ -17,6 +17,8 @@ pg_controldata = executable('pg_controldata',
 )
 bin_targets += pg_controldata
 
+meson.override_find_program('pg_controldata', pg_controldata)
+
 tests += {
   'name': 'pg_controldata',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
index 608a52f9fb..b62519c15f 100644
--- a/src/bin/pg_ctl/meson.build
+++ b/src/bin/pg_ctl/meson.build
@@ -17,6 +17,8 @@ pg_ctl = executable('pg_ctl',
 )
 bin_targets += pg_ctl
 
+meson.override_find_program('pg_ctl', pg_ctl)
+
 tests += {
   'name': 'pg_ctl',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
index 9d59a106f3..ae89758ef6 100644
--- a/src/bin/pg_dump/meson.build
+++ b/src/bin/pg_dump/meson.build
@@ -45,6 +45,8 @@ pg_dump = executable('pg_dump',
 )
 bin_targets += pg_dump
 
+meson.override_find_program('pg_dump', pg_dump)
+
 
 pg_dumpall_sources = files(
   'pg_dumpall.c',
@@ -64,6 +66,8 @@ pg_dumpall = executable('pg_dumpall',
 )
 bin_targets += pg_dumpall
 
+meson.override_find_program('pg_dumpall', pg_dumpall)
+
 
 pg_restore_sources = files(
   'pg_restore.c',
@@ -83,6 +87,8 @@ pg_restore = executable('pg_restore',
 )
 bin_targets += pg_restore
 
+meson.override_find_program('pg_restore', pg_restore)
+
 tests += {
   'name': 'pg_dump',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
index 3f08a819bb..e7d4ab3fa5 100644
--- a/src/bin/pg_resetwal/meson.build
+++ b/src/bin/pg_resetwal/meson.build
@@ -17,6 +17,8 @@ pg_resetwal = executable('pg_resetwal',
 )
 bin_targets += pg_resetwal
 
+meson.override_find_program('pg_resetwal', pg_resetwal)
+
 tests += {
   'name': 'pg_resetwal',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
index fd22818be4..23d698d8fd 100644
--- a/src/bin/pg_rewind/meson.build
+++ b/src/bin/pg_rewind/meson.build
@@ -27,6 +27,8 @@ pg_rewind = executable('pg_rewind',
 )
 bin_targets += pg_rewind
 
+meson.override_find_program('pg_rewind', pg_rewind)
+
 
 tests += {
   'name': 'pg_rewind',
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
index aaf65c310e..3a03156508 100644
--- a/src/bin/pg_test_fsync/meson.build
+++ b/src/bin/pg_test_fsync/meson.build
@@ -17,6 +17,8 @@ pg_test_fsync = executable('pg_test_fsync',
 )
 bin_targets += pg_test_fsync
 
+meson.override_find_program('pg_test_fsync', pg_test_fsync)
+
 tests += {
   'name': 'pg_test_fsync',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
index 02f4a5c641..8a5aa29135 100644
--- a/src/bin/pg_test_timing/meson.build
+++ b/src/bin/pg_test_timing/meson.build
@@ -17,6 +17,8 @@ pg_test_timing = executable('pg_test_timing',
 )
 bin_targets += pg_test_timing
 
+meson.override_find_program('pg_test_timing', pg_test_timing)
+
 tests += {
   'name': 'pg_test_timing',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
index 12a97f84e2..3046b3f471 100644
--- a/src/bin/pg_upgrade/meson.build
+++ b/src/bin/pg_upgrade/meson.build
@@ -32,6 +32,8 @@ pg_upgrade = executable('pg_upgrade',
 )
 bin_targets += pg_upgrade
 
+meson.override_find_program('pg_upgrade', pg_upgrade)
+
 
 tests += {
   'name': 'pg_upgrade',
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
index 9369da1bc6..5b670fd3e5 100644
--- a/src/bin/pg_verifybackup/meson.build
+++ b/src/bin/pg_verifybackup/meson.build
@@ -18,6 +18,8 @@ pg_verifybackup = executable('pg_verifybackup',
 )
 bin_targets += pg_verifybackup
 
+meson.override_find_program('pg_verifybackup', pg_verifybackup)
+
 tests += {
   'name': 'pg_verifybackup',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
index ae674d17c3..c03f212842 100644
--- a/src/bin/pg_waldump/meson.build
+++ b/src/bin/pg_waldump/meson.build
@@ -24,6 +24,8 @@ pg_waldump = executable('pg_waldump',
 )
 bin_targets += pg_waldump
 
+meson.override_find_program('pg_waldump', pg_waldump)
+
 tests += {
   'name': 'pg_waldump',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
index e3c7619cf4..b8b46ef721 100644
--- a/src/bin/pgbench/meson.build
+++ b/src/bin/pgbench/meson.build
@@ -35,6 +35,8 @@ pgbench = executable('pgbench',
 )
 bin_targets += pgbench
 
+meson.override_find_program('pgbench', pgbench)
+
 tests += {
   'name': 'pgbench',
   'sd': meson.current_source_dir(),
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
index a0a4ac7afb..cf20b3a7a4 100644
--- a/src/bin/psql/meson.build
+++ b/src/bin/psql/meson.build
@@ -53,6 +53,8 @@ psql = executable('psql',
 )
 bin_targets += psql
 
+meson.override_find_program('psql', psql)
+
 install_data('psqlrc.sample',
   install_dir: dir_data,
 )
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
index 5b4f8a6f85..fa16814710 100644
--- a/src/bin/scripts/meson.build
+++ b/src/bin/scripts/meson.build
@@ -26,13 +26,15 @@ foreach binary : binaries
       '--FILEDESC', '@0@ - PostgreSQL utility'.format(binary),])
   endif
 
-  binary = executable(binary,
+  exe = executable(binary,
     binary_sources,
     link_with: [scripts_common],
     dependencies: [frontend_code, libpq],
     kwargs: default_bin_args,
   )
-  bin_targets += binary
+  bin_targets += exe
+
+  meson.override_find_program(binary, exe)
 endforeach
 
 tests += {
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
index 08d772d261..f7c9f79c81 100644
--- a/src/interfaces/ecpg/preproc/meson.build
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -110,4 +110,6 @@ ecpg_exe = executable('ecpg',
 )
 ecpg_targets += ecpg_exe
 
+meson.override_find_program('ecpg', ecpg_exe)
+
 subdir('po', if_found: libintl)
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 80e6a15adf..6d18970e81 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -84,6 +84,8 @@ libpq = declare_dependency(
   include_directories: [include_directories('.')]
 )
 
+meson.override_dependency('libpq', libpq)
+
 pkgconfig.generate(
   name: 'libpq',
   description: 'PostgreSQL libpq library',
-- 

Tristan Partin
Neon (https://neon.tech)

From 5ee13f09e4101904dbc9887bd4844eb5f1cb4fea Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@neon.tech>
Date: Wed, 17 May 2023 10:54:53 -0500
Subject: [PATCH postgres v1 17/17] Remove Meson program options for specifying
 paths

Meson has a built-in way to override paths without polluting project
build options called machine files.

https://mesonbuild.com/Machine-files.html

To summarize, a replacement for these options would look something like
the following:

[binaries]
bison = 'path/to/bison'
flex = 'path/to/flex'

This tells Meson to use the pre-defined paths for the defined binaries.
This process is very similar for how cross builds are done in Meson too.

To use the native.ini file, all someone compiling Postgres has to do is
pass `--native-file native.ini` to `meson setup`.
---
 meson.build               | 30 +++++++++++-----------
 meson_options.txt         | 54 ---------------------------------------
 src/makefiles/meson.build |  2 +-
 src/timezone/meson.build  |  2 +-
 4 files changed, 17 insertions(+), 71 deletions(-)

diff --git a/meson.build b/meson.build
index 6981429b20..6d8e34fc29 100644
--- a/meson.build
+++ b/meson.build
@@ -327,22 +327,22 @@ endif
 ###############################################################
 
 # External programs
-perl = find_program(get_option('PERL'), required: true, native: true)
-python = find_program(get_option('PYTHON'), required: true, native: true)
-flex = find_program(get_option('FLEX'), native: true, version: '>= 2.5.35')
-bison = find_program(get_option('BISON'), native: true, version: '>= 2.3')
-sed = find_program(get_option('SED'), 'sed', native: true)
-prove = find_program(get_option('PROVE'), native: true, required: false)
-tar = find_program(get_option('TAR'), native: true)
-gzip = find_program(get_option('GZIP'), native: true)
-program_lz4 = find_program(get_option('LZ4'), native: true, required: false)
-openssl = find_program(get_option('OPENSSL'), native: true, required: false)
-program_zstd = find_program(get_option('ZSTD'), native: true, required: false)
-dtrace = find_program(get_option('DTRACE'), native: true, required: get_option('dtrace'))
+perl = find_program('perl', required: true, native: true)
+python = find_program('python3', 'python', required: true, native: true)
+flex = find_program('flex', 'win_flex', native: true, version: '>= 2.5.35')
+bison = find_program('bison', 'win_bison', native: true, version: '>= 2.3')
+sed = find_program('sed', native: true)
+prove = find_program('prove', native: true, required: false)
+tar = find_program('tar', native: true)
+gzip = find_program('gzip', native: true)
+program_lz4 = find_program('lz4', native: true, required: false)
+openssl = find_program('openssl', native: true, required: false)
+program_zstd = find_program('zstd', native: true, required: false)
+dtrace = find_program('dtrace', native: true, required: get_option('dtrace'))
 missing = find_program('config/missing', native: true)
 cp = find_program('cp', required: false, native: true)
-xmllint_bin = find_program(get_option('XMLLINT'), native: true, required: false)
-xsltproc_bin = find_program(get_option('XSLTPROC'), native: true, required: false)
+xmllint_bin = find_program('xmllint', native: true, required: false)
+xsltproc_bin = find_program('xlstproc', native: true, required: false)
 
 bison_flags = []
 if bison.found()
@@ -592,7 +592,7 @@ endif
 docs_pdf_opt = get_option('docs_pdf')
 docs_pdf_dep = not_found_dep
 if not docs_pdf_opt.disabled()
-  fop = find_program(get_option('FOP'), native: true, required: docs_pdf_opt)
+  fop = find_program('fop', native: true, required: docs_pdf_opt)
   if xmllint_bin.found() and xsltproc_bin.found() and fop.found()
     docs_pdf_dep = declare_dependency()
   elif docs_pdf_opt.enabled()
diff --git a/meson_options.txt b/meson_options.txt
index e9ac70766a..1760cf05f9 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -155,57 +155,3 @@ option('zlib', type: 'feature', value: 'auto',
 
 option('zstd', type: 'feature', value: 'auto',
   description: 'Enable zstd')
-
-
-# Programs
-
-option('BISON', type: 'array', value: ['bison', 'win_bison'],
-  description: 'Path to bison binary')
-
-option('DTRACE', type: 'string', value: 'dtrace',
-  description: 'Path to dtrace binary')
-
-option('FLEX', type: 'array', value: ['flex', 'win_flex'],
-  description: 'Path to flex binary')
-
-option('FOP', type: 'string', value: 'fop',
-  description: 'Path to fop binary')
-
-option('GZIP', type: 'string', value: 'gzip',
-  description: 'Path to gzip binary')
-
-option('LZ4', type: 'string', value: 'lz4',
-  description: 'Path to lz4 binary')
-
-option('OPENSSL', type: 'string', value: 'openssl',
-  description: 'Path to openssl binary')
-
-option('PERL', type: 'string', value: 'perl',
-  description: 'Path to perl binary')
-
-option('PROVE', type: 'string', value: 'prove',
-  description: 'Path to prove binary')
-
-option('PYTHON', type: 'array', value: ['python3', 'python'],
-  description: 'Path to python binary')
-
-option('SED', type: 'string', value: 'gsed',
-  description: 'Path to sed binary')
-
-option('STRIP', type: 'string', value: 'strip',
-  description: 'Path to strip binary, used for PGXS emulation')
-
-option('TAR', type: 'string', value: 'tar',
-  description: 'Path to tar binary')
-
-option('XMLLINT', type: 'string', value: 'xmllint',
-  description: 'Path to xmllint binary')
-
-option('XSLTPROC', type: 'string', value: 'xsltproc',
-  description: 'Path to xsltproc binary')
-
-option('ZSTD', type: 'string', value: 'zstd',
-  description: 'Path to zstd binary')
-
-option('ZIC', type: 'string', value: 'zic',
-  description: 'Path to zic binary, when cross-compiling')
diff --git a/src/makefiles/meson.build b/src/makefiles/meson.build
index 13045cbd6e..b8ec848d74 100644
--- a/src/makefiles/meson.build
+++ b/src/makefiles/meson.build
@@ -5,7 +5,7 @@
 
 
 # Emulation of PGAC_CHECK_STRIP
-strip_bin = find_program(get_option('STRIP'), required: false, native: true)
+strip_bin = find_program('strip', required: false, native: true)
 strip_cmd = strip_bin.found() ? [strip_bin.path()] : [':']
 
 working_strip = false
diff --git a/src/timezone/meson.build b/src/timezone/meson.build
index 7b85a01c6b..8f6edb5110 100644
--- a/src/timezone/meson.build
+++ b/src/timezone/meson.build
@@ -28,7 +28,7 @@ if get_option('system_tzdata') == ''
   # build our zic. But for that we'd need to run a good chunk of the configure
   # tests both natively and cross. Unclear if it's worth it.
   if meson.is_cross_build()
-    zic = find_program(get_option('ZIC'), native: true, required: true)
+    zic = find_program('zic', native: true, required: true)
   else
     if host_system == 'windows'
       zic_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
-- 

Tristan Partin
Neon (https://neon.tech)

Reply via email to