1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-22 17:35:35 +03:00

meson: introduce infra to build executables and shared libraries by using dictionary

That is not used yet. It will be used later.
This commit is contained in:
Yu Watanabe 2023-06-23 11:09:10 +09:00
parent 1d21a7bd99
commit c335921e13

View File

@ -2174,6 +2174,9 @@ simple_tests = []
fuzzers = []
simple_fuzzers = []
catalogs = []
modules = [] # nss, pam, and other plugins
executables = []
executables_by_name = {}
# binaries that have --help and are intended for use by humans,
# usually, but not always, installed in /bin.
@ -2355,6 +2358,68 @@ endif
############################################################
executable_template = {
'include_directories' : includes,
'link_with' : libshared,
'install_rpath' : pkglibdir,
'install' : true,
}
generator_template = executable_template + {
'install_dir' : systemgeneratordir,
}
libexec_template = executable_template + {
'install_dir' : libexecdir,
}
executable_additional_kwargs = {
'dependencies' : userspace,
}
nss_template = {
'version' : '2',
'include_directories' : includes,
# Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
'link_args' : ['-z', 'nodelete'],
'link_with' : [
libsystemd_static,
libshared_static,
libbasic,
],
'dependencies' : [
librt,
threads,
],
'install' : true,
'install_tag' : 'nss',
'install_dir' : libdir,
}
pam_template = {
'name_prefix' : '',
'include_directories' : includes,
'link_with' : [
libsystemd_static,
libshared_static,
],
'dependencies' : [
libpam_misc,
libpam,
threads,
],
'install' : true,
'install_tag' : 'pam',
'install_dir' : pamlibdir,
}
module_additional_kwargs = {
'link_args' : ['-shared'],
'dependencies' : userspace,
}
############################################################
# systemd-analyze requires 'libcore'
subdir('src/core')
# systemd-journal-remote requires 'libjournal_core'
@ -2407,6 +2472,51 @@ alias_target('devel', libsystemd_pc, libudev_pc, systemd_pc, udev_pc)
############################################################
foreach dict : executables
name = dict.get('name')
build = true
foreach cond : dict.get('conditions', [])
if conf.get(cond) != 1
build = false
break
endif
endforeach
if not build
continue
endif
kwargs = {}
foreach key, val : dict
if key in ['name', 'dbus', 'public', 'conditions']
continue
endif
kwargs += { key : val }
endforeach
foreach key, val : executable_additional_kwargs
kwargs += { key : [ kwargs.get(key, []), val ]}
endforeach
exe = executable(
name,
kwargs : kwargs,
)
executables_by_name += { name : exe }
if dict.get('build_by_default', true)
if dict.get('dbus', false)
dbus_programs += exe
endif
if dict.get('public', false)
public_programs += exe
endif
endif
endforeach
############################################################
# only static linking apart from libdl, to make sure that the
# module is linked to all libraries that it uses.
test_dlopen = executable(
@ -2477,6 +2587,62 @@ foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
endif
endforeach
foreach dict : modules
name = dict.get('name')
is_nss = name.startswith('nss_')
is_pam = name.startswith('pam_')
build = true
foreach cond : dict.get('conditions', [])
if conf.get(cond) != 1
build = false
break
endif
endforeach
if not build
continue
endif
kwargs = {}
foreach key, val : dict
if key in ['name', 'conditions']
continue
endif
kwargs += { key : val }
endforeach
sym = meson.current_source_dir() / '@0@'.format(dict.get('link_depends')[0])
kwargs += {
'link_args' : [
kwargs.get('link_args', []),
'-Wl,--version-script=' + sym,
],
}
foreach key, val : module_additional_kwargs
kwargs += { key : [ kwargs.get(key, []), val ]}
endforeach
lib = shared_library(
name,
kwargs : kwargs,
)
if is_nss
# We cannot use shared_module because it does not support version suffix.
# Unfortunately shared_library insists on creating the symlink…
meson.add_install_script('sh', '-c', 'rm $DESTDIR@0@/lib@1@.so'.format(libdir, name),
install_tag : 'nss')
endif
if want_tests != 'false' and (is_nss or is_pam)
test('dlopen-' + name,
test_dlopen,
# path to dlopen must include a slash
args : lib.full_path(),
depends : lib)
endif
endforeach
############################################################
exe = executable(