postgresql/src/makefiles/meson.build

263 lines
6.7 KiB
Meson

# Copyright (c) 2022-2023, 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 + ['-x']
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_thread_safety': 'yes',
'enable_rpath': get_option('rpath') ? 'yes' : 'no',
'enable_nls': libintl.found() ? '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_UNROLL_LOOPS': ' '.join(unroll_loops_cflags),
'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags),
'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', '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