# 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 + ['--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_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