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 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
387 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
391 #include <inttypes.h>
392 typedef uint64_t usec_t;
393 usec_t now(clockid_t clock);
398 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
399 add_project_arguments('-Werror=shadow', language : 'c')
402 cpp = ' '.join(cc.cmd_array()) + ' -E'
404 #####################################################################
405 # compilation result tests
407 conf.set('_GNU_SOURCE', true)
408 conf.set('__SANE_USERSPACE_TYPES__', true)
410 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
411 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
412 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
416 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
420 #include <sys/stat.h>
423 foreach decl : ['char16_t',
428 # We get -1 if the size cannot be determined
429 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
431 if decl == 'struct statx'
433 want_linux_stat_h = false
435 have = cc.sizeof(decl,
436 prefix : decl_headers + '#include <linux/stat.h>',
437 args : '-D_GNU_SOURCE') > 0
438 want_linux_stat_h = have
442 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
445 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
447 foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
448 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
449 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
450 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
451 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
452 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
453 ['FRA_TUN_ID', 'linux/fib_rules.h'],
454 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
455 ['FRA_PAD', 'linux/fib_rules.h'],
456 ['FRA_L3MDEV', 'linux/fib_rules.h'],
457 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
458 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
459 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
460 ['FOU_CMD_GET', 'linux/fou.h'],
461 ['IFA_FLAGS', 'linux/if_addr.h'],
462 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
463 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
464 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
465 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
466 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
467 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
468 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
469 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
470 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
471 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
472 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
473 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
474 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
475 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
476 ['IFLA_PAD', 'linux/if_link.h'],
477 ['IFLA_XDP', 'linux/if_link.h'],
478 ['IFLA_EVENT', 'linux/if_link.h'],
479 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
480 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
481 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
482 ['IFLA_MAX_MTU', 'linux/if_link.h'],
483 ['IFLA_BOND_MODE', 'linux/if_link.h'],
484 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
485 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
486 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
487 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
488 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
489 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
490 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
491 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
492 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
493 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
494 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
495 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
496 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
497 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
498 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
499 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
500 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
501 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
502 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
503 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
504 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
505 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
506 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
507 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
508 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
509 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
510 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
511 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
512 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
513 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
514 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
515 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
516 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
517 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
518 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
519 # if_tunnel.h is buggy and cannot be included on its own
520 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
521 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
522 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
523 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
524 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
525 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
526 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
527 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
528 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
529 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
530 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
532 prefix = decl.length() > 2 ? decl[2] : ''
533 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
534 conf.set10('HAVE_' + decl[0], have)
537 foreach ident : ['secure_getenv', '__secure_getenv']
538 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
542 ['memfd_create', '''#include <sys/mman.h>'''],
543 ['gettid', '''#include <sys/types.h>
544 #include <unistd.h>'''],
545 ['pivot_root', '''#include <stdlib.h>
546 #include <unistd.h>'''], # no known header declares pivot_root
547 ['name_to_handle_at', '''#include <sys/types.h>
548 #include <sys/stat.h>
549 #include <fcntl.h>'''],
550 ['setns', '''#include <sched.h>'''],
551 ['renameat2', '''#include <stdio.h>
552 #include <fcntl.h>'''],
553 ['kcmp', '''#include <linux/kcmp.h>'''],
554 ['keyctl', '''#include <sys/types.h>
555 #include <keyutils.h>'''],
556 ['copy_file_range', '''#include <sys/syscall.h>
557 #include <unistd.h>'''],
558 ['bpf', '''#include <sys/syscall.h>
559 #include <unistd.h>'''],
560 ['statx', '''#include <sys/types.h>
561 #include <sys/stat.h>
562 #include <unistd.h>'''],
563 ['explicit_bzero' , '''#include <string.h>'''],
564 ['reallocarray', '''#include <malloc.h>'''],
567 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
568 conf.set10('HAVE_' + ident[0].to_upper(), have)
571 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
572 conf.set10('USE_SYS_RANDOM_H', true)
573 conf.set10('HAVE_GETRANDOM', true)
575 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
576 conf.set10('USE_SYS_RANDOM_H', false)
577 conf.set10('HAVE_GETRANDOM', have)
580 #####################################################################
582 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
584 get_option('version-tag'),
585 meson.project_version()]
588 input : 'src/version/version.h.in',
589 output : 'version.h',
592 versiondep = declare_dependency(sources: version_h)
594 sed = find_program('sed')
595 awk = find_program('awk')
596 m4 = find_program('m4')
597 stat = find_program('stat')
598 git = find_program('git', required : false)
599 env = find_program('env')
600 perl = find_program('perl', required : false)
602 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
603 mkdir_p = 'mkdir -p $DESTDIR/@0@'
604 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
605 splash_bmp = files('test/splash.bmp')
607 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
608 # /usr/sbin, /sbin, and fall back to the default from middle column.
609 progs = [['quotaon', '/usr/sbin/quotaon' ],
610 ['quotacheck', '/usr/sbin/quotacheck' ],
611 ['kmod', '/usr/bin/kmod' ],
612 ['kexec', '/usr/sbin/kexec' ],
613 ['sulogin', '/usr/sbin/sulogin' ],
614 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
615 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
616 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
617 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
620 path = get_option(prog[0] + '-path')
622 message('Using @1@ for @0@'.format(prog[0], path))
624 exe = find_program(prog[0],
625 '/usr/sbin/' + prog[0],
628 path = exe.found() ? exe.path() : prog[1]
630 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
631 conf.set_quoted(name, path)
632 substs.set(name, path)
635 conf.set_quoted('TELINIT', get_option('telinit-path'))
637 if run_command('ln', '--relative', '--help').returncode() != 0
638 error('ln does not support --relative (added in coreutils 8.16)')
641 ############################################################
643 gperf = find_program('gperf')
645 gperf_test_format = '''
647 const char * in_word_set(const char *, @0@);
650 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
651 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
652 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
653 if cc.compiles(gperf_test)
654 gperf_len_type = 'size_t'
656 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
657 if cc.compiles(gperf_test)
658 gperf_len_type = 'unsigned'
660 error('unable to determine gperf len type')
663 message('gperf len type is @0@'.format(gperf_len_type))
664 conf.set('GPERF_LEN_TYPE', gperf_len_type,
665 description : 'The type of gperf "len" parameter')
667 ############################################################
669 if not cc.has_header('sys/capability.h')
670 error('POSIX caps headers not found')
672 foreach header : ['crypt.h',
673 'linux/btrfs_tree.h',
676 'linux/vm_sockets.h',
679 'valgrind/memcheck.h',
680 'valgrind/valgrind.h',
683 conf.set10('HAVE_' + header.underscorify().to_upper(),
684 cc.has_header(header))
687 ############################################################
689 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
690 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
691 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
693 default_hierarchy = get_option('default-hierarchy')
694 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
695 description : 'default cgroup hierarchy as string')
696 if default_hierarchy == 'legacy'
697 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
698 elif default_hierarchy == 'hybrid'
699 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
701 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
704 default_net_naming_scheme = get_option('default-net-naming-scheme')
705 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
707 time_epoch = get_option('time-epoch')
710 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
712 conf.set('TIME_EPOCH', time_epoch)
714 system_uid_max = get_option('system-uid-max')
715 if system_uid_max == -1
716 system_uid_max = run_command(
718 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
719 '/etc/login.defs').stdout().strip()
720 if system_uid_max == ''
723 system_uid_max = system_uid_max.to_int()
726 conf.set('SYSTEM_UID_MAX', system_uid_max)
727 substs.set('systemuidmax', system_uid_max)
729 system_gid_max = get_option('system-gid-max')
730 if system_gid_max == -1
731 system_gid_max = run_command(
733 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
734 '/etc/login.defs').stdout().strip()
735 if system_gid_max == ''
738 system_gid_max = system_gid_max.to_int()
741 conf.set('SYSTEM_GID_MAX', system_gid_max)
742 substs.set('systemgidmax', system_gid_max)
744 dynamic_uid_min = get_option('dynamic-uid-min')
745 dynamic_uid_max = get_option('dynamic-uid-max')
746 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
747 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
748 substs.set('dynamicuidmin', dynamic_uid_min)
749 substs.set('dynamicuidmax', dynamic_uid_max)
751 container_uid_base_min = get_option('container-uid-base-min')
752 container_uid_base_max = get_option('container-uid-base-max')
753 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
754 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
755 substs.set('containeruidbasemin', container_uid_base_min)
756 substs.set('containeruidbasemax', container_uid_base_max)
758 nobody_user = get_option('nobody-user')
759 nobody_group = get_option('nobody-group')
761 if not meson.is_cross_build()
762 getent_result = run_command('getent', 'passwd', '65534')
763 if getent_result.returncode() == 0
764 name = getent_result.stdout().split(':')[0]
765 if name != nobody_user
767 '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) +
768 'Your build will result in an user table setup that is incompatible with the local system.')
771 id_result = run_command('id', '-u', nobody_user)
772 if id_result.returncode() == 0
773 id = id_result.stdout().to_int()
776 '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) +
777 'Your build will result in an user table setup that is incompatible with the local system.')
781 getent_result = run_command('getent', 'group', '65534')
782 if getent_result.returncode() == 0
783 name = getent_result.stdout().split(':')[0]
784 if name != nobody_group
786 '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) +
787 'Your build will result in an group table setup that is incompatible with the local system.')
790 id_result = run_command('id', '-g', nobody_group)
791 if id_result.returncode() == 0
792 id = id_result.stdout().to_int()
795 '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) +
796 'Your build will result in an group table setup that is incompatible with the local system.')
800 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
802 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
803 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
806 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
807 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
808 substs.set('NOBODY_USER_NAME', nobody_user)
809 substs.set('NOBODY_GROUP_NAME', nobody_group)
811 tty_gid = get_option('tty-gid')
812 conf.set('TTY_GID', tty_gid)
813 substs.set('TTY_GID', tty_gid)
815 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
816 users_gid = get_option('users-gid')
817 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
819 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
820 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
822 dev_kvm_mode = get_option('dev-kvm-mode')
823 substs.set('DEV_KVM_MODE', dev_kvm_mode)
824 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
825 group_render_mode = get_option('group-render-mode')
826 substs.set('GROUP_RENDER_MODE', group_render_mode)
827 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
829 kill_user_processes = get_option('default-kill-user-processes')
830 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
831 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
832 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
834 dns_servers = get_option('dns-servers')
835 conf.set_quoted('DNS_SERVERS', dns_servers)
836 substs.set('DNS_SERVERS', dns_servers)
838 ntp_servers = get_option('ntp-servers')
839 conf.set_quoted('NTP_SERVERS', ntp_servers)
840 substs.set('NTP_SERVERS', ntp_servers)
842 default_locale = get_option('default-locale')
843 if default_locale == ''
844 if not meson.is_cross_build()
845 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
846 default_locale = run_command(choose_default_locale_sh).stdout().strip()
848 default_locale = 'C.UTF-8'
851 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
853 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
855 substs.set('SUSHELL', get_option('debug-shell'))
856 substs.set('DEBUGTTY', get_option('debug-tty'))
858 enable_debug_hashmap = false
859 enable_debug_mmap_cache = false
860 enable_debug_siphash = false
861 enable_debug_udev = false
862 foreach name : get_option('debug-extra')
864 enable_debug_hashmap = true
865 elif name == 'mmap-cache'
866 enable_debug_mmap_cache = true
867 elif name == 'siphash'
868 enable_debug_siphash = true
870 enable_debug_udev = true
872 message('unknown debug option "@0@", ignoring'.format(name))
875 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
876 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
877 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
878 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
880 conf.set10('VALGRIND', get_option('valgrind'))
881 conf.set10('LOG_TRACE', get_option('log-trace'))
883 #####################################################################
885 threads = dependency('threads')
886 librt = cc.find_library('rt')
887 libm = cc.find_library('m')
888 libdl = cc.find_library('dl')
889 libcrypt = cc.find_library('crypt')
891 libcap = dependency('libcap', required : false)
892 if not libcap.found()
893 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
894 libcap = cc.find_library('cap')
897 libmount = dependency('mount',
898 version : fuzzer_build ? '>= 0' : '>= 2.30')
900 want_seccomp = get_option('seccomp')
901 if want_seccomp != 'false' and not fuzzer_build
902 libseccomp = dependency('libseccomp',
903 version : '>= 2.3.1',
904 required : want_seccomp == 'true')
905 have = libseccomp.found()
910 conf.set10('HAVE_SECCOMP', have)
912 want_selinux = get_option('selinux')
913 if want_selinux != 'false' and not fuzzer_build
914 libselinux = dependency('libselinux',
915 version : '>= 2.1.9',
916 required : want_selinux == 'true')
917 have = libselinux.found()
922 conf.set10('HAVE_SELINUX', have)
924 want_apparmor = get_option('apparmor')
925 if want_apparmor != 'false' and not fuzzer_build
926 libapparmor = dependency('libapparmor',
927 required : want_apparmor == 'true')
928 have = libapparmor.found()
933 conf.set10('HAVE_APPARMOR', have)
935 smack_run_label = get_option('smack-run-label')
936 if smack_run_label != ''
937 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
940 want_polkit = get_option('polkit')
941 install_polkit = false
942 install_polkit_pkla = false
943 if want_polkit != 'false' and not fuzzer_build
944 install_polkit = true
946 libpolkit = dependency('polkit-gobject-1',
948 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
949 message('Old polkit detected, will install pkla files')
950 install_polkit_pkla = true
953 conf.set10('ENABLE_POLKIT', install_polkit)
955 want_acl = get_option('acl')
956 if want_acl != 'false' and not fuzzer_build
957 libacl = cc.find_library('acl', required : want_acl == 'true')
958 have = libacl.found()
963 conf.set10('HAVE_ACL', have)
965 want_audit = get_option('audit')
966 if want_audit != 'false' and not fuzzer_build
967 libaudit = dependency('audit', required : want_audit == 'true')
968 have = libaudit.found()
973 conf.set10('HAVE_AUDIT', have)
975 want_blkid = get_option('blkid')
976 if want_blkid != 'false' and not fuzzer_build
977 libblkid = dependency('blkid', required : want_blkid == 'true')
978 have = libblkid.found()
983 conf.set10('HAVE_BLKID', have)
985 want_kmod = get_option('kmod')
986 if want_kmod != 'false' and not fuzzer_build
987 libkmod = dependency('libkmod',
989 required : want_kmod == 'true')
990 have = libkmod.found()
995 conf.set10('HAVE_KMOD', have)
997 want_pam = get_option('pam')
998 if want_pam != 'false' and not fuzzer_build
999 libpam = cc.find_library('pam', required : want_pam == 'true')
1000 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1001 have = libpam.found() and libpam_misc.found()
1007 conf.set10('HAVE_PAM', have)
1009 want_microhttpd = get_option('microhttpd')
1010 if want_microhttpd != 'false' and not fuzzer_build
1011 libmicrohttpd = dependency('libmicrohttpd',
1012 version : '>= 0.9.33',
1013 required : want_microhttpd == 'true')
1014 have = libmicrohttpd.found()
1019 conf.set10('HAVE_MICROHTTPD', have)
1021 want_libcryptsetup = get_option('libcryptsetup')
1022 if want_libcryptsetup != 'false' and not fuzzer_build
1023 libcryptsetup = dependency('libcryptsetup',
1024 version : '>= 1.6.0',
1025 required : want_libcryptsetup == 'true')
1026 have = libcryptsetup.found()
1027 have_sector = cc.has_member(
1028 'struct crypt_params_plain',
1030 prefix : '#include <libcryptsetup.h>')
1036 conf.set10('HAVE_LIBCRYPTSETUP', have)
1037 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1039 want_libcurl = get_option('libcurl')
1040 if want_libcurl != 'false' and not fuzzer_build
1041 libcurl = dependency('libcurl',
1042 version : '>= 7.32.0',
1043 required : want_libcurl == 'true')
1044 have = libcurl.found()
1049 conf.set10('HAVE_LIBCURL', have)
1051 want_libidn = get_option('libidn')
1052 want_libidn2 = get_option('libidn2')
1053 if want_libidn == 'true' and want_libidn2 == 'true'
1054 error('libidn and libidn2 cannot be requested simultaneously')
1057 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1058 libidn = dependency('libidn',
1059 required : want_libidn == 'true')
1060 have = libidn.found()
1065 conf.set10('HAVE_LIBIDN', have)
1066 if not have and want_libidn2 != 'false' and not fuzzer_build
1067 # libidn is used for both libidn and libidn2 objects
1068 libidn = dependency('libidn2',
1069 required : want_libidn2 == 'true')
1070 have = libidn.found()
1074 conf.set10('HAVE_LIBIDN2', have)
1076 want_libiptc = get_option('libiptc')
1077 if want_libiptc != 'false' and not fuzzer_build
1078 libiptc = dependency('libiptc',
1079 required : want_libiptc == 'true')
1080 have = libiptc.found()
1085 conf.set10('HAVE_LIBIPTC', have)
1087 want_qrencode = get_option('qrencode')
1088 if want_qrencode != 'false' and not fuzzer_build
1089 libqrencode = dependency('libqrencode',
1090 required : want_qrencode == 'true')
1091 have = libqrencode.found()
1096 conf.set10('HAVE_QRENCODE', have)
1098 want_gcrypt = get_option('gcrypt')
1099 if want_gcrypt != 'false' and not fuzzer_build
1100 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1101 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1102 have = libgcrypt.found() and libgpg_error.found()
1107 # link to neither of the libs if one is not found
1111 conf.set10('HAVE_GCRYPT', have)
1113 want_gnutls = get_option('gnutls')
1114 if want_gnutls != 'false' and not fuzzer_build
1115 libgnutls = dependency('gnutls',
1116 version : '>= 3.1.4',
1117 required : want_gnutls == 'true')
1118 have = libgnutls.found()
1123 conf.set10('HAVE_GNUTLS', have)
1125 want_openssl = get_option('openssl')
1126 if want_openssl != 'false' and not fuzzer_build
1127 libopenssl = dependency('openssl',
1128 version : '>= 1.1.0',
1129 required : want_openssl == 'true')
1130 have = libopenssl.found()
1135 conf.set10('HAVE_OPENSSL', have)
1137 want_elfutils = get_option('elfutils')
1138 if want_elfutils != 'false' and not fuzzer_build
1139 libdw = dependency('libdw',
1140 required : want_elfutils == 'true')
1141 have = libdw.found()
1146 conf.set10('HAVE_ELFUTILS', have)
1148 want_zlib = get_option('zlib')
1149 if want_zlib != 'false' and not fuzzer_build
1150 libz = dependency('zlib',
1151 required : want_zlib == 'true')
1157 conf.set10('HAVE_ZLIB', have)
1159 want_bzip2 = get_option('bzip2')
1160 if want_bzip2 != 'false' and not fuzzer_build
1161 libbzip2 = cc.find_library('bz2',
1162 required : want_bzip2 == 'true')
1163 have = libbzip2.found()
1168 conf.set10('HAVE_BZIP2', have)
1170 want_xz = get_option('xz')
1171 if want_xz != 'false' and not fuzzer_build
1172 libxz = dependency('liblzma',
1173 required : want_xz == 'true')
1174 have = libxz.found()
1179 conf.set10('HAVE_XZ', have)
1181 want_lz4 = get_option('lz4')
1182 if want_lz4 != 'false' and not fuzzer_build
1183 liblz4 = dependency('liblz4',
1184 version : '>= 1.3.0',
1185 required : want_lz4 == 'true')
1186 have = liblz4.found()
1191 conf.set10('HAVE_LZ4', have)
1193 want_xkbcommon = get_option('xkbcommon')
1194 if want_xkbcommon != 'false' and not fuzzer_build
1195 libxkbcommon = dependency('xkbcommon',
1196 version : '>= 0.3.0',
1197 required : want_xkbcommon == 'true')
1198 have = libxkbcommon.found()
1203 conf.set10('HAVE_XKBCOMMON', have)
1205 want_pcre2 = get_option('pcre2')
1206 if want_pcre2 != 'false'
1207 libpcre2 = dependency('libpcre2-8',
1208 required : want_pcre2 == 'true')
1209 have = libpcre2.found()
1214 conf.set10('HAVE_PCRE2', have)
1216 want_glib = get_option('glib')
1217 if want_glib != 'false' and not fuzzer_build
1218 libglib = dependency('glib-2.0',
1219 version : '>= 2.22.0',
1220 required : want_glib == 'true')
1221 libgobject = dependency('gobject-2.0',
1222 version : '>= 2.22.0',
1223 required : want_glib == 'true')
1224 libgio = dependency('gio-2.0',
1225 required : want_glib == 'true')
1226 have = libglib.found() and libgobject.found() and libgio.found()
1233 conf.set10('HAVE_GLIB', have)
1235 want_dbus = get_option('dbus')
1236 if want_dbus != 'false' and not fuzzer_build
1237 libdbus = dependency('dbus-1',
1238 version : '>= 1.3.2',
1239 required : want_dbus == 'true')
1240 have = libdbus.found()
1245 conf.set10('HAVE_DBUS', have)
1247 default_dnssec = get_option('default-dnssec')
1249 default_dnssec = 'no'
1251 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1252 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1253 default_dnssec = 'no'
1255 conf.set('DEFAULT_DNSSEC_MODE',
1256 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1257 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1259 dns_over_tls = get_option('dns-over-tls')
1260 if dns_over_tls != 'false'
1261 if dns_over_tls == 'openssl'
1264 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1265 if dns_over_tls == 'gnutls' and not have_gnutls
1266 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1269 if dns_over_tls == 'gnutls' or have_gnutls
1270 have_openssl = false
1272 have_openssl = conf.get('HAVE_OPENSSL') == 1
1273 if dns_over_tls != 'auto' and not have_openssl
1274 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1275 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1278 have = have_gnutls or have_openssl
1282 have_openssl = false
1284 conf.set10('ENABLE_DNS_OVER_TLS', have)
1285 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1286 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1288 default_dns_over_tls = get_option('default-dns-over-tls')
1290 default_dns_over_tls = 'no'
1292 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1293 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1294 default_dns_over_tls = 'no'
1296 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1297 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1298 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1300 want_importd = get_option('importd')
1301 if want_importd != 'false'
1302 have = (conf.get('HAVE_LIBCURL') == 1 and
1303 conf.get('HAVE_ZLIB') == 1 and
1304 conf.get('HAVE_XZ') == 1 and
1305 conf.get('HAVE_GCRYPT') == 1)
1306 if want_importd == 'true' and not have
1307 error('importd support was requested, but dependencies are not available')
1312 conf.set10('ENABLE_IMPORTD', have)
1314 want_remote = get_option('remote')
1315 if want_remote != 'false'
1316 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1317 conf.get('HAVE_LIBCURL') == 1]
1318 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1319 # it's possible to build one without the other. Complain only if
1320 # support was explictly requested. The auxiliary files like sysusers
1321 # config should be installed when any of the programs are built.
1322 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1323 error('remote support was requested, but dependencies are not available')
1325 have = have_deps[0] or have_deps[1]
1329 conf.set10('ENABLE_REMOTE', have)
1331 foreach term : ['utmp',
1363 have = get_option(term)
1364 name = 'ENABLE_' + term.underscorify().to_upper()
1365 conf.set10(name, have)
1368 foreach tuple : [['nss-mymachines', 'machined'],
1369 ['nss-resolve', 'resolve']]
1370 want = get_option(tuple[0])
1372 have = get_option(tuple[1])
1373 if want == 'true' and not have
1374 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1379 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1380 conf.set10(name, have)
1384 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1385 'ENABLE_NSS_MYMACHINES',
1386 'ENABLE_NSS_RESOLVE',
1387 'ENABLE_NSS_SYSTEMD']
1388 if conf.get(term) == 1
1392 conf.set10('ENABLE_NSS', enable_nss)
1394 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1399 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1401 #####################################################################
1403 if get_option('efi')
1404 efi_arch = host_machine.cpu_family()
1406 if efi_arch == 'x86'
1407 EFI_MACHINE_TYPE_NAME = 'ia32'
1408 gnu_efi_arch = 'ia32'
1409 elif efi_arch == 'x86_64'
1410 EFI_MACHINE_TYPE_NAME = 'x64'
1411 gnu_efi_arch = 'x86_64'
1412 elif efi_arch == 'arm'
1413 EFI_MACHINE_TYPE_NAME = 'arm'
1414 gnu_efi_arch = 'arm'
1415 elif efi_arch == 'aarch64'
1416 EFI_MACHINE_TYPE_NAME = 'aa64'
1417 gnu_efi_arch = 'aarch64'
1419 EFI_MACHINE_TYPE_NAME = ''
1424 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1426 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1430 conf.set10('ENABLE_EFI', have)
1432 #####################################################################
1434 config_h = configure_file(
1435 output : 'config.h',
1436 configuration : conf)
1438 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1440 includes = include_directories('src/basic',
1444 'src/journal-remote',
1448 'src/time-wait-sync',
1454 'src/libsystemd/sd-bus',
1455 'src/libsystemd/sd-device',
1456 'src/libsystemd/sd-event',
1457 'src/libsystemd/sd-hwdb',
1458 'src/libsystemd/sd-id128',
1459 'src/libsystemd/sd-netlink',
1460 'src/libsystemd/sd-network',
1461 'src/libsystemd/sd-resolve',
1462 'src/libsystemd-network',
1465 add_project_arguments('-include', 'config.h', language : 'c')
1467 generate_gperfs = find_program('tools/generate-gperfs.py')
1471 subdir('src/systemd')
1473 subdir('src/libsystemd')
1474 subdir('src/libsystemd-network')
1475 subdir('src/journal')
1478 libjournal_core = static_library(
1480 libjournal_core_sources,
1482 include_directories : includes,
1485 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1486 libsystemd = shared_library(
1489 version : libsystemd_version,
1490 include_directories : includes,
1491 link_args : ['-shared',
1492 '-Wl,--version-script=' + libsystemd_sym_path],
1493 link_with : [libbasic,
1495 link_whole : [libsystemd_static,
1497 dependencies : [threads,
1501 link_depends : libsystemd_sym,
1503 install_dir : rootlibdir)
1505 static_libsystemd = get_option('static-libsystemd')
1506 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1508 install_libsystemd_static = static_library(
1511 journal_client_sources,
1513 basic_gcrypt_sources,
1515 include_directories : includes,
1516 build_by_default : static_libsystemd != 'false',
1517 install : static_libsystemd != 'false',
1518 install_dir : rootlibdir,
1519 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1520 dependencies : [threads,
1529 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1531 ############################################################
1533 # binaries that have --help and are intended for use by humans,
1534 # usually, but not always, installed in /bin.
1535 public_programs = []
1537 subdir('src/libudev')
1538 subdir('src/shared')
1540 subdir('src/shutdown')
1542 subdir('src/network')
1544 subdir('src/analyze')
1545 subdir('src/journal-remote')
1546 subdir('src/coredump')
1547 subdir('src/hostname')
1548 subdir('src/import')
1549 subdir('src/kernel-install')
1550 subdir('src/locale')
1551 subdir('src/machine')
1552 subdir('src/portable')
1553 subdir('src/nspawn')
1554 subdir('src/resolve')
1555 subdir('src/timedate')
1556 subdir('src/timesync')
1557 subdir('src/vconsole')
1558 subdir('src/boot/efi')
1565 ############################################################
1567 # only static linking apart from libdl, to make sure that the
1568 # module is linked to all libraries that it uses.
1569 test_dlopen = executable(
1573 include_directories : includes,
1574 link_with : [libbasic],
1575 dependencies : [libdl],
1576 build_by_default : want_tests != 'false')
1578 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1579 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1580 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1581 ['resolve', 'ENABLE_NSS_RESOLVE']]
1583 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1587 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1588 version_script_arg = join_paths(project_source_root, sym)
1590 nss = shared_library(
1592 'src/nss-@0@/nss-@0@.c'.format(module),
1595 include_directories : includes,
1596 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1597 link_args : ['-Wl,-z,nodelete',
1599 '-Wl,--version-script=' + version_script_arg,
1601 link_with : [libsystemd_static,
1603 dependencies : [threads,
1607 install_dir : rootlibdir)
1609 # We cannot use shared_module because it does not support version suffix.
1610 # Unfortunately shared_library insists on creating the symlink…
1611 meson.add_install_script('sh', '-c',
1612 'rm $DESTDIR@0@/libnss_@1@.so'
1613 .format(rootlibdir, module))
1615 if want_tests != 'false'
1616 test('dlopen-nss_' + module,
1618 # path to dlopen must include a slash
1619 args : nss.full_path())
1624 ############################################################
1626 executable('systemd',
1628 include_directories : includes,
1629 link_with : [libcore,
1631 dependencies : [versiondep,
1638 install_rpath : rootlibexecdir,
1640 install_dir : rootlibexecdir)
1642 meson.add_install_script(meson_make_symlink,
1643 join_paths(rootlibexecdir, 'systemd'),
1644 join_paths(rootsbindir, 'init'))
1646 exe = executable('systemd-analyze',
1647 systemd_analyze_sources,
1648 include_directories : includes,
1649 link_with : [libcore,
1651 dependencies : [versiondep,
1658 install_rpath : rootlibexecdir,
1660 public_programs += exe
1662 executable('systemd-journald',
1663 systemd_journald_sources,
1664 include_directories : includes,
1665 link_with : [libjournal_core,
1667 dependencies : [threads,
1671 install_rpath : rootlibexecdir,
1673 install_dir : rootlibexecdir)
1675 exe = executable('systemd-cat',
1676 systemd_cat_sources,
1677 include_directories : includes,
1678 link_with : [libjournal_core,
1680 dependencies : [threads],
1681 install_rpath : rootlibexecdir,
1683 public_programs += exe
1685 exe = executable('journalctl',
1687 include_directories : includes,
1688 link_with : [libshared],
1689 dependencies : [threads,
1694 install_rpath : rootlibexecdir,
1696 install_dir : rootbindir)
1697 public_programs += exe
1699 executable('systemd-getty-generator',
1700 'src/getty-generator/getty-generator.c',
1701 include_directories : includes,
1702 link_with : [libshared],
1703 install_rpath : rootlibexecdir,
1705 install_dir : systemgeneratordir)
1707 executable('systemd-debug-generator',
1708 'src/debug-generator/debug-generator.c',
1709 include_directories : includes,
1710 link_with : [libshared],
1711 install_rpath : rootlibexecdir,
1713 install_dir : systemgeneratordir)
1715 executable('systemd-run-generator',
1716 'src/run-generator/run-generator.c',
1717 include_directories : includes,
1718 link_with : [libshared],
1719 install_rpath : rootlibexecdir,
1721 install_dir : systemgeneratordir)
1723 executable('systemd-fstab-generator',
1724 'src/fstab-generator/fstab-generator.c',
1725 include_directories : includes,
1726 link_with : [libcore_shared,
1728 install_rpath : rootlibexecdir,
1730 install_dir : systemgeneratordir)
1732 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1733 executable('30-systemd-environment-d-generator',
1734 'src/environment-d-generator/environment-d-generator.c',
1735 include_directories : includes,
1736 link_with : [libshared],
1737 install_rpath : rootlibexecdir,
1739 install_dir : userenvgeneratordir)
1741 meson.add_install_script(meson_make_symlink,
1742 join_paths(sysconfdir, 'environment'),
1743 join_paths(environmentdir, '99-environment.conf'))
1746 if conf.get('ENABLE_HIBERNATE') == 1
1747 executable('systemd-hibernate-resume-generator',
1748 'src/hibernate-resume/hibernate-resume-generator.c',
1749 include_directories : includes,
1750 link_with : [libshared],
1751 install_rpath : rootlibexecdir,
1753 install_dir : systemgeneratordir)
1755 executable('systemd-hibernate-resume',
1756 'src/hibernate-resume/hibernate-resume.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 install_rpath : rootlibexecdir,
1761 install_dir : rootlibexecdir)
1764 if conf.get('HAVE_BLKID') == 1
1765 executable('systemd-gpt-auto-generator',
1766 'src/gpt-auto-generator/gpt-auto-generator.c',
1767 'src/shared/blkid-util.h',
1768 include_directories : includes,
1769 link_with : [libshared],
1770 dependencies : libblkid,
1771 install_rpath : rootlibexecdir,
1773 install_dir : systemgeneratordir)
1775 exe = executable('systemd-dissect',
1776 'src/dissect/dissect.c',
1777 include_directories : includes,
1778 link_with : [libshared],
1779 install_rpath : rootlibexecdir,
1781 install_dir : rootlibexecdir)
1782 public_programs += exe
1785 if conf.get('ENABLE_RESOLVE') == 1
1786 executable('systemd-resolved',
1787 systemd_resolved_sources,
1788 include_directories : includes,
1789 link_with : [libshared,
1791 libsystemd_resolve_core],
1792 dependencies : systemd_resolved_dependencies,
1793 install_rpath : rootlibexecdir,
1795 install_dir : rootlibexecdir)
1797 exe = executable('resolvectl',
1799 include_directories : includes,
1800 link_with : [libshared,
1802 libsystemd_resolve_core],
1803 dependencies : [threads,
1807 install_rpath : rootlibexecdir,
1809 public_programs += exe
1811 meson.add_install_script(meson_make_symlink,
1812 join_paths(bindir, 'resolvectl'),
1813 join_paths(rootsbindir, 'resolvconf'))
1815 meson.add_install_script(meson_make_symlink,
1816 join_paths(bindir, 'resolvectl'),
1817 join_paths(bindir, 'systemd-resolve'))
1820 if conf.get('ENABLE_LOGIND') == 1
1821 executable('systemd-logind',
1822 systemd_logind_sources,
1823 include_directories : includes,
1824 link_with : [liblogind_core,
1826 dependencies : [threads,
1828 install_rpath : rootlibexecdir,
1830 install_dir : rootlibexecdir)
1832 exe = executable('loginctl',
1834 include_directories : includes,
1835 link_with : [libshared],
1836 dependencies : [threads,
1839 install_rpath : rootlibexecdir,
1841 install_dir : rootbindir)
1842 public_programs += exe
1844 exe = executable('systemd-inhibit',
1845 'src/login/inhibit.c',
1846 include_directories : includes,
1847 link_with : [libshared],
1848 install_rpath : rootlibexecdir,
1850 install_dir : rootbindir)
1851 public_programs += exe
1853 if conf.get('HAVE_PAM') == 1
1854 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1855 pam_systemd = shared_library(
1859 include_directories : includes,
1860 link_args : ['-shared',
1861 '-Wl,--version-script=' + version_script_arg],
1862 link_with : [libsystemd_static,
1864 dependencies : [threads,
1867 link_depends : pam_systemd_sym,
1869 install_dir : pamlibdir)
1871 if want_tests != 'false'
1872 test('dlopen-pam_systemd',
1874 # path to dlopen must include a slash
1875 args : pam_systemd.full_path())
1879 executable('systemd-user-runtime-dir',
1880 user_runtime_dir_sources,
1881 include_directories : includes,
1882 link_with : [libshared],
1883 install_rpath : rootlibexecdir,
1885 install_dir : rootlibexecdir)
1888 if conf.get('HAVE_PAM') == 1
1889 executable('systemd-user-sessions',
1890 'src/user-sessions/user-sessions.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootlibexecdir)
1898 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1899 exe = executable('bootctl',
1900 'src/boot/bootctl.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 dependencies : [libblkid],
1904 install_rpath : rootlibexecdir,
1906 public_programs += exe
1908 executable('systemd-bless-boot',
1909 'src/boot/bless-boot.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 dependencies : [libblkid],
1913 install_rpath : rootlibexecdir,
1915 install_dir : rootlibexecdir)
1917 executable('systemd-bless-boot-generator',
1918 'src/boot/bless-boot-generator.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 install_rpath : rootlibexecdir,
1923 install_dir : systemgeneratordir)
1926 executable('systemd-boot-check-no-failures',
1927 'src/boot/boot-check-no-failures.c',
1928 include_directories : includes,
1929 link_with : [libshared],
1930 dependencies : [libblkid],
1931 install_rpath : rootlibexecdir,
1933 install_dir : rootlibexecdir)
1935 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1936 include_directories : includes,
1937 link_with : [libshared],
1938 dependencies : [threads],
1939 install_rpath : rootlibexecdir,
1941 public_programs += exe
1944 if get_option('link-systemctl-shared')
1945 systemctl_link_with = [libshared]
1947 systemctl_link_with = [libsystemd_static,
1953 exe = executable('systemctl',
1954 'src/systemctl/systemctl.c',
1955 'src/systemctl/sysv-compat.h',
1956 'src/systemctl/sysv-compat.c',
1957 include_directories : includes,
1958 link_with : systemctl_link_with,
1959 dependencies : [threads,
1964 install_rpath : rootlibexecdir,
1966 install_dir : rootbindir)
1967 public_programs += exe
1969 if conf.get('ENABLE_PORTABLED') == 1
1970 executable('systemd-portabled',
1971 systemd_portabled_sources,
1972 include_directories : includes,
1973 link_with : [libshared],
1974 dependencies : [threads],
1975 install_rpath : rootlibexecdir,
1977 install_dir : rootlibexecdir)
1979 exe = executable('portablectl', 'src/portable/portablectl.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 dependencies : [threads],
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootbindir)
1986 public_programs += exe
1989 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1990 meson.add_install_script(meson_make_symlink,
1991 join_paths(rootbindir, 'systemctl'),
1992 join_paths(rootsbindir, alias))
1995 if conf.get('ENABLE_BACKLIGHT') == 1
1996 executable('systemd-backlight',
1997 'src/backlight/backlight.c',
1998 include_directories : includes,
1999 link_with : [libshared],
2000 install_rpath : rootlibexecdir,
2002 install_dir : rootlibexecdir)
2005 if conf.get('ENABLE_RFKILL') == 1
2006 executable('systemd-rfkill',
2007 'src/rfkill/rfkill.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2012 install_dir : rootlibexecdir)
2015 executable('systemd-system-update-generator',
2016 'src/system-update-generator/system-update-generator.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 install_rpath : rootlibexecdir,
2021 install_dir : systemgeneratordir)
2023 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2024 executable('systemd-cryptsetup',
2025 'src/cryptsetup/cryptsetup.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [libcryptsetup],
2029 install_rpath : rootlibexecdir,
2031 install_dir : rootlibexecdir)
2033 executable('systemd-cryptsetup-generator',
2034 'src/cryptsetup/cryptsetup-generator.c',
2035 include_directories : includes,
2036 link_with : [libshared],
2037 dependencies : [libcryptsetup],
2038 install_rpath : rootlibexecdir,
2040 install_dir : systemgeneratordir)
2042 executable('systemd-veritysetup',
2043 'src/veritysetup/veritysetup.c',
2044 include_directories : includes,
2045 link_with : [libshared],
2046 dependencies : [libcryptsetup],
2047 install_rpath : rootlibexecdir,
2049 install_dir : rootlibexecdir)
2051 executable('systemd-veritysetup-generator',
2052 'src/veritysetup/veritysetup-generator.c',
2053 include_directories : includes,
2054 link_with : [libshared],
2055 dependencies : [libcryptsetup],
2056 install_rpath : rootlibexecdir,
2058 install_dir : systemgeneratordir)
2061 if conf.get('HAVE_SYSV_COMPAT') == 1
2062 executable('systemd-sysv-generator',
2063 'src/sysv-generator/sysv-generator.c',
2064 include_directories : includes,
2065 link_with : [libshared],
2066 install_rpath : rootlibexecdir,
2068 install_dir : systemgeneratordir)
2070 executable('systemd-rc-local-generator',
2071 'src/rc-local-generator/rc-local-generator.c',
2072 include_directories : includes,
2073 link_with : [libshared],
2074 install_rpath : rootlibexecdir,
2076 install_dir : systemgeneratordir)
2079 if conf.get('ENABLE_HOSTNAMED') == 1
2080 executable('systemd-hostnamed',
2081 'src/hostname/hostnamed.c',
2082 include_directories : includes,
2083 link_with : [libshared],
2084 install_rpath : rootlibexecdir,
2086 install_dir : rootlibexecdir)
2088 exe = executable('hostnamectl',
2089 'src/hostname/hostnamectl.c',
2090 include_directories : includes,
2091 link_with : [libshared],
2092 install_rpath : rootlibexecdir,
2094 public_programs += exe
2097 if conf.get('ENABLE_LOCALED') == 1
2098 if conf.get('HAVE_XKBCOMMON') == 1
2099 # logind will load libxkbcommon.so dynamically on its own
2105 executable('systemd-localed',
2106 systemd_localed_sources,
2107 include_directories : includes,
2108 link_with : [libshared],
2109 dependencies : deps,
2110 install_rpath : rootlibexecdir,
2112 install_dir : rootlibexecdir)
2114 exe = executable('localectl',
2116 include_directories : includes,
2117 link_with : [libshared],
2118 install_rpath : rootlibexecdir,
2120 public_programs += exe
2123 if conf.get('ENABLE_TIMEDATED') == 1
2124 executable('systemd-timedated',
2125 'src/timedate/timedated.c',
2126 include_directories : includes,
2127 link_with : [libshared],
2128 install_rpath : rootlibexecdir,
2130 install_dir : rootlibexecdir)
2133 if conf.get('ENABLE_TIMEDATECTL') == 1
2134 exe = executable('timedatectl',
2135 'src/timedate/timedatectl.c',
2136 include_directories : includes,
2137 install_rpath : rootlibexecdir,
2138 link_with : [libshared],
2139 dependencies : [libm],
2141 public_programs += exe
2144 if conf.get('ENABLE_TIMESYNCD') == 1
2145 executable('systemd-timesyncd',
2146 systemd_timesyncd_sources,
2147 include_directories : includes,
2148 link_with : [libshared],
2149 dependencies : [threads,
2151 install_rpath : rootlibexecdir,
2153 install_dir : rootlibexecdir)
2155 executable('systemd-time-wait-sync',
2156 'src/time-wait-sync/time-wait-sync.c',
2157 include_directories : includes,
2158 link_with : [libshared],
2159 install_rpath : rootlibexecdir,
2161 install_dir : rootlibexecdir)
2164 if conf.get('ENABLE_MACHINED') == 1
2165 executable('systemd-machined',
2166 systemd_machined_sources,
2167 include_directories : includes,
2168 link_with : [libmachine_core,
2170 install_rpath : rootlibexecdir,
2172 install_dir : rootlibexecdir)
2174 exe = executable('machinectl',
2175 'src/machine/machinectl.c',
2176 include_directories : includes,
2177 link_with : [libshared],
2178 dependencies : [threads,
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootbindir)
2184 public_programs += exe
2187 if conf.get('ENABLE_IMPORTD') == 1
2188 executable('systemd-importd',
2189 systemd_importd_sources,
2190 include_directories : includes,
2191 link_with : [libshared],
2192 dependencies : [threads],
2193 install_rpath : rootlibexecdir,
2195 install_dir : rootlibexecdir)
2197 systemd_pull = executable('systemd-pull',
2198 systemd_pull_sources,
2199 include_directories : includes,
2200 link_with : [libshared],
2201 dependencies : [versiondep,
2207 install_rpath : rootlibexecdir,
2209 install_dir : rootlibexecdir)
2211 systemd_import = executable('systemd-import',
2212 systemd_import_sources,
2213 include_directories : includes,
2214 link_with : [libshared],
2215 dependencies : [libcurl,
2219 install_rpath : rootlibexecdir,
2221 install_dir : rootlibexecdir)
2223 systemd_import_fs = executable('systemd-import-fs',
2224 systemd_import_fs_sources,
2225 include_directories : includes,
2226 link_with : [libshared],
2227 install_rpath : rootlibexecdir,
2229 install_dir : rootlibexecdir)
2231 systemd_export = executable('systemd-export',
2232 systemd_export_sources,
2233 include_directories : includes,
2234 link_with : [libshared],
2235 dependencies : [libcurl,
2239 install_rpath : rootlibexecdir,
2241 install_dir : rootlibexecdir)
2243 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2246 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2247 exe = executable('systemd-journal-upload',
2248 systemd_journal_upload_sources,
2249 include_directories : includes,
2250 link_with : [libshared],
2251 dependencies : [versiondep,
2257 install_rpath : rootlibexecdir,
2259 install_dir : rootlibexecdir)
2260 public_programs += exe
2263 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2264 s_j_remote = executable('systemd-journal-remote',
2265 systemd_journal_remote_sources,
2266 include_directories : includes,
2267 link_with : [libshared,
2268 libsystemd_journal_remote],
2269 dependencies : [threads,
2274 install_rpath : rootlibexecdir,
2276 install_dir : rootlibexecdir)
2278 s_j_gatewayd = executable('systemd-journal-gatewayd',
2279 systemd_journal_gatewayd_sources,
2280 include_directories : includes,
2281 link_with : [libshared],
2282 dependencies : [threads,
2287 install_rpath : rootlibexecdir,
2289 install_dir : rootlibexecdir)
2290 public_programs += [s_j_remote, s_j_gatewayd]
2293 if conf.get('ENABLE_COREDUMP') == 1
2294 executable('systemd-coredump',
2295 systemd_coredump_sources,
2296 include_directories : includes,
2297 link_with : [libshared],
2298 dependencies : [threads,
2303 install_rpath : rootlibexecdir,
2305 install_dir : rootlibexecdir)
2307 exe = executable('coredumpctl',
2308 coredumpctl_sources,
2309 include_directories : includes,
2310 link_with : [libshared],
2311 dependencies : [threads,
2314 install_rpath : rootlibexecdir,
2316 public_programs += exe
2319 if conf.get('ENABLE_BINFMT') == 1
2320 exe = executable('systemd-binfmt',
2321 'src/binfmt/binfmt.c',
2322 include_directories : includes,
2323 link_with : [libshared],
2324 install_rpath : rootlibexecdir,
2326 install_dir : rootlibexecdir)
2327 public_programs += exe
2329 meson.add_install_script('sh', '-c',
2330 mkdir_p.format(binfmtdir))
2331 meson.add_install_script('sh', '-c',
2332 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2335 if conf.get('ENABLE_VCONSOLE') == 1
2336 executable('systemd-vconsole-setup',
2337 'src/vconsole/vconsole-setup.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2342 install_dir : rootlibexecdir)
2345 if conf.get('ENABLE_RANDOMSEED') == 1
2346 executable('systemd-random-seed',
2347 'src/random-seed/random-seed.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2355 if conf.get('ENABLE_FIRSTBOOT') == 1
2356 executable('systemd-firstboot',
2357 'src/firstboot/firstboot.c',
2358 include_directories : includes,
2359 link_with : [libshared],
2360 dependencies : [libcrypt],
2361 install_rpath : rootlibexecdir,
2363 install_dir : rootbindir)
2366 executable('systemd-remount-fs',
2367 'src/remount-fs/remount-fs.c',
2368 include_directories : includes,
2369 link_with : [libcore_shared,
2371 install_rpath : rootlibexecdir,
2373 install_dir : rootlibexecdir)
2375 executable('systemd-machine-id-setup',
2376 'src/machine-id-setup/machine-id-setup-main.c',
2377 include_directories : includes,
2378 link_with : [libcore_shared,
2380 install_rpath : rootlibexecdir,
2382 install_dir : rootbindir)
2384 executable('systemd-fsck',
2386 include_directories : includes,
2387 link_with : [libshared],
2388 install_rpath : rootlibexecdir,
2390 install_dir : rootlibexecdir)
2392 executable('systemd-growfs',
2393 'src/partition/growfs.c',
2394 include_directories : includes,
2395 link_with : [libshared],
2396 dependencies : [libcryptsetup],
2397 install_rpath : rootlibexecdir,
2399 install_dir : rootlibexecdir)
2401 executable('systemd-makefs',
2402 'src/partition/makefs.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 install_rpath : rootlibexecdir,
2407 install_dir : rootlibexecdir)
2409 executable('systemd-sleep',
2410 'src/sleep/sleep.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 install_rpath : rootlibexecdir,
2415 install_dir : rootlibexecdir)
2417 install_data('src/sleep/sleep.conf',
2418 install_dir : pkgsysconfdir)
2420 exe = executable('systemd-sysctl',
2421 'src/sysctl/sysctl.c',
2422 include_directories : includes,
2423 link_with : [libshared],
2424 install_rpath : rootlibexecdir,
2426 install_dir : rootlibexecdir)
2427 public_programs += exe
2429 executable('systemd-ac-power',
2430 'src/ac-power/ac-power.c',
2431 include_directories : includes,
2432 link_with : [libshared],
2433 install_rpath : rootlibexecdir,
2435 install_dir : rootlibexecdir)
2437 exe = executable('systemd-detect-virt',
2438 'src/detect-virt/detect-virt.c',
2439 include_directories : includes,
2440 link_with : [libshared],
2441 install_rpath : rootlibexecdir,
2443 public_programs += exe
2445 exe = executable('systemd-delta',
2446 'src/delta/delta.c',
2447 include_directories : includes,
2448 link_with : [libshared],
2449 install_rpath : rootlibexecdir,
2451 public_programs += exe
2453 exe = executable('systemd-escape',
2454 'src/escape/escape.c',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2459 install_dir : rootbindir)
2460 public_programs += exe
2462 exe = executable('systemd-notify',
2463 'src/notify/notify.c',
2464 include_directories : includes,
2465 link_with : [libshared],
2466 install_rpath : rootlibexecdir,
2468 install_dir : rootbindir)
2469 public_programs += exe
2471 executable('systemd-volatile-root',
2472 'src/volatile-root/volatile-root.c',
2473 include_directories : includes,
2474 link_with : [libshared],
2475 install_rpath : rootlibexecdir,
2477 install_dir : rootlibexecdir)
2479 executable('systemd-cgroups-agent',
2480 'src/cgroups-agent/cgroups-agent.c',
2481 include_directories : includes,
2482 link_with : [libshared],
2483 install_rpath : rootlibexecdir,
2485 install_dir : rootlibexecdir)
2487 exe = executable('systemd-id128',
2488 'src/id128/id128.c',
2489 include_directories : includes,
2490 link_with : [libshared],
2491 install_rpath : rootlibexecdir,
2493 public_programs += exe
2495 exe = executable('systemd-path',
2497 include_directories : includes,
2498 link_with : [libshared],
2499 install_rpath : rootlibexecdir,
2501 public_programs += exe
2503 exe = executable('systemd-ask-password',
2504 'src/ask-password/ask-password.c',
2505 include_directories : includes,
2506 link_with : [libshared],
2507 install_rpath : rootlibexecdir,
2509 install_dir : rootbindir)
2510 public_programs += exe
2512 executable('systemd-reply-password',
2513 'src/reply-password/reply-password.c',
2514 include_directories : includes,
2515 link_with : [libshared],
2516 install_rpath : rootlibexecdir,
2518 install_dir : rootlibexecdir)
2520 exe = executable('systemd-tty-ask-password-agent',
2521 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2522 include_directories : includes,
2523 link_with : [libshared],
2524 install_rpath : rootlibexecdir,
2526 install_dir : rootbindir)
2527 public_programs += exe
2529 exe = executable('systemd-cgls',
2531 include_directories : includes,
2532 link_with : [libshared],
2533 install_rpath : rootlibexecdir,
2535 public_programs += exe
2537 exe = executable('systemd-cgtop',
2538 'src/cgtop/cgtop.c',
2539 include_directories : includes,
2540 link_with : [libshared],
2541 install_rpath : rootlibexecdir,
2543 public_programs += exe
2545 executable('systemd-initctl',
2546 'src/initctl/initctl.c',
2547 include_directories : includes,
2548 link_with : [libshared],
2549 install_rpath : rootlibexecdir,
2551 install_dir : rootlibexecdir)
2553 exe = executable('systemd-mount',
2554 'src/mount/mount-tool.c',
2555 include_directories : includes,
2556 link_with : [libshared],
2557 install_rpath : rootlibexecdir,
2559 public_programs += exe
2561 meson.add_install_script(meson_make_symlink,
2562 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2564 exe = executable('systemd-run',
2566 include_directories : includes,
2567 link_with : [libshared],
2568 install_rpath : rootlibexecdir,
2570 public_programs += exe
2572 exe = executable('systemd-stdio-bridge',
2573 'src/stdio-bridge/stdio-bridge.c',
2574 include_directories : includes,
2575 link_with : [libshared],
2576 dependencies : [versiondep],
2577 install_rpath : rootlibexecdir,
2579 public_programs += exe
2581 exe = executable('busctl',
2582 'src/busctl/busctl.c',
2583 'src/busctl/busctl-introspect.c',
2584 'src/busctl/busctl-introspect.h',
2585 include_directories : includes,
2586 link_with : [libshared],
2587 install_rpath : rootlibexecdir,
2589 public_programs += exe
2591 if conf.get('ENABLE_SYSUSERS') == 1
2592 exe = executable('systemd-sysusers',
2593 'src/sysusers/sysusers.c',
2594 include_directories : includes,
2595 link_with : [libshared],
2596 install_rpath : rootlibexecdir,
2598 install_dir : rootbindir)
2599 public_programs += exe
2602 if conf.get('ENABLE_TMPFILES') == 1
2603 exe = executable('systemd-tmpfiles',
2604 'src/tmpfiles/tmpfiles.c',
2605 include_directories : includes,
2606 link_with : [libshared],
2607 dependencies : [libacl],
2608 install_rpath : rootlibexecdir,
2610 install_dir : rootbindir)
2611 public_programs += exe
2613 if want_tests != 'false'
2614 test('test-systemd-tmpfiles',
2615 test_systemd_tmpfiles_py,
2616 # https://github.com/mesonbuild/meson/issues/2681
2617 args : exe.full_path())
2621 if conf.get('ENABLE_HWDB') == 1
2622 exe = executable('systemd-hwdb',
2624 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2625 include_directories : includes,
2626 link_with : [libudev_static],
2627 install_rpath : udev_rpath,
2629 install_dir : rootbindir)
2630 public_programs += exe
2633 if conf.get('ENABLE_QUOTACHECK') == 1
2634 executable('systemd-quotacheck',
2635 'src/quotacheck/quotacheck.c',
2636 include_directories : includes,
2637 link_with : [libshared],
2638 install_rpath : rootlibexecdir,
2640 install_dir : rootlibexecdir)
2643 exe = executable('systemd-socket-proxyd',
2644 'src/socket-proxy/socket-proxyd.c',
2645 include_directories : includes,
2646 link_with : [libshared],
2647 dependencies : [threads],
2648 install_rpath : rootlibexecdir,
2650 install_dir : rootlibexecdir)
2651 public_programs += exe
2653 exe = executable('systemd-udevd',
2654 systemd_udevd_sources,
2655 include_directories : includes,
2656 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2657 link_with : [libudev_core,
2660 dependencies : [versiondep,
2666 install_rpath : udev_rpath,
2668 install_dir : rootlibexecdir)
2669 public_programs += exe
2671 exe = executable('udevadm',
2673 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2674 include_directories : includes,
2675 link_with : [libudev_core,
2678 dependencies : [versiondep,
2684 install_rpath : udev_rpath,
2686 install_dir : rootbindir)
2687 public_programs += exe
2689 executable('systemd-shutdown',
2690 systemd_shutdown_sources,
2691 include_directories : includes,
2692 link_with : [libcore_shared,
2694 dependencies : [libmount],
2695 install_rpath : rootlibexecdir,
2697 install_dir : rootlibexecdir)
2699 executable('systemd-update-done',
2700 'src/update-done/update-done.c',
2701 include_directories : includes,
2702 link_with : [libshared],
2703 install_rpath : rootlibexecdir,
2705 install_dir : rootlibexecdir)
2707 executable('systemd-update-utmp',
2708 'src/update-utmp/update-utmp.c',
2709 include_directories : includes,
2710 link_with : [libshared],
2711 dependencies : [libaudit],
2712 install_rpath : rootlibexecdir,
2714 install_dir : rootlibexecdir)
2716 if conf.get('HAVE_KMOD') == 1
2717 executable('systemd-modules-load',
2718 'src/modules-load/modules-load.c',
2719 include_directories : includes,
2720 link_with : [libshared],
2721 dependencies : [libkmod],
2722 install_rpath : rootlibexecdir,
2724 install_dir : rootlibexecdir)
2726 meson.add_install_script('sh', '-c',
2727 mkdir_p.format(modulesloaddir))
2728 meson.add_install_script('sh', '-c',
2729 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2732 exe = executable('systemd-nspawn',
2733 systemd_nspawn_sources,
2734 include_directories : includes,
2735 link_with : [libcore_shared,
2738 dependencies : [libblkid,
2740 install_rpath : rootlibexecdir,
2742 public_programs += exe
2744 if conf.get('ENABLE_NETWORKD') == 1
2745 executable('systemd-networkd',
2746 systemd_networkd_sources,
2747 include_directories : includes,
2748 link_with : [libnetworkd_core,
2752 dependencies : [threads],
2753 install_rpath : rootlibexecdir,
2755 install_dir : rootlibexecdir)
2757 executable('systemd-networkd-wait-online',
2758 systemd_networkd_wait_online_sources,
2759 include_directories : includes,
2760 link_with : [libnetworkd_core,
2762 install_rpath : rootlibexecdir,
2764 install_dir : rootlibexecdir)
2766 exe = executable('networkctl',
2768 include_directories : includes,
2769 link_with : [libsystemd_network,
2771 install_rpath : rootlibexecdir,
2773 install_dir : rootbindir)
2774 public_programs += exe
2777 executable('systemd-sulogin-shell',
2778 ['src/sulogin-shell/sulogin-shell.c'],
2779 include_directories : includes,
2780 link_with : [libshared],
2781 install_rpath : rootlibexecdir,
2783 install_dir : rootlibexecdir)
2785 ############################################################
2788 'systemd-runtest.env',
2789 output : 'systemd-runtest.env',
2790 command : ['sh', '-c', '{ ' +
2791 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2792 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2794 build_by_default : true)
2796 foreach tuple : tests
2798 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2799 dependencies = tuple[2]
2800 condition = tuple.length() >= 4 ? tuple[3] : ''
2801 type = tuple.length() >= 5 ? tuple[4] : ''
2802 defs = tuple.length() >= 6 ? tuple[5] : []
2803 incs = tuple.length() >= 7 ? tuple[6] : includes
2806 name = sources[0].split('/')[-1].split('.')[0]
2807 if type.startswith('timeout=')
2808 timeout = type.split('=')[1].to_int()
2812 if condition == '' or conf.get(condition) == 1
2816 include_directories : incs,
2817 link_with : link_with,
2818 dependencies : [versiondep,
2821 build_by_default : want_tests != 'false',
2822 install_rpath : rootlibexecdir,
2823 install : install_tests,
2824 install_dir : join_paths(testsdir, type))
2827 message('@0@ is a manual test'.format(name))
2828 elif type == 'unsafe' and want_tests != 'unsafe'
2829 message('@0@ is an unsafe test'.format(name))
2830 elif want_tests != 'false'
2836 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2841 'test-libsystemd-sym',
2842 test_libsystemd_sym_c,
2843 include_directories : includes,
2844 link_with : [libsystemd],
2845 build_by_default : want_tests != 'false',
2846 install : install_tests,
2847 install_dir : testsdir)
2848 if want_tests != 'false'
2849 test('test-libsystemd-sym', exe)
2853 'test-libsystemd-static-sym',
2854 test_libsystemd_sym_c,
2855 include_directories : includes,
2856 link_with : [install_libsystemd_static],
2857 dependencies : [threads], # threads is already included in dependencies on the library,
2858 # but does not seem to get propagated. Add here as a work-around.
2859 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2860 install : install_tests and static_libsystemd_pic,
2861 install_dir : testsdir)
2862 if want_tests != 'false' and static_libsystemd_pic
2863 test('test-libsystemd-static-sym', exe)
2869 include_directories : includes,
2870 c_args : '-Wno-deprecated-declarations',
2871 link_with : [libudev],
2872 build_by_default : want_tests != 'false',
2873 install : install_tests,
2874 install_dir : testsdir)
2875 if want_tests != 'false'
2876 test('test-libudev-sym', exe)
2880 'test-libudev-static-sym',
2882 include_directories : includes,
2883 c_args : '-Wno-deprecated-declarations',
2884 link_with : [install_libudev_static],
2885 build_by_default : want_tests != 'false' and static_libudev_pic,
2886 install : install_tests and static_libudev_pic,
2887 install_dir : testsdir)
2888 if want_tests != 'false' and static_libudev_pic
2889 test('test-libudev-static-sym', exe)
2892 ############################################################
2896 if get_option('tests') != 'false'
2897 foreach tuple : fuzzers
2899 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2900 dependencies = tuple[2]
2901 defs = tuple.length() >= 4 ? tuple[3] : []
2902 incs = tuple.length() >= 5 ? tuple[4] : includes
2905 dependencies += fuzzing_engine
2907 sources += 'src/fuzz/fuzz-main.c'
2910 name = sources[0].split('/')[-1].split('.')[0]
2912 fuzzer_exes += executable(
2915 include_directories : [incs, include_directories('src/fuzz')],
2916 link_with : link_with,
2917 dependencies : dependencies,
2923 run_target('fuzzers',
2924 depends : fuzzer_exes,
2927 ############################################################
2929 make_directive_index_py = find_program('tools/make-directive-index.py')
2930 make_man_index_py = find_program('tools/make-man-index.py')
2931 xml_helper_py = find_program('tools/xml_helper.py')
2932 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2936 subdir('sysusers.d')
2937 subdir('tmpfiles.d')
2942 subdir('shell-completion/bash')
2943 subdir('shell-completion/zsh')
2944 subdir('docs/sysvinit')
2945 subdir('docs/var-log')
2947 install_subdir('factory/etc',
2948 install_dir : factorydir)
2950 install_data('xorg/50-systemd-user.sh',
2951 install_dir : xinitrcdir)
2952 install_data('modprobe.d/systemd.conf',
2953 install_dir : modprobedir)
2954 install_data('LICENSE.GPL2',
2958 'docs/CODING_STYLE.md',
2959 'docs/DISTRO_PORTING.md',
2960 'docs/ENVIRONMENT.md',
2962 'docs/TRANSIENT-SETTINGS.md',
2963 'docs/TRANSLATORS.md',
2964 'docs/UIDS-GIDS.md',
2965 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2966 install_dir : docdir)
2968 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2969 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2971 ############################################################
2973 meson_check_help = find_program('tools/meson-check-help.sh')
2975 foreach exec : public_programs
2976 name = exec.full_path().split('/')[-1]
2977 if want_tests != 'false'
2978 test('check-help-' + name,
2980 args : exec.full_path())
2984 ############################################################
2986 # Enable tests for all supported sanitizers
2987 foreach tuple : sanitizers
2988 sanitizer = tuple[0]
2991 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2993 foreach p : fuzz_regression_tests
2994 b = p.split('/')[-2]
2995 c = p.split('/')[-1]
2997 name = '@0@:@1@'.format(b, sanitizer)
3000 if want_tests == 'false'
3001 message('Not compiling @0@ because tests is set to false'.format(name))
3003 exe = custom_target(
3007 command : [env, 'ln', '-fs',
3008 join_paths(build.full_path(), b),
3010 build_by_default : true)
3012 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3017 if want_tests != 'false' and slow_tests
3018 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3020 args : [exe.full_path(),
3021 join_paths(project_source_root, p)])
3028 ############################################################
3031 all_files = run_command(
3033 ['--git-dir=@0@/.git'.format(project_source_root),
3036 all_files = files(all_files.stdout().split())
3041 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3044 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3048 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3051 command : [meson_git_contrib_sh])
3055 git_head = run_command(
3057 ['--git-dir=@0@/.git'.format(project_source_root),
3058 'rev-parse', 'HEAD']).stdout().strip()
3059 git_head_short = run_command(
3061 ['--git-dir=@0@/.git'.format(project_source_root),
3062 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3066 command : ['git', 'archive',
3067 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3069 '--prefix', 'systemd-@0@/'.format(git_head),
3073 ############################################################
3075 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3078 depends : [man, libsystemd, libudev],
3079 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3081 ############################################################
3084 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3086 'split /usr: @0@'.format(split_usr),
3087 'split bin-sbin: @0@'.format(split_bin),
3088 'prefix directory: @0@'.format(prefixdir),
3089 'rootprefix directory: @0@'.format(rootprefixdir),
3090 'sysconf directory: @0@'.format(sysconfdir),
3091 'include directory: @0@'.format(includedir),
3092 'lib directory: @0@'.format(libdir),
3093 'rootlib directory: @0@'.format(rootlibdir),
3094 'SysV init scripts: @0@'.format(sysvinit_path),
3095 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3096 'PAM modules directory: @0@'.format(pamlibdir),
3097 'PAM configuration directory: @0@'.format(pamconfdir),
3098 'RPM macros directory: @0@'.format(rpmmacrosdir),
3099 'modprobe.d directory: @0@'.format(modprobedir),
3100 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3101 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3102 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3103 'bash completions directory: @0@'.format(bashcompletiondir),
3104 'zsh completions directory: @0@'.format(zshcompletiondir),
3105 'extra start script: @0@'.format(get_option('rc-local')),
3106 'extra stop script: @0@'.format(get_option('halt-local')),
3107 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3108 get_option('debug-tty')),
3109 'TTY GID: @0@'.format(tty_gid),
3110 'users GID: @0@'.format(substs.get('USERS_GID')),
3111 'maximum system UID: @0@'.format(system_uid_max),
3112 'maximum system GID: @0@'.format(system_gid_max),
3113 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3114 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3115 'minimum container UID base: @0@'.format(container_uid_base_min),
3116 'maximum container UID base: @0@'.format(container_uid_base_max),
3117 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3118 'render group access mode: @0@'.format(get_option('group-render-mode')),
3119 'certificate root directory: @0@'.format(get_option('certificate-root')),
3120 'support URL: @0@'.format(support_url),
3121 'nobody user name: @0@'.format(nobody_user),
3122 'nobody group name: @0@'.format(nobody_group),
3123 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3124 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3126 'default DNSSEC mode: @0@'.format(default_dnssec),
3127 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3128 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3129 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3130 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3131 'default locale: @0@'.format(default_locale)]
3133 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3134 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3136 'default DNS servers: @0@'.format(alt_dns_servers),
3137 'default NTP servers: @0@'.format(alt_ntp_servers)]
3139 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3140 '@@0@'.format(time_epoch)).stdout().strip()
3142 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3145 'static libsystemd: @0@'.format(static_libsystemd),
3146 'static libudev: @0@'.format(static_libudev)]
3149 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3150 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3151 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3153 if conf.get('ENABLE_EFI') == 1
3154 status += 'efi arch: @0@'.format(efi_arch)
3158 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3159 'EFI CC @0@'.format(' '.join(efi_cc)),
3160 'EFI lib directory: @0@'.format(efi_libdir),
3161 'EFI lds directory: @0@'.format(efi_ldsdir),
3162 'EFI include directory: @0@'.format(efi_incdir)]
3214 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3215 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3218 ['legacy pkla', install_polkit_pkla],
3220 ['gnu-efi', have_gnu_efi],
3233 ['man pages', want_man],
3234 ['html pages', want_html],
3235 ['man page indices', want_man and have_lxml],
3240 ['adm group', get_option('adm-group')],
3241 ['wheel group', get_option('wheel-group')],
3244 ['debug mmap cache'],
3247 ['valgrind', conf.get('VALGRIND') == 1],
3248 ['trace logging', conf.get('LOG_TRACE') == 1],
3249 ['link-udev-shared', get_option('link-udev-shared')],
3250 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3253 if tuple.length() >= 2
3256 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3257 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3258 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3269 'enabled features: @0@'.format(', '.join(found)),
3271 'disabled features: @0@'.format(', '.join(missing)),
3273 message('\n '.join(status))
3275 if rootprefixdir != rootprefix_default
3277 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3278 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3279 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))