Hi,

On Thu, 5 Sept 2024 at 12:24, Nazir Bilal Yavuz <byavu...@gmail.com> wrote:
>
> I found that Andres shared a patch
> (v17-0021-meson-Add-LLVM-bitcode-emission.patch) a while ago [1].

Andres and I continued to work on that. I think the patches are in
sharable state now and I wanted to hear opinions before proceeding
further. After applying the patches, bitcode files should be installed
into $pkglibdir/bitcode/ directory if the llvm is found.

There are 6 patches attached:

v1-0001-meson-Add-generated-header-stamps:

This patch is trivial. Instead of having targets depending directly on
the generated headers, have them depend on a stamp file. The benefit
of using a stamp file is that it makes ninja.build smaller and meson
setup faster.
----------

v1-0002-meson-Add-postgresql-extension.pc-for-building-extension-libraries:

This patch is for generating postgresql-extension.pc file which can be
used for building extensions libraries.

Normally, there is no need to use this .pc file for generating bitcode
files. However, since there is no clear way to get all include paths
for building bitcode files, this .pc file is later used for this
purpose (by running pkg-config --cflags-only-I
postgresql-extension-uninstalled.pc) [1].
----------

v1-0003-meson-Test-building-extensions-by-using-postgresql-extension.pc:
[Not needed for generating bitcode files]

This is a patch for testing if extensions can be built by using
postgresql-extension.pc. I added that commit as an example of using
postgresql-extension.pc to build extensions.
----------

v1-0004-meson-WIP-Add-docs-for-postgresql-extension.pc: [Not needed
for generating bitcode files]

I added this patch in case we recommend people to use
postgresql-extension.pc to build extension libraries. I am not sure if
we want to do that because there are still TODOs about
postgresql-extension.pc like running test suites. I just wanted to
show my plan, dividing 'Extension Building Infrastructure' into two,
'PGXS' and 'postgresql-extension.pc'.
----------

v1-0005-meson-Add-LLVM-bitcode-emission:

This patch adds required infrastructure to generate bitcode files and
uses postgresql-extension-uninstalled.pc to get include paths for
generating bitcode files [1].
----------

v1-0006-meson-Generate-bitcode-files-of-contrib-extension.patch:

This patch adds manually selected contrib libraries to generate their
bitcode files. These libraries are selected manually, depending on
- If they have SQL callable functions
- If the library functions are short enough (the performance gain from
bitcode files is too minimal compared to the function's run time, so
this type of libraries are omitted).

Any kind of feedback would be appreciated.

--
Regards,
Nazir Bilal Yavuz
Microsoft
From 5f9a9d208bb7e308733b194b75e8b0229797ee4f Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Thu, 24 Oct 2024 07:23:05 -0400
Subject: [PATCH v1 1/6] meson: Add generated header stamps

Otherwise build commands become too long and this has visible effect on
creation time of meson build files.

Author: Andres Freund <and...@anarazel.de>
Author: Nazir Bilal Yavuz <byavu...@gmail.com>
Discussion: https://postgr.es/m/206b001d-1884-4081-bd02-bed5c92f02ba%40eisentraut.org
---
 src/include/meson.build  | 18 ++++++++++++++++++
 src/backend/meson.build  |  2 +-
 src/fe_utils/meson.build |  2 +-
 meson.build              | 16 +++++++++-------
 4 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/src/include/meson.build b/src/include/meson.build
index 2e4b7aa529e..c488a5dc4c9 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -177,3 +177,21 @@ install_subdir('catalog',
 
 # autoconf generates the file there, ensure we get a conflict
 generated_sources_ac += {'src/include': ['stamp-h']}
+
+# Instead of having targets depending directly on the generated headers, have
+# them depend on a stamp files for all of them. Dependencies on headers are
+# implemented as order-only dependencies in meson (later using compiler
+# generated dependencies). The benefit of using a stamp file is that it makes
+# ninja.build smaller and meson setup faster.
+generated_headers_stamp = custom_target('generated-headers-stamp.h',
+  output: 'generated-headers-stamp.h',
+  input: generated_headers,
+  command: stamp_cmd,
+)
+
+generated_backend_headers_stamp = custom_target('generated-backend-headers-stamp.h',
+  output: 'generated-backend-headers-stamp.h',
+  input: generated_backend_headers,
+  depends: generated_headers_stamp,
+  command: stamp_cmd,
+)
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 2b0db214804..7fc649c3ebd 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -169,7 +169,7 @@ backend_mod_code = declare_dependency(
   compile_args: pg_mod_c_args,
   include_directories: postgres_inc,
   link_args: pg_mod_link_args,
-  sources: generated_headers + generated_backend_headers,
+  sources: [generated_backend_headers_stamp],
   dependencies: backend_mod_deps,
 )
 
diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build
index a18cbc939e4..5a9ddb73463 100644
--- a/src/fe_utils/meson.build
+++ b/src/fe_utils/meson.build
@@ -29,7 +29,7 @@ generated_sources += psqlscan
 fe_utils_sources += psqlscan
 
 fe_utils = static_library('libpgfeutils',
-  fe_utils_sources + generated_headers,
+  fe_utils_sources,
   c_pch: pch_postgres_fe_h,
   include_directories: [postgres_inc, libpq_inc],
   c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
diff --git a/meson.build b/meson.build
index 13c13748e5d..9bfa96ad255 100644
--- a/meson.build
+++ b/meson.build
@@ -2973,6 +2973,8 @@ gen_export_kwargs = {
   'install': false,
 }
 
+# command to create stamp files on all OSs
+stamp_cmd = [python, '-c', 'import sys; open(sys.argv[1], "w")', '@OUTPUT0@']
 
 
 ###
@@ -3090,14 +3092,14 @@ subdir('src/port')
 frontend_common_code = declare_dependency(
   compile_args: ['-DFRONTEND'],
   include_directories: [postgres_inc],
-  sources: generated_headers,
+  sources: generated_headers_stamp,
   dependencies: [os_deps, zlib, zstd, lz4],
 )
 
 backend_common_code = declare_dependency(
   compile_args: ['-DBUILDING_DLL'],
   include_directories: [postgres_inc],
-  sources: generated_headers,
+  sources: generated_headers_stamp,
   dependencies: [os_deps, zlib, zstd],
 )
 
@@ -3112,7 +3114,7 @@ shlib_code = declare_dependency(
 frontend_stlib_code = declare_dependency(
   include_directories: [postgres_inc],
   link_with: [common_static, pgport_static],
-  sources: generated_headers,
+  sources: generated_headers_stamp,
   dependencies: [os_deps, libintl],
 )
 
@@ -3120,7 +3122,7 @@ frontend_stlib_code = declare_dependency(
 frontend_shlib_code = declare_dependency(
   include_directories: [postgres_inc],
   link_with: [common_shlib, pgport_shlib],
-  sources: generated_headers,
+  sources: generated_headers_stamp,
   dependencies: [shlib_code, os_deps, libintl],
 )
 
@@ -3130,7 +3132,7 @@ frontend_shlib_code = declare_dependency(
 frontend_no_fe_utils_code = declare_dependency(
   include_directories: [postgres_inc],
   link_with: [common_static, pgport_static],
-  sources: generated_headers,
+  sources: generated_headers_stamp,
   dependencies: [os_deps, libintl],
 )
 
@@ -3156,7 +3158,7 @@ subdir('src/fe_utils')
 frontend_code = declare_dependency(
   include_directories: [postgres_inc],
   link_with: [fe_utils, common_static, pgport_static],
-  sources: generated_headers,
+  sources: generated_headers_stamp,
   dependencies: [os_deps, libintl],
 )
 
@@ -3184,7 +3186,7 @@ backend_code = declare_dependency(
   include_directories: [postgres_inc],
   link_args: ldflags_be,
   link_with: [],
-  sources: generated_headers + generated_backend_headers,
+  sources: [generated_backend_headers_stamp],
   dependencies: os_deps + backend_both_deps + backend_deps,
 )
 
-- 
2.47.2

From 2a7f61ac7951eaf4e64ec61c8559d4df57364694 Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Sat, 27 Aug 2022 09:52:03 -0700
Subject: [PATCH v1 2/6] meson: Add postgresql-extension.pc for building
 extension libraries

This should work with several other buildsystems.

TODO: Docs

Author: Andres Freund <and...@anarazel.de>
Author: Nazir Bilal Yavuz <byavu...@gmail.com>
Discussion: https://postgr.es/m/206b001d-1884-4081-bd02-bed5c92f02ba%40eisentraut.org
---
 src/backend/meson.build | 110 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 110 insertions(+)

diff --git a/src/backend/meson.build b/src/backend/meson.build
index 7fc649c3ebd..9d79d4d058c 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -188,6 +188,116 @@ pg_test_mod_args = pg_mod_args + {
 
 
 
+###############################################################
+# Define a .pc file that can be used to build server extensions
+###############################################################
+
+pg_ext_vars = []
+pg_ext_vars_inst = []
+pg_ext_vars_uninst = []
+
+pg_ext_cflags = pg_mod_c_args + cppflags
+pg_ext_libs = [backend_mod_deps, thread_dep, ldflags, ldflags_mod]
+pg_ext_subdirs = ['']
+
+# Compute directories to add include directories to the .pc files for.
+# This is a bit more complicated due to port/win32 etc.
+i = 0
+foreach incdir : postgres_inc_d
+  if fs.is_absolute(incdir)
+    # an absolute path from -Dextra_include_dirs
+    pg_ext_cflags += '-I@0@'.format(incdir)
+    continue
+  elif incdir.startswith('src/include')
+    subincdir = dir_include_pkg_rel / 'server' / incdir.split('src/include/').get(1, '')
+  else
+    subincdir = ''
+  endif
+  pg_ext_subdirs += subincdir
+
+  # Add directories in source / build dir containing headers to cflags for the
+  # -uninstalled.pc. Older versions of pkg-config complain if a referenced
+  # variable is not defined, so we emit an empty one for the installed .pc
+  # file.
+  pg_ext_vars += [
+    'build_inc@0@=""'.format(i),
+    'src_inc@0@=""'.format(i),
+  ]
+  pg_ext_vars_uninst += [
+    'build_inc@0@=-I${prefix}/@1@'.format(i, incdir),
+    'src_inc@0@=-I${srcdir}/@1@'.format(i, incdir),
+  ]
+  pg_ext_cflags += [
+    '${build_inc@0@}'.format(i),
+    '${src_inc@0@}'.format(i)
+  ]
+
+  i += 1
+endforeach
+
+
+# Extension modules should likely also use -fwrapv etc. But it it's a bit odd
+# to expose it to a .pc file?
+pg_ext_cflags_warn = pg_ext_cflags + cflags_warn
+pg_ext_cflags += cflags
+
+# Directories for extensions to install into
+# XXX: more needed
+pg_ext_vars += 'pkglibdir=${prefix}/@0@'.format(dir_lib_pkg)
+pg_ext_vars += 'dir_mod=${pkglibdir}'
+pg_ext_vars += 'dir_data=${prefix}/@0@'.format(dir_data_extension)
+pg_ext_vars += 'dir_include=${prefix}/@0@'.format(dir_include_extension)
+pg_ext_vars += 'dir_doc=${prefix}/@0@'.format(dir_doc_extension)
+pg_ext_vars += 'dir_bitcode=${prefix}/@0@'.format(dir_bitcode)
+# referenced on some platforms, via mod_link_with_dir
+pg_ext_vars += 'bindir=${prefix}/@0@'.format(dir_bin)
+
+# XXX: Define variables making it easy to define tests, too
+
+# Some platforms need linker flags to link with binary, they are the same
+# between building with meson and .pc file, except that we have have to
+# reference a variable to make it work for both normal and -uninstalled .pc
+# files.
+if mod_link_args_fmt.length() != 0
+  assert(link_with_inst != '')
+  assert(link_with_uninst != '')
+
+  pg_ext_vars_inst += 'mod_link_with=@0@'.format(link_with_inst)
+  pg_ext_vars_uninst += 'mod_link_with=@0@'.format(link_with_uninst)
+
+  foreach el : mod_link_args_fmt
+    pg_ext_libs += el.format('${mod_link_with}')
+  endforeach
+endif
+
+# main .pc to build extensions
+pkgconfig.generate(
+  name: 'postgresql-extension',
+  description: 'PostgreSQL Extension Support',
+  url: pg_url,
+
+  subdirs: pg_ext_subdirs,
+  libraries: pg_ext_libs,
+  extra_cflags: pg_ext_cflags,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+# a .pc depending on the above, but with all our warnings enabled
+pkgconfig.generate(
+  name: 'postgresql-extension-warnings',
+  description: 'PostgreSQL Extension Support - Compiler Warnings',
+  requires: 'postgresql-extension',
+  url: pg_url,
+  extra_cflags: pg_ext_cflags_warn,
+
+  variables: pg_ext_vars + pg_ext_vars_inst,
+  uninstalled_variables: pg_ext_vars + pg_ext_vars_uninst,
+)
+
+
+
 # Shared modules that, on some system, link against the server binary. Only
 # enter these after we defined the server build.
 
-- 
2.47.2

From 5a7e25dd04b6825da5d50c91ccc63526d0fa4d8c Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavu...@gmail.com>
Date: Thu, 27 Feb 2025 17:45:31 +0300
Subject: [PATCH v1 3/6] meson: Test building extensions by using
 postgresql-extension.pc

The 'test_meson_extensions' pyton wrapper is added to run these tests.
It compiles and builds extensions at
${build}/testrun/meson_extensions/${extension_name} path.

The tests for building amcheck, auth_delay and postgres_fdw extensions
are added. These are also examples of how to build extensions by using
postgresql-extension.pc.

Author: Andres Freund <and...@anarazel.de>
Author: Nazir Bilal Yavuz <byavu...@gmail.com>
Discussion: https://postgr.es/m/206b001d-1884-4081-bd02-bed5c92f02ba%40eisentraut.org
---
 src/test/modules/meson.build                  |  1 +
 .../modules/test_meson_extensions/meson.build |  3 +
 .../amcheck/meson.build                       | 28 ++++++++
 .../auth_delay/meson.build                    | 17 +++++
 .../test_pkg_config_extensions/meson.build    | 24 +++++++
 .../postgres_fdw/meson.build                  | 31 ++++++++
 meson.build                                   | 32 +++++++++
 src/tools/ci/test_meson_extensions            | 70 +++++++++++++++++++
 8 files changed, 206 insertions(+)
 create mode 100644 src/test/modules/test_meson_extensions/meson.build
 create mode 100644 src/test/modules/test_meson_extensions/test_pkg_config_extensions/amcheck/meson.build
 create mode 100644 src/test/modules/test_meson_extensions/test_pkg_config_extensions/auth_delay/meson.build
 create mode 100644 src/test/modules/test_meson_extensions/test_pkg_config_extensions/meson.build
 create mode 100644 src/test/modules/test_meson_extensions/test_pkg_config_extensions/postgres_fdw/meson.build
 create mode 100644 src/tools/ci/test_meson_extensions

diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
index 2b057451473..22ec5e969ae 100644
--- a/src/test/modules/meson.build
+++ b/src/test/modules/meson.build
@@ -25,6 +25,7 @@ subdir('test_ginpostinglist')
 subdir('test_integerset')
 subdir('test_json_parser')
 subdir('test_lfind')
+subdir('test_meson_extensions')
 subdir('test_misc')
 subdir('test_oat_hooks')
 subdir('test_parser')
diff --git a/src/test/modules/test_meson_extensions/meson.build b/src/test/modules/test_meson_extensions/meson.build
new file mode 100644
index 00000000000..06cf5d555df
--- /dev/null
+++ b/src/test/modules/test_meson_extensions/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2025, PostgreSQL Global Development Group
+
+subdir('test_pkg_config_extensions')
diff --git a/src/test/modules/test_meson_extensions/test_pkg_config_extensions/amcheck/meson.build b/src/test/modules/test_meson_extensions/test_pkg_config_extensions/amcheck/meson.build
new file mode 100644
index 00000000000..482a543eb86
--- /dev/null
+++ b/src/test/modules/test_meson_extensions/test_pkg_config_extensions/amcheck/meson.build
@@ -0,0 +1,28 @@
+# Copyright (c) 2022-2025, PostgreSQL Global Development Group
+
+project('amcheck', 'c')
+
+amcheck_path = '../../../../../../contrib/amcheck/'
+
+amcheck_sources = files(
+  amcheck_path / 'verify_heapam.c',
+  amcheck_path / 'verify_nbtree.c',
+)
+
+pg_ext = dependency('postgresql-extension-warnings')
+
+amcheck = shared_module('amcheck',
+  amcheck_sources,
+  dependencies: pg_ext,
+  install_dir: pg_ext.get_variable(pkgconfig: 'dir_mod'),
+)
+
+install_data(
+  amcheck_path / 'amcheck.control',
+  amcheck_path / 'amcheck--1.0.sql',
+  amcheck_path / 'amcheck--1.0--1.1.sql',
+  amcheck_path / 'amcheck--1.1--1.2.sql',
+  amcheck_path / 'amcheck--1.2--1.3.sql',
+  amcheck_path / 'amcheck--1.3--1.4.sql',
+  install_dir: pg_ext.get_variable(pkgconfig: 'dir_data'),
+)
diff --git a/src/test/modules/test_meson_extensions/test_pkg_config_extensions/auth_delay/meson.build b/src/test/modules/test_meson_extensions/test_pkg_config_extensions/auth_delay/meson.build
new file mode 100644
index 00000000000..98ad24cc183
--- /dev/null
+++ b/src/test/modules/test_meson_extensions/test_pkg_config_extensions/auth_delay/meson.build
@@ -0,0 +1,17 @@
+# Copyright (c) 2022-2025, PostgreSQL Global Development Group
+
+project('auth_delay', 'c')
+
+auth_delay_path = '../../../../../../contrib/auth_delay/'
+
+auth_delay_sources = files(
+  auth_delay_path / 'auth_delay.c',
+)
+
+pg_ext = dependency('postgresql-extension-warnings')
+
+auth_delay = shared_module('auth_delay',
+  auth_delay_sources,
+  dependencies: pg_ext,
+  install_dir: pg_ext.get_variable(pkgconfig: 'dir_mod'),
+)
diff --git a/src/test/modules/test_meson_extensions/test_pkg_config_extensions/meson.build b/src/test/modules/test_meson_extensions/test_pkg_config_extensions/meson.build
new file mode 100644
index 00000000000..dae94a384a1
--- /dev/null
+++ b/src/test/modules/test_meson_extensions/test_pkg_config_extensions/meson.build
@@ -0,0 +1,24 @@
+# Copyright (c) 2022-2025, PostgreSQL Global Development Group
+
+# pkgconfig is not available on Windows, so skip it.
+if host_machine.system() == 'windows'
+  subdir_done()
+endif
+
+meson_extension_tests += {
+  'name': 'amcheck',
+  'kind': 'pkg_config',
+  'sd': meson.current_source_dir() / 'amcheck',
+}
+
+meson_extension_tests += {
+  'name': 'auth_delay',
+  'kind': 'pkg_config',
+  'sd': meson.current_source_dir() / 'auth_delay',
+}
+
+meson_extension_tests += {
+  'name': 'postgres_fdw',
+  'kind': 'pkg_config',
+  'sd': meson.current_source_dir() / 'postgres_fdw',
+}
diff --git a/src/test/modules/test_meson_extensions/test_pkg_config_extensions/postgres_fdw/meson.build b/src/test/modules/test_meson_extensions/test_pkg_config_extensions/postgres_fdw/meson.build
new file mode 100644
index 00000000000..d49625e0611
--- /dev/null
+++ b/src/test/modules/test_meson_extensions/test_pkg_config_extensions/postgres_fdw/meson.build
@@ -0,0 +1,31 @@
+# Copyright (c) 2022-2025, PostgreSQL Global Development Group
+
+project('auth_delay', 'c')
+
+postgres_fdw_path = '../../../../../../contrib/postgres_fdw/'
+
+postgres_fdw_sources = files(
+  postgres_fdw_path / 'connection.c',
+  postgres_fdw_path / 'deparse.c',
+  postgres_fdw_path / 'option.c',
+  postgres_fdw_path / 'postgres_fdw.c',
+  postgres_fdw_path / 'shippable.c',
+)
+
+pg_ext = dependency('postgresql-extension-warnings')
+libpq = dependency('libpq')
+
+postgres_fdw = shared_module('postgres_fdw',
+  postgres_fdw_sources,
+  dependencies: [pg_ext, libpq],
+  install_dir: pg_ext.get_variable(pkgconfig: 'dir_mod'),
+)
+
+install_data(
+  postgres_fdw_path / 'postgres_fdw.control',
+  postgres_fdw_path / 'postgres_fdw--1.0.sql',
+  postgres_fdw_path / 'postgres_fdw--1.0--1.1.sql',
+  postgres_fdw_path / 'postgres_fdw--1.1--1.2.sql',
+  install_dir: pg_ext.get_variable(pkgconfig: 'dir_data'),
+)
+
diff --git a/meson.build b/meson.build
index 9bfa96ad255..765b7f6a207 100644
--- a/meson.build
+++ b/meson.build
@@ -2891,6 +2891,7 @@ nls_targets = []
 # Define the tests to distribute them to the correct test styles later
 test_deps = []
 tests = []
+meson_extension_tests = []
 
 
 # Default options for targets
@@ -3443,6 +3444,37 @@ sys.exit(sp.returncode)
      suite: ['setup'])
 
 
+# it seems freebsd doesn't use libdir for pkgconfig path
+if host_system == 'freebsd'
+  pkgconf_installdir =  dir_prefix / 'libdata' / 'pkgconfig'
+else
+  pkgconf_installdir = dir_prefix / dir_lib / 'pkgconfig'
+endif
+test_pkg_conf_file = files('src/tools/ci/test_meson_extensions')
+
+foreach test : meson_extension_tests
+  if test['kind'] not in ['pkg_config']
+    error('unknown kind @0@ of test in @1@'.format(test['kind'], test['sd']))
+  endif
+
+  test_group = 'meson_@0@_extensions'.format(test['kind'])
+
+  test(test_group / test['name'],
+      test_pkg_conf_file,
+      args: [
+        '--meson', meson_bin.path(),
+        '--meson_args', meson_args,
+        '--test_dir', test['sd'],
+        '--test_out_dir', test_result_dir / 'meson_extensions' / test['name'],
+        '--builddir', meson.build_root(),
+        '--pkg_conf_path', get_option('pkg_config_path'),
+        '--',
+          cc.cmd_array(),
+        ],
+        suite: test_group,
+      )
+
+endforeach
 
 ###############################################################
 # Test Generation
diff --git a/src/tools/ci/test_meson_extensions b/src/tools/ci/test_meson_extensions
new file mode 100644
index 00000000000..50358121f49
--- /dev/null
+++ b/src/tools/ci/test_meson_extensions
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import shutil
+import subprocess
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--meson', help='path to meson binary',
+                    type=str, required=True)
+parser.add_argument('--meson_args', help='args of meson binary',
+                    type=str, nargs='*', required=False)
+parser.add_argument('--test_dir', help='test source directory',
+                    type=str, required=True)
+parser.add_argument('--test_out_dir', help='test output directory',
+                    type=str, required=True)
+parser.add_argument('--builddir', help='meson build directory',
+                    type=str, required=True)
+parser.add_argument('--pkg_conf_path',
+                    help='PKG_CONF_PATH from surrounding meson build',
+                    type=str, nargs='?', const='', required=False)
+parser.add_argument('c_args', help='c_args from surrounding meson build',
+                     nargs='*')
+
+args = parser.parse_args()
+
+meson_bin = args.meson
+meson_args = ' '.join(args.meson_args)
+test_source_dir = args.test_dir
+test_out_dir = args.test_out_dir
+build_dir = args.builddir
+pkg_conf_path = args.pkg_conf_path
+c_args = ' '.join(args.c_args)
+
+exit_code = 0
+
+def remove_duplicates(duplicate_str):
+    words = duplicate_str.split()
+    return ' '.join(sorted(set(words), key=words.index))
+
+
+def run_tests(pkg_conf_path_local, message):
+    print('\n{}\n{}\n'.format('#' * 60, message), flush=True)
+
+    env = {**os.environ, }
+    env['PKG_CONFIG_PATH'] = '{}:{}:{}'.format(
+      pkg_conf_path_local, pkg_conf_path, env.get('PKG_CONFIG_PATH', ''),
+    ).strip(': ')
+    env['CC'] = '{} {}'.format(
+      c_args, env.get('CC', ''),
+    )
+    env['CC'] = remove_duplicates(env['CC'])
+
+    # Clear the build directory beforehand.
+    if os.path.exists(test_out_dir):
+        shutil.rmtree(test_out_dir)
+
+    if meson_args:
+        meson_setup_command = [meson_bin, meson_args, 'setup', test_out_dir]
+    else:
+        meson_setup_command = [meson_bin, 'setup', test_out_dir]
+
+    meson_compile_command = ['meson', 'compile', '-C', test_out_dir, '-v']
+
+    subprocess.run(meson_setup_command, env=env, cwd=test_source_dir, check=True)
+    subprocess.run(meson_compile_command, cwd=test_source_dir, check=True)
+
+run_tests(os.path.join(build_dir, 'meson-uninstalled'),
+          message='Testing postgresql-extension-warnings-uninstalled')
-- 
2.47.2

From 4b53335dcc2d26a134783f9070929f1b4a639e13 Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavu...@gmail.com>
Date: Thu, 6 Mar 2025 17:46:57 +0300
Subject: [PATCH v1 4/6] meson: [WIP] Add docs for postgresql-extension.pc

Author: Andres Freund <and...@anarazel.de>
Author: Nazir Bilal Yavuz <byavu...@gmail.com>
Discussion: https://postgr.es/m/206b001d-1884-4081-bd02-bed5c92f02ba%40eisentraut.org
---
 doc/src/sgml/acronyms.sgml |   2 +-
 doc/src/sgml/extend.sgml   | 101 +++++++++++++++++++++++--------------
 doc/src/sgml/jit.sgml      |   2 +-
 3 files changed, 66 insertions(+), 39 deletions(-)

diff --git a/doc/src/sgml/acronyms.sgml b/doc/src/sgml/acronyms.sgml
index 58d0d90fece..240db5cb827 100644
--- a/doc/src/sgml/acronyms.sgml
+++ b/doc/src/sgml/acronyms.sgml
@@ -561,7 +561,7 @@
     <term><acronym>PGXS</acronym></term>
     <listitem>
      <para>
-      <link linkend="extend-pgxs"><productname>PostgreSQL</productname> Extension System</link>
+      <link linkend="extend-postgres-pgxs"><productname>PostgreSQL</productname> Extension System</link>
      </para>
     </listitem>
    </varlistentry>
diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgml
index ba492ca27c0..4a8c19b3f53 100644
--- a/doc/src/sgml/extend.sgml
+++ b/doc/src/sgml/extend.sgml
@@ -1421,7 +1421,7 @@ include $(PGXS)
 </programlisting>
 
      This makefile relies on <acronym>PGXS</acronym>, which is described
-     in <xref linkend="extend-pgxs"/>.  The command <literal>make install</literal>
+     in <xref linkend="extend-postgres-pgxs"/>.  The command <literal>make install</literal>
      will install the control and script files into the correct
      directory as reported by <application>pg_config</application>.
     </para>
@@ -1434,21 +1434,26 @@ include $(PGXS)
    </sect2>
   </sect1>
 
-  <sect1 id="extend-pgxs">
+  <sect1 id="extend-postgres">
    <title>Extension Building Infrastructure</title>
 
-   <indexterm zone="extend-pgxs">
-    <primary>pgxs</primary>
-   </indexterm>
-
    <para>
     If you are thinking about distributing your
     <productname>PostgreSQL</productname> extension modules, setting up a
     portable build system for them can be fairly difficult.  Therefore
     the <productname>PostgreSQL</productname> installation provides a build
-    infrastructure for extensions, called <acronym>PGXS</acronym>, so
-    that simple extension modules can be built simply against an
-    already installed server.  <acronym>PGXS</acronym> is mainly intended
+    infrastructure for extensions, called <literal>PGXS</literal>
+    (<xref linkend="extend-postgres-pgxs"/>) and
+    its meson counterpart <literal>postgresql-extension.pc</literal>
+    (<xref linkend="extend-postgres-meson"/>).
+   </para>
+
+  </sect1>
+
+  <sect1 id="extend-postgres-pgxs">
+   <title>PGXS</title>
+
+   <para>  <acronym>PGXS</acronym> is mainly intended
     for extensions that include C code, although it can be used for
     pure-SQL extensions too.  Note that <acronym>PGXS</acronym> is not
     intended to be a universal build system framework that can be used
@@ -1488,7 +1493,7 @@ include $(PGXS)
     Set one of these three variables to specify what is built:
 
     <variablelist>
-     <varlistentry id="extend-pgxs-modules">
+     <varlistentry id="extend-postgres-pgxs-modules">
       <term><varname>MODULES</varname></term>
       <listitem>
        <para>
@@ -1498,7 +1503,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-module-big">
+     <varlistentry id="extend-postgres-pgxs-module-big">
       <term><varname>MODULE_big</varname></term>
       <listitem>
        <para>
@@ -1508,7 +1513,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-program">
+     <varlistentry id="extend-postgres-pgxs-program">
       <term><varname>PROGRAM</varname></term>
       <listitem>
        <para>
@@ -1522,7 +1527,7 @@ include $(PGXS)
     The following variables can also be set:
 
     <variablelist>
-     <varlistentry id="extend-pgxs-extension">
+     <varlistentry id="extend-postgres-pgxs-extension">
       <term><varname>EXTENSION</varname></term>
       <listitem>
        <para>
@@ -1534,7 +1539,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-moduledir">
+     <varlistentry id="extend-postgres-pgxs-moduledir">
       <term><varname>MODULEDIR</varname></term>
       <listitem>
        <para>
@@ -1547,7 +1552,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-data">
+     <varlistentry id="extend-postgres-pgxs-data">
       <term><varname>DATA</varname></term>
       <listitem>
        <para>
@@ -1556,7 +1561,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-data-built">
+     <varlistentry id="extend-postgres-pgxs-data-built">
       <term><varname>DATA_built</varname></term>
       <listitem>
        <para>
@@ -1567,7 +1572,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-data-tsearch">
+     <varlistentry id="extend-postgres-pgxs-data-tsearch">
       <term><varname>DATA_TSEARCH</varname></term>
       <listitem>
        <para>
@@ -1577,7 +1582,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-docs">
+     <varlistentry id="extend-postgres-pgxs-docs">
       <term><varname>DOCS</varname></term>
       <listitem>
        <para>
@@ -1587,7 +1592,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-headers">
+     <varlistentry id="extend-postgres-pgxs-headers">
       <term><varname>HEADERS</varname></term>
       <term><varname>HEADERS_built</varname></term>
       <listitem>
@@ -1603,7 +1608,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-headers-module">
+     <varlistentry id="extend-postgres-pgxs-headers-module">
       <term><varname>HEADERS_$MODULE</varname></term>
       <term><varname>HEADERS_built_$MODULE</varname></term>
       <listitem>
@@ -1629,7 +1634,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-scripts">
+     <varlistentry id="extend-postgres-pgxs-scripts">
       <term><varname>SCRIPTS</varname></term>
       <listitem>
        <para>
@@ -1639,7 +1644,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-scripts-built">
+     <varlistentry id="extend-postgres-pgxs-scripts-built">
       <term><varname>SCRIPTS_built</varname></term>
       <listitem>
        <para>
@@ -1650,7 +1655,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-regress">
+     <varlistentry id="extend-postgres-pgxs-regress">
       <term><varname>REGRESS</varname></term>
       <listitem>
        <para>
@@ -1659,7 +1664,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-regress-opts">
+     <varlistentry id="extend-postgres-pgxs-regress-opts">
       <term><varname>REGRESS_OPTS</varname></term>
       <listitem>
        <para>
@@ -1668,7 +1673,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-isolation">
+     <varlistentry id="extend-postgres-pgxs-isolation">
       <term><varname>ISOLATION</varname></term>
       <listitem>
        <para>
@@ -1677,7 +1682,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-isolation-opts">
+     <varlistentry id="extend-postgres-pgxs-isolation-opts">
       <term><varname>ISOLATION_OPTS</varname></term>
       <listitem>
        <para>
@@ -1687,7 +1692,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-tap-tests">
+     <varlistentry id="extend-postgres-pgxs-tap-tests">
       <term><varname>TAP_TESTS</varname></term>
       <listitem>
        <para>
@@ -1696,7 +1701,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-no-install">
+     <varlistentry id="extend-postgres-pgxs-no-install">
       <term><varname>NO_INSTALL</varname></term>
       <listitem>
        <para>
@@ -1706,7 +1711,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-no-installcheck">
+     <varlistentry id="extend-postgres-pgxs-no-installcheck">
       <term><varname>NO_INSTALLCHECK</varname></term>
       <listitem>
        <para>
@@ -1715,7 +1720,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-extra-clean">
+     <varlistentry id="extend-postgres-pgxs-extra-clean">
       <term><varname>EXTRA_CLEAN</varname></term>
       <listitem>
        <para>
@@ -1724,7 +1729,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-pg-cppflags">
+     <varlistentry id="extend-postgres-pgxs-pg-cppflags">
       <term><varname>PG_CPPFLAGS</varname></term>
       <listitem>
        <para>
@@ -1733,7 +1738,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-pg-cflags">
+     <varlistentry id="extend-postgres-pgxs-pg-cflags">
       <term><varname>PG_CFLAGS</varname></term>
       <listitem>
        <para>
@@ -1742,7 +1747,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-pg-cxxflags">
+     <varlistentry id="extend-postgres-pgxs-pg-cxxflags">
       <term><varname>PG_CXXFLAGS</varname></term>
       <listitem>
        <para>
@@ -1751,7 +1756,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-pg-ldflags">
+     <varlistentry id="extend-postgres-pgxs-pg-ldflags">
       <term><varname>PG_LDFLAGS</varname></term>
       <listitem>
        <para>
@@ -1760,7 +1765,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-pg-libs">
+     <varlistentry id="extend-postgres-pgxs-pg-libs">
       <term><varname>PG_LIBS</varname></term>
       <listitem>
        <para>
@@ -1769,7 +1774,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-shlib-link">
+     <varlistentry id="extend-postgres-pgxs-shlib-link">
       <term><varname>SHLIB_LINK</varname></term>
       <listitem>
        <para>
@@ -1778,7 +1783,7 @@ include $(PGXS)
       </listitem>
      </varlistentry>
 
-     <varlistentry id="extend-pgxs-pg-config">
+     <varlistentry id="extend-postgres-pgxs-pg-config">
       <term><varname>PG_CONFIG</varname></term>
       <listitem>
        <para>
@@ -1894,4 +1899,26 @@ make VPATH=/path/to/extension/source/tree install
    </tip>
   </sect1>
 
+  <sect1 id="extend-postgres-meson">
+   <title>postgresql-extension.pc</title>
+
+   <para>
+    When Postgres is built by using meson, it generates
+    <literal>postgresql-extension.pc</literal> pkg-config file. Extension
+    libraries can use this file like <literal>PGXS</literal>
+    (<xref linkend="extend-postgres-pgxs"/>).
+
+    To use the <literal>postgresql-extension.pc</literal> infrastructure for
+    your extension, you must write a simple meson.build file. In the
+    meson.build file, you need to include the
+    <literal>postgresql-extension.pc</literal> pkg-config file. Here is an
+    example that builds an extension module named isbn_issn, consisting of a
+    shared library containing some C code, an extension control file, an SQL
+    script, an include file (only needed if other modules might need to access
+    the extension functions without going via SQL), and a documentation text
+    file: 
+   </para>
+
+  </sect1>
+
  </chapter>
diff --git a/doc/src/sgml/jit.sgml b/doc/src/sgml/jit.sgml
index 44e18bf1a6f..81a4644a97d 100644
--- a/doc/src/sgml/jit.sgml
+++ b/doc/src/sgml/jit.sgml
@@ -223,7 +223,7 @@ SET
     of types <literal>C</literal> and <literal>internal</literal>, as well as
     operators based on such functions.  To do so for functions in extensions,
     the definitions of those functions need to be made available.
-    When using <link linkend="extend-pgxs">PGXS</link> to build an extension
+    When using <link linkend="extend-postgres-pgxs">PGXS</link> to build an extension
     against a server that has been compiled with LLVM JIT support, the
     relevant files will be built and installed automatically.
    </para>
-- 
2.47.2

From 4deec61ecfbf5b0de304e82d1785d5c26fc28cb3 Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavu...@gmail.com>
Date: Fri, 7 Mar 2025 12:10:58 +0300
Subject: [PATCH v1 5/6] meson: Add LLVM bitcode emission

Bitcode files are installed into $pkglibdir/bitcode/ directory.

Author: Andres Freund <and...@anarazel.de>
Author: Nazir Bilal Yavuz <byavu...@gmail.com>
Discussion: https://postgr.es/m/206b001d-1884-4081-bd02-bed5c92f02ba%40eisentraut.org
---
 src/backend/jit/llvm/bitcode/meson.build | 48 ++++++++++++++++++++++++
 src/backend/jit/llvm/meson.build         | 31 +++++++++------
 src/backend/meson.build                  |  6 +++
 meson.build                              | 21 +++++++++++
 src/tools/irlink                         | 25 ++++++++++++
 5 files changed, 120 insertions(+), 11 deletions(-)
 create mode 100644 src/backend/jit/llvm/bitcode/meson.build
 create mode 100644 src/tools/irlink

diff --git a/src/backend/jit/llvm/bitcode/meson.build b/src/backend/jit/llvm/bitcode/meson.build
new file mode 100644
index 00000000000..577b4ddb210
--- /dev/null
+++ b/src/backend/jit/llvm/bitcode/meson.build
@@ -0,0 +1,48 @@
+# Copyright (c) 2022-2024, PostgreSQL Global Development Group
+#
+# emit LLVM bitcode for JIT inlining
+
+assert(llvm.found())
+
+foreach bitcode_module : bitcode_modules
+  bitcode_targets = []
+  bitcode_obj = bitcode_module['target']
+  bitcode_cflags_local = bitcode_cflags + bitcode_module.get('additional_flags', [])
+
+  if 'name' not in bitcode_module
+    bitcode_name = bitcode_obj.name()
+  else
+    bitcode_name = bitcode_module['name']
+  endif
+
+  foreach srcfile : bitcode_module['srcfiles']
+    if meson.version().version_compare('>=0.59')
+      srcfilename = fs.parent(srcfile) / fs.name(srcfile)
+    else
+      srcfilename = '@0@'.format(srcfile)
+    endif
+    targetname = '@0@_@1@.bc'.format(
+      bitcode_name,
+      srcfilename.underscorify(),
+    )
+    bitcode_targets += custom_target(
+      targetname,
+      depends: [bitcode_module['target']],
+      input: [srcfile],
+      output: targetname,
+      command: [llvm_irgen_command, bitcode_cflags_local],
+      install: true,
+      install_dir: dir_bitcode,
+    )
+  endforeach
+
+  index_name = '@0...@.index.bc'.format(bitcode_name)
+  bitcode_index = custom_target('@0@'.format(bitcode_name),
+    output: index_name,
+    input: bitcode_targets,
+    command: [irlink, '--lto', llvm_lto, '--outdir', '@OUTDIR@', '--index', index_name, '@INPUT@'],
+    install: true,
+    install_dir: dir_bitcode,
+  )
+  backend_targets += bitcode_index
+endforeach
diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index c8e06dfbe35..2dd922e573b 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -42,21 +42,22 @@ backend_targets += llvmjit
 
 # Define a few bits and pieces used here and elsewhere to generate bitcode
 
-llvm_irgen_args = [
-  '-c', '-o', '@OUTPUT@', '@INPUT@',
+llvm_irgen_command = []
+if ccache.found()
+  llvm_irgen_command += ccache
+endif
+
+llvm_irgen_command += [
+  clang,
+  '-c', '-o', '@OUTPUT0@', '@INPUT0@',
   '-flto=thin', '-emit-llvm',
-  '-MD', '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
   '-O2',
   '-Wno-ignored-attributes',
   '-Wno-empty-body',
+  '-Wno-unknown-warning-option',
+  '-Wno-compound-token-split-by-macro',
 ]
-
-if ccache.found()
-  llvm_irgen_command = ccache
-  llvm_irgen_args = [clang.path()] + llvm_irgen_args
-else
-  llvm_irgen_command = clang
-endif
+llvm_irgen_dep_args = ['-MD', '-MQ', '@OUTPUT0@', '-MF', '@DEPFILE@']
 
 
 # XXX: Need to determine proper version of the function cflags for clang
@@ -73,7 +74,7 @@ bitcode_cflags += '-I@SOURCE_ROOT@/src/include'
 # Note this is intentionally not installed to bitcodedir, as it's not for
 # inlining
 llvmjit_types = custom_target('llvmjit_types.bc',
-  command: [llvm_irgen_command] + llvm_irgen_args + bitcode_cflags,
+  command: llvm_irgen_command + llvm_irgen_dep_args + bitcode_cflags,
   input: 'llvmjit_types.c',
   output: 'llvmjit_types.bc',
   depends: [postgres],
@@ -82,3 +83,11 @@ llvmjit_types = custom_target('llvmjit_types.bc',
   depfile: '@basen...@.c.bc.d',
 )
 backend_targets += llvmjit_types
+
+# Figure out -I's needed to build all postgres code, including all its
+# dependencies
+pkg_config = find_program(['pkg-config', 'pkgconf'], required: true)
+r = run_command(pkg_config,
+  ['--cflags-only-I', meson.build_root() / 'meson-uninstalled/postgresql-extension-uninstalled.pc'],
+  check: true)
+bitcode_cflags += r.stdout().split()
diff --git a/src/backend/meson.build b/src/backend/meson.build
index 9d79d4d058c..5fb33660d3d 100644
--- a/src/backend/meson.build
+++ b/src/backend/meson.build
@@ -140,6 +140,12 @@ postgres = executable('postgres',
 
 backend_targets += postgres
 
+bitcode_modules += {
+  'name': 'postgres',
+  'target': postgres_lib,
+  'srcfiles': backend_sources,
+}
+
 pg_mod_c_args = cflags_mod
 pg_mod_cpp_args = cxxflags_mod
 pg_mod_link_args = ldflags_sl + ldflags_mod
diff --git a/meson.build b/meson.build
index 765b7f6a207..a01dbca66d1 100644
--- a/meson.build
+++ b/meson.build
@@ -814,6 +814,8 @@ if add_languages('cpp', required: llvmopt, native: false)
     # Some distros put LLVM and clang in different paths, so fallback to
     # find via PATH, too.
     clang = find_program(llvm_binpath / 'clang', 'clang', required: true)
+    llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
+    irlink = find_program('src/tools/irlink', native: true)
   endif
 elif llvmopt.auto()
   message('llvm requires a C++ compiler')
@@ -2893,6 +2895,11 @@ test_deps = []
 tests = []
 meson_extension_tests = []
 
+# List of object files + source files to generated LLVM IR for inlining.
+# Each element is a hash of:
+# {'target': target, 'srcfiles': ..., 'additional_flags': ...}.
+bitcode_modules = []
+
 
 # Default options for targets
 
@@ -3212,6 +3219,11 @@ subdir('src/interfaces/ecpg/test')
 
 subdir('doc/src/sgml')
 
+# generate bitcode for JIT inlining after giving contrib modules etc a chance
+# to add themselves to bitcode_modules[]
+subdir('src/backend/jit/llvm/bitcode', if_found: llvm)
+
+
 generated_sources_ac += {'': ['GNUmakefile']}
 
 # After processing src/test, add test_install_libs to the testprep_targets
@@ -3847,6 +3859,15 @@ if meson.version().version_compare('>=0.57')
     section: 'Programs',
   )
 
+  if llvm.found()
+    summary(
+      {
+        'clang': clang,
+      },
+      section: 'Programs',
+    )
+  endif
+
   summary(
     {
       'bonjour': bonjour,
diff --git a/src/tools/irlink b/src/tools/irlink
new file mode 100644
index 00000000000..793c0abf91a
--- /dev/null
+++ b/src/tools/irlink
@@ -0,0 +1,25 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import shutil
+import subprocess
+import sys
+
+parser = argparse.ArgumentParser(
+    description='generate PostgreSQL JIT IR module')
+
+parser.add_argument('--index', type=str, required=True)
+parser.add_argument('--lto', type=str, required=True)
+parser.add_argument('--outdir', type=str, required=True)
+parser.add_argument('INPUT', type=str, nargs='+')
+
+args = parser.parse_args()
+
+file_names = [os.path.basename(f) for f in args.INPUT]
+command = [args.lto,
+           '-thinlto', '-thinlto-action=thinlink',
+           '-o', args.index] + file_names
+res = subprocess.run(command, cwd=args.outdir)
+
+exit(res.returncode)
-- 
2.47.2

From 0ee14cab08c778ca49c438ae3d80a695f0d68f84 Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavu...@gmail.com>
Date: Fri, 7 Mar 2025 10:34:34 +0300
Subject: [PATCH v1 6/6] meson: Generate bitcode files of contrib extensions

The extensions which the bitcode files will be generated in are selected
manually.

Author: Andres Freund <and...@anarazel.de>
Author: Nazir Bilal Yavuz <byavu...@gmail.com>
Discussion: https://postgr.es/m/206b001d-1884-4081-bd02-bed5c92f02ba%40eisentraut.org
---
 src/interfaces/libpq/meson.build      |  3 +++
 contrib/bloom/meson.build             |  5 +++++
 contrib/bool_plperl/meson.build       |  9 +++++++++
 contrib/btree_gin/meson.build         |  5 +++++
 contrib/btree_gist/meson.build        |  5 +++++
 contrib/citext/meson.build            |  5 +++++
 contrib/cube/meson.build              | 10 ++++++++++
 contrib/dict_int/meson.build          |  5 +++++
 contrib/dict_xsyn/meson.build         |  5 +++++
 contrib/earthdistance/meson.build     |  6 ++++++
 contrib/fuzzystrmatch/meson.build     |  9 +++++++++
 contrib/hstore/meson.build            |  7 +++++++
 contrib/hstore_plperl/meson.build     | 10 ++++++++++
 contrib/hstore_plpython/meson.build   | 12 ++++++++++++
 contrib/intarray/meson.build          |  5 +++++
 contrib/isn/meson.build               |  5 +++++
 contrib/jsonb_plperl/meson.build      |  8 ++++++++
 contrib/jsonb_plpython/meson.build    | 10 ++++++++++
 contrib/lo/meson.build                |  5 +++++
 contrib/ltree/meson.build             | 10 ++++++++++
 contrib/ltree_plpython/meson.build    | 11 +++++++++++
 contrib/pg_buffercache/meson.build    |  5 +++++
 contrib/pg_freespacemap/meson.build   |  5 +++++
 contrib/pg_logicalinspect/meson.build |  5 +++++
 contrib/pg_surgery/meson.build        |  4 ++++
 contrib/pg_trgm/meson.build           |  5 +++++
 contrib/pgcrypto/meson.build          |  4 ++++
 contrib/seg/meson.build               |  9 +++++++++
 contrib/spi/meson.build               | 20 ++++++++++++++++++++
 contrib/sslinfo/meson.build           |  5 +++++
 contrib/tablefunc/meson.build         |  5 +++++
 contrib/tcn/meson.build               |  5 +++++
 contrib/tsm_system_rows/meson.build   |  5 +++++
 contrib/tsm_system_time/meson.build   |  5 +++++
 contrib/unaccent/meson.build          |  5 +++++
 contrib/uuid-ossp/meson.build         |  5 +++++
 contrib/xml2/meson.build              |  5 +++++
 src/pl/plperl/meson.build             |  1 +
 src/pl/plpython/meson.build           |  1 +
 meson.build                           |  1 +
 40 files changed, 250 insertions(+)

diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index 19f4a52a97a..4742489e0ce 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -50,6 +50,9 @@ export_file = custom_target('libpq.exports',
 libpq_inc = include_directories('.', '../../port')
 libpq_c_args = ['-DSO_MAJOR_VERSION=5']
 
+# libpq-fe.h is needed to generate bitcode for some extensions
+libpq_dir = meson.current_source_dir()
+
 # Not using both_libraries() here as
 # 1) resource files should only be in the shared library
 # 2) we want the .pc file to include a dependency to {pgport,common}_static for
diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build
index 695712a455e..1090c281532 100644
--- a/contrib/bloom/meson.build
+++ b/contrib/bloom/meson.build
@@ -28,6 +28,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': bloom,
+  'srcfiles': bloom_sources,
+}
+
 tests += {
   'name': 'bloom',
   'sd': meson.current_source_dir(),
diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build
index f489d99044c..1758adb7489 100644
--- a/contrib/bool_plperl/meson.build
+++ b/contrib/bool_plperl/meson.build
@@ -37,6 +37,15 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': bool_plperl,
+  'srcfiles': bool_plperl_sources,
+  'additional_flags': [
+    '-I@0@'.format(plperl_dir),
+    perl_ccflags
+  ]
+}
+
 tests += {
   'name': 'bool_plperl',
   'sd': meson.current_source_dir(),
diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build
index b2749f6e669..26d49d005ab 100644
--- a/contrib/btree_gin/meson.build
+++ b/contrib/btree_gin/meson.build
@@ -25,6 +25,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': btree_gin,
+  'srcfiles': btree_gin_sources,
+}
+
 tests += {
   'name': 'btree_gin',
   'sd': meson.current_source_dir(),
diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build
index f4fa9574f1f..2649d5a7ffb 100644
--- a/contrib/btree_gist/meson.build
+++ b/contrib/btree_gist/meson.build
@@ -54,6 +54,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': btree_gist,
+  'srcfiles': btree_gist_sources,
+}
+
 tests += {
   'name': 'btree_gist',
   'sd': meson.current_source_dir(),
diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build
index 7fff34f2368..fa07ff72be4 100644
--- a/contrib/citext/meson.build
+++ b/contrib/citext/meson.build
@@ -30,6 +30,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': citext,
+  'srcfiles': citext_sources,
+}
+
 tests += {
   'name': 'citext',
   'sd': meson.current_source_dir(),
diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build
index fd3c057f469..52bd6a9fb81 100644
--- a/contrib/cube/meson.build
+++ b/contrib/cube/meson.build
@@ -3,6 +3,7 @@
 cube_sources = files(
   'cube.c',
 )
+bc_cube_sources = cube_sources
 
 cube_scan = custom_target('cubescan',
   input: 'cubescan.l',
@@ -48,6 +49,15 @@ install_headers(
   install_dir: dir_include_extension / 'cube',
 )
 
+cube_dir = meson.current_source_dir()
+bitcode_modules += {
+  'target': cube,
+  'srcfiles': bc_cube_sources,
+  'additional_flags': [
+    '-I@0@'.format(cube_dir),
+  ]
+}
+
 tests += {
   'name': 'cube',
   'sd': meson.current_source_dir(),
diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build
index ab41588547b..894c8a9c94d 100644
--- a/contrib/dict_int/meson.build
+++ b/contrib/dict_int/meson.build
@@ -22,6 +22,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': dict_int,
+  'srcfiles': dict_int_sources,
+}
+
 tests += {
   'name': 'dict_int',
   'sd': meson.current_source_dir(),
diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build
index 93f41b1f963..d4bd4a6ef5a 100644
--- a/contrib/dict_xsyn/meson.build
+++ b/contrib/dict_xsyn/meson.build
@@ -29,6 +29,11 @@ install_data(
   }
 )
 
+bitcode_modules += {
+  'target': dict_xsyn,
+  'srcfiles': dict_xsyn_sources,
+}
+
 tests += {
   'name': 'dict_xsyn',
   'sd': meson.current_source_dir(),
diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build
index a5f8d1a3ffa..c101359b118 100644
--- a/contrib/earthdistance/meson.build
+++ b/contrib/earthdistance/meson.build
@@ -24,6 +24,12 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': earthdistance,
+  'srcfiles': earthdistance_sources,
+}
+
+
 tests += {
   'name': 'earthdistance',
   'sd': meson.current_source_dir(),
diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build
index f52daa4ea1c..fc5e88d0c92 100644
--- a/contrib/fuzzystrmatch/meson.build
+++ b/contrib/fuzzystrmatch/meson.build
@@ -5,6 +5,7 @@ fuzzystrmatch_sources = files(
   'dmetaphone.c',
   'fuzzystrmatch.c',
 )
+bc_fuzzystrmatch_sources = fuzzystrmatch_sources
 
 daitch_mokotoff_h = custom_target('daitch_mokotoff',
   input: 'daitch_mokotoff_header.pl',
@@ -35,6 +36,14 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': fuzzystrmatch,
+  'srcfiles': bc_fuzzystrmatch_sources,
+  'additional_flags': [
+    '-I@0@'.format(meson.current_build_dir())
+  ]
+}
+
 tests += {
   'name': 'fuzzystrmatch',
   'sd': meson.current_source_dir(),
diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build
index 39622d1024d..344a620273f 100644
--- a/contrib/hstore/meson.build
+++ b/contrib/hstore/meson.build
@@ -43,6 +43,13 @@ install_headers(
   install_dir: dir_include_extension / 'hstore',
 )
 
+# some libraries include "hstore/hstore.h" instead of "hstore.h"
+hstore_dir_up = join_paths(meson.current_source_dir(), '..')
+bitcode_modules += {
+  'target': hstore,
+  'srcfiles': hstore_sources,
+}
+
 tests += {
   'name': 'hstore',
   'sd': meson.current_source_dir(),
diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build
index 60b8ad23569..b689b55e1c9 100644
--- a/contrib/hstore_plperl/meson.build
+++ b/contrib/hstore_plperl/meson.build
@@ -37,6 +37,16 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': hstore_plperl,
+  'srcfiles': hstore_plperl_sources,
+  'additional_flags': [
+    '-I@0@'.format(hstore_dir_up),
+    '-I@0@'.format(plperl_dir),
+    perl_ccflags,
+  ]
+}
+
 tests += {
   'name': 'hstore_plperl',
   'sd': meson.current_source_dir(),
diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build
index ea8e20a377b..d68de3dc46b 100644
--- a/contrib/hstore_plpython/meson.build
+++ b/contrib/hstore_plpython/meson.build
@@ -30,6 +30,18 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': hstore_plpython,
+  'srcfiles': hstore_plpython_sources,
+  'additional_flags': [
+    '-I@0@'.format(hstore_dir_up),
+    '-DPLPYTHON_LIBNAME="plpython3"',
+    '-I@0@'.format(python3_inc_dir),
+    '-I@0@'.format(plpython_dir),
+    perl_ccflags,
+  ]
+}
+
 hstore_plpython_regress = [
   'hstore_plpython'
 ]
diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build
index fae9add981d..3d7da0c9c9a 100644
--- a/contrib/intarray/meson.build
+++ b/contrib/intarray/meson.build
@@ -33,6 +33,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': intarray,
+  'srcfiles': intarray_sources,
+}
+
 tests += {
   'name': 'intarray',
   'sd': meson.current_source_dir(),
diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build
index fbbeeff01bb..d42473134ea 100644
--- a/contrib/isn/meson.build
+++ b/contrib/isn/meson.build
@@ -29,6 +29,11 @@ install_headers(
   install_dir: dir_include_extension / 'isn',
 )
 
+bitcode_modules += {
+  'target': isn,
+  'srcfiles': isn_sources,
+}
+
 tests += {
   'name': 'isn',
   'sd': meson.current_source_dir(),
diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build
index 95a9a7bc082..febafc73a99 100644
--- a/contrib/jsonb_plperl/meson.build
+++ b/contrib/jsonb_plperl/meson.build
@@ -37,6 +37,14 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': jsonb_plperl,
+  'srcfiles': jsonb_plperl_sources,
+  'additional_flags': [
+    '-I@0@'.format(plperl_dir),
+    perl_ccflags,
+  ]
+}
 
 tests += {
   'name': 'jsonb_plperl',
diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build
index 5fe80483e58..6be92221272 100644
--- a/contrib/jsonb_plpython/meson.build
+++ b/contrib/jsonb_plpython/meson.build
@@ -30,6 +30,16 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': jsonb_plpython,
+  'srcfiles': jsonb_plpython_sources,
+  'additional_flags': [
+    '-DPLPYTHON_LIBNAME="plpython3"',
+    '-I@0@'.format(python3_inc_dir),
+    '-I@0@'.format(plpython_dir),
+  ]
+}
+
 jsonb_plpython_regress = [
   'jsonb_plpython'
 ]
diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build
index 2d78907ba12..1222faa9169 100644
--- a/contrib/lo/meson.build
+++ b/contrib/lo/meson.build
@@ -24,6 +24,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': lo,
+  'srcfiles': lo_sources,
+}
+
 tests += {
   'name': 'lo',
   'sd': meson.current_source_dir(),
diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build
index f9b06302839..cda86935544 100644
--- a/contrib/ltree/meson.build
+++ b/contrib/ltree/meson.build
@@ -41,6 +41,16 @@ install_headers(
   install_dir: dir_include_extension / 'ltree',
 )
 
+ltree_dir = meson.current_source_dir()
+ltree_dir_up = join_paths(ltree_dir, '..')
+bitcode_modules += {
+  'target': ltree,
+  'srcfiles': ltree_sources,
+  'additional_flags': [
+    '-I@0@'.format(ltree_dir)
+  ]
+}
+
 tests += {
   'name': 'ltree',
   'sd': meson.current_source_dir(),
diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build
index a37732c486b..74b285da05c 100644
--- a/contrib/ltree_plpython/meson.build
+++ b/contrib/ltree_plpython/meson.build
@@ -30,6 +30,17 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': ltree_plpython,
+  'srcfiles': ltree_plpython_sources,
+  'additional_flags': [
+    '-I@0@'.format(ltree_dir_up),
+    '-DPLPYTHON_LIBNAME="plpython3"',
+    '-I@0@'.format(python3_inc_dir),
+    '-I@0@'.format(plpython_dir),
+  ]
+}
+
 ltree_plpython_regress = [
   'ltree_plpython'
 ]
diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build
index 12d1fe48717..5385318fdc9 100644
--- a/contrib/pg_buffercache/meson.build
+++ b/contrib/pg_buffercache/meson.build
@@ -27,6 +27,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': pg_buffercache,
+  'srcfiles': pg_buffercache_sources,
+}
+
 tests += {
   'name': 'pg_buffercache',
   'sd': meson.current_source_dir(),
diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build
index ff8eda3580e..120def1ad2e 100644
--- a/contrib/pg_freespacemap/meson.build
+++ b/contrib/pg_freespacemap/meson.build
@@ -25,6 +25,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': pg_freespacemap,
+  'srcfiles': pg_freespacemap_sources,
+}
+
 tests += {
   'name': 'pg_freespacemap',
   'sd': meson.current_source_dir(),
diff --git a/contrib/pg_logicalinspect/meson.build b/contrib/pg_logicalinspect/meson.build
index 5c0528a8c63..1b4f46277ed 100644
--- a/contrib/pg_logicalinspect/meson.build
+++ b/contrib/pg_logicalinspect/meson.build
@@ -22,6 +22,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': pg_logicalinspect,
+  'srcfiles': pg_logicalinspect_sources,
+}
+
 tests += {
   'name': 'pg_logicalinspect',
   'sd': meson.current_source_dir(),
diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build
index c6cfa9c4694..9d7199392c7 100644
--- a/contrib/pg_surgery/meson.build
+++ b/contrib/pg_surgery/meson.build
@@ -22,6 +22,10 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': pg_surgery,
+  'srcfiles': pg_surgery_sources,
+}
 
 tests += {
   'name': 'pg_surgery',
diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build
index a31aa5c574d..408e287172e 100644
--- a/contrib/pg_trgm/meson.build
+++ b/contrib/pg_trgm/meson.build
@@ -32,6 +32,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': pg_trgm,
+  'srcfiles': pg_trgm_sources,
+}
+
 tests += {
   'name': 'pg_trgm',
   'sd': meson.current_source_dir(),
diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build
index 7a4e8e76d64..d6b0559f232 100644
--- a/contrib/pgcrypto/meson.build
+++ b/contrib/pgcrypto/meson.build
@@ -98,6 +98,10 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': pgcrypto,
+  'srcfiles': pgcrypto_sources,
+}
 
 tests += {
   'name': 'pgcrypto',
diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build
index e331e097230..c9ed585e504 100644
--- a/contrib/seg/meson.build
+++ b/contrib/seg/meson.build
@@ -3,6 +3,7 @@
 seg_sources = files(
   'seg.c',
 )
+bc_seg_sources = seg_sources
 
 seg_scan = custom_target('segscan',
   input: 'segscan.l',
@@ -47,6 +48,14 @@ install_headers(
   install_dir: dir_include_extension / 'seg',
 )
 
+bitcode_modules += {
+  'target': seg,
+  'srcfiles': bc_seg_sources,
+  'additional_flags': [
+    '-I@0@'.format(meson.current_source_dir()),
+  ]
+}
+
 tests += {
   'name': 'seg',
   'sd': meson.current_source_dir(),
diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build
index eeab1ab210b..b16c4384bb0 100644
--- a/contrib/spi/meson.build
+++ b/contrib/spi/meson.build
@@ -24,6 +24,11 @@ install_data('autoinc.example',
   kwargs: contrib_doc_args,
 )
 
+bitcode_modules += {
+  'target': autoinc,
+  'srcfiles': autoinc_sources,
+}
+
 
 insert_username_sources = files(
   'insert_username.c',
@@ -51,6 +56,11 @@ install_data('insert_username.example',
   kwargs: contrib_doc_args,
 )
 
+bitcode_modules += {
+  'target': insert_username,
+  'srcfiles': insert_username_sources,
+}
+
 
 moddatetime_sources = files(
   'moddatetime.c',
@@ -78,6 +88,11 @@ install_data('moddatetime.example',
   kwargs: contrib_doc_args,
 )
 
+bitcode_modules += {
+  'target': moddatetime,
+  'srcfiles': moddatetime_sources,
+}
+
 
 # this is needed for the regression tests;
 # comment out if you want a quieter refint package for other uses
@@ -107,3 +122,8 @@ install_data('refint.control', 'refint--1.0.sql',
 install_data('refint.example',
   kwargs: contrib_doc_args,
 )
+
+bitcode_modules += {
+  'target': refint,
+  'srcfiles': refint_sources,
+}
diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build
index 4c513759200..5750d783b92 100644
--- a/contrib/sslinfo/meson.build
+++ b/contrib/sslinfo/meson.build
@@ -29,3 +29,8 @@ install_data(
   'sslinfo.control',
   kwargs: contrib_data_args,
 )
+
+bitcode_modules += {
+  'target': sslinfo,
+  'srcfiles': sslinfo_sources,
+}
diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build
index ee67272ec0a..6c26ffafddf 100644
--- a/contrib/tablefunc/meson.build
+++ b/contrib/tablefunc/meson.build
@@ -22,6 +22,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': tablefunc,
+  'srcfiles': tablefunc_sources,
+}
+
 tests += {
   'name': 'tablefunc',
   'sd': meson.current_source_dir(),
diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build
index 6ffb136af90..df71e8a91f9 100644
--- a/contrib/tcn/meson.build
+++ b/contrib/tcn/meson.build
@@ -22,6 +22,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': tcn,
+  'srcfiles': tcn_sources,
+}
+
 tests += {
   'name': 'tcn',
   'sd': meson.current_source_dir(),
diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build
index b8cece3d80f..1ea74cce949 100644
--- a/contrib/tsm_system_rows/meson.build
+++ b/contrib/tsm_system_rows/meson.build
@@ -22,6 +22,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': tsm_system_rows,
+  'srcfiles': tsm_system_rows_sources,
+}
+
 tests += {
   'name': 'tsm_system_rows',
   'sd': meson.current_source_dir(),
diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build
index 8a143a8f8e6..1f6b98d3ec4 100644
--- a/contrib/tsm_system_time/meson.build
+++ b/contrib/tsm_system_time/meson.build
@@ -22,6 +22,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': tsm_system_time,
+  'srcfiles': tsm_system_time_sources,
+}
+
 tests += {
   'name': 'tsm_system_time',
   'sd': meson.current_source_dir(),
diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build
index 33d4649bae1..1f5d120e3d8 100644
--- a/contrib/unaccent/meson.build
+++ b/contrib/unaccent/meson.build
@@ -28,6 +28,11 @@ install_data(
   install_dir: dir_data / 'tsearch_data'
 )
 
+bitcode_modules += {
+  'target': unaccent,
+  'srcfiles': unaccent_sources,
+}
+
 # XXX: Implement downlo
 tests += {
   'name': 'unaccent',
diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build
index 982f27c085f..8d21bb0a996 100644
--- a/contrib/uuid-ossp/meson.build
+++ b/contrib/uuid-ossp/meson.build
@@ -29,6 +29,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': uuid_ossp,
+  'srcfiles': uuid_ossp_sources,
+}
+
 tests += {
   'name': 'uuid-ossp',
   'sd': meson.current_source_dir(),
diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build
index 08d3c3b8e30..b23a8fe0cd7 100644
--- a/contrib/xml2/meson.build
+++ b/contrib/xml2/meson.build
@@ -32,6 +32,11 @@ install_data(
   kwargs: contrib_data_args,
 )
 
+bitcode_modules += {
+  'target': xml2,
+  'srcfiles': xml2_sources,
+}
+
 tests += {
   'name': 'xml2',
   'sd': meson.current_source_dir(),
diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build
index b463d4d56c5..279277dee73 100644
--- a/src/pl/plperl/meson.build
+++ b/src/pl/plperl/meson.build
@@ -37,6 +37,7 @@ foreach n : ['SPI', 'Util']
   plperl_sources += xs_c
 endforeach
 
+plperl_dir = meson.current_source_dir()
 plperl_inc = include_directories('.')
 
 if host_system == 'windows'
diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build
index 709e5932a93..e2c19771d85 100644
--- a/src/pl/plpython/meson.build
+++ b/src/pl/plpython/meson.build
@@ -29,6 +29,7 @@ plpython_sources += custom_target('spiexceptions.h',
 
 # FIXME: need to duplicate import library ugliness?
 plpython_inc = include_directories('.')
+plpython_dir = meson.current_source_dir()
 
 if host_system == 'windows'
   plpython_sources += rc_lib_gen.process(win32ver_rc, extra_args: [
diff --git a/meson.build b/meson.build
index a01dbca66d1..9e20be4590d 100644
--- a/meson.build
+++ b/meson.build
@@ -1244,6 +1244,7 @@ if not pyopt.disabled()
   python3_inst = pm.find_installation(python.path(), required: pyopt)
   if python3_inst.found()
     python3_dep = python3_inst.dependency(embed: true, required: pyopt)
+    python3_inc_dir = python3_inst.get_variable('INCLUDEPY')
     # Remove this check after we depend on Meson >= 1.1.0
     if not cc.check_header('Python.h', dependencies: python3_dep, required: pyopt, include_directories: postgres_inc)
       python3_dep = not_found_dep
-- 
2.47.2

Reply via email to