postgresql/src/makefiles/meson.build

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

265 lines
6.8 KiB
Meson
Raw Normal View History

# Copyright (c) 2022-2024, PostgreSQL Global Development Group
### Compute pgxs_data, used in src/meson.build to generate Makefile.global
### etc, that's complete enough for PGXS to work.
# Emulation of PGAC_CHECK_STRIP
strip_bin = find_program(get_option('STRIP'), required: false, native: true)
strip_cmd = strip_bin.found() ? [strip_bin.path()] : [':']
working_strip = false
if strip_bin.found()
strip_version = run_command(strip_bin, '-V', check: false)
if strip_version.returncode() == 0 and (
strip_version.stdout().contains('GNU strip') or
strip_version.stderr().contains('GNU strip'))
working_strip = true
strip_static_cmd = strip_cmd + ['--strip-unneeded']
strip_shared_cmd = strip_cmd + ['--strip-unneeded']
elif host_system == 'darwin'
working_strip = true
strip_static_cmd = strip_cmd + ['-x']
strip_shared_cmd = strip_cmd + ['-x']
endif
endif
if not working_strip
strip_cmd = [':']
strip_static_cmd = [':']
strip_shared_cmd = [':']
endif
pgxs_kv = {
'PACKAGE_URL': pg_url,
'PACKAGE_VERSION': pg_version,
'PG_MAJORVERSION': pg_version_major,
'PG_VERSION_NUM': pg_version_num,
'configure_input': 'meson',
'vpath_build': 'yes',
'autodepend': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
'host_cpu': host_cpu,
'host': '@0@-@1@'.format(host_cpu, host_system),
'host_os': host_system,
'build_os': build_machine.system(),
'PORTNAME': portname,
'PG_SYSROOT': pg_sysroot,
'abs_top_builddir': meson.build_root(),
'abs_top_srcdir': meson.source_root(),
'enable_rpath': get_option('rpath') ? 'yes' : 'no',
'enable_nls': libintl.found() ? 'yes' : 'no',
Add backend support for injection points Injection points are a new facility that makes possible for developers to run custom code in pre-defined code paths. Its goal is to provide ways to design and run advanced tests, for cases like: - Race conditions, where processes need to do actions in a controlled ordered manner. - Forcing a state, like an ERROR, FATAL or even PANIC for OOM, to force recovery, etc. - Arbitrary sleeps. This implements some basics, and there are plans to extend it more in the future depending on what's required. Hence, this commit adds a set of routines in the backend that allows developers to attach, detach and run injection points: - A code path calling an injection point can be declared with the macro INJECTION_POINT(name). - InjectionPointAttach() and InjectionPointDetach() to respectively attach and detach a callback to/from an injection point. An injection point name is registered in a shmem hash table with a library name and a function name, which will be used to load the callback attached to an injection point when its code path is run. Injection point names are just strings, so as an injection point can be declared and run by out-of-core extensions and modules, with callbacks defined in external libraries. This facility is hidden behind a dedicated switch for ./configure and meson, disabled by default. Note that backends use a local cache to store callbacks already loaded, cleaning up their cache if a callback has found to be removed on a best-effort basis. This could be refined further but any tests but what we have here was fine with the tests I've written while implementing these backend APIs. Author: Michael Paquier, with doc suggestions from Ashutosh Bapat. Reviewed-by: Ashutosh Bapat, Nathan Bossart, Álvaro Herrera, Dilip Kumar, Amul Sul, Nazir Bilal Yavuz Discussion: https://postgr.es/m/ZTiV8tn_MIb_H2rE@paquier.xyz
2024-01-22 02:15:50 +01:00
'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no',
'enable_debug': get_option('debug') ? 'yes' : 'no',
'enable_coverage': 'no',
'enable_dtrace': dtrace.found() ? 'yes' : 'no',
'DLSUFFIX': dlsuffix,
'EXEEXT': exesuffix,
'SUN_STUDIO_CC': 'no', # not supported so far
# want the chosen option, rather than the library
'with_ssl' : ssl_library,
'with_uuid': uuidopt,
'default_port': get_option('pgport'),
'with_system_tzdata': get_option('system_tzdata'),
'with_krb_srvnam': get_option('krb_srvnam'),
'krb_srvtab': krb_srvtab,
'STRIP': ' '.join(strip_cmd),
'STRIP_STATIC_LIB': ' '.join(strip_static_cmd),
'STRIP_SHARED_LIB': ' '.join(strip_shared_cmd),
# these seem to be standard these days
'MKDIR_P': 'mkdir -p',
'LN_S': 'ln -s',
# Just always use the install_sh fallback that autoconf uses. Unlikely to
# matter performance-wise for extensions. If it turns out to do, we can
'install_bin': '$(SHELL) $(top_srcdir)/config/install-sh -c',
'CC': var_cc,
'CPP': var_cpp,
'GCC': cc.get_argument_syntax() == 'gcc' ? 'yes' : 'no',
'CPPFLAGS': var_cppflags,
'CFLAGS': var_cflags,
'CXXFLAGS': var_cxxflags,
'CFLAGS_SL': var_cflags_sl,
'CFLAGS_SL_MODULE': ' '.join(cflags_mod),
'CXXFLAGS_SL_MODULE': ' '.join(cxxflags_mod),
'PERMIT_DECLARATION_AFTER_STATEMENT':
' '.join(cflags_no_decl_after_statement),
'CFLAGS_CRC': ' '.join(cflags_crc),
'CFLAGS_POPCNT': ' '.join(cflags_popcnt),
'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
'CFLAGS_XSAVE': ' '.join(cflags_xsave),
'LDFLAGS': var_ldflags,
'LDFLAGS_EX': var_ldflags_ex,
'LDFLAGS_EX_BE':
' '.join(cc.get_supported_link_arguments('-Wl,--export-dynamic')),
'LDFLAGS_SL': var_ldflags_sl,
# TODO: requires bitcode generation to be implemented for meson
'BITCODE_CFLAGS': '',
'BITCODE_CXXFLAGS': '',
'BISONFLAGS': ' '.join(bison_flags),
'FLEXFLAGS': ' '.join(flex_flags),
'LIBS': var_libs,
}
if llvm.found()
pgxs_kv += {
'CLANG': clang.path(),
'CXX': ' '.join(cpp.cmd_array()),
'LLVM_BINPATH': llvm_binpath,
}
else
pgxs_kv += {
'CLANG': '',
'CXX': '',
'LLVM_BINPATH': '',
}
endif
pgxs_bins = {
'AR':
find_program(['ar'], native: true, required: false),
'AWK':
find_program(['gawk', 'mawk', 'nawk', 'awk'], native: true, required: false),
'BISON': bison,
'FLEX': flex,
'GZIP': gzip,
'LZ4': program_lz4,
'OPENSSL': openssl,
'PERL': perl,
'PROVE': prove,
'PYTHON': python,
'TAR': tar,
'ZSTD': program_zstd,
'DTRACE': dtrace,
}
pgxs_empty = [
'ICU_CFLAGS', # needs to be added, included by public server headers
# hard to see why we'd need either?
'ZIC',
'TCLSH',
# docs don't seem to be supported by pgxs
'XMLLINT',
'XSLTPROC',
'DBTOEPUB',
'FOP',
# supporting coverage for pgxs-in-meson build doesn't seem worth it
'GENHTML',
'LCOV',
'GCOV',
'MSGFMT_FLAGS',
# translation doesn't appear to be supported by pgxs
'MSGFMT',
'XGETTEXT',
'MSGMERGE',
'WANTED_LANGUAGES',
# Not needed because we don't build the server / PLs with the generated makefile
'LIBOBJS', 'PG_CRC32C_OBJS', 'PG_POPCNT_OBJS', 'TAS',
'DTRACEFLAGS', # only server has dtrace probes
'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp',
'python_additional_libs', 'python_includespec', 'python_libdir', 'python_libspec', 'python_majorversion', 'python_version',
# possible that some of these are referenced explicitly in pgxs makefiles?
# For now not worth it.
'TCL_INCLUDE_SPEC', 'TCL_LIBS', 'TCL_LIB_SPEC', 'TCL_SHARED_BUILD',
'LLVM_CFLAGS', 'LLVM_CPPFLAGS', 'LLVM_CXXFLAGS', 'LLVM_LIBS',
'LDAP_LIBS_BE', 'LDAP_LIBS_FE',
'UUID_LIBS',
'PTHREAD_CFLAGS', 'PTHREAD_LIBS',
'ICU_LIBS',
]
if host_system == 'windows' and cc.get_argument_syntax() != 'msvc'
pgxs_bins += {'WINDRES': windres}
else
pgxs_empty += 'WINDRES'
endif
pgxs_dirs = {
'prefix': get_option('prefix'),
'bindir': '${exec_prefix}' / get_option('bindir'),
'datarootdir': '${prefix}' / get_option('datadir'),
'datadir': '${datarootdir}',
'docdir': '${prefix}' / dir_doc,
'exec_prefix': '${prefix}',
'htmldir': '${docdir}',
'includedir': '${prefix}' / get_option('includedir'),
'libdir': '${exec_prefix}' / get_option('libdir'),
'localedir': '${prefix}' / get_option('localedir'),
'mandir': '${prefix}' / get_option('mandir'),
'sysconfdir': '${prefix}' / get_option('sysconfdir'),
}
pgxs_deps = {
'bonjour': bonjour,
'bsd_auth': bsd_auth,
'gssapi': gssapi,
'icu': icu,
'ldap': ldap,
'libxml': libxml,
'libxslt': libxslt,
'llvm': llvm,
'lz4': lz4,
'nls': libintl,
'pam': pam,
'perl': perl_dep,
'python': python3_dep,
'readline': readline,
'selinux': selinux,
'systemd': systemd,
'tcl': tcl_dep,
'zlib': zlib,
'zstd': zstd,
}
pgxs_cdata = configuration_data(pgxs_kv)
foreach b, p : pgxs_bins
pgxs_cdata.set(b, p.found() ? p.path() : '')
endforeach
foreach pe : pgxs_empty
pgxs_cdata.set(pe, '')
endforeach
foreach d, p : pgxs_dirs
pgxs_cdata.set(d, p)
endforeach
foreach d, v : pgxs_deps
pgxs_cdata.set('with_@0@'.format(d), v.found() ? 'yes' : 'no')
endforeach