1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.25.0'
16 libudev_version = '1.6.13'
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 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
139 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
140 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
141 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
142 factorydir = join_paths(datadir, 'factory')
143 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
144 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
145 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
146 catalogstatedir = join_paths(systemdstatedir, 'catalog')
147 randomseeddir = join_paths(localstatedir, 'lib/systemd')
148 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
150 docdir = get_option('docdir')
152 docdir = join_paths(datadir, 'doc/systemd')
155 dbuspolicydir = get_option('dbuspolicydir')
156 if dbuspolicydir == ''
157 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
160 dbussessionservicedir = get_option('dbussessionservicedir')
161 if dbussessionservicedir == ''
162 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
165 dbussystemservicedir = get_option('dbussystemservicedir')
166 if dbussystemservicedir == ''
167 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
170 pamlibdir = get_option('pamlibdir')
172 pamlibdir = join_paths(rootlibdir, 'security')
175 pamconfdir = get_option('pamconfdir')
177 pamconfdir = join_paths(sysconfdir, 'pam.d')
180 memory_accounting_default = get_option('memory-accounting-default')
182 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
183 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
184 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
185 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
186 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
187 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
188 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
190 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
192 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
193 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
194 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
195 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
196 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
197 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
198 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
199 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
200 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
201 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
202 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
203 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
204 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
205 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
206 conf.set_quoted('ROOTPREFIX', rootprefixdir)
207 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
208 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
209 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
210 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
211 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
212 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
213 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
214 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
215 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
216 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
217 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
218 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
219 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
220 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
221 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
222 conf.set_quoted('LIBDIR', libdir)
223 conf.set_quoted('ROOTLIBDIR', rootlibdir)
224 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
225 conf.set_quoted('BOOTLIBDIR', bootlibdir)
226 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
227 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
228 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
229 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
230 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
231 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
232 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
233 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
234 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
236 substs.set('prefix', prefixdir)
237 substs.set('rootprefix', rootprefixdir)
238 substs.set('exec_prefix', prefixdir)
239 substs.set('libdir', libdir)
240 substs.set('rootlibdir', rootlibdir)
241 substs.set('includedir', includedir)
242 substs.set('sysconfdir', sysconfdir)
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',
337 '-Wno-error=#warnings',
339 # work-around for gcc 7.1 turning this on on its own.
340 '-Wno-error=nonnull',
342 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
343 # optimizations enabled, producing essentially false positives.
344 '-Wno-maybe-uninitialized',
348 '-fdiagnostics-show-option',
349 '-fno-strict-aliasing',
350 '-fvisibility=hidden',
352 '-fstack-protector-strong',
353 '--param=ssp-buffer-size=4',
356 # --as-needed and --no-undefined are provided by meson by default,
357 # run mesonconf to see what is enabled
358 possible_link_flags = [
363 if cc.get_id() == 'clang'
364 possible_cc_flags += [
365 '-Wno-typedef-redefinition',
366 '-Wno-gnu-variable-sized-type-not-at-end',
370 if get_option('buildtype') != 'debug'
371 possible_cc_flags += [
372 '-ffunction-sections',
376 possible_link_flags += '-Wl,--gc-sections'
379 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
380 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
384 #include <inttypes.h>
385 typedef uint64_t usec_t;
386 usec_t now(clockid_t clock);
391 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
392 add_project_arguments('-Werror=shadow', language : 'c')
395 cpp = ' '.join(cc.cmd_array()) + ' -E'
397 #####################################################################
398 # compilation result tests
400 conf.set('_GNU_SOURCE', true)
401 conf.set('__SANE_USERSPACE_TYPES__', true)
403 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
404 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
405 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
406 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
407 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
408 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
409 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
413 #include <sys/stat.h>
416 foreach decl : ['char16_t',
421 # We get -1 if the size cannot be determined
422 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
424 if decl == 'struct statx'
426 want_linux_stat_h = false
428 have = cc.sizeof(decl,
429 prefix : decl_headers + '#include <linux/stat.h>',
430 args : '-D_GNU_SOURCE') > 0
431 want_linux_stat_h = have
435 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
438 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
440 foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
441 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
442 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
443 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
444 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
445 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
446 ['FRA_TUN_ID', 'linux/fib_rules.h'],
447 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
448 ['FRA_PAD', 'linux/fib_rules.h'],
449 ['FRA_L3MDEV', 'linux/fib_rules.h'],
450 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
451 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
452 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
453 ['FOU_CMD_GET', 'linux/fou.h'],
454 ['IFA_FLAGS', 'linux/if_addr.h'],
455 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
456 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
457 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
458 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
459 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
460 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
461 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
462 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
463 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
464 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
465 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
466 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
467 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
468 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
469 ['IFLA_PAD', 'linux/if_link.h'],
470 ['IFLA_XDP', 'linux/if_link.h'],
471 ['IFLA_EVENT', 'linux/if_link.h'],
472 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
473 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
474 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
475 ['IFLA_MAX_MTU', 'linux/if_link.h'],
476 ['IFLA_BOND_MODE', 'linux/if_link.h'],
477 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
478 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
479 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
480 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
481 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
482 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
483 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
484 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
485 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
486 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
487 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
488 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
489 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
490 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
491 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
492 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
493 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
494 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
495 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
496 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
497 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
498 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
499 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
500 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
501 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
502 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
503 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
504 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
505 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
506 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
507 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
508 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
509 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
510 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
511 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
512 # if_tunnel.h is buggy and cannot be included on its own
513 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
514 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
515 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
516 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
517 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
518 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
519 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
520 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
521 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
522 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
523 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
525 prefix = decl.length() > 2 ? decl[2] : ''
526 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
527 conf.set10('HAVE_' + decl[0], have)
530 foreach ident : ['secure_getenv', '__secure_getenv']
531 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
535 ['memfd_create', '''#include <sys/mman.h>'''],
536 ['gettid', '''#include <sys/types.h>
537 #include <unistd.h>'''],
538 ['pivot_root', '''#include <stdlib.h>
539 #include <unistd.h>'''], # no known header declares pivot_root
540 ['name_to_handle_at', '''#include <sys/types.h>
541 #include <sys/stat.h>
542 #include <fcntl.h>'''],
543 ['setns', '''#include <sched.h>'''],
544 ['renameat2', '''#include <stdio.h>
545 #include <fcntl.h>'''],
546 ['kcmp', '''#include <linux/kcmp.h>'''],
547 ['keyctl', '''#include <sys/types.h>
548 #include <keyutils.h>'''],
549 ['copy_file_range', '''#include <sys/syscall.h>
550 #include <unistd.h>'''],
551 ['bpf', '''#include <sys/syscall.h>
552 #include <unistd.h>'''],
553 ['statx', '''#include <sys/types.h>
554 #include <sys/stat.h>
555 #include <unistd.h>'''],
556 ['explicit_bzero' , '''#include <string.h>'''],
557 ['reallocarray', '''#include <malloc.h>'''],
560 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
561 conf.set10('HAVE_' + ident[0].to_upper(), have)
564 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
565 conf.set10('USE_SYS_RANDOM_H', true)
566 conf.set10('HAVE_GETRANDOM', true)
568 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
569 conf.set10('USE_SYS_RANDOM_H', false)
570 conf.set10('HAVE_GETRANDOM', have)
573 #####################################################################
575 vcs_tagger = [meson.source_root() + '/tools/meson-vcs-tag.sh',
577 get_option('version-tag'),
578 meson.project_version()]
581 input : 'src/version/version.h.in',
582 output : 'version.h',
585 versiondep = declare_dependency(sources: version_h)
587 sed = find_program('sed')
588 awk = find_program('awk')
589 m4 = find_program('m4')
590 stat = find_program('stat')
591 git = find_program('git', required : false)
592 env = find_program('env')
593 perl = find_program('perl', required : false)
595 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
596 mkdir_p = 'mkdir -p $DESTDIR/@0@'
597 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
598 splash_bmp = files('test/splash.bmp')
600 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
601 # /usr/sbin, /sbin, and fall back to the default from middle column.
602 progs = [['quotaon', '/usr/sbin/quotaon' ],
603 ['quotacheck', '/usr/sbin/quotacheck' ],
604 ['kmod', '/usr/bin/kmod' ],
605 ['kexec', '/usr/sbin/kexec' ],
606 ['sulogin', '/usr/sbin/sulogin' ],
607 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
608 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
609 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
610 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
613 path = get_option(prog[0] + '-path')
615 message('Using @1@ for @0@'.format(prog[0], path))
617 exe = find_program(prog[0],
618 '/usr/sbin/' + prog[0],
621 path = exe.found() ? exe.path() : prog[1]
623 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
624 conf.set_quoted(name, path)
625 substs.set(name, path)
628 conf.set_quoted('TELINIT', get_option('telinit-path'))
630 if run_command('ln', '--relative', '--help').returncode() != 0
631 error('ln does not support --relative (added in coreutils 8.16)')
634 ############################################################
636 gperf = find_program('gperf')
638 gperf_test_format = '''
640 const char * in_word_set(const char *, @0@);
643 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
644 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
645 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
646 if cc.compiles(gperf_test)
647 gperf_len_type = 'size_t'
649 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
650 if cc.compiles(gperf_test)
651 gperf_len_type = 'unsigned'
653 error('unable to determine gperf len type')
656 message('gperf len type is @0@'.format(gperf_len_type))
657 conf.set('GPERF_LEN_TYPE', gperf_len_type,
658 description : 'The type of gperf "len" parameter')
660 ############################################################
662 if not cc.has_header('sys/capability.h')
663 error('POSIX caps headers not found')
665 foreach header : ['crypt.h',
666 'linux/btrfs_tree.h',
669 'linux/vm_sockets.h',
672 'valgrind/memcheck.h',
673 'valgrind/valgrind.h',
676 conf.set10('HAVE_' + header.underscorify().to_upper(),
677 cc.has_header(header))
680 ############################################################
682 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
683 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
684 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
686 default_hierarchy = get_option('default-hierarchy')
687 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
688 description : 'default cgroup hierarchy as string')
689 if default_hierarchy == 'legacy'
690 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
691 elif default_hierarchy == 'hybrid'
692 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
694 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
697 default_net_naming_scheme = get_option('default-net-naming-scheme')
698 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
700 time_epoch = get_option('time-epoch')
703 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
705 conf.set('TIME_EPOCH', time_epoch)
707 system_uid_max = get_option('system-uid-max')
708 if system_uid_max == -1
709 system_uid_max = run_command(
711 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
712 '/etc/login.defs').stdout().strip()
713 if system_uid_max == ''
716 system_uid_max = system_uid_max.to_int()
719 conf.set('SYSTEM_UID_MAX', system_uid_max)
720 substs.set('systemuidmax', system_uid_max)
722 system_gid_max = get_option('system-gid-max')
723 if system_gid_max == -1
724 system_gid_max = run_command(
726 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
727 '/etc/login.defs').stdout().strip()
728 if system_gid_max == ''
731 system_gid_max = system_gid_max.to_int()
734 conf.set('SYSTEM_GID_MAX', system_gid_max)
735 substs.set('systemgidmax', system_gid_max)
737 dynamic_uid_min = get_option('dynamic-uid-min')
738 dynamic_uid_max = get_option('dynamic-uid-max')
739 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
740 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
741 substs.set('dynamicuidmin', dynamic_uid_min)
742 substs.set('dynamicuidmax', dynamic_uid_max)
744 container_uid_base_min = get_option('container-uid-base-min')
745 container_uid_base_max = get_option('container-uid-base-max')
746 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
747 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
748 substs.set('containeruidbasemin', container_uid_base_min)
749 substs.set('containeruidbasemax', container_uid_base_max)
751 nobody_user = get_option('nobody-user')
752 nobody_group = get_option('nobody-group')
754 if not meson.is_cross_build()
755 getent_result = run_command('getent', 'passwd', '65534')
756 if getent_result.returncode() == 0
757 name = getent_result.stdout().split(':')[0]
758 if name != nobody_user
760 '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) +
761 'Your build will result in an user table setup that is incompatible with the local system.')
764 id_result = run_command('id', '-u', nobody_user)
765 if id_result.returncode() == 0
766 id = id_result.stdout().to_int()
769 '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) +
770 'Your build will result in an user table setup that is incompatible with the local system.')
774 getent_result = run_command('getent', 'group', '65534')
775 if getent_result.returncode() == 0
776 name = getent_result.stdout().split(':')[0]
777 if name != nobody_group
779 '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) +
780 'Your build will result in an group table setup that is incompatible with the local system.')
783 id_result = run_command('id', '-g', nobody_group)
784 if id_result.returncode() == 0
785 id = id_result.stdout().to_int()
788 '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) +
789 'Your build will result in an group table setup that is incompatible with the local system.')
793 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
795 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
796 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
799 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
800 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
801 substs.set('NOBODY_USER_NAME', nobody_user)
802 substs.set('NOBODY_GROUP_NAME', nobody_group)
804 tty_gid = get_option('tty-gid')
805 conf.set('TTY_GID', tty_gid)
806 substs.set('TTY_GID', tty_gid)
808 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
809 users_gid = get_option('users-gid')
810 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
812 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
813 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
815 dev_kvm_mode = get_option('dev-kvm-mode')
816 substs.set('DEV_KVM_MODE', dev_kvm_mode)
817 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
818 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
820 kill_user_processes = get_option('default-kill-user-processes')
821 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
822 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
823 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
825 dns_servers = get_option('dns-servers')
826 conf.set_quoted('DNS_SERVERS', dns_servers)
827 substs.set('DNS_SERVERS', dns_servers)
829 ntp_servers = get_option('ntp-servers')
830 conf.set_quoted('NTP_SERVERS', ntp_servers)
831 substs.set('NTP_SERVERS', ntp_servers)
833 default_locale = get_option('default-locale')
834 if default_locale == ''
835 if not meson.is_cross_build()
836 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
837 default_locale = run_command(choose_default_locale_sh).stdout().strip()
839 default_locale = 'C.UTF-8'
842 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
844 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
846 substs.set('SUSHELL', get_option('debug-shell'))
847 substs.set('DEBUGTTY', get_option('debug-tty'))
849 enable_debug_hashmap = false
850 enable_debug_mmap_cache = false
851 enable_debug_siphash = false
852 enable_debug_udev = false
853 foreach name : get_option('debug-extra')
855 enable_debug_hashmap = true
856 elif name == 'mmap-cache'
857 enable_debug_mmap_cache = true
858 elif name == 'siphash'
859 enable_debug_siphash = true
861 enable_debug_udev = true
863 message('unknown debug option "@0@", ignoring'.format(name))
866 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
867 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
868 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
869 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
871 conf.set10('VALGRIND', get_option('valgrind'))
872 conf.set10('LOG_TRACE', get_option('log-trace'))
874 #####################################################################
876 threads = dependency('threads')
877 librt = cc.find_library('rt')
878 libm = cc.find_library('m')
879 libdl = cc.find_library('dl')
880 libcrypt = cc.find_library('crypt')
882 libcap = dependency('libcap', required : false)
883 if not libcap.found()
884 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
885 libcap = cc.find_library('cap')
888 libmount = dependency('mount',
889 version : fuzzer_build ? '>= 0' : '>= 2.30')
891 want_seccomp = get_option('seccomp')
892 if want_seccomp != 'false' and not fuzzer_build
893 libseccomp = dependency('libseccomp',
894 version : '>= 2.3.1',
895 required : want_seccomp == 'true')
896 have = libseccomp.found()
901 conf.set10('HAVE_SECCOMP', have)
903 want_selinux = get_option('selinux')
904 if want_selinux != 'false' and not fuzzer_build
905 libselinux = dependency('libselinux',
906 version : '>= 2.1.9',
907 required : want_selinux == 'true')
908 have = libselinux.found()
913 conf.set10('HAVE_SELINUX', have)
915 want_apparmor = get_option('apparmor')
916 if want_apparmor != 'false' and not fuzzer_build
917 libapparmor = dependency('libapparmor',
918 required : want_apparmor == 'true')
919 have = libapparmor.found()
924 conf.set10('HAVE_APPARMOR', have)
926 smack_run_label = get_option('smack-run-label')
927 if smack_run_label != ''
928 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
931 want_polkit = get_option('polkit')
932 install_polkit = false
933 install_polkit_pkla = false
934 if want_polkit != 'false' and not fuzzer_build
935 install_polkit = true
937 libpolkit = dependency('polkit-gobject-1',
939 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
940 message('Old polkit detected, will install pkla files')
941 install_polkit_pkla = true
944 conf.set10('ENABLE_POLKIT', install_polkit)
946 want_acl = get_option('acl')
947 if want_acl != 'false' and not fuzzer_build
948 libacl = cc.find_library('acl', required : want_acl == 'true')
949 have = libacl.found()
954 conf.set10('HAVE_ACL', have)
956 want_audit = get_option('audit')
957 if want_audit != 'false' and not fuzzer_build
958 libaudit = dependency('audit', required : want_audit == 'true')
959 have = libaudit.found()
964 conf.set10('HAVE_AUDIT', have)
966 want_blkid = get_option('blkid')
967 if want_blkid != 'false' and not fuzzer_build
968 libblkid = dependency('blkid', required : want_blkid == 'true')
969 have = libblkid.found()
974 conf.set10('HAVE_BLKID', have)
976 want_kmod = get_option('kmod')
977 if want_kmod != 'false' and not fuzzer_build
978 libkmod = dependency('libkmod',
980 required : want_kmod == 'true')
981 have = libkmod.found()
986 conf.set10('HAVE_KMOD', have)
988 want_pam = get_option('pam')
989 if want_pam != 'false' and not fuzzer_build
990 libpam = cc.find_library('pam', required : want_pam == 'true')
991 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
992 have = libpam.found() and libpam_misc.found()
998 conf.set10('HAVE_PAM', have)
1000 want_microhttpd = get_option('microhttpd')
1001 if want_microhttpd != 'false' and not fuzzer_build
1002 libmicrohttpd = dependency('libmicrohttpd',
1003 version : '>= 0.9.33',
1004 required : want_microhttpd == 'true')
1005 have = libmicrohttpd.found()
1010 conf.set10('HAVE_MICROHTTPD', have)
1012 want_libcryptsetup = get_option('libcryptsetup')
1013 if want_libcryptsetup != 'false' and not fuzzer_build
1014 libcryptsetup = dependency('libcryptsetup',
1015 version : '>= 1.6.0',
1016 required : want_libcryptsetup == 'true')
1017 have = libcryptsetup.found()
1018 have_sector = cc.has_member(
1019 'struct crypt_params_plain',
1021 prefix : '#include <libcryptsetup.h>')
1027 conf.set10('HAVE_LIBCRYPTSETUP', have)
1028 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1030 want_libcurl = get_option('libcurl')
1031 if want_libcurl != 'false' and not fuzzer_build
1032 libcurl = dependency('libcurl',
1033 version : '>= 7.32.0',
1034 required : want_libcurl == 'true')
1035 have = libcurl.found()
1040 conf.set10('HAVE_LIBCURL', have)
1042 want_libidn = get_option('libidn')
1043 want_libidn2 = get_option('libidn2')
1044 if want_libidn == 'true' and want_libidn2 == 'true'
1045 error('libidn and libidn2 cannot be requested simultaneously')
1048 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1049 libidn = dependency('libidn',
1050 required : want_libidn == 'true')
1051 have = libidn.found()
1056 conf.set10('HAVE_LIBIDN', have)
1057 if not have and want_libidn2 != 'false' and not fuzzer_build
1058 # libidn is used for both libidn and libidn2 objects
1059 libidn = dependency('libidn2',
1060 required : want_libidn2 == 'true')
1061 have = libidn.found()
1065 conf.set10('HAVE_LIBIDN2', have)
1067 want_libiptc = get_option('libiptc')
1068 if want_libiptc != 'false' and not fuzzer_build
1069 libiptc = dependency('libiptc',
1070 required : want_libiptc == 'true')
1071 have = libiptc.found()
1076 conf.set10('HAVE_LIBIPTC', have)
1078 want_qrencode = get_option('qrencode')
1079 if want_qrencode != 'false' and not fuzzer_build
1080 libqrencode = dependency('libqrencode',
1081 required : want_qrencode == 'true')
1082 have = libqrencode.found()
1087 conf.set10('HAVE_QRENCODE', have)
1089 want_gcrypt = get_option('gcrypt')
1090 if want_gcrypt != 'false' and not fuzzer_build
1091 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1092 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1093 have = libgcrypt.found() and libgpg_error.found()
1098 # link to neither of the libs if one is not found
1102 conf.set10('HAVE_GCRYPT', have)
1104 want_gnutls = get_option('gnutls')
1105 if want_gnutls != 'false' and not fuzzer_build
1106 libgnutls = dependency('gnutls',
1107 version : '>= 3.1.4',
1108 required : want_gnutls == 'true')
1109 have = libgnutls.found()
1114 conf.set10('HAVE_GNUTLS', have)
1116 want_openssl = get_option('openssl')
1117 if want_openssl != 'false' and not fuzzer_build
1118 libopenssl = dependency('openssl',
1119 version : '>= 1.1.0',
1120 required : want_openssl == 'true')
1121 have = libopenssl.found()
1126 conf.set10('HAVE_OPENSSL', have)
1128 want_elfutils = get_option('elfutils')
1129 if want_elfutils != 'false' and not fuzzer_build
1130 libdw = dependency('libdw',
1131 required : want_elfutils == 'true')
1132 have = libdw.found()
1137 conf.set10('HAVE_ELFUTILS', have)
1139 want_zlib = get_option('zlib')
1140 if want_zlib != 'false' and not fuzzer_build
1141 libz = dependency('zlib',
1142 required : want_zlib == 'true')
1148 conf.set10('HAVE_ZLIB', have)
1150 want_bzip2 = get_option('bzip2')
1151 if want_bzip2 != 'false' and not fuzzer_build
1152 libbzip2 = cc.find_library('bz2',
1153 required : want_bzip2 == 'true')
1154 have = libbzip2.found()
1159 conf.set10('HAVE_BZIP2', have)
1161 want_xz = get_option('xz')
1162 if want_xz != 'false' and not fuzzer_build
1163 libxz = dependency('liblzma',
1164 required : want_xz == 'true')
1165 have = libxz.found()
1170 conf.set10('HAVE_XZ', have)
1172 want_lz4 = get_option('lz4')
1173 if want_lz4 != 'false' and not fuzzer_build
1174 liblz4 = dependency('liblz4',
1175 version : '>= 1.3.0',
1176 required : want_lz4 == 'true')
1177 have = liblz4.found()
1182 conf.set10('HAVE_LZ4', have)
1184 want_xkbcommon = get_option('xkbcommon')
1185 if want_xkbcommon != 'false' and not fuzzer_build
1186 libxkbcommon = dependency('xkbcommon',
1187 version : '>= 0.3.0',
1188 required : want_xkbcommon == 'true')
1189 have = libxkbcommon.found()
1194 conf.set10('HAVE_XKBCOMMON', have)
1196 want_pcre2 = get_option('pcre2')
1197 if want_pcre2 != 'false'
1198 libpcre2 = dependency('libpcre2-8',
1199 required : want_pcre2 == 'true')
1200 have = libpcre2.found()
1205 conf.set10('HAVE_PCRE2', have)
1207 want_glib = get_option('glib')
1208 if want_glib != 'false' and not fuzzer_build
1209 libglib = dependency('glib-2.0',
1210 version : '>= 2.22.0',
1211 required : want_glib == 'true')
1212 libgobject = dependency('gobject-2.0',
1213 version : '>= 2.22.0',
1214 required : want_glib == 'true')
1215 libgio = dependency('gio-2.0',
1216 required : want_glib == 'true')
1217 have = libglib.found() and libgobject.found() and libgio.found()
1224 conf.set10('HAVE_GLIB', have)
1226 want_dbus = get_option('dbus')
1227 if want_dbus != 'false' and not fuzzer_build
1228 libdbus = dependency('dbus-1',
1229 version : '>= 1.3.2',
1230 required : want_dbus == 'true')
1231 have = libdbus.found()
1236 conf.set10('HAVE_DBUS', have)
1238 default_dnssec = get_option('default-dnssec')
1240 default_dnssec = 'no'
1242 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1243 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1244 default_dnssec = 'no'
1246 conf.set('DEFAULT_DNSSEC_MODE',
1247 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1248 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1250 dns_over_tls = get_option('dns-over-tls')
1251 if dns_over_tls != 'false'
1252 if dns_over_tls == 'openssl'
1255 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1256 if dns_over_tls == 'gnutls' and not have_gnutls
1257 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1260 if dns_over_tls == 'gnutls' or have_gnutls
1261 have_openssl = false
1263 have_openssl = conf.get('HAVE_OPENSSL') == 1
1264 if dns_over_tls != 'auto' and not have_openssl
1265 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1266 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1269 have = have_gnutls or have_openssl
1273 have_openssl = false
1275 conf.set10('ENABLE_DNS_OVER_TLS', have)
1276 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1277 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1279 default_dns_over_tls = get_option('default-dns-over-tls')
1281 default_dns_over_tls = 'no'
1283 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1284 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1285 default_dns_over_tls = 'no'
1287 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1288 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1289 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1291 want_importd = get_option('importd')
1292 if want_importd != 'false'
1293 have = (conf.get('HAVE_LIBCURL') == 1 and
1294 conf.get('HAVE_ZLIB') == 1 and
1295 conf.get('HAVE_XZ') == 1 and
1296 conf.get('HAVE_GCRYPT') == 1)
1297 if want_importd == 'true' and not have
1298 error('importd support was requested, but dependencies are not available')
1303 conf.set10('ENABLE_IMPORTD', have)
1305 want_remote = get_option('remote')
1306 if want_remote != 'false'
1307 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1308 conf.get('HAVE_LIBCURL') == 1]
1309 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1310 # it's possible to build one without the other. Complain only if
1311 # support was explictly requested. The auxiliary files like sysusers
1312 # config should be installed when any of the programs are built.
1313 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1314 error('remote support was requested, but dependencies are not available')
1316 have = have_deps[0] or have_deps[1]
1320 conf.set10('ENABLE_REMOTE', have)
1322 foreach term : ['utmp',
1354 have = get_option(term)
1355 name = 'ENABLE_' + term.underscorify().to_upper()
1356 conf.set10(name, have)
1359 foreach tuple : [['nss-mymachines', 'machined'],
1360 ['nss-resolve', 'resolve']]
1361 want = get_option(tuple[0])
1363 have = get_option(tuple[1])
1364 if want == 'true' and not have
1365 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1370 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1371 conf.set10(name, have)
1375 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1376 'ENABLE_NSS_MYMACHINES',
1377 'ENABLE_NSS_RESOLVE',
1378 'ENABLE_NSS_SYSTEMD']
1379 if conf.get(term) == 1
1383 conf.set10('ENABLE_NSS', enable_nss)
1385 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1390 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1392 #####################################################################
1394 if get_option('efi')
1395 efi_arch = host_machine.cpu_family()
1397 if efi_arch == 'x86'
1398 EFI_MACHINE_TYPE_NAME = 'ia32'
1399 gnu_efi_arch = 'ia32'
1400 elif efi_arch == 'x86_64'
1401 EFI_MACHINE_TYPE_NAME = 'x64'
1402 gnu_efi_arch = 'x86_64'
1403 elif efi_arch == 'arm'
1404 EFI_MACHINE_TYPE_NAME = 'arm'
1405 gnu_efi_arch = 'arm'
1406 elif efi_arch == 'aarch64'
1407 EFI_MACHINE_TYPE_NAME = 'aa64'
1408 gnu_efi_arch = 'aarch64'
1410 EFI_MACHINE_TYPE_NAME = ''
1415 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1417 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1421 conf.set10('ENABLE_EFI', have)
1423 #####################################################################
1425 config_h = configure_file(
1426 output : 'config.h',
1427 configuration : conf)
1429 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1431 includes = include_directories('src/basic',
1435 'src/journal-remote',
1439 'src/time-wait-sync',
1445 'src/libsystemd/sd-bus',
1446 'src/libsystemd/sd-device',
1447 'src/libsystemd/sd-event',
1448 'src/libsystemd/sd-hwdb',
1449 'src/libsystemd/sd-id128',
1450 'src/libsystemd/sd-netlink',
1451 'src/libsystemd/sd-network',
1452 'src/libsystemd/sd-resolve',
1453 'src/libsystemd-network',
1456 add_project_arguments('-include', 'config.h', language : 'c')
1458 generate_gperfs = find_program('tools/generate-gperfs.py')
1462 subdir('src/systemd')
1464 subdir('src/libsystemd')
1465 subdir('src/libsystemd-network')
1466 subdir('src/journal')
1469 libjournal_core = static_library(
1471 libjournal_core_sources,
1473 include_directories : includes,
1476 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1477 libsystemd = shared_library(
1480 version : libsystemd_version,
1481 include_directories : includes,
1482 link_args : ['-shared',
1483 '-Wl,--version-script=' + libsystemd_sym_path],
1484 link_with : [libbasic,
1486 link_whole : [libsystemd_static,
1488 dependencies : [threads,
1492 link_depends : libsystemd_sym,
1494 install_dir : rootlibdir)
1496 static_libsystemd = get_option('static-libsystemd')
1497 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1499 install_libsystemd_static = static_library(
1502 journal_client_sources,
1504 basic_gcrypt_sources,
1506 include_directories : includes,
1507 build_by_default : static_libsystemd != 'false',
1508 install : static_libsystemd != 'false',
1509 install_dir : rootlibdir,
1510 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1511 dependencies : [threads,
1520 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1522 ############################################################
1524 # binaries that have --help and are intended for use by humans,
1525 # usually, but not always, installed in /bin.
1526 public_programs = []
1528 subdir('src/libudev')
1529 subdir('src/shared')
1531 subdir('src/shutdown')
1533 subdir('src/network')
1535 subdir('src/analyze')
1536 subdir('src/journal-remote')
1537 subdir('src/coredump')
1538 subdir('src/hostname')
1539 subdir('src/import')
1540 subdir('src/kernel-install')
1541 subdir('src/locale')
1542 subdir('src/machine')
1543 subdir('src/portable')
1544 subdir('src/nspawn')
1545 subdir('src/resolve')
1546 subdir('src/timedate')
1547 subdir('src/timesync')
1548 subdir('src/vconsole')
1549 subdir('src/boot/efi')
1556 ############################################################
1558 # only static linking apart from libdl, to make sure that the
1559 # module is linked to all libraries that it uses.
1560 test_dlopen = executable(
1564 include_directories : includes,
1565 link_with : [libbasic],
1566 dependencies : [libdl],
1567 build_by_default : want_tests != 'false')
1569 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1570 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1571 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1572 ['resolve', 'ENABLE_NSS_RESOLVE']]
1574 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1578 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1579 version_script_arg = join_paths(meson.source_root(), sym)
1581 nss = shared_library(
1583 'src/nss-@0@/nss-@0@.c'.format(module),
1586 include_directories : includes,
1587 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1588 link_args : ['-Wl,-z,nodelete',
1590 '-Wl,--version-script=' + version_script_arg,
1592 link_with : [libsystemd_static,
1594 dependencies : [threads,
1598 install_dir : rootlibdir)
1600 # We cannot use shared_module because it does not support version suffix.
1601 # Unfortunately shared_library insists on creating the symlink…
1602 meson.add_install_script('sh', '-c',
1603 'rm $DESTDIR@0@/libnss_@1@.so'
1604 .format(rootlibdir, module))
1606 if want_tests != 'false'
1607 test('dlopen-nss_' + module,
1609 # path to dlopen must include a slash
1610 args : nss.full_path())
1615 ############################################################
1617 executable('systemd',
1619 include_directories : includes,
1620 link_with : [libcore,
1622 dependencies : [versiondep,
1629 install_rpath : rootlibexecdir,
1631 install_dir : rootlibexecdir)
1633 meson.add_install_script(meson_make_symlink,
1634 join_paths(rootlibexecdir, 'systemd'),
1635 join_paths(rootsbindir, 'init'))
1637 exe = executable('systemd-analyze',
1638 systemd_analyze_sources,
1639 include_directories : includes,
1640 link_with : [libcore,
1642 dependencies : [versiondep,
1649 install_rpath : rootlibexecdir,
1651 public_programs += exe
1653 executable('systemd-journald',
1654 systemd_journald_sources,
1655 include_directories : includes,
1656 link_with : [libjournal_core,
1658 dependencies : [threads,
1662 install_rpath : rootlibexecdir,
1664 install_dir : rootlibexecdir)
1666 exe = executable('systemd-cat',
1667 systemd_cat_sources,
1668 include_directories : includes,
1669 link_with : [libjournal_core,
1671 dependencies : [threads],
1672 install_rpath : rootlibexecdir,
1674 public_programs += exe
1676 exe = executable('journalctl',
1678 include_directories : includes,
1679 link_with : [libshared],
1680 dependencies : [threads,
1685 install_rpath : rootlibexecdir,
1687 install_dir : rootbindir)
1688 public_programs += exe
1690 executable('systemd-getty-generator',
1691 'src/getty-generator/getty-generator.c',
1692 include_directories : includes,
1693 link_with : [libshared],
1694 install_rpath : rootlibexecdir,
1696 install_dir : systemgeneratordir)
1698 executable('systemd-debug-generator',
1699 'src/debug-generator/debug-generator.c',
1700 include_directories : includes,
1701 link_with : [libshared],
1702 install_rpath : rootlibexecdir,
1704 install_dir : systemgeneratordir)
1706 executable('systemd-run-generator',
1707 'src/run-generator/run-generator.c',
1708 include_directories : includes,
1709 link_with : [libshared],
1710 install_rpath : rootlibexecdir,
1712 install_dir : systemgeneratordir)
1714 executable('systemd-fstab-generator',
1715 'src/fstab-generator/fstab-generator.c',
1716 include_directories : includes,
1717 link_with : [libcore_shared,
1719 install_rpath : rootlibexecdir,
1721 install_dir : systemgeneratordir)
1723 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1724 executable('30-systemd-environment-d-generator',
1725 'src/environment-d-generator/environment-d-generator.c',
1726 include_directories : includes,
1727 link_with : [libshared],
1728 install_rpath : rootlibexecdir,
1730 install_dir : userenvgeneratordir)
1732 meson.add_install_script(meson_make_symlink,
1733 join_paths(sysconfdir, 'environment'),
1734 join_paths(environmentdir, '99-environment.conf'))
1737 if conf.get('ENABLE_HIBERNATE') == 1
1738 executable('systemd-hibernate-resume-generator',
1739 'src/hibernate-resume/hibernate-resume-generator.c',
1740 include_directories : includes,
1741 link_with : [libshared],
1742 install_rpath : rootlibexecdir,
1744 install_dir : systemgeneratordir)
1746 executable('systemd-hibernate-resume',
1747 'src/hibernate-resume/hibernate-resume.c',
1748 include_directories : includes,
1749 link_with : [libshared],
1750 install_rpath : rootlibexecdir,
1752 install_dir : rootlibexecdir)
1755 if conf.get('HAVE_BLKID') == 1
1756 executable('systemd-gpt-auto-generator',
1757 'src/gpt-auto-generator/gpt-auto-generator.c',
1758 'src/shared/blkid-util.h',
1759 include_directories : includes,
1760 link_with : [libshared],
1761 dependencies : libblkid,
1762 install_rpath : rootlibexecdir,
1764 install_dir : systemgeneratordir)
1766 exe = executable('systemd-dissect',
1767 'src/dissect/dissect.c',
1768 include_directories : includes,
1769 link_with : [libshared],
1770 install_rpath : rootlibexecdir,
1772 install_dir : rootlibexecdir)
1773 public_programs += exe
1776 if conf.get('ENABLE_RESOLVE') == 1
1777 executable('systemd-resolved',
1778 systemd_resolved_sources,
1779 include_directories : includes,
1780 link_with : [libshared,
1782 libsystemd_resolve_core],
1783 dependencies : systemd_resolved_dependencies,
1784 install_rpath : rootlibexecdir,
1786 install_dir : rootlibexecdir)
1788 exe = executable('resolvectl',
1790 include_directories : includes,
1791 link_with : [libshared,
1793 libsystemd_resolve_core],
1794 dependencies : [threads,
1798 install_rpath : rootlibexecdir,
1800 public_programs += exe
1802 meson.add_install_script(meson_make_symlink,
1803 join_paths(bindir, 'resolvectl'),
1804 join_paths(rootsbindir, 'resolvconf'))
1806 meson.add_install_script(meson_make_symlink,
1807 join_paths(bindir, 'resolvectl'),
1808 join_paths(bindir, 'systemd-resolve'))
1811 if conf.get('ENABLE_LOGIND') == 1
1812 executable('systemd-logind',
1813 systemd_logind_sources,
1814 include_directories : includes,
1815 link_with : [liblogind_core,
1817 dependencies : [threads,
1819 install_rpath : rootlibexecdir,
1821 install_dir : rootlibexecdir)
1823 exe = executable('loginctl',
1825 include_directories : includes,
1826 link_with : [libshared],
1827 dependencies : [threads,
1830 install_rpath : rootlibexecdir,
1832 install_dir : rootbindir)
1833 public_programs += exe
1835 exe = executable('systemd-inhibit',
1836 'src/login/inhibit.c',
1837 include_directories : includes,
1838 link_with : [libshared],
1839 install_rpath : rootlibexecdir,
1841 install_dir : rootbindir)
1842 public_programs += exe
1844 if conf.get('HAVE_PAM') == 1
1845 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1846 pam_systemd = shared_library(
1850 include_directories : includes,
1851 link_args : ['-shared',
1852 '-Wl,--version-script=' + version_script_arg],
1853 link_with : [libsystemd_static,
1855 dependencies : [threads,
1858 link_depends : pam_systemd_sym,
1860 install_dir : pamlibdir)
1862 if want_tests != 'false'
1863 test('dlopen-pam_systemd',
1865 # path to dlopen must include a slash
1866 args : pam_systemd.full_path())
1870 executable('systemd-user-runtime-dir',
1871 user_runtime_dir_sources,
1872 include_directories : includes,
1873 link_with : [libshared],
1874 install_rpath : rootlibexecdir,
1876 install_dir : rootlibexecdir)
1879 if conf.get('HAVE_PAM') == 1
1880 executable('systemd-user-sessions',
1881 'src/user-sessions/user-sessions.c',
1882 include_directories : includes,
1883 link_with : [libshared],
1884 install_rpath : rootlibexecdir,
1886 install_dir : rootlibexecdir)
1889 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1890 exe = executable('bootctl',
1891 'src/boot/bootctl.c',
1892 include_directories : includes,
1893 link_with : [libshared],
1894 dependencies : [libblkid],
1895 install_rpath : rootlibexecdir,
1897 public_programs += exe
1899 executable('systemd-bless-boot',
1900 'src/boot/bless-boot.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 dependencies : [libblkid],
1904 install_rpath : rootlibexecdir,
1906 install_dir : rootlibexecdir)
1908 executable('systemd-bless-boot-generator',
1909 'src/boot/bless-boot-generator.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 install_rpath : rootlibexecdir,
1914 install_dir : systemgeneratordir)
1917 executable('systemd-boot-check-no-failures',
1918 'src/boot/boot-check-no-failures.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [libblkid],
1922 install_rpath : rootlibexecdir,
1924 install_dir : rootlibexecdir)
1926 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1927 include_directories : includes,
1928 link_with : [libshared],
1929 dependencies : [threads],
1930 install_rpath : rootlibexecdir,
1932 public_programs += exe
1935 if get_option('link-systemctl-shared')
1936 systemctl_link_with = [libshared]
1938 systemctl_link_with = [libsystemd_static,
1944 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1945 include_directories : includes,
1946 link_with : systemctl_link_with,
1947 dependencies : [threads,
1952 install_rpath : rootlibexecdir,
1954 install_dir : rootbindir)
1955 public_programs += exe
1957 if conf.get('ENABLE_PORTABLED') == 1
1958 executable('systemd-portabled',
1959 systemd_portabled_sources,
1960 include_directories : includes,
1961 link_with : [libshared],
1962 dependencies : [threads],
1963 install_rpath : rootlibexecdir,
1965 install_dir : rootlibexecdir)
1967 exe = executable('portablectl', 'src/portable/portablectl.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 dependencies : [threads],
1971 install_rpath : rootlibexecdir,
1973 install_dir : rootbindir)
1974 public_programs += exe
1977 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1978 meson.add_install_script(meson_make_symlink,
1979 join_paths(rootbindir, 'systemctl'),
1980 join_paths(rootsbindir, alias))
1983 if conf.get('ENABLE_BACKLIGHT') == 1
1984 executable('systemd-backlight',
1985 'src/backlight/backlight.c',
1986 include_directories : includes,
1987 link_with : [libshared],
1988 install_rpath : rootlibexecdir,
1990 install_dir : rootlibexecdir)
1993 if conf.get('ENABLE_RFKILL') == 1
1994 executable('systemd-rfkill',
1995 'src/rfkill/rfkill.c',
1996 include_directories : includes,
1997 link_with : [libshared],
1998 install_rpath : rootlibexecdir,
2000 install_dir : rootlibexecdir)
2003 executable('systemd-system-update-generator',
2004 'src/system-update-generator/system-update-generator.c',
2005 include_directories : includes,
2006 link_with : [libshared],
2007 install_rpath : rootlibexecdir,
2009 install_dir : systemgeneratordir)
2011 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2012 executable('systemd-cryptsetup',
2013 'src/cryptsetup/cryptsetup.c',
2014 include_directories : includes,
2015 link_with : [libshared],
2016 dependencies : [libcryptsetup],
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2021 executable('systemd-cryptsetup-generator',
2022 'src/cryptsetup/cryptsetup-generator.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [libcryptsetup],
2026 install_rpath : rootlibexecdir,
2028 install_dir : systemgeneratordir)
2030 executable('systemd-veritysetup',
2031 'src/veritysetup/veritysetup.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 dependencies : [libcryptsetup],
2035 install_rpath : rootlibexecdir,
2037 install_dir : rootlibexecdir)
2039 executable('systemd-veritysetup-generator',
2040 'src/veritysetup/veritysetup-generator.c',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 dependencies : [libcryptsetup],
2044 install_rpath : rootlibexecdir,
2046 install_dir : systemgeneratordir)
2049 if conf.get('HAVE_SYSV_COMPAT') == 1
2050 executable('systemd-sysv-generator',
2051 'src/sysv-generator/sysv-generator.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 install_rpath : rootlibexecdir,
2056 install_dir : systemgeneratordir)
2058 executable('systemd-rc-local-generator',
2059 'src/rc-local-generator/rc-local-generator.c',
2060 include_directories : includes,
2061 link_with : [libshared],
2062 install_rpath : rootlibexecdir,
2064 install_dir : systemgeneratordir)
2067 if conf.get('ENABLE_HOSTNAMED') == 1
2068 executable('systemd-hostnamed',
2069 'src/hostname/hostnamed.c',
2070 include_directories : includes,
2071 link_with : [libshared],
2072 install_rpath : rootlibexecdir,
2074 install_dir : rootlibexecdir)
2076 exe = executable('hostnamectl',
2077 'src/hostname/hostnamectl.c',
2078 include_directories : includes,
2079 link_with : [libshared],
2080 install_rpath : rootlibexecdir,
2082 public_programs += exe
2085 if conf.get('ENABLE_LOCALED') == 1
2086 if conf.get('HAVE_XKBCOMMON') == 1
2087 # logind will load libxkbcommon.so dynamically on its own
2093 executable('systemd-localed',
2094 systemd_localed_sources,
2095 include_directories : includes,
2096 link_with : [libshared],
2097 dependencies : deps,
2098 install_rpath : rootlibexecdir,
2100 install_dir : rootlibexecdir)
2102 exe = executable('localectl',
2104 include_directories : includes,
2105 link_with : [libshared],
2106 install_rpath : rootlibexecdir,
2108 public_programs += exe
2111 if conf.get('ENABLE_TIMEDATED') == 1
2112 executable('systemd-timedated',
2113 'src/timedate/timedated.c',
2114 include_directories : includes,
2115 link_with : [libshared],
2116 install_rpath : rootlibexecdir,
2118 install_dir : rootlibexecdir)
2121 if conf.get('ENABLE_TIMEDATECTL') == 1
2122 exe = executable('timedatectl',
2123 'src/timedate/timedatectl.c',
2124 include_directories : includes,
2125 install_rpath : rootlibexecdir,
2126 link_with : [libshared],
2127 dependencies : [libm],
2129 public_programs += exe
2132 if conf.get('ENABLE_TIMESYNCD') == 1
2133 executable('systemd-timesyncd',
2134 systemd_timesyncd_sources,
2135 include_directories : includes,
2136 link_with : [libshared],
2137 dependencies : [threads,
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2143 executable('systemd-time-wait-sync',
2144 'src/time-wait-sync/time-wait-sync.c',
2145 include_directories : includes,
2146 link_with : [libshared],
2147 install_rpath : rootlibexecdir,
2149 install_dir : rootlibexecdir)
2152 if conf.get('ENABLE_MACHINED') == 1
2153 executable('systemd-machined',
2154 systemd_machined_sources,
2155 include_directories : includes,
2156 link_with : [libmachine_core,
2158 install_rpath : rootlibexecdir,
2160 install_dir : rootlibexecdir)
2162 exe = executable('machinectl',
2163 'src/machine/machinectl.c',
2164 include_directories : includes,
2165 link_with : [libshared],
2166 dependencies : [threads,
2169 install_rpath : rootlibexecdir,
2171 install_dir : rootbindir)
2172 public_programs += exe
2175 if conf.get('ENABLE_IMPORTD') == 1
2176 executable('systemd-importd',
2177 systemd_importd_sources,
2178 include_directories : includes,
2179 link_with : [libshared],
2180 dependencies : [threads],
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootlibexecdir)
2185 systemd_pull = executable('systemd-pull',
2186 systemd_pull_sources,
2187 include_directories : includes,
2188 link_with : [libshared],
2189 dependencies : [versiondep,
2195 install_rpath : rootlibexecdir,
2197 install_dir : rootlibexecdir)
2199 systemd_import = executable('systemd-import',
2200 systemd_import_sources,
2201 include_directories : includes,
2202 link_with : [libshared],
2203 dependencies : [libcurl,
2207 install_rpath : rootlibexecdir,
2209 install_dir : rootlibexecdir)
2211 systemd_import_fs = executable('systemd-import-fs',
2212 systemd_import_fs_sources,
2213 include_directories : includes,
2214 link_with : [libshared],
2215 install_rpath : rootlibexecdir,
2217 install_dir : rootlibexecdir)
2219 systemd_export = executable('systemd-export',
2220 systemd_export_sources,
2221 include_directories : includes,
2222 link_with : [libshared],
2223 dependencies : [libcurl,
2227 install_rpath : rootlibexecdir,
2229 install_dir : rootlibexecdir)
2231 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2234 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2235 exe = executable('systemd-journal-upload',
2236 systemd_journal_upload_sources,
2237 include_directories : includes,
2238 link_with : [libshared],
2239 dependencies : [versiondep,
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootlibexecdir)
2248 public_programs += exe
2251 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2252 s_j_remote = executable('systemd-journal-remote',
2253 systemd_journal_remote_sources,
2254 include_directories : includes,
2255 link_with : [libshared,
2256 libsystemd_journal_remote],
2257 dependencies : [threads,
2262 install_rpath : rootlibexecdir,
2264 install_dir : rootlibexecdir)
2266 s_j_gatewayd = executable('systemd-journal-gatewayd',
2267 systemd_journal_gatewayd_sources,
2268 include_directories : includes,
2269 link_with : [libshared],
2270 dependencies : [threads,
2275 install_rpath : rootlibexecdir,
2277 install_dir : rootlibexecdir)
2278 public_programs += [s_j_remote, s_j_gatewayd]
2281 if conf.get('ENABLE_COREDUMP') == 1
2282 executable('systemd-coredump',
2283 systemd_coredump_sources,
2284 include_directories : includes,
2285 link_with : [libshared],
2286 dependencies : [threads,
2291 install_rpath : rootlibexecdir,
2293 install_dir : rootlibexecdir)
2295 exe = executable('coredumpctl',
2296 coredumpctl_sources,
2297 include_directories : includes,
2298 link_with : [libshared],
2299 dependencies : [threads,
2302 install_rpath : rootlibexecdir,
2304 public_programs += exe
2307 if conf.get('ENABLE_BINFMT') == 1
2308 exe = executable('systemd-binfmt',
2309 'src/binfmt/binfmt.c',
2310 include_directories : includes,
2311 link_with : [libshared],
2312 install_rpath : rootlibexecdir,
2314 install_dir : rootlibexecdir)
2315 public_programs += exe
2317 meson.add_install_script('sh', '-c',
2318 mkdir_p.format(binfmtdir))
2319 meson.add_install_script('sh', '-c',
2320 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2323 if conf.get('ENABLE_VCONSOLE') == 1
2324 executable('systemd-vconsole-setup',
2325 'src/vconsole/vconsole-setup.c',
2326 include_directories : includes,
2327 link_with : [libshared],
2328 install_rpath : rootlibexecdir,
2330 install_dir : rootlibexecdir)
2333 if conf.get('ENABLE_RANDOMSEED') == 1
2334 executable('systemd-random-seed',
2335 'src/random-seed/random-seed.c',
2336 include_directories : includes,
2337 link_with : [libshared],
2338 install_rpath : rootlibexecdir,
2340 install_dir : rootlibexecdir)
2343 if conf.get('ENABLE_FIRSTBOOT') == 1
2344 executable('systemd-firstboot',
2345 'src/firstboot/firstboot.c',
2346 include_directories : includes,
2347 link_with : [libshared],
2348 dependencies : [libcrypt],
2349 install_rpath : rootlibexecdir,
2351 install_dir : rootbindir)
2354 executable('systemd-remount-fs',
2355 'src/remount-fs/remount-fs.c',
2356 include_directories : includes,
2357 link_with : [libcore_shared,
2359 install_rpath : rootlibexecdir,
2361 install_dir : rootlibexecdir)
2363 executable('systemd-machine-id-setup',
2364 'src/machine-id-setup/machine-id-setup-main.c',
2365 include_directories : includes,
2366 link_with : [libcore_shared,
2368 install_rpath : rootlibexecdir,
2370 install_dir : rootbindir)
2372 executable('systemd-fsck',
2374 include_directories : includes,
2375 link_with : [libshared],
2376 install_rpath : rootlibexecdir,
2378 install_dir : rootlibexecdir)
2380 executable('systemd-growfs',
2381 'src/partition/growfs.c',
2382 include_directories : includes,
2383 link_with : [libshared],
2384 dependencies : [libcryptsetup],
2385 install_rpath : rootlibexecdir,
2387 install_dir : rootlibexecdir)
2389 executable('systemd-makefs',
2390 'src/partition/makefs.c',
2391 include_directories : includes,
2392 link_with : [libshared],
2393 install_rpath : rootlibexecdir,
2395 install_dir : rootlibexecdir)
2397 executable('systemd-sleep',
2398 'src/sleep/sleep.c',
2399 include_directories : includes,
2400 link_with : [libshared],
2401 install_rpath : rootlibexecdir,
2403 install_dir : rootlibexecdir)
2405 install_data('src/sleep/sleep.conf',
2406 install_dir : pkgsysconfdir)
2408 exe = executable('systemd-sysctl',
2409 'src/sysctl/sysctl.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 install_rpath : rootlibexecdir,
2414 install_dir : rootlibexecdir)
2415 public_programs += exe
2417 executable('systemd-ac-power',
2418 'src/ac-power/ac-power.c',
2419 include_directories : includes,
2420 link_with : [libshared],
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootlibexecdir)
2425 exe = executable('systemd-detect-virt',
2426 'src/detect-virt/detect-virt.c',
2427 include_directories : includes,
2428 link_with : [libshared],
2429 install_rpath : rootlibexecdir,
2431 public_programs += exe
2433 exe = executable('systemd-delta',
2434 'src/delta/delta.c',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 public_programs += exe
2441 exe = executable('systemd-escape',
2442 'src/escape/escape.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 install_rpath : rootlibexecdir,
2447 install_dir : rootbindir)
2448 public_programs += exe
2450 exe = executable('systemd-notify',
2451 'src/notify/notify.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootbindir)
2457 public_programs += exe
2459 executable('systemd-volatile-root',
2460 'src/volatile-root/volatile-root.c',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2465 install_dir : rootlibexecdir)
2467 executable('systemd-cgroups-agent',
2468 'src/cgroups-agent/cgroups-agent.c',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 install_rpath : rootlibexecdir,
2473 install_dir : rootlibexecdir)
2475 exe = executable('systemd-id128',
2476 'src/id128/id128.c',
2477 include_directories : includes,
2478 link_with : [libshared],
2479 install_rpath : rootlibexecdir,
2481 public_programs += exe
2483 exe = executable('systemd-path',
2485 include_directories : includes,
2486 link_with : [libshared],
2487 install_rpath : rootlibexecdir,
2489 public_programs += exe
2491 exe = executable('systemd-ask-password',
2492 'src/ask-password/ask-password.c',
2493 include_directories : includes,
2494 link_with : [libshared],
2495 install_rpath : rootlibexecdir,
2497 install_dir : rootbindir)
2498 public_programs += exe
2500 executable('systemd-reply-password',
2501 'src/reply-password/reply-password.c',
2502 include_directories : includes,
2503 link_with : [libshared],
2504 install_rpath : rootlibexecdir,
2506 install_dir : rootlibexecdir)
2508 exe = executable('systemd-tty-ask-password-agent',
2509 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2510 include_directories : includes,
2511 link_with : [libshared],
2512 install_rpath : rootlibexecdir,
2514 install_dir : rootbindir)
2515 public_programs += exe
2517 exe = executable('systemd-cgls',
2519 include_directories : includes,
2520 link_with : [libshared],
2521 install_rpath : rootlibexecdir,
2523 public_programs += exe
2525 exe = executable('systemd-cgtop',
2526 'src/cgtop/cgtop.c',
2527 include_directories : includes,
2528 link_with : [libshared],
2529 install_rpath : rootlibexecdir,
2531 public_programs += exe
2533 executable('systemd-initctl',
2534 'src/initctl/initctl.c',
2535 include_directories : includes,
2536 link_with : [libshared],
2537 install_rpath : rootlibexecdir,
2539 install_dir : rootlibexecdir)
2541 exe = executable('systemd-mount',
2542 'src/mount/mount-tool.c',
2543 include_directories : includes,
2544 link_with : [libshared],
2545 install_rpath : rootlibexecdir,
2547 public_programs += exe
2549 meson.add_install_script(meson_make_symlink,
2550 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2552 exe = executable('systemd-run',
2554 include_directories : includes,
2555 link_with : [libshared],
2556 install_rpath : rootlibexecdir,
2558 public_programs += exe
2560 exe = executable('systemd-stdio-bridge',
2561 'src/stdio-bridge/stdio-bridge.c',
2562 include_directories : includes,
2563 link_with : [libshared],
2564 dependencies : [versiondep],
2565 install_rpath : rootlibexecdir,
2567 public_programs += exe
2569 exe = executable('busctl',
2570 'src/busctl/busctl.c',
2571 'src/busctl/busctl-introspect.c',
2572 'src/busctl/busctl-introspect.h',
2573 include_directories : includes,
2574 link_with : [libshared],
2575 install_rpath : rootlibexecdir,
2577 public_programs += exe
2579 if conf.get('ENABLE_SYSUSERS') == 1
2580 exe = executable('systemd-sysusers',
2581 'src/sysusers/sysusers.c',
2582 include_directories : includes,
2583 link_with : [libshared],
2584 install_rpath : rootlibexecdir,
2586 install_dir : rootbindir)
2587 public_programs += exe
2590 if conf.get('ENABLE_TMPFILES') == 1
2591 exe = executable('systemd-tmpfiles',
2592 'src/tmpfiles/tmpfiles.c',
2593 include_directories : includes,
2594 link_with : [libshared],
2595 dependencies : [libacl],
2596 install_rpath : rootlibexecdir,
2598 install_dir : rootbindir)
2599 public_programs += exe
2601 if want_tests != 'false'
2602 test('test-systemd-tmpfiles',
2603 test_systemd_tmpfiles_py,
2604 # https://github.com/mesonbuild/meson/issues/2681
2605 args : exe.full_path())
2609 if conf.get('ENABLE_HWDB') == 1
2610 exe = executable('systemd-hwdb',
2612 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2613 include_directories : includes,
2614 link_with : [libudev_static],
2615 install_rpath : udev_rpath,
2617 install_dir : rootbindir)
2618 public_programs += exe
2621 if conf.get('ENABLE_QUOTACHECK') == 1
2622 executable('systemd-quotacheck',
2623 'src/quotacheck/quotacheck.c',
2624 include_directories : includes,
2625 link_with : [libshared],
2626 install_rpath : rootlibexecdir,
2628 install_dir : rootlibexecdir)
2631 exe = executable('systemd-socket-proxyd',
2632 'src/socket-proxy/socket-proxyd.c',
2633 include_directories : includes,
2634 link_with : [libshared],
2635 dependencies : [threads],
2636 install_rpath : rootlibexecdir,
2638 install_dir : rootlibexecdir)
2639 public_programs += exe
2641 exe = executable('systemd-udevd',
2642 systemd_udevd_sources,
2643 include_directories : includes,
2644 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2645 link_with : [libudev_core,
2648 dependencies : [versiondep,
2654 install_rpath : udev_rpath,
2656 install_dir : rootlibexecdir)
2657 public_programs += exe
2659 exe = executable('udevadm',
2661 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2662 include_directories : includes,
2663 link_with : [libudev_core,
2666 dependencies : [versiondep,
2672 install_rpath : udev_rpath,
2674 install_dir : rootbindir)
2675 public_programs += exe
2677 executable('systemd-shutdown',
2678 systemd_shutdown_sources,
2679 include_directories : includes,
2680 link_with : [libcore_shared,
2682 dependencies : [libmount],
2683 install_rpath : rootlibexecdir,
2685 install_dir : rootlibexecdir)
2687 executable('systemd-update-done',
2688 'src/update-done/update-done.c',
2689 include_directories : includes,
2690 link_with : [libshared],
2691 install_rpath : rootlibexecdir,
2693 install_dir : rootlibexecdir)
2695 executable('systemd-update-utmp',
2696 'src/update-utmp/update-utmp.c',
2697 include_directories : includes,
2698 link_with : [libshared],
2699 dependencies : [libaudit],
2700 install_rpath : rootlibexecdir,
2702 install_dir : rootlibexecdir)
2704 if conf.get('HAVE_KMOD') == 1
2705 executable('systemd-modules-load',
2706 'src/modules-load/modules-load.c',
2707 include_directories : includes,
2708 link_with : [libshared],
2709 dependencies : [libkmod],
2710 install_rpath : rootlibexecdir,
2712 install_dir : rootlibexecdir)
2714 meson.add_install_script('sh', '-c',
2715 mkdir_p.format(modulesloaddir))
2716 meson.add_install_script('sh', '-c',
2717 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2720 exe = executable('systemd-nspawn',
2721 systemd_nspawn_sources,
2722 include_directories : includes,
2723 link_with : [libcore_shared,
2726 dependencies : [libblkid],
2727 install_rpath : rootlibexecdir,
2729 public_programs += exe
2731 if conf.get('ENABLE_NETWORKD') == 1
2732 executable('systemd-networkd',
2733 systemd_networkd_sources,
2734 include_directories : includes,
2735 link_with : [libnetworkd_core,
2739 dependencies : [threads],
2740 install_rpath : rootlibexecdir,
2742 install_dir : rootlibexecdir)
2744 executable('systemd-networkd-wait-online',
2745 systemd_networkd_wait_online_sources,
2746 include_directories : includes,
2747 link_with : [libnetworkd_core,
2749 install_rpath : rootlibexecdir,
2751 install_dir : rootlibexecdir)
2753 exe = executable('networkctl',
2755 include_directories : includes,
2756 link_with : [libsystemd_network,
2758 install_rpath : rootlibexecdir,
2760 install_dir : rootbindir)
2761 public_programs += exe
2764 executable('systemd-sulogin-shell',
2765 ['src/sulogin-shell/sulogin-shell.c'],
2766 include_directories : includes,
2767 link_with : [libshared],
2768 install_rpath : rootlibexecdir,
2770 install_dir : rootlibexecdir)
2772 ############################################################
2775 'systemd-runtest.env',
2776 output : 'systemd-runtest.env',
2777 command : ['sh', '-c', '{ ' +
2778 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2779 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2781 build_by_default : true)
2783 foreach tuple : tests
2785 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2786 dependencies = tuple[2]
2787 condition = tuple.length() >= 4 ? tuple[3] : ''
2788 type = tuple.length() >= 5 ? tuple[4] : ''
2789 defs = tuple.length() >= 6 ? tuple[5] : []
2790 incs = tuple.length() >= 7 ? tuple[6] : includes
2793 name = sources[0].split('/')[-1].split('.')[0]
2794 if type.startswith('timeout=')
2795 timeout = type.split('=')[1].to_int()
2799 if condition == '' or conf.get(condition) == 1
2803 include_directories : incs,
2804 link_with : link_with,
2805 dependencies : [versiondep,
2808 build_by_default : want_tests != 'false',
2809 install_rpath : rootlibexecdir,
2810 install : install_tests,
2811 install_dir : join_paths(testsdir, type))
2814 message('@0@ is a manual test'.format(name))
2815 elif type == 'unsafe' and want_tests != 'unsafe'
2816 message('@0@ is an unsafe test'.format(name))
2817 elif want_tests != 'false'
2823 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2828 'test-libsystemd-sym',
2829 test_libsystemd_sym_c,
2830 include_directories : includes,
2831 link_with : [libsystemd],
2832 build_by_default : want_tests != 'false',
2833 install : install_tests,
2834 install_dir : testsdir)
2835 if want_tests != 'false'
2836 test('test-libsystemd-sym', exe)
2840 'test-libsystemd-static-sym',
2841 test_libsystemd_sym_c,
2842 include_directories : includes,
2843 link_with : [install_libsystemd_static],
2844 dependencies : [threads], # threads is already included in dependencies on the library,
2845 # but does not seem to get propagated. Add here as a work-around.
2846 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2847 install : install_tests and static_libsystemd_pic,
2848 install_dir : testsdir)
2849 if want_tests != 'false' and static_libsystemd_pic
2850 test('test-libsystemd-static-sym', exe)
2856 include_directories : includes,
2857 c_args : '-Wno-deprecated-declarations',
2858 link_with : [libudev],
2859 build_by_default : want_tests != 'false',
2860 install : install_tests,
2861 install_dir : testsdir)
2862 if want_tests != 'false'
2863 test('test-libudev-sym', exe)
2867 'test-libudev-static-sym',
2869 include_directories : includes,
2870 c_args : '-Wno-deprecated-declarations',
2871 link_with : [install_libudev_static],
2872 build_by_default : want_tests != 'false' and static_libudev_pic,
2873 install : install_tests and static_libudev_pic,
2874 install_dir : testsdir)
2875 if want_tests != 'false' and static_libudev_pic
2876 test('test-libudev-static-sym', exe)
2879 ############################################################
2883 if get_option('tests') != 'false'
2884 foreach tuple : fuzzers
2886 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2887 dependencies = tuple[2]
2888 defs = tuple.length() >= 4 ? tuple[3] : []
2889 incs = tuple.length() >= 5 ? tuple[4] : includes
2892 dependencies += fuzzing_engine
2894 sources += 'src/fuzz/fuzz-main.c'
2897 name = sources[0].split('/')[-1].split('.')[0]
2899 fuzzer_exes += executable(
2902 include_directories : [incs, include_directories('src/fuzz')],
2903 link_with : link_with,
2904 dependencies : dependencies,
2910 run_target('fuzzers',
2911 depends : fuzzer_exes,
2914 ############################################################
2916 make_directive_index_py = find_program('tools/make-directive-index.py')
2917 make_man_index_py = find_program('tools/make-man-index.py')
2918 xml_helper_py = find_program('tools/xml_helper.py')
2919 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2923 subdir('sysusers.d')
2924 subdir('tmpfiles.d')
2929 subdir('shell-completion/bash')
2930 subdir('shell-completion/zsh')
2931 subdir('docs/sysvinit')
2932 subdir('docs/var-log')
2934 install_subdir('factory/etc',
2935 install_dir : factorydir)
2937 install_data('xorg/50-systemd-user.sh',
2938 install_dir : xinitrcdir)
2939 install_data('modprobe.d/systemd.conf',
2940 install_dir : modprobedir)
2941 install_data('LICENSE.GPL2',
2945 'docs/CODING_STYLE.md',
2946 'docs/DISTRO_PORTING.md',
2947 'docs/ENVIRONMENT.md',
2949 'docs/TRANSIENT-SETTINGS.md',
2950 'docs/TRANSLATORS.md',
2951 'docs/UIDS-GIDS.md',
2952 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2953 install_dir : docdir)
2955 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2956 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2958 ############################################################
2960 meson_check_help = find_program('tools/meson-check-help.sh')
2962 foreach exec : public_programs
2963 name = exec.full_path().split('/')[-1]
2964 if want_tests != 'false'
2965 test('check-help-' + name,
2967 args : exec.full_path())
2971 ############################################################
2973 # Enable tests for all supported sanitizers
2974 foreach tuple : sanitizers
2975 sanitizer = tuple[0]
2978 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2980 foreach p : fuzz_regression_tests
2981 b = p.split('/')[-2]
2982 c = p.split('/')[-1]
2984 name = '@0@:@1@'.format(b, sanitizer)
2987 if want_tests == 'false'
2988 message('Not compiling @0@ because tests is set to false'.format(name))
2990 exe = custom_target(
2994 command : [env, 'ln', '-fs',
2995 join_paths(build.full_path(), b),
2997 build_by_default : true)
2999 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3004 if want_tests != 'false' and slow_tests
3005 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3007 args : [exe.full_path(),
3008 join_paths(meson.source_root(), p)])
3015 ############################################################
3018 all_files = run_command(
3020 ['--git-dir=@0@/.git'.format(meson.source_root()),
3023 all_files = files(all_files.stdout().split())
3028 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3031 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3035 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3038 command : [meson_git_contrib_sh])
3042 git_head = run_command(
3044 ['--git-dir=@0@/.git'.format(meson.source_root()),
3045 'rev-parse', 'HEAD']).stdout().strip()
3046 git_head_short = run_command(
3048 ['--git-dir=@0@/.git'.format(meson.source_root()),
3049 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3053 command : ['git', 'archive',
3054 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3056 '--prefix', 'systemd-@0@/'.format(git_head),
3060 ############################################################
3062 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3065 depends : [man, libsystemd, libudev],
3066 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3068 ############################################################
3071 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3073 'split /usr: @0@'.format(split_usr),
3074 'split bin-sbin: @0@'.format(split_bin),
3075 'prefix directory: @0@'.format(prefixdir),
3076 'rootprefix directory: @0@'.format(rootprefixdir),
3077 'sysconf directory: @0@'.format(sysconfdir),
3078 'include directory: @0@'.format(includedir),
3079 'lib directory: @0@'.format(libdir),
3080 'rootlib directory: @0@'.format(rootlibdir),
3081 'SysV init scripts: @0@'.format(sysvinit_path),
3082 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3083 'PAM modules directory: @0@'.format(pamlibdir),
3084 'PAM configuration directory: @0@'.format(pamconfdir),
3085 'RPM macros directory: @0@'.format(rpmmacrosdir),
3086 'modprobe.d directory: @0@'.format(modprobedir),
3087 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3088 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3089 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3090 'bash completions directory: @0@'.format(bashcompletiondir),
3091 'zsh completions directory: @0@'.format(zshcompletiondir),
3092 'extra start script: @0@'.format(get_option('rc-local')),
3093 'extra stop script: @0@'.format(get_option('halt-local')),
3094 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3095 get_option('debug-tty')),
3096 'TTY GID: @0@'.format(tty_gid),
3097 'users GID: @0@'.format(substs.get('USERS_GID')),
3098 'maximum system UID: @0@'.format(system_uid_max),
3099 'maximum system GID: @0@'.format(system_gid_max),
3100 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3101 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3102 'minimum container UID base: @0@'.format(container_uid_base_min),
3103 'maximum container UID base: @0@'.format(container_uid_base_max),
3104 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3105 'render group access mode: @0@'.format(get_option('group-render-mode')),
3106 'certificate root directory: @0@'.format(get_option('certificate-root')),
3107 'support URL: @0@'.format(support_url),
3108 'nobody user name: @0@'.format(nobody_user),
3109 'nobody group name: @0@'.format(nobody_group),
3110 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3111 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3113 'default DNSSEC mode: @0@'.format(default_dnssec),
3114 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3115 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3116 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3117 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3118 'default locale: @0@'.format(default_locale)]
3120 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3121 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3123 'default DNS servers: @0@'.format(alt_dns_servers),
3124 'default NTP servers: @0@'.format(alt_ntp_servers)]
3126 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3127 '@@0@'.format(time_epoch)).stdout().strip()
3129 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3132 'static libsystemd: @0@'.format(static_libsystemd),
3133 'static libudev: @0@'.format(static_libudev)]
3136 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3137 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3138 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3140 if conf.get('ENABLE_EFI') == 1
3141 status += 'efi arch: @0@'.format(efi_arch)
3145 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3146 'EFI CC @0@'.format(' '.join(efi_cc)),
3147 'EFI lib directory: @0@'.format(efi_libdir),
3148 'EFI lds directory: @0@'.format(efi_ldsdir),
3149 'EFI include directory: @0@'.format(efi_incdir)]
3201 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3202 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3205 ['legacy pkla', install_polkit_pkla],
3207 ['gnu-efi', have_gnu_efi],
3220 ['man pages', want_man],
3221 ['html pages', want_html],
3222 ['man page indices', want_man and have_lxml],
3227 ['adm group', get_option('adm-group')],
3228 ['wheel group', get_option('wheel-group')],
3231 ['debug mmap cache'],
3234 ['valgrind', conf.get('VALGRIND') == 1],
3235 ['trace logging', conf.get('LOG_TRACE') == 1],
3236 ['link-udev-shared', get_option('link-udev-shared')],
3237 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3240 if tuple.length() >= 2
3243 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3244 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3245 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3256 'enabled features: @0@'.format(', '.join(found)),
3258 'disabled features: @0@'.format(', '.join(missing)),
3260 message('\n '.join(status))
3262 if rootprefixdir != rootprefix_default
3264 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3265 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3266 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))