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('exec_prefix', prefixdir)
238 substs.set('libdir', libdir)
239 substs.set('rootlibdir', rootlibdir)
240 substs.set('includedir', includedir)
241 substs.set('pkgsysconfdir', pkgsysconfdir)
242 substs.set('bindir', bindir)
243 substs.set('rootbindir', rootbindir)
244 substs.set('rootlibexecdir', rootlibexecdir)
245 substs.set('systemunitdir', systemunitdir)
246 substs.set('userunitdir', userunitdir)
247 substs.set('systempresetdir', systempresetdir)
248 substs.set('userpresetdir', userpresetdir)
249 substs.set('udevhwdbdir', udevhwdbdir)
250 substs.set('udevrulesdir', udevrulesdir)
251 substs.set('udevlibexecdir', udevlibexecdir)
252 substs.set('environmentdir', environmentdir)
253 substs.set('catalogdir', catalogdir)
254 substs.set('tmpfilesdir', tmpfilesdir)
255 substs.set('sysusersdir', sysusersdir)
256 substs.set('sysctldir', sysctldir)
257 substs.set('binfmtdir', binfmtdir)
258 substs.set('modulesloaddir', modulesloaddir)
259 substs.set('modprobedir', modprobedir)
260 substs.set('systemgeneratordir', systemgeneratordir)
261 substs.set('usergeneratordir', usergeneratordir)
262 substs.set('systemenvgeneratordir', systemenvgeneratordir)
263 substs.set('userenvgeneratordir', userenvgeneratordir)
264 substs.set('systemshutdowndir', systemshutdowndir)
265 substs.set('systemsleepdir', systemsleepdir)
266 substs.set('VARLOGDIR', varlogdir)
267 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
268 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
269 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
270 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
271 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
272 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
273 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
274 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
275 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
277 #####################################################################
279 cc = meson.get_compiler('c')
280 pkgconfig = import('pkgconfig')
281 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
282 meson_build_sh = find_program('tools/meson-build.sh')
284 want_tests = get_option('tests')
285 slow_tests = want_tests != 'false' and get_option('slow-tests')
286 install_tests = get_option('install-tests')
288 if add_languages('cpp', required : fuzzer_build)
289 # Used only for tests
290 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
296 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
298 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
301 possible_cc_flags = [
305 '-Wmissing-include-dirs',
306 '-Wold-style-definition',
310 '-Wsuggest-attribute=noreturn',
311 '-Werror=missing-prototypes',
312 '-Werror=implicit-function-declaration',
313 '-Werror=missing-declarations',
314 '-Werror=return-type',
315 '-Werror=incompatible-pointer-types',
317 '-Wstrict-prototypes',
319 '-Wmissing-noreturn',
320 '-Wimplicit-fallthrough=5',
323 '-Wstrict-aliasing=2',
326 '-Werror=shift-count-overflow',
327 '-Werror=shift-overflow=2',
331 # negative arguments are correctly detected starting with meson 0.46.
332 '-Wno-unused-parameter',
333 '-Wno-missing-field-initializers',
334 '-Wno-unused-result',
335 '-Wno-format-signedness',
337 # work-around for gcc 7.1 turning this on on its own.
338 '-Wno-error=nonnull',
340 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
341 # optimizations enabled, producing essentially false positives.
342 '-Wno-maybe-uninitialized',
346 '-fdiagnostics-show-option',
347 '-fno-strict-aliasing',
348 '-fvisibility=hidden',
350 '-fstack-protector-strong',
351 '--param=ssp-buffer-size=4',
354 # --as-needed and --no-undefined are provided by meson by default,
355 # run mesonconf to see what is enabled
356 possible_link_flags = [
361 if cc.get_id() == 'clang'
362 possible_cc_flags += [
363 '-Wno-typedef-redefinition',
364 '-Wno-gnu-variable-sized-type-not-at-end',
368 if get_option('buildtype') != 'debug'
369 possible_cc_flags += [
370 '-ffunction-sections',
374 possible_link_flags += '-Wl,--gc-sections'
377 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
378 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
382 #include <inttypes.h>
383 typedef uint64_t usec_t;
384 usec_t now(clockid_t clock);
389 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
390 add_project_arguments('-Werror=shadow', language : 'c')
393 cpp = ' '.join(cc.cmd_array()) + ' -E'
395 #####################################################################
396 # compilation result tests
398 conf.set('_GNU_SOURCE', true)
399 conf.set('__SANE_USERSPACE_TYPES__', true)
401 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
402 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
403 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
404 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
405 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
406 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
407 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
411 #include <sys/stat.h>
414 foreach decl : ['char16_t',
419 # We get -1 if the size cannot be determined
420 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
422 if decl == 'struct statx'
424 want_linux_stat_h = false
426 have = cc.sizeof(decl,
427 prefix : decl_headers + '#include <linux/stat.h>',
428 args : '-D_GNU_SOURCE') > 0
429 want_linux_stat_h = have
433 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
436 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
438 foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
439 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
440 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
441 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
442 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
443 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
444 ['FRA_TUN_ID', 'linux/fib_rules.h'],
445 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
446 ['FRA_PAD', 'linux/fib_rules.h'],
447 ['FRA_L3MDEV', 'linux/fib_rules.h'],
448 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
449 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
450 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
451 ['FOU_CMD_GET', 'linux/fou.h'],
452 ['IFA_FLAGS', 'linux/if_addr.h'],
453 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
454 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
455 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
456 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
457 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
458 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
459 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
460 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
461 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
462 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
463 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
464 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
465 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
466 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
467 ['IFLA_PAD', 'linux/if_link.h'],
468 ['IFLA_XDP', 'linux/if_link.h'],
469 ['IFLA_EVENT', 'linux/if_link.h'],
470 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
471 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
472 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
473 ['IFLA_MAX_MTU', 'linux/if_link.h'],
474 ['IFLA_BOND_MODE', 'linux/if_link.h'],
475 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
476 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
477 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
478 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
479 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
480 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
481 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
482 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
483 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
484 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
485 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
486 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
487 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
488 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
489 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
490 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
491 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
492 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
493 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
494 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
495 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
496 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
497 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
498 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
499 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
500 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
501 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
502 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
503 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
504 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
505 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
506 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
507 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
508 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
509 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
510 # if_tunnel.h is buggy and cannot be included on its own
511 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
512 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
513 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
514 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
515 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
516 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
517 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
518 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
519 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
520 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
521 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
523 prefix = decl.length() > 2 ? decl[2] : ''
524 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
525 conf.set10('HAVE_' + decl[0], have)
528 foreach ident : ['secure_getenv', '__secure_getenv']
529 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
533 ['memfd_create', '''#include <sys/mman.h>'''],
534 ['gettid', '''#include <sys/types.h>
535 #include <unistd.h>'''],
536 ['pivot_root', '''#include <stdlib.h>
537 #include <unistd.h>'''], # no known header declares pivot_root
538 ['name_to_handle_at', '''#include <sys/types.h>
539 #include <sys/stat.h>
540 #include <fcntl.h>'''],
541 ['setns', '''#include <sched.h>'''],
542 ['renameat2', '''#include <stdio.h>
543 #include <fcntl.h>'''],
544 ['kcmp', '''#include <linux/kcmp.h>'''],
545 ['keyctl', '''#include <sys/types.h>
546 #include <keyutils.h>'''],
547 ['copy_file_range', '''#include <sys/syscall.h>
548 #include <unistd.h>'''],
549 ['bpf', '''#include <sys/syscall.h>
550 #include <unistd.h>'''],
551 ['statx', '''#include <sys/types.h>
552 #include <sys/stat.h>
553 #include <unistd.h>'''],
554 ['explicit_bzero' , '''#include <string.h>'''],
555 ['reallocarray', '''#include <malloc.h>'''],
558 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
559 conf.set10('HAVE_' + ident[0].to_upper(), have)
562 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
563 conf.set10('USE_SYS_RANDOM_H', true)
564 conf.set10('HAVE_GETRANDOM', true)
566 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
567 conf.set10('USE_SYS_RANDOM_H', false)
568 conf.set10('HAVE_GETRANDOM', have)
571 #####################################################################
573 vcs_tagger = [meson.source_root() + '/tools/meson-vcs-tag.sh',
575 get_option('version-tag'),
576 meson.project_version()]
579 input : 'src/version/version.h.in',
580 output : 'version.h',
583 versiondep = declare_dependency(sources: version_h)
585 sed = find_program('sed')
586 awk = find_program('awk')
587 m4 = find_program('m4')
588 stat = find_program('stat')
589 git = find_program('git', required : false)
590 env = find_program('env')
591 perl = find_program('perl', required : false)
593 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
594 mkdir_p = 'mkdir -p $DESTDIR/@0@'
595 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
596 splash_bmp = files('test/splash.bmp')
598 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
599 # /usr/sbin, /sbin, and fall back to the default from middle column.
600 progs = [['quotaon', '/usr/sbin/quotaon' ],
601 ['quotacheck', '/usr/sbin/quotacheck' ],
602 ['kmod', '/usr/bin/kmod' ],
603 ['kexec', '/usr/sbin/kexec' ],
604 ['sulogin', '/usr/sbin/sulogin' ],
605 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
606 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
607 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
608 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
611 path = get_option(prog[0] + '-path')
613 message('Using @1@ for @0@'.format(prog[0], path))
615 exe = find_program(prog[0],
616 '/usr/sbin/' + prog[0],
619 path = exe.found() ? exe.path() : prog[1]
621 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
622 conf.set_quoted(name, path)
623 substs.set(name, path)
626 conf.set_quoted('TELINIT', get_option('telinit-path'))
628 if run_command('ln', '--relative', '--help').returncode() != 0
629 error('ln does not support --relative (added in coreutils 8.16)')
632 ############################################################
634 gperf = find_program('gperf')
636 gperf_test_format = '''
638 const char * in_word_set(const char *, @0@);
641 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
642 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
643 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
644 if cc.compiles(gperf_test)
645 gperf_len_type = 'size_t'
647 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
648 if cc.compiles(gperf_test)
649 gperf_len_type = 'unsigned'
651 error('unable to determine gperf len type')
654 message('gperf len type is @0@'.format(gperf_len_type))
655 conf.set('GPERF_LEN_TYPE', gperf_len_type,
656 description : 'The type of gperf "len" parameter')
658 ############################################################
660 if not cc.has_header('sys/capability.h')
661 error('POSIX caps headers not found')
663 foreach header : ['crypt.h',
664 'linux/btrfs_tree.h',
667 'linux/vm_sockets.h',
670 'valgrind/memcheck.h',
671 'valgrind/valgrind.h',
674 conf.set10('HAVE_' + header.underscorify().to_upper(),
675 cc.has_header(header))
678 ############################################################
680 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
681 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
682 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
684 default_hierarchy = get_option('default-hierarchy')
685 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
686 description : 'default cgroup hierarchy as string')
687 if default_hierarchy == 'legacy'
688 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
689 elif default_hierarchy == 'hybrid'
690 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
692 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
695 default_net_naming_scheme = get_option('default-net-naming-scheme')
696 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
698 time_epoch = get_option('time-epoch')
701 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
703 conf.set('TIME_EPOCH', time_epoch)
705 system_uid_max = get_option('system-uid-max')
706 if system_uid_max == -1
707 system_uid_max = run_command(
709 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
710 '/etc/login.defs').stdout().strip()
711 if system_uid_max == ''
714 system_uid_max = system_uid_max.to_int()
717 conf.set('SYSTEM_UID_MAX', system_uid_max)
718 substs.set('systemuidmax', system_uid_max)
720 system_gid_max = get_option('system-gid-max')
721 if system_gid_max == -1
722 system_gid_max = run_command(
724 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
725 '/etc/login.defs').stdout().strip()
726 if system_gid_max == ''
729 system_gid_max = system_gid_max.to_int()
732 conf.set('SYSTEM_GID_MAX', system_gid_max)
733 substs.set('systemgidmax', system_gid_max)
735 dynamic_uid_min = get_option('dynamic-uid-min')
736 dynamic_uid_max = get_option('dynamic-uid-max')
737 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
738 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
739 substs.set('dynamicuidmin', dynamic_uid_min)
740 substs.set('dynamicuidmax', dynamic_uid_max)
742 container_uid_base_min = get_option('container-uid-base-min')
743 container_uid_base_max = get_option('container-uid-base-max')
744 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
745 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
746 substs.set('containeruidbasemin', container_uid_base_min)
747 substs.set('containeruidbasemax', container_uid_base_max)
749 nobody_user = get_option('nobody-user')
750 nobody_group = get_option('nobody-group')
752 if not meson.is_cross_build()
753 getent_result = run_command('getent', 'passwd', '65534')
754 if getent_result.returncode() == 0
755 name = getent_result.stdout().split(':')[0]
756 if name != nobody_user
758 '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) +
759 'Your build will result in an user table setup that is incompatible with the local system.')
762 id_result = run_command('id', '-u', nobody_user)
763 if id_result.returncode() == 0
764 id = id_result.stdout().to_int()
767 '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) +
768 'Your build will result in an user table setup that is incompatible with the local system.')
772 getent_result = run_command('getent', 'group', '65534')
773 if getent_result.returncode() == 0
774 name = getent_result.stdout().split(':')[0]
775 if name != nobody_group
777 '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) +
778 'Your build will result in an group table setup that is incompatible with the local system.')
781 id_result = run_command('id', '-g', nobody_group)
782 if id_result.returncode() == 0
783 id = id_result.stdout().to_int()
786 '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) +
787 'Your build will result in an group table setup that is incompatible with the local system.')
791 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
793 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
794 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
797 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
798 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
799 substs.set('NOBODY_USER_NAME', nobody_user)
800 substs.set('NOBODY_GROUP_NAME', nobody_group)
802 tty_gid = get_option('tty-gid')
803 conf.set('TTY_GID', tty_gid)
804 substs.set('TTY_GID', tty_gid)
806 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
807 users_gid = get_option('users-gid')
808 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
810 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
811 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
813 dev_kvm_mode = get_option('dev-kvm-mode')
814 substs.set('DEV_KVM_MODE', dev_kvm_mode)
815 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
816 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
818 kill_user_processes = get_option('default-kill-user-processes')
819 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
820 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
821 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
823 dns_servers = get_option('dns-servers')
824 conf.set_quoted('DNS_SERVERS', dns_servers)
825 substs.set('DNS_SERVERS', dns_servers)
827 ntp_servers = get_option('ntp-servers')
828 conf.set_quoted('NTP_SERVERS', ntp_servers)
829 substs.set('NTP_SERVERS', ntp_servers)
831 default_locale = get_option('default-locale')
832 if default_locale == ''
833 if not meson.is_cross_build()
834 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
835 default_locale = run_command(choose_default_locale_sh).stdout().strip()
837 default_locale = 'C.UTF-8'
840 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
842 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
844 substs.set('SUSHELL', get_option('debug-shell'))
845 substs.set('DEBUGTTY', get_option('debug-tty'))
847 enable_debug_hashmap = false
848 enable_debug_mmap_cache = false
849 enable_debug_siphash = false
850 enable_debug_udev = false
851 foreach name : get_option('debug-extra')
853 enable_debug_hashmap = true
854 elif name == 'mmap-cache'
855 enable_debug_mmap_cache = true
856 elif name == 'siphash'
857 enable_debug_siphash = true
859 enable_debug_udev = true
861 message('unknown debug option "@0@", ignoring'.format(name))
864 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
865 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
866 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
867 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
869 conf.set10('VALGRIND', get_option('valgrind'))
870 conf.set10('LOG_TRACE', get_option('log-trace'))
872 #####################################################################
874 threads = dependency('threads')
875 librt = cc.find_library('rt')
876 libm = cc.find_library('m')
877 libdl = cc.find_library('dl')
878 libcrypt = cc.find_library('crypt')
880 libcap = dependency('libcap', required : false)
881 if not libcap.found()
882 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
883 libcap = cc.find_library('cap')
886 libmount = dependency('mount',
887 version : fuzzer_build ? '>= 0' : '>= 2.30')
889 want_seccomp = get_option('seccomp')
890 if want_seccomp != 'false' and not fuzzer_build
891 libseccomp = dependency('libseccomp',
892 version : '>= 2.3.1',
893 required : want_seccomp == 'true')
894 have = libseccomp.found()
899 conf.set10('HAVE_SECCOMP', have)
901 want_selinux = get_option('selinux')
902 if want_selinux != 'false' and not fuzzer_build
903 libselinux = dependency('libselinux',
904 version : '>= 2.1.9',
905 required : want_selinux == 'true')
906 have = libselinux.found()
911 conf.set10('HAVE_SELINUX', have)
913 want_apparmor = get_option('apparmor')
914 if want_apparmor != 'false' and not fuzzer_build
915 libapparmor = dependency('libapparmor',
916 required : want_apparmor == 'true')
917 have = libapparmor.found()
922 conf.set10('HAVE_APPARMOR', have)
924 smack_run_label = get_option('smack-run-label')
925 if smack_run_label != ''
926 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
929 want_polkit = get_option('polkit')
930 install_polkit = false
931 install_polkit_pkla = false
932 if want_polkit != 'false' and not fuzzer_build
933 install_polkit = true
935 libpolkit = dependency('polkit-gobject-1',
937 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
938 message('Old polkit detected, will install pkla files')
939 install_polkit_pkla = true
942 conf.set10('ENABLE_POLKIT', install_polkit)
944 want_acl = get_option('acl')
945 if want_acl != 'false' and not fuzzer_build
946 libacl = cc.find_library('acl', required : want_acl == 'true')
947 have = libacl.found()
952 conf.set10('HAVE_ACL', have)
954 want_audit = get_option('audit')
955 if want_audit != 'false' and not fuzzer_build
956 libaudit = dependency('audit', required : want_audit == 'true')
957 have = libaudit.found()
962 conf.set10('HAVE_AUDIT', have)
964 want_blkid = get_option('blkid')
965 if want_blkid != 'false' and not fuzzer_build
966 libblkid = dependency('blkid', required : want_blkid == 'true')
967 have = libblkid.found()
972 conf.set10('HAVE_BLKID', have)
974 want_kmod = get_option('kmod')
975 if want_kmod != 'false' and not fuzzer_build
976 libkmod = dependency('libkmod',
978 required : want_kmod == 'true')
979 have = libkmod.found()
984 conf.set10('HAVE_KMOD', have)
986 want_pam = get_option('pam')
987 if want_pam != 'false' and not fuzzer_build
988 libpam = cc.find_library('pam', required : want_pam == 'true')
989 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
990 have = libpam.found() and libpam_misc.found()
996 conf.set10('HAVE_PAM', have)
998 want_microhttpd = get_option('microhttpd')
999 if want_microhttpd != 'false' and not fuzzer_build
1000 libmicrohttpd = dependency('libmicrohttpd',
1001 version : '>= 0.9.33',
1002 required : want_microhttpd == 'true')
1003 have = libmicrohttpd.found()
1008 conf.set10('HAVE_MICROHTTPD', have)
1010 want_libcryptsetup = get_option('libcryptsetup')
1011 if want_libcryptsetup != 'false' and not fuzzer_build
1012 libcryptsetup = dependency('libcryptsetup',
1013 version : '>= 1.6.0',
1014 required : want_libcryptsetup == 'true')
1015 have = libcryptsetup.found()
1016 have_sector = cc.has_member(
1017 'struct crypt_params_plain',
1019 prefix : '#include <libcryptsetup.h>')
1025 conf.set10('HAVE_LIBCRYPTSETUP', have)
1026 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1028 want_libcurl = get_option('libcurl')
1029 if want_libcurl != 'false' and not fuzzer_build
1030 libcurl = dependency('libcurl',
1031 version : '>= 7.32.0',
1032 required : want_libcurl == 'true')
1033 have = libcurl.found()
1038 conf.set10('HAVE_LIBCURL', have)
1040 want_libidn = get_option('libidn')
1041 want_libidn2 = get_option('libidn2')
1042 if want_libidn == 'true' and want_libidn2 == 'true'
1043 error('libidn and libidn2 cannot be requested simultaneously')
1046 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1047 libidn = dependency('libidn',
1048 required : want_libidn == 'true')
1049 have = libidn.found()
1054 conf.set10('HAVE_LIBIDN', have)
1055 if not have and want_libidn2 != 'false' and not fuzzer_build
1056 # libidn is used for both libidn and libidn2 objects
1057 libidn = dependency('libidn2',
1058 required : want_libidn2 == 'true')
1059 have = libidn.found()
1063 conf.set10('HAVE_LIBIDN2', have)
1065 want_libiptc = get_option('libiptc')
1066 if want_libiptc != 'false' and not fuzzer_build
1067 libiptc = dependency('libiptc',
1068 required : want_libiptc == 'true')
1069 have = libiptc.found()
1074 conf.set10('HAVE_LIBIPTC', have)
1076 want_qrencode = get_option('qrencode')
1077 if want_qrencode != 'false' and not fuzzer_build
1078 libqrencode = dependency('libqrencode',
1079 required : want_qrencode == 'true')
1080 have = libqrencode.found()
1085 conf.set10('HAVE_QRENCODE', have)
1087 want_gcrypt = get_option('gcrypt')
1088 if want_gcrypt != 'false' and not fuzzer_build
1089 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1090 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1091 have = libgcrypt.found() and libgpg_error.found()
1096 # link to neither of the libs if one is not found
1100 conf.set10('HAVE_GCRYPT', have)
1102 want_gnutls = get_option('gnutls')
1103 if want_gnutls != 'false' and not fuzzer_build
1104 libgnutls = dependency('gnutls',
1105 version : '>= 3.1.4',
1106 required : want_gnutls == 'true')
1107 have = libgnutls.found()
1112 conf.set10('HAVE_GNUTLS', have)
1114 want_openssl = get_option('openssl')
1115 if want_openssl != 'false' and not fuzzer_build
1116 libopenssl = dependency('openssl',
1117 version : '>= 1.1.0',
1118 required : want_openssl == 'true')
1119 have = libopenssl.found()
1124 conf.set10('HAVE_OPENSSL', have)
1126 want_elfutils = get_option('elfutils')
1127 if want_elfutils != 'false' and not fuzzer_build
1128 libdw = dependency('libdw',
1129 required : want_elfutils == 'true')
1130 have = libdw.found()
1135 conf.set10('HAVE_ELFUTILS', have)
1137 want_zlib = get_option('zlib')
1138 if want_zlib != 'false' and not fuzzer_build
1139 libz = dependency('zlib',
1140 required : want_zlib == 'true')
1146 conf.set10('HAVE_ZLIB', have)
1148 want_bzip2 = get_option('bzip2')
1149 if want_bzip2 != 'false' and not fuzzer_build
1150 libbzip2 = cc.find_library('bz2',
1151 required : want_bzip2 == 'true')
1152 have = libbzip2.found()
1157 conf.set10('HAVE_BZIP2', have)
1159 want_xz = get_option('xz')
1160 if want_xz != 'false' and not fuzzer_build
1161 libxz = dependency('liblzma',
1162 required : want_xz == 'true')
1163 have = libxz.found()
1168 conf.set10('HAVE_XZ', have)
1170 want_lz4 = get_option('lz4')
1171 if want_lz4 != 'false' and not fuzzer_build
1172 liblz4 = dependency('liblz4',
1173 version : '>= 1.3.0',
1174 required : want_lz4 == 'true')
1175 have = liblz4.found()
1180 conf.set10('HAVE_LZ4', have)
1182 want_xkbcommon = get_option('xkbcommon')
1183 if want_xkbcommon != 'false' and not fuzzer_build
1184 libxkbcommon = dependency('xkbcommon',
1185 version : '>= 0.3.0',
1186 required : want_xkbcommon == 'true')
1187 have = libxkbcommon.found()
1192 conf.set10('HAVE_XKBCOMMON', have)
1194 want_pcre2 = get_option('pcre2')
1195 if want_pcre2 != 'false'
1196 libpcre2 = dependency('libpcre2-8',
1197 required : want_pcre2 == 'true')
1198 have = libpcre2.found()
1203 conf.set10('HAVE_PCRE2', have)
1205 want_glib = get_option('glib')
1206 if want_glib != 'false' and not fuzzer_build
1207 libglib = dependency('glib-2.0',
1208 version : '>= 2.22.0',
1209 required : want_glib == 'true')
1210 libgobject = dependency('gobject-2.0',
1211 version : '>= 2.22.0',
1212 required : want_glib == 'true')
1213 libgio = dependency('gio-2.0',
1214 required : want_glib == 'true')
1215 have = libglib.found() and libgobject.found() and libgio.found()
1222 conf.set10('HAVE_GLIB', have)
1224 want_dbus = get_option('dbus')
1225 if want_dbus != 'false' and not fuzzer_build
1226 libdbus = dependency('dbus-1',
1227 version : '>= 1.3.2',
1228 required : want_dbus == 'true')
1229 have = libdbus.found()
1234 conf.set10('HAVE_DBUS', have)
1236 default_dnssec = get_option('default-dnssec')
1238 default_dnssec = 'no'
1240 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1241 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1242 default_dnssec = 'no'
1244 conf.set('DEFAULT_DNSSEC_MODE',
1245 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1246 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1248 dns_over_tls = get_option('dns-over-tls')
1249 if dns_over_tls != 'false'
1250 if dns_over_tls == 'openssl'
1253 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1254 if dns_over_tls == 'gnutls' and not have_gnutls
1255 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1258 if dns_over_tls == 'gnutls' or have_gnutls
1259 have_openssl = false
1261 have_openssl = conf.get('HAVE_OPENSSL') == 1
1262 if dns_over_tls != 'auto' and not have_openssl
1263 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1264 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1267 have = have_gnutls or have_openssl
1271 have_openssl = false
1273 conf.set10('ENABLE_DNS_OVER_TLS', have)
1274 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1275 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1277 default_dns_over_tls = get_option('default-dns-over-tls')
1279 default_dns_over_tls = 'no'
1281 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1282 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1283 default_dns_over_tls = 'no'
1285 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1286 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1287 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1289 want_importd = get_option('importd')
1290 if want_importd != 'false'
1291 have = (conf.get('HAVE_LIBCURL') == 1 and
1292 conf.get('HAVE_ZLIB') == 1 and
1293 conf.get('HAVE_XZ') == 1 and
1294 conf.get('HAVE_GCRYPT') == 1)
1295 if want_importd == 'true' and not have
1296 error('importd support was requested, but dependencies are not available')
1301 conf.set10('ENABLE_IMPORTD', have)
1303 want_remote = get_option('remote')
1304 if want_remote != 'false'
1305 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1306 conf.get('HAVE_LIBCURL') == 1]
1307 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1308 # it's possible to build one without the other. Complain only if
1309 # support was explictly requested. The auxiliary files like sysusers
1310 # config should be installed when any of the programs are built.
1311 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1312 error('remote support was requested, but dependencies are not available')
1314 have = have_deps[0] or have_deps[1]
1318 conf.set10('ENABLE_REMOTE', have)
1320 foreach term : ['utmp',
1352 have = get_option(term)
1353 name = 'ENABLE_' + term.underscorify().to_upper()
1354 conf.set10(name, have)
1357 foreach tuple : [['nss-mymachines', 'machined'],
1358 ['nss-resolve', 'resolve']]
1359 want = get_option(tuple[0])
1361 have = get_option(tuple[1])
1362 if want == 'true' and not have
1363 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1368 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1369 conf.set10(name, have)
1373 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1374 'ENABLE_NSS_MYMACHINES',
1375 'ENABLE_NSS_RESOLVE',
1376 'ENABLE_NSS_SYSTEMD']
1377 if conf.get(term) == 1
1381 conf.set10('ENABLE_NSS', enable_nss)
1383 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1388 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1390 #####################################################################
1392 if get_option('efi')
1393 efi_arch = host_machine.cpu_family()
1395 if efi_arch == 'x86'
1396 EFI_MACHINE_TYPE_NAME = 'ia32'
1397 gnu_efi_arch = 'ia32'
1398 elif efi_arch == 'x86_64'
1399 EFI_MACHINE_TYPE_NAME = 'x64'
1400 gnu_efi_arch = 'x86_64'
1401 elif efi_arch == 'arm'
1402 EFI_MACHINE_TYPE_NAME = 'arm'
1403 gnu_efi_arch = 'arm'
1404 elif efi_arch == 'aarch64'
1405 EFI_MACHINE_TYPE_NAME = 'aa64'
1406 gnu_efi_arch = 'aarch64'
1408 EFI_MACHINE_TYPE_NAME = ''
1413 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1415 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1419 conf.set10('ENABLE_EFI', have)
1421 #####################################################################
1423 config_h = configure_file(
1424 output : 'config.h',
1425 configuration : conf)
1427 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1429 includes = include_directories('src/basic',
1433 'src/journal-remote',
1437 'src/time-wait-sync',
1442 'src/libsystemd/sd-bus',
1443 'src/libsystemd/sd-device',
1444 'src/libsystemd/sd-event',
1445 'src/libsystemd/sd-hwdb',
1446 'src/libsystemd/sd-id128',
1447 'src/libsystemd/sd-netlink',
1448 'src/libsystemd/sd-network',
1449 'src/libsystemd/sd-resolve',
1450 'src/libsystemd-network',
1453 add_project_arguments('-include', 'config.h', language : 'c')
1455 generate_gperfs = find_program('tools/generate-gperfs.py')
1459 subdir('src/systemd')
1461 subdir('src/libsystemd')
1462 subdir('src/libsystemd-network')
1463 subdir('src/journal')
1466 libjournal_core = static_library(
1468 libjournal_core_sources,
1470 include_directories : includes,
1473 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1474 libsystemd = shared_library(
1477 version : libsystemd_version,
1478 include_directories : includes,
1479 link_args : ['-shared',
1480 '-Wl,--version-script=' + libsystemd_sym_path],
1481 link_with : [libbasic,
1483 link_whole : [libsystemd_static,
1485 dependencies : [threads,
1489 link_depends : libsystemd_sym,
1491 install_dir : rootlibdir)
1493 static_libsystemd = get_option('static-libsystemd')
1494 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1496 install_libsystemd_static = static_library(
1499 journal_client_sources,
1501 basic_gcrypt_sources,
1503 include_directories : includes,
1504 build_by_default : static_libsystemd != 'false',
1505 install : static_libsystemd != 'false',
1506 install_dir : rootlibdir,
1507 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1508 dependencies : [threads,
1517 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1519 ############################################################
1521 # binaries that have --help and are intended for use by humans,
1522 # usually, but not always, installed in /bin.
1523 public_programs = []
1525 subdir('src/libudev')
1526 subdir('src/shared')
1529 subdir('src/network')
1531 subdir('src/analyze')
1532 subdir('src/journal-remote')
1533 subdir('src/coredump')
1534 subdir('src/hostname')
1535 subdir('src/import')
1536 subdir('src/kernel-install')
1537 subdir('src/locale')
1538 subdir('src/machine')
1539 subdir('src/portable')
1540 subdir('src/nspawn')
1541 subdir('src/resolve')
1542 subdir('src/timedate')
1543 subdir('src/timesync')
1544 subdir('src/vconsole')
1545 subdir('src/boot/efi')
1552 ############################################################
1554 # only static linking apart from libdl, to make sure that the
1555 # module is linked to all libraries that it uses.
1556 test_dlopen = executable(
1560 include_directories : includes,
1561 link_with : [libbasic],
1562 dependencies : [libdl],
1563 build_by_default : want_tests != 'false')
1565 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1566 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1567 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1568 ['resolve', 'ENABLE_NSS_RESOLVE']]
1570 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1574 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1575 version_script_arg = join_paths(meson.source_root(), sym)
1577 nss = shared_library(
1579 'src/nss-@0@/nss-@0@.c'.format(module),
1582 include_directories : includes,
1583 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1584 link_args : ['-Wl,-z,nodelete',
1586 '-Wl,--version-script=' + version_script_arg,
1588 link_with : [libsystemd_static,
1590 dependencies : [threads,
1594 install_dir : rootlibdir)
1596 # We cannot use shared_module because it does not support version suffix.
1597 # Unfortunately shared_library insists on creating the symlink…
1598 meson.add_install_script('sh', '-c',
1599 'rm $DESTDIR@0@/libnss_@1@.so'
1600 .format(rootlibdir, module))
1602 if want_tests != 'false'
1603 test('dlopen-nss_' + module,
1605 # path to dlopen must include a slash
1606 args : nss.full_path())
1611 ############################################################
1613 executable('systemd',
1615 include_directories : includes,
1616 link_with : [libcore,
1618 dependencies : [threads,
1624 install_rpath : rootlibexecdir,
1626 install_dir : rootlibexecdir)
1628 meson.add_install_script(meson_make_symlink,
1629 join_paths(rootlibexecdir, 'systemd'),
1630 join_paths(rootsbindir, 'init'))
1632 exe = executable('systemd-analyze',
1633 systemd_analyze_sources,
1634 include_directories : includes,
1635 link_with : [libcore,
1637 dependencies : [threads,
1643 install_rpath : rootlibexecdir,
1645 public_programs += exe
1647 executable('systemd-journald',
1648 systemd_journald_sources,
1649 include_directories : includes,
1650 link_with : [libjournal_core,
1652 dependencies : [threads,
1656 install_rpath : rootlibexecdir,
1658 install_dir : rootlibexecdir)
1660 exe = executable('systemd-cat',
1661 systemd_cat_sources,
1662 include_directories : includes,
1663 link_with : [libjournal_core,
1665 dependencies : [threads],
1666 install_rpath : rootlibexecdir,
1668 public_programs += exe
1670 exe = executable('journalctl',
1672 include_directories : includes,
1673 link_with : [libshared],
1674 dependencies : [threads,
1679 install_rpath : rootlibexecdir,
1681 install_dir : rootbindir)
1682 public_programs += exe
1684 executable('systemd-getty-generator',
1685 'src/getty-generator/getty-generator.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 install_rpath : rootlibexecdir,
1690 install_dir : systemgeneratordir)
1692 executable('systemd-debug-generator',
1693 'src/debug-generator/debug-generator.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 install_rpath : rootlibexecdir,
1698 install_dir : systemgeneratordir)
1700 executable('systemd-run-generator',
1701 'src/run-generator/run-generator.c',
1702 include_directories : includes,
1703 link_with : [libshared],
1704 install_rpath : rootlibexecdir,
1706 install_dir : systemgeneratordir)
1708 executable('systemd-fstab-generator',
1709 'src/fstab-generator/fstab-generator.c',
1710 'src/core/mount-setup.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 install_rpath : rootlibexecdir,
1715 install_dir : systemgeneratordir)
1717 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1718 executable('30-systemd-environment-d-generator',
1719 'src/environment-d-generator/environment-d-generator.c',
1720 include_directories : includes,
1721 link_with : [libshared],
1722 install_rpath : rootlibexecdir,
1724 install_dir : userenvgeneratordir)
1726 meson.add_install_script(meson_make_symlink,
1727 join_paths(sysconfdir, 'environment'),
1728 join_paths(environmentdir, '99-environment.conf'))
1731 if conf.get('ENABLE_HIBERNATE') == 1
1732 executable('systemd-hibernate-resume-generator',
1733 'src/hibernate-resume/hibernate-resume-generator.c',
1734 include_directories : includes,
1735 link_with : [libshared],
1736 install_rpath : rootlibexecdir,
1738 install_dir : systemgeneratordir)
1740 executable('systemd-hibernate-resume',
1741 'src/hibernate-resume/hibernate-resume.c',
1742 include_directories : includes,
1743 link_with : [libshared],
1744 install_rpath : rootlibexecdir,
1746 install_dir : rootlibexecdir)
1749 if conf.get('HAVE_BLKID') == 1
1750 executable('systemd-gpt-auto-generator',
1751 'src/gpt-auto-generator/gpt-auto-generator.c',
1752 'src/shared/blkid-util.h',
1753 include_directories : includes,
1754 link_with : [libshared],
1755 dependencies : libblkid,
1756 install_rpath : rootlibexecdir,
1758 install_dir : systemgeneratordir)
1760 exe = executable('systemd-dissect',
1761 'src/dissect/dissect.c',
1762 include_directories : includes,
1763 link_with : [libshared],
1764 install_rpath : rootlibexecdir,
1766 install_dir : rootlibexecdir)
1767 public_programs += exe
1770 if conf.get('ENABLE_RESOLVE') == 1
1771 executable('systemd-resolved',
1772 systemd_resolved_sources,
1773 include_directories : includes,
1774 link_with : [libshared,
1776 libsystemd_resolve_core],
1777 dependencies : systemd_resolved_dependencies,
1778 install_rpath : rootlibexecdir,
1780 install_dir : rootlibexecdir)
1782 exe = executable('resolvectl',
1784 include_directories : includes,
1785 link_with : [libshared,
1787 libsystemd_resolve_core],
1788 dependencies : [threads,
1792 install_rpath : rootlibexecdir,
1794 public_programs += exe
1796 meson.add_install_script(meson_make_symlink,
1797 join_paths(bindir, 'resolvectl'),
1798 join_paths(rootsbindir, 'resolvconf'))
1800 meson.add_install_script(meson_make_symlink,
1801 join_paths(bindir, 'resolvectl'),
1802 join_paths(bindir, 'systemd-resolve'))
1805 if conf.get('ENABLE_LOGIND') == 1
1806 executable('systemd-logind',
1807 systemd_logind_sources,
1808 include_directories : includes,
1809 link_with : [liblogind_core,
1811 dependencies : [threads,
1813 install_rpath : rootlibexecdir,
1815 install_dir : rootlibexecdir)
1817 exe = executable('loginctl',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 dependencies : [threads,
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootbindir)
1827 public_programs += exe
1829 exe = executable('systemd-inhibit',
1830 'src/login/inhibit.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 install_rpath : rootlibexecdir,
1835 install_dir : rootbindir)
1836 public_programs += exe
1838 if conf.get('HAVE_PAM') == 1
1839 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1840 pam_systemd = shared_library(
1844 include_directories : includes,
1845 link_args : ['-shared',
1846 '-Wl,--version-script=' + version_script_arg],
1847 link_with : [libsystemd_static,
1849 dependencies : [threads,
1852 link_depends : pam_systemd_sym,
1854 install_dir : pamlibdir)
1856 if want_tests != 'false'
1857 test('dlopen-pam_systemd',
1859 # path to dlopen must include a slash
1860 args : pam_systemd.full_path())
1864 executable('systemd-user-runtime-dir',
1865 user_runtime_dir_sources,
1866 include_directories : includes,
1867 link_with : [libshared],
1868 install_rpath : rootlibexecdir,
1870 install_dir : rootlibexecdir)
1873 if conf.get('HAVE_PAM') == 1
1874 executable('systemd-user-sessions',
1875 'src/user-sessions/user-sessions.c',
1876 include_directories : includes,
1877 link_with : [libshared],
1878 install_rpath : rootlibexecdir,
1880 install_dir : rootlibexecdir)
1883 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1884 exe = executable('bootctl',
1885 'src/boot/bootctl.c',
1886 include_directories : includes,
1887 link_with : [libshared],
1888 dependencies : [libblkid],
1889 install_rpath : rootlibexecdir,
1891 public_programs += exe
1893 executable('systemd-bless-boot',
1894 'src/boot/bless-boot.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 dependencies : [libblkid],
1898 install_rpath : rootlibexecdir,
1900 install_dir : rootlibexecdir)
1902 executable('systemd-bless-boot-generator',
1903 'src/boot/bless-boot-generator.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 install_rpath : rootlibexecdir,
1908 install_dir : systemgeneratordir)
1911 executable('systemd-boot-check-no-failures',
1912 'src/boot/boot-check-no-failures.c',
1913 include_directories : includes,
1914 link_with : [libshared],
1915 dependencies : [libblkid],
1916 install_rpath : rootlibexecdir,
1918 install_dir : rootlibexecdir)
1920 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1921 include_directories : includes,
1922 link_with : [libshared],
1923 dependencies : [threads],
1924 install_rpath : rootlibexecdir,
1926 public_programs += exe
1929 if get_option('link-systemctl-shared')
1930 systemctl_link_with = [libshared]
1932 systemctl_link_with = [libsystemd_static,
1938 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1939 include_directories : includes,
1940 link_with : systemctl_link_with,
1941 dependencies : [threads,
1946 install_rpath : rootlibexecdir,
1948 install_dir : rootbindir)
1949 public_programs += exe
1951 if conf.get('ENABLE_PORTABLED') == 1
1952 executable('systemd-portabled',
1953 systemd_portabled_sources,
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [threads],
1957 install_rpath : rootlibexecdir,
1959 install_dir : rootlibexecdir)
1961 exe = executable('portablectl', 'src/portable/portablectl.c',
1962 include_directories : includes,
1963 link_with : [libshared],
1964 dependencies : [threads],
1965 install_rpath : rootlibexecdir,
1967 install_dir : rootbindir)
1968 public_programs += exe
1971 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1972 meson.add_install_script(meson_make_symlink,
1973 join_paths(rootbindir, 'systemctl'),
1974 join_paths(rootsbindir, alias))
1977 if conf.get('ENABLE_BACKLIGHT') == 1
1978 executable('systemd-backlight',
1979 'src/backlight/backlight.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 install_rpath : rootlibexecdir,
1984 install_dir : rootlibexecdir)
1987 if conf.get('ENABLE_RFKILL') == 1
1988 executable('systemd-rfkill',
1989 'src/rfkill/rfkill.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootlibexecdir)
1997 executable('systemd-system-update-generator',
1998 'src/system-update-generator/system-update-generator.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 install_rpath : rootlibexecdir,
2003 install_dir : systemgeneratordir)
2005 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2006 executable('systemd-cryptsetup',
2007 'src/cryptsetup/cryptsetup.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 dependencies : [libcryptsetup],
2011 install_rpath : rootlibexecdir,
2013 install_dir : rootlibexecdir)
2015 executable('systemd-cryptsetup-generator',
2016 'src/cryptsetup/cryptsetup-generator.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : [libcryptsetup],
2020 install_rpath : rootlibexecdir,
2022 install_dir : systemgeneratordir)
2024 executable('systemd-veritysetup',
2025 'src/veritysetup/veritysetup.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [libcryptsetup],
2029 install_rpath : rootlibexecdir,
2031 install_dir : rootlibexecdir)
2033 executable('systemd-veritysetup-generator',
2034 'src/veritysetup/veritysetup-generator.c',
2035 include_directories : includes,
2036 link_with : [libshared],
2037 dependencies : [libcryptsetup],
2038 install_rpath : rootlibexecdir,
2040 install_dir : systemgeneratordir)
2043 if conf.get('HAVE_SYSV_COMPAT') == 1
2044 executable('systemd-sysv-generator',
2045 'src/sysv-generator/sysv-generator.c',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2050 install_dir : systemgeneratordir)
2052 executable('systemd-rc-local-generator',
2053 'src/rc-local-generator/rc-local-generator.c',
2054 include_directories : includes,
2055 link_with : [libshared],
2056 install_rpath : rootlibexecdir,
2058 install_dir : systemgeneratordir)
2061 if conf.get('ENABLE_HOSTNAMED') == 1
2062 executable('systemd-hostnamed',
2063 'src/hostname/hostnamed.c',
2064 include_directories : includes,
2065 link_with : [libshared],
2066 install_rpath : rootlibexecdir,
2068 install_dir : rootlibexecdir)
2070 exe = executable('hostnamectl',
2071 'src/hostname/hostnamectl.c',
2072 include_directories : includes,
2073 link_with : [libshared],
2074 install_rpath : rootlibexecdir,
2076 public_programs += exe
2079 if conf.get('ENABLE_LOCALED') == 1
2080 if conf.get('HAVE_XKBCOMMON') == 1
2081 # logind will load libxkbcommon.so dynamically on its own
2087 executable('systemd-localed',
2088 systemd_localed_sources,
2089 include_directories : includes,
2090 link_with : [libshared],
2091 dependencies : deps,
2092 install_rpath : rootlibexecdir,
2094 install_dir : rootlibexecdir)
2096 exe = executable('localectl',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2102 public_programs += exe
2105 if conf.get('ENABLE_TIMEDATED') == 1
2106 executable('systemd-timedated',
2107 'src/timedate/timedated.c',
2108 include_directories : includes,
2109 link_with : [libshared],
2110 install_rpath : rootlibexecdir,
2112 install_dir : rootlibexecdir)
2115 if conf.get('ENABLE_TIMEDATECTL') == 1
2116 exe = executable('timedatectl',
2117 'src/timedate/timedatectl.c',
2118 include_directories : includes,
2119 install_rpath : rootlibexecdir,
2120 link_with : [libshared],
2121 dependencies : [libm],
2123 public_programs += exe
2126 if conf.get('ENABLE_TIMESYNCD') == 1
2127 executable('systemd-timesyncd',
2128 systemd_timesyncd_sources,
2129 include_directories : includes,
2130 link_with : [libshared],
2131 dependencies : [threads,
2133 install_rpath : rootlibexecdir,
2135 install_dir : rootlibexecdir)
2137 executable('systemd-time-wait-sync',
2138 'src/time-wait-sync/time-wait-sync.c',
2139 include_directories : includes,
2140 link_with : [libshared],
2141 install_rpath : rootlibexecdir,
2143 install_dir : rootlibexecdir)
2146 if conf.get('ENABLE_MACHINED') == 1
2147 executable('systemd-machined',
2148 systemd_machined_sources,
2149 include_directories : includes,
2150 link_with : [libmachine_core,
2152 install_rpath : rootlibexecdir,
2154 install_dir : rootlibexecdir)
2156 exe = executable('machinectl',
2157 'src/machine/machinectl.c',
2158 include_directories : includes,
2159 link_with : [libshared],
2160 dependencies : [threads,
2163 install_rpath : rootlibexecdir,
2165 install_dir : rootbindir)
2166 public_programs += exe
2169 if conf.get('ENABLE_IMPORTD') == 1
2170 executable('systemd-importd',
2171 systemd_importd_sources,
2172 include_directories : includes,
2173 link_with : [libshared],
2174 dependencies : [threads],
2175 install_rpath : rootlibexecdir,
2177 install_dir : rootlibexecdir)
2179 systemd_pull = executable('systemd-pull',
2180 systemd_pull_sources,
2181 include_directories : includes,
2182 link_with : [libshared],
2183 dependencies : [libcurl,
2188 install_rpath : rootlibexecdir,
2190 install_dir : rootlibexecdir)
2192 systemd_import = executable('systemd-import',
2193 systemd_import_sources,
2194 include_directories : includes,
2195 link_with : [libshared],
2196 dependencies : [libcurl,
2200 install_rpath : rootlibexecdir,
2202 install_dir : rootlibexecdir)
2204 systemd_import_fs = executable('systemd-import-fs',
2205 systemd_import_fs_sources,
2206 include_directories : includes,
2207 link_with : [libshared],
2208 install_rpath : rootlibexecdir,
2210 install_dir : rootlibexecdir)
2212 systemd_export = executable('systemd-export',
2213 systemd_export_sources,
2214 include_directories : includes,
2215 link_with : [libshared],
2216 dependencies : [libcurl,
2220 install_rpath : rootlibexecdir,
2222 install_dir : rootlibexecdir)
2224 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2227 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2228 exe = executable('systemd-journal-upload',
2229 systemd_journal_upload_sources,
2230 include_directories : includes,
2231 link_with : [libshared],
2232 dependencies : [threads,
2237 install_rpath : rootlibexecdir,
2239 install_dir : rootlibexecdir)
2240 public_programs += exe
2243 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2244 s_j_remote = executable('systemd-journal-remote',
2245 systemd_journal_remote_sources,
2246 include_directories : includes,
2247 link_with : [libshared,
2248 libsystemd_journal_remote],
2249 dependencies : [threads,
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootlibexecdir)
2258 s_j_gatewayd = executable('systemd-journal-gatewayd',
2259 systemd_journal_gatewayd_sources,
2260 include_directories : includes,
2261 link_with : [libshared],
2262 dependencies : [threads,
2267 install_rpath : rootlibexecdir,
2269 install_dir : rootlibexecdir)
2270 public_programs += [s_j_remote, s_j_gatewayd]
2273 if conf.get('ENABLE_COREDUMP') == 1
2274 executable('systemd-coredump',
2275 systemd_coredump_sources,
2276 include_directories : includes,
2277 link_with : [libshared],
2278 dependencies : [threads,
2283 install_rpath : rootlibexecdir,
2285 install_dir : rootlibexecdir)
2287 exe = executable('coredumpctl',
2288 coredumpctl_sources,
2289 include_directories : includes,
2290 link_with : [libshared],
2291 dependencies : [threads,
2294 install_rpath : rootlibexecdir,
2296 public_programs += exe
2299 if conf.get('ENABLE_BINFMT') == 1
2300 exe = executable('systemd-binfmt',
2301 'src/binfmt/binfmt.c',
2302 include_directories : includes,
2303 link_with : [libshared],
2304 install_rpath : rootlibexecdir,
2306 install_dir : rootlibexecdir)
2307 public_programs += exe
2309 meson.add_install_script('sh', '-c',
2310 mkdir_p.format(binfmtdir))
2311 meson.add_install_script('sh', '-c',
2312 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2315 if conf.get('ENABLE_VCONSOLE') == 1
2316 executable('systemd-vconsole-setup',
2317 'src/vconsole/vconsole-setup.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 install_rpath : rootlibexecdir,
2322 install_dir : rootlibexecdir)
2325 if conf.get('ENABLE_RANDOMSEED') == 1
2326 executable('systemd-random-seed',
2327 'src/random-seed/random-seed.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2332 install_dir : rootlibexecdir)
2335 if conf.get('ENABLE_FIRSTBOOT') == 1
2336 executable('systemd-firstboot',
2337 'src/firstboot/firstboot.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 dependencies : [libcrypt],
2341 install_rpath : rootlibexecdir,
2343 install_dir : rootbindir)
2346 executable('systemd-remount-fs',
2347 'src/remount-fs/remount-fs.c',
2348 'src/core/mount-setup.c',
2349 'src/core/mount-setup.h',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 install_rpath : rootlibexecdir,
2354 install_dir : rootlibexecdir)
2356 executable('systemd-machine-id-setup',
2357 'src/machine-id-setup/machine-id-setup-main.c',
2358 'src/core/machine-id-setup.c',
2359 'src/core/machine-id-setup.h',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootbindir)
2366 executable('systemd-fsck',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2372 install_dir : rootlibexecdir)
2374 executable('systemd-growfs',
2375 'src/partition/growfs.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 dependencies : [libcryptsetup],
2379 install_rpath : rootlibexecdir,
2381 install_dir : rootlibexecdir)
2383 executable('systemd-makefs',
2384 'src/partition/makefs.c',
2385 include_directories : includes,
2386 link_with : [libshared],
2387 install_rpath : rootlibexecdir,
2389 install_dir : rootlibexecdir)
2391 executable('systemd-sleep',
2392 'src/sleep/sleep.c',
2393 include_directories : includes,
2394 link_with : [libshared],
2395 install_rpath : rootlibexecdir,
2397 install_dir : rootlibexecdir)
2399 install_data('src/sleep/sleep.conf',
2400 install_dir : pkgsysconfdir)
2402 exe = executable('systemd-sysctl',
2403 'src/sysctl/sysctl.c',
2404 include_directories : includes,
2405 link_with : [libshared],
2406 install_rpath : rootlibexecdir,
2408 install_dir : rootlibexecdir)
2409 public_programs += exe
2411 executable('systemd-ac-power',
2412 'src/ac-power/ac-power.c',
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2417 install_dir : rootlibexecdir)
2419 exe = executable('systemd-detect-virt',
2420 'src/detect-virt/detect-virt.c',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 install_rpath : rootlibexecdir,
2425 public_programs += exe
2427 exe = executable('systemd-delta',
2428 'src/delta/delta.c',
2429 include_directories : includes,
2430 link_with : [libshared],
2431 install_rpath : rootlibexecdir,
2433 public_programs += exe
2435 exe = executable('systemd-escape',
2436 'src/escape/escape.c',
2437 include_directories : includes,
2438 link_with : [libshared],
2439 install_rpath : rootlibexecdir,
2441 install_dir : rootbindir)
2442 public_programs += exe
2444 exe = executable('systemd-notify',
2445 'src/notify/notify.c',
2446 include_directories : includes,
2447 link_with : [libshared],
2448 install_rpath : rootlibexecdir,
2450 install_dir : rootbindir)
2451 public_programs += exe
2453 executable('systemd-volatile-root',
2454 'src/volatile-root/volatile-root.c',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2459 install_dir : rootlibexecdir)
2461 executable('systemd-cgroups-agent',
2462 'src/cgroups-agent/cgroups-agent.c',
2463 include_directories : includes,
2464 link_with : [libshared],
2465 install_rpath : rootlibexecdir,
2467 install_dir : rootlibexecdir)
2469 exe = executable('systemd-id128',
2470 'src/id128/id128.c',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2475 public_programs += exe
2477 exe = executable('systemd-path',
2479 include_directories : includes,
2480 link_with : [libshared],
2481 install_rpath : rootlibexecdir,
2483 public_programs += exe
2485 exe = executable('systemd-ask-password',
2486 'src/ask-password/ask-password.c',
2487 include_directories : includes,
2488 link_with : [libshared],
2489 install_rpath : rootlibexecdir,
2491 install_dir : rootbindir)
2492 public_programs += exe
2494 executable('systemd-reply-password',
2495 'src/reply-password/reply-password.c',
2496 include_directories : includes,
2497 link_with : [libshared],
2498 install_rpath : rootlibexecdir,
2500 install_dir : rootlibexecdir)
2502 exe = executable('systemd-tty-ask-password-agent',
2503 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2504 include_directories : includes,
2505 link_with : [libshared],
2506 install_rpath : rootlibexecdir,
2508 install_dir : rootbindir)
2509 public_programs += exe
2511 exe = executable('systemd-cgls',
2513 include_directories : includes,
2514 link_with : [libshared],
2515 install_rpath : rootlibexecdir,
2517 public_programs += exe
2519 exe = executable('systemd-cgtop',
2520 'src/cgtop/cgtop.c',
2521 include_directories : includes,
2522 link_with : [libshared],
2523 install_rpath : rootlibexecdir,
2525 public_programs += exe
2527 executable('systemd-initctl',
2528 'src/initctl/initctl.c',
2529 include_directories : includes,
2530 link_with : [libshared],
2531 install_rpath : rootlibexecdir,
2533 install_dir : rootlibexecdir)
2535 exe = executable('systemd-mount',
2536 'src/mount/mount-tool.c',
2537 include_directories : includes,
2538 link_with : [libshared],
2539 install_rpath : rootlibexecdir,
2541 public_programs += exe
2543 meson.add_install_script(meson_make_symlink,
2544 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2546 exe = executable('systemd-run',
2548 include_directories : includes,
2549 link_with : [libshared],
2550 install_rpath : rootlibexecdir,
2552 public_programs += exe
2554 exe = executable('systemd-stdio-bridge',
2555 'src/stdio-bridge/stdio-bridge.c',
2556 include_directories : includes,
2557 link_with : [libshared],
2558 install_rpath : rootlibexecdir,
2560 public_programs += exe
2562 exe = executable('busctl',
2563 'src/busctl/busctl.c',
2564 'src/busctl/busctl-introspect.c',
2565 'src/busctl/busctl-introspect.h',
2566 include_directories : includes,
2567 link_with : [libshared],
2568 install_rpath : rootlibexecdir,
2570 public_programs += exe
2572 if conf.get('ENABLE_SYSUSERS') == 1
2573 exe = executable('systemd-sysusers',
2574 'src/sysusers/sysusers.c',
2575 include_directories : includes,
2576 link_with : [libshared],
2577 install_rpath : rootlibexecdir,
2579 install_dir : rootbindir)
2580 public_programs += exe
2583 if conf.get('ENABLE_TMPFILES') == 1
2584 exe = executable('systemd-tmpfiles',
2585 'src/tmpfiles/tmpfiles.c',
2586 include_directories : includes,
2587 link_with : [libshared],
2588 dependencies : [libacl],
2589 install_rpath : rootlibexecdir,
2591 install_dir : rootbindir)
2592 public_programs += exe
2594 if want_tests != 'false'
2595 test('test-systemd-tmpfiles',
2596 test_systemd_tmpfiles_py,
2597 # https://github.com/mesonbuild/meson/issues/2681
2598 args : exe.full_path())
2602 if conf.get('ENABLE_HWDB') == 1
2603 exe = executable('systemd-hwdb',
2605 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2606 include_directories : includes,
2607 link_with : [libudev_static],
2608 install_rpath : udev_rpath,
2610 install_dir : rootbindir)
2611 public_programs += exe
2614 if conf.get('ENABLE_QUOTACHECK') == 1
2615 executable('systemd-quotacheck',
2616 'src/quotacheck/quotacheck.c',
2617 include_directories : includes,
2618 link_with : [libshared],
2619 install_rpath : rootlibexecdir,
2621 install_dir : rootlibexecdir)
2624 exe = executable('systemd-socket-proxyd',
2625 'src/socket-proxy/socket-proxyd.c',
2626 include_directories : includes,
2627 link_with : [libshared],
2628 dependencies : [threads],
2629 install_rpath : rootlibexecdir,
2631 install_dir : rootlibexecdir)
2632 public_programs += exe
2634 exe = executable('systemd-udevd',
2635 systemd_udevd_sources,
2636 include_directories : includes,
2637 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2638 link_with : [libudev_core,
2641 dependencies : [threads,
2646 install_rpath : udev_rpath,
2648 install_dir : rootlibexecdir)
2649 public_programs += exe
2651 exe = executable('udevadm',
2653 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2654 include_directories : includes,
2655 link_with : [libudev_core,
2658 dependencies : [threads,
2663 install_rpath : udev_rpath,
2665 install_dir : rootbindir)
2666 public_programs += exe
2668 executable('systemd-shutdown',
2669 systemd_shutdown_sources,
2670 include_directories : includes,
2671 link_with : [libshared],
2672 dependencies : [libmount],
2673 install_rpath : rootlibexecdir,
2675 install_dir : rootlibexecdir)
2677 executable('systemd-update-done',
2678 'src/update-done/update-done.c',
2679 include_directories : includes,
2680 link_with : [libshared],
2681 install_rpath : rootlibexecdir,
2683 install_dir : rootlibexecdir)
2685 executable('systemd-update-utmp',
2686 'src/update-utmp/update-utmp.c',
2687 include_directories : includes,
2688 link_with : [libshared],
2689 dependencies : [libaudit],
2690 install_rpath : rootlibexecdir,
2692 install_dir : rootlibexecdir)
2694 if conf.get('HAVE_KMOD') == 1
2695 executable('systemd-modules-load',
2696 'src/modules-load/modules-load.c',
2697 include_directories : includes,
2698 link_with : [libshared],
2699 dependencies : [libkmod],
2700 install_rpath : rootlibexecdir,
2702 install_dir : rootlibexecdir)
2704 meson.add_install_script('sh', '-c',
2705 mkdir_p.format(modulesloaddir))
2706 meson.add_install_script('sh', '-c',
2707 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2710 exe = executable('systemd-nspawn',
2711 systemd_nspawn_sources,
2712 'src/core/mount-setup.c', # FIXME: use a variable?
2713 'src/core/mount-setup.h',
2714 'src/core/loopback-setup.c',
2715 'src/core/loopback-setup.h',
2716 include_directories : includes,
2717 link_with : [libnspawn_core,
2719 dependencies : [libblkid],
2720 install_rpath : rootlibexecdir,
2722 public_programs += exe
2724 if conf.get('ENABLE_NETWORKD') == 1
2725 executable('systemd-networkd',
2726 systemd_networkd_sources,
2727 include_directories : includes,
2728 link_with : [libnetworkd_core,
2732 dependencies : [threads],
2733 install_rpath : rootlibexecdir,
2735 install_dir : rootlibexecdir)
2737 executable('systemd-networkd-wait-online',
2738 systemd_networkd_wait_online_sources,
2739 include_directories : includes,
2740 link_with : [libnetworkd_core,
2742 install_rpath : rootlibexecdir,
2744 install_dir : rootlibexecdir)
2746 exe = executable('networkctl',
2748 include_directories : includes,
2749 link_with : [libsystemd_network,
2751 install_rpath : rootlibexecdir,
2753 install_dir : rootbindir)
2754 public_programs += exe
2757 executable('systemd-sulogin-shell',
2758 ['src/sulogin-shell/sulogin-shell.c'],
2759 include_directories : includes,
2760 link_with : [libshared],
2761 install_rpath : rootlibexecdir,
2763 install_dir : rootlibexecdir)
2765 ############################################################
2768 'systemd-runtest.env',
2769 output : 'systemd-runtest.env',
2770 command : ['sh', '-c', '{ ' +
2771 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2772 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2774 build_by_default : true)
2776 foreach tuple : tests
2778 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2779 dependencies = tuple[2]
2780 condition = tuple.length() >= 4 ? tuple[3] : ''
2781 type = tuple.length() >= 5 ? tuple[4] : ''
2782 defs = tuple.length() >= 6 ? tuple[5] : []
2783 incs = tuple.length() >= 7 ? tuple[6] : includes
2786 name = sources[0].split('/')[-1].split('.')[0]
2787 if type.startswith('timeout=')
2788 timeout = type.split('=')[1].to_int()
2792 if condition == '' or conf.get(condition) == 1
2796 include_directories : incs,
2797 link_with : link_with,
2798 dependencies : dependencies,
2800 build_by_default : want_tests != 'false',
2801 install_rpath : rootlibexecdir,
2802 install : install_tests,
2803 install_dir : join_paths(testsdir, type))
2806 message('@0@ is a manual test'.format(name))
2807 elif type == 'unsafe' and want_tests != 'unsafe'
2808 message('@0@ is an unsafe test'.format(name))
2809 elif want_tests != 'false'
2815 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2820 'test-libsystemd-sym',
2821 test_libsystemd_sym_c,
2822 include_directories : includes,
2823 link_with : [libsystemd],
2824 build_by_default : want_tests != 'false',
2825 install : install_tests,
2826 install_dir : testsdir)
2827 if want_tests != 'false'
2828 test('test-libsystemd-sym', exe)
2832 'test-libsystemd-static-sym',
2833 test_libsystemd_sym_c,
2834 include_directories : includes,
2835 link_with : [install_libsystemd_static],
2836 dependencies : [threads], # threads is already included in dependencies on the library,
2837 # but does not seem to get propagated. Add here as a work-around.
2838 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2839 install : install_tests and static_libsystemd_pic,
2840 install_dir : testsdir)
2841 if want_tests != 'false' and static_libsystemd_pic
2842 test('test-libsystemd-static-sym', exe)
2848 include_directories : includes,
2849 c_args : '-Wno-deprecated-declarations',
2850 link_with : [libudev],
2851 build_by_default : want_tests != 'false',
2852 install : install_tests,
2853 install_dir : testsdir)
2854 if want_tests != 'false'
2855 test('test-libudev-sym', exe)
2859 'test-libudev-static-sym',
2861 include_directories : includes,
2862 c_args : '-Wno-deprecated-declarations',
2863 link_with : [install_libudev_static],
2864 build_by_default : want_tests != 'false' and static_libudev_pic,
2865 install : install_tests and static_libudev_pic,
2866 install_dir : testsdir)
2867 if want_tests != 'false' and static_libudev_pic
2868 test('test-libudev-static-sym', exe)
2871 ############################################################
2875 if get_option('tests') != 'false'
2876 foreach tuple : fuzzers
2878 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2879 dependencies = tuple[2]
2880 defs = tuple.length() >= 4 ? tuple[3] : []
2881 incs = tuple.length() >= 5 ? tuple[4] : includes
2884 dependencies += fuzzing_engine
2886 sources += 'src/fuzz/fuzz-main.c'
2889 name = sources[0].split('/')[-1].split('.')[0]
2891 fuzzer_exes += executable(
2894 include_directories : [incs, include_directories('src/fuzz')],
2895 link_with : link_with,
2896 dependencies : dependencies,
2902 run_target('fuzzers',
2903 depends : fuzzer_exes,
2906 ############################################################
2908 make_directive_index_py = find_program('tools/make-directive-index.py')
2909 make_man_index_py = find_program('tools/make-man-index.py')
2910 xml_helper_py = find_program('tools/xml_helper.py')
2911 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2915 subdir('sysusers.d')
2916 subdir('tmpfiles.d')
2921 subdir('shell-completion/bash')
2922 subdir('shell-completion/zsh')
2923 subdir('docs/sysvinit')
2924 subdir('docs/var-log')
2926 install_subdir('factory/etc',
2927 install_dir : factorydir)
2929 install_data('xorg/50-systemd-user.sh',
2930 install_dir : xinitrcdir)
2931 install_data('modprobe.d/systemd.conf',
2932 install_dir : modprobedir)
2933 install_data('LICENSE.GPL2',
2937 'docs/CODING_STYLE.md',
2938 'docs/DISTRO_PORTING.md',
2939 'docs/ENVIRONMENT.md',
2941 'docs/TRANSIENT-SETTINGS.md',
2942 'docs/TRANSLATORS.md',
2943 'docs/UIDS-GIDS.md',
2944 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2945 install_dir : docdir)
2947 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2948 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2950 ############################################################
2952 meson_check_help = find_program('tools/meson-check-help.sh')
2954 foreach exec : public_programs
2955 name = exec.full_path().split('/')[-1]
2956 if want_tests != 'false'
2957 test('check-help-' + name,
2959 args : exec.full_path())
2963 ############################################################
2965 # Enable tests for all supported sanitizers
2966 foreach tuple : sanitizers
2967 sanitizer = tuple[0]
2970 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2972 foreach p : fuzz_regression_tests
2973 b = p.split('/')[-2]
2974 c = p.split('/')[-1]
2976 name = '@0@:@1@'.format(b, sanitizer)
2979 if want_tests == 'false'
2980 message('Not compiling @0@ because tests is set to false'.format(name))
2982 exe = custom_target(
2986 command : [env, 'ln', '-fs',
2987 join_paths(build.full_path(), b),
2989 build_by_default : true)
2991 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2996 if want_tests != 'false' and slow_tests
2997 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2999 args : [exe.full_path(),
3000 join_paths(meson.source_root(), p)])
3007 ############################################################
3010 all_files = run_command(
3012 ['--git-dir=@0@/.git'.format(meson.source_root()),
3015 all_files = files(all_files.stdout().split())
3020 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3023 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3027 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3030 command : [meson_git_contrib_sh])
3034 git_head = run_command(
3036 ['--git-dir=@0@/.git'.format(meson.source_root()),
3037 'rev-parse', 'HEAD']).stdout().strip()
3038 git_head_short = run_command(
3040 ['--git-dir=@0@/.git'.format(meson.source_root()),
3041 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3045 command : ['git', 'archive',
3046 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3048 '--prefix', 'systemd-@0@/'.format(git_head),
3052 ############################################################
3054 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3057 depends : [man, libsystemd, libudev],
3058 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3060 ############################################################
3063 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3065 'split /usr: @0@'.format(split_usr),
3066 'split bin-sbin: @0@'.format(split_bin),
3067 'prefix directory: @0@'.format(prefixdir),
3068 'rootprefix directory: @0@'.format(rootprefixdir),
3069 'sysconf directory: @0@'.format(sysconfdir),
3070 'include directory: @0@'.format(includedir),
3071 'lib directory: @0@'.format(libdir),
3072 'rootlib directory: @0@'.format(rootlibdir),
3073 'SysV init scripts: @0@'.format(sysvinit_path),
3074 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3075 'PAM modules directory: @0@'.format(pamlibdir),
3076 'PAM configuration directory: @0@'.format(pamconfdir),
3077 'RPM macros directory: @0@'.format(rpmmacrosdir),
3078 'modprobe.d directory: @0@'.format(modprobedir),
3079 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3080 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3081 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3082 'bash completions directory: @0@'.format(bashcompletiondir),
3083 'zsh completions directory: @0@'.format(zshcompletiondir),
3084 'extra start script: @0@'.format(get_option('rc-local')),
3085 'extra stop script: @0@'.format(get_option('halt-local')),
3086 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3087 get_option('debug-tty')),
3088 'TTY GID: @0@'.format(tty_gid),
3089 'users GID: @0@'.format(substs.get('USERS_GID')),
3090 'maximum system UID: @0@'.format(system_uid_max),
3091 'maximum system GID: @0@'.format(system_gid_max),
3092 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3093 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3094 'minimum container UID base: @0@'.format(container_uid_base_min),
3095 'maximum container UID base: @0@'.format(container_uid_base_max),
3096 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3097 'render group access mode: @0@'.format(get_option('group-render-mode')),
3098 'certificate root directory: @0@'.format(get_option('certificate-root')),
3099 'support URL: @0@'.format(support_url),
3100 'nobody user name: @0@'.format(nobody_user),
3101 'nobody group name: @0@'.format(nobody_group),
3102 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3103 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3105 'default DNSSEC mode: @0@'.format(default_dnssec),
3106 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3107 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3108 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3109 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3110 'default locale: @0@'.format(default_locale)]
3112 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3113 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3115 'default DNS servers: @0@'.format(alt_dns_servers),
3116 'default NTP servers: @0@'.format(alt_ntp_servers)]
3118 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3119 '@@0@'.format(time_epoch)).stdout().strip()
3121 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3124 'static libsystemd: @0@'.format(static_libsystemd),
3125 'static libudev: @0@'.format(static_libudev)]
3128 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3129 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3130 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3132 if conf.get('ENABLE_EFI') == 1
3133 status += 'efi arch: @0@'.format(efi_arch)
3137 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3138 'EFI CC @0@'.format(' '.join(efi_cc)),
3139 'EFI lib directory: @0@'.format(efi_libdir),
3140 'EFI lds directory: @0@'.format(efi_ldsdir),
3141 'EFI include directory: @0@'.format(efi_incdir)]
3193 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3194 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3197 ['legacy pkla', install_polkit_pkla],
3199 ['gnu-efi', have_gnu_efi],
3212 ['man pages', want_man],
3213 ['html pages', want_html],
3214 ['man page indices', want_man and have_lxml],
3219 ['adm group', get_option('adm-group')],
3220 ['wheel group', get_option('wheel-group')],
3223 ['debug mmap cache'],
3226 ['valgrind', conf.get('VALGRIND') == 1],
3227 ['trace logging', conf.get('LOG_TRACE') == 1],
3228 ['link-udev-shared', get_option('link-udev-shared')],
3229 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3232 if tuple.length() >= 2
3235 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3236 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3237 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3248 'enabled features: @0@'.format(', '.join(found)),
3250 'disabled features: @0@'.format(', '.join(missing)),
3252 message('\n '.join(status))
3254 if rootprefixdir != rootprefix_default
3256 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3257 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3258 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))