1
0
Fork 0
knot-resolver/meson.build
Daniel Baumann fbc604e215
Adding upstream version 5.7.5.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-21 13:56:17 +02:00

368 lines
11 KiB
Meson

# SPDX-License-Identifier: GPL-3.0-or-later
project(
'knot-resolver',
['c', 'cpp'],
license: 'GPLv3+',
version: '5.7.5',
default_options: ['c_std=gnu11', 'b_ndebug=true'],
meson_version: '>=0.49',
)
# Unity build
if get_option('unity') != 'off'
error('unity builds are not supported! ' +
'https://gitlab.nic.cz/knot/knot-resolver/issues/460')
endif
message('--- required dependencies ---')
knot_version = '>=3.1'
libknot = dependency('libknot', version: knot_version)
libdnssec = dependency('libdnssec', version: knot_version)
libzscanner = dependency('libzscanner', version: knot_version)
libuv = dependency('libuv', version: '>=1.7')
lmdb = dependency('lmdb', required: false)
if not lmdb.found() # darwin workaround: missing pkgconfig
lmdb = meson.get_compiler('c').find_library('lmdb')
endif
gnutls = dependency('gnutls')
luajit = dependency('luajit')
message('------------------------------')
# Variables
libkres_soversion = 9
libext = '.so'
if host_machine.system() == 'darwin'
libext = '.dylib'
elif host_machine.system() == 'cygwin'
libext = '.dll'
endif
## Paths
prefix = get_option('prefix')
data_dir = prefix / get_option('datadir') / 'knot-resolver'
doc_dir = prefix / get_option('datadir') / 'doc' / 'knot-resolver'
info_dir = prefix / get_option('datadir') / 'info'
examples_dir = doc_dir / 'examples'
etc_dir = prefix / get_option('sysconfdir') / 'knot-resolver'
lib_dir = prefix / get_option('libdir') / 'knot-resolver'
modules_dir = lib_dir / 'kres_modules'
sbin_dir = prefix / get_option('sbindir')
run_dir = '/run' / 'knot-resolver'
systemd_work_dir = prefix / get_option('localstatedir') / 'lib' / 'knot-resolver'
systemd_cache_dir = prefix / get_option('localstatedir') / 'cache' / 'knot-resolver'
systemd_unit_dir = prefix / 'lib' / 'systemd' / 'system'
systemd_tmpfiles_dir = prefix / 'lib' / 'tmpfiles.d'
systemd_sysusers_dir = prefix / 'lib' / 'sysusers.d'
## RPath
# When installing from sources into a non-standard prefix and the library is
# shared/dynamic, we need to set the executables' RPATH so that they can find
# `libkresd`, otherwise running them will fail with dynamic linkage errors
auto_prefixes = ['/', '/usr', '/usr/local']
rpath_opt = get_option('install_rpath')
if (get_option('default_library') == 'static' or
rpath_opt == 'disabled' or
(rpath_opt == 'auto' and prefix in auto_prefixes))
rpath = ''
else
rpath = prefix / get_option('libdir')
endif
## Trust anchors
managed_ta = get_option('managed_ta') == 'enabled'
keyfile_default = etc_dir / get_option('keyfile_default')
if keyfile_default == etc_dir / 'root.keys'
managed_ta = managed_ta or get_option('managed_ta') == 'auto'
endif
install_root_keys = get_option('install_root_keys') == 'enabled'
if get_option('install_root_keys') == 'auto'
install_root_keys = managed_ta
endif
## Root hints
root_hints = etc_dir / get_option('root_hints')
if root_hints == etc_dir / 'root.hints'
install_root_hints = true
else
install_root_hints = false
endif
## Additional options
user = get_option('user')
group = get_option('group')
## Optional dependencies
message('--- optional dependencies ---')
nghttp2 = dependency('libnghttp2', required: false)
openssl = dependency('openssl', required: false)
have_asprintf = meson.get_compiler('c').has_function('asprintf',
prefix: '#define _GNU_SOURCE\n#include <stdio.h>')
### capng
# use empty name to disable the dependency, but still compile the dependent kresd
capng_name = get_option('capng') == 'disabled' ? '' : 'libcap-ng'
capng = dependency(capng_name, required: get_option('capng') == 'enabled')
### sendmmsg
has_sendmmsg = meson.get_compiler('c').has_function('sendmmsg',
prefix: '#define _GNU_SOURCE\n#include <sys/socket.h>')
if get_option('sendmmsg') == 'enabled' and not has_sendmmsg
error('missing compiler function: sendmmsg(), use -Dsendmmsg=disabled')
elif get_option('sendmmsg') == 'auto'
sendmmsg = has_sendmmsg
else
sendmmsg = get_option('sendmmsg') == 'enabled'
endif
### XDP: not configurable - we just check if libknot supports it
xdp = meson.get_compiler('c').has_header('libknot/xdp/xdp.h')
### Systemd
systemd_files = get_option('systemd_files')
libsystemd = dependency('libsystemd', required: systemd_files == 'enabled')
### Allocator
# use empty name to disable the dependency, but still compile the dependent kresd
malloc_name = get_option('malloc') == 'disabled' ? '' : 'jemalloc'
malloc = meson.get_compiler('c').find_library(
malloc_name,
required: get_option('malloc') == 'jemalloc',
#static: false, #TODO: add when bumping meson to >= 0.51;
# static linking would most likely cause issues.
# Fortunately it seems unlikely that dynamic wouldn't be found and static would be.
)
message('---------------------------')
## Compiler args
add_project_arguments(
'-D_GNU_SOURCE',
# Various warnings. Let's use any warning that doesn't "cause problems".
'-Wall',
'-Wformat',
'-Wformat-security',
'-Wtype-limits',
'-Wshadow',
'-Werror=implicit-function-declaration', # Probably messed up includes; implicit functions are evil!
'-Werror=attributes', # Missing cleanup attribute could lead to memory leaks.
'-Wstrict-prototypes', # `void foo();` is basically always a mistake, in our code at least.
'-Wold-style-definition',
'-Wignored-qualifiers',
'-Woverride-init',
'-Wuninitialized',
'-fvisibility=hidden',
'-DHAVE_ASPRINTF=' + have_asprintf.to_int().to_string(),
# libuv handles have aliasing problems; see:
# https://github.com/libuv/libuv/pull/2588/files#diff-04c6e90faac2675aa89e2176d2eec7d8
# https://github.com/libuv/libuv/issues/1230#issuecomment-569030944
# Performance impact in our case seems OK:
# https://gitlab.nic.cz/knot/knot-resolver/-/merge_requests/962#note_147407
'-fno-strict-aliasing',
language: 'c',
)
if meson.get_compiler('c').get_id() == 'gcc'
add_project_arguments(
'-Wno-nonnull-compare', # reasonable to do in assertions
language: 'c',
)
endif
# Files for clang-tidy lint
c_src_lint = files()
# Lists of tests
# These lists are added to from subdir() and finally used in tests/*
unit_tests = [
# [test_name, files(test)]
]
config_tests = [
# [name, files(test)] # or
# [name, files(test), [extra_suites]]
]
integr_tests = [
# [name, test_dir_relative_to_src_root]
]
# kresconfig.h
conf_data = configuration_data()
conf_data.set_quoted('PACKAGE_VERSION', meson.project_version())
conf_data.set_quoted('LIBDIR', lib_dir)
conf_data.set_quoted('ROOTHINTS', root_hints)
conf_data.set_quoted('LIBEXT', libext)
conf_data.set_quoted('OPERATING_SYSTEM', host_machine.system())
conf_data.set_quoted('libzscanner_SONAME',
libzscanner.get_pkgconfig_variable('soname'))
conf_data.set_quoted('libknot_SONAME',
libknot.get_pkgconfig_variable('soname'))
conf_data.set('ENABLE_LIBSYSTEMD', libsystemd.found().to_int())
conf_data.set('ENABLE_SENDMMSG', sendmmsg.to_int())
conf_data.set('ENABLE_XDP', xdp.to_int())
conf_data.set('ENABLE_CAP_NG', capng.found().to_int())
conf_data.set('ENABLE_JEMALLOC', malloc.found().to_int())
conf_data.set('ENABLE_DOH2', nghttp2.found().to_int())
conf_data.set('DBG_ASSERTION_ABORT', get_option('debug').to_int())
if get_option('debug')
conf_data.set('DBG_ASSERTION_FORK', '0')
else
conf_data.set('DBG_ASSERTION_FORK', '(5 * 60 * 1000) /* five minutes */')
endif
kresconfig = configure_file(
output: 'kresconfig.h',
configuration: conf_data,
)
kresconfig_dep = declare_dependency(
sources: kresconfig,
include_directories: include_directories('.'),
)
# Compile
## Dependencies first
subdir('contrib')
subdir('lib')
## Remaining code
subdir('daemon')
subdir('modules')
subdir('utils')
if get_option('bench') == 'enabled'
subdir('bench')
endif
# Tests
subdir('tests')
# Documentation & configs
subdir('doc')
subdir('etc')
# Systemd unit files
if systemd_files != 'disabled'
subdir('systemd')
endif
# Additional files
install_data(
sources: [
'AUTHORS',
'COPYING',
'NEWS',
],
install_dir: doc_dir,
)
# Lint
message('--- lint dependencies ---')
clangtidy = find_program('clang-tidy', required: false)
luacheck = find_program('luacheck', required: false)
message('-------------------------')
if clangtidy.found()
run_target(
'tidy',
command: [
clangtidy,
'-quiet',
'-extra-arg=-Wno-unknown-warning-option', # version in CI is weird in this
'-p', meson.build_root(),
] + c_src_lint
)
endif
if luacheck.found()
run_target(
'luacheck',
command: [
luacheck,
'--codes',
'--formatter', 'TAP',
meson.source_root(),
],
)
endif
# Summary message
# NOTE: ternary operator in format() not supported
# https://github.com/mesonbuild/meson/issues/2404
s_managed_ta = managed_ta ? 'enabled' : 'disabled'
s_install_root_keys = install_root_keys ? 'enabled' : 'disabled'
s_build_client = build_client ? 'enabled' : 'disabled'
s_build_utils = build_utils ? 'enabled' : 'disabled'
s_build_dnstap = build_dnstap ? 'enabled' : 'disabled'
s_build_unit_tests = build_unit_tests ? 'enabled' : 'disabled'
s_build_config_tests = build_config_tests ? 'enabled' : 'disabled'
s_build_extra_tests = build_extra_tests ? 'enabled' : 'disabled'
s_install_kresd_conf = install_kresd_conf ? 'enabled' : 'disabled'
s_sendmmsg = sendmmsg ? 'enabled': 'disabled'
s_xdp = xdp ? 'enabled': 'disabled'
s_openssl = openssl.found() ? 'present': 'missing'
s_capng = capng.found() ? 'enabled': 'disabled'
s_malloc = malloc.found() ? 'jemalloc' : 'libc default'
s_doh2 = nghttp2.found() ? 'enabled': 'disabled'
message('''
======================= SUMMARY =======================
paths
prefix: @0@'''.format(prefix) + '''
lib_dir: @0@'''.format(lib_dir) + '''
sbin_dir: @0@'''.format(sbin_dir) + '''
etc_dir: @0@'''.format(etc_dir) + '''
root.hints: @0@'''.format(root_hints) + '''
trust_anchors
keyfile_default: @0@'''.format(keyfile_default) + '''
managed_ta: @0@'''.format(s_managed_ta) + '''
install_root_keys: @0@'''.format(s_install_root_keys) + '''
systemd:
files: @0@'''.format(systemd_files) + '''
work_dir: @0@'''.format(systemd_work_dir) + '''
cache_dir: @0@'''.format(systemd_cache_dir) + '''
optional components
client: @0@'''.format(s_build_client) + '''
utils: @0@'''.format(s_build_utils) + '''
dnstap: @0@'''.format(s_build_dnstap) + '''
unit_tests: @0@'''.format(s_build_unit_tests) + '''
config_tests: @0@'''.format(s_build_config_tests) + '''
extra_tests: @0@'''.format(s_build_extra_tests) + '''
additional
user: @0@'''.format(user) + '''
group: @0@'''.format(group) + '''
install_kresd_conf: @0@'''.format(s_install_kresd_conf) + '''
sendmmsg: @0@'''.format(s_sendmmsg) + '''
XDP (in libknot): @0@'''.format(s_xdp) + '''
openssl debug: @0@'''.format(s_openssl) + '''
capng: @0@'''.format(s_capng) + '''
malloc: @0@'''.format(s_malloc) + '''
doh2: @0@'''.format(s_doh2) + '''
=======================================================
''')