mirror of https://github.com/postgres/postgres
Generate a Makefile.global that's complete enough for PGXS to work for some extensions. It is likely that this compatibility layer will not suffice for every extension and not all platforms - we can expand it over time. This allows extensions to use a single buildsystem across all the supported postgres versions. Once all supported PG versions support meson, we can remove the compatibility layer. Reviewed-by: Peter Eisentraut <peter.eisentraut@enterprisedb.com> Discussion: https://postgr.es/m/20221005200710.luvw5evhwf6clig6@awork3.anarazel.depull/112/head
parent
9db49fc5bf
commit
5bdd0cfb91
@ -0,0 +1,260 @@ |
||||
### 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': 'yes', |
||||
'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' : get_option('ssl'), |
||||
'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 |
Loading…
Reference in new issue