1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.24.0'
16 libudev_version = '1.6.12'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
29 want_ossfuzz = get_option('oss-fuzz')
30 want_libfuzzer = get_option('llvm-fuzz')
31 if want_ossfuzz and want_libfuzzer
32 error('only one of oss-fuzz and llvm-fuzz can be specified')
34 fuzzer_build = want_ossfuzz or want_libfuzzer
36 #####################################################################
38 # Try to install the git pre-commit hook
39 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
40 if git_hook.returncode() == 0
41 message(git_hook.stdout().strip())
44 #####################################################################
46 if get_option('split-usr') == 'auto'
47 split_usr = run_command('test', '-L', '/bin').returncode() != 0
49 split_usr = get_option('split-usr') == 'true'
51 conf.set10('HAVE_SPLIT_USR', split_usr,
52 description : '/usr/bin and /bin directories are separate')
54 if get_option('split-bin') == 'auto'
55 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
57 split_bin = get_option('split-bin') == 'true'
59 conf.set10('HAVE_SPLIT_BIN', split_bin,
60 description : 'bin and sbin directories are separate')
62 rootprefixdir = get_option('rootprefix')
63 # Unusual rootprefixdir values are used by some distros
64 # (see https://github.com/systemd/systemd/pull/7461).
65 rootprefix_default = split_usr ? '/' : '/usr'
66 if rootprefixdir == ''
67 rootprefixdir = rootprefix_default
70 sysvinit_path = get_option('sysvinit-path')
71 sysvrcnd_path = get_option('sysvrcnd-path')
72 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
73 description : 'SysV init scripts and rcN.d links are supported')
75 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
76 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
77 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
79 # join_paths ignore the preceding arguments if an absolute component is
80 # encountered, so this should canonicalize various paths when they are
81 # absolute or relative.
82 prefixdir = get_option('prefix')
83 if not prefixdir.startswith('/')
84 error('Prefix is not absolute: "@0@"'.format(prefixdir))
86 bindir = join_paths(prefixdir, get_option('bindir'))
87 libdir = join_paths(prefixdir, get_option('libdir'))
88 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
89 includedir = join_paths(prefixdir, get_option('includedir'))
90 datadir = join_paths(prefixdir, get_option('datadir'))
91 localstatedir = join_paths('/', get_option('localstatedir'))
93 rootbindir = join_paths(rootprefixdir, 'bin')
94 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
95 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
97 rootlibdir = get_option('rootlibdir')
99 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
102 # Dirs of external packages
103 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
104 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
105 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
106 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
107 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
108 varlogdir = join_paths(localstatedir, 'log')
109 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
110 rpmmacrosdir = get_option('rpmmacrosdir')
111 if rpmmacrosdir != 'no'
112 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
114 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
117 pkgdatadir = join_paths(datadir, 'systemd')
118 environmentdir = join_paths(prefixdir, 'lib/environment.d')
119 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
120 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
121 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
122 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
123 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
124 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
125 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
126 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
127 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
128 pkgincludedir = join_paths(includedir, 'systemd')
129 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
130 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
131 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
132 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
133 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
134 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
135 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
136 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
137 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
138 udevhomedir = udevlibexecdir
139 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
140 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
141 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
142 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
143 factorydir = join_paths(datadir, 'factory')
144 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
145 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
146 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
147 catalogstatedir = join_paths(systemdstatedir, 'catalog')
148 randomseeddir = join_paths(localstatedir, 'lib/systemd')
149 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
151 docdir = get_option('docdir')
153 docdir = join_paths(datadir, 'doc/systemd')
156 dbuspolicydir = get_option('dbuspolicydir')
157 if dbuspolicydir == ''
158 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
161 dbussessionservicedir = get_option('dbussessionservicedir')
162 if dbussessionservicedir == ''
163 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
166 dbussystemservicedir = get_option('dbussystemservicedir')
167 if dbussystemservicedir == ''
168 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
171 pamlibdir = get_option('pamlibdir')
173 pamlibdir = join_paths(rootlibdir, 'security')
176 pamconfdir = get_option('pamconfdir')
178 pamconfdir = join_paths(sysconfdir, 'pam.d')
181 memory_accounting_default = get_option('memory-accounting-default')
183 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
184 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
185 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
186 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
187 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
188 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
189 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
191 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
193 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
194 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
195 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
196 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
197 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
198 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
199 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
200 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
201 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
202 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
203 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
204 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
205 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
206 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
207 conf.set_quoted('ROOTPREFIX', rootprefixdir)
208 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
209 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
210 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
211 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
212 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
213 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
214 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
215 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
216 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
217 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
218 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
219 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
220 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
221 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
222 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
223 conf.set_quoted('LIBDIR', libdir)
224 conf.set_quoted('ROOTLIBDIR', rootlibdir)
225 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
226 conf.set_quoted('BOOTLIBDIR', bootlibdir)
227 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
228 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
229 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
230 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
231 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
232 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
233 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
234 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
235 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
237 substs.set('prefix', prefixdir)
238 substs.set('exec_prefix', prefixdir)
239 substs.set('libdir', libdir)
240 substs.set('rootlibdir', rootlibdir)
241 substs.set('includedir', includedir)
242 substs.set('pkgsysconfdir', pkgsysconfdir)
243 substs.set('bindir', bindir)
244 substs.set('rootbindir', rootbindir)
245 substs.set('rootlibexecdir', rootlibexecdir)
246 substs.set('systemunitdir', systemunitdir)
247 substs.set('userunitdir', userunitdir)
248 substs.set('systempresetdir', systempresetdir)
249 substs.set('userpresetdir', userpresetdir)
250 substs.set('udevhwdbdir', udevhwdbdir)
251 substs.set('udevrulesdir', udevrulesdir)
252 substs.set('udevlibexecdir', udevlibexecdir)
253 substs.set('environmentdir', environmentdir)
254 substs.set('catalogdir', catalogdir)
255 substs.set('tmpfilesdir', tmpfilesdir)
256 substs.set('sysusersdir', sysusersdir)
257 substs.set('sysctldir', sysctldir)
258 substs.set('binfmtdir', binfmtdir)
259 substs.set('modulesloaddir', modulesloaddir)
260 substs.set('modprobedir', modprobedir)
261 substs.set('systemgeneratordir', systemgeneratordir)
262 substs.set('usergeneratordir', usergeneratordir)
263 substs.set('systemenvgeneratordir', systemenvgeneratordir)
264 substs.set('userenvgeneratordir', userenvgeneratordir)
265 substs.set('systemshutdowndir', systemshutdowndir)
266 substs.set('systemsleepdir', systemsleepdir)
267 substs.set('VARLOGDIR', varlogdir)
268 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
269 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
270 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
271 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
272 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
273 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
274 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
275 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
276 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
278 #####################################################################
280 cc = meson.get_compiler('c')
281 pkgconfig = import('pkgconfig')
282 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
283 meson_build_sh = find_program('tools/meson-build.sh')
285 want_tests = get_option('tests')
286 slow_tests = want_tests != 'false' and get_option('slow-tests')
287 install_tests = get_option('install-tests')
289 if add_languages('cpp', required : fuzzer_build)
290 # Used only for tests
291 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
297 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
299 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
302 possible_cc_flags = [
306 '-Wmissing-include-dirs',
307 '-Wold-style-definition',
311 '-Wsuggest-attribute=noreturn',
312 '-Werror=missing-prototypes',
313 '-Werror=implicit-function-declaration',
314 '-Werror=missing-declarations',
315 '-Werror=return-type',
316 '-Werror=incompatible-pointer-types',
318 '-Wstrict-prototypes',
320 '-Wmissing-noreturn',
321 '-Wimplicit-fallthrough=5',
324 '-Wstrict-aliasing=2',
327 '-Werror=shift-count-overflow',
328 '-Werror=shift-overflow=2',
332 # negative arguments are correctly detected starting with meson 0.46.
333 '-Wno-unused-parameter',
334 '-Wno-missing-field-initializers',
335 '-Wno-unused-result',
336 '-Wno-format-signedness',
338 # work-around for gcc 7.1 turning this on on its own.
339 '-Wno-error=nonnull',
341 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
342 # optimizations enabled, producing essentially false positives.
343 '-Wno-maybe-uninitialized',
347 '-fdiagnostics-show-option',
348 '-fno-strict-aliasing',
349 '-fvisibility=hidden',
351 '-fstack-protector-strong',
352 '--param=ssp-buffer-size=4',
355 # --as-needed and --no-undefined are provided by meson by default,
356 # run mesonconf to see what is enabled
357 possible_link_flags = [
362 if cc.get_id() == 'clang'
363 possible_cc_flags += [
364 '-Wno-typedef-redefinition',
365 '-Wno-gnu-variable-sized-type-not-at-end',
369 if get_option('buildtype') != 'debug'
370 possible_cc_flags += [
371 '-ffunction-sections',
375 possible_link_flags += '-Wl,--gc-sections'
378 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
379 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
383 #include <inttypes.h>
384 typedef uint64_t usec_t;
385 usec_t now(clockid_t clock);
390 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
391 add_project_arguments('-Werror=shadow', language : 'c')
394 cpp = ' '.join(cc.cmd_array()) + ' -E'
396 #####################################################################
397 # compilation result tests
399 conf.set('_GNU_SOURCE', true)
400 conf.set('__SANE_USERSPACE_TYPES__', true)
402 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
403 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
404 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
405 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
406 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
407 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
408 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
412 #include <linux/ethtool.h>
413 #include <linux/fib_rules.h>
414 #include <sys/stat.h>
417 foreach decl : ['char16_t',
419 'struct fib_rule_uid_range',
420 'struct fib_rule_port_range',
424 # We get -1 if the size cannot be determined
425 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
427 if decl == 'struct statx'
429 want_linux_stat_h = false
431 have = cc.sizeof(decl,
432 prefix : decl_headers + '#include <linux/stat.h>',
433 args : '-D_GNU_SOURCE') > 0
434 want_linux_stat_h = have
438 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
441 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
443 foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
444 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
445 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
446 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
447 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
448 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
449 ['FRA_TUN_ID', 'linux/fib_rules.h'],
450 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
451 ['FRA_PAD', 'linux/fib_rules.h'],
452 ['FRA_L3MDEV', 'linux/fib_rules.h'],
453 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
454 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
455 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
456 ['FOU_CMD_GET', 'linux/fou.h'],
457 ['IFA_FLAGS', 'linux/if_addr.h'],
458 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
459 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
460 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
461 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
462 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
463 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
464 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
465 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
466 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
467 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
468 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
469 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
470 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
471 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
472 ['IFLA_PAD', 'linux/if_link.h'],
473 ['IFLA_XDP', 'linux/if_link.h'],
474 ['IFLA_EVENT', 'linux/if_link.h'],
475 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
476 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
477 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
478 ['IFLA_MAX_MTU', 'linux/if_link.h'],
479 ['IFLA_BOND_MODE', 'linux/if_link.h'],
480 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
481 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
482 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
483 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
484 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
485 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
486 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
487 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
488 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
489 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
490 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
491 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
492 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
493 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
494 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
495 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
496 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
497 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
498 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
499 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
500 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
501 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
502 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
503 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
504 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
505 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
506 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
507 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
508 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
509 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
510 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
511 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
512 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
513 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
514 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
515 # if_tunnel.h is buggy and cannot be included on its own
516 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
517 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
518 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
519 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
520 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
521 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
522 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
523 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
524 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
525 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
526 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
528 prefix = decl.length() > 2 ? decl[2] : ''
529 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
530 conf.set10('HAVE_' + decl[0], have)
533 foreach ident : ['secure_getenv', '__secure_getenv']
534 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
538 ['memfd_create', '''#include <sys/mman.h>'''],
539 ['gettid', '''#include <sys/types.h>
540 #include <unistd.h>'''],
541 ['pivot_root', '''#include <stdlib.h>
542 #include <unistd.h>'''], # no known header declares pivot_root
543 ['name_to_handle_at', '''#include <sys/types.h>
544 #include <sys/stat.h>
545 #include <fcntl.h>'''],
546 ['setns', '''#include <sched.h>'''],
547 ['renameat2', '''#include <stdio.h>
548 #include <fcntl.h>'''],
549 ['kcmp', '''#include <linux/kcmp.h>'''],
550 ['keyctl', '''#include <sys/types.h>
551 #include <keyutils.h>'''],
552 ['copy_file_range', '''#include <sys/syscall.h>
553 #include <unistd.h>'''],
554 ['bpf', '''#include <sys/syscall.h>
555 #include <unistd.h>'''],
556 ['statx', '''#include <sys/types.h>
557 #include <sys/stat.h>
558 #include <unistd.h>'''],
559 ['explicit_bzero' , '''#include <string.h>'''],
560 ['reallocarray', '''#include <malloc.h>'''],
563 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
564 conf.set10('HAVE_' + ident[0].to_upper(), have)
567 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
568 conf.set10('USE_SYS_RANDOM_H', true)
569 conf.set10('HAVE_GETRANDOM', true)
571 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
572 conf.set10('USE_SYS_RANDOM_H', false)
573 conf.set10('HAVE_GETRANDOM', have)
576 #####################################################################
578 vcs_tagger = [meson.source_root() + '/tools/meson-vcs-tag.sh',
580 get_option('version-tag'),
581 meson.project_version()]
583 sed = find_program('sed')
584 awk = find_program('awk')
585 m4 = find_program('m4')
586 stat = find_program('stat')
587 git = find_program('git', required : false)
588 env = find_program('env')
589 perl = find_program('perl', required : false)
591 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
592 mkdir_p = 'mkdir -p $DESTDIR/@0@'
593 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
594 splash_bmp = files('test/splash.bmp')
596 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
597 # /usr/sbin, /sbin, and fall back to the default from middle column.
598 progs = [['quotaon', '/usr/sbin/quotaon' ],
599 ['quotacheck', '/usr/sbin/quotacheck' ],
600 ['kmod', '/usr/bin/kmod' ],
601 ['kexec', '/usr/sbin/kexec' ],
602 ['sulogin', '/usr/sbin/sulogin' ],
603 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
604 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
605 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
606 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
609 path = get_option(prog[0] + '-path')
611 message('Using @1@ for @0@'.format(prog[0], path))
613 exe = find_program(prog[0],
614 '/usr/sbin/' + prog[0],
617 path = exe.found() ? exe.path() : prog[1]
619 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
620 conf.set_quoted(name, path)
621 substs.set(name, path)
624 conf.set_quoted('TELINIT', get_option('telinit-path'))
626 if run_command('ln', '--relative', '--help').returncode() != 0
627 error('ln does not support --relative (added in coreutils 8.16)')
630 ############################################################
632 gperf = find_program('gperf')
634 gperf_test_format = '''
636 const char * in_word_set(const char *, @0@);
639 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
640 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
641 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
642 if cc.compiles(gperf_test)
643 gperf_len_type = 'size_t'
645 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
646 if cc.compiles(gperf_test)
647 gperf_len_type = 'unsigned'
649 error('unable to determine gperf len type')
652 message('gperf len type is @0@'.format(gperf_len_type))
653 conf.set('GPERF_LEN_TYPE', gperf_len_type,
654 description : 'The type of gperf "len" parameter')
656 ############################################################
658 if not cc.has_header('sys/capability.h')
659 error('POSIX caps headers not found')
661 foreach header : ['crypt.h',
662 'linux/btrfs_tree.h',
665 'linux/vm_sockets.h',
668 'valgrind/memcheck.h',
669 'valgrind/valgrind.h',
672 conf.set10('HAVE_' + header.underscorify().to_upper(),
673 cc.has_header(header))
676 ############################################################
678 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
679 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
680 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
682 default_hierarchy = get_option('default-hierarchy')
683 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
684 description : 'default cgroup hierarchy as string')
685 if default_hierarchy == 'legacy'
686 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
687 elif default_hierarchy == 'hybrid'
688 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
690 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
693 default_net_naming_scheme = get_option('default-net-naming-scheme')
694 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
696 time_epoch = get_option('time-epoch')
699 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
701 conf.set('TIME_EPOCH', time_epoch)
703 system_uid_max = get_option('system-uid-max')
704 if system_uid_max == -1
705 system_uid_max = run_command(
707 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
708 '/etc/login.defs').stdout().strip()
709 if system_uid_max == ''
712 system_uid_max = system_uid_max.to_int()
715 conf.set('SYSTEM_UID_MAX', system_uid_max)
716 substs.set('systemuidmax', system_uid_max)
718 system_gid_max = get_option('system-gid-max')
719 if system_gid_max == -1
720 system_gid_max = run_command(
722 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
723 '/etc/login.defs').stdout().strip()
724 if system_gid_max == ''
727 system_gid_max = system_gid_max.to_int()
730 conf.set('SYSTEM_GID_MAX', system_gid_max)
731 substs.set('systemgidmax', system_gid_max)
733 dynamic_uid_min = get_option('dynamic-uid-min')
734 dynamic_uid_max = get_option('dynamic-uid-max')
735 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
736 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
737 substs.set('dynamicuidmin', dynamic_uid_min)
738 substs.set('dynamicuidmax', dynamic_uid_max)
740 container_uid_base_min = get_option('container-uid-base-min')
741 container_uid_base_max = get_option('container-uid-base-max')
742 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
743 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
744 substs.set('containeruidbasemin', container_uid_base_min)
745 substs.set('containeruidbasemax', container_uid_base_max)
747 nobody_user = get_option('nobody-user')
748 nobody_group = get_option('nobody-group')
750 if not meson.is_cross_build()
751 getent_result = run_command('getent', 'passwd', '65534')
752 if getent_result.returncode() == 0
753 name = getent_result.stdout().split(':')[0]
754 if name != nobody_user
756 'The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
757 'Your build will result in an user table setup that is incompatible with the local system.')
760 id_result = run_command('id', '-u', nobody_user)
761 if id_result.returncode() == 0
762 id = id_result.stdout().to_int()
765 'The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
766 'Your build will result in an user table setup that is incompatible with the local system.')
770 getent_result = run_command('getent', 'group', '65534')
771 if getent_result.returncode() == 0
772 name = getent_result.stdout().split(':')[0]
773 if name != nobody_group
775 'The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
776 'Your build will result in an group table setup that is incompatible with the local system.')
779 id_result = run_command('id', '-g', nobody_group)
780 if id_result.returncode() == 0
781 id = id_result.stdout().to_int()
784 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
785 'Your build will result in an group table setup that is incompatible with the local system.')
789 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
791 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
792 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
795 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
796 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
797 substs.set('NOBODY_USER_NAME', nobody_user)
798 substs.set('NOBODY_GROUP_NAME', nobody_group)
800 tty_gid = get_option('tty-gid')
801 conf.set('TTY_GID', tty_gid)
802 substs.set('TTY_GID', tty_gid)
804 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
805 users_gid = get_option('users-gid')
806 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
808 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
809 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
811 dev_kvm_mode = get_option('dev-kvm-mode')
812 substs.set('DEV_KVM_MODE', dev_kvm_mode)
813 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
814 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
816 kill_user_processes = get_option('default-kill-user-processes')
817 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
818 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
819 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
821 dns_servers = get_option('dns-servers')
822 conf.set_quoted('DNS_SERVERS', dns_servers)
823 substs.set('DNS_SERVERS', dns_servers)
825 ntp_servers = get_option('ntp-servers')
826 conf.set_quoted('NTP_SERVERS', ntp_servers)
827 substs.set('NTP_SERVERS', ntp_servers)
829 default_locale = get_option('default-locale')
830 if default_locale == ''
831 if not meson.is_cross_build()
832 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
833 default_locale = run_command(choose_default_locale_sh).stdout().strip()
835 default_locale = 'C.UTF-8'
838 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
840 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
842 substs.set('SUSHELL', get_option('debug-shell'))
843 substs.set('DEBUGTTY', get_option('debug-tty'))
845 enable_debug_hashmap = false
846 enable_debug_mmap_cache = false
847 enable_debug_siphash = false
848 enable_debug_udev = false
849 foreach name : get_option('debug-extra')
851 enable_debug_hashmap = true
852 elif name == 'mmap-cache'
853 enable_debug_mmap_cache = true
854 elif name == 'siphash'
855 enable_debug_siphash = true
857 enable_debug_udev = true
859 message('unknown debug option "@0@", ignoring'.format(name))
862 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
863 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
864 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
865 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
867 conf.set10('VALGRIND', get_option('valgrind'))
868 conf.set10('LOG_TRACE', get_option('log-trace'))
870 #####################################################################
872 threads = dependency('threads')
873 librt = cc.find_library('rt')
874 libm = cc.find_library('m')
875 libdl = cc.find_library('dl')
876 libcrypt = cc.find_library('crypt')
878 libcap = dependency('libcap', required : false)
879 if not libcap.found()
880 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
881 libcap = cc.find_library('cap')
884 libmount = dependency('mount',
885 version : fuzzer_build ? '>= 0' : '>= 2.30')
887 want_seccomp = get_option('seccomp')
888 if want_seccomp != 'false' and not fuzzer_build
889 libseccomp = dependency('libseccomp',
890 version : '>= 2.3.1',
891 required : want_seccomp == 'true')
892 have = libseccomp.found()
897 conf.set10('HAVE_SECCOMP', have)
899 want_selinux = get_option('selinux')
900 if want_selinux != 'false' and not fuzzer_build
901 libselinux = dependency('libselinux',
902 version : '>= 2.1.9',
903 required : want_selinux == 'true')
904 have = libselinux.found()
909 conf.set10('HAVE_SELINUX', have)
911 want_apparmor = get_option('apparmor')
912 if want_apparmor != 'false' and not fuzzer_build
913 libapparmor = dependency('libapparmor',
914 required : want_apparmor == 'true')
915 have = libapparmor.found()
920 conf.set10('HAVE_APPARMOR', have)
922 smack_run_label = get_option('smack-run-label')
923 if smack_run_label != ''
924 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
927 want_polkit = get_option('polkit')
928 install_polkit = false
929 install_polkit_pkla = false
930 if want_polkit != 'false' and not fuzzer_build
931 install_polkit = true
933 libpolkit = dependency('polkit-gobject-1',
935 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
936 message('Old polkit detected, will install pkla files')
937 install_polkit_pkla = true
940 conf.set10('ENABLE_POLKIT', install_polkit)
942 want_acl = get_option('acl')
943 if want_acl != 'false' and not fuzzer_build
944 libacl = cc.find_library('acl', required : want_acl == 'true')
945 have = libacl.found()
950 conf.set10('HAVE_ACL', have)
952 want_audit = get_option('audit')
953 if want_audit != 'false' and not fuzzer_build
954 libaudit = dependency('audit', required : want_audit == 'true')
955 have = libaudit.found()
960 conf.set10('HAVE_AUDIT', have)
962 want_blkid = get_option('blkid')
963 if want_blkid != 'false' and not fuzzer_build
964 libblkid = dependency('blkid', required : want_blkid == 'true')
965 have = libblkid.found()
970 conf.set10('HAVE_BLKID', have)
972 want_kmod = get_option('kmod')
973 if want_kmod != 'false' and not fuzzer_build
974 libkmod = dependency('libkmod',
976 required : want_kmod == 'true')
977 have = libkmod.found()
982 conf.set10('HAVE_KMOD', have)
984 want_pam = get_option('pam')
985 if want_pam != 'false' and not fuzzer_build
986 libpam = cc.find_library('pam', required : want_pam == 'true')
987 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
988 have = libpam.found() and libpam_misc.found()
994 conf.set10('HAVE_PAM', have)
996 want_microhttpd = get_option('microhttpd')
997 if want_microhttpd != 'false' and not fuzzer_build
998 libmicrohttpd = dependency('libmicrohttpd',
999 version : '>= 0.9.33',
1000 required : want_microhttpd == 'true')
1001 have = libmicrohttpd.found()
1006 conf.set10('HAVE_MICROHTTPD', have)
1008 want_libcryptsetup = get_option('libcryptsetup')
1009 if want_libcryptsetup != 'false' and not fuzzer_build
1010 libcryptsetup = dependency('libcryptsetup',
1011 version : '>= 1.6.0',
1012 required : want_libcryptsetup == 'true')
1013 have = libcryptsetup.found()
1014 have_sector = cc.has_member(
1015 'struct crypt_params_plain',
1017 prefix : '#include <libcryptsetup.h>')
1023 conf.set10('HAVE_LIBCRYPTSETUP', have)
1024 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1026 want_libcurl = get_option('libcurl')
1027 if want_libcurl != 'false' and not fuzzer_build
1028 libcurl = dependency('libcurl',
1029 version : '>= 7.32.0',
1030 required : want_libcurl == 'true')
1031 have = libcurl.found()
1036 conf.set10('HAVE_LIBCURL', have)
1038 want_libidn = get_option('libidn')
1039 want_libidn2 = get_option('libidn2')
1040 if want_libidn == 'true' and want_libidn2 == 'true'
1041 error('libidn and libidn2 cannot be requested simultaneously')
1044 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1045 libidn = dependency('libidn',
1046 required : want_libidn == 'true')
1047 have = libidn.found()
1052 conf.set10('HAVE_LIBIDN', have)
1053 if not have and want_libidn2 != 'false' and not fuzzer_build
1054 # libidn is used for both libidn and libidn2 objects
1055 libidn = dependency('libidn2',
1056 required : want_libidn2 == 'true')
1057 have = libidn.found()
1061 conf.set10('HAVE_LIBIDN2', have)
1063 want_libiptc = get_option('libiptc')
1064 if want_libiptc != 'false' and not fuzzer_build
1065 libiptc = dependency('libiptc',
1066 required : want_libiptc == 'true')
1067 have = libiptc.found()
1072 conf.set10('HAVE_LIBIPTC', have)
1074 want_qrencode = get_option('qrencode')
1075 if want_qrencode != 'false' and not fuzzer_build
1076 libqrencode = dependency('libqrencode',
1077 required : want_qrencode == 'true')
1078 have = libqrencode.found()
1083 conf.set10('HAVE_QRENCODE', have)
1085 want_gcrypt = get_option('gcrypt')
1086 if want_gcrypt != 'false' and not fuzzer_build
1087 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1088 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1089 have = libgcrypt.found() and libgpg_error.found()
1094 # link to neither of the libs if one is not found
1098 conf.set10('HAVE_GCRYPT', have)
1100 want_gnutls = get_option('gnutls')
1101 if want_gnutls != 'false' and not fuzzer_build
1102 libgnutls = dependency('gnutls',
1103 version : '>= 3.1.4',
1104 required : want_gnutls == 'true')
1105 have = libgnutls.found()
1110 conf.set10('HAVE_GNUTLS', have)
1112 want_openssl = get_option('openssl')
1113 if want_openssl != 'false' and not fuzzer_build
1114 libopenssl = dependency('openssl',
1115 version : '>= 1.1.0',
1116 required : want_openssl == 'true')
1117 have = libopenssl.found()
1122 conf.set10('HAVE_OPENSSL', have)
1124 want_elfutils = get_option('elfutils')
1125 if want_elfutils != 'false' and not fuzzer_build
1126 libdw = dependency('libdw',
1127 required : want_elfutils == 'true')
1128 have = libdw.found()
1133 conf.set10('HAVE_ELFUTILS', have)
1135 want_zlib = get_option('zlib')
1136 if want_zlib != 'false' and not fuzzer_build
1137 libz = dependency('zlib',
1138 required : want_zlib == 'true')
1144 conf.set10('HAVE_ZLIB', have)
1146 want_bzip2 = get_option('bzip2')
1147 if want_bzip2 != 'false' and not fuzzer_build
1148 libbzip2 = cc.find_library('bz2',
1149 required : want_bzip2 == 'true')
1150 have = libbzip2.found()
1155 conf.set10('HAVE_BZIP2', have)
1157 want_xz = get_option('xz')
1158 if want_xz != 'false' and not fuzzer_build
1159 libxz = dependency('liblzma',
1160 required : want_xz == 'true')
1161 have = libxz.found()
1166 conf.set10('HAVE_XZ', have)
1168 want_lz4 = get_option('lz4')
1169 if want_lz4 != 'false' and not fuzzer_build
1170 liblz4 = dependency('liblz4',
1171 version : '>= 1.3.0',
1172 required : want_lz4 == 'true')
1173 have = liblz4.found()
1178 conf.set10('HAVE_LZ4', have)
1180 want_xkbcommon = get_option('xkbcommon')
1181 if want_xkbcommon != 'false' and not fuzzer_build
1182 libxkbcommon = dependency('xkbcommon',
1183 version : '>= 0.3.0',
1184 required : want_xkbcommon == 'true')
1185 have = libxkbcommon.found()
1190 conf.set10('HAVE_XKBCOMMON', have)
1192 want_pcre2 = get_option('pcre2')
1193 if want_pcre2 != 'false'
1194 libpcre2 = dependency('libpcre2-8',
1195 required : want_pcre2 == 'true')
1196 have = libpcre2.found()
1201 conf.set10('HAVE_PCRE2', have)
1203 want_glib = get_option('glib')
1204 if want_glib != 'false' and not fuzzer_build
1205 libglib = dependency('glib-2.0',
1206 version : '>= 2.22.0',
1207 required : want_glib == 'true')
1208 libgobject = dependency('gobject-2.0',
1209 version : '>= 2.22.0',
1210 required : want_glib == 'true')
1211 libgio = dependency('gio-2.0',
1212 required : want_glib == 'true')
1213 have = libglib.found() and libgobject.found() and libgio.found()
1220 conf.set10('HAVE_GLIB', have)
1222 want_dbus = get_option('dbus')
1223 if want_dbus != 'false' and not fuzzer_build
1224 libdbus = dependency('dbus-1',
1225 version : '>= 1.3.2',
1226 required : want_dbus == 'true')
1227 have = libdbus.found()
1232 conf.set10('HAVE_DBUS', have)
1234 default_dnssec = get_option('default-dnssec')
1236 default_dnssec = 'no'
1238 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1239 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1240 default_dnssec = 'no'
1242 conf.set('DEFAULT_DNSSEC_MODE',
1243 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1244 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1246 dns_over_tls = get_option('dns-over-tls')
1247 if dns_over_tls != 'false'
1248 if dns_over_tls == 'openssl'
1251 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1252 if dns_over_tls == 'gnutls' and not have_gnutls
1253 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1256 if dns_over_tls == 'gnutls' or have_gnutls
1257 have_openssl = false
1259 have_openssl = conf.get('HAVE_OPENSSL') == 1
1260 if dns_over_tls != 'auto' and not have_openssl
1261 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1262 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1265 have = have_gnutls or have_openssl
1269 have_openssl = false
1271 conf.set10('ENABLE_DNS_OVER_TLS', have)
1272 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1273 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1275 default_dns_over_tls = get_option('default-dns-over-tls')
1277 default_dns_over_tls = 'no'
1279 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1280 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1281 default_dns_over_tls = 'no'
1283 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1284 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1285 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1287 want_importd = get_option('importd')
1288 if want_importd != 'false'
1289 have = (conf.get('HAVE_LIBCURL') == 1 and
1290 conf.get('HAVE_ZLIB') == 1 and
1291 conf.get('HAVE_XZ') == 1 and
1292 conf.get('HAVE_GCRYPT') == 1)
1293 if want_importd == 'true' and not have
1294 error('importd support was requested, but dependencies are not available')
1299 conf.set10('ENABLE_IMPORTD', have)
1301 want_remote = get_option('remote')
1302 if want_remote != 'false'
1303 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1304 conf.get('HAVE_LIBCURL') == 1]
1305 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1306 # it's possible to build one without the other. Complain only if
1307 # support was explictly requested. The auxiliary files like sysusers
1308 # config should be installed when any of the programs are built.
1309 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1310 error('remote support was requested, but dependencies are not available')
1312 have = have_deps[0] or have_deps[1]
1316 conf.set10('ENABLE_REMOTE', have)
1318 foreach term : ['utmp',
1350 have = get_option(term)
1351 name = 'ENABLE_' + term.underscorify().to_upper()
1352 conf.set10(name, have)
1355 foreach tuple : [['nss-mymachines', 'machined'],
1356 ['nss-resolve', 'resolve']]
1357 want = get_option(tuple[0])
1359 have = get_option(tuple[1])
1360 if want == 'true' and not have
1361 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1366 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1367 conf.set10(name, have)
1371 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1372 'ENABLE_NSS_MYMACHINES',
1373 'ENABLE_NSS_RESOLVE',
1374 'ENABLE_NSS_SYSTEMD']
1375 if conf.get(term) == 1
1379 conf.set10('ENABLE_NSS', enable_nss)
1381 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1386 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1388 #####################################################################
1390 if get_option('efi')
1391 efi_arch = host_machine.cpu_family()
1393 if efi_arch == 'x86'
1394 EFI_MACHINE_TYPE_NAME = 'ia32'
1395 gnu_efi_arch = 'ia32'
1396 elif efi_arch == 'x86_64'
1397 EFI_MACHINE_TYPE_NAME = 'x64'
1398 gnu_efi_arch = 'x86_64'
1399 elif efi_arch == 'arm'
1400 EFI_MACHINE_TYPE_NAME = 'arm'
1401 gnu_efi_arch = 'arm'
1402 elif efi_arch == 'aarch64'
1403 EFI_MACHINE_TYPE_NAME = 'aa64'
1404 gnu_efi_arch = 'aarch64'
1406 EFI_MACHINE_TYPE_NAME = ''
1411 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1413 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1417 conf.set10('ENABLE_EFI', have)
1419 #####################################################################
1421 config_h = configure_file(
1422 output : 'config.h',
1423 configuration : conf)
1425 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1427 includes = include_directories('src/basic',
1431 'src/journal-remote',
1435 'src/time-wait-sync',
1440 'src/libsystemd/sd-bus',
1441 'src/libsystemd/sd-device',
1442 'src/libsystemd/sd-event',
1443 'src/libsystemd/sd-hwdb',
1444 'src/libsystemd/sd-id128',
1445 'src/libsystemd/sd-netlink',
1446 'src/libsystemd/sd-network',
1447 'src/libsystemd/sd-resolve',
1448 'src/libsystemd-network',
1451 add_project_arguments('-include', 'config.h', language : 'c')
1453 generate_gperfs = find_program('tools/generate-gperfs.py')
1457 subdir('src/systemd')
1459 subdir('src/libsystemd')
1460 subdir('src/libsystemd-network')
1461 subdir('src/journal')
1464 libjournal_core = static_library(
1466 libjournal_core_sources,
1468 include_directories : includes,
1471 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1472 libsystemd = shared_library(
1475 version : libsystemd_version,
1476 include_directories : includes,
1477 link_args : ['-shared',
1478 '-Wl,--version-script=' + libsystemd_sym_path],
1479 link_with : [libbasic,
1481 link_whole : [libsystemd_static,
1483 dependencies : [threads,
1487 link_depends : libsystemd_sym,
1489 install_dir : rootlibdir)
1491 static_libsystemd = get_option('static-libsystemd')
1492 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1494 install_libsystemd_static = static_library(
1497 journal_client_sources,
1499 basic_gcrypt_sources,
1501 include_directories : includes,
1502 build_by_default : static_libsystemd != 'false',
1503 install : static_libsystemd != 'false',
1504 install_dir : rootlibdir,
1505 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1506 dependencies : [threads,
1515 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1517 ############################################################
1519 # binaries that have --help and are intended for use by humans,
1520 # usually, but not always, installed in /bin.
1521 public_programs = []
1523 subdir('src/libudev')
1524 subdir('src/shared')
1527 subdir('src/network')
1529 subdir('src/analyze')
1530 subdir('src/journal-remote')
1531 subdir('src/coredump')
1532 subdir('src/hostname')
1533 subdir('src/import')
1534 subdir('src/kernel-install')
1535 subdir('src/locale')
1536 subdir('src/machine')
1537 subdir('src/portable')
1538 subdir('src/nspawn')
1539 subdir('src/resolve')
1540 subdir('src/timedate')
1541 subdir('src/timesync')
1542 subdir('src/vconsole')
1543 subdir('src/boot/efi')
1550 ############################################################
1552 # only static linking apart from libdl, to make sure that the
1553 # module is linked to all libraries that it uses.
1554 test_dlopen = executable(
1558 include_directories : includes,
1559 link_with : [libbasic],
1560 dependencies : [libdl],
1561 build_by_default : want_tests != 'false')
1563 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1564 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1565 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1566 ['resolve', 'ENABLE_NSS_RESOLVE']]
1568 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1572 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1573 version_script_arg = join_paths(meson.source_root(), sym)
1575 nss = shared_library(
1577 'src/nss-@0@/nss-@0@.c'.format(module),
1580 include_directories : includes,
1581 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1582 link_args : ['-Wl,-z,nodelete',
1584 '-Wl,--version-script=' + version_script_arg,
1586 link_with : [libsystemd_static,
1588 dependencies : [threads,
1592 install_dir : rootlibdir)
1594 # We cannot use shared_module because it does not support version suffix.
1595 # Unfortunately shared_library insists on creating the symlink…
1596 meson.add_install_script('sh', '-c',
1597 'rm $DESTDIR@0@/libnss_@1@.so'
1598 .format(rootlibdir, module))
1600 if want_tests != 'false'
1601 test('dlopen-nss_' + module,
1603 # path to dlopen must include a slash
1604 args : nss.full_path())
1609 ############################################################
1611 executable('systemd',
1613 include_directories : includes,
1614 link_with : [libcore,
1616 dependencies : [threads,
1622 install_rpath : rootlibexecdir,
1624 install_dir : rootlibexecdir)
1626 meson.add_install_script(meson_make_symlink,
1627 join_paths(rootlibexecdir, 'systemd'),
1628 join_paths(rootsbindir, 'init'))
1630 exe = executable('systemd-analyze',
1631 systemd_analyze_sources,
1632 include_directories : includes,
1633 link_with : [libcore,
1635 dependencies : [threads,
1641 install_rpath : rootlibexecdir,
1643 public_programs += exe
1645 executable('systemd-journald',
1646 systemd_journald_sources,
1647 include_directories : includes,
1648 link_with : [libjournal_core,
1650 dependencies : [threads,
1654 install_rpath : rootlibexecdir,
1656 install_dir : rootlibexecdir)
1658 exe = executable('systemd-cat',
1659 systemd_cat_sources,
1660 include_directories : includes,
1661 link_with : [libjournal_core,
1663 dependencies : [threads],
1664 install_rpath : rootlibexecdir,
1666 public_programs += exe
1668 exe = executable('journalctl',
1670 include_directories : includes,
1671 link_with : [libshared],
1672 dependencies : [threads,
1677 install_rpath : rootlibexecdir,
1679 install_dir : rootbindir)
1680 public_programs += exe
1682 executable('systemd-getty-generator',
1683 'src/getty-generator/getty-generator.c',
1684 include_directories : includes,
1685 link_with : [libshared],
1686 install_rpath : rootlibexecdir,
1688 install_dir : systemgeneratordir)
1690 executable('systemd-debug-generator',
1691 'src/debug-generator/debug-generator.c',
1692 include_directories : includes,
1693 link_with : [libshared],
1694 install_rpath : rootlibexecdir,
1696 install_dir : systemgeneratordir)
1698 executable('systemd-run-generator',
1699 'src/run-generator/run-generator.c',
1700 include_directories : includes,
1701 link_with : [libshared],
1702 install_rpath : rootlibexecdir,
1704 install_dir : systemgeneratordir)
1706 executable('systemd-fstab-generator',
1707 'src/fstab-generator/fstab-generator.c',
1708 'src/core/mount-setup.c',
1709 include_directories : includes,
1710 link_with : [libshared],
1711 install_rpath : rootlibexecdir,
1713 install_dir : systemgeneratordir)
1715 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1716 executable('30-systemd-environment-d-generator',
1717 'src/environment-d-generator/environment-d-generator.c',
1718 include_directories : includes,
1719 link_with : [libshared],
1720 install_rpath : rootlibexecdir,
1722 install_dir : userenvgeneratordir)
1724 meson.add_install_script(meson_make_symlink,
1725 join_paths(sysconfdir, 'environment'),
1726 join_paths(environmentdir, '99-environment.conf'))
1729 if conf.get('ENABLE_HIBERNATE') == 1
1730 executable('systemd-hibernate-resume-generator',
1731 'src/hibernate-resume/hibernate-resume-generator.c',
1732 include_directories : includes,
1733 link_with : [libshared],
1734 install_rpath : rootlibexecdir,
1736 install_dir : systemgeneratordir)
1738 executable('systemd-hibernate-resume',
1739 'src/hibernate-resume/hibernate-resume.c',
1740 include_directories : includes,
1741 link_with : [libshared],
1742 install_rpath : rootlibexecdir,
1744 install_dir : rootlibexecdir)
1747 if conf.get('HAVE_BLKID') == 1
1748 executable('systemd-gpt-auto-generator',
1749 'src/gpt-auto-generator/gpt-auto-generator.c',
1750 'src/shared/blkid-util.h',
1751 include_directories : includes,
1752 link_with : [libshared],
1753 dependencies : libblkid,
1754 install_rpath : rootlibexecdir,
1756 install_dir : systemgeneratordir)
1758 exe = executable('systemd-dissect',
1759 'src/dissect/dissect.c',
1760 include_directories : includes,
1761 link_with : [libshared],
1762 install_rpath : rootlibexecdir,
1764 install_dir : rootlibexecdir)
1765 public_programs += exe
1768 if conf.get('ENABLE_RESOLVE') == 1
1769 executable('systemd-resolved',
1770 systemd_resolved_sources,
1771 include_directories : includes,
1772 link_with : [libshared,
1774 libsystemd_resolve_core],
1775 dependencies : systemd_resolved_dependencies,
1776 install_rpath : rootlibexecdir,
1778 install_dir : rootlibexecdir)
1780 exe = executable('resolvectl',
1782 include_directories : includes,
1783 link_with : [libshared,
1785 libsystemd_resolve_core],
1786 dependencies : [threads,
1790 install_rpath : rootlibexecdir,
1792 public_programs += exe
1794 meson.add_install_script(meson_make_symlink,
1795 join_paths(bindir, 'resolvectl'),
1796 join_paths(rootsbindir, 'resolvconf'))
1798 meson.add_install_script(meson_make_symlink,
1799 join_paths(bindir, 'resolvectl'),
1800 join_paths(bindir, 'systemd-resolve'))
1803 if conf.get('ENABLE_LOGIND') == 1
1804 executable('systemd-logind',
1805 systemd_logind_sources,
1806 include_directories : includes,
1807 link_with : [liblogind_core,
1809 dependencies : [threads,
1811 install_rpath : rootlibexecdir,
1813 install_dir : rootlibexecdir)
1815 exe = executable('loginctl',
1817 include_directories : includes,
1818 link_with : [libshared],
1819 dependencies : [threads,
1822 install_rpath : rootlibexecdir,
1824 install_dir : rootbindir)
1825 public_programs += exe
1827 exe = executable('systemd-inhibit',
1828 'src/login/inhibit.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 install_rpath : rootlibexecdir,
1833 install_dir : rootbindir)
1834 public_programs += exe
1836 if conf.get('HAVE_PAM') == 1
1837 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1838 pam_systemd = shared_library(
1842 include_directories : includes,
1843 link_args : ['-shared',
1844 '-Wl,--version-script=' + version_script_arg],
1845 link_with : [libsystemd_static,
1847 dependencies : [threads,
1850 link_depends : pam_systemd_sym,
1852 install_dir : pamlibdir)
1854 if want_tests != 'false'
1855 test('dlopen-pam_systemd',
1857 # path to dlopen must include a slash
1858 args : pam_systemd.full_path())
1862 executable('systemd-user-runtime-dir',
1863 user_runtime_dir_sources,
1864 include_directories : includes,
1865 link_with : [libshared],
1866 install_rpath : rootlibexecdir,
1868 install_dir : rootlibexecdir)
1871 if conf.get('HAVE_PAM') == 1
1872 executable('systemd-user-sessions',
1873 'src/user-sessions/user-sessions.c',
1874 include_directories : includes,
1875 link_with : [libshared],
1876 install_rpath : rootlibexecdir,
1878 install_dir : rootlibexecdir)
1881 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1882 exe = executable('bootctl',
1883 'src/boot/bootctl.c',
1884 include_directories : includes,
1885 link_with : [libshared],
1886 dependencies : [libblkid],
1887 install_rpath : rootlibexecdir,
1889 public_programs += exe
1891 executable('systemd-bless-boot',
1892 'src/boot/bless-boot.c',
1893 include_directories : includes,
1894 link_with : [libshared],
1895 dependencies : [libblkid],
1896 install_rpath : rootlibexecdir,
1898 install_dir : rootlibexecdir)
1900 executable('systemd-bless-boot-generator',
1901 'src/boot/bless-boot-generator.c',
1902 include_directories : includes,
1903 link_with : [libshared],
1904 install_rpath : rootlibexecdir,
1906 install_dir : systemgeneratordir)
1909 executable('systemd-boot-check-no-failures',
1910 'src/boot/boot-check-no-failures.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 dependencies : [libblkid],
1914 install_rpath : rootlibexecdir,
1916 install_dir : rootlibexecdir)
1918 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [threads],
1922 install_rpath : rootlibexecdir,
1924 public_programs += exe
1927 if get_option('link-systemctl-shared')
1928 systemctl_link_with = [libshared]
1930 systemctl_link_with = [libsystemd_static,
1936 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1937 include_directories : includes,
1938 link_with : systemctl_link_with,
1939 dependencies : [threads,
1944 install_rpath : rootlibexecdir,
1946 install_dir : rootbindir)
1947 public_programs += exe
1949 if conf.get('ENABLE_PORTABLED') == 1
1950 executable('systemd-portabled',
1951 systemd_portabled_sources,
1952 include_directories : includes,
1953 link_with : [libshared],
1954 dependencies : [threads],
1955 install_rpath : rootlibexecdir,
1957 install_dir : rootlibexecdir)
1959 exe = executable('portablectl', 'src/portable/portablectl.c',
1960 include_directories : includes,
1961 link_with : [libshared],
1962 dependencies : [threads],
1963 install_rpath : rootlibexecdir,
1965 install_dir : rootbindir)
1966 public_programs += exe
1969 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1970 meson.add_install_script(meson_make_symlink,
1971 join_paths(rootbindir, 'systemctl'),
1972 join_paths(rootsbindir, alias))
1975 if conf.get('ENABLE_BACKLIGHT') == 1
1976 executable('systemd-backlight',
1977 'src/backlight/backlight.c',
1978 include_directories : includes,
1979 link_with : [libshared],
1980 install_rpath : rootlibexecdir,
1982 install_dir : rootlibexecdir)
1985 if conf.get('ENABLE_RFKILL') == 1
1986 executable('systemd-rfkill',
1987 'src/rfkill/rfkill.c',
1988 include_directories : includes,
1989 link_with : [libshared],
1990 install_rpath : rootlibexecdir,
1992 install_dir : rootlibexecdir)
1995 executable('systemd-system-update-generator',
1996 'src/system-update-generator/system-update-generator.c',
1997 include_directories : includes,
1998 link_with : [libshared],
1999 install_rpath : rootlibexecdir,
2001 install_dir : systemgeneratordir)
2003 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2004 executable('systemd-cryptsetup',
2005 'src/cryptsetup/cryptsetup.c',
2006 include_directories : includes,
2007 link_with : [libshared],
2008 dependencies : [libcryptsetup],
2009 install_rpath : rootlibexecdir,
2011 install_dir : rootlibexecdir)
2013 executable('systemd-cryptsetup-generator',
2014 'src/cryptsetup/cryptsetup-generator.c',
2015 include_directories : includes,
2016 link_with : [libshared],
2017 dependencies : [libcryptsetup],
2018 install_rpath : rootlibexecdir,
2020 install_dir : systemgeneratordir)
2022 executable('systemd-veritysetup',
2023 'src/veritysetup/veritysetup.c',
2024 include_directories : includes,
2025 link_with : [libshared],
2026 dependencies : [libcryptsetup],
2027 install_rpath : rootlibexecdir,
2029 install_dir : rootlibexecdir)
2031 executable('systemd-veritysetup-generator',
2032 'src/veritysetup/veritysetup-generator.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 dependencies : [libcryptsetup],
2036 install_rpath : rootlibexecdir,
2038 install_dir : systemgeneratordir)
2041 if conf.get('HAVE_SYSV_COMPAT') == 1
2042 executable('systemd-sysv-generator',
2043 'src/sysv-generator/sysv-generator.c',
2044 include_directories : includes,
2045 link_with : [libshared],
2046 install_rpath : rootlibexecdir,
2048 install_dir : systemgeneratordir)
2050 executable('systemd-rc-local-generator',
2051 'src/rc-local-generator/rc-local-generator.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 install_rpath : rootlibexecdir,
2056 install_dir : systemgeneratordir)
2059 if conf.get('ENABLE_HOSTNAMED') == 1
2060 executable('systemd-hostnamed',
2061 'src/hostname/hostnamed.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 install_rpath : rootlibexecdir,
2066 install_dir : rootlibexecdir)
2068 exe = executable('hostnamectl',
2069 'src/hostname/hostnamectl.c',
2070 include_directories : includes,
2071 link_with : [libshared],
2072 install_rpath : rootlibexecdir,
2074 public_programs += exe
2077 if conf.get('ENABLE_LOCALED') == 1
2078 if conf.get('HAVE_XKBCOMMON') == 1
2079 # logind will load libxkbcommon.so dynamically on its own
2085 executable('systemd-localed',
2086 systemd_localed_sources,
2087 include_directories : includes,
2088 link_with : [libshared],
2089 dependencies : deps,
2090 install_rpath : rootlibexecdir,
2092 install_dir : rootlibexecdir)
2094 exe = executable('localectl',
2096 include_directories : includes,
2097 link_with : [libshared],
2098 install_rpath : rootlibexecdir,
2100 public_programs += exe
2103 if conf.get('ENABLE_TIMEDATED') == 1
2104 executable('systemd-timedated',
2105 'src/timedate/timedated.c',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 install_rpath : rootlibexecdir,
2110 install_dir : rootlibexecdir)
2113 if conf.get('ENABLE_TIMEDATECTL') == 1
2114 exe = executable('timedatectl',
2115 'src/timedate/timedatectl.c',
2116 include_directories : includes,
2117 install_rpath : rootlibexecdir,
2118 link_with : [libshared],
2119 dependencies : [libm],
2121 public_programs += exe
2124 if conf.get('ENABLE_TIMESYNCD') == 1
2125 executable('systemd-timesyncd',
2126 systemd_timesyncd_sources,
2127 include_directories : includes,
2128 link_with : [libshared],
2129 dependencies : [threads,
2131 install_rpath : rootlibexecdir,
2133 install_dir : rootlibexecdir)
2135 executable('systemd-time-wait-sync',
2136 'src/time-wait-sync/time-wait-sync.c',
2137 include_directories : includes,
2138 link_with : [libshared],
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2144 if conf.get('ENABLE_MACHINED') == 1
2145 executable('systemd-machined',
2146 systemd_machined_sources,
2147 include_directories : includes,
2148 link_with : [libmachine_core,
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2154 exe = executable('machinectl',
2155 'src/machine/machinectl.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 dependencies : [threads,
2161 install_rpath : rootlibexecdir,
2163 install_dir : rootbindir)
2164 public_programs += exe
2167 if conf.get('ENABLE_IMPORTD') == 1
2168 executable('systemd-importd',
2169 systemd_importd_sources,
2170 include_directories : includes,
2171 link_with : [libshared],
2172 dependencies : [threads],
2173 install_rpath : rootlibexecdir,
2175 install_dir : rootlibexecdir)
2177 systemd_pull = executable('systemd-pull',
2178 systemd_pull_sources,
2179 include_directories : includes,
2180 link_with : [libshared],
2181 dependencies : [libcurl,
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootlibexecdir)
2190 systemd_import = executable('systemd-import',
2191 systemd_import_sources,
2192 include_directories : includes,
2193 link_with : [libshared],
2194 dependencies : [libcurl,
2198 install_rpath : rootlibexecdir,
2200 install_dir : rootlibexecdir)
2202 systemd_import_fs = executable('systemd-import-fs',
2203 systemd_import_fs_sources,
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2208 install_dir : rootlibexecdir)
2210 systemd_export = executable('systemd-export',
2211 systemd_export_sources,
2212 include_directories : includes,
2213 link_with : [libshared],
2214 dependencies : [libcurl,
2218 install_rpath : rootlibexecdir,
2220 install_dir : rootlibexecdir)
2222 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2225 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2226 exe = executable('systemd-journal-upload',
2227 systemd_journal_upload_sources,
2228 include_directories : includes,
2229 link_with : [libshared],
2230 dependencies : [threads,
2235 install_rpath : rootlibexecdir,
2237 install_dir : rootlibexecdir)
2238 public_programs += exe
2241 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2242 s_j_remote = executable('systemd-journal-remote',
2243 systemd_journal_remote_sources,
2244 include_directories : includes,
2245 link_with : [libshared,
2246 libsystemd_journal_remote],
2247 dependencies : [threads,
2252 install_rpath : rootlibexecdir,
2254 install_dir : rootlibexecdir)
2256 s_j_gatewayd = executable('systemd-journal-gatewayd',
2257 systemd_journal_gatewayd_sources,
2258 include_directories : includes,
2259 link_with : [libshared],
2260 dependencies : [threads,
2265 install_rpath : rootlibexecdir,
2267 install_dir : rootlibexecdir)
2268 public_programs += [s_j_remote, s_j_gatewayd]
2271 if conf.get('ENABLE_COREDUMP') == 1
2272 executable('systemd-coredump',
2273 systemd_coredump_sources,
2274 include_directories : includes,
2275 link_with : [libshared],
2276 dependencies : [threads,
2281 install_rpath : rootlibexecdir,
2283 install_dir : rootlibexecdir)
2285 exe = executable('coredumpctl',
2286 coredumpctl_sources,
2287 include_directories : includes,
2288 link_with : [libshared],
2289 dependencies : [threads,
2292 install_rpath : rootlibexecdir,
2294 public_programs += exe
2297 if conf.get('ENABLE_BINFMT') == 1
2298 exe = executable('systemd-binfmt',
2299 'src/binfmt/binfmt.c',
2300 include_directories : includes,
2301 link_with : [libshared],
2302 install_rpath : rootlibexecdir,
2304 install_dir : rootlibexecdir)
2305 public_programs += exe
2307 meson.add_install_script('sh', '-c',
2308 mkdir_p.format(binfmtdir))
2309 meson.add_install_script('sh', '-c',
2310 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2313 if conf.get('ENABLE_VCONSOLE') == 1
2314 executable('systemd-vconsole-setup',
2315 'src/vconsole/vconsole-setup.c',
2316 include_directories : includes,
2317 link_with : [libshared],
2318 install_rpath : rootlibexecdir,
2320 install_dir : rootlibexecdir)
2323 if conf.get('ENABLE_RANDOMSEED') == 1
2324 executable('systemd-random-seed',
2325 'src/random-seed/random-seed.c',
2326 include_directories : includes,
2327 link_with : [libshared],
2328 install_rpath : rootlibexecdir,
2330 install_dir : rootlibexecdir)
2333 if conf.get('ENABLE_FIRSTBOOT') == 1
2334 executable('systemd-firstboot',
2335 'src/firstboot/firstboot.c',
2336 include_directories : includes,
2337 link_with : [libshared],
2338 dependencies : [libcrypt],
2339 install_rpath : rootlibexecdir,
2341 install_dir : rootbindir)
2344 executable('systemd-remount-fs',
2345 'src/remount-fs/remount-fs.c',
2346 'src/core/mount-setup.c',
2347 'src/core/mount-setup.h',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2354 executable('systemd-machine-id-setup',
2355 'src/machine-id-setup/machine-id-setup-main.c',
2356 'src/core/machine-id-setup.c',
2357 'src/core/machine-id-setup.h',
2358 include_directories : includes,
2359 link_with : [libshared],
2360 install_rpath : rootlibexecdir,
2362 install_dir : rootbindir)
2364 executable('systemd-fsck',
2366 include_directories : includes,
2367 link_with : [libshared],
2368 install_rpath : rootlibexecdir,
2370 install_dir : rootlibexecdir)
2372 executable('systemd-growfs',
2373 'src/partition/growfs.c',
2374 include_directories : includes,
2375 link_with : [libshared],
2376 dependencies : [libcryptsetup],
2377 install_rpath : rootlibexecdir,
2379 install_dir : rootlibexecdir)
2381 executable('systemd-makefs',
2382 'src/partition/makefs.c',
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2387 install_dir : rootlibexecdir)
2389 executable('systemd-sleep',
2390 'src/sleep/sleep.c',
2391 include_directories : includes,
2392 link_with : [libshared],
2393 install_rpath : rootlibexecdir,
2395 install_dir : rootlibexecdir)
2397 install_data('src/sleep/sleep.conf',
2398 install_dir : pkgsysconfdir)
2400 exe = executable('systemd-sysctl',
2401 'src/sysctl/sysctl.c',
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2406 install_dir : rootlibexecdir)
2407 public_programs += exe
2409 executable('systemd-ac-power',
2410 'src/ac-power/ac-power.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 install_rpath : rootlibexecdir,
2415 install_dir : rootlibexecdir)
2417 exe = executable('systemd-detect-virt',
2418 'src/detect-virt/detect-virt.c',
2419 include_directories : includes,
2420 link_with : [libshared],
2421 install_rpath : rootlibexecdir,
2423 public_programs += exe
2425 exe = executable('systemd-delta',
2426 'src/delta/delta.c',
2427 include_directories : includes,
2428 link_with : [libshared],
2429 install_rpath : rootlibexecdir,
2431 public_programs += exe
2433 exe = executable('systemd-escape',
2434 'src/escape/escape.c',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 install_dir : rootbindir)
2440 public_programs += exe
2442 exe = executable('systemd-notify',
2443 'src/notify/notify.c',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 install_rpath : rootlibexecdir,
2448 install_dir : rootbindir)
2449 public_programs += exe
2451 executable('systemd-volatile-root',
2452 'src/volatile-root/volatile-root.c',
2453 include_directories : includes,
2454 link_with : [libshared],
2455 install_rpath : rootlibexecdir,
2457 install_dir : rootlibexecdir)
2459 executable('systemd-cgroups-agent',
2460 'src/cgroups-agent/cgroups-agent.c',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2465 install_dir : rootlibexecdir)
2467 exe = executable('systemd-id128',
2468 'src/id128/id128.c',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 install_rpath : rootlibexecdir,
2473 public_programs += exe
2475 exe = executable('systemd-path',
2477 include_directories : includes,
2478 link_with : [libshared],
2479 install_rpath : rootlibexecdir,
2481 public_programs += exe
2483 exe = executable('systemd-ask-password',
2484 'src/ask-password/ask-password.c',
2485 include_directories : includes,
2486 link_with : [libshared],
2487 install_rpath : rootlibexecdir,
2489 install_dir : rootbindir)
2490 public_programs += exe
2492 executable('systemd-reply-password',
2493 'src/reply-password/reply-password.c',
2494 include_directories : includes,
2495 link_with : [libshared],
2496 install_rpath : rootlibexecdir,
2498 install_dir : rootlibexecdir)
2500 exe = executable('systemd-tty-ask-password-agent',
2501 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2502 include_directories : includes,
2503 link_with : [libshared],
2504 install_rpath : rootlibexecdir,
2506 install_dir : rootbindir)
2507 public_programs += exe
2509 exe = executable('systemd-cgls',
2511 include_directories : includes,
2512 link_with : [libshared],
2513 install_rpath : rootlibexecdir,
2515 public_programs += exe
2517 exe = executable('systemd-cgtop',
2518 'src/cgtop/cgtop.c',
2519 include_directories : includes,
2520 link_with : [libshared],
2521 install_rpath : rootlibexecdir,
2523 public_programs += exe
2525 executable('systemd-initctl',
2526 'src/initctl/initctl.c',
2527 include_directories : includes,
2528 link_with : [libshared],
2529 install_rpath : rootlibexecdir,
2531 install_dir : rootlibexecdir)
2533 exe = executable('systemd-mount',
2534 'src/mount/mount-tool.c',
2535 include_directories : includes,
2536 link_with : [libshared],
2537 install_rpath : rootlibexecdir,
2539 public_programs += exe
2541 meson.add_install_script(meson_make_symlink,
2542 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2544 exe = executable('systemd-run',
2546 include_directories : includes,
2547 link_with : [libshared],
2548 install_rpath : rootlibexecdir,
2550 public_programs += exe
2552 exe = executable('systemd-stdio-bridge',
2553 'src/stdio-bridge/stdio-bridge.c',
2554 include_directories : includes,
2555 link_with : [libshared],
2556 install_rpath : rootlibexecdir,
2558 public_programs += exe
2560 exe = executable('busctl',
2561 'src/busctl/busctl.c',
2562 'src/busctl/busctl-introspect.c',
2563 'src/busctl/busctl-introspect.h',
2564 include_directories : includes,
2565 link_with : [libshared],
2566 install_rpath : rootlibexecdir,
2568 public_programs += exe
2570 if conf.get('ENABLE_SYSUSERS') == 1
2571 exe = executable('systemd-sysusers',
2572 'src/sysusers/sysusers.c',
2573 include_directories : includes,
2574 link_with : [libshared],
2575 install_rpath : rootlibexecdir,
2577 install_dir : rootbindir)
2578 public_programs += exe
2581 if conf.get('ENABLE_TMPFILES') == 1
2582 exe = executable('systemd-tmpfiles',
2583 'src/tmpfiles/tmpfiles.c',
2584 include_directories : includes,
2585 link_with : [libshared],
2586 dependencies : [libacl],
2587 install_rpath : rootlibexecdir,
2589 install_dir : rootbindir)
2590 public_programs += exe
2592 if want_tests != 'false'
2593 test('test-systemd-tmpfiles',
2594 test_systemd_tmpfiles_py,
2595 # https://github.com/mesonbuild/meson/issues/2681
2596 args : exe.full_path())
2600 if conf.get('ENABLE_HWDB') == 1
2601 exe = executable('systemd-hwdb',
2603 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2604 include_directories : includes,
2605 link_with : [libudev_static],
2606 install_rpath : udev_rpath,
2608 install_dir : rootbindir)
2609 public_programs += exe
2612 if conf.get('ENABLE_QUOTACHECK') == 1
2613 executable('systemd-quotacheck',
2614 'src/quotacheck/quotacheck.c',
2615 include_directories : includes,
2616 link_with : [libshared],
2617 install_rpath : rootlibexecdir,
2619 install_dir : rootlibexecdir)
2622 exe = executable('systemd-socket-proxyd',
2623 'src/socket-proxy/socket-proxyd.c',
2624 include_directories : includes,
2625 link_with : [libshared],
2626 dependencies : [threads],
2627 install_rpath : rootlibexecdir,
2629 install_dir : rootlibexecdir)
2630 public_programs += exe
2632 exe = executable('systemd-udevd',
2633 systemd_udevd_sources,
2634 include_directories : includes,
2635 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2636 link_with : [libudev_core,
2639 dependencies : [threads,
2644 install_rpath : udev_rpath,
2646 install_dir : rootlibexecdir)
2647 public_programs += exe
2649 exe = executable('udevadm',
2651 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2652 include_directories : includes,
2653 link_with : [libudev_core,
2656 dependencies : [threads,
2661 install_rpath : udev_rpath,
2663 install_dir : rootbindir)
2664 public_programs += exe
2666 executable('systemd-shutdown',
2667 systemd_shutdown_sources,
2668 include_directories : includes,
2669 link_with : [libshared],
2670 dependencies : [libmount],
2671 install_rpath : rootlibexecdir,
2673 install_dir : rootlibexecdir)
2675 executable('systemd-update-done',
2676 'src/update-done/update-done.c',
2677 include_directories : includes,
2678 link_with : [libshared],
2679 install_rpath : rootlibexecdir,
2681 install_dir : rootlibexecdir)
2683 executable('systemd-update-utmp',
2684 'src/update-utmp/update-utmp.c',
2685 include_directories : includes,
2686 link_with : [libshared],
2687 dependencies : [libaudit],
2688 install_rpath : rootlibexecdir,
2690 install_dir : rootlibexecdir)
2692 if conf.get('HAVE_KMOD') == 1
2693 executable('systemd-modules-load',
2694 'src/modules-load/modules-load.c',
2695 include_directories : includes,
2696 link_with : [libshared],
2697 dependencies : [libkmod],
2698 install_rpath : rootlibexecdir,
2700 install_dir : rootlibexecdir)
2702 meson.add_install_script('sh', '-c',
2703 mkdir_p.format(modulesloaddir))
2704 meson.add_install_script('sh', '-c',
2705 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2708 exe = executable('systemd-nspawn',
2709 systemd_nspawn_sources,
2710 'src/core/mount-setup.c', # FIXME: use a variable?
2711 'src/core/mount-setup.h',
2712 'src/core/loopback-setup.c',
2713 'src/core/loopback-setup.h',
2714 include_directories : includes,
2715 link_with : [libnspawn_core,
2717 dependencies : [libblkid],
2718 install_rpath : rootlibexecdir,
2720 public_programs += exe
2722 if conf.get('ENABLE_NETWORKD') == 1
2723 executable('systemd-networkd',
2724 systemd_networkd_sources,
2725 include_directories : includes,
2726 link_with : [libnetworkd_core,
2730 dependencies : [threads],
2731 install_rpath : rootlibexecdir,
2733 install_dir : rootlibexecdir)
2735 executable('systemd-networkd-wait-online',
2736 systemd_networkd_wait_online_sources,
2737 include_directories : includes,
2738 link_with : [libnetworkd_core,
2740 install_rpath : rootlibexecdir,
2742 install_dir : rootlibexecdir)
2744 exe = executable('networkctl',
2746 include_directories : includes,
2747 link_with : [libsystemd_network,
2749 install_rpath : rootlibexecdir,
2751 install_dir : rootbindir)
2752 public_programs += exe
2755 executable('systemd-sulogin-shell',
2756 ['src/sulogin-shell/sulogin-shell.c'],
2757 include_directories : includes,
2758 link_with : [libshared],
2759 install_rpath : rootlibexecdir,
2761 install_dir : rootlibexecdir)
2763 ############################################################
2766 'systemd-runtest.env',
2767 output : 'systemd-runtest.env',
2768 command : ['sh', '-c', '{ ' +
2769 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2770 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2772 build_by_default : true)
2774 foreach tuple : tests
2776 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2777 dependencies = tuple[2]
2778 condition = tuple.length() >= 4 ? tuple[3] : ''
2779 type = tuple.length() >= 5 ? tuple[4] : ''
2780 defs = tuple.length() >= 6 ? tuple[5] : []
2781 incs = tuple.length() >= 7 ? tuple[6] : includes
2784 name = sources[0].split('/')[-1].split('.')[0]
2785 if type.startswith('timeout=')
2786 timeout = type.split('=')[1].to_int()
2790 if condition == '' or conf.get(condition) == 1
2794 include_directories : incs,
2795 link_with : link_with,
2796 dependencies : dependencies,
2798 build_by_default : want_tests != 'false',
2799 install_rpath : rootlibexecdir,
2800 install : install_tests,
2801 install_dir : join_paths(testsdir, type))
2804 message('@0@ is a manual test'.format(name))
2805 elif type == 'unsafe' and want_tests != 'unsafe'
2806 message('@0@ is an unsafe test'.format(name))
2807 elif want_tests != 'false'
2813 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2818 'test-libsystemd-sym',
2819 test_libsystemd_sym_c,
2820 include_directories : includes,
2821 link_with : [libsystemd],
2822 build_by_default : want_tests != 'false',
2823 install : install_tests,
2824 install_dir : testsdir)
2825 if want_tests != 'false'
2826 test('test-libsystemd-sym', exe)
2830 'test-libsystemd-static-sym',
2831 test_libsystemd_sym_c,
2832 include_directories : includes,
2833 link_with : [install_libsystemd_static],
2834 dependencies : [threads], # threads is already included in dependencies on the library,
2835 # but does not seem to get propagated. Add here as a work-around.
2836 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2837 install : install_tests and static_libsystemd_pic,
2838 install_dir : testsdir)
2839 if want_tests != 'false' and static_libsystemd_pic
2840 test('test-libsystemd-static-sym', exe)
2846 include_directories : includes,
2847 c_args : '-Wno-deprecated-declarations',
2848 link_with : [libudev],
2849 build_by_default : want_tests != 'false',
2850 install : install_tests,
2851 install_dir : testsdir)
2852 if want_tests != 'false'
2853 test('test-libudev-sym', exe)
2857 'test-libudev-static-sym',
2859 include_directories : includes,
2860 c_args : '-Wno-deprecated-declarations',
2861 link_with : [install_libudev_static],
2862 build_by_default : want_tests != 'false' and static_libudev_pic,
2863 install : install_tests and static_libudev_pic,
2864 install_dir : testsdir)
2865 if want_tests != 'false' and static_libudev_pic
2866 test('test-libudev-static-sym', exe)
2869 ############################################################
2873 if get_option('tests') != 'false'
2874 foreach tuple : fuzzers
2876 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2877 dependencies = tuple[2]
2878 defs = tuple.length() >= 4 ? tuple[3] : []
2879 incs = tuple.length() >= 5 ? tuple[4] : includes
2882 dependencies += fuzzing_engine
2884 sources += 'src/fuzz/fuzz-main.c'
2887 name = sources[0].split('/')[-1].split('.')[0]
2889 fuzzer_exes += executable(
2892 include_directories : [incs, include_directories('src/fuzz')],
2893 link_with : link_with,
2894 dependencies : dependencies,
2900 run_target('fuzzers',
2901 depends : fuzzer_exes,
2904 ############################################################
2906 make_directive_index_py = find_program('tools/make-directive-index.py')
2907 make_man_index_py = find_program('tools/make-man-index.py')
2908 xml_helper_py = find_program('tools/xml_helper.py')
2909 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2913 subdir('sysusers.d')
2914 subdir('tmpfiles.d')
2919 subdir('shell-completion/bash')
2920 subdir('shell-completion/zsh')
2921 subdir('docs/sysvinit')
2922 subdir('docs/var-log')
2924 install_subdir('factory/etc',
2925 install_dir : factorydir)
2927 install_data('xorg/50-systemd-user.sh',
2928 install_dir : xinitrcdir)
2929 install_data('modprobe.d/systemd.conf',
2930 install_dir : modprobedir)
2931 install_data('LICENSE.GPL2',
2935 'docs/CODING_STYLE.md',
2936 'docs/DISTRO_PORTING.md',
2937 'docs/ENVIRONMENT.md',
2939 'docs/TRANSIENT-SETTINGS.md',
2940 'docs/TRANSLATORS.md',
2941 'docs/UIDS-GIDS.md',
2942 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2943 install_dir : docdir)
2945 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2946 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2948 ############################################################
2950 meson_check_help = find_program('tools/meson-check-help.sh')
2952 foreach exec : public_programs
2953 name = exec.full_path().split('/')[-1]
2954 if want_tests != 'false'
2955 test('check-help-' + name,
2957 args : exec.full_path())
2961 ############################################################
2963 # Enable tests for all supported sanitizers
2964 foreach tuple : sanitizers
2965 sanitizer = tuple[0]
2968 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2970 foreach p : fuzz_regression_tests
2971 b = p.split('/')[-2]
2972 c = p.split('/')[-1]
2974 name = '@0@:@1@'.format(b, sanitizer)
2977 if want_tests == 'false'
2978 message('Not compiling @0@ because tests is set to false'.format(name))
2980 exe = custom_target(
2984 command : [env, 'ln', '-fs',
2985 join_paths(build.full_path(), b),
2987 build_by_default : true)
2989 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2994 if want_tests != 'false' and slow_tests
2995 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2997 args : [exe.full_path(),
2998 join_paths(meson.source_root(), p)])
3005 ############################################################
3008 all_files = run_command(
3010 ['--git-dir=@0@/.git'.format(meson.source_root()),
3013 all_files = files(all_files.stdout().split())
3018 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3021 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3025 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3028 command : [meson_git_contrib_sh])
3032 git_head = run_command(
3034 ['--git-dir=@0@/.git'.format(meson.source_root()),
3035 'rev-parse', 'HEAD']).stdout().strip()
3036 git_head_short = run_command(
3038 ['--git-dir=@0@/.git'.format(meson.source_root()),
3039 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3043 command : ['git', 'archive',
3044 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3046 '--prefix', 'systemd-@0@/'.format(git_head),
3050 ############################################################
3052 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3055 depends : [man, libsystemd, libudev],
3056 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3058 ############################################################
3061 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3063 'split /usr: @0@'.format(split_usr),
3064 'split bin-sbin: @0@'.format(split_bin),
3065 'prefix directory: @0@'.format(prefixdir),
3066 'rootprefix directory: @0@'.format(rootprefixdir),
3067 'sysconf directory: @0@'.format(sysconfdir),
3068 'include directory: @0@'.format(includedir),
3069 'lib directory: @0@'.format(libdir),
3070 'rootlib directory: @0@'.format(rootlibdir),
3071 'SysV init scripts: @0@'.format(sysvinit_path),
3072 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3073 'PAM modules directory: @0@'.format(pamlibdir),
3074 'PAM configuration directory: @0@'.format(pamconfdir),
3075 'RPM macros directory: @0@'.format(rpmmacrosdir),
3076 'modprobe.d directory: @0@'.format(modprobedir),
3077 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3078 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3079 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3080 'bash completions directory: @0@'.format(bashcompletiondir),
3081 'zsh completions directory: @0@'.format(zshcompletiondir),
3082 'extra start script: @0@'.format(get_option('rc-local')),
3083 'extra stop script: @0@'.format(get_option('halt-local')),
3084 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3085 get_option('debug-tty')),
3086 'TTY GID: @0@'.format(tty_gid),
3087 'users GID: @0@'.format(substs.get('USERS_GID')),
3088 'maximum system UID: @0@'.format(system_uid_max),
3089 'maximum system GID: @0@'.format(system_gid_max),
3090 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3091 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3092 'minimum container UID base: @0@'.format(container_uid_base_min),
3093 'maximum container UID base: @0@'.format(container_uid_base_max),
3094 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3095 'render group access mode: @0@'.format(get_option('group-render-mode')),
3096 'certificate root directory: @0@'.format(get_option('certificate-root')),
3097 'support URL: @0@'.format(support_url),
3098 'nobody user name: @0@'.format(nobody_user),
3099 'nobody group name: @0@'.format(nobody_group),
3100 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3101 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3103 'default DNSSEC mode: @0@'.format(default_dnssec),
3104 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3105 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3106 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3107 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3108 'default locale: @0@'.format(default_locale)]
3110 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3111 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3113 'default DNS servers: @0@'.format(alt_dns_servers),
3114 'default NTP servers: @0@'.format(alt_ntp_servers)]
3116 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3117 '@@0@'.format(time_epoch)).stdout().strip()
3119 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3122 'static libsystemd: @0@'.format(static_libsystemd),
3123 'static libudev: @0@'.format(static_libudev)]
3126 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3127 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3128 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3130 if conf.get('ENABLE_EFI') == 1
3131 status += 'efi arch: @0@'.format(efi_arch)
3135 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3136 'EFI CC @0@'.format(' '.join(efi_cc)),
3137 'EFI lib directory: @0@'.format(efi_libdir),
3138 'EFI lds directory: @0@'.format(efi_ldsdir),
3139 'EFI include directory: @0@'.format(efi_incdir)]
3191 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3192 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3195 ['legacy pkla', install_polkit_pkla],
3197 ['gnu-efi', have_gnu_efi],
3210 ['man pages', want_man],
3211 ['html pages', want_html],
3212 ['man page indices', want_man and have_lxml],
3217 ['adm group', get_option('adm-group')],
3218 ['wheel group', get_option('wheel-group')],
3221 ['debug mmap cache'],
3224 ['valgrind', conf.get('VALGRIND') == 1],
3225 ['trace logging', conf.get('LOG_TRACE') == 1],
3226 ['link-udev-shared', get_option('link-udev-shared')],
3227 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3230 if tuple.length() >= 2
3233 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3234 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3235 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3246 'enabled features: @0@'.format(', '.join(found)),
3248 'disabled features: @0@'.format(', '.join(missing)),
3250 message('\n '.join(status))
3252 if rootprefixdir != rootprefix_default
3254 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3255 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3256 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))