v10-0002-meson-Test-building-extensions-by-using-postgres.patch
text/x-patch
Filename: v10-0002-meson-Test-building-extensions-by-using-postgres.patch
Type: text/x-patch
Part: 1
Message:
Re: meson vs. llvm bitcode files
Patch
Format: format-patch
Series: patch v10-0002
Subject: meson: Test building extensions by using postgresql-extension.pc
| File | + | − |
|---|---|---|
| contrib/amcheck/meson.build | 7 | 0 |
| contrib/amcheck/meson-test.build | 31 | 0 |
| contrib/auth_delay/meson.build | 7 | 0 |
| contrib/auth_delay/meson-test.build | 20 | 0 |
| contrib/postgres_fdw/meson.build | 7 | 0 |
| contrib/postgres_fdw/meson-test.build | 33 | 0 |
| meson.build | 36 | 0 |
| src/tools/test_meson_extensions | 86 | 0 |
From 3beef69525528883631125935b570322b50801cf Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavuz81@gmail.com>
Date: Thu, 27 Feb 2025 17:45:31 +0300
Subject: [PATCH v10 2/7] 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 <andres@anarazel.de>
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Discussion: https://postgr.es/m/206b001d-1884-4081-bd02-bed5c92f02ba%40eisentraut.org
---
contrib/amcheck/meson-test.build | 31 ++++++++++
contrib/amcheck/meson.build | 7 +++
contrib/auth_delay/meson-test.build | 20 +++++++
contrib/auth_delay/meson.build | 7 +++
contrib/postgres_fdw/meson-test.build | 33 ++++++++++
contrib/postgres_fdw/meson.build | 7 +++
meson.build | 36 +++++++++++
src/tools/test_meson_extensions | 86 +++++++++++++++++++++++++++
8 files changed, 227 insertions(+)
create mode 100644 contrib/amcheck/meson-test.build
create mode 100644 contrib/auth_delay/meson-test.build
create mode 100644 contrib/postgres_fdw/meson-test.build
create mode 100644 src/tools/test_meson_extensions
diff --git a/contrib/amcheck/meson-test.build b/contrib/amcheck/meson-test.build
new file mode 100644
index 00000000000..5478cdacfd9
--- /dev/null
+++ b/contrib/amcheck/meson-test.build
@@ -0,0 +1,31 @@
+# Copyright (c) 2022-2025, PostgreSQL Global Development Group
+
+project('amcheck', 'c')
+
+# This file will be moved to another directory during testing. By using
+# 'meson_source_dir', we ensure that the correct Meson source directory is
+# used.
+amcheck_path = get_option('meson_source_dir')
+
+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/contrib/amcheck/meson.build b/contrib/amcheck/meson.build
index d5137ef691d..4952feebb8c 100644
--- a/contrib/amcheck/meson.build
+++ b/contrib/amcheck/meson.build
@@ -53,3 +53,10 @@ tests += {
],
},
}
+
+meson_extension_tests += {
+ 'name': 'amcheck',
+ 'kind': 'pkg_config',
+ 'sd': meson.current_source_dir(),
+ 'input': files('meson-test.build'),
+}
diff --git a/contrib/auth_delay/meson-test.build b/contrib/auth_delay/meson-test.build
new file mode 100644
index 00000000000..79fa11a2a6f
--- /dev/null
+++ b/contrib/auth_delay/meson-test.build
@@ -0,0 +1,20 @@
+# Copyright (c) 2022-2025, PostgreSQL Global Development Group
+
+project('auth_delay', 'c')
+
+# This file will be moved to another directory during testing. By using
+# 'meson_source_dir', we ensure that the correct Meson source directory is
+# used.
+auth_delay_path = get_option('meson_source_dir')
+
+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/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build
index 21192992a84..a3286bcf3ff 100644
--- a/contrib/auth_delay/meson.build
+++ b/contrib/auth_delay/meson.build
@@ -15,3 +15,10 @@ auth_delay = shared_module('auth_delay',
kwargs: contrib_mod_args,
)
contrib_targets += auth_delay
+
+meson_extension_tests += {
+ 'name': 'auth_delay',
+ 'kind': 'pkg_config',
+ 'sd': meson.current_source_dir(),
+ 'input': files('meson-test.build'),
+}
\ No newline at end of file
diff --git a/contrib/postgres_fdw/meson-test.build b/contrib/postgres_fdw/meson-test.build
new file mode 100644
index 00000000000..cb78d482e6c
--- /dev/null
+++ b/contrib/postgres_fdw/meson-test.build
@@ -0,0 +1,33 @@
+# Copyright (c) 2022-2025, PostgreSQL Global Development Group
+
+project('auth_delay', 'c')
+
+# This file will be moved to another directory during testing. By using
+# 'meson_source_dir', we ensure that the correct Meson source directory is
+# used.
+postgres_fdw_path = get_option('meson_source_dir')
+
+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/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build
index 3e2ed06b766..9a50aaba07a 100644
--- a/contrib/postgres_fdw/meson.build
+++ b/contrib/postgres_fdw/meson.build
@@ -55,3 +55,10 @@ tests += {
],
},
}
+
+meson_extension_tests += {
+ 'name': 'postgres_fdw',
+ 'kind': 'pkg_config',
+ 'sd': meson.current_source_dir(),
+ 'input': files('meson-test.build'),
+}
diff --git a/meson.build b/meson.build
index 10cdd26cc2a..902ec60a74e 100644
--- a/meson.build
+++ b/meson.build
@@ -3268,6 +3268,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
@@ -3824,6 +3825,41 @@ sys.exit(sp.returncode)
suite: ['setup'])
+# pkgconfig is not available on Windows, so skip it.
+if host_machine.system() != 'windows'
+ # 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/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.full_path(),
+ '--meson_args', meson_args,
+ '--input', test['input'],
+ '--test_source_dir', test['sd'],
+ '--test_dir', test_result_dir / 'meson_extensions' / test['name'],
+ '--builddir', meson.project_build_root(),
+ '--pkg_conf_path', get_option('pkg_config_path'),
+ '--',
+ cc.cmd_array(),
+ ],
+ suite: test_group,
+ )
+
+ endforeach
+endif
###############################################################
# Test Generation
diff --git a/src/tools/test_meson_extensions b/src/tools/test_meson_extensions
new file mode 100644
index 00000000000..02c0e1c2d92
--- /dev/null
+++ b/src/tools/test_meson_extensions
@@ -0,0 +1,86 @@
+#!/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('--input', help='input meson-test.build file',
+ type=str, required=True)
+parser.add_argument('--test_dir', help='test directory',
+ type=str, required=True)
+parser.add_argument('--test_source_dir', help='test source 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)
+input = args.input
+test_dir = args.test_dir
+test_source_dir = args.test_source_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):
+ # Remove duplicates based on basename as there could be a mix of both full
+ # paths and bare binary names.
+ words = [os.path.basename(word) for word in 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)
+
+ test_out_dir = 'build'
+ test_args = f'-Dmeson_source_dir={test_source_dir}'
+
+ 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'])
+
+ # Copy input file to test directory and rename it as a meson.build
+ if os.path.exists(test_dir):
+ shutil.rmtree(test_dir)
+ os.makedirs(test_dir)
+ shutil.copyfile(input, os.path.join(test_dir, 'meson.build'))
+
+ # Put meson_options.txt to the test_dir so that we can pass
+ # meson_source_dir argument
+ with open(os.path.join(test_dir, 'meson_options.txt'), 'w') as f:
+ f.write("option('meson_source_dir', type: 'string', value: '',\n"
+ " description: 'Actual source directory of the meson-test.build file')\n")
+
+ if meson_args:
+ meson_setup_command = [meson_bin, meson_args, 'setup', test_args, test_out_dir]
+ else:
+ meson_setup_command = [meson_bin, 'setup', test_args, test_out_dir]
+
+ meson_compile_command = ['meson', 'compile', '-C', test_out_dir, '-v']
+
+ subprocess.run(meson_setup_command, env=env, cwd=test_dir, check=True)
+ subprocess.run(meson_compile_command, cwd=test_dir, check=True)
+
+run_tests(os.path.join(build_dir, 'meson-uninstalled'),
+ message='Testing postgresql-extension-warnings-uninstalled')
--
2.47.3