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_ACTIVE_SLAVE', 'linux/if_link.h'],
480 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
481 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
482 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
483 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
484 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
485 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
486 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
487 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
488 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
489 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
490 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
491 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
492 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
493 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
494 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
495 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
496 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
497 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
498 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
499 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
500 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
501 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
502 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
503 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
504 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
505 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
506 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
507 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
508 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
509 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
510 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
511 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
512 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
513 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
514 # if_tunnel.h is buggy and cannot be included on its own
515 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
516 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
517 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
518 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
519 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
520 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
521 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
522 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
523 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
524 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
525 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
527 prefix = decl.length() > 2 ? decl[2] : ''
528 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
529 conf.set10('HAVE_' + decl[0], have)
532 foreach ident : ['secure_getenv', '__secure_getenv']
533 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
537 ['memfd_create', '''#include <sys/mman.h>'''],
538 ['gettid', '''#include <sys/types.h>
539 #include <unistd.h>'''],
540 ['pivot_root', '''#include <stdlib.h>
541 #include <unistd.h>'''], # no known header declares pivot_root
542 ['name_to_handle_at', '''#include <sys/types.h>
543 #include <sys/stat.h>
544 #include <fcntl.h>'''],
545 ['setns', '''#include <sched.h>'''],
546 ['renameat2', '''#include <stdio.h>
547 #include <fcntl.h>'''],
548 ['kcmp', '''#include <linux/kcmp.h>'''],
549 ['keyctl', '''#include <sys/types.h>
550 #include <keyutils.h>'''],
551 ['copy_file_range', '''#include <sys/syscall.h>
552 #include <unistd.h>'''],
553 ['bpf', '''#include <sys/syscall.h>
554 #include <unistd.h>'''],
555 ['statx', '''#include <sys/types.h>
556 #include <sys/stat.h>
557 #include <unistd.h>'''],
558 ['explicit_bzero' , '''#include <string.h>'''],
559 ['reallocarray', '''#include <malloc.h>'''],
562 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
563 conf.set10('HAVE_' + ident[0].to_upper(), have)
566 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
567 conf.set10('USE_SYS_RANDOM_H', true)
568 conf.set10('HAVE_GETRANDOM', true)
570 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
571 conf.set10('USE_SYS_RANDOM_H', false)
572 conf.set10('HAVE_GETRANDOM', have)
575 #####################################################################
577 vcs_tagger = [meson.source_root() + '/tools/meson-vcs-tag.sh',
579 get_option('version-tag'),
580 meson.project_version()]
582 sed = find_program('sed')
583 awk = find_program('awk')
584 m4 = find_program('m4')
585 stat = find_program('stat')
586 git = find_program('git', required : false)
587 env = find_program('env')
588 perl = find_program('perl', required : false)
590 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
591 mkdir_p = 'mkdir -p $DESTDIR/@0@'
592 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
593 splash_bmp = files('test/splash.bmp')
595 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
596 # /usr/sbin, /sbin, and fall back to the default from middle column.
597 progs = [['quotaon', '/usr/sbin/quotaon' ],
598 ['quotacheck', '/usr/sbin/quotacheck' ],
599 ['kmod', '/usr/bin/kmod' ],
600 ['kexec', '/usr/sbin/kexec' ],
601 ['sulogin', '/usr/sbin/sulogin' ],
602 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
603 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
604 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
605 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
608 path = get_option(prog[0] + '-path')
610 message('Using @1@ for @0@'.format(prog[0], path))
612 exe = find_program(prog[0],
613 '/usr/sbin/' + prog[0],
616 path = exe.found() ? exe.path() : prog[1]
618 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
619 conf.set_quoted(name, path)
620 substs.set(name, path)
623 conf.set_quoted('TELINIT', get_option('telinit-path'))
625 if run_command('ln', '--relative', '--help').returncode() != 0
626 error('ln does not support --relative (added in coreutils 8.16)')
629 ############################################################
631 gperf = find_program('gperf')
633 gperf_test_format = '''
635 const char * in_word_set(const char *, @0@);
638 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
639 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
640 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
641 if cc.compiles(gperf_test)
642 gperf_len_type = 'size_t'
644 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
645 if cc.compiles(gperf_test)
646 gperf_len_type = 'unsigned'
648 error('unable to determine gperf len type')
651 message('gperf len type is @0@'.format(gperf_len_type))
652 conf.set('GPERF_LEN_TYPE', gperf_len_type,
653 description : 'The type of gperf "len" parameter')
655 ############################################################
657 if not cc.has_header('sys/capability.h')
658 error('POSIX caps headers not found')
660 foreach header : ['crypt.h',
661 'linux/btrfs_tree.h',
664 'linux/vm_sockets.h',
667 'valgrind/memcheck.h',
668 'valgrind/valgrind.h',
671 conf.set10('HAVE_' + header.underscorify().to_upper(),
672 cc.has_header(header))
675 ############################################################
677 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
678 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
679 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
681 default_hierarchy = get_option('default-hierarchy')
682 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
683 description : 'default cgroup hierarchy as string')
684 if default_hierarchy == 'legacy'
685 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
686 elif default_hierarchy == 'hybrid'
687 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
689 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
692 default_net_naming_scheme = get_option('default-net-naming-scheme')
693 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
695 time_epoch = get_option('time-epoch')
698 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
700 conf.set('TIME_EPOCH', time_epoch)
702 system_uid_max = get_option('system-uid-max')
703 if system_uid_max == -1
704 system_uid_max = run_command(
706 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
707 '/etc/login.defs').stdout().strip()
708 if system_uid_max == ''
711 system_uid_max = system_uid_max.to_int()
714 conf.set('SYSTEM_UID_MAX', system_uid_max)
715 substs.set('systemuidmax', system_uid_max)
717 system_gid_max = get_option('system-gid-max')
718 if system_gid_max == -1
719 system_gid_max = run_command(
721 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
722 '/etc/login.defs').stdout().strip()
723 if system_gid_max == ''
726 system_gid_max = system_gid_max.to_int()
729 conf.set('SYSTEM_GID_MAX', system_gid_max)
730 substs.set('systemgidmax', system_gid_max)
732 dynamic_uid_min = get_option('dynamic-uid-min')
733 dynamic_uid_max = get_option('dynamic-uid-max')
734 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
735 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
736 substs.set('dynamicuidmin', dynamic_uid_min)
737 substs.set('dynamicuidmax', dynamic_uid_max)
739 container_uid_base_min = get_option('container-uid-base-min')
740 container_uid_base_max = get_option('container-uid-base-max')
741 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
742 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
743 substs.set('containeruidbasemin', container_uid_base_min)
744 substs.set('containeruidbasemax', container_uid_base_max)
746 nobody_user = get_option('nobody-user')
747 nobody_group = get_option('nobody-group')
749 if not meson.is_cross_build()
750 getent_result = run_command('getent', 'passwd', '65534')
751 if getent_result.returncode() == 0
752 name = getent_result.stdout().split(':')[0]
753 if name != nobody_user
755 '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) +
756 'Your build will result in an user table setup that is incompatible with the local system.')
759 id_result = run_command('id', '-u', nobody_user)
760 if id_result.returncode() == 0
761 id = id_result.stdout().to_int()
764 '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) +
765 'Your build will result in an user table setup that is incompatible with the local system.')
769 getent_result = run_command('getent', 'group', '65534')
770 if getent_result.returncode() == 0
771 name = getent_result.stdout().split(':')[0]
772 if name != nobody_group
774 '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) +
775 'Your build will result in an group table setup that is incompatible with the local system.')
778 id_result = run_command('id', '-g', nobody_group)
779 if id_result.returncode() == 0
780 id = id_result.stdout().to_int()
783 '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) +
784 'Your build will result in an group table setup that is incompatible with the local system.')
788 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
790 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
791 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
794 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
795 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
796 substs.set('NOBODY_USER_NAME', nobody_user)
797 substs.set('NOBODY_GROUP_NAME', nobody_group)
799 tty_gid = get_option('tty-gid')
800 conf.set('TTY_GID', tty_gid)
801 substs.set('TTY_GID', tty_gid)
803 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
804 users_gid = get_option('users-gid')
805 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
807 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
808 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
810 dev_kvm_mode = get_option('dev-kvm-mode')
811 substs.set('DEV_KVM_MODE', dev_kvm_mode)
812 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
813 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
815 kill_user_processes = get_option('default-kill-user-processes')
816 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
817 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
818 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
820 dns_servers = get_option('dns-servers')
821 conf.set_quoted('DNS_SERVERS', dns_servers)
822 substs.set('DNS_SERVERS', dns_servers)
824 ntp_servers = get_option('ntp-servers')
825 conf.set_quoted('NTP_SERVERS', ntp_servers)
826 substs.set('NTP_SERVERS', ntp_servers)
828 default_locale = get_option('default-locale')
829 if default_locale == ''
830 if not meson.is_cross_build()
831 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
832 default_locale = run_command(choose_default_locale_sh).stdout().strip()
834 default_locale = 'C.UTF-8'
837 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
839 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
841 substs.set('SUSHELL', get_option('debug-shell'))
842 substs.set('DEBUGTTY', get_option('debug-tty'))
844 enable_debug_hashmap = false
845 enable_debug_mmap_cache = false
846 enable_debug_siphash = false
847 enable_debug_udev = false
848 foreach name : get_option('debug-extra')
850 enable_debug_hashmap = true
851 elif name == 'mmap-cache'
852 enable_debug_mmap_cache = true
853 elif name == 'siphash'
854 enable_debug_siphash = true
856 enable_debug_udev = true
858 message('unknown debug option "@0@", ignoring'.format(name))
861 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
862 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
863 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
864 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
866 conf.set10('VALGRIND', get_option('valgrind'))
867 conf.set10('LOG_TRACE', get_option('log-trace'))
869 #####################################################################
871 threads = dependency('threads')
872 librt = cc.find_library('rt')
873 libm = cc.find_library('m')
874 libdl = cc.find_library('dl')
875 libcrypt = cc.find_library('crypt')
877 libcap = dependency('libcap', required : false)
878 if not libcap.found()
879 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
880 libcap = cc.find_library('cap')
883 libmount = dependency('mount',
884 version : fuzzer_build ? '>= 0' : '>= 2.30')
886 want_seccomp = get_option('seccomp')
887 if want_seccomp != 'false' and not fuzzer_build
888 libseccomp = dependency('libseccomp',
889 version : '>= 2.3.1',
890 required : want_seccomp == 'true')
891 have = libseccomp.found()
896 conf.set10('HAVE_SECCOMP', have)
898 want_selinux = get_option('selinux')
899 if want_selinux != 'false' and not fuzzer_build
900 libselinux = dependency('libselinux',
901 version : '>= 2.1.9',
902 required : want_selinux == 'true')
903 have = libselinux.found()
908 conf.set10('HAVE_SELINUX', have)
910 want_apparmor = get_option('apparmor')
911 if want_apparmor != 'false' and not fuzzer_build
912 libapparmor = dependency('libapparmor',
913 required : want_apparmor == 'true')
914 have = libapparmor.found()
919 conf.set10('HAVE_APPARMOR', have)
921 smack_run_label = get_option('smack-run-label')
922 if smack_run_label != ''
923 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
926 want_polkit = get_option('polkit')
927 install_polkit = false
928 install_polkit_pkla = false
929 if want_polkit != 'false' and not fuzzer_build
930 install_polkit = true
932 libpolkit = dependency('polkit-gobject-1',
934 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
935 message('Old polkit detected, will install pkla files')
936 install_polkit_pkla = true
939 conf.set10('ENABLE_POLKIT', install_polkit)
941 want_acl = get_option('acl')
942 if want_acl != 'false' and not fuzzer_build
943 libacl = cc.find_library('acl', required : want_acl == 'true')
944 have = libacl.found()
949 conf.set10('HAVE_ACL', have)
951 want_audit = get_option('audit')
952 if want_audit != 'false' and not fuzzer_build
953 libaudit = dependency('audit', required : want_audit == 'true')
954 have = libaudit.found()
959 conf.set10('HAVE_AUDIT', have)
961 want_blkid = get_option('blkid')
962 if want_blkid != 'false' and not fuzzer_build
963 libblkid = dependency('blkid', required : want_blkid == 'true')
964 have = libblkid.found()
969 conf.set10('HAVE_BLKID', have)
971 want_kmod = get_option('kmod')
972 if want_kmod != 'false' and not fuzzer_build
973 libkmod = dependency('libkmod',
975 required : want_kmod == 'true')
976 have = libkmod.found()
981 conf.set10('HAVE_KMOD', have)
983 want_pam = get_option('pam')
984 if want_pam != 'false' and not fuzzer_build
985 libpam = cc.find_library('pam', required : want_pam == 'true')
986 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
987 have = libpam.found() and libpam_misc.found()
993 conf.set10('HAVE_PAM', have)
995 want_microhttpd = get_option('microhttpd')
996 if want_microhttpd != 'false' and not fuzzer_build
997 libmicrohttpd = dependency('libmicrohttpd',
998 version : '>= 0.9.33',
999 required : want_microhttpd == 'true')
1000 have = libmicrohttpd.found()
1005 conf.set10('HAVE_MICROHTTPD', have)
1007 want_libcryptsetup = get_option('libcryptsetup')
1008 if want_libcryptsetup != 'false' and not fuzzer_build
1009 libcryptsetup = dependency('libcryptsetup',
1010 version : '>= 1.6.0',
1011 required : want_libcryptsetup == 'true')
1012 have = libcryptsetup.found()
1013 have_sector = cc.has_member(
1014 'struct crypt_params_plain',
1016 prefix : '#include <libcryptsetup.h>')
1022 conf.set10('HAVE_LIBCRYPTSETUP', have)
1023 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1025 want_libcurl = get_option('libcurl')
1026 if want_libcurl != 'false' and not fuzzer_build
1027 libcurl = dependency('libcurl',
1028 version : '>= 7.32.0',
1029 required : want_libcurl == 'true')
1030 have = libcurl.found()
1035 conf.set10('HAVE_LIBCURL', have)
1037 want_libidn = get_option('libidn')
1038 want_libidn2 = get_option('libidn2')
1039 if want_libidn == 'true' and want_libidn2 == 'true'
1040 error('libidn and libidn2 cannot be requested simultaneously')
1043 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1044 libidn = dependency('libidn',
1045 required : want_libidn == 'true')
1046 have = libidn.found()
1051 conf.set10('HAVE_LIBIDN', have)
1052 if not have and want_libidn2 != 'false' and not fuzzer_build
1053 # libidn is used for both libidn and libidn2 objects
1054 libidn = dependency('libidn2',
1055 required : want_libidn2 == 'true')
1056 have = libidn.found()
1060 conf.set10('HAVE_LIBIDN2', have)
1062 want_libiptc = get_option('libiptc')
1063 if want_libiptc != 'false' and not fuzzer_build
1064 libiptc = dependency('libiptc',
1065 required : want_libiptc == 'true')
1066 have = libiptc.found()
1071 conf.set10('HAVE_LIBIPTC', have)
1073 want_qrencode = get_option('qrencode')
1074 if want_qrencode != 'false' and not fuzzer_build
1075 libqrencode = dependency('libqrencode',
1076 required : want_qrencode == 'true')
1077 have = libqrencode.found()
1082 conf.set10('HAVE_QRENCODE', have)
1084 want_gcrypt = get_option('gcrypt')
1085 if want_gcrypt != 'false' and not fuzzer_build
1086 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1087 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1088 have = libgcrypt.found() and libgpg_error.found()
1093 # link to neither of the libs if one is not found
1097 conf.set10('HAVE_GCRYPT', have)
1099 want_gnutls = get_option('gnutls')
1100 if want_gnutls != 'false' and not fuzzer_build
1101 libgnutls = dependency('gnutls',
1102 version : '>= 3.1.4',
1103 required : want_gnutls == 'true')
1104 have = libgnutls.found()
1109 conf.set10('HAVE_GNUTLS', have)
1111 want_openssl = get_option('openssl')
1112 if want_openssl != 'false' and not fuzzer_build
1113 libopenssl = dependency('openssl',
1114 version : '>= 1.1.0',
1115 required : want_openssl == 'true')
1116 have = libopenssl.found()
1121 conf.set10('HAVE_OPENSSL', have)
1123 want_elfutils = get_option('elfutils')
1124 if want_elfutils != 'false' and not fuzzer_build
1125 libdw = dependency('libdw',
1126 required : want_elfutils == 'true')
1127 have = libdw.found()
1132 conf.set10('HAVE_ELFUTILS', have)
1134 want_zlib = get_option('zlib')
1135 if want_zlib != 'false' and not fuzzer_build
1136 libz = dependency('zlib',
1137 required : want_zlib == 'true')
1143 conf.set10('HAVE_ZLIB', have)
1145 want_bzip2 = get_option('bzip2')
1146 if want_bzip2 != 'false' and not fuzzer_build
1147 libbzip2 = cc.find_library('bz2',
1148 required : want_bzip2 == 'true')
1149 have = libbzip2.found()
1154 conf.set10('HAVE_BZIP2', have)
1156 want_xz = get_option('xz')
1157 if want_xz != 'false' and not fuzzer_build
1158 libxz = dependency('liblzma',
1159 required : want_xz == 'true')
1160 have = libxz.found()
1165 conf.set10('HAVE_XZ', have)
1167 want_lz4 = get_option('lz4')
1168 if want_lz4 != 'false' and not fuzzer_build
1169 liblz4 = dependency('liblz4',
1170 version : '>= 1.3.0',
1171 required : want_lz4 == 'true')
1172 have = liblz4.found()
1177 conf.set10('HAVE_LZ4', have)
1179 want_xkbcommon = get_option('xkbcommon')
1180 if want_xkbcommon != 'false' and not fuzzer_build
1181 libxkbcommon = dependency('xkbcommon',
1182 version : '>= 0.3.0',
1183 required : want_xkbcommon == 'true')
1184 have = libxkbcommon.found()
1189 conf.set10('HAVE_XKBCOMMON', have)
1191 want_pcre2 = get_option('pcre2')
1192 if want_pcre2 != 'false'
1193 libpcre2 = dependency('libpcre2-8',
1194 required : want_pcre2 == 'true')
1195 have = libpcre2.found()
1200 conf.set10('HAVE_PCRE2', have)
1202 want_glib = get_option('glib')
1203 if want_glib != 'false' and not fuzzer_build
1204 libglib = dependency('glib-2.0',
1205 version : '>= 2.22.0',
1206 required : want_glib == 'true')
1207 libgobject = dependency('gobject-2.0',
1208 version : '>= 2.22.0',
1209 required : want_glib == 'true')
1210 libgio = dependency('gio-2.0',
1211 required : want_glib == 'true')
1212 have = libglib.found() and libgobject.found() and libgio.found()
1219 conf.set10('HAVE_GLIB', have)
1221 want_dbus = get_option('dbus')
1222 if want_dbus != 'false' and not fuzzer_build
1223 libdbus = dependency('dbus-1',
1224 version : '>= 1.3.2',
1225 required : want_dbus == 'true')
1226 have = libdbus.found()
1231 conf.set10('HAVE_DBUS', have)
1233 default_dnssec = get_option('default-dnssec')
1235 default_dnssec = 'no'
1237 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1238 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1239 default_dnssec = 'no'
1241 conf.set('DEFAULT_DNSSEC_MODE',
1242 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1243 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1245 dns_over_tls = get_option('dns-over-tls')
1246 if dns_over_tls != 'false'
1247 if dns_over_tls == 'openssl'
1250 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1251 if dns_over_tls == 'gnutls' and not have_gnutls
1252 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1255 if dns_over_tls == 'gnutls' or have_gnutls
1256 have_openssl = false
1258 have_openssl = conf.get('HAVE_OPENSSL') == 1
1259 if dns_over_tls != 'auto' and not have_openssl
1260 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1261 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1264 have = have_gnutls or have_openssl
1268 have_openssl = false
1270 conf.set10('ENABLE_DNS_OVER_TLS', have)
1271 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1272 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1274 default_dns_over_tls = get_option('default-dns-over-tls')
1276 default_dns_over_tls = 'no'
1278 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1279 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1280 default_dns_over_tls = 'no'
1282 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1283 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1284 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1286 want_importd = get_option('importd')
1287 if want_importd != 'false'
1288 have = (conf.get('HAVE_LIBCURL') == 1 and
1289 conf.get('HAVE_ZLIB') == 1 and
1290 conf.get('HAVE_XZ') == 1 and
1291 conf.get('HAVE_GCRYPT') == 1)
1292 if want_importd == 'true' and not have
1293 error('importd support was requested, but dependencies are not available')
1298 conf.set10('ENABLE_IMPORTD', have)
1300 want_remote = get_option('remote')
1301 if want_remote != 'false'
1302 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1303 conf.get('HAVE_LIBCURL') == 1]
1304 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1305 # it's possible to build one without the other. Complain only if
1306 # support was explictly requested. The auxiliary files like sysusers
1307 # config should be installed when any of the programs are built.
1308 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1309 error('remote support was requested, but dependencies are not available')
1311 have = have_deps[0] or have_deps[1]
1315 conf.set10('ENABLE_REMOTE', have)
1317 foreach term : ['utmp',
1349 have = get_option(term)
1350 name = 'ENABLE_' + term.underscorify().to_upper()
1351 conf.set10(name, have)
1354 foreach tuple : [['nss-mymachines', 'machined'],
1355 ['nss-resolve', 'resolve']]
1356 want = get_option(tuple[0])
1358 have = get_option(tuple[1])
1359 if want == 'true' and not have
1360 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1365 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1366 conf.set10(name, have)
1370 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1371 'ENABLE_NSS_MYMACHINES',
1372 'ENABLE_NSS_RESOLVE',
1373 'ENABLE_NSS_SYSTEMD']
1374 if conf.get(term) == 1
1378 conf.set10('ENABLE_NSS', enable_nss)
1380 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1385 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1387 #####################################################################
1389 if get_option('efi')
1390 efi_arch = host_machine.cpu_family()
1392 if efi_arch == 'x86'
1393 EFI_MACHINE_TYPE_NAME = 'ia32'
1394 gnu_efi_arch = 'ia32'
1395 elif efi_arch == 'x86_64'
1396 EFI_MACHINE_TYPE_NAME = 'x64'
1397 gnu_efi_arch = 'x86_64'
1398 elif efi_arch == 'arm'
1399 EFI_MACHINE_TYPE_NAME = 'arm'
1400 gnu_efi_arch = 'arm'
1401 elif efi_arch == 'aarch64'
1402 EFI_MACHINE_TYPE_NAME = 'aa64'
1403 gnu_efi_arch = 'aarch64'
1405 EFI_MACHINE_TYPE_NAME = ''
1410 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1412 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1416 conf.set10('ENABLE_EFI', have)
1418 #####################################################################
1420 config_h = configure_file(
1421 output : 'config.h',
1422 configuration : conf)
1424 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1426 includes = include_directories('src/basic',
1430 'src/journal-remote',
1434 'src/time-wait-sync',
1439 'src/libsystemd/sd-bus',
1440 'src/libsystemd/sd-device',
1441 'src/libsystemd/sd-event',
1442 'src/libsystemd/sd-hwdb',
1443 'src/libsystemd/sd-id128',
1444 'src/libsystemd/sd-netlink',
1445 'src/libsystemd/sd-network',
1446 'src/libsystemd/sd-resolve',
1447 'src/libsystemd-network',
1450 add_project_arguments('-include', 'config.h', language : 'c')
1452 generate_gperfs = find_program('tools/generate-gperfs.py')
1456 subdir('src/systemd')
1458 subdir('src/libsystemd')
1459 subdir('src/libsystemd-network')
1460 subdir('src/journal')
1463 libjournal_core = static_library(
1465 libjournal_core_sources,
1467 include_directories : includes,
1470 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1471 libsystemd = shared_library(
1474 version : libsystemd_version,
1475 include_directories : includes,
1476 link_args : ['-shared',
1477 '-Wl,--version-script=' + libsystemd_sym_path],
1478 link_with : [libbasic,
1480 link_whole : [libsystemd_static,
1482 dependencies : [threads,
1486 link_depends : libsystemd_sym,
1488 install_dir : rootlibdir)
1490 static_libsystemd = get_option('static-libsystemd')
1491 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1493 install_libsystemd_static = static_library(
1496 journal_client_sources,
1498 basic_gcrypt_sources,
1500 include_directories : includes,
1501 build_by_default : static_libsystemd != 'false',
1502 install : static_libsystemd != 'false',
1503 install_dir : rootlibdir,
1504 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1505 dependencies : [threads,
1514 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1516 ############################################################
1518 # binaries that have --help and are intended for use by humans,
1519 # usually, but not always, installed in /bin.
1520 public_programs = []
1522 subdir('src/libudev')
1523 subdir('src/shared')
1526 subdir('src/network')
1528 subdir('src/analyze')
1529 subdir('src/journal-remote')
1530 subdir('src/coredump')
1531 subdir('src/hostname')
1532 subdir('src/import')
1533 subdir('src/kernel-install')
1534 subdir('src/locale')
1535 subdir('src/machine')
1536 subdir('src/portable')
1537 subdir('src/nspawn')
1538 subdir('src/resolve')
1539 subdir('src/timedate')
1540 subdir('src/timesync')
1541 subdir('src/vconsole')
1542 subdir('src/boot/efi')
1549 ############################################################
1551 # only static linking apart from libdl, to make sure that the
1552 # module is linked to all libraries that it uses.
1553 test_dlopen = executable(
1557 include_directories : includes,
1558 link_with : [libbasic],
1559 dependencies : [libdl],
1560 build_by_default : want_tests != 'false')
1562 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1563 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1564 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1565 ['resolve', 'ENABLE_NSS_RESOLVE']]
1567 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1571 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1572 version_script_arg = join_paths(meson.source_root(), sym)
1574 nss = shared_library(
1576 'src/nss-@0@/nss-@0@.c'.format(module),
1579 include_directories : includes,
1580 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1581 link_args : ['-Wl,-z,nodelete',
1583 '-Wl,--version-script=' + version_script_arg,
1585 link_with : [libsystemd_static,
1587 dependencies : [threads,
1591 install_dir : rootlibdir)
1593 # We cannot use shared_module because it does not support version suffix.
1594 # Unfortunately shared_library insists on creating the symlink…
1595 meson.add_install_script('sh', '-c',
1596 'rm $DESTDIR@0@/libnss_@1@.so'
1597 .format(rootlibdir, module))
1599 if want_tests != 'false'
1600 test('dlopen-nss_' + module,
1602 # path to dlopen must include a slash
1603 args : nss.full_path())
1608 ############################################################
1610 executable('systemd',
1612 include_directories : includes,
1613 link_with : [libcore,
1615 dependencies : [threads,
1621 install_rpath : rootlibexecdir,
1623 install_dir : rootlibexecdir)
1625 meson.add_install_script(meson_make_symlink,
1626 join_paths(rootlibexecdir, 'systemd'),
1627 join_paths(rootsbindir, 'init'))
1629 exe = executable('systemd-analyze',
1630 systemd_analyze_sources,
1631 include_directories : includes,
1632 link_with : [libcore,
1634 dependencies : [threads,
1640 install_rpath : rootlibexecdir,
1642 public_programs += exe
1644 executable('systemd-journald',
1645 systemd_journald_sources,
1646 include_directories : includes,
1647 link_with : [libjournal_core,
1649 dependencies : [threads,
1653 install_rpath : rootlibexecdir,
1655 install_dir : rootlibexecdir)
1657 exe = executable('systemd-cat',
1658 systemd_cat_sources,
1659 include_directories : includes,
1660 link_with : [libjournal_core,
1662 dependencies : [threads],
1663 install_rpath : rootlibexecdir,
1665 public_programs += exe
1667 exe = executable('journalctl',
1669 include_directories : includes,
1670 link_with : [libshared],
1671 dependencies : [threads,
1676 install_rpath : rootlibexecdir,
1678 install_dir : rootbindir)
1679 public_programs += exe
1681 executable('systemd-getty-generator',
1682 'src/getty-generator/getty-generator.c',
1683 include_directories : includes,
1684 link_with : [libshared],
1685 install_rpath : rootlibexecdir,
1687 install_dir : systemgeneratordir)
1689 executable('systemd-debug-generator',
1690 'src/debug-generator/debug-generator.c',
1691 include_directories : includes,
1692 link_with : [libshared],
1693 install_rpath : rootlibexecdir,
1695 install_dir : systemgeneratordir)
1697 executable('systemd-run-generator',
1698 'src/run-generator/run-generator.c',
1699 include_directories : includes,
1700 link_with : [libshared],
1701 install_rpath : rootlibexecdir,
1703 install_dir : systemgeneratordir)
1705 executable('systemd-fstab-generator',
1706 'src/fstab-generator/fstab-generator.c',
1707 'src/core/mount-setup.c',
1708 include_directories : includes,
1709 link_with : [libshared],
1710 install_rpath : rootlibexecdir,
1712 install_dir : systemgeneratordir)
1714 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1715 executable('30-systemd-environment-d-generator',
1716 'src/environment-d-generator/environment-d-generator.c',
1717 include_directories : includes,
1718 link_with : [libshared],
1719 install_rpath : rootlibexecdir,
1721 install_dir : userenvgeneratordir)
1723 meson.add_install_script(meson_make_symlink,
1724 join_paths(sysconfdir, 'environment'),
1725 join_paths(environmentdir, '99-environment.conf'))
1728 if conf.get('ENABLE_HIBERNATE') == 1
1729 executable('systemd-hibernate-resume-generator',
1730 'src/hibernate-resume/hibernate-resume-generator.c',
1731 include_directories : includes,
1732 link_with : [libshared],
1733 install_rpath : rootlibexecdir,
1735 install_dir : systemgeneratordir)
1737 executable('systemd-hibernate-resume',
1738 'src/hibernate-resume/hibernate-resume.c',
1739 include_directories : includes,
1740 link_with : [libshared],
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootlibexecdir)
1746 if conf.get('HAVE_BLKID') == 1
1747 executable('systemd-gpt-auto-generator',
1748 'src/gpt-auto-generator/gpt-auto-generator.c',
1749 'src/shared/blkid-util.h',
1750 include_directories : includes,
1751 link_with : [libshared],
1752 dependencies : libblkid,
1753 install_rpath : rootlibexecdir,
1755 install_dir : systemgeneratordir)
1757 exe = executable('systemd-dissect',
1758 'src/dissect/dissect.c',
1759 include_directories : includes,
1760 link_with : [libshared],
1761 install_rpath : rootlibexecdir,
1763 install_dir : rootlibexecdir)
1764 public_programs += exe
1767 if conf.get('ENABLE_RESOLVE') == 1
1768 executable('systemd-resolved',
1769 systemd_resolved_sources,
1770 include_directories : includes,
1771 link_with : [libshared,
1773 libsystemd_resolve_core],
1774 dependencies : systemd_resolved_dependencies,
1775 install_rpath : rootlibexecdir,
1777 install_dir : rootlibexecdir)
1779 exe = executable('resolvectl',
1781 include_directories : includes,
1782 link_with : [libshared,
1784 libsystemd_resolve_core],
1785 dependencies : [threads,
1789 install_rpath : rootlibexecdir,
1791 public_programs += exe
1793 meson.add_install_script(meson_make_symlink,
1794 join_paths(bindir, 'resolvectl'),
1795 join_paths(rootsbindir, 'resolvconf'))
1797 meson.add_install_script(meson_make_symlink,
1798 join_paths(bindir, 'resolvectl'),
1799 join_paths(bindir, 'systemd-resolve'))
1802 if conf.get('ENABLE_LOGIND') == 1
1803 executable('systemd-logind',
1804 systemd_logind_sources,
1805 include_directories : includes,
1806 link_with : [liblogind_core,
1808 dependencies : [threads,
1810 install_rpath : rootlibexecdir,
1812 install_dir : rootlibexecdir)
1814 exe = executable('loginctl',
1816 include_directories : includes,
1817 link_with : [libshared],
1818 dependencies : [threads,
1821 install_rpath : rootlibexecdir,
1823 install_dir : rootbindir)
1824 public_programs += exe
1826 exe = executable('systemd-inhibit',
1827 'src/login/inhibit.c',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 install_rpath : rootlibexecdir,
1832 install_dir : rootbindir)
1833 public_programs += exe
1835 if conf.get('HAVE_PAM') == 1
1836 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1837 pam_systemd = shared_library(
1841 include_directories : includes,
1842 link_args : ['-shared',
1843 '-Wl,--version-script=' + version_script_arg],
1844 link_with : [libsystemd_static,
1846 dependencies : [threads,
1849 link_depends : pam_systemd_sym,
1851 install_dir : pamlibdir)
1853 if want_tests != 'false'
1854 test('dlopen-pam_systemd',
1856 # path to dlopen must include a slash
1857 args : pam_systemd.full_path())
1861 executable('systemd-user-runtime-dir',
1862 user_runtime_dir_sources,
1863 include_directories : includes,
1864 link_with : [libshared],
1865 install_rpath : rootlibexecdir,
1867 install_dir : rootlibexecdir)
1870 if conf.get('HAVE_PAM') == 1
1871 executable('systemd-user-sessions',
1872 'src/user-sessions/user-sessions.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 install_rpath : rootlibexecdir,
1877 install_dir : rootlibexecdir)
1880 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1881 exe = executable('bootctl',
1882 'src/boot/bootctl.c',
1883 include_directories : includes,
1884 link_with : [libshared],
1885 dependencies : [libblkid],
1886 install_rpath : rootlibexecdir,
1888 public_programs += exe
1890 executable('systemd-bless-boot',
1891 'src/boot/bless-boot.c',
1892 include_directories : includes,
1893 link_with : [libshared],
1894 dependencies : [libblkid],
1895 install_rpath : rootlibexecdir,
1897 install_dir : rootlibexecdir)
1899 executable('systemd-bless-boot-generator',
1900 'src/boot/bless-boot-generator.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 install_rpath : rootlibexecdir,
1905 install_dir : systemgeneratordir)
1908 executable('systemd-boot-check-no-failures',
1909 'src/boot/boot-check-no-failures.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 dependencies : [libblkid],
1913 install_rpath : rootlibexecdir,
1915 install_dir : rootlibexecdir)
1917 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1918 include_directories : includes,
1919 link_with : [libshared],
1920 dependencies : [threads],
1921 install_rpath : rootlibexecdir,
1923 public_programs += exe
1926 if get_option('link-systemctl-shared')
1927 systemctl_link_with = [libshared]
1929 systemctl_link_with = [libsystemd_static,
1935 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1936 include_directories : includes,
1937 link_with : systemctl_link_with,
1938 dependencies : [threads,
1943 install_rpath : rootlibexecdir,
1945 install_dir : rootbindir)
1946 public_programs += exe
1948 if conf.get('ENABLE_PORTABLED') == 1
1949 executable('systemd-portabled',
1950 systemd_portabled_sources,
1951 include_directories : includes,
1952 link_with : [libshared],
1953 dependencies : [threads],
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootlibexecdir)
1958 exe = executable('portablectl', 'src/portable/portablectl.c',
1959 include_directories : includes,
1960 link_with : [libshared],
1961 dependencies : [threads],
1962 install_rpath : rootlibexecdir,
1964 install_dir : rootbindir)
1965 public_programs += exe
1968 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1969 meson.add_install_script(meson_make_symlink,
1970 join_paths(rootbindir, 'systemctl'),
1971 join_paths(rootsbindir, alias))
1974 if conf.get('ENABLE_BACKLIGHT') == 1
1975 executable('systemd-backlight',
1976 'src/backlight/backlight.c',
1977 include_directories : includes,
1978 link_with : [libshared],
1979 install_rpath : rootlibexecdir,
1981 install_dir : rootlibexecdir)
1984 if conf.get('ENABLE_RFKILL') == 1
1985 executable('systemd-rfkill',
1986 'src/rfkill/rfkill.c',
1987 include_directories : includes,
1988 link_with : [libshared],
1989 install_rpath : rootlibexecdir,
1991 install_dir : rootlibexecdir)
1994 executable('systemd-system-update-generator',
1995 'src/system-update-generator/system-update-generator.c',
1996 include_directories : includes,
1997 link_with : [libshared],
1998 install_rpath : rootlibexecdir,
2000 install_dir : systemgeneratordir)
2002 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2003 executable('systemd-cryptsetup',
2004 'src/cryptsetup/cryptsetup.c',
2005 include_directories : includes,
2006 link_with : [libshared],
2007 dependencies : [libcryptsetup],
2008 install_rpath : rootlibexecdir,
2010 install_dir : rootlibexecdir)
2012 executable('systemd-cryptsetup-generator',
2013 'src/cryptsetup/cryptsetup-generator.c',
2014 include_directories : includes,
2015 link_with : [libshared],
2016 dependencies : [libcryptsetup],
2017 install_rpath : rootlibexecdir,
2019 install_dir : systemgeneratordir)
2021 executable('systemd-veritysetup',
2022 'src/veritysetup/veritysetup.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [libcryptsetup],
2026 install_rpath : rootlibexecdir,
2028 install_dir : rootlibexecdir)
2030 executable('systemd-veritysetup-generator',
2031 'src/veritysetup/veritysetup-generator.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 dependencies : [libcryptsetup],
2035 install_rpath : rootlibexecdir,
2037 install_dir : systemgeneratordir)
2040 if conf.get('HAVE_SYSV_COMPAT') == 1
2041 executable('systemd-sysv-generator',
2042 'src/sysv-generator/sysv-generator.c',
2043 include_directories : includes,
2044 link_with : [libshared],
2045 install_rpath : rootlibexecdir,
2047 install_dir : systemgeneratordir)
2049 executable('systemd-rc-local-generator',
2050 'src/rc-local-generator/rc-local-generator.c',
2051 include_directories : includes,
2052 link_with : [libshared],
2053 install_rpath : rootlibexecdir,
2055 install_dir : systemgeneratordir)
2058 if conf.get('ENABLE_HOSTNAMED') == 1
2059 executable('systemd-hostnamed',
2060 'src/hostname/hostnamed.c',
2061 include_directories : includes,
2062 link_with : [libshared],
2063 install_rpath : rootlibexecdir,
2065 install_dir : rootlibexecdir)
2067 exe = executable('hostnamectl',
2068 'src/hostname/hostnamectl.c',
2069 include_directories : includes,
2070 link_with : [libshared],
2071 install_rpath : rootlibexecdir,
2073 public_programs += exe
2076 if conf.get('ENABLE_LOCALED') == 1
2077 if conf.get('HAVE_XKBCOMMON') == 1
2078 # logind will load libxkbcommon.so dynamically on its own
2084 executable('systemd-localed',
2085 systemd_localed_sources,
2086 include_directories : includes,
2087 link_with : [libshared],
2088 dependencies : deps,
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootlibexecdir)
2093 exe = executable('localectl',
2095 include_directories : includes,
2096 link_with : [libshared],
2097 install_rpath : rootlibexecdir,
2099 public_programs += exe
2102 if conf.get('ENABLE_TIMEDATED') == 1
2103 executable('systemd-timedated',
2104 'src/timedate/timedated.c',
2105 include_directories : includes,
2106 link_with : [libshared],
2107 install_rpath : rootlibexecdir,
2109 install_dir : rootlibexecdir)
2112 if conf.get('ENABLE_TIMEDATECTL') == 1
2113 exe = executable('timedatectl',
2114 'src/timedate/timedatectl.c',
2115 include_directories : includes,
2116 install_rpath : rootlibexecdir,
2117 link_with : [libshared],
2118 dependencies : [libm],
2120 public_programs += exe
2123 if conf.get('ENABLE_TIMESYNCD') == 1
2124 executable('systemd-timesyncd',
2125 systemd_timesyncd_sources,
2126 include_directories : includes,
2127 link_with : [libshared],
2128 dependencies : [threads,
2130 install_rpath : rootlibexecdir,
2132 install_dir : rootlibexecdir)
2134 executable('systemd-time-wait-sync',
2135 'src/time-wait-sync/time-wait-sync.c',
2136 include_directories : includes,
2137 link_with : [libshared],
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootlibexecdir)
2143 if conf.get('ENABLE_MACHINED') == 1
2144 executable('systemd-machined',
2145 systemd_machined_sources,
2146 include_directories : includes,
2147 link_with : [libmachine_core,
2149 install_rpath : rootlibexecdir,
2151 install_dir : rootlibexecdir)
2153 exe = executable('machinectl',
2154 'src/machine/machinectl.c',
2155 include_directories : includes,
2156 link_with : [libshared],
2157 dependencies : [threads,
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootbindir)
2163 public_programs += exe
2166 if conf.get('ENABLE_IMPORTD') == 1
2167 executable('systemd-importd',
2168 systemd_importd_sources,
2169 include_directories : includes,
2170 link_with : [libshared],
2171 dependencies : [threads],
2172 install_rpath : rootlibexecdir,
2174 install_dir : rootlibexecdir)
2176 systemd_pull = executable('systemd-pull',
2177 systemd_pull_sources,
2178 include_directories : includes,
2179 link_with : [libshared],
2180 dependencies : [libcurl,
2185 install_rpath : rootlibexecdir,
2187 install_dir : rootlibexecdir)
2189 systemd_import = executable('systemd-import',
2190 systemd_import_sources,
2191 include_directories : includes,
2192 link_with : [libshared],
2193 dependencies : [libcurl,
2197 install_rpath : rootlibexecdir,
2199 install_dir : rootlibexecdir)
2201 systemd_import_fs = executable('systemd-import-fs',
2202 systemd_import_fs_sources,
2203 include_directories : includes,
2204 link_with : [libshared],
2205 install_rpath : rootlibexecdir,
2207 install_dir : rootlibexecdir)
2209 systemd_export = executable('systemd-export',
2210 systemd_export_sources,
2211 include_directories : includes,
2212 link_with : [libshared],
2213 dependencies : [libcurl,
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootlibexecdir)
2221 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2224 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2225 exe = executable('systemd-journal-upload',
2226 systemd_journal_upload_sources,
2227 include_directories : includes,
2228 link_with : [libshared],
2229 dependencies : [threads,
2234 install_rpath : rootlibexecdir,
2236 install_dir : rootlibexecdir)
2237 public_programs += exe
2240 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2241 s_j_remote = executable('systemd-journal-remote',
2242 systemd_journal_remote_sources,
2243 include_directories : includes,
2244 link_with : [libshared,
2245 libsystemd_journal_remote],
2246 dependencies : [threads,
2251 install_rpath : rootlibexecdir,
2253 install_dir : rootlibexecdir)
2255 s_j_gatewayd = executable('systemd-journal-gatewayd',
2256 systemd_journal_gatewayd_sources,
2257 include_directories : includes,
2258 link_with : [libshared],
2259 dependencies : [threads,
2264 install_rpath : rootlibexecdir,
2266 install_dir : rootlibexecdir)
2267 public_programs += [s_j_remote, s_j_gatewayd]
2270 if conf.get('ENABLE_COREDUMP') == 1
2271 executable('systemd-coredump',
2272 systemd_coredump_sources,
2273 include_directories : includes,
2274 link_with : [libshared],
2275 dependencies : [threads,
2280 install_rpath : rootlibexecdir,
2282 install_dir : rootlibexecdir)
2284 exe = executable('coredumpctl',
2285 coredumpctl_sources,
2286 include_directories : includes,
2287 link_with : [libshared],
2288 dependencies : [threads,
2291 install_rpath : rootlibexecdir,
2293 public_programs += exe
2296 if conf.get('ENABLE_BINFMT') == 1
2297 exe = executable('systemd-binfmt',
2298 'src/binfmt/binfmt.c',
2299 include_directories : includes,
2300 link_with : [libshared],
2301 install_rpath : rootlibexecdir,
2303 install_dir : rootlibexecdir)
2304 public_programs += exe
2306 meson.add_install_script('sh', '-c',
2307 mkdir_p.format(binfmtdir))
2308 meson.add_install_script('sh', '-c',
2309 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2312 if conf.get('ENABLE_VCONSOLE') == 1
2313 executable('systemd-vconsole-setup',
2314 'src/vconsole/vconsole-setup.c',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 install_rpath : rootlibexecdir,
2319 install_dir : rootlibexecdir)
2322 if conf.get('ENABLE_RANDOMSEED') == 1
2323 executable('systemd-random-seed',
2324 'src/random-seed/random-seed.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 install_rpath : rootlibexecdir,
2329 install_dir : rootlibexecdir)
2332 if conf.get('ENABLE_FIRSTBOOT') == 1
2333 executable('systemd-firstboot',
2334 'src/firstboot/firstboot.c',
2335 include_directories : includes,
2336 link_with : [libshared],
2337 dependencies : [libcrypt],
2338 install_rpath : rootlibexecdir,
2340 install_dir : rootbindir)
2343 executable('systemd-remount-fs',
2344 'src/remount-fs/remount-fs.c',
2345 'src/core/mount-setup.c',
2346 'src/core/mount-setup.h',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 install_rpath : rootlibexecdir,
2351 install_dir : rootlibexecdir)
2353 executable('systemd-machine-id-setup',
2354 'src/machine-id-setup/machine-id-setup-main.c',
2355 'src/core/machine-id-setup.c',
2356 'src/core/machine-id-setup.h',
2357 include_directories : includes,
2358 link_with : [libshared],
2359 install_rpath : rootlibexecdir,
2361 install_dir : rootbindir)
2363 executable('systemd-fsck',
2365 include_directories : includes,
2366 link_with : [libshared],
2367 install_rpath : rootlibexecdir,
2369 install_dir : rootlibexecdir)
2371 executable('systemd-growfs',
2372 'src/partition/growfs.c',
2373 include_directories : includes,
2374 link_with : [libshared],
2375 dependencies : [libcryptsetup],
2376 install_rpath : rootlibexecdir,
2378 install_dir : rootlibexecdir)
2380 executable('systemd-makefs',
2381 'src/partition/makefs.c',
2382 include_directories : includes,
2383 link_with : [libshared],
2384 install_rpath : rootlibexecdir,
2386 install_dir : rootlibexecdir)
2388 executable('systemd-sleep',
2389 'src/sleep/sleep.c',
2390 include_directories : includes,
2391 link_with : [libshared],
2392 install_rpath : rootlibexecdir,
2394 install_dir : rootlibexecdir)
2396 install_data('src/sleep/sleep.conf',
2397 install_dir : pkgsysconfdir)
2399 exe = executable('systemd-sysctl',
2400 'src/sysctl/sysctl.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2405 install_dir : rootlibexecdir)
2406 public_programs += exe
2408 executable('systemd-ac-power',
2409 'src/ac-power/ac-power.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 install_rpath : rootlibexecdir,
2414 install_dir : rootlibexecdir)
2416 exe = executable('systemd-detect-virt',
2417 'src/detect-virt/detect-virt.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 install_rpath : rootlibexecdir,
2422 public_programs += exe
2424 exe = executable('systemd-delta',
2425 'src/delta/delta.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 public_programs += exe
2432 exe = executable('systemd-escape',
2433 'src/escape/escape.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 install_dir : rootbindir)
2439 public_programs += exe
2441 exe = executable('systemd-notify',
2442 'src/notify/notify.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 install_rpath : rootlibexecdir,
2447 install_dir : rootbindir)
2448 public_programs += exe
2450 executable('systemd-volatile-root',
2451 'src/volatile-root/volatile-root.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootlibexecdir)
2458 executable('systemd-cgroups-agent',
2459 'src/cgroups-agent/cgroups-agent.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2466 exe = executable('systemd-id128',
2467 'src/id128/id128.c',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 install_rpath : rootlibexecdir,
2472 public_programs += exe
2474 exe = executable('systemd-path',
2476 include_directories : includes,
2477 link_with : [libshared],
2478 install_rpath : rootlibexecdir,
2480 public_programs += exe
2482 exe = executable('systemd-ask-password',
2483 'src/ask-password/ask-password.c',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 install_rpath : rootlibexecdir,
2488 install_dir : rootbindir)
2489 public_programs += exe
2491 executable('systemd-reply-password',
2492 'src/reply-password/reply-password.c',
2493 include_directories : includes,
2494 link_with : [libshared],
2495 install_rpath : rootlibexecdir,
2497 install_dir : rootlibexecdir)
2499 exe = executable('systemd-tty-ask-password-agent',
2500 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2501 include_directories : includes,
2502 link_with : [libshared],
2503 install_rpath : rootlibexecdir,
2505 install_dir : rootbindir)
2506 public_programs += exe
2508 exe = executable('systemd-cgls',
2510 include_directories : includes,
2511 link_with : [libshared],
2512 install_rpath : rootlibexecdir,
2514 public_programs += exe
2516 exe = executable('systemd-cgtop',
2517 'src/cgtop/cgtop.c',
2518 include_directories : includes,
2519 link_with : [libshared],
2520 install_rpath : rootlibexecdir,
2522 public_programs += exe
2524 executable('systemd-initctl',
2525 'src/initctl/initctl.c',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 install_rpath : rootlibexecdir,
2530 install_dir : rootlibexecdir)
2532 exe = executable('systemd-mount',
2533 'src/mount/mount-tool.c',
2534 include_directories : includes,
2535 link_with : [libshared],
2536 install_rpath : rootlibexecdir,
2538 public_programs += exe
2540 meson.add_install_script(meson_make_symlink,
2541 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2543 exe = executable('systemd-run',
2545 include_directories : includes,
2546 link_with : [libshared],
2547 install_rpath : rootlibexecdir,
2549 public_programs += exe
2551 exe = executable('systemd-stdio-bridge',
2552 'src/stdio-bridge/stdio-bridge.c',
2553 include_directories : includes,
2554 link_with : [libshared],
2555 install_rpath : rootlibexecdir,
2557 public_programs += exe
2559 exe = executable('busctl',
2560 'src/busctl/busctl.c',
2561 'src/busctl/busctl-introspect.c',
2562 'src/busctl/busctl-introspect.h',
2563 include_directories : includes,
2564 link_with : [libshared],
2565 install_rpath : rootlibexecdir,
2567 public_programs += exe
2569 if conf.get('ENABLE_SYSUSERS') == 1
2570 exe = executable('systemd-sysusers',
2571 'src/sysusers/sysusers.c',
2572 include_directories : includes,
2573 link_with : [libshared],
2574 install_rpath : rootlibexecdir,
2576 install_dir : rootbindir)
2577 public_programs += exe
2580 if conf.get('ENABLE_TMPFILES') == 1
2581 exe = executable('systemd-tmpfiles',
2582 'src/tmpfiles/tmpfiles.c',
2583 include_directories : includes,
2584 link_with : [libshared],
2585 dependencies : [libacl],
2586 install_rpath : rootlibexecdir,
2588 install_dir : rootbindir)
2589 public_programs += exe
2591 if want_tests != 'false'
2592 test('test-systemd-tmpfiles',
2593 test_systemd_tmpfiles_py,
2594 # https://github.com/mesonbuild/meson/issues/2681
2595 args : exe.full_path())
2599 if conf.get('ENABLE_HWDB') == 1
2600 exe = executable('systemd-hwdb',
2602 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2603 include_directories : includes,
2604 link_with : [libudev_static],
2605 install_rpath : udev_rpath,
2607 install_dir : rootbindir)
2608 public_programs += exe
2611 if conf.get('ENABLE_QUOTACHECK') == 1
2612 executable('systemd-quotacheck',
2613 'src/quotacheck/quotacheck.c',
2614 include_directories : includes,
2615 link_with : [libshared],
2616 install_rpath : rootlibexecdir,
2618 install_dir : rootlibexecdir)
2621 exe = executable('systemd-socket-proxyd',
2622 'src/socket-proxy/socket-proxyd.c',
2623 include_directories : includes,
2624 link_with : [libshared],
2625 dependencies : [threads],
2626 install_rpath : rootlibexecdir,
2628 install_dir : rootlibexecdir)
2629 public_programs += exe
2631 exe = executable('systemd-udevd',
2632 systemd_udevd_sources,
2633 include_directories : includes,
2634 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2635 link_with : [libudev_core,
2638 dependencies : [threads,
2643 install_rpath : udev_rpath,
2645 install_dir : rootlibexecdir)
2646 public_programs += exe
2648 exe = executable('udevadm',
2650 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2651 include_directories : includes,
2652 link_with : [libudev_core,
2655 dependencies : [threads,
2660 install_rpath : udev_rpath,
2662 install_dir : rootbindir)
2663 public_programs += exe
2665 executable('systemd-shutdown',
2666 systemd_shutdown_sources,
2667 include_directories : includes,
2668 link_with : [libshared],
2669 dependencies : [libmount],
2670 install_rpath : rootlibexecdir,
2672 install_dir : rootlibexecdir)
2674 executable('systemd-update-done',
2675 'src/update-done/update-done.c',
2676 include_directories : includes,
2677 link_with : [libshared],
2678 install_rpath : rootlibexecdir,
2680 install_dir : rootlibexecdir)
2682 executable('systemd-update-utmp',
2683 'src/update-utmp/update-utmp.c',
2684 include_directories : includes,
2685 link_with : [libshared],
2686 dependencies : [libaudit],
2687 install_rpath : rootlibexecdir,
2689 install_dir : rootlibexecdir)
2691 if conf.get('HAVE_KMOD') == 1
2692 executable('systemd-modules-load',
2693 'src/modules-load/modules-load.c',
2694 include_directories : includes,
2695 link_with : [libshared],
2696 dependencies : [libkmod],
2697 install_rpath : rootlibexecdir,
2699 install_dir : rootlibexecdir)
2701 meson.add_install_script('sh', '-c',
2702 mkdir_p.format(modulesloaddir))
2703 meson.add_install_script('sh', '-c',
2704 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2707 exe = executable('systemd-nspawn',
2708 systemd_nspawn_sources,
2709 'src/core/mount-setup.c', # FIXME: use a variable?
2710 'src/core/mount-setup.h',
2711 'src/core/loopback-setup.c',
2712 'src/core/loopback-setup.h',
2713 include_directories : includes,
2714 link_with : [libnspawn_core,
2716 dependencies : [libblkid],
2717 install_rpath : rootlibexecdir,
2719 public_programs += exe
2721 if conf.get('ENABLE_NETWORKD') == 1
2722 executable('systemd-networkd',
2723 systemd_networkd_sources,
2724 include_directories : includes,
2725 link_with : [libnetworkd_core,
2729 dependencies : [threads],
2730 install_rpath : rootlibexecdir,
2732 install_dir : rootlibexecdir)
2734 executable('systemd-networkd-wait-online',
2735 systemd_networkd_wait_online_sources,
2736 include_directories : includes,
2737 link_with : [libnetworkd_core,
2739 install_rpath : rootlibexecdir,
2741 install_dir : rootlibexecdir)
2743 exe = executable('networkctl',
2745 include_directories : includes,
2746 link_with : [libsystemd_network,
2748 install_rpath : rootlibexecdir,
2750 install_dir : rootbindir)
2751 public_programs += exe
2754 executable('systemd-sulogin-shell',
2755 ['src/sulogin-shell/sulogin-shell.c'],
2756 include_directories : includes,
2757 link_with : [libshared],
2758 install_rpath : rootlibexecdir,
2760 install_dir : rootlibexecdir)
2762 ############################################################
2765 'systemd-runtest.env',
2766 output : 'systemd-runtest.env',
2767 command : ['sh', '-c', '{ ' +
2768 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2769 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2771 build_by_default : true)
2773 foreach tuple : tests
2775 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2776 dependencies = tuple[2]
2777 condition = tuple.length() >= 4 ? tuple[3] : ''
2778 type = tuple.length() >= 5 ? tuple[4] : ''
2779 defs = tuple.length() >= 6 ? tuple[5] : []
2780 incs = tuple.length() >= 7 ? tuple[6] : includes
2783 name = sources[0].split('/')[-1].split('.')[0]
2784 if type.startswith('timeout=')
2785 timeout = type.split('=')[1].to_int()
2789 if condition == '' or conf.get(condition) == 1
2793 include_directories : incs,
2794 link_with : link_with,
2795 dependencies : dependencies,
2797 build_by_default : want_tests != 'false',
2798 install_rpath : rootlibexecdir,
2799 install : install_tests,
2800 install_dir : join_paths(testsdir, type))
2803 message('@0@ is a manual test'.format(name))
2804 elif type == 'unsafe' and want_tests != 'unsafe'
2805 message('@0@ is an unsafe test'.format(name))
2806 elif want_tests != 'false'
2812 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2817 'test-libsystemd-sym',
2818 test_libsystemd_sym_c,
2819 include_directories : includes,
2820 link_with : [libsystemd],
2821 build_by_default : want_tests != 'false',
2822 install : install_tests,
2823 install_dir : testsdir)
2824 if want_tests != 'false'
2825 test('test-libsystemd-sym', exe)
2829 'test-libsystemd-static-sym',
2830 test_libsystemd_sym_c,
2831 include_directories : includes,
2832 link_with : [install_libsystemd_static],
2833 dependencies : [threads], # threads is already included in dependencies on the library,
2834 # but does not seem to get propagated. Add here as a work-around.
2835 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2836 install : install_tests and static_libsystemd_pic,
2837 install_dir : testsdir)
2838 if want_tests != 'false' and static_libsystemd_pic
2839 test('test-libsystemd-static-sym', exe)
2845 include_directories : includes,
2846 c_args : '-Wno-deprecated-declarations',
2847 link_with : [libudev],
2848 build_by_default : want_tests != 'false',
2849 install : install_tests,
2850 install_dir : testsdir)
2851 if want_tests != 'false'
2852 test('test-libudev-sym', exe)
2856 'test-libudev-static-sym',
2858 include_directories : includes,
2859 c_args : '-Wno-deprecated-declarations',
2860 link_with : [install_libudev_static],
2861 build_by_default : want_tests != 'false' and static_libudev_pic,
2862 install : install_tests and static_libudev_pic,
2863 install_dir : testsdir)
2864 if want_tests != 'false' and static_libudev_pic
2865 test('test-libudev-static-sym', exe)
2868 ############################################################
2872 if get_option('tests') != 'false'
2873 foreach tuple : fuzzers
2875 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2876 dependencies = tuple[2]
2877 defs = tuple.length() >= 4 ? tuple[3] : []
2878 incs = tuple.length() >= 5 ? tuple[4] : includes
2881 dependencies += fuzzing_engine
2883 sources += 'src/fuzz/fuzz-main.c'
2886 name = sources[0].split('/')[-1].split('.')[0]
2888 fuzzer_exes += executable(
2891 include_directories : [incs, include_directories('src/fuzz')],
2892 link_with : link_with,
2893 dependencies : dependencies,
2899 run_target('fuzzers',
2900 depends : fuzzer_exes,
2903 ############################################################
2905 make_directive_index_py = find_program('tools/make-directive-index.py')
2906 make_man_index_py = find_program('tools/make-man-index.py')
2907 xml_helper_py = find_program('tools/xml_helper.py')
2908 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2912 subdir('sysusers.d')
2913 subdir('tmpfiles.d')
2918 subdir('shell-completion/bash')
2919 subdir('shell-completion/zsh')
2920 subdir('docs/sysvinit')
2921 subdir('docs/var-log')
2923 install_subdir('factory/etc',
2924 install_dir : factorydir)
2926 install_data('xorg/50-systemd-user.sh',
2927 install_dir : xinitrcdir)
2928 install_data('modprobe.d/systemd.conf',
2929 install_dir : modprobedir)
2930 install_data('LICENSE.GPL2',
2934 'docs/CODING_STYLE.md',
2935 'docs/DISTRO_PORTING.md',
2936 'docs/ENVIRONMENT.md',
2938 'docs/TRANSIENT-SETTINGS.md',
2939 'docs/TRANSLATORS.md',
2940 'docs/UIDS-GIDS.md',
2941 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2942 install_dir : docdir)
2944 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2945 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2947 ############################################################
2949 meson_check_help = find_program('tools/meson-check-help.sh')
2951 foreach exec : public_programs
2952 name = exec.full_path().split('/')[-1]
2953 if want_tests != 'false'
2954 test('check-help-' + name,
2956 args : exec.full_path())
2960 ############################################################
2962 # Enable tests for all supported sanitizers
2963 foreach tuple : sanitizers
2964 sanitizer = tuple[0]
2967 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2969 foreach p : fuzz_regression_tests
2970 b = p.split('/')[-2]
2971 c = p.split('/')[-1]
2973 name = '@0@:@1@'.format(b, sanitizer)
2976 if want_tests == 'false'
2977 message('Not compiling @0@ because tests is set to false'.format(name))
2979 exe = custom_target(
2983 command : [env, 'ln', '-fs',
2984 join_paths(build.full_path(), b),
2986 build_by_default : true)
2988 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2993 if want_tests != 'false' and slow_tests
2994 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2996 args : [exe.full_path(),
2997 join_paths(meson.source_root(), p)])
3004 ############################################################
3007 all_files = run_command(
3009 ['--git-dir=@0@/.git'.format(meson.source_root()),
3012 all_files = files(all_files.stdout().split())
3017 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3020 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3024 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3027 command : [meson_git_contrib_sh])
3031 git_head = run_command(
3033 ['--git-dir=@0@/.git'.format(meson.source_root()),
3034 'rev-parse', 'HEAD']).stdout().strip()
3035 git_head_short = run_command(
3037 ['--git-dir=@0@/.git'.format(meson.source_root()),
3038 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3042 command : ['git', 'archive',
3043 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3045 '--prefix', 'systemd-@0@/'.format(git_head),
3049 ############################################################
3051 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3054 depends : [man, libsystemd, libudev],
3055 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3057 ############################################################
3060 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3062 'split /usr: @0@'.format(split_usr),
3063 'split bin-sbin: @0@'.format(split_bin),
3064 'prefix directory: @0@'.format(prefixdir),
3065 'rootprefix directory: @0@'.format(rootprefixdir),
3066 'sysconf directory: @0@'.format(sysconfdir),
3067 'include directory: @0@'.format(includedir),
3068 'lib directory: @0@'.format(libdir),
3069 'rootlib directory: @0@'.format(rootlibdir),
3070 'SysV init scripts: @0@'.format(sysvinit_path),
3071 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3072 'PAM modules directory: @0@'.format(pamlibdir),
3073 'PAM configuration directory: @0@'.format(pamconfdir),
3074 'RPM macros directory: @0@'.format(rpmmacrosdir),
3075 'modprobe.d directory: @0@'.format(modprobedir),
3076 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3077 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3078 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3079 'bash completions directory: @0@'.format(bashcompletiondir),
3080 'zsh completions directory: @0@'.format(zshcompletiondir),
3081 'extra start script: @0@'.format(get_option('rc-local')),
3082 'extra stop script: @0@'.format(get_option('halt-local')),
3083 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3084 get_option('debug-tty')),
3085 'TTY GID: @0@'.format(tty_gid),
3086 'users GID: @0@'.format(substs.get('USERS_GID')),
3087 'maximum system UID: @0@'.format(system_uid_max),
3088 'maximum system GID: @0@'.format(system_gid_max),
3089 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3090 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3091 'minimum container UID base: @0@'.format(container_uid_base_min),
3092 'maximum container UID base: @0@'.format(container_uid_base_max),
3093 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3094 'render group access mode: @0@'.format(get_option('group-render-mode')),
3095 'certificate root directory: @0@'.format(get_option('certificate-root')),
3096 'support URL: @0@'.format(support_url),
3097 'nobody user name: @0@'.format(nobody_user),
3098 'nobody group name: @0@'.format(nobody_group),
3099 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3100 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3102 'default DNSSEC mode: @0@'.format(default_dnssec),
3103 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3104 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3105 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3106 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3107 'default locale: @0@'.format(default_locale)]
3109 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3110 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3112 'default DNS servers: @0@'.format(alt_dns_servers),
3113 'default NTP servers: @0@'.format(alt_ntp_servers)]
3115 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3116 '@@0@'.format(time_epoch)).stdout().strip()
3118 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3121 'static libsystemd: @0@'.format(static_libsystemd),
3122 'static libudev: @0@'.format(static_libudev)]
3125 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3126 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3127 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3129 if conf.get('ENABLE_EFI') == 1
3130 status += 'efi arch: @0@'.format(efi_arch)
3134 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3135 'EFI CC @0@'.format(' '.join(efi_cc)),
3136 'EFI lib directory: @0@'.format(efi_libdir),
3137 'EFI lds directory: @0@'.format(efi_ldsdir),
3138 'EFI include directory: @0@'.format(efi_incdir)]
3190 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3191 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3194 ['legacy pkla', install_polkit_pkla],
3196 ['gnu-efi', have_gnu_efi],
3209 ['man pages', want_man],
3210 ['html pages', want_html],
3211 ['man page indices', want_man and have_lxml],
3216 ['adm group', get_option('adm-group')],
3217 ['wheel group', get_option('wheel-group')],
3220 ['debug mmap cache'],
3223 ['valgrind', conf.get('VALGRIND') == 1],
3224 ['trace logging', conf.get('LOG_TRACE') == 1],
3225 ['link-udev-shared', get_option('link-udev-shared')],
3226 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3229 if tuple.length() >= 2
3232 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3233 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3234 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3245 'enabled features: @0@'.format(', '.join(found)),
3247 'disabled features: @0@'.format(', '.join(missing)),
3249 message('\n '.join(status))
3251 if rootprefixdir != rootprefix_default
3253 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3254 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3255 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))