From be4f22cd3c2bed3d288634df77333ed9646989da Mon Sep 17 00:00:00 2001
From: Tristan Partin <tristan@neon.tech>
Date: Wed, 17 May 2023 10:36:52 -0500
Subject: [PATCH v2 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)

