postgresql/src/common/meson.build

186 lines
4.7 KiB
Meson

# Copyright (c) 2022-2024, PostgreSQL Global Development Group
common_sources = files(
'archive.c',
'base64.c',
'binaryheap.c',
'blkreftable.c',
'checksum_helper.c',
'compression.c',
'controldata_utils.c',
'encnames.c',
'exec.c',
'file_perm.c',
'file_utils.c',
'hashfn.c',
'ip.c',
'jsonapi.c',
'keywords.c',
'kwlookup.c',
'link-canary.c',
'md5_common.c',
'parse_manifest.c',
'percentrepl.c',
'pg_get_line.c',
'pg_lzcompress.c',
'pg_prng.c',
'pgfnames.c',
'psprintf.c',
'relpath.c',
'rmtree.c',
'saslprep.c',
'scram-common.c',
'string.c',
'stringinfo.c',
'unicode_case.c',
'unicode_category.c',
'unicode_norm.c',
'username.c',
'wait_error.c',
'wchar.c',
)
if ssl.found()
common_sources += files(
'cryptohash_openssl.c',
'hmac_openssl.c',
'protocol_openssl.c',
)
else
common_sources += files(
'cryptohash.c',
'hmac.c',
'md5.c',
'sha1.c',
'sha2.c',
)
endif
common_kwlist = custom_target('kwlist',
input: files('../include/parser/kwlist.h'),
output: 'kwlist_d.h',
depend_files: gen_kwlist_deps,
command: [gen_kwlist_cmd, '--extern'])
generated_sources += common_kwlist
common_sources += common_kwlist
# The code imported from Ryu gets a pass on declaration-after-statement,
# in order to keep it more closely aligned with its upstream.
ryu_sources = files(
'd2s.c',
'f2s.c',
)
ryu_cflags = []
ryu_cflags += cflags_no_decl_after_statement
config_info_sources = files('config_info.c',)
config_info_cflags = [
'-DVAL_CC="@0@"'.format(var_cc),
'-DVAL_CPPFLAGS="@0@"'.format(var_cppflags),
'-DVAL_CFLAGS="@0@"'.format(var_cflags),
'-DVAL_CFLAGS_SL="@0@"'.format(var_cflags_sl),
'-DVAL_LDFLAGS="@0@"'.format(var_ldflags),
'-DVAL_LDFLAGS_EX="@0@"'.format(var_ldflags_ex),
'-DVAL_LDFLAGS_SL="@0@"'.format(var_ldflags_sl),
'-DVAL_LIBS="@0@"'.format(var_libs),
]
# Some files need to be built with different cflags. The different sets are
# defined here.
common_cflags = {
'ryu': ryu_cflags,
'config_info': config_info_cflags,
}
common_sources_cflags = {
'ryu': ryu_sources,
'config_info': config_info_sources
}
# A few files are currently only built for frontend, not server.
# logging.c is excluded from OBJS_FRONTEND_SHLIB (shared library) as
# a matter of policy, because it is not appropriate for general purpose
# libraries such as libpq to report errors directly.
common_sources_frontend_shlib = common_sources
common_sources_frontend_shlib += files(
'fe_memutils.c',
'restricted_token.c',
'sprompt.c',
)
common_sources_frontend_static = common_sources_frontend_shlib
common_sources_frontend_static += files(
'logging.c',
)
# Build pgcommon once for backend, once for use in frontend binaries, and
# once for use in shared libraries
#
# XXX: in most environments we could probably link_whole pgcommon_shlib
# against pgcommon_static, instead of compiling twice.
#
# For the server build of pgcommon, depend on lwlocknames_h and because at
# least cryptohash_openssl.c, hmac_openssl.c depend on it.
# controldata_utils.c depends on wait_event_types_h. That's arguably a
# layering violation, but ...
pgcommon = {}
pgcommon_variants = {
'_srv': internal_lib_args + {
'sources': common_sources + [lwlocknames_h] + [wait_event_types_h],
'dependencies': [backend_common_code],
},
'': default_lib_args + {
'sources': common_sources_frontend_static,
'dependencies': [frontend_common_code],
# Files in libpgcommon.a should use/export the "xxx_private" versions
# of pg_char_to_encoding() and friends.
'c_args': ['-DUSE_PRIVATE_ENCODING_FUNCS'],
},
'_shlib': default_lib_args + {
'pic': true,
'sources': common_sources_frontend_shlib,
'dependencies': [frontend_common_code],
},
}
foreach name, opts : pgcommon_variants
# Build internal static libraries for sets of files that need to be built
# with different cflags
cflag_libs = []
foreach cflagname, sources : common_sources_cflags
if sources.length() == 0
continue
endif
c_args = opts.get('c_args', []) + common_cflags[cflagname]
cflag_libs += static_library('libpgcommon@0@_@1@'.format(name, cflagname),
c_pch: pch_c_h,
include_directories: include_directories('.'),
kwargs: opts + {
'sources': sources,
'c_args': c_args,
'build_by_default': false,
'install': false,
},
)
endforeach
lib = static_library('libpgcommon@0@'.format(name),
link_with: cflag_libs,
c_pch: pch_c_h,
include_directories: include_directories('.'),
kwargs: opts + {
'dependencies': opts['dependencies'] + [ssl],
}
)
pgcommon += {name: lib}
endforeach
common_srv = pgcommon['_srv']
common_shlib = pgcommon['_shlib']
common_static = pgcommon['']
subdir('unicode')