1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.26.0'
16 libudev_version = '1.6.14'
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],
1610 link_with : [libsystemd_static,
1612 dependencies : [threads,
1616 install_dir : rootlibdir)
1618 # We cannot use shared_module because it does not support version suffix.
1619 # Unfortunately shared_library insists on creating the symlink…
1620 meson.add_install_script('sh', '-c',
1621 'rm $DESTDIR@0@/libnss_@1@.so'
1622 .format(rootlibdir, module))
1624 if want_tests != 'false'
1625 test('dlopen-nss_' + module,
1627 # path to dlopen must include a slash
1628 args : nss.full_path())
1633 ############################################################
1635 executable('systemd',
1637 include_directories : includes,
1638 link_with : [libcore,
1640 dependencies : [versiondep,
1647 install_rpath : rootlibexecdir,
1649 install_dir : rootlibexecdir)
1651 meson.add_install_script(meson_make_symlink,
1652 join_paths(rootlibexecdir, 'systemd'),
1653 join_paths(rootsbindir, 'init'))
1655 exe = executable('systemd-analyze',
1656 systemd_analyze_sources,
1657 include_directories : includes,
1658 link_with : [libcore,
1660 dependencies : [versiondep,
1667 install_rpath : rootlibexecdir,
1669 public_programs += exe
1671 executable('systemd-journald',
1672 systemd_journald_sources,
1673 include_directories : includes,
1674 link_with : [libjournal_core,
1676 dependencies : [threads,
1680 install_rpath : rootlibexecdir,
1682 install_dir : rootlibexecdir)
1684 exe = executable('systemd-cat',
1685 systemd_cat_sources,
1686 include_directories : includes,
1687 link_with : [libjournal_core,
1689 dependencies : [threads],
1690 install_rpath : rootlibexecdir,
1692 public_programs += exe
1694 exe = executable('journalctl',
1696 include_directories : includes,
1697 link_with : [libshared],
1698 dependencies : [threads,
1703 install_rpath : rootlibexecdir,
1705 install_dir : rootbindir)
1706 public_programs += exe
1708 executable('systemd-getty-generator',
1709 'src/getty-generator/getty-generator.c',
1710 include_directories : includes,
1711 link_with : [libshared],
1712 install_rpath : rootlibexecdir,
1714 install_dir : systemgeneratordir)
1716 executable('systemd-debug-generator',
1717 'src/debug-generator/debug-generator.c',
1718 include_directories : includes,
1719 link_with : [libshared],
1720 install_rpath : rootlibexecdir,
1722 install_dir : systemgeneratordir)
1724 executable('systemd-run-generator',
1725 'src/run-generator/run-generator.c',
1726 include_directories : includes,
1727 link_with : [libshared],
1728 install_rpath : rootlibexecdir,
1730 install_dir : systemgeneratordir)
1732 executable('systemd-fstab-generator',
1733 'src/fstab-generator/fstab-generator.c',
1734 include_directories : includes,
1735 link_with : [libcore_shared,
1737 install_rpath : rootlibexecdir,
1739 install_dir : systemgeneratordir)
1741 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1742 executable('30-systemd-environment-d-generator',
1743 'src/environment-d-generator/environment-d-generator.c',
1744 include_directories : includes,
1745 link_with : [libshared],
1746 install_rpath : rootlibexecdir,
1748 install_dir : userenvgeneratordir)
1750 meson.add_install_script(meson_make_symlink,
1751 join_paths(sysconfdir, 'environment'),
1752 join_paths(environmentdir, '99-environment.conf'))
1755 if conf.get('ENABLE_HIBERNATE') == 1
1756 executable('systemd-hibernate-resume-generator',
1757 'src/hibernate-resume/hibernate-resume-generator.c',
1758 include_directories : includes,
1759 link_with : [libshared],
1760 install_rpath : rootlibexecdir,
1762 install_dir : systemgeneratordir)
1764 executable('systemd-hibernate-resume',
1765 'src/hibernate-resume/hibernate-resume.c',
1766 include_directories : includes,
1767 link_with : [libshared],
1768 install_rpath : rootlibexecdir,
1770 install_dir : rootlibexecdir)
1773 if conf.get('HAVE_BLKID') == 1
1774 executable('systemd-gpt-auto-generator',
1775 'src/gpt-auto-generator/gpt-auto-generator.c',
1776 'src/shared/blkid-util.h',
1777 include_directories : includes,
1778 link_with : [libshared],
1779 dependencies : libblkid,
1780 install_rpath : rootlibexecdir,
1782 install_dir : systemgeneratordir)
1784 exe = executable('systemd-dissect',
1785 'src/dissect/dissect.c',
1786 include_directories : includes,
1787 link_with : [libshared],
1788 install_rpath : rootlibexecdir,
1790 install_dir : rootlibexecdir)
1791 public_programs += exe
1794 if conf.get('ENABLE_RESOLVE') == 1
1795 executable('systemd-resolved',
1796 systemd_resolved_sources,
1797 include_directories : includes,
1798 link_with : [libshared,
1800 libsystemd_resolve_core],
1801 dependencies : systemd_resolved_dependencies,
1802 install_rpath : rootlibexecdir,
1804 install_dir : rootlibexecdir)
1806 exe = executable('resolvectl',
1808 include_directories : includes,
1809 link_with : [libshared,
1811 libsystemd_resolve_core],
1812 dependencies : [threads,
1816 install_rpath : rootlibexecdir,
1818 public_programs += exe
1820 meson.add_install_script(meson_make_symlink,
1821 join_paths(bindir, 'resolvectl'),
1822 join_paths(rootsbindir, 'resolvconf'))
1824 meson.add_install_script(meson_make_symlink,
1825 join_paths(bindir, 'resolvectl'),
1826 join_paths(bindir, 'systemd-resolve'))
1829 if conf.get('ENABLE_LOGIND') == 1
1830 executable('systemd-logind',
1831 systemd_logind_sources,
1832 include_directories : includes,
1833 link_with : [liblogind_core,
1835 dependencies : [threads,
1837 install_rpath : rootlibexecdir,
1839 install_dir : rootlibexecdir)
1841 exe = executable('loginctl',
1843 include_directories : includes,
1844 link_with : [libshared],
1845 dependencies : [threads,
1848 install_rpath : rootlibexecdir,
1850 install_dir : rootbindir)
1851 public_programs += exe
1853 exe = executable('systemd-inhibit',
1854 'src/login/inhibit.c',
1855 include_directories : includes,
1856 link_with : [libshared],
1857 install_rpath : rootlibexecdir,
1859 install_dir : rootbindir)
1860 public_programs += exe
1862 if conf.get('HAVE_PAM') == 1
1863 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1864 pam_systemd = shared_library(
1868 include_directories : includes,
1869 link_args : ['-shared',
1870 '-Wl,--version-script=' + version_script_arg],
1871 link_with : [libsystemd_static,
1873 dependencies : [threads,
1876 link_depends : pam_systemd_sym,
1878 install_dir : pamlibdir)
1880 if want_tests != 'false'
1881 test('dlopen-pam_systemd',
1883 # path to dlopen must include a slash
1884 args : pam_systemd.full_path())
1888 executable('systemd-user-runtime-dir',
1889 user_runtime_dir_sources,
1890 include_directories : includes,
1891 link_with : [libshared],
1892 install_rpath : rootlibexecdir,
1894 install_dir : rootlibexecdir)
1897 if conf.get('HAVE_PAM') == 1
1898 executable('systemd-user-sessions',
1899 'src/user-sessions/user-sessions.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 install_rpath : rootlibexecdir,
1904 install_dir : rootlibexecdir)
1907 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1908 exe = executable('bootctl',
1909 'src/boot/bootctl.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 dependencies : [libblkid],
1913 install_rpath : rootlibexecdir,
1915 public_programs += exe
1917 executable('systemd-bless-boot',
1918 'src/boot/bless-boot.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [libblkid],
1922 install_rpath : rootlibexecdir,
1924 install_dir : rootlibexecdir)
1926 executable('systemd-bless-boot-generator',
1927 'src/boot/bless-boot-generator.c',
1928 include_directories : includes,
1929 link_with : [libshared],
1930 install_rpath : rootlibexecdir,
1932 install_dir : systemgeneratordir)
1935 executable('systemd-boot-check-no-failures',
1936 'src/boot/boot-check-no-failures.c',
1937 include_directories : includes,
1938 link_with : [libshared],
1939 dependencies : [libblkid],
1940 install_rpath : rootlibexecdir,
1942 install_dir : rootlibexecdir)
1944 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1945 include_directories : includes,
1946 link_with : [libshared],
1947 dependencies : [threads],
1948 install_rpath : rootlibexecdir,
1950 public_programs += exe
1953 if get_option('link-systemctl-shared')
1954 systemctl_link_with = [libshared]
1956 systemctl_link_with = [libsystemd_static,
1962 exe = executable('systemctl',
1963 'src/systemctl/systemctl.c',
1964 'src/systemctl/sysv-compat.h',
1965 'src/systemctl/sysv-compat.c',
1966 include_directories : includes,
1967 link_with : systemctl_link_with,
1968 dependencies : [threads,
1973 install_rpath : rootlibexecdir,
1975 install_dir : rootbindir)
1976 public_programs += exe
1978 if conf.get('ENABLE_PORTABLED') == 1
1979 executable('systemd-portabled',
1980 systemd_portabled_sources,
1981 include_directories : includes,
1982 link_with : [libshared],
1983 dependencies : [threads],
1984 install_rpath : rootlibexecdir,
1986 install_dir : rootlibexecdir)
1988 exe = executable('portablectl', 'src/portable/portablectl.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 dependencies : [threads],
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootbindir)
1995 public_programs += exe
1998 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1999 meson.add_install_script(meson_make_symlink,
2000 join_paths(rootbindir, 'systemctl'),
2001 join_paths(rootsbindir, alias))
2004 if conf.get('ENABLE_BACKLIGHT') == 1
2005 executable('systemd-backlight',
2006 'src/backlight/backlight.c',
2007 include_directories : includes,
2008 link_with : [libshared],
2009 install_rpath : rootlibexecdir,
2011 install_dir : rootlibexecdir)
2014 if conf.get('ENABLE_RFKILL') == 1
2015 executable('systemd-rfkill',
2016 'src/rfkill/rfkill.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 install_rpath : rootlibexecdir,
2021 install_dir : rootlibexecdir)
2024 executable('systemd-system-update-generator',
2025 'src/system-update-generator/system-update-generator.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 install_rpath : rootlibexecdir,
2030 install_dir : systemgeneratordir)
2032 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2033 executable('systemd-cryptsetup',
2034 'src/cryptsetup/cryptsetup.c',
2035 include_directories : includes,
2036 link_with : [libshared],
2037 dependencies : [libcryptsetup],
2038 install_rpath : rootlibexecdir,
2040 install_dir : rootlibexecdir)
2042 executable('systemd-cryptsetup-generator',
2043 'src/cryptsetup/cryptsetup-generator.c',
2044 include_directories : includes,
2045 link_with : [libshared],
2046 dependencies : [libcryptsetup],
2047 install_rpath : rootlibexecdir,
2049 install_dir : systemgeneratordir)
2051 executable('systemd-veritysetup',
2052 'src/veritysetup/veritysetup.c',
2053 include_directories : includes,
2054 link_with : [libshared],
2055 dependencies : [libcryptsetup],
2056 install_rpath : rootlibexecdir,
2058 install_dir : rootlibexecdir)
2060 executable('systemd-veritysetup-generator',
2061 'src/veritysetup/veritysetup-generator.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 dependencies : [libcryptsetup],
2065 install_rpath : rootlibexecdir,
2067 install_dir : systemgeneratordir)
2070 if conf.get('HAVE_SYSV_COMPAT') == 1
2071 executable('systemd-sysv-generator',
2072 'src/sysv-generator/sysv-generator.c',
2073 include_directories : includes,
2074 link_with : [libshared],
2075 install_rpath : rootlibexecdir,
2077 install_dir : systemgeneratordir)
2079 executable('systemd-rc-local-generator',
2080 'src/rc-local-generator/rc-local-generator.c',
2081 include_directories : includes,
2082 link_with : [libshared],
2083 install_rpath : rootlibexecdir,
2085 install_dir : systemgeneratordir)
2088 if conf.get('ENABLE_HOSTNAMED') == 1
2089 executable('systemd-hostnamed',
2090 'src/hostname/hostnamed.c',
2091 include_directories : includes,
2092 link_with : [libshared],
2093 install_rpath : rootlibexecdir,
2095 install_dir : rootlibexecdir)
2097 exe = executable('hostnamectl',
2098 'src/hostname/hostnamectl.c',
2099 include_directories : includes,
2100 link_with : [libshared],
2101 install_rpath : rootlibexecdir,
2103 public_programs += exe
2106 if conf.get('ENABLE_LOCALED') == 1
2107 if conf.get('HAVE_XKBCOMMON') == 1
2108 # logind will load libxkbcommon.so dynamically on its own
2114 executable('systemd-localed',
2115 systemd_localed_sources,
2116 include_directories : includes,
2117 link_with : [libshared],
2118 dependencies : deps,
2119 install_rpath : rootlibexecdir,
2121 install_dir : rootlibexecdir)
2123 exe = executable('localectl',
2125 include_directories : includes,
2126 link_with : [libshared],
2127 install_rpath : rootlibexecdir,
2129 public_programs += exe
2132 if conf.get('ENABLE_TIMEDATED') == 1
2133 executable('systemd-timedated',
2134 'src/timedate/timedated.c',
2135 include_directories : includes,
2136 link_with : [libshared],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2142 if conf.get('ENABLE_TIMEDATECTL') == 1
2143 exe = executable('timedatectl',
2144 'src/timedate/timedatectl.c',
2145 include_directories : includes,
2146 install_rpath : rootlibexecdir,
2147 link_with : [libshared],
2148 dependencies : [libm],
2150 public_programs += exe
2153 if conf.get('ENABLE_TIMESYNCD') == 1
2154 executable('systemd-timesyncd',
2155 systemd_timesyncd_sources,
2156 include_directories : includes,
2157 link_with : [libshared],
2158 dependencies : [threads,
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootlibexecdir)
2164 executable('systemd-time-wait-sync',
2165 'src/time-wait-sync/time-wait-sync.c',
2166 include_directories : includes,
2167 link_with : [libshared],
2168 install_rpath : rootlibexecdir,
2170 install_dir : rootlibexecdir)
2173 if conf.get('ENABLE_MACHINED') == 1
2174 executable('systemd-machined',
2175 systemd_machined_sources,
2176 include_directories : includes,
2177 link_with : [libmachine_core,
2179 install_rpath : rootlibexecdir,
2181 install_dir : rootlibexecdir)
2183 exe = executable('machinectl',
2184 'src/machine/machinectl.c',
2185 include_directories : includes,
2186 link_with : [libshared],
2187 dependencies : [threads,
2190 install_rpath : rootlibexecdir,
2192 install_dir : rootbindir)
2193 public_programs += exe
2196 if conf.get('ENABLE_IMPORTD') == 1
2197 executable('systemd-importd',
2198 systemd_importd_sources,
2199 include_directories : includes,
2200 link_with : [libshared],
2201 dependencies : [threads],
2202 install_rpath : rootlibexecdir,
2204 install_dir : rootlibexecdir)
2206 systemd_pull = executable('systemd-pull',
2207 systemd_pull_sources,
2208 include_directories : includes,
2209 link_with : [libshared],
2210 dependencies : [versiondep,
2216 install_rpath : rootlibexecdir,
2218 install_dir : rootlibexecdir)
2220 systemd_import = executable('systemd-import',
2221 systemd_import_sources,
2222 include_directories : includes,
2223 link_with : [libshared],
2224 dependencies : [libcurl,
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootlibexecdir)
2232 systemd_import_fs = executable('systemd-import-fs',
2233 systemd_import_fs_sources,
2234 include_directories : includes,
2235 link_with : [libshared],
2236 install_rpath : rootlibexecdir,
2238 install_dir : rootlibexecdir)
2240 systemd_export = executable('systemd-export',
2241 systemd_export_sources,
2242 include_directories : includes,
2243 link_with : [libshared],
2244 dependencies : [libcurl,
2248 install_rpath : rootlibexecdir,
2250 install_dir : rootlibexecdir)
2252 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2255 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2256 exe = executable('systemd-journal-upload',
2257 systemd_journal_upload_sources,
2258 include_directories : includes,
2259 link_with : [libshared],
2260 dependencies : [versiondep,
2266 install_rpath : rootlibexecdir,
2268 install_dir : rootlibexecdir)
2269 public_programs += exe
2272 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2273 s_j_remote = executable('systemd-journal-remote',
2274 systemd_journal_remote_sources,
2275 include_directories : includes,
2276 link_with : [libshared,
2277 libsystemd_journal_remote],
2278 dependencies : [threads,
2283 install_rpath : rootlibexecdir,
2285 install_dir : rootlibexecdir)
2287 s_j_gatewayd = executable('systemd-journal-gatewayd',
2288 systemd_journal_gatewayd_sources,
2289 include_directories : includes,
2290 link_with : [libshared],
2291 dependencies : [threads,
2296 install_rpath : rootlibexecdir,
2298 install_dir : rootlibexecdir)
2299 public_programs += [s_j_remote, s_j_gatewayd]
2302 if conf.get('ENABLE_COREDUMP') == 1
2303 executable('systemd-coredump',
2304 systemd_coredump_sources,
2305 include_directories : includes,
2306 link_with : [libshared],
2307 dependencies : [threads,
2312 install_rpath : rootlibexecdir,
2314 install_dir : rootlibexecdir)
2316 exe = executable('coredumpctl',
2317 coredumpctl_sources,
2318 include_directories : includes,
2319 link_with : [libshared],
2320 dependencies : [threads,
2323 install_rpath : rootlibexecdir,
2325 public_programs += exe
2328 if conf.get('ENABLE_BINFMT') == 1
2329 exe = executable('systemd-binfmt',
2330 'src/binfmt/binfmt.c',
2331 include_directories : includes,
2332 link_with : [libshared],
2333 install_rpath : rootlibexecdir,
2335 install_dir : rootlibexecdir)
2336 public_programs += exe
2338 meson.add_install_script('sh', '-c',
2339 mkdir_p.format(binfmtdir))
2340 meson.add_install_script('sh', '-c',
2341 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2344 if conf.get('ENABLE_VCONSOLE') == 1
2345 executable('systemd-vconsole-setup',
2346 'src/vconsole/vconsole-setup.c',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 install_rpath : rootlibexecdir,
2351 install_dir : rootlibexecdir)
2354 if conf.get('ENABLE_RANDOMSEED') == 1
2355 executable('systemd-random-seed',
2356 'src/random-seed/random-seed.c',
2357 include_directories : includes,
2358 link_with : [libshared],
2359 install_rpath : rootlibexecdir,
2361 install_dir : rootlibexecdir)
2364 if conf.get('ENABLE_FIRSTBOOT') == 1
2365 executable('systemd-firstboot',
2366 'src/firstboot/firstboot.c',
2367 include_directories : includes,
2368 link_with : [libshared],
2369 dependencies : [libcrypt],
2370 install_rpath : rootlibexecdir,
2372 install_dir : rootbindir)
2375 executable('systemd-remount-fs',
2376 'src/remount-fs/remount-fs.c',
2377 include_directories : includes,
2378 link_with : [libcore_shared,
2380 install_rpath : rootlibexecdir,
2382 install_dir : rootlibexecdir)
2384 executable('systemd-machine-id-setup',
2385 'src/machine-id-setup/machine-id-setup-main.c',
2386 include_directories : includes,
2387 link_with : [libcore_shared,
2389 install_rpath : rootlibexecdir,
2391 install_dir : rootbindir)
2393 executable('systemd-fsck',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2399 install_dir : rootlibexecdir)
2401 executable('systemd-growfs',
2402 'src/partition/growfs.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 dependencies : [libcryptsetup],
2406 install_rpath : rootlibexecdir,
2408 install_dir : rootlibexecdir)
2410 executable('systemd-makefs',
2411 'src/partition/makefs.c',
2412 include_directories : includes,
2413 link_with : [libshared],
2414 install_rpath : rootlibexecdir,
2416 install_dir : rootlibexecdir)
2418 executable('systemd-sleep',
2419 'src/sleep/sleep.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 install_rpath : rootlibexecdir,
2424 install_dir : rootlibexecdir)
2426 install_data('src/sleep/sleep.conf',
2427 install_dir : pkgsysconfdir)
2429 exe = executable('systemd-sysctl',
2430 'src/sysctl/sysctl.c',
2431 include_directories : includes,
2432 link_with : [libshared],
2433 install_rpath : rootlibexecdir,
2435 install_dir : rootlibexecdir)
2436 public_programs += exe
2438 executable('systemd-ac-power',
2439 'src/ac-power/ac-power.c',
2440 include_directories : includes,
2441 link_with : [libshared],
2442 install_rpath : rootlibexecdir,
2444 install_dir : rootlibexecdir)
2446 exe = executable('systemd-detect-virt',
2447 'src/detect-virt/detect-virt.c',
2448 include_directories : includes,
2449 link_with : [libshared],
2450 install_rpath : rootlibexecdir,
2452 public_programs += exe
2454 exe = executable('systemd-delta',
2455 'src/delta/delta.c',
2456 include_directories : includes,
2457 link_with : [libshared],
2458 install_rpath : rootlibexecdir,
2460 public_programs += exe
2462 exe = executable('systemd-escape',
2463 'src/escape/escape.c',
2464 include_directories : includes,
2465 link_with : [libshared],
2466 install_rpath : rootlibexecdir,
2468 install_dir : rootbindir)
2469 public_programs += exe
2471 exe = executable('systemd-notify',
2472 'src/notify/notify.c',
2473 include_directories : includes,
2474 link_with : [libshared],
2475 install_rpath : rootlibexecdir,
2477 install_dir : rootbindir)
2478 public_programs += exe
2480 executable('systemd-volatile-root',
2481 'src/volatile-root/volatile-root.c',
2482 include_directories : includes,
2483 link_with : [libshared],
2484 install_rpath : rootlibexecdir,
2486 install_dir : rootlibexecdir)
2488 executable('systemd-cgroups-agent',
2489 'src/cgroups-agent/cgroups-agent.c',
2490 include_directories : includes,
2491 link_with : [libshared],
2492 install_rpath : rootlibexecdir,
2494 install_dir : rootlibexecdir)
2496 exe = executable('systemd-id128',
2497 'src/id128/id128.c',
2498 include_directories : includes,
2499 link_with : [libshared],
2500 install_rpath : rootlibexecdir,
2502 public_programs += exe
2504 exe = executable('systemd-path',
2506 include_directories : includes,
2507 link_with : [libshared],
2508 install_rpath : rootlibexecdir,
2510 public_programs += exe
2512 exe = executable('systemd-ask-password',
2513 'src/ask-password/ask-password.c',
2514 include_directories : includes,
2515 link_with : [libshared],
2516 install_rpath : rootlibexecdir,
2518 install_dir : rootbindir)
2519 public_programs += exe
2521 executable('systemd-reply-password',
2522 'src/reply-password/reply-password.c',
2523 include_directories : includes,
2524 link_with : [libshared],
2525 install_rpath : rootlibexecdir,
2527 install_dir : rootlibexecdir)
2529 exe = executable('systemd-tty-ask-password-agent',
2530 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2531 include_directories : includes,
2532 link_with : [libshared],
2533 install_rpath : rootlibexecdir,
2535 install_dir : rootbindir)
2536 public_programs += exe
2538 exe = executable('systemd-cgls',
2540 include_directories : includes,
2541 link_with : [libshared],
2542 install_rpath : rootlibexecdir,
2544 public_programs += exe
2546 exe = executable('systemd-cgtop',
2547 'src/cgtop/cgtop.c',
2548 include_directories : includes,
2549 link_with : [libshared],
2550 install_rpath : rootlibexecdir,
2552 public_programs += exe
2554 executable('systemd-initctl',
2555 'src/initctl/initctl.c',
2556 include_directories : includes,
2557 link_with : [libshared],
2558 install_rpath : rootlibexecdir,
2560 install_dir : rootlibexecdir)
2562 exe = executable('systemd-mount',
2563 'src/mount/mount-tool.c',
2564 include_directories : includes,
2565 link_with : [libshared],
2566 install_rpath : rootlibexecdir,
2568 public_programs += exe
2570 meson.add_install_script(meson_make_symlink,
2571 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2573 exe = executable('systemd-run',
2575 include_directories : includes,
2576 link_with : [libshared],
2577 install_rpath : rootlibexecdir,
2579 public_programs += exe
2581 exe = executable('systemd-stdio-bridge',
2582 'src/stdio-bridge/stdio-bridge.c',
2583 include_directories : includes,
2584 link_with : [libshared],
2585 dependencies : [versiondep],
2586 install_rpath : rootlibexecdir,
2588 public_programs += exe
2590 exe = executable('busctl',
2591 'src/busctl/busctl.c',
2592 'src/busctl/busctl-introspect.c',
2593 'src/busctl/busctl-introspect.h',
2594 include_directories : includes,
2595 link_with : [libshared],
2596 install_rpath : rootlibexecdir,
2598 public_programs += exe
2600 if conf.get('ENABLE_SYSUSERS') == 1
2601 exe = executable('systemd-sysusers',
2602 'src/sysusers/sysusers.c',
2603 include_directories : includes,
2604 link_with : [libshared],
2605 install_rpath : rootlibexecdir,
2607 install_dir : rootbindir)
2608 public_programs += exe
2611 if conf.get('ENABLE_TMPFILES') == 1
2612 exe = executable('systemd-tmpfiles',
2613 'src/tmpfiles/tmpfiles.c',
2614 include_directories : includes,
2615 link_with : [libshared],
2616 dependencies : [libacl],
2617 install_rpath : rootlibexecdir,
2619 install_dir : rootbindir)
2620 public_programs += exe
2622 if want_tests != 'false'
2623 test('test-systemd-tmpfiles',
2624 test_systemd_tmpfiles_py,
2625 # https://github.com/mesonbuild/meson/issues/2681
2626 args : exe.full_path())
2630 if conf.get('ENABLE_HWDB') == 1
2631 exe = executable('systemd-hwdb',
2633 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2634 include_directories : includes,
2635 link_with : [libudev_static],
2636 install_rpath : udev_rpath,
2638 install_dir : rootbindir)
2639 public_programs += exe
2642 if conf.get('ENABLE_QUOTACHECK') == 1
2643 executable('systemd-quotacheck',
2644 'src/quotacheck/quotacheck.c',
2645 include_directories : includes,
2646 link_with : [libshared],
2647 install_rpath : rootlibexecdir,
2649 install_dir : rootlibexecdir)
2652 exe = executable('systemd-socket-proxyd',
2653 'src/socket-proxy/socket-proxyd.c',
2654 include_directories : includes,
2655 link_with : [libshared],
2656 dependencies : [threads],
2657 install_rpath : rootlibexecdir,
2659 install_dir : rootlibexecdir)
2660 public_programs += exe
2662 exe = executable('systemd-udevd',
2663 systemd_udevd_sources,
2664 include_directories : includes,
2665 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2666 link_with : [libudev_core,
2669 dependencies : [versiondep,
2675 install_rpath : udev_rpath,
2677 install_dir : rootlibexecdir)
2678 public_programs += exe
2680 exe = executable('udevadm',
2682 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2683 include_directories : includes,
2684 link_with : [libudev_core,
2687 dependencies : [versiondep,
2693 install_rpath : udev_rpath,
2695 install_dir : rootbindir)
2696 public_programs += exe
2698 executable('systemd-shutdown',
2699 systemd_shutdown_sources,
2700 include_directories : includes,
2701 link_with : [libcore_shared,
2703 dependencies : [libmount],
2704 install_rpath : rootlibexecdir,
2706 install_dir : rootlibexecdir)
2708 executable('systemd-update-done',
2709 'src/update-done/update-done.c',
2710 include_directories : includes,
2711 link_with : [libshared],
2712 install_rpath : rootlibexecdir,
2714 install_dir : rootlibexecdir)
2716 executable('systemd-update-utmp',
2717 'src/update-utmp/update-utmp.c',
2718 include_directories : includes,
2719 link_with : [libshared],
2720 dependencies : [libaudit],
2721 install_rpath : rootlibexecdir,
2723 install_dir : rootlibexecdir)
2725 if conf.get('HAVE_KMOD') == 1
2726 executable('systemd-modules-load',
2727 'src/modules-load/modules-load.c',
2728 include_directories : includes,
2729 link_with : [libshared],
2730 dependencies : [libkmod],
2731 install_rpath : rootlibexecdir,
2733 install_dir : rootlibexecdir)
2735 meson.add_install_script('sh', '-c',
2736 mkdir_p.format(modulesloaddir))
2737 meson.add_install_script('sh', '-c',
2738 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2741 exe = executable('systemd-nspawn',
2742 systemd_nspawn_sources,
2743 include_directories : includes,
2744 link_with : [libcore_shared,
2747 dependencies : [libblkid,
2749 install_rpath : rootlibexecdir,
2751 public_programs += exe
2753 if conf.get('ENABLE_NETWORKD') == 1
2754 executable('systemd-networkd',
2755 systemd_networkd_sources,
2756 include_directories : includes,
2757 link_with : [libnetworkd_core,
2761 dependencies : [threads],
2762 install_rpath : rootlibexecdir,
2764 install_dir : rootlibexecdir)
2766 executable('systemd-networkd-wait-online',
2767 systemd_networkd_wait_online_sources,
2768 include_directories : includes,
2769 link_with : [libnetworkd_core,
2771 install_rpath : rootlibexecdir,
2773 install_dir : rootlibexecdir)
2775 exe = executable('networkctl',
2777 include_directories : includes,
2778 link_with : [libsystemd_network,
2780 install_rpath : rootlibexecdir,
2782 install_dir : rootbindir)
2783 public_programs += exe
2786 executable('systemd-sulogin-shell',
2787 ['src/sulogin-shell/sulogin-shell.c'],
2788 include_directories : includes,
2789 link_with : [libshared],
2790 install_rpath : rootlibexecdir,
2792 install_dir : rootlibexecdir)
2794 ############################################################
2797 'systemd-runtest.env',
2798 output : 'systemd-runtest.env',
2799 command : ['sh', '-c', '{ ' +
2800 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2801 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2803 build_by_default : true)
2805 foreach tuple : tests
2807 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2808 dependencies = tuple[2]
2809 condition = tuple.length() >= 4 ? tuple[3] : ''
2810 type = tuple.length() >= 5 ? tuple[4] : ''
2811 defs = tuple.length() >= 6 ? tuple[5] : []
2812 incs = tuple.length() >= 7 ? tuple[6] : includes
2815 name = sources[0].split('/')[-1].split('.')[0]
2816 if type.startswith('timeout=')
2817 timeout = type.split('=')[1].to_int()
2821 if condition == '' or conf.get(condition) == 1
2825 include_directories : incs,
2826 link_with : link_with,
2827 dependencies : [versiondep,
2830 build_by_default : want_tests != 'false',
2831 install_rpath : rootlibexecdir,
2832 install : install_tests,
2833 install_dir : join_paths(testsdir, type))
2836 message('@0@ is a manual test'.format(name))
2837 elif type == 'unsafe' and want_tests != 'unsafe'
2838 message('@0@ is an unsafe test'.format(name))
2839 elif want_tests != 'false'
2845 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2850 'test-libsystemd-sym',
2851 test_libsystemd_sym_c,
2852 include_directories : includes,
2853 link_with : [libsystemd],
2854 build_by_default : want_tests != 'false',
2855 install : install_tests,
2856 install_dir : testsdir)
2857 if want_tests != 'false'
2858 test('test-libsystemd-sym', exe)
2862 'test-libsystemd-static-sym',
2863 test_libsystemd_sym_c,
2864 include_directories : includes,
2865 link_with : [install_libsystemd_static],
2866 dependencies : [threads], # threads is already included in dependencies on the library,
2867 # but does not seem to get propagated. Add here as a work-around.
2868 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2869 install : install_tests and static_libsystemd_pic,
2870 install_dir : testsdir)
2871 if want_tests != 'false' and static_libsystemd_pic
2872 test('test-libsystemd-static-sym', exe)
2878 include_directories : includes,
2879 c_args : '-Wno-deprecated-declarations',
2880 link_with : [libudev],
2881 build_by_default : want_tests != 'false',
2882 install : install_tests,
2883 install_dir : testsdir)
2884 if want_tests != 'false'
2885 test('test-libudev-sym', exe)
2889 'test-libudev-static-sym',
2891 include_directories : includes,
2892 c_args : '-Wno-deprecated-declarations',
2893 link_with : [install_libudev_static],
2894 build_by_default : want_tests != 'false' and static_libudev_pic,
2895 install : install_tests and static_libudev_pic,
2896 install_dir : testsdir)
2897 if want_tests != 'false' and static_libudev_pic
2898 test('test-libudev-static-sym', exe)
2901 ############################################################
2905 if get_option('tests') != 'false'
2906 foreach tuple : fuzzers
2908 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2909 dependencies = tuple[2]
2910 defs = tuple.length() >= 4 ? tuple[3] : []
2911 incs = tuple.length() >= 5 ? tuple[4] : includes
2914 dependencies += fuzzing_engine
2916 sources += 'src/fuzz/fuzz-main.c'
2919 name = sources[0].split('/')[-1].split('.')[0]
2921 fuzzer_exes += executable(
2924 include_directories : [incs, include_directories('src/fuzz')],
2925 link_with : link_with,
2926 dependencies : dependencies,
2932 run_target('fuzzers',
2933 depends : fuzzer_exes,
2936 ############################################################
2938 make_directive_index_py = find_program('tools/make-directive-index.py')
2939 make_man_index_py = find_program('tools/make-man-index.py')
2940 xml_helper_py = find_program('tools/xml_helper.py')
2941 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2945 subdir('sysusers.d')
2946 subdir('tmpfiles.d')
2951 subdir('shell-completion/bash')
2952 subdir('shell-completion/zsh')
2953 subdir('docs/sysvinit')
2954 subdir('docs/var-log')
2956 install_subdir('factory/etc',
2957 install_dir : factorydir)
2959 install_data('xorg/50-systemd-user.sh',
2960 install_dir : xinitrcdir)
2961 install_data('modprobe.d/systemd.conf',
2962 install_dir : modprobedir)
2963 install_data('LICENSE.GPL2',
2967 'docs/CODING_STYLE.md',
2968 'docs/DISTRO_PORTING.md',
2969 'docs/ENVIRONMENT.md',
2971 'docs/TRANSIENT-SETTINGS.md',
2972 'docs/TRANSLATORS.md',
2973 'docs/UIDS-GIDS.md',
2974 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2975 install_dir : docdir)
2977 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2978 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2980 ############################################################
2982 meson_check_help = find_program('tools/meson-check-help.sh')
2984 foreach exec : public_programs
2985 name = exec.full_path().split('/')[-1]
2986 if want_tests != 'false'
2987 test('check-help-' + name,
2989 args : exec.full_path())
2993 ############################################################
2995 # Enable tests for all supported sanitizers
2996 foreach tuple : sanitizers
2997 sanitizer = tuple[0]
3000 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3002 foreach p : fuzz_regression_tests
3003 b = p.split('/')[-2]
3004 c = p.split('/')[-1]
3006 name = '@0@:@1@'.format(b, sanitizer)
3009 if want_tests == 'false'
3010 message('Not compiling @0@ because tests is set to false'.format(name))
3012 exe = custom_target(
3016 command : [env, 'ln', '-fs',
3017 join_paths(build.full_path(), b),
3019 build_by_default : true)
3021 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3026 if want_tests != 'false' and slow_tests
3027 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3029 args : [exe.full_path(),
3030 join_paths(project_source_root, p)])
3037 ############################################################
3040 all_files = run_command(
3042 ['--git-dir=@0@/.git'.format(project_source_root),
3045 all_files = files(all_files.stdout().split())
3050 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3053 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3057 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3060 command : [meson_git_contrib_sh])
3064 git_head = run_command(
3066 ['--git-dir=@0@/.git'.format(project_source_root),
3067 'rev-parse', 'HEAD']).stdout().strip()
3068 git_head_short = run_command(
3070 ['--git-dir=@0@/.git'.format(project_source_root),
3071 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3075 command : ['git', 'archive',
3076 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3078 '--prefix', 'systemd-@0@/'.format(git_head),
3082 ############################################################
3084 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3087 depends : [man, libsystemd, libudev],
3088 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3090 ############################################################
3093 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3095 'split /usr: @0@'.format(split_usr),
3096 'split bin-sbin: @0@'.format(split_bin),
3097 'prefix directory: @0@'.format(prefixdir),
3098 'rootprefix directory: @0@'.format(rootprefixdir),
3099 'sysconf directory: @0@'.format(sysconfdir),
3100 'include directory: @0@'.format(includedir),
3101 'lib directory: @0@'.format(libdir),
3102 'rootlib directory: @0@'.format(rootlibdir),
3103 'SysV init scripts: @0@'.format(sysvinit_path),
3104 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3105 'PAM modules directory: @0@'.format(pamlibdir),
3106 'PAM configuration directory: @0@'.format(pamconfdir),
3107 'RPM macros directory: @0@'.format(rpmmacrosdir),
3108 'modprobe.d directory: @0@'.format(modprobedir),
3109 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3110 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3111 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3112 'bash completions directory: @0@'.format(bashcompletiondir),
3113 'zsh completions directory: @0@'.format(zshcompletiondir),
3114 'extra start script: @0@'.format(get_option('rc-local')),
3115 'extra stop script: @0@'.format(get_option('halt-local')),
3116 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3117 get_option('debug-tty')),
3118 'TTY GID: @0@'.format(tty_gid),
3119 'users GID: @0@'.format(substs.get('USERS_GID')),
3120 'maximum system UID: @0@'.format(system_uid_max),
3121 'maximum system GID: @0@'.format(system_gid_max),
3122 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3123 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3124 'minimum container UID base: @0@'.format(container_uid_base_min),
3125 'maximum container UID base: @0@'.format(container_uid_base_max),
3126 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3127 'render group access mode: @0@'.format(get_option('group-render-mode')),
3128 'certificate root directory: @0@'.format(get_option('certificate-root')),
3129 'support URL: @0@'.format(support_url),
3130 'nobody user name: @0@'.format(nobody_user),
3131 'nobody group name: @0@'.format(nobody_group),
3132 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3133 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3135 'default DNSSEC mode: @0@'.format(default_dnssec),
3136 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3137 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3138 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3139 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3140 'default locale: @0@'.format(default_locale)]
3142 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3143 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3145 'default DNS servers: @0@'.format(alt_dns_servers),
3146 'default NTP servers: @0@'.format(alt_ntp_servers)]
3148 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3149 '@@0@'.format(time_epoch)).stdout().strip()
3151 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3154 'static libsystemd: @0@'.format(static_libsystemd),
3155 'static libudev: @0@'.format(static_libudev)]
3158 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3159 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3160 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3162 if conf.get('ENABLE_EFI') == 1
3163 status += 'efi arch: @0@'.format(efi_arch)
3167 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3168 'EFI CC @0@'.format(' '.join(efi_cc)),
3169 'EFI lib directory: @0@'.format(efi_libdir),
3170 'EFI lds directory: @0@'.format(efi_ldsdir),
3171 'EFI include directory: @0@'.format(efi_incdir)]
3223 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3224 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3227 ['legacy pkla', install_polkit_pkla],
3229 ['gnu-efi', have_gnu_efi],
3242 ['man pages', want_man],
3243 ['html pages', want_html],
3244 ['man page indices', want_man and have_lxml],
3249 ['adm group', get_option('adm-group')],
3250 ['wheel group', get_option('wheel-group')],
3253 ['debug mmap cache'],
3256 ['valgrind', conf.get('VALGRIND') == 1],
3257 ['trace logging', conf.get('LOG_TRACE') == 1],
3258 ['link-udev-shared', get_option('link-udev-shared')],
3259 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3262 if tuple.length() >= 2
3265 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3266 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3267 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3278 'enabled features: @0@'.format(', '.join(found)),
3280 'disabled features: @0@'.format(', '.join(missing)),
3282 message('\n '.join(status))
3284 if rootprefixdir != rootprefix_default
3286 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3287 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3288 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))