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 # This is to be used instead of meson.source_root(), as the latter will return
30 # the wrong result when systemd is being built as a meson subproject
31 project_source_root = meson.current_source_dir()
33 want_ossfuzz = get_option('oss-fuzz')
34 want_libfuzzer = get_option('llvm-fuzz')
35 if want_ossfuzz and want_libfuzzer
36 error('only one of oss-fuzz and llvm-fuzz can be specified')
38 fuzzer_build = want_ossfuzz or want_libfuzzer
40 #####################################################################
42 # Try to install the git pre-commit hook
43 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
44 if git_hook.returncode() == 0
45 message(git_hook.stdout().strip())
48 #####################################################################
50 if get_option('split-usr') == 'auto'
51 split_usr = run_command('test', '-L', '/bin').returncode() != 0
53 split_usr = get_option('split-usr') == 'true'
55 conf.set10('HAVE_SPLIT_USR', split_usr,
56 description : '/usr/bin and /bin directories are separate')
58 if get_option('split-bin') == 'auto'
59 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
61 split_bin = get_option('split-bin') == 'true'
63 conf.set10('HAVE_SPLIT_BIN', split_bin,
64 description : 'bin and sbin directories are separate')
66 rootprefixdir = get_option('rootprefix')
67 # Unusual rootprefixdir values are used by some distros
68 # (see https://github.com/systemd/systemd/pull/7461).
69 rootprefix_default = split_usr ? '/' : '/usr'
70 if rootprefixdir == ''
71 rootprefixdir = rootprefix_default
73 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
75 sysvinit_path = get_option('sysvinit-path')
76 sysvrcnd_path = get_option('sysvrcnd-path')
77 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
78 description : 'SysV init scripts and rcN.d links are supported')
80 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
81 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
82 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
84 # join_paths ignores the preceding arguments if an absolute component is
85 # encountered, so this should canonicalize various paths when they are
86 # absolute or relative.
87 prefixdir = get_option('prefix')
88 if not prefixdir.startswith('/')
89 error('Prefix is not absolute: "@0@"'.format(prefixdir))
91 bindir = join_paths(prefixdir, get_option('bindir'))
92 libdir = join_paths(prefixdir, get_option('libdir'))
93 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
94 includedir = join_paths(prefixdir, get_option('includedir'))
95 datadir = join_paths(prefixdir, get_option('datadir'))
96 localstatedir = join_paths('/', get_option('localstatedir'))
98 rootbindir = join_paths(rootprefixdir, 'bin')
99 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
100 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
102 rootlibdir = get_option('rootlibdir')
104 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
107 # Dirs of external packages
108 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
109 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
110 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
111 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
112 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
113 varlogdir = join_paths(localstatedir, 'log')
114 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
115 rpmmacrosdir = get_option('rpmmacrosdir')
116 if rpmmacrosdir != 'no'
117 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
119 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
122 pkgdatadir = join_paths(datadir, 'systemd')
123 environmentdir = join_paths(prefixdir, 'lib/environment.d')
124 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
125 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
126 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
127 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
128 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
129 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
130 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
131 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
132 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
133 pkgincludedir = join_paths(includedir, 'systemd')
134 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
135 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
136 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
137 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
138 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
139 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
140 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
141 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
142 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
143 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
144 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
145 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
146 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
147 factorydir = join_paths(datadir, 'factory')
148 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
149 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
150 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
151 catalogstatedir = join_paths(systemdstatedir, 'catalog')
152 randomseeddir = join_paths(localstatedir, 'lib/systemd')
153 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
155 docdir = get_option('docdir')
157 docdir = join_paths(datadir, 'doc/systemd')
160 dbuspolicydir = get_option('dbuspolicydir')
161 if dbuspolicydir == ''
162 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
165 dbussessionservicedir = get_option('dbussessionservicedir')
166 if dbussessionservicedir == ''
167 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
170 dbussystemservicedir = get_option('dbussystemservicedir')
171 if dbussystemservicedir == ''
172 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
175 pamlibdir = get_option('pamlibdir')
177 pamlibdir = join_paths(rootlibdir, 'security')
180 pamconfdir = get_option('pamconfdir')
182 pamconfdir = join_paths(sysconfdir, 'pam.d')
185 memory_accounting_default = get_option('memory-accounting-default')
187 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
188 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
189 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
190 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
191 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
192 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
193 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
195 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
197 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
198 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
199 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
200 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
201 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
202 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
203 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
204 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
205 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
206 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
207 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
208 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
209 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
210 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
211 conf.set_quoted('ROOTPREFIX', rootprefixdir)
212 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
213 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
214 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
215 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
216 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
217 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
218 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
219 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
220 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
221 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
222 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
223 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
224 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
225 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
226 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
227 conf.set_quoted('LIBDIR', libdir)
228 conf.set_quoted('ROOTLIBDIR', rootlibdir)
229 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
230 conf.set_quoted('BOOTLIBDIR', bootlibdir)
231 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
232 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
233 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
234 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
235 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
236 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
237 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
238 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
239 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
241 substs.set('prefix', prefixdir)
242 substs.set('rootprefix', rootprefixdir)
243 substs.set('rootprefix_noslash', rootprefixdir_noslash)
244 substs.set('exec_prefix', prefixdir)
245 substs.set('libdir', libdir)
246 substs.set('rootlibdir', rootlibdir)
247 substs.set('includedir', includedir)
248 substs.set('sysconfdir', sysconfdir)
249 substs.set('bindir', bindir)
250 substs.set('rootbindir', rootbindir)
251 substs.set('rootlibexecdir', rootlibexecdir)
252 substs.set('systemunitdir', systemunitdir)
253 substs.set('userunitdir', userunitdir)
254 substs.set('systempresetdir', systempresetdir)
255 substs.set('userpresetdir', userpresetdir)
256 substs.set('udevhwdbdir', udevhwdbdir)
257 substs.set('udevrulesdir', udevrulesdir)
258 substs.set('udevlibexecdir', udevlibexecdir)
259 substs.set('environmentdir', environmentdir)
260 substs.set('catalogdir', catalogdir)
261 substs.set('tmpfilesdir', tmpfilesdir)
262 substs.set('sysusersdir', sysusersdir)
263 substs.set('sysctldir', sysctldir)
264 substs.set('binfmtdir', binfmtdir)
265 substs.set('modulesloaddir', modulesloaddir)
266 substs.set('modprobedir', modprobedir)
267 substs.set('systemgeneratordir', systemgeneratordir)
268 substs.set('usergeneratordir', usergeneratordir)
269 substs.set('systemenvgeneratordir', systemenvgeneratordir)
270 substs.set('userenvgeneratordir', userenvgeneratordir)
271 substs.set('systemshutdowndir', systemshutdowndir)
272 substs.set('systemsleepdir', systemsleepdir)
273 substs.set('VARLOGDIR', varlogdir)
274 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
275 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
276 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
277 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
278 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
279 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
280 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
281 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
282 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
284 #####################################################################
286 cc = meson.get_compiler('c')
287 pkgconfig = import('pkgconfig')
288 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
289 meson_build_sh = find_program('tools/meson-build.sh')
291 want_tests = get_option('tests')
292 slow_tests = want_tests != 'false' and get_option('slow-tests')
293 install_tests = get_option('install-tests')
295 if add_languages('cpp', required : fuzzer_build)
296 # Used only for tests
297 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
303 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
305 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
308 possible_cc_flags = [
312 '-Wmissing-include-dirs',
313 '-Wold-style-definition',
317 '-Wsuggest-attribute=noreturn',
318 '-Werror=missing-prototypes',
319 '-Werror=implicit-function-declaration',
320 '-Werror=missing-declarations',
321 '-Werror=return-type',
322 '-Werror=incompatible-pointer-types',
324 '-Wstrict-prototypes',
326 '-Wmissing-noreturn',
327 '-Wimplicit-fallthrough=5',
330 '-Wstrict-aliasing=2',
333 '-Werror=shift-count-overflow',
334 '-Werror=shift-overflow=2',
338 # negative arguments are correctly detected starting with meson 0.46.
339 '-Wno-unused-parameter',
340 '-Wno-missing-field-initializers',
341 '-Wno-unused-result',
342 '-Wno-format-signedness',
343 '-Wno-error=#warnings', # clang
344 '-Wno-string-plus-int', # clang
346 # work-around for gcc 7.1 turning this on on its own.
347 '-Wno-error=nonnull',
349 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
350 # optimizations enabled, producing essentially false positives.
351 '-Wno-maybe-uninitialized',
355 '-fdiagnostics-show-option',
356 '-fno-strict-aliasing',
357 '-fvisibility=hidden',
359 '-fstack-protector-strong',
360 '--param=ssp-buffer-size=4',
363 # --as-needed and --no-undefined are provided by meson by default,
364 # run mesonconf to see what is enabled
365 possible_link_flags = [
370 if cc.get_id() == 'clang'
371 possible_cc_flags += [
372 '-Wno-typedef-redefinition',
373 '-Wno-gnu-variable-sized-type-not-at-end',
377 if get_option('buildtype') != 'debug'
378 possible_cc_flags += [
379 '-ffunction-sections',
383 possible_link_flags += '-Wl,--gc-sections'
386 if get_option('b_ndebug') == 'true'
387 # With asserts disabled with get a bunch of warnings about variables which
388 # are used only in the asserts. This is not useful at all, so let's just silence
390 possible_cc_flags += [
391 '-Wno-unused-variable',
392 '-Wno-unused-but-set-variable',
396 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
397 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
401 #include <inttypes.h>
402 typedef uint64_t usec_t;
403 usec_t now(clockid_t clock);
408 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
409 add_project_arguments('-Werror=shadow', language : 'c')
412 cpp = ' '.join(cc.cmd_array()) + ' -E'
414 #####################################################################
415 # compilation result tests
417 conf.set('_GNU_SOURCE', true)
418 conf.set('__SANE_USERSPACE_TYPES__', true)
420 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
421 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
422 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
423 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
424 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
425 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
426 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
430 #include <sys/stat.h>
433 foreach decl : ['char16_t',
438 # We get -1 if the size cannot be determined
439 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
441 if decl == 'struct statx'
443 want_linux_stat_h = false
445 have = cc.sizeof(decl,
446 prefix : decl_headers + '#include <linux/stat.h>',
447 args : '-D_GNU_SOURCE') > 0
448 want_linux_stat_h = have
452 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
455 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
457 foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
458 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
459 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
460 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
461 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
462 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
463 ['FRA_TUN_ID', 'linux/fib_rules.h'],
464 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
465 ['FRA_PAD', 'linux/fib_rules.h'],
466 ['FRA_L3MDEV', 'linux/fib_rules.h'],
467 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
468 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
469 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
470 ['FOU_CMD_GET', 'linux/fou.h'],
471 ['IFA_FLAGS', 'linux/if_addr.h'],
472 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
473 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
474 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
475 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
476 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
477 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
478 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
479 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
480 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
481 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
482 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
483 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
484 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
485 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
486 ['IFLA_PAD', 'linux/if_link.h'],
487 ['IFLA_XDP', 'linux/if_link.h'],
488 ['IFLA_EVENT', 'linux/if_link.h'],
489 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
490 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
491 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
492 ['IFLA_MAX_MTU', 'linux/if_link.h'],
493 ['IFLA_BOND_MODE', 'linux/if_link.h'],
494 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
495 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
496 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
497 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
498 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
499 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
500 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
501 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
502 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
503 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
504 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
505 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
506 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
507 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
508 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
509 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
510 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
511 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
512 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
513 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
514 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
515 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
516 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
517 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
518 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
519 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
520 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
521 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
522 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
523 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
524 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
525 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
526 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
527 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
528 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
529 # if_tunnel.h is buggy and cannot be included on its own
530 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
531 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
532 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
533 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
534 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
535 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
536 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
537 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
538 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
539 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
540 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
542 prefix = decl.length() > 2 ? decl[2] : ''
543 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
544 conf.set10('HAVE_' + decl[0], have)
547 foreach ident : ['secure_getenv', '__secure_getenv']
548 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
552 ['memfd_create', '''#include <sys/mman.h>'''],
553 ['gettid', '''#include <sys/types.h>
554 #include <unistd.h>'''],
555 ['pivot_root', '''#include <stdlib.h>
556 #include <unistd.h>'''], # no known header declares pivot_root
557 ['name_to_handle_at', '''#include <sys/types.h>
558 #include <sys/stat.h>
559 #include <fcntl.h>'''],
560 ['setns', '''#include <sched.h>'''],
561 ['renameat2', '''#include <stdio.h>
562 #include <fcntl.h>'''],
563 ['kcmp', '''#include <linux/kcmp.h>'''],
564 ['keyctl', '''#include <sys/types.h>
565 #include <keyutils.h>'''],
566 ['copy_file_range', '''#include <sys/syscall.h>
567 #include <unistd.h>'''],
568 ['bpf', '''#include <sys/syscall.h>
569 #include <unistd.h>'''],
570 ['statx', '''#include <sys/types.h>
571 #include <sys/stat.h>
572 #include <unistd.h>'''],
573 ['explicit_bzero' , '''#include <string.h>'''],
574 ['reallocarray', '''#include <malloc.h>'''],
577 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
578 conf.set10('HAVE_' + ident[0].to_upper(), have)
581 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
582 conf.set10('USE_SYS_RANDOM_H', true)
583 conf.set10('HAVE_GETRANDOM', true)
585 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
586 conf.set10('USE_SYS_RANDOM_H', false)
587 conf.set10('HAVE_GETRANDOM', have)
590 #####################################################################
592 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
594 get_option('version-tag'),
595 meson.project_version()]
598 input : 'src/version/version.h.in',
599 output : 'version.h',
602 versiondep = declare_dependency(sources: version_h)
604 sed = find_program('sed')
605 awk = find_program('awk')
606 m4 = find_program('m4')
607 stat = find_program('stat')
608 git = find_program('git', required : false)
609 env = find_program('env')
610 perl = find_program('perl', required : false)
612 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
613 mkdir_p = 'mkdir -p $DESTDIR/@0@'
614 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
615 splash_bmp = files('test/splash.bmp')
617 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
618 # /usr/sbin, /sbin, and fall back to the default from middle column.
619 progs = [['quotaon', '/usr/sbin/quotaon' ],
620 ['quotacheck', '/usr/sbin/quotacheck' ],
621 ['kmod', '/usr/bin/kmod' ],
622 ['kexec', '/usr/sbin/kexec' ],
623 ['sulogin', '/usr/sbin/sulogin' ],
624 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
625 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
626 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
627 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
630 path = get_option(prog[0] + '-path')
632 message('Using @1@ for @0@'.format(prog[0], path))
634 exe = find_program(prog[0],
635 '/usr/sbin/' + prog[0],
638 path = exe.found() ? exe.path() : prog[1]
640 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
641 conf.set_quoted(name, path)
642 substs.set(name, path)
645 conf.set_quoted('TELINIT', get_option('telinit-path'))
647 if run_command('ln', '--relative', '--help').returncode() != 0
648 error('ln does not support --relative (added in coreutils 8.16)')
651 ############################################################
653 gperf = find_program('gperf')
655 gperf_test_format = '''
657 const char * in_word_set(const char *, @0@);
660 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
661 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
662 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
663 if cc.compiles(gperf_test)
664 gperf_len_type = 'size_t'
666 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
667 if cc.compiles(gperf_test)
668 gperf_len_type = 'unsigned'
670 error('unable to determine gperf len type')
673 message('gperf len type is @0@'.format(gperf_len_type))
674 conf.set('GPERF_LEN_TYPE', gperf_len_type,
675 description : 'The type of gperf "len" parameter')
677 ############################################################
679 if not cc.has_header('sys/capability.h')
680 error('POSIX caps headers not found')
682 foreach header : ['crypt.h',
683 'linux/btrfs_tree.h',
686 'linux/vm_sockets.h',
689 'valgrind/memcheck.h',
690 'valgrind/valgrind.h',
693 conf.set10('HAVE_' + header.underscorify().to_upper(),
694 cc.has_header(header))
697 ############################################################
699 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
700 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
701 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
703 default_hierarchy = get_option('default-hierarchy')
704 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
705 description : 'default cgroup hierarchy as string')
706 if default_hierarchy == 'legacy'
707 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
708 elif default_hierarchy == 'hybrid'
709 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
711 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
714 default_net_naming_scheme = get_option('default-net-naming-scheme')
715 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
717 time_epoch = get_option('time-epoch')
720 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
722 conf.set('TIME_EPOCH', time_epoch)
724 system_uid_max = get_option('system-uid-max')
725 if system_uid_max == -1
726 system_uid_max = run_command(
728 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
729 '/etc/login.defs').stdout().strip()
730 if system_uid_max == ''
733 system_uid_max = system_uid_max.to_int()
736 conf.set('SYSTEM_UID_MAX', system_uid_max)
737 substs.set('systemuidmax', system_uid_max)
739 system_gid_max = get_option('system-gid-max')
740 if system_gid_max == -1
741 system_gid_max = run_command(
743 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
744 '/etc/login.defs').stdout().strip()
745 if system_gid_max == ''
748 system_gid_max = system_gid_max.to_int()
751 conf.set('SYSTEM_GID_MAX', system_gid_max)
752 substs.set('systemgidmax', system_gid_max)
754 dynamic_uid_min = get_option('dynamic-uid-min')
755 dynamic_uid_max = get_option('dynamic-uid-max')
756 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
757 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
758 substs.set('dynamicuidmin', dynamic_uid_min)
759 substs.set('dynamicuidmax', dynamic_uid_max)
761 container_uid_base_min = get_option('container-uid-base-min')
762 container_uid_base_max = get_option('container-uid-base-max')
763 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
764 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
765 substs.set('containeruidbasemin', container_uid_base_min)
766 substs.set('containeruidbasemax', container_uid_base_max)
768 nobody_user = get_option('nobody-user')
769 nobody_group = get_option('nobody-group')
771 if not meson.is_cross_build()
772 getent_result = run_command('getent', 'passwd', '65534')
773 if getent_result.returncode() == 0
774 name = getent_result.stdout().split(':')[0]
775 if name != nobody_user
777 '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) +
778 'Your build will result in an user table setup that is incompatible with the local system.')
781 id_result = run_command('id', '-u', nobody_user)
782 if id_result.returncode() == 0
783 id = id_result.stdout().to_int()
786 '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) +
787 'Your build will result in an user table setup that is incompatible with the local system.')
791 getent_result = run_command('getent', 'group', '65534')
792 if getent_result.returncode() == 0
793 name = getent_result.stdout().split(':')[0]
794 if name != nobody_group
796 '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) +
797 'Your build will result in an group table setup that is incompatible with the local system.')
800 id_result = run_command('id', '-g', nobody_group)
801 if id_result.returncode() == 0
802 id = id_result.stdout().to_int()
805 '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) +
806 'Your build will result in an group table setup that is incompatible with the local system.')
810 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
812 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
813 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
816 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
817 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
818 substs.set('NOBODY_USER_NAME', nobody_user)
819 substs.set('NOBODY_GROUP_NAME', nobody_group)
821 tty_gid = get_option('tty-gid')
822 conf.set('TTY_GID', tty_gid)
823 substs.set('TTY_GID', tty_gid)
825 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
826 users_gid = get_option('users-gid')
827 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
829 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
830 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
832 dev_kvm_mode = get_option('dev-kvm-mode')
833 substs.set('DEV_KVM_MODE', dev_kvm_mode)
834 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
835 group_render_mode = get_option('group-render-mode')
836 substs.set('GROUP_RENDER_MODE', group_render_mode)
837 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
839 kill_user_processes = get_option('default-kill-user-processes')
840 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
841 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
842 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
844 dns_servers = get_option('dns-servers')
845 conf.set_quoted('DNS_SERVERS', dns_servers)
846 substs.set('DNS_SERVERS', dns_servers)
848 ntp_servers = get_option('ntp-servers')
849 conf.set_quoted('NTP_SERVERS', ntp_servers)
850 substs.set('NTP_SERVERS', ntp_servers)
852 default_locale = get_option('default-locale')
853 if default_locale == ''
854 if not meson.is_cross_build()
855 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
856 default_locale = run_command(choose_default_locale_sh).stdout().strip()
858 default_locale = 'C.UTF-8'
861 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
863 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
865 substs.set('SUSHELL', get_option('debug-shell'))
866 substs.set('DEBUGTTY', get_option('debug-tty'))
868 enable_debug_hashmap = false
869 enable_debug_mmap_cache = false
870 enable_debug_siphash = false
871 enable_debug_udev = false
872 foreach name : get_option('debug-extra')
874 enable_debug_hashmap = true
875 elif name == 'mmap-cache'
876 enable_debug_mmap_cache = true
877 elif name == 'siphash'
878 enable_debug_siphash = true
880 enable_debug_udev = true
882 message('unknown debug option "@0@", ignoring'.format(name))
885 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
886 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
887 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
888 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
890 conf.set10('VALGRIND', get_option('valgrind'))
891 conf.set10('LOG_TRACE', get_option('log-trace'))
893 #####################################################################
895 threads = dependency('threads')
896 librt = cc.find_library('rt')
897 libm = cc.find_library('m')
898 libdl = cc.find_library('dl')
899 libcrypt = cc.find_library('crypt')
901 libcap = dependency('libcap', required : false)
902 if not libcap.found()
903 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
904 libcap = cc.find_library('cap')
907 libmount = dependency('mount',
908 version : fuzzer_build ? '>= 0' : '>= 2.30')
910 want_seccomp = get_option('seccomp')
911 if want_seccomp != 'false' and not fuzzer_build
912 libseccomp = dependency('libseccomp',
913 version : '>= 2.3.1',
914 required : want_seccomp == 'true')
915 have = libseccomp.found()
920 conf.set10('HAVE_SECCOMP', have)
922 want_selinux = get_option('selinux')
923 if want_selinux != 'false' and not fuzzer_build
924 libselinux = dependency('libselinux',
925 version : '>= 2.1.9',
926 required : want_selinux == 'true')
927 have = libselinux.found()
932 conf.set10('HAVE_SELINUX', have)
934 want_apparmor = get_option('apparmor')
935 if want_apparmor != 'false' and not fuzzer_build
936 libapparmor = dependency('libapparmor',
937 required : want_apparmor == 'true')
938 have = libapparmor.found()
943 conf.set10('HAVE_APPARMOR', have)
945 smack_run_label = get_option('smack-run-label')
946 if smack_run_label != ''
947 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
950 want_polkit = get_option('polkit')
951 install_polkit = false
952 install_polkit_pkla = false
953 if want_polkit != 'false' and not fuzzer_build
954 install_polkit = true
956 libpolkit = dependency('polkit-gobject-1',
958 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
959 message('Old polkit detected, will install pkla files')
960 install_polkit_pkla = true
963 conf.set10('ENABLE_POLKIT', install_polkit)
965 want_acl = get_option('acl')
966 if want_acl != 'false' and not fuzzer_build
967 libacl = cc.find_library('acl', required : want_acl == 'true')
968 have = libacl.found()
973 conf.set10('HAVE_ACL', have)
975 want_audit = get_option('audit')
976 if want_audit != 'false' and not fuzzer_build
977 libaudit = dependency('audit', required : want_audit == 'true')
978 have = libaudit.found()
983 conf.set10('HAVE_AUDIT', have)
985 want_blkid = get_option('blkid')
986 if want_blkid != 'false' and not fuzzer_build
987 libblkid = dependency('blkid', required : want_blkid == 'true')
988 have = libblkid.found()
993 conf.set10('HAVE_BLKID', have)
995 want_kmod = get_option('kmod')
996 if want_kmod != 'false' and not fuzzer_build
997 libkmod = dependency('libkmod',
999 required : want_kmod == 'true')
1000 have = libkmod.found()
1005 conf.set10('HAVE_KMOD', have)
1007 want_pam = get_option('pam')
1008 if want_pam != 'false' and not fuzzer_build
1009 libpam = cc.find_library('pam', required : want_pam == 'true')
1010 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1011 have = libpam.found() and libpam_misc.found()
1017 conf.set10('HAVE_PAM', have)
1019 want_microhttpd = get_option('microhttpd')
1020 if want_microhttpd != 'false' and not fuzzer_build
1021 libmicrohttpd = dependency('libmicrohttpd',
1022 version : '>= 0.9.33',
1023 required : want_microhttpd == 'true')
1024 have = libmicrohttpd.found()
1029 conf.set10('HAVE_MICROHTTPD', have)
1031 want_libcryptsetup = get_option('libcryptsetup')
1032 if want_libcryptsetup != 'false' and not fuzzer_build
1033 libcryptsetup = dependency('libcryptsetup',
1034 version : '>= 1.6.0',
1035 required : want_libcryptsetup == 'true')
1036 have = libcryptsetup.found()
1037 have_sector = cc.has_member(
1038 'struct crypt_params_plain',
1040 prefix : '#include <libcryptsetup.h>')
1046 conf.set10('HAVE_LIBCRYPTSETUP', have)
1047 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1049 want_libcurl = get_option('libcurl')
1050 if want_libcurl != 'false' and not fuzzer_build
1051 libcurl = dependency('libcurl',
1052 version : '>= 7.32.0',
1053 required : want_libcurl == 'true')
1054 have = libcurl.found()
1059 conf.set10('HAVE_LIBCURL', have)
1061 want_libidn = get_option('libidn')
1062 want_libidn2 = get_option('libidn2')
1063 if want_libidn == 'true' and want_libidn2 == 'true'
1064 error('libidn and libidn2 cannot be requested simultaneously')
1067 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1068 libidn = dependency('libidn',
1069 required : want_libidn == 'true')
1070 have = libidn.found()
1075 conf.set10('HAVE_LIBIDN', have)
1076 if not have and want_libidn2 != 'false' and not fuzzer_build
1077 # libidn is used for both libidn and libidn2 objects
1078 libidn = dependency('libidn2',
1079 required : want_libidn2 == 'true')
1080 have = libidn.found()
1084 conf.set10('HAVE_LIBIDN2', have)
1086 want_libiptc = get_option('libiptc')
1087 if want_libiptc != 'false' and not fuzzer_build
1088 libiptc = dependency('libiptc',
1089 required : want_libiptc == 'true')
1090 have = libiptc.found()
1095 conf.set10('HAVE_LIBIPTC', have)
1097 want_qrencode = get_option('qrencode')
1098 if want_qrencode != 'false' and not fuzzer_build
1099 libqrencode = dependency('libqrencode',
1100 required : want_qrencode == 'true')
1101 have = libqrencode.found()
1106 conf.set10('HAVE_QRENCODE', have)
1108 want_gcrypt = get_option('gcrypt')
1109 if want_gcrypt != 'false' and not fuzzer_build
1110 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1111 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1112 have = libgcrypt.found() and libgpg_error.found()
1117 # link to neither of the libs if one is not found
1121 conf.set10('HAVE_GCRYPT', have)
1123 want_gnutls = get_option('gnutls')
1124 if want_gnutls != 'false' and not fuzzer_build
1125 libgnutls = dependency('gnutls',
1126 version : '>= 3.1.4',
1127 required : want_gnutls == 'true')
1128 have = libgnutls.found()
1133 conf.set10('HAVE_GNUTLS', have)
1135 want_openssl = get_option('openssl')
1136 if want_openssl != 'false' and not fuzzer_build
1137 libopenssl = dependency('openssl',
1138 version : '>= 1.1.0',
1139 required : want_openssl == 'true')
1140 have = libopenssl.found()
1145 conf.set10('HAVE_OPENSSL', have)
1147 want_elfutils = get_option('elfutils')
1148 if want_elfutils != 'false' and not fuzzer_build
1149 libdw = dependency('libdw',
1150 required : want_elfutils == 'true')
1151 have = libdw.found()
1156 conf.set10('HAVE_ELFUTILS', have)
1158 want_zlib = get_option('zlib')
1159 if want_zlib != 'false' and not fuzzer_build
1160 libz = dependency('zlib',
1161 required : want_zlib == 'true')
1167 conf.set10('HAVE_ZLIB', have)
1169 want_bzip2 = get_option('bzip2')
1170 if want_bzip2 != 'false' and not fuzzer_build
1171 libbzip2 = cc.find_library('bz2',
1172 required : want_bzip2 == 'true')
1173 have = libbzip2.found()
1178 conf.set10('HAVE_BZIP2', have)
1180 want_xz = get_option('xz')
1181 if want_xz != 'false' and not fuzzer_build
1182 libxz = dependency('liblzma',
1183 required : want_xz == 'true')
1184 have = libxz.found()
1189 conf.set10('HAVE_XZ', have)
1191 want_lz4 = get_option('lz4')
1192 if want_lz4 != 'false' and not fuzzer_build
1193 liblz4 = dependency('liblz4',
1194 version : '>= 1.3.0',
1195 required : want_lz4 == 'true')
1196 have = liblz4.found()
1201 conf.set10('HAVE_LZ4', have)
1203 want_xkbcommon = get_option('xkbcommon')
1204 if want_xkbcommon != 'false' and not fuzzer_build
1205 libxkbcommon = dependency('xkbcommon',
1206 version : '>= 0.3.0',
1207 required : want_xkbcommon == 'true')
1208 have = libxkbcommon.found()
1213 conf.set10('HAVE_XKBCOMMON', have)
1215 want_pcre2 = get_option('pcre2')
1216 if want_pcre2 != 'false'
1217 libpcre2 = dependency('libpcre2-8',
1218 required : want_pcre2 == 'true')
1219 have = libpcre2.found()
1224 conf.set10('HAVE_PCRE2', have)
1226 want_glib = get_option('glib')
1227 if want_glib != 'false' and not fuzzer_build
1228 libglib = dependency('glib-2.0',
1229 version : '>= 2.22.0',
1230 required : want_glib == 'true')
1231 libgobject = dependency('gobject-2.0',
1232 version : '>= 2.22.0',
1233 required : want_glib == 'true')
1234 libgio = dependency('gio-2.0',
1235 required : want_glib == 'true')
1236 have = libglib.found() and libgobject.found() and libgio.found()
1243 conf.set10('HAVE_GLIB', have)
1245 want_dbus = get_option('dbus')
1246 if want_dbus != 'false' and not fuzzer_build
1247 libdbus = dependency('dbus-1',
1248 version : '>= 1.3.2',
1249 required : want_dbus == 'true')
1250 have = libdbus.found()
1255 conf.set10('HAVE_DBUS', have)
1257 default_dnssec = get_option('default-dnssec')
1259 default_dnssec = 'no'
1261 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1262 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1263 default_dnssec = 'no'
1265 conf.set('DEFAULT_DNSSEC_MODE',
1266 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1267 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1269 dns_over_tls = get_option('dns-over-tls')
1270 if dns_over_tls != 'false'
1271 if dns_over_tls == 'openssl'
1274 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1275 if dns_over_tls == 'gnutls' and not have_gnutls
1276 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1279 if dns_over_tls == 'gnutls' or have_gnutls
1280 have_openssl = false
1282 have_openssl = conf.get('HAVE_OPENSSL') == 1
1283 if dns_over_tls != 'auto' and not have_openssl
1284 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1285 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1288 have = have_gnutls or have_openssl
1292 have_openssl = false
1294 conf.set10('ENABLE_DNS_OVER_TLS', have)
1295 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1296 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1298 default_dns_over_tls = get_option('default-dns-over-tls')
1300 default_dns_over_tls = 'no'
1302 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1303 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1304 default_dns_over_tls = 'no'
1306 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1307 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1308 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1310 want_importd = get_option('importd')
1311 if want_importd != 'false'
1312 have = (conf.get('HAVE_LIBCURL') == 1 and
1313 conf.get('HAVE_ZLIB') == 1 and
1314 conf.get('HAVE_XZ') == 1 and
1315 conf.get('HAVE_GCRYPT') == 1)
1316 if want_importd == 'true' and not have
1317 error('importd support was requested, but dependencies are not available')
1322 conf.set10('ENABLE_IMPORTD', have)
1324 want_remote = get_option('remote')
1325 if want_remote != 'false'
1326 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1327 conf.get('HAVE_LIBCURL') == 1]
1328 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1329 # it's possible to build one without the other. Complain only if
1330 # support was explictly requested. The auxiliary files like sysusers
1331 # config should be installed when any of the programs are built.
1332 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1333 error('remote support was requested, but dependencies are not available')
1335 have = have_deps[0] or have_deps[1]
1339 conf.set10('ENABLE_REMOTE', have)
1341 foreach term : ['utmp',
1373 have = get_option(term)
1374 name = 'ENABLE_' + term.underscorify().to_upper()
1375 conf.set10(name, have)
1378 foreach tuple : [['nss-mymachines', 'machined'],
1379 ['nss-resolve', 'resolve']]
1380 want = get_option(tuple[0])
1382 have = get_option(tuple[1])
1383 if want == 'true' and not have
1384 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1389 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1390 conf.set10(name, have)
1394 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1395 'ENABLE_NSS_MYMACHINES',
1396 'ENABLE_NSS_RESOLVE',
1397 'ENABLE_NSS_SYSTEMD']
1398 if conf.get(term) == 1
1402 conf.set10('ENABLE_NSS', enable_nss)
1404 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1409 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1411 #####################################################################
1413 if get_option('efi')
1414 efi_arch = host_machine.cpu_family()
1416 if efi_arch == 'x86'
1417 EFI_MACHINE_TYPE_NAME = 'ia32'
1418 gnu_efi_arch = 'ia32'
1419 elif efi_arch == 'x86_64'
1420 EFI_MACHINE_TYPE_NAME = 'x64'
1421 gnu_efi_arch = 'x86_64'
1422 elif efi_arch == 'arm'
1423 EFI_MACHINE_TYPE_NAME = 'arm'
1424 gnu_efi_arch = 'arm'
1425 elif efi_arch == 'aarch64'
1426 EFI_MACHINE_TYPE_NAME = 'aa64'
1427 gnu_efi_arch = 'aarch64'
1429 EFI_MACHINE_TYPE_NAME = ''
1434 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1436 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1440 conf.set10('ENABLE_EFI', have)
1442 #####################################################################
1444 config_h = configure_file(
1445 output : 'config.h',
1446 configuration : conf)
1448 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1450 includes = include_directories('src/basic',
1454 'src/journal-remote',
1458 'src/time-wait-sync',
1464 'src/libsystemd/sd-bus',
1465 'src/libsystemd/sd-device',
1466 'src/libsystemd/sd-event',
1467 'src/libsystemd/sd-hwdb',
1468 'src/libsystemd/sd-id128',
1469 'src/libsystemd/sd-netlink',
1470 'src/libsystemd/sd-network',
1471 'src/libsystemd/sd-resolve',
1472 'src/libsystemd-network',
1475 add_project_arguments('-include', 'config.h', language : 'c')
1477 generate_gperfs = find_program('tools/generate-gperfs.py')
1481 subdir('src/systemd')
1483 subdir('src/libsystemd')
1484 subdir('src/libsystemd-network')
1485 subdir('src/journal')
1488 libjournal_core = static_library(
1490 libjournal_core_sources,
1492 include_directories : includes,
1495 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1496 libsystemd = shared_library(
1499 version : libsystemd_version,
1500 include_directories : includes,
1501 link_args : ['-shared',
1502 '-Wl,--version-script=' + libsystemd_sym_path],
1503 link_with : [libbasic,
1505 link_whole : [libsystemd_static,
1507 dependencies : [threads,
1511 link_depends : libsystemd_sym,
1513 install_dir : rootlibdir)
1515 static_libsystemd = get_option('static-libsystemd')
1516 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1518 install_libsystemd_static = static_library(
1521 journal_client_sources,
1523 basic_gcrypt_sources,
1525 include_directories : includes,
1526 build_by_default : static_libsystemd != 'false',
1527 install : static_libsystemd != 'false',
1528 install_dir : rootlibdir,
1529 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1530 dependencies : [threads,
1539 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1541 ############################################################
1543 # binaries that have --help and are intended for use by humans,
1544 # usually, but not always, installed in /bin.
1545 public_programs = []
1547 subdir('src/libudev')
1548 subdir('src/shared')
1550 subdir('src/shutdown')
1552 subdir('src/network')
1554 subdir('src/analyze')
1555 subdir('src/journal-remote')
1556 subdir('src/coredump')
1557 subdir('src/hostname')
1558 subdir('src/import')
1559 subdir('src/kernel-install')
1560 subdir('src/locale')
1561 subdir('src/machine')
1562 subdir('src/portable')
1563 subdir('src/nspawn')
1564 subdir('src/resolve')
1565 subdir('src/timedate')
1566 subdir('src/timesync')
1567 subdir('src/vconsole')
1568 subdir('src/boot/efi')
1575 ############################################################
1577 # only static linking apart from libdl, to make sure that the
1578 # module is linked to all libraries that it uses.
1579 test_dlopen = executable(
1583 include_directories : includes,
1584 link_with : [libbasic],
1585 dependencies : [libdl],
1586 build_by_default : want_tests != 'false')
1588 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1589 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1590 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1591 ['resolve', 'ENABLE_NSS_RESOLVE']]
1593 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1597 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1598 version_script_arg = join_paths(project_source_root, sym)
1600 nss = shared_library(
1602 'src/nss-@0@/nss-@0@.c'.format(module),
1605 include_directories : includes,
1606 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1607 link_args : ['-Wl,-z,nodelete',
1609 '-Wl,--version-script=' + version_script_arg,
1611 link_with : [libsystemd_static,
1613 dependencies : [threads,
1617 install_dir : rootlibdir)
1619 # We cannot use shared_module because it does not support version suffix.
1620 # Unfortunately shared_library insists on creating the symlink…
1621 meson.add_install_script('sh', '-c',
1622 'rm $DESTDIR@0@/libnss_@1@.so'
1623 .format(rootlibdir, module))
1625 if want_tests != 'false'
1626 test('dlopen-nss_' + module,
1628 # path to dlopen must include a slash
1629 args : nss.full_path())
1634 ############################################################
1636 executable('systemd',
1638 include_directories : includes,
1639 link_with : [libcore,
1641 dependencies : [versiondep,
1648 install_rpath : rootlibexecdir,
1650 install_dir : rootlibexecdir)
1652 meson.add_install_script(meson_make_symlink,
1653 join_paths(rootlibexecdir, 'systemd'),
1654 join_paths(rootsbindir, 'init'))
1656 exe = executable('systemd-analyze',
1657 systemd_analyze_sources,
1658 include_directories : includes,
1659 link_with : [libcore,
1661 dependencies : [versiondep,
1668 install_rpath : rootlibexecdir,
1670 public_programs += exe
1672 executable('systemd-journald',
1673 systemd_journald_sources,
1674 include_directories : includes,
1675 link_with : [libjournal_core,
1677 dependencies : [threads,
1681 install_rpath : rootlibexecdir,
1683 install_dir : rootlibexecdir)
1685 exe = executable('systemd-cat',
1686 systemd_cat_sources,
1687 include_directories : includes,
1688 link_with : [libjournal_core,
1690 dependencies : [threads],
1691 install_rpath : rootlibexecdir,
1693 public_programs += exe
1695 exe = executable('journalctl',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 dependencies : [threads,
1704 install_rpath : rootlibexecdir,
1706 install_dir : rootbindir)
1707 public_programs += exe
1709 executable('systemd-getty-generator',
1710 'src/getty-generator/getty-generator.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 install_rpath : rootlibexecdir,
1715 install_dir : systemgeneratordir)
1717 executable('systemd-debug-generator',
1718 'src/debug-generator/debug-generator.c',
1719 include_directories : includes,
1720 link_with : [libshared],
1721 install_rpath : rootlibexecdir,
1723 install_dir : systemgeneratordir)
1725 executable('systemd-run-generator',
1726 'src/run-generator/run-generator.c',
1727 include_directories : includes,
1728 link_with : [libshared],
1729 install_rpath : rootlibexecdir,
1731 install_dir : systemgeneratordir)
1733 executable('systemd-fstab-generator',
1734 'src/fstab-generator/fstab-generator.c',
1735 include_directories : includes,
1736 link_with : [libcore_shared,
1738 install_rpath : rootlibexecdir,
1740 install_dir : systemgeneratordir)
1742 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1743 executable('30-systemd-environment-d-generator',
1744 'src/environment-d-generator/environment-d-generator.c',
1745 include_directories : includes,
1746 link_with : [libshared],
1747 install_rpath : rootlibexecdir,
1749 install_dir : userenvgeneratordir)
1751 meson.add_install_script(meson_make_symlink,
1752 join_paths(sysconfdir, 'environment'),
1753 join_paths(environmentdir, '99-environment.conf'))
1756 if conf.get('ENABLE_HIBERNATE') == 1
1757 executable('systemd-hibernate-resume-generator',
1758 'src/hibernate-resume/hibernate-resume-generator.c',
1759 include_directories : includes,
1760 link_with : [libshared],
1761 install_rpath : rootlibexecdir,
1763 install_dir : systemgeneratordir)
1765 executable('systemd-hibernate-resume',
1766 'src/hibernate-resume/hibernate-resume.c',
1767 include_directories : includes,
1768 link_with : [libshared],
1769 install_rpath : rootlibexecdir,
1771 install_dir : rootlibexecdir)
1774 if conf.get('HAVE_BLKID') == 1
1775 executable('systemd-gpt-auto-generator',
1776 'src/gpt-auto-generator/gpt-auto-generator.c',
1777 'src/shared/blkid-util.h',
1778 include_directories : includes,
1779 link_with : [libshared],
1780 dependencies : libblkid,
1781 install_rpath : rootlibexecdir,
1783 install_dir : systemgeneratordir)
1785 exe = executable('systemd-dissect',
1786 'src/dissect/dissect.c',
1787 include_directories : includes,
1788 link_with : [libshared],
1789 install_rpath : rootlibexecdir,
1791 install_dir : rootlibexecdir)
1792 public_programs += exe
1795 if conf.get('ENABLE_RESOLVE') == 1
1796 executable('systemd-resolved',
1797 systemd_resolved_sources,
1798 include_directories : includes,
1799 link_with : [libshared,
1801 libsystemd_resolve_core],
1802 dependencies : systemd_resolved_dependencies,
1803 install_rpath : rootlibexecdir,
1805 install_dir : rootlibexecdir)
1807 exe = executable('resolvectl',
1809 include_directories : includes,
1810 link_with : [libshared,
1812 libsystemd_resolve_core],
1813 dependencies : [threads,
1817 install_rpath : rootlibexecdir,
1819 public_programs += exe
1821 meson.add_install_script(meson_make_symlink,
1822 join_paths(bindir, 'resolvectl'),
1823 join_paths(rootsbindir, 'resolvconf'))
1825 meson.add_install_script(meson_make_symlink,
1826 join_paths(bindir, 'resolvectl'),
1827 join_paths(bindir, 'systemd-resolve'))
1830 if conf.get('ENABLE_LOGIND') == 1
1831 executable('systemd-logind',
1832 systemd_logind_sources,
1833 include_directories : includes,
1834 link_with : [liblogind_core,
1836 dependencies : [threads,
1838 install_rpath : rootlibexecdir,
1840 install_dir : rootlibexecdir)
1842 exe = executable('loginctl',
1844 include_directories : includes,
1845 link_with : [libshared],
1846 dependencies : [threads,
1849 install_rpath : rootlibexecdir,
1851 install_dir : rootbindir)
1852 public_programs += exe
1854 exe = executable('systemd-inhibit',
1855 'src/login/inhibit.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1860 install_dir : rootbindir)
1861 public_programs += exe
1863 if conf.get('HAVE_PAM') == 1
1864 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1865 pam_systemd = shared_library(
1869 include_directories : includes,
1870 link_args : ['-shared',
1871 '-Wl,--version-script=' + version_script_arg],
1872 link_with : [libsystemd_static,
1874 dependencies : [threads,
1877 link_depends : pam_systemd_sym,
1879 install_dir : pamlibdir)
1881 if want_tests != 'false'
1882 test('dlopen-pam_systemd',
1884 # path to dlopen must include a slash
1885 args : pam_systemd.full_path())
1889 executable('systemd-user-runtime-dir',
1890 user_runtime_dir_sources,
1891 include_directories : includes,
1892 link_with : [libshared],
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootlibexecdir)
1898 if conf.get('HAVE_PAM') == 1
1899 executable('systemd-user-sessions',
1900 'src/user-sessions/user-sessions.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 install_rpath : rootlibexecdir,
1905 install_dir : rootlibexecdir)
1908 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1909 exe = executable('bootctl',
1910 'src/boot/bootctl.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 dependencies : [libblkid],
1914 install_rpath : rootlibexecdir,
1916 public_programs += exe
1918 executable('systemd-bless-boot',
1919 'src/boot/bless-boot.c',
1920 include_directories : includes,
1921 link_with : [libshared],
1922 dependencies : [libblkid],
1923 install_rpath : rootlibexecdir,
1925 install_dir : rootlibexecdir)
1927 executable('systemd-bless-boot-generator',
1928 'src/boot/bless-boot-generator.c',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 install_rpath : rootlibexecdir,
1933 install_dir : systemgeneratordir)
1936 executable('systemd-boot-check-no-failures',
1937 'src/boot/boot-check-no-failures.c',
1938 include_directories : includes,
1939 link_with : [libshared],
1940 dependencies : [libblkid],
1941 install_rpath : rootlibexecdir,
1943 install_dir : rootlibexecdir)
1945 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1946 include_directories : includes,
1947 link_with : [libshared],
1948 dependencies : [threads],
1949 install_rpath : rootlibexecdir,
1951 public_programs += exe
1954 if get_option('link-systemctl-shared')
1955 systemctl_link_with = [libshared]
1957 systemctl_link_with = [libsystemd_static,
1963 exe = executable('systemctl',
1964 'src/systemctl/systemctl.c',
1965 'src/systemctl/sysv-compat.h',
1966 'src/systemctl/sysv-compat.c',
1967 include_directories : includes,
1968 link_with : systemctl_link_with,
1969 dependencies : [threads,
1974 install_rpath : rootlibexecdir,
1976 install_dir : rootbindir)
1977 public_programs += exe
1979 if conf.get('ENABLE_PORTABLED') == 1
1980 executable('systemd-portabled',
1981 systemd_portabled_sources,
1982 include_directories : includes,
1983 link_with : [libshared],
1984 dependencies : [threads],
1985 install_rpath : rootlibexecdir,
1987 install_dir : rootlibexecdir)
1989 exe = executable('portablectl', 'src/portable/portablectl.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 dependencies : [threads],
1993 install_rpath : rootlibexecdir,
1995 install_dir : rootbindir)
1996 public_programs += exe
1999 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2000 meson.add_install_script(meson_make_symlink,
2001 join_paths(rootbindir, 'systemctl'),
2002 join_paths(rootsbindir, alias))
2005 if conf.get('ENABLE_BACKLIGHT') == 1
2006 executable('systemd-backlight',
2007 'src/backlight/backlight.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2012 install_dir : rootlibexecdir)
2015 if conf.get('ENABLE_RFKILL') == 1
2016 executable('systemd-rfkill',
2017 'src/rfkill/rfkill.c',
2018 include_directories : includes,
2019 link_with : [libshared],
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootlibexecdir)
2025 executable('systemd-system-update-generator',
2026 'src/system-update-generator/system-update-generator.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 install_rpath : rootlibexecdir,
2031 install_dir : systemgeneratordir)
2033 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2034 executable('systemd-cryptsetup',
2035 'src/cryptsetup/cryptsetup.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 dependencies : [libcryptsetup],
2039 install_rpath : rootlibexecdir,
2041 install_dir : rootlibexecdir)
2043 executable('systemd-cryptsetup-generator',
2044 'src/cryptsetup/cryptsetup-generator.c',
2045 include_directories : includes,
2046 link_with : [libshared],
2047 dependencies : [libcryptsetup],
2048 install_rpath : rootlibexecdir,
2050 install_dir : systemgeneratordir)
2052 executable('systemd-veritysetup',
2053 'src/veritysetup/veritysetup.c',
2054 include_directories : includes,
2055 link_with : [libshared],
2056 dependencies : [libcryptsetup],
2057 install_rpath : rootlibexecdir,
2059 install_dir : rootlibexecdir)
2061 executable('systemd-veritysetup-generator',
2062 'src/veritysetup/veritysetup-generator.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 dependencies : [libcryptsetup],
2066 install_rpath : rootlibexecdir,
2068 install_dir : systemgeneratordir)
2071 if conf.get('HAVE_SYSV_COMPAT') == 1
2072 executable('systemd-sysv-generator',
2073 'src/sysv-generator/sysv-generator.c',
2074 include_directories : includes,
2075 link_with : [libshared],
2076 install_rpath : rootlibexecdir,
2078 install_dir : systemgeneratordir)
2080 executable('systemd-rc-local-generator',
2081 'src/rc-local-generator/rc-local-generator.c',
2082 include_directories : includes,
2083 link_with : [libshared],
2084 install_rpath : rootlibexecdir,
2086 install_dir : systemgeneratordir)
2089 if conf.get('ENABLE_HOSTNAMED') == 1
2090 executable('systemd-hostnamed',
2091 'src/hostname/hostnamed.c',
2092 include_directories : includes,
2093 link_with : [libshared],
2094 install_rpath : rootlibexecdir,
2096 install_dir : rootlibexecdir)
2098 exe = executable('hostnamectl',
2099 'src/hostname/hostnamectl.c',
2100 include_directories : includes,
2101 link_with : [libshared],
2102 install_rpath : rootlibexecdir,
2104 public_programs += exe
2107 if conf.get('ENABLE_LOCALED') == 1
2108 if conf.get('HAVE_XKBCOMMON') == 1
2109 # logind will load libxkbcommon.so dynamically on its own
2115 executable('systemd-localed',
2116 systemd_localed_sources,
2117 include_directories : includes,
2118 link_with : [libshared],
2119 dependencies : deps,
2120 install_rpath : rootlibexecdir,
2122 install_dir : rootlibexecdir)
2124 exe = executable('localectl',
2126 include_directories : includes,
2127 link_with : [libshared],
2128 install_rpath : rootlibexecdir,
2130 public_programs += exe
2133 if conf.get('ENABLE_TIMEDATED') == 1
2134 executable('systemd-timedated',
2135 'src/timedate/timedated.c',
2136 include_directories : includes,
2137 link_with : [libshared],
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootlibexecdir)
2143 if conf.get('ENABLE_TIMEDATECTL') == 1
2144 exe = executable('timedatectl',
2145 'src/timedate/timedatectl.c',
2146 include_directories : includes,
2147 install_rpath : rootlibexecdir,
2148 link_with : [libshared],
2149 dependencies : [libm],
2151 public_programs += exe
2154 if conf.get('ENABLE_TIMESYNCD') == 1
2155 executable('systemd-timesyncd',
2156 systemd_timesyncd_sources,
2157 include_directories : includes,
2158 link_with : [libshared],
2159 dependencies : [threads,
2161 install_rpath : rootlibexecdir,
2163 install_dir : rootlibexecdir)
2165 executable('systemd-time-wait-sync',
2166 'src/time-wait-sync/time-wait-sync.c',
2167 include_directories : includes,
2168 link_with : [libshared],
2169 install_rpath : rootlibexecdir,
2171 install_dir : rootlibexecdir)
2174 if conf.get('ENABLE_MACHINED') == 1
2175 executable('systemd-machined',
2176 systemd_machined_sources,
2177 include_directories : includes,
2178 link_with : [libmachine_core,
2180 install_rpath : rootlibexecdir,
2182 install_dir : rootlibexecdir)
2184 exe = executable('machinectl',
2185 'src/machine/machinectl.c',
2186 include_directories : includes,
2187 link_with : [libshared],
2188 dependencies : [threads,
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootbindir)
2194 public_programs += exe
2197 if conf.get('ENABLE_IMPORTD') == 1
2198 executable('systemd-importd',
2199 systemd_importd_sources,
2200 include_directories : includes,
2201 link_with : [libshared],
2202 dependencies : [threads],
2203 install_rpath : rootlibexecdir,
2205 install_dir : rootlibexecdir)
2207 systemd_pull = executable('systemd-pull',
2208 systemd_pull_sources,
2209 include_directories : includes,
2210 link_with : [libshared],
2211 dependencies : [versiondep,
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootlibexecdir)
2221 systemd_import = executable('systemd-import',
2222 systemd_import_sources,
2223 include_directories : includes,
2224 link_with : [libshared],
2225 dependencies : [libcurl,
2229 install_rpath : rootlibexecdir,
2231 install_dir : rootlibexecdir)
2233 systemd_import_fs = executable('systemd-import-fs',
2234 systemd_import_fs_sources,
2235 include_directories : includes,
2236 link_with : [libshared],
2237 install_rpath : rootlibexecdir,
2239 install_dir : rootlibexecdir)
2241 systemd_export = executable('systemd-export',
2242 systemd_export_sources,
2243 include_directories : includes,
2244 link_with : [libshared],
2245 dependencies : [libcurl,
2249 install_rpath : rootlibexecdir,
2251 install_dir : rootlibexecdir)
2253 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2256 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2257 exe = executable('systemd-journal-upload',
2258 systemd_journal_upload_sources,
2259 include_directories : includes,
2260 link_with : [libshared],
2261 dependencies : [versiondep,
2267 install_rpath : rootlibexecdir,
2269 install_dir : rootlibexecdir)
2270 public_programs += exe
2273 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2274 s_j_remote = executable('systemd-journal-remote',
2275 systemd_journal_remote_sources,
2276 include_directories : includes,
2277 link_with : [libshared,
2278 libsystemd_journal_remote],
2279 dependencies : [threads,
2284 install_rpath : rootlibexecdir,
2286 install_dir : rootlibexecdir)
2288 s_j_gatewayd = executable('systemd-journal-gatewayd',
2289 systemd_journal_gatewayd_sources,
2290 include_directories : includes,
2291 link_with : [libshared],
2292 dependencies : [threads,
2297 install_rpath : rootlibexecdir,
2299 install_dir : rootlibexecdir)
2300 public_programs += [s_j_remote, s_j_gatewayd]
2303 if conf.get('ENABLE_COREDUMP') == 1
2304 executable('systemd-coredump',
2305 systemd_coredump_sources,
2306 include_directories : includes,
2307 link_with : [libshared],
2308 dependencies : [threads,
2313 install_rpath : rootlibexecdir,
2315 install_dir : rootlibexecdir)
2317 exe = executable('coredumpctl',
2318 coredumpctl_sources,
2319 include_directories : includes,
2320 link_with : [libshared],
2321 dependencies : [threads,
2324 install_rpath : rootlibexecdir,
2326 public_programs += exe
2329 if conf.get('ENABLE_BINFMT') == 1
2330 exe = executable('systemd-binfmt',
2331 'src/binfmt/binfmt.c',
2332 include_directories : includes,
2333 link_with : [libshared],
2334 install_rpath : rootlibexecdir,
2336 install_dir : rootlibexecdir)
2337 public_programs += exe
2339 meson.add_install_script('sh', '-c',
2340 mkdir_p.format(binfmtdir))
2341 meson.add_install_script('sh', '-c',
2342 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2345 if conf.get('ENABLE_VCONSOLE') == 1
2346 executable('systemd-vconsole-setup',
2347 'src/vconsole/vconsole-setup.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2355 if conf.get('ENABLE_RANDOMSEED') == 1
2356 executable('systemd-random-seed',
2357 'src/random-seed/random-seed.c',
2358 include_directories : includes,
2359 link_with : [libshared],
2360 install_rpath : rootlibexecdir,
2362 install_dir : rootlibexecdir)
2365 if conf.get('ENABLE_FIRSTBOOT') == 1
2366 executable('systemd-firstboot',
2367 'src/firstboot/firstboot.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 dependencies : [libcrypt],
2371 install_rpath : rootlibexecdir,
2373 install_dir : rootbindir)
2376 executable('systemd-remount-fs',
2377 'src/remount-fs/remount-fs.c',
2378 include_directories : includes,
2379 link_with : [libcore_shared,
2381 install_rpath : rootlibexecdir,
2383 install_dir : rootlibexecdir)
2385 executable('systemd-machine-id-setup',
2386 'src/machine-id-setup/machine-id-setup-main.c',
2387 include_directories : includes,
2388 link_with : [libcore_shared,
2390 install_rpath : rootlibexecdir,
2392 install_dir : rootbindir)
2394 executable('systemd-fsck',
2396 include_directories : includes,
2397 link_with : [libshared],
2398 install_rpath : rootlibexecdir,
2400 install_dir : rootlibexecdir)
2402 executable('systemd-growfs',
2403 'src/partition/growfs.c',
2404 include_directories : includes,
2405 link_with : [libshared],
2406 dependencies : [libcryptsetup],
2407 install_rpath : rootlibexecdir,
2409 install_dir : rootlibexecdir)
2411 executable('systemd-makefs',
2412 'src/partition/makefs.c',
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2417 install_dir : rootlibexecdir)
2419 executable('systemd-sleep',
2420 'src/sleep/sleep.c',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 install_rpath : rootlibexecdir,
2425 install_dir : rootlibexecdir)
2427 install_data('src/sleep/sleep.conf',
2428 install_dir : pkgsysconfdir)
2430 exe = executable('systemd-sysctl',
2431 'src/sysctl/sysctl.c',
2432 include_directories : includes,
2433 link_with : [libshared],
2434 install_rpath : rootlibexecdir,
2436 install_dir : rootlibexecdir)
2437 public_programs += exe
2439 executable('systemd-ac-power',
2440 'src/ac-power/ac-power.c',
2441 include_directories : includes,
2442 link_with : [libshared],
2443 install_rpath : rootlibexecdir,
2445 install_dir : rootlibexecdir)
2447 exe = executable('systemd-detect-virt',
2448 'src/detect-virt/detect-virt.c',
2449 include_directories : includes,
2450 link_with : [libshared],
2451 install_rpath : rootlibexecdir,
2453 public_programs += exe
2455 exe = executable('systemd-delta',
2456 'src/delta/delta.c',
2457 include_directories : includes,
2458 link_with : [libshared],
2459 install_rpath : rootlibexecdir,
2461 public_programs += exe
2463 exe = executable('systemd-escape',
2464 'src/escape/escape.c',
2465 include_directories : includes,
2466 link_with : [libshared],
2467 install_rpath : rootlibexecdir,
2469 install_dir : rootbindir)
2470 public_programs += exe
2472 exe = executable('systemd-notify',
2473 'src/notify/notify.c',
2474 include_directories : includes,
2475 link_with : [libshared],
2476 install_rpath : rootlibexecdir,
2478 install_dir : rootbindir)
2479 public_programs += exe
2481 executable('systemd-volatile-root',
2482 'src/volatile-root/volatile-root.c',
2483 include_directories : includes,
2484 link_with : [libshared],
2485 install_rpath : rootlibexecdir,
2487 install_dir : rootlibexecdir)
2489 executable('systemd-cgroups-agent',
2490 'src/cgroups-agent/cgroups-agent.c',
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2495 install_dir : rootlibexecdir)
2497 exe = executable('systemd-id128',
2498 'src/id128/id128.c',
2499 include_directories : includes,
2500 link_with : [libshared],
2501 install_rpath : rootlibexecdir,
2503 public_programs += exe
2505 exe = executable('systemd-path',
2507 include_directories : includes,
2508 link_with : [libshared],
2509 install_rpath : rootlibexecdir,
2511 public_programs += exe
2513 exe = executable('systemd-ask-password',
2514 'src/ask-password/ask-password.c',
2515 include_directories : includes,
2516 link_with : [libshared],
2517 install_rpath : rootlibexecdir,
2519 install_dir : rootbindir)
2520 public_programs += exe
2522 executable('systemd-reply-password',
2523 'src/reply-password/reply-password.c',
2524 include_directories : includes,
2525 link_with : [libshared],
2526 install_rpath : rootlibexecdir,
2528 install_dir : rootlibexecdir)
2530 exe = executable('systemd-tty-ask-password-agent',
2531 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2532 include_directories : includes,
2533 link_with : [libshared],
2534 install_rpath : rootlibexecdir,
2536 install_dir : rootbindir)
2537 public_programs += exe
2539 exe = executable('systemd-cgls',
2541 include_directories : includes,
2542 link_with : [libshared],
2543 install_rpath : rootlibexecdir,
2545 public_programs += exe
2547 exe = executable('systemd-cgtop',
2548 'src/cgtop/cgtop.c',
2549 include_directories : includes,
2550 link_with : [libshared],
2551 install_rpath : rootlibexecdir,
2553 public_programs += exe
2555 executable('systemd-initctl',
2556 'src/initctl/initctl.c',
2557 include_directories : includes,
2558 link_with : [libshared],
2559 install_rpath : rootlibexecdir,
2561 install_dir : rootlibexecdir)
2563 exe = executable('systemd-mount',
2564 'src/mount/mount-tool.c',
2565 include_directories : includes,
2566 link_with : [libshared],
2567 install_rpath : rootlibexecdir,
2569 public_programs += exe
2571 meson.add_install_script(meson_make_symlink,
2572 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2574 exe = executable('systemd-run',
2576 include_directories : includes,
2577 link_with : [libshared],
2578 install_rpath : rootlibexecdir,
2580 public_programs += exe
2582 exe = executable('systemd-stdio-bridge',
2583 'src/stdio-bridge/stdio-bridge.c',
2584 include_directories : includes,
2585 link_with : [libshared],
2586 dependencies : [versiondep],
2587 install_rpath : rootlibexecdir,
2589 public_programs += exe
2591 exe = executable('busctl',
2592 'src/busctl/busctl.c',
2593 'src/busctl/busctl-introspect.c',
2594 'src/busctl/busctl-introspect.h',
2595 include_directories : includes,
2596 link_with : [libshared],
2597 install_rpath : rootlibexecdir,
2599 public_programs += exe
2601 if conf.get('ENABLE_SYSUSERS') == 1
2602 exe = executable('systemd-sysusers',
2603 'src/sysusers/sysusers.c',
2604 include_directories : includes,
2605 link_with : [libshared],
2606 install_rpath : rootlibexecdir,
2608 install_dir : rootbindir)
2609 public_programs += exe
2612 if conf.get('ENABLE_TMPFILES') == 1
2613 exe = executable('systemd-tmpfiles',
2614 'src/tmpfiles/tmpfiles.c',
2615 include_directories : includes,
2616 link_with : [libshared],
2617 dependencies : [libacl],
2618 install_rpath : rootlibexecdir,
2620 install_dir : rootbindir)
2621 public_programs += exe
2623 if want_tests != 'false'
2624 test('test-systemd-tmpfiles',
2625 test_systemd_tmpfiles_py,
2626 # https://github.com/mesonbuild/meson/issues/2681
2627 args : exe.full_path())
2631 if conf.get('ENABLE_HWDB') == 1
2632 exe = executable('systemd-hwdb',
2634 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2635 include_directories : includes,
2636 link_with : [libudev_static],
2637 install_rpath : udev_rpath,
2639 install_dir : rootbindir)
2640 public_programs += exe
2643 if conf.get('ENABLE_QUOTACHECK') == 1
2644 executable('systemd-quotacheck',
2645 'src/quotacheck/quotacheck.c',
2646 include_directories : includes,
2647 link_with : [libshared],
2648 install_rpath : rootlibexecdir,
2650 install_dir : rootlibexecdir)
2653 exe = executable('systemd-socket-proxyd',
2654 'src/socket-proxy/socket-proxyd.c',
2655 include_directories : includes,
2656 link_with : [libshared],
2657 dependencies : [threads],
2658 install_rpath : rootlibexecdir,
2660 install_dir : rootlibexecdir)
2661 public_programs += exe
2663 exe = executable('systemd-udevd',
2664 systemd_udevd_sources,
2665 include_directories : includes,
2666 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2667 link_with : [libudev_core,
2670 dependencies : [versiondep,
2676 install_rpath : udev_rpath,
2678 install_dir : rootlibexecdir)
2679 public_programs += exe
2681 exe = executable('udevadm',
2683 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2684 include_directories : includes,
2685 link_with : [libudev_core,
2688 dependencies : [versiondep,
2694 install_rpath : udev_rpath,
2696 install_dir : rootbindir)
2697 public_programs += exe
2699 executable('systemd-shutdown',
2700 systemd_shutdown_sources,
2701 include_directories : includes,
2702 link_with : [libcore_shared,
2704 dependencies : [libmount],
2705 install_rpath : rootlibexecdir,
2707 install_dir : rootlibexecdir)
2709 executable('systemd-update-done',
2710 'src/update-done/update-done.c',
2711 include_directories : includes,
2712 link_with : [libshared],
2713 install_rpath : rootlibexecdir,
2715 install_dir : rootlibexecdir)
2717 executable('systemd-update-utmp',
2718 'src/update-utmp/update-utmp.c',
2719 include_directories : includes,
2720 link_with : [libshared],
2721 dependencies : [libaudit],
2722 install_rpath : rootlibexecdir,
2724 install_dir : rootlibexecdir)
2726 if conf.get('HAVE_KMOD') == 1
2727 executable('systemd-modules-load',
2728 'src/modules-load/modules-load.c',
2729 include_directories : includes,
2730 link_with : [libshared],
2731 dependencies : [libkmod],
2732 install_rpath : rootlibexecdir,
2734 install_dir : rootlibexecdir)
2736 meson.add_install_script('sh', '-c',
2737 mkdir_p.format(modulesloaddir))
2738 meson.add_install_script('sh', '-c',
2739 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2742 exe = executable('systemd-nspawn',
2743 systemd_nspawn_sources,
2744 include_directories : includes,
2745 link_with : [libcore_shared,
2748 dependencies : [libblkid,
2750 install_rpath : rootlibexecdir,
2752 public_programs += exe
2754 if conf.get('ENABLE_NETWORKD') == 1
2755 executable('systemd-networkd',
2756 systemd_networkd_sources,
2757 include_directories : includes,
2758 link_with : [libnetworkd_core,
2762 dependencies : [threads],
2763 install_rpath : rootlibexecdir,
2765 install_dir : rootlibexecdir)
2767 executable('systemd-networkd-wait-online',
2768 systemd_networkd_wait_online_sources,
2769 include_directories : includes,
2770 link_with : [libnetworkd_core,
2772 install_rpath : rootlibexecdir,
2774 install_dir : rootlibexecdir)
2776 exe = executable('networkctl',
2778 include_directories : includes,
2779 link_with : [libsystemd_network,
2781 install_rpath : rootlibexecdir,
2783 install_dir : rootbindir)
2784 public_programs += exe
2787 executable('systemd-sulogin-shell',
2788 ['src/sulogin-shell/sulogin-shell.c'],
2789 include_directories : includes,
2790 link_with : [libshared],
2791 install_rpath : rootlibexecdir,
2793 install_dir : rootlibexecdir)
2795 ############################################################
2798 'systemd-runtest.env',
2799 output : 'systemd-runtest.env',
2800 command : ['sh', '-c', '{ ' +
2801 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2802 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2804 build_by_default : true)
2806 foreach tuple : tests
2808 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2809 dependencies = tuple[2]
2810 condition = tuple.length() >= 4 ? tuple[3] : ''
2811 type = tuple.length() >= 5 ? tuple[4] : ''
2812 defs = tuple.length() >= 6 ? tuple[5] : []
2813 incs = tuple.length() >= 7 ? tuple[6] : includes
2816 name = sources[0].split('/')[-1].split('.')[0]
2817 if type.startswith('timeout=')
2818 timeout = type.split('=')[1].to_int()
2822 if condition == '' or conf.get(condition) == 1
2826 include_directories : incs,
2827 link_with : link_with,
2828 dependencies : [versiondep,
2831 build_by_default : want_tests != 'false',
2832 install_rpath : rootlibexecdir,
2833 install : install_tests,
2834 install_dir : join_paths(testsdir, type))
2837 message('@0@ is a manual test'.format(name))
2838 elif type == 'unsafe' and want_tests != 'unsafe'
2839 message('@0@ is an unsafe test'.format(name))
2840 elif want_tests != 'false'
2846 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2851 'test-libsystemd-sym',
2852 test_libsystemd_sym_c,
2853 include_directories : includes,
2854 link_with : [libsystemd],
2855 build_by_default : want_tests != 'false',
2856 install : install_tests,
2857 install_dir : testsdir)
2858 if want_tests != 'false'
2859 test('test-libsystemd-sym', exe)
2863 'test-libsystemd-static-sym',
2864 test_libsystemd_sym_c,
2865 include_directories : includes,
2866 link_with : [install_libsystemd_static],
2867 dependencies : [threads], # threads is already included in dependencies on the library,
2868 # but does not seem to get propagated. Add here as a work-around.
2869 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2870 install : install_tests and static_libsystemd_pic,
2871 install_dir : testsdir)
2872 if want_tests != 'false' and static_libsystemd_pic
2873 test('test-libsystemd-static-sym', exe)
2879 include_directories : includes,
2880 c_args : '-Wno-deprecated-declarations',
2881 link_with : [libudev],
2882 build_by_default : want_tests != 'false',
2883 install : install_tests,
2884 install_dir : testsdir)
2885 if want_tests != 'false'
2886 test('test-libudev-sym', exe)
2890 'test-libudev-static-sym',
2892 include_directories : includes,
2893 c_args : '-Wno-deprecated-declarations',
2894 link_with : [install_libudev_static],
2895 build_by_default : want_tests != 'false' and static_libudev_pic,
2896 install : install_tests and static_libudev_pic,
2897 install_dir : testsdir)
2898 if want_tests != 'false' and static_libudev_pic
2899 test('test-libudev-static-sym', exe)
2902 ############################################################
2906 if get_option('tests') != 'false'
2907 foreach tuple : fuzzers
2909 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2910 dependencies = tuple[2]
2911 defs = tuple.length() >= 4 ? tuple[3] : []
2912 incs = tuple.length() >= 5 ? tuple[4] : includes
2915 dependencies += fuzzing_engine
2917 sources += 'src/fuzz/fuzz-main.c'
2920 name = sources[0].split('/')[-1].split('.')[0]
2922 fuzzer_exes += executable(
2925 include_directories : [incs, include_directories('src/fuzz')],
2926 link_with : link_with,
2927 dependencies : dependencies,
2933 run_target('fuzzers',
2934 depends : fuzzer_exes,
2937 ############################################################
2939 make_directive_index_py = find_program('tools/make-directive-index.py')
2940 make_man_index_py = find_program('tools/make-man-index.py')
2941 xml_helper_py = find_program('tools/xml_helper.py')
2942 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2946 subdir('sysusers.d')
2947 subdir('tmpfiles.d')
2952 subdir('shell-completion/bash')
2953 subdir('shell-completion/zsh')
2954 subdir('docs/sysvinit')
2955 subdir('docs/var-log')
2957 install_subdir('factory/etc',
2958 install_dir : factorydir)
2960 install_data('xorg/50-systemd-user.sh',
2961 install_dir : xinitrcdir)
2962 install_data('modprobe.d/systemd.conf',
2963 install_dir : modprobedir)
2964 install_data('LICENSE.GPL2',
2968 'docs/CODING_STYLE.md',
2969 'docs/DISTRO_PORTING.md',
2970 'docs/ENVIRONMENT.md',
2972 'docs/TRANSIENT-SETTINGS.md',
2973 'docs/TRANSLATORS.md',
2974 'docs/UIDS-GIDS.md',
2975 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2976 install_dir : docdir)
2978 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2979 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2981 ############################################################
2983 meson_check_help = find_program('tools/meson-check-help.sh')
2985 foreach exec : public_programs
2986 name = exec.full_path().split('/')[-1]
2987 if want_tests != 'false'
2988 test('check-help-' + name,
2990 args : exec.full_path())
2994 ############################################################
2996 # Enable tests for all supported sanitizers
2997 foreach tuple : sanitizers
2998 sanitizer = tuple[0]
3001 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3003 foreach p : fuzz_regression_tests
3004 b = p.split('/')[-2]
3005 c = p.split('/')[-1]
3007 name = '@0@:@1@'.format(b, sanitizer)
3010 if want_tests == 'false'
3011 message('Not compiling @0@ because tests is set to false'.format(name))
3013 exe = custom_target(
3017 command : [env, 'ln', '-fs',
3018 join_paths(build.full_path(), b),
3020 build_by_default : true)
3022 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3027 if want_tests != 'false' and slow_tests
3028 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3030 args : [exe.full_path(),
3031 join_paths(project_source_root, p)])
3038 ############################################################
3041 all_files = run_command(
3043 ['--git-dir=@0@/.git'.format(project_source_root),
3046 all_files = files(all_files.stdout().split())
3051 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3054 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3058 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3061 command : [meson_git_contrib_sh])
3065 git_head = run_command(
3067 ['--git-dir=@0@/.git'.format(project_source_root),
3068 'rev-parse', 'HEAD']).stdout().strip()
3069 git_head_short = run_command(
3071 ['--git-dir=@0@/.git'.format(project_source_root),
3072 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3076 command : ['git', 'archive',
3077 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3079 '--prefix', 'systemd-@0@/'.format(git_head),
3083 ############################################################
3085 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3088 depends : [man, libsystemd, libudev],
3089 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3091 ############################################################
3094 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3096 'split /usr: @0@'.format(split_usr),
3097 'split bin-sbin: @0@'.format(split_bin),
3098 'prefix directory: @0@'.format(prefixdir),
3099 'rootprefix directory: @0@'.format(rootprefixdir),
3100 'sysconf directory: @0@'.format(sysconfdir),
3101 'include directory: @0@'.format(includedir),
3102 'lib directory: @0@'.format(libdir),
3103 'rootlib directory: @0@'.format(rootlibdir),
3104 'SysV init scripts: @0@'.format(sysvinit_path),
3105 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3106 'PAM modules directory: @0@'.format(pamlibdir),
3107 'PAM configuration directory: @0@'.format(pamconfdir),
3108 'RPM macros directory: @0@'.format(rpmmacrosdir),
3109 'modprobe.d directory: @0@'.format(modprobedir),
3110 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3111 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3112 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3113 'bash completions directory: @0@'.format(bashcompletiondir),
3114 'zsh completions directory: @0@'.format(zshcompletiondir),
3115 'extra start script: @0@'.format(get_option('rc-local')),
3116 'extra stop script: @0@'.format(get_option('halt-local')),
3117 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3118 get_option('debug-tty')),
3119 'TTY GID: @0@'.format(tty_gid),
3120 'users GID: @0@'.format(substs.get('USERS_GID')),
3121 'maximum system UID: @0@'.format(system_uid_max),
3122 'maximum system GID: @0@'.format(system_gid_max),
3123 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3124 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3125 'minimum container UID base: @0@'.format(container_uid_base_min),
3126 'maximum container UID base: @0@'.format(container_uid_base_max),
3127 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3128 'render group access mode: @0@'.format(get_option('group-render-mode')),
3129 'certificate root directory: @0@'.format(get_option('certificate-root')),
3130 'support URL: @0@'.format(support_url),
3131 'nobody user name: @0@'.format(nobody_user),
3132 'nobody group name: @0@'.format(nobody_group),
3133 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3134 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3136 'default DNSSEC mode: @0@'.format(default_dnssec),
3137 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3138 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3139 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3140 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3141 'default locale: @0@'.format(default_locale)]
3143 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3144 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3146 'default DNS servers: @0@'.format(alt_dns_servers),
3147 'default NTP servers: @0@'.format(alt_ntp_servers)]
3149 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3150 '@@0@'.format(time_epoch)).stdout().strip()
3152 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3155 'static libsystemd: @0@'.format(static_libsystemd),
3156 'static libudev: @0@'.format(static_libudev)]
3159 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3160 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3161 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3163 if conf.get('ENABLE_EFI') == 1
3164 status += 'efi arch: @0@'.format(efi_arch)
3168 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3169 'EFI CC @0@'.format(' '.join(efi_cc)),
3170 'EFI lib directory: @0@'.format(efi_libdir),
3171 'EFI lds directory: @0@'.format(efi_ldsdir),
3172 'EFI include directory: @0@'.format(efi_incdir)]
3224 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3225 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3228 ['legacy pkla', install_polkit_pkla],
3230 ['gnu-efi', have_gnu_efi],
3243 ['man pages', want_man],
3244 ['html pages', want_html],
3245 ['man page indices', want_man and have_lxml],
3250 ['adm group', get_option('adm-group')],
3251 ['wheel group', get_option('wheel-group')],
3254 ['debug mmap cache'],
3257 ['valgrind', conf.get('VALGRIND') == 1],
3258 ['trace logging', conf.get('LOG_TRACE') == 1],
3259 ['link-udev-shared', get_option('link-udev-shared')],
3260 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3263 if tuple.length() >= 2
3266 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3267 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3268 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3279 'enabled features: @0@'.format(', '.join(found)),
3281 'disabled features: @0@'.format(', '.join(missing)),
3283 message('\n '.join(status))
3285 if rootprefixdir != rootprefix_default
3287 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3288 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3289 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))