1
0
mirror of https://github.com/postgres/postgres.git synced 2026-01-26 09:41:40 +03:00

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.

Author: Tristan Partin <tristan@partin.io>
Author: Jelte Fennema-Nio <postgres@jeltef.nl>
Discussion: https://www.postgresql.org/message-id/flat/D98JHQF7H2A8.VSE3I4CJBTAB%40partin.io
This commit is contained in:
Peter Eisentraut
2026-01-09 10:25:02 +01:00
parent 831bbb9bf5
commit 69d76fb2ab
3 changed files with 26 additions and 14 deletions

View File

@@ -41,6 +41,10 @@ build_system = build_machine.system()
host_cpu = host_machine.cpu_family()
cc = meson.get_compiler('c')
have_cxx = add_languages('cpp', required: false, native: false)
if have_cxx
cxx = 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_cxx
llvm = dependency('llvm', version: '>=14', method: 'config-tool', required: llvmopt)
if llvm.found()
cdata.set('USE_LLVM', 1)
cxx = 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_cxx
attrib_error_args = cxx.get_supported_arguments('-Werror=format', '-Werror=ignored-attributes')
foreach a : printf_attributes
if cxx.compiles(testsrc.format(a),
@@ -2083,7 +2090,7 @@ common_functional_flags = [
]
cflags += cc.get_supported_arguments(common_functional_flags)
if llvm.found()
if have_cxx
cxxflags += cxx.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_cxx
cxxflags_warn += cxx.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 cxx.has_argument('-W' + w)
if have_cxx and cxx.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_cxx
cxxflags_builtin = cxx.get_supported_arguments(common_builtin_flags)
endif
@@ -3950,7 +3957,7 @@ summary(
section: 'Compiler Flags',
)
if llvm.found()
if have_cxx
summary(
{
'C++ compiler': '@0@ @1@'.format(cxx.get_id(), cxx.version()),

View File

@@ -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_cxx
var_cxx = ' '.join(cxx.cmd_array())
var_cxxflags = ' '.join(cxxflags + cxxflags_builtin + cxxflags_warn + get_option('cpp_args'))
else
# Default to 'g++' so that 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 = 'g++'
var_cxxflags = ''
endif
var_cppflags = ' '.join(cppflags)

View File

@@ -86,6 +86,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 +123,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