On Sat Jan 3, 2026 at 5:49 AM CET, Tristan Partin wrote:
On Fri Jan 2, 2026 at 10:06 AM CST, Jelte Fennema-Nio wrote:
On Fri Nov 7, 2025 at 5:29 PM CET, Tristan Partin wrote:
Great idea. I need to re-spin the patch anyway after a discussion with
Jelte at NYC. I'll be sure to add this as well.
I took the liberty of updating the patch to include the g++ fallback and
simplify the check a little bit (I seem to remember that that was what
we discussed in NYC).
Never saw this email, but here is a little bit cleaner patch. Sorry for
taking a long time to follow up!
I like a lot better how you default to g++. Here's a version of yours
with a few small "improvements" from my last version:
1. Removal of the unnecessary "and not llvmopt.disabled()" check
2. Replacement of a an additional recenlty added llvm.found() check with
have_cpp
3. Default to g++ instead of c++. I know I said I liked the c++ better,
and I still do, but it seems better to align with autoconf for now
and then change both of these later if we want to.
From 2e6de2426265873c720e963bba639e26ea38b99c Mon Sep 17 00:00:00 2001
From: Tristan Partin <[email protected]>
Date: Wed, 16 Apr 2025 20:25:21 -0500
Subject: [PATCH v5] Decouple C++ support in Meson's PGXS from LLVM enablement
This is important for Postgres extensions that are written in C++, such
as pg_duckdb, which uses PGXS as the build system currently. In the
autotools build, C++ is not coupled to LLVM. If the autotools build is
configured without --with-llvm, the C++ compiler and the various flags
get persisted into the Makefile.global.
Signed-off-by: Tristan Partin <[email protected]>
---
meson.build | 29 ++++++++++++++++++-----------
src/include/meson.build | 8 +++++++-
src/makefiles/meson.build | 4 +---
3 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/meson.build b/meson.build
index 467f7f005a6..4c158fd3ca8 100644
--- a/meson.build
+++ b/meson.build
@@ -41,6 +41,10 @@ build_system = build_machine.system()
host_cpu = host_machine.cpu_family()
cc = meson.get_compiler('c')
+have_cpp = add_languages('cpp', required: false, native: false)
+if have_cpp
+ cpp = meson.get_compiler('cpp')
+endif
not_found_dep = dependency('', required: false)
thread_dep = dependency('threads')
@@ -836,15 +840,13 @@ endif
llvmopt = get_option('llvm')
llvm = not_found_dep
-if add_languages('cpp', required: llvmopt, native: false)
+if have_cpp
llvm = dependency('llvm', version: '>=14', method: 'config-tool', required: llvmopt)
if llvm.found()
cdata.set('USE_LLVM', 1)
- cpp = meson.get_compiler('cpp')
-
llvm_binpath = llvm.get_variable(configtool: 'bindir')
ccache = find_program('ccache', native: true, required: false)
@@ -853,8 +855,13 @@ if add_languages('cpp', required: llvmopt, native: false)
# find via PATH, too.
clang = find_program(llvm_binpath / 'clang', 'clang', required: true)
endif
-elif llvmopt.auto()
- message('llvm requires a C++ compiler')
+else
+ msg = 'llvm requires a C++ compiler'
+ if llvmopt.auto()
+ message(msg)
+ elif llvmopt.enabled()
+ error(msg)
+ endif
endif
@@ -1916,7 +1923,7 @@ endforeach
# We need to repeat the test for C++ because gcc and clang prefer different
# format archetypes.
-if llvm.found()
+if have_cpp
attrib_error_args = cpp.get_supported_arguments('-Werror=format', '-Werror=ignored-attributes')
foreach a : printf_attributes
if cpp.compiles(testsrc.format(a),
@@ -2083,7 +2090,7 @@ common_functional_flags = [
]
cflags += cc.get_supported_arguments(common_functional_flags)
-if llvm.found()
+if have_cpp
cxxflags += cpp.get_supported_arguments(common_functional_flags)
endif
@@ -2107,7 +2114,7 @@ common_warning_flags = [
]
cflags_warn += cc.get_supported_arguments(common_warning_flags)
-if llvm.found()
+if have_cpp
cxxflags_warn += cpp.get_supported_arguments(common_warning_flags)
endif
@@ -2161,7 +2168,7 @@ foreach w : negative_warning_flags
if cc.has_argument('-W' + w)
cflags_warn += '-Wno-' + w
endif
- if llvm.found() and cpp.has_argument('-W' + w)
+ if have_cpp and cpp.has_argument('-W' + w)
cxxflags_warn += '-Wno-' + w
endif
endforeach
@@ -2229,7 +2236,7 @@ elif optimization == 's'
endif
cflags_builtin = cc.get_supported_arguments(common_builtin_flags)
-if llvm.found()
+if have_cpp
cxxflags_builtin = cpp.get_supported_arguments(common_builtin_flags)
endif
@@ -3950,7 +3957,7 @@ summary(
section: 'Compiler Flags',
)
-if llvm.found()
+if have_cpp
summary(
{
'C++ compiler': '@0@ @1@'.format(cpp.get_id(), cpp.version()),
diff --git a/src/include/meson.build b/src/include/meson.build
index d9c7b709330..32f276bd31e 100644
--- a/src/include/meson.build
+++ b/src/include/meson.build
@@ -36,9 +36,15 @@ config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man)
var_cc = ' '.join(cc.cmd_array())
var_cpp = ' '.join(cc.cmd_array() + ['-E'])
var_cflags = ' '.join(cflags + cflags_builtin + cflags_warn + get_option('c_args'))
-if llvm.found()
+if have_cpp
+ var_cxx = ' '.join(cpp.cmd_array())
var_cxxflags = ' '.join(cxxflags + cxxflags_builtin + cxxflags_warn + get_option('cpp_args'))
else
+ # Default to 'g++' so PGXS users get a clear "g++ not found" error when
+ # building C++ extensions. Otherwise they'd get a confusing error because no
+ # binary is specified in the build commands and the first flag would be
+ # interpreted as the program.
+ var_cxx = 'c++'
var_cxxflags = ''
endif
var_cppflags = ' '.join(cppflags)
diff --git a/src/makefiles/meson.build b/src/makefiles/meson.build
index 124df2c8582..6f5072081da 100644
--- a/src/makefiles/meson.build
+++ b/src/makefiles/meson.build
@@ -31,7 +31,6 @@ if not working_strip
strip_shared_cmd = [':']
endif
-
pgxs_kv = {
'PACKAGE_URL': pg_url,
'PACKAGE_VERSION': pg_version,
@@ -86,6 +85,7 @@ pgxs_kv = {
'CC': var_cc,
'CPP': var_cpp,
+ 'CXX': var_cxx,
'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
'CPPFLAGS': var_cppflags,
@@ -122,13 +122,11 @@ pgxs_kv = {
if llvm.found()
pgxs_kv += {
'CLANG': clang.full_path(),
- 'CXX': ' '.join(cpp.cmd_array()),
'LLVM_BINPATH': llvm_binpath,
}
else
pgxs_kv += {
'CLANG': '',
- 'CXX': '',
'LLVM_BINPATH': '',
}
endif
base-commit: 094b61ce3ebbb1258675cb9b4eca9198628e2177
--
2.52.0