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 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
827 kill_user_processes = get_option('default-kill-user-processes')
828 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
829 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
830 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
832 dns_servers = get_option('dns-servers')
833 conf.set_quoted('DNS_SERVERS', dns_servers)
834 substs.set('DNS_SERVERS', dns_servers)
836 ntp_servers = get_option('ntp-servers')
837 conf.set_quoted('NTP_SERVERS', ntp_servers)
838 substs.set('NTP_SERVERS', ntp_servers)
840 default_locale = get_option('default-locale')
841 if default_locale == ''
842 if not meson.is_cross_build()
843 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
844 default_locale = run_command(choose_default_locale_sh).stdout().strip()
846 default_locale = 'C.UTF-8'
849 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
851 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
853 substs.set('SUSHELL', get_option('debug-shell'))
854 substs.set('DEBUGTTY', get_option('debug-tty'))
856 enable_debug_hashmap = false
857 enable_debug_mmap_cache = false
858 enable_debug_siphash = false
859 enable_debug_udev = false
860 foreach name : get_option('debug-extra')
862 enable_debug_hashmap = true
863 elif name == 'mmap-cache'
864 enable_debug_mmap_cache = true
865 elif name == 'siphash'
866 enable_debug_siphash = true
868 enable_debug_udev = true
870 message('unknown debug option "@0@", ignoring'.format(name))
873 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
874 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
875 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
876 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
878 conf.set10('VALGRIND', get_option('valgrind'))
879 conf.set10('LOG_TRACE', get_option('log-trace'))
881 #####################################################################
883 threads = dependency('threads')
884 librt = cc.find_library('rt')
885 libm = cc.find_library('m')
886 libdl = cc.find_library('dl')
887 libcrypt = cc.find_library('crypt')
889 libcap = dependency('libcap', required : false)
890 if not libcap.found()
891 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
892 libcap = cc.find_library('cap')
895 libmount = dependency('mount',
896 version : fuzzer_build ? '>= 0' : '>= 2.30')
898 want_seccomp = get_option('seccomp')
899 if want_seccomp != 'false' and not fuzzer_build
900 libseccomp = dependency('libseccomp',
901 version : '>= 2.3.1',
902 required : want_seccomp == 'true')
903 have = libseccomp.found()
908 conf.set10('HAVE_SECCOMP', have)
910 want_selinux = get_option('selinux')
911 if want_selinux != 'false' and not fuzzer_build
912 libselinux = dependency('libselinux',
913 version : '>= 2.1.9',
914 required : want_selinux == 'true')
915 have = libselinux.found()
920 conf.set10('HAVE_SELINUX', have)
922 want_apparmor = get_option('apparmor')
923 if want_apparmor != 'false' and not fuzzer_build
924 libapparmor = dependency('libapparmor',
925 required : want_apparmor == 'true')
926 have = libapparmor.found()
931 conf.set10('HAVE_APPARMOR', have)
933 smack_run_label = get_option('smack-run-label')
934 if smack_run_label != ''
935 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
938 want_polkit = get_option('polkit')
939 install_polkit = false
940 install_polkit_pkla = false
941 if want_polkit != 'false' and not fuzzer_build
942 install_polkit = true
944 libpolkit = dependency('polkit-gobject-1',
946 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
947 message('Old polkit detected, will install pkla files')
948 install_polkit_pkla = true
951 conf.set10('ENABLE_POLKIT', install_polkit)
953 want_acl = get_option('acl')
954 if want_acl != 'false' and not fuzzer_build
955 libacl = cc.find_library('acl', required : want_acl == 'true')
956 have = libacl.found()
961 conf.set10('HAVE_ACL', have)
963 want_audit = get_option('audit')
964 if want_audit != 'false' and not fuzzer_build
965 libaudit = dependency('audit', required : want_audit == 'true')
966 have = libaudit.found()
971 conf.set10('HAVE_AUDIT', have)
973 want_blkid = get_option('blkid')
974 if want_blkid != 'false' and not fuzzer_build
975 libblkid = dependency('blkid', required : want_blkid == 'true')
976 have = libblkid.found()
981 conf.set10('HAVE_BLKID', have)
983 want_kmod = get_option('kmod')
984 if want_kmod != 'false' and not fuzzer_build
985 libkmod = dependency('libkmod',
987 required : want_kmod == 'true')
988 have = libkmod.found()
993 conf.set10('HAVE_KMOD', have)
995 want_pam = get_option('pam')
996 if want_pam != 'false' and not fuzzer_build
997 libpam = cc.find_library('pam', required : want_pam == 'true')
998 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
999 have = libpam.found() and libpam_misc.found()
1005 conf.set10('HAVE_PAM', have)
1007 want_microhttpd = get_option('microhttpd')
1008 if want_microhttpd != 'false' and not fuzzer_build
1009 libmicrohttpd = dependency('libmicrohttpd',
1010 version : '>= 0.9.33',
1011 required : want_microhttpd == 'true')
1012 have = libmicrohttpd.found()
1017 conf.set10('HAVE_MICROHTTPD', have)
1019 want_libcryptsetup = get_option('libcryptsetup')
1020 if want_libcryptsetup != 'false' and not fuzzer_build
1021 libcryptsetup = dependency('libcryptsetup',
1022 version : '>= 1.6.0',
1023 required : want_libcryptsetup == 'true')
1024 have = libcryptsetup.found()
1025 have_sector = cc.has_member(
1026 'struct crypt_params_plain',
1028 prefix : '#include <libcryptsetup.h>')
1034 conf.set10('HAVE_LIBCRYPTSETUP', have)
1035 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1037 want_libcurl = get_option('libcurl')
1038 if want_libcurl != 'false' and not fuzzer_build
1039 libcurl = dependency('libcurl',
1040 version : '>= 7.32.0',
1041 required : want_libcurl == 'true')
1042 have = libcurl.found()
1047 conf.set10('HAVE_LIBCURL', have)
1049 want_libidn = get_option('libidn')
1050 want_libidn2 = get_option('libidn2')
1051 if want_libidn == 'true' and want_libidn2 == 'true'
1052 error('libidn and libidn2 cannot be requested simultaneously')
1055 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1056 libidn = dependency('libidn',
1057 required : want_libidn == 'true')
1058 have = libidn.found()
1063 conf.set10('HAVE_LIBIDN', have)
1064 if not have and want_libidn2 != 'false' and not fuzzer_build
1065 # libidn is used for both libidn and libidn2 objects
1066 libidn = dependency('libidn2',
1067 required : want_libidn2 == 'true')
1068 have = libidn.found()
1072 conf.set10('HAVE_LIBIDN2', have)
1074 want_libiptc = get_option('libiptc')
1075 if want_libiptc != 'false' and not fuzzer_build
1076 libiptc = dependency('libiptc',
1077 required : want_libiptc == 'true')
1078 have = libiptc.found()
1083 conf.set10('HAVE_LIBIPTC', have)
1085 want_qrencode = get_option('qrencode')
1086 if want_qrencode != 'false' and not fuzzer_build
1087 libqrencode = dependency('libqrencode',
1088 required : want_qrencode == 'true')
1089 have = libqrencode.found()
1094 conf.set10('HAVE_QRENCODE', have)
1096 want_gcrypt = get_option('gcrypt')
1097 if want_gcrypt != 'false' and not fuzzer_build
1098 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1099 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1100 have = libgcrypt.found() and libgpg_error.found()
1105 # link to neither of the libs if one is not found
1109 conf.set10('HAVE_GCRYPT', have)
1111 want_gnutls = get_option('gnutls')
1112 if want_gnutls != 'false' and not fuzzer_build
1113 libgnutls = dependency('gnutls',
1114 version : '>= 3.1.4',
1115 required : want_gnutls == 'true')
1116 have = libgnutls.found()
1121 conf.set10('HAVE_GNUTLS', have)
1123 want_openssl = get_option('openssl')
1124 if want_openssl != 'false' and not fuzzer_build
1125 libopenssl = dependency('openssl',
1126 version : '>= 1.1.0',
1127 required : want_openssl == 'true')
1128 have = libopenssl.found()
1133 conf.set10('HAVE_OPENSSL', have)
1135 want_elfutils = get_option('elfutils')
1136 if want_elfutils != 'false' and not fuzzer_build
1137 libdw = dependency('libdw',
1138 required : want_elfutils == 'true')
1139 have = libdw.found()
1144 conf.set10('HAVE_ELFUTILS', have)
1146 want_zlib = get_option('zlib')
1147 if want_zlib != 'false' and not fuzzer_build
1148 libz = dependency('zlib',
1149 required : want_zlib == 'true')
1155 conf.set10('HAVE_ZLIB', have)
1157 want_bzip2 = get_option('bzip2')
1158 if want_bzip2 != 'false' and not fuzzer_build
1159 libbzip2 = cc.find_library('bz2',
1160 required : want_bzip2 == 'true')
1161 have = libbzip2.found()
1166 conf.set10('HAVE_BZIP2', have)
1168 want_xz = get_option('xz')
1169 if want_xz != 'false' and not fuzzer_build
1170 libxz = dependency('liblzma',
1171 required : want_xz == 'true')
1172 have = libxz.found()
1177 conf.set10('HAVE_XZ', have)
1179 want_lz4 = get_option('lz4')
1180 if want_lz4 != 'false' and not fuzzer_build
1181 liblz4 = dependency('liblz4',
1182 version : '>= 1.3.0',
1183 required : want_lz4 == 'true')
1184 have = liblz4.found()
1189 conf.set10('HAVE_LZ4', have)
1191 want_xkbcommon = get_option('xkbcommon')
1192 if want_xkbcommon != 'false' and not fuzzer_build
1193 libxkbcommon = dependency('xkbcommon',
1194 version : '>= 0.3.0',
1195 required : want_xkbcommon == 'true')
1196 have = libxkbcommon.found()
1201 conf.set10('HAVE_XKBCOMMON', have)
1203 want_pcre2 = get_option('pcre2')
1204 if want_pcre2 != 'false'
1205 libpcre2 = dependency('libpcre2-8',
1206 required : want_pcre2 == 'true')
1207 have = libpcre2.found()
1212 conf.set10('HAVE_PCRE2', have)
1214 want_glib = get_option('glib')
1215 if want_glib != 'false' and not fuzzer_build
1216 libglib = dependency('glib-2.0',
1217 version : '>= 2.22.0',
1218 required : want_glib == 'true')
1219 libgobject = dependency('gobject-2.0',
1220 version : '>= 2.22.0',
1221 required : want_glib == 'true')
1222 libgio = dependency('gio-2.0',
1223 required : want_glib == 'true')
1224 have = libglib.found() and libgobject.found() and libgio.found()
1231 conf.set10('HAVE_GLIB', have)
1233 want_dbus = get_option('dbus')
1234 if want_dbus != 'false' and not fuzzer_build
1235 libdbus = dependency('dbus-1',
1236 version : '>= 1.3.2',
1237 required : want_dbus == 'true')
1238 have = libdbus.found()
1243 conf.set10('HAVE_DBUS', have)
1245 default_dnssec = get_option('default-dnssec')
1247 default_dnssec = 'no'
1249 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1250 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1251 default_dnssec = 'no'
1253 conf.set('DEFAULT_DNSSEC_MODE',
1254 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1255 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1257 dns_over_tls = get_option('dns-over-tls')
1258 if dns_over_tls != 'false'
1259 if dns_over_tls == 'openssl'
1262 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1263 if dns_over_tls == 'gnutls' and not have_gnutls
1264 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1267 if dns_over_tls == 'gnutls' or have_gnutls
1268 have_openssl = false
1270 have_openssl = conf.get('HAVE_OPENSSL') == 1
1271 if dns_over_tls != 'auto' and not have_openssl
1272 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1273 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1276 have = have_gnutls or have_openssl
1280 have_openssl = false
1282 conf.set10('ENABLE_DNS_OVER_TLS', have)
1283 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1284 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1286 default_dns_over_tls = get_option('default-dns-over-tls')
1288 default_dns_over_tls = 'no'
1290 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1291 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1292 default_dns_over_tls = 'no'
1294 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1295 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1296 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1298 want_importd = get_option('importd')
1299 if want_importd != 'false'
1300 have = (conf.get('HAVE_LIBCURL') == 1 and
1301 conf.get('HAVE_ZLIB') == 1 and
1302 conf.get('HAVE_XZ') == 1 and
1303 conf.get('HAVE_GCRYPT') == 1)
1304 if want_importd == 'true' and not have
1305 error('importd support was requested, but dependencies are not available')
1310 conf.set10('ENABLE_IMPORTD', have)
1312 want_remote = get_option('remote')
1313 if want_remote != 'false'
1314 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1315 conf.get('HAVE_LIBCURL') == 1]
1316 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1317 # it's possible to build one without the other. Complain only if
1318 # support was explictly requested. The auxiliary files like sysusers
1319 # config should be installed when any of the programs are built.
1320 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1321 error('remote support was requested, but dependencies are not available')
1323 have = have_deps[0] or have_deps[1]
1327 conf.set10('ENABLE_REMOTE', have)
1329 foreach term : ['utmp',
1361 have = get_option(term)
1362 name = 'ENABLE_' + term.underscorify().to_upper()
1363 conf.set10(name, have)
1366 foreach tuple : [['nss-mymachines', 'machined'],
1367 ['nss-resolve', 'resolve']]
1368 want = get_option(tuple[0])
1370 have = get_option(tuple[1])
1371 if want == 'true' and not have
1372 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1377 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1378 conf.set10(name, have)
1382 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1383 'ENABLE_NSS_MYMACHINES',
1384 'ENABLE_NSS_RESOLVE',
1385 'ENABLE_NSS_SYSTEMD']
1386 if conf.get(term) == 1
1390 conf.set10('ENABLE_NSS', enable_nss)
1392 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1397 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1399 #####################################################################
1401 if get_option('efi')
1402 efi_arch = host_machine.cpu_family()
1404 if efi_arch == 'x86'
1405 EFI_MACHINE_TYPE_NAME = 'ia32'
1406 gnu_efi_arch = 'ia32'
1407 elif efi_arch == 'x86_64'
1408 EFI_MACHINE_TYPE_NAME = 'x64'
1409 gnu_efi_arch = 'x86_64'
1410 elif efi_arch == 'arm'
1411 EFI_MACHINE_TYPE_NAME = 'arm'
1412 gnu_efi_arch = 'arm'
1413 elif efi_arch == 'aarch64'
1414 EFI_MACHINE_TYPE_NAME = 'aa64'
1415 gnu_efi_arch = 'aarch64'
1417 EFI_MACHINE_TYPE_NAME = ''
1422 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1424 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1428 conf.set10('ENABLE_EFI', have)
1430 #####################################################################
1432 config_h = configure_file(
1433 output : 'config.h',
1434 configuration : conf)
1436 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1438 includes = include_directories('src/basic',
1442 'src/journal-remote',
1446 'src/time-wait-sync',
1452 'src/libsystemd/sd-bus',
1453 'src/libsystemd/sd-device',
1454 'src/libsystemd/sd-event',
1455 'src/libsystemd/sd-hwdb',
1456 'src/libsystemd/sd-id128',
1457 'src/libsystemd/sd-netlink',
1458 'src/libsystemd/sd-network',
1459 'src/libsystemd/sd-resolve',
1460 'src/libsystemd-network',
1463 add_project_arguments('-include', 'config.h', language : 'c')
1465 generate_gperfs = find_program('tools/generate-gperfs.py')
1469 subdir('src/systemd')
1471 subdir('src/libsystemd')
1472 subdir('src/libsystemd-network')
1473 subdir('src/journal')
1476 libjournal_core = static_library(
1478 libjournal_core_sources,
1480 include_directories : includes,
1483 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1484 libsystemd = shared_library(
1487 version : libsystemd_version,
1488 include_directories : includes,
1489 link_args : ['-shared',
1490 '-Wl,--version-script=' + libsystemd_sym_path],
1491 link_with : [libbasic,
1493 link_whole : [libsystemd_static,
1495 dependencies : [threads,
1499 link_depends : libsystemd_sym,
1501 install_dir : rootlibdir)
1503 static_libsystemd = get_option('static-libsystemd')
1504 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1506 install_libsystemd_static = static_library(
1509 journal_client_sources,
1511 basic_gcrypt_sources,
1513 include_directories : includes,
1514 build_by_default : static_libsystemd != 'false',
1515 install : static_libsystemd != 'false',
1516 install_dir : rootlibdir,
1517 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1518 dependencies : [threads,
1527 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1529 ############################################################
1531 # binaries that have --help and are intended for use by humans,
1532 # usually, but not always, installed in /bin.
1533 public_programs = []
1535 subdir('src/libudev')
1536 subdir('src/shared')
1538 subdir('src/shutdown')
1540 subdir('src/network')
1542 subdir('src/analyze')
1543 subdir('src/journal-remote')
1544 subdir('src/coredump')
1545 subdir('src/hostname')
1546 subdir('src/import')
1547 subdir('src/kernel-install')
1548 subdir('src/locale')
1549 subdir('src/machine')
1550 subdir('src/portable')
1551 subdir('src/nspawn')
1552 subdir('src/resolve')
1553 subdir('src/timedate')
1554 subdir('src/timesync')
1555 subdir('src/vconsole')
1556 subdir('src/boot/efi')
1563 ############################################################
1565 # only static linking apart from libdl, to make sure that the
1566 # module is linked to all libraries that it uses.
1567 test_dlopen = executable(
1571 include_directories : includes,
1572 link_with : [libbasic],
1573 dependencies : [libdl],
1574 build_by_default : want_tests != 'false')
1576 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1577 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1578 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1579 ['resolve', 'ENABLE_NSS_RESOLVE']]
1581 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1585 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1586 version_script_arg = join_paths(project_source_root, sym)
1588 nss = shared_library(
1590 'src/nss-@0@/nss-@0@.c'.format(module),
1593 include_directories : includes,
1594 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1595 link_args : ['-Wl,-z,nodelete',
1597 '-Wl,--version-script=' + version_script_arg,
1599 link_with : [libsystemd_static,
1601 dependencies : [threads,
1605 install_dir : rootlibdir)
1607 # We cannot use shared_module because it does not support version suffix.
1608 # Unfortunately shared_library insists on creating the symlink…
1609 meson.add_install_script('sh', '-c',
1610 'rm $DESTDIR@0@/libnss_@1@.so'
1611 .format(rootlibdir, module))
1613 if want_tests != 'false'
1614 test('dlopen-nss_' + module,
1616 # path to dlopen must include a slash
1617 args : nss.full_path())
1622 ############################################################
1624 executable('systemd',
1626 include_directories : includes,
1627 link_with : [libcore,
1629 dependencies : [versiondep,
1636 install_rpath : rootlibexecdir,
1638 install_dir : rootlibexecdir)
1640 meson.add_install_script(meson_make_symlink,
1641 join_paths(rootlibexecdir, 'systemd'),
1642 join_paths(rootsbindir, 'init'))
1644 exe = executable('systemd-analyze',
1645 systemd_analyze_sources,
1646 include_directories : includes,
1647 link_with : [libcore,
1649 dependencies : [versiondep,
1656 install_rpath : rootlibexecdir,
1658 public_programs += exe
1660 executable('systemd-journald',
1661 systemd_journald_sources,
1662 include_directories : includes,
1663 link_with : [libjournal_core,
1665 dependencies : [threads,
1669 install_rpath : rootlibexecdir,
1671 install_dir : rootlibexecdir)
1673 exe = executable('systemd-cat',
1674 systemd_cat_sources,
1675 include_directories : includes,
1676 link_with : [libjournal_core,
1678 dependencies : [threads],
1679 install_rpath : rootlibexecdir,
1681 public_programs += exe
1683 exe = executable('journalctl',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 dependencies : [threads,
1692 install_rpath : rootlibexecdir,
1694 install_dir : rootbindir)
1695 public_programs += exe
1697 executable('systemd-getty-generator',
1698 'src/getty-generator/getty-generator.c',
1699 include_directories : includes,
1700 link_with : [libshared],
1701 install_rpath : rootlibexecdir,
1703 install_dir : systemgeneratordir)
1705 executable('systemd-debug-generator',
1706 'src/debug-generator/debug-generator.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 install_rpath : rootlibexecdir,
1711 install_dir : systemgeneratordir)
1713 executable('systemd-run-generator',
1714 'src/run-generator/run-generator.c',
1715 include_directories : includes,
1716 link_with : [libshared],
1717 install_rpath : rootlibexecdir,
1719 install_dir : systemgeneratordir)
1721 executable('systemd-fstab-generator',
1722 'src/fstab-generator/fstab-generator.c',
1723 include_directories : includes,
1724 link_with : [libcore_shared,
1726 install_rpath : rootlibexecdir,
1728 install_dir : systemgeneratordir)
1730 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1731 executable('30-systemd-environment-d-generator',
1732 'src/environment-d-generator/environment-d-generator.c',
1733 include_directories : includes,
1734 link_with : [libshared],
1735 install_rpath : rootlibexecdir,
1737 install_dir : userenvgeneratordir)
1739 meson.add_install_script(meson_make_symlink,
1740 join_paths(sysconfdir, 'environment'),
1741 join_paths(environmentdir, '99-environment.conf'))
1744 if conf.get('ENABLE_HIBERNATE') == 1
1745 executable('systemd-hibernate-resume-generator',
1746 'src/hibernate-resume/hibernate-resume-generator.c',
1747 include_directories : includes,
1748 link_with : [libshared],
1749 install_rpath : rootlibexecdir,
1751 install_dir : systemgeneratordir)
1753 executable('systemd-hibernate-resume',
1754 'src/hibernate-resume/hibernate-resume.c',
1755 include_directories : includes,
1756 link_with : [libshared],
1757 install_rpath : rootlibexecdir,
1759 install_dir : rootlibexecdir)
1762 if conf.get('HAVE_BLKID') == 1
1763 executable('systemd-gpt-auto-generator',
1764 'src/gpt-auto-generator/gpt-auto-generator.c',
1765 'src/shared/blkid-util.h',
1766 include_directories : includes,
1767 link_with : [libshared],
1768 dependencies : libblkid,
1769 install_rpath : rootlibexecdir,
1771 install_dir : systemgeneratordir)
1773 exe = executable('systemd-dissect',
1774 'src/dissect/dissect.c',
1775 include_directories : includes,
1776 link_with : [libshared],
1777 install_rpath : rootlibexecdir,
1779 install_dir : rootlibexecdir)
1780 public_programs += exe
1783 if conf.get('ENABLE_RESOLVE') == 1
1784 executable('systemd-resolved',
1785 systemd_resolved_sources,
1786 include_directories : includes,
1787 link_with : [libshared,
1789 libsystemd_resolve_core],
1790 dependencies : systemd_resolved_dependencies,
1791 install_rpath : rootlibexecdir,
1793 install_dir : rootlibexecdir)
1795 exe = executable('resolvectl',
1797 include_directories : includes,
1798 link_with : [libshared,
1800 libsystemd_resolve_core],
1801 dependencies : [threads,
1805 install_rpath : rootlibexecdir,
1807 public_programs += exe
1809 meson.add_install_script(meson_make_symlink,
1810 join_paths(bindir, 'resolvectl'),
1811 join_paths(rootsbindir, 'resolvconf'))
1813 meson.add_install_script(meson_make_symlink,
1814 join_paths(bindir, 'resolvectl'),
1815 join_paths(bindir, 'systemd-resolve'))
1818 if conf.get('ENABLE_LOGIND') == 1
1819 executable('systemd-logind',
1820 systemd_logind_sources,
1821 include_directories : includes,
1822 link_with : [liblogind_core,
1824 dependencies : [threads,
1826 install_rpath : rootlibexecdir,
1828 install_dir : rootlibexecdir)
1830 exe = executable('loginctl',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 dependencies : [threads,
1837 install_rpath : rootlibexecdir,
1839 install_dir : rootbindir)
1840 public_programs += exe
1842 exe = executable('systemd-inhibit',
1843 'src/login/inhibit.c',
1844 include_directories : includes,
1845 link_with : [libshared],
1846 install_rpath : rootlibexecdir,
1848 install_dir : rootbindir)
1849 public_programs += exe
1851 if conf.get('HAVE_PAM') == 1
1852 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1853 pam_systemd = shared_library(
1857 include_directories : includes,
1858 link_args : ['-shared',
1859 '-Wl,--version-script=' + version_script_arg],
1860 link_with : [libsystemd_static,
1862 dependencies : [threads,
1865 link_depends : pam_systemd_sym,
1867 install_dir : pamlibdir)
1869 if want_tests != 'false'
1870 test('dlopen-pam_systemd',
1872 # path to dlopen must include a slash
1873 args : pam_systemd.full_path())
1877 executable('systemd-user-runtime-dir',
1878 user_runtime_dir_sources,
1879 include_directories : includes,
1880 link_with : [libshared],
1881 install_rpath : rootlibexecdir,
1883 install_dir : rootlibexecdir)
1886 if conf.get('HAVE_PAM') == 1
1887 executable('systemd-user-sessions',
1888 'src/user-sessions/user-sessions.c',
1889 include_directories : includes,
1890 link_with : [libshared],
1891 install_rpath : rootlibexecdir,
1893 install_dir : rootlibexecdir)
1896 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1897 exe = executable('bootctl',
1898 'src/boot/bootctl.c',
1899 include_directories : includes,
1900 link_with : [libshared],
1901 dependencies : [libblkid],
1902 install_rpath : rootlibexecdir,
1904 public_programs += exe
1906 executable('systemd-bless-boot',
1907 'src/boot/bless-boot.c',
1908 include_directories : includes,
1909 link_with : [libshared],
1910 dependencies : [libblkid],
1911 install_rpath : rootlibexecdir,
1913 install_dir : rootlibexecdir)
1915 executable('systemd-bless-boot-generator',
1916 'src/boot/bless-boot-generator.c',
1917 include_directories : includes,
1918 link_with : [libshared],
1919 install_rpath : rootlibexecdir,
1921 install_dir : systemgeneratordir)
1924 executable('systemd-boot-check-no-failures',
1925 'src/boot/boot-check-no-failures.c',
1926 include_directories : includes,
1927 link_with : [libshared],
1928 dependencies : [libblkid],
1929 install_rpath : rootlibexecdir,
1931 install_dir : rootlibexecdir)
1933 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 dependencies : [threads],
1937 install_rpath : rootlibexecdir,
1939 public_programs += exe
1942 if get_option('link-systemctl-shared')
1943 systemctl_link_with = [libshared]
1945 systemctl_link_with = [libsystemd_static,
1951 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1952 include_directories : includes,
1953 link_with : systemctl_link_with,
1954 dependencies : [threads,
1959 install_rpath : rootlibexecdir,
1961 install_dir : rootbindir)
1962 public_programs += exe
1964 if conf.get('ENABLE_PORTABLED') == 1
1965 executable('systemd-portabled',
1966 systemd_portabled_sources,
1967 include_directories : includes,
1968 link_with : [libshared],
1969 dependencies : [threads],
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootlibexecdir)
1974 exe = executable('portablectl', 'src/portable/portablectl.c',
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [threads],
1978 install_rpath : rootlibexecdir,
1980 install_dir : rootbindir)
1981 public_programs += exe
1984 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1985 meson.add_install_script(meson_make_symlink,
1986 join_paths(rootbindir, 'systemctl'),
1987 join_paths(rootsbindir, alias))
1990 if conf.get('ENABLE_BACKLIGHT') == 1
1991 executable('systemd-backlight',
1992 'src/backlight/backlight.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 install_rpath : rootlibexecdir,
1997 install_dir : rootlibexecdir)
2000 if conf.get('ENABLE_RFKILL') == 1
2001 executable('systemd-rfkill',
2002 'src/rfkill/rfkill.c',
2003 include_directories : includes,
2004 link_with : [libshared],
2005 install_rpath : rootlibexecdir,
2007 install_dir : rootlibexecdir)
2010 executable('systemd-system-update-generator',
2011 'src/system-update-generator/system-update-generator.c',
2012 include_directories : includes,
2013 link_with : [libshared],
2014 install_rpath : rootlibexecdir,
2016 install_dir : systemgeneratordir)
2018 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2019 executable('systemd-cryptsetup',
2020 'src/cryptsetup/cryptsetup.c',
2021 include_directories : includes,
2022 link_with : [libshared],
2023 dependencies : [libcryptsetup],
2024 install_rpath : rootlibexecdir,
2026 install_dir : rootlibexecdir)
2028 executable('systemd-cryptsetup-generator',
2029 'src/cryptsetup/cryptsetup-generator.c',
2030 include_directories : includes,
2031 link_with : [libshared],
2032 dependencies : [libcryptsetup],
2033 install_rpath : rootlibexecdir,
2035 install_dir : systemgeneratordir)
2037 executable('systemd-veritysetup',
2038 'src/veritysetup/veritysetup.c',
2039 include_directories : includes,
2040 link_with : [libshared],
2041 dependencies : [libcryptsetup],
2042 install_rpath : rootlibexecdir,
2044 install_dir : rootlibexecdir)
2046 executable('systemd-veritysetup-generator',
2047 'src/veritysetup/veritysetup-generator.c',
2048 include_directories : includes,
2049 link_with : [libshared],
2050 dependencies : [libcryptsetup],
2051 install_rpath : rootlibexecdir,
2053 install_dir : systemgeneratordir)
2056 if conf.get('HAVE_SYSV_COMPAT') == 1
2057 executable('systemd-sysv-generator',
2058 'src/sysv-generator/sysv-generator.c',
2059 include_directories : includes,
2060 link_with : [libshared],
2061 install_rpath : rootlibexecdir,
2063 install_dir : systemgeneratordir)
2065 executable('systemd-rc-local-generator',
2066 'src/rc-local-generator/rc-local-generator.c',
2067 include_directories : includes,
2068 link_with : [libshared],
2069 install_rpath : rootlibexecdir,
2071 install_dir : systemgeneratordir)
2074 if conf.get('ENABLE_HOSTNAMED') == 1
2075 executable('systemd-hostnamed',
2076 'src/hostname/hostnamed.c',
2077 include_directories : includes,
2078 link_with : [libshared],
2079 install_rpath : rootlibexecdir,
2081 install_dir : rootlibexecdir)
2083 exe = executable('hostnamectl',
2084 'src/hostname/hostnamectl.c',
2085 include_directories : includes,
2086 link_with : [libshared],
2087 install_rpath : rootlibexecdir,
2089 public_programs += exe
2092 if conf.get('ENABLE_LOCALED') == 1
2093 if conf.get('HAVE_XKBCOMMON') == 1
2094 # logind will load libxkbcommon.so dynamically on its own
2100 executable('systemd-localed',
2101 systemd_localed_sources,
2102 include_directories : includes,
2103 link_with : [libshared],
2104 dependencies : deps,
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootlibexecdir)
2109 exe = executable('localectl',
2111 include_directories : includes,
2112 link_with : [libshared],
2113 install_rpath : rootlibexecdir,
2115 public_programs += exe
2118 if conf.get('ENABLE_TIMEDATED') == 1
2119 executable('systemd-timedated',
2120 'src/timedate/timedated.c',
2121 include_directories : includes,
2122 link_with : [libshared],
2123 install_rpath : rootlibexecdir,
2125 install_dir : rootlibexecdir)
2128 if conf.get('ENABLE_TIMEDATECTL') == 1
2129 exe = executable('timedatectl',
2130 'src/timedate/timedatectl.c',
2131 include_directories : includes,
2132 install_rpath : rootlibexecdir,
2133 link_with : [libshared],
2134 dependencies : [libm],
2136 public_programs += exe
2139 if conf.get('ENABLE_TIMESYNCD') == 1
2140 executable('systemd-timesyncd',
2141 systemd_timesyncd_sources,
2142 include_directories : includes,
2143 link_with : [libshared],
2144 dependencies : [threads,
2146 install_rpath : rootlibexecdir,
2148 install_dir : rootlibexecdir)
2150 executable('systemd-time-wait-sync',
2151 'src/time-wait-sync/time-wait-sync.c',
2152 include_directories : includes,
2153 link_with : [libshared],
2154 install_rpath : rootlibexecdir,
2156 install_dir : rootlibexecdir)
2159 if conf.get('ENABLE_MACHINED') == 1
2160 executable('systemd-machined',
2161 systemd_machined_sources,
2162 include_directories : includes,
2163 link_with : [libmachine_core,
2165 install_rpath : rootlibexecdir,
2167 install_dir : rootlibexecdir)
2169 exe = executable('machinectl',
2170 'src/machine/machinectl.c',
2171 include_directories : includes,
2172 link_with : [libshared],
2173 dependencies : [threads,
2176 install_rpath : rootlibexecdir,
2178 install_dir : rootbindir)
2179 public_programs += exe
2182 if conf.get('ENABLE_IMPORTD') == 1
2183 executable('systemd-importd',
2184 systemd_importd_sources,
2185 include_directories : includes,
2186 link_with : [libshared],
2187 dependencies : [threads],
2188 install_rpath : rootlibexecdir,
2190 install_dir : rootlibexecdir)
2192 systemd_pull = executable('systemd-pull',
2193 systemd_pull_sources,
2194 include_directories : includes,
2195 link_with : [libshared],
2196 dependencies : [versiondep,
2202 install_rpath : rootlibexecdir,
2204 install_dir : rootlibexecdir)
2206 systemd_import = executable('systemd-import',
2207 systemd_import_sources,
2208 include_directories : includes,
2209 link_with : [libshared],
2210 dependencies : [libcurl,
2214 install_rpath : rootlibexecdir,
2216 install_dir : rootlibexecdir)
2218 systemd_import_fs = executable('systemd-import-fs',
2219 systemd_import_fs_sources,
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2224 install_dir : rootlibexecdir)
2226 systemd_export = executable('systemd-export',
2227 systemd_export_sources,
2228 include_directories : includes,
2229 link_with : [libshared],
2230 dependencies : [libcurl,
2234 install_rpath : rootlibexecdir,
2236 install_dir : rootlibexecdir)
2238 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2241 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2242 exe = executable('systemd-journal-upload',
2243 systemd_journal_upload_sources,
2244 include_directories : includes,
2245 link_with : [libshared],
2246 dependencies : [versiondep,
2252 install_rpath : rootlibexecdir,
2254 install_dir : rootlibexecdir)
2255 public_programs += exe
2258 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2259 s_j_remote = executable('systemd-journal-remote',
2260 systemd_journal_remote_sources,
2261 include_directories : includes,
2262 link_with : [libshared,
2263 libsystemd_journal_remote],
2264 dependencies : [threads,
2269 install_rpath : rootlibexecdir,
2271 install_dir : rootlibexecdir)
2273 s_j_gatewayd = executable('systemd-journal-gatewayd',
2274 systemd_journal_gatewayd_sources,
2275 include_directories : includes,
2276 link_with : [libshared],
2277 dependencies : [threads,
2282 install_rpath : rootlibexecdir,
2284 install_dir : rootlibexecdir)
2285 public_programs += [s_j_remote, s_j_gatewayd]
2288 if conf.get('ENABLE_COREDUMP') == 1
2289 executable('systemd-coredump',
2290 systemd_coredump_sources,
2291 include_directories : includes,
2292 link_with : [libshared],
2293 dependencies : [threads,
2298 install_rpath : rootlibexecdir,
2300 install_dir : rootlibexecdir)
2302 exe = executable('coredumpctl',
2303 coredumpctl_sources,
2304 include_directories : includes,
2305 link_with : [libshared],
2306 dependencies : [threads,
2309 install_rpath : rootlibexecdir,
2311 public_programs += exe
2314 if conf.get('ENABLE_BINFMT') == 1
2315 exe = executable('systemd-binfmt',
2316 'src/binfmt/binfmt.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2321 install_dir : rootlibexecdir)
2322 public_programs += exe
2324 meson.add_install_script('sh', '-c',
2325 mkdir_p.format(binfmtdir))
2326 meson.add_install_script('sh', '-c',
2327 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2330 if conf.get('ENABLE_VCONSOLE') == 1
2331 executable('systemd-vconsole-setup',
2332 'src/vconsole/vconsole-setup.c',
2333 include_directories : includes,
2334 link_with : [libshared],
2335 install_rpath : rootlibexecdir,
2337 install_dir : rootlibexecdir)
2340 if conf.get('ENABLE_RANDOMSEED') == 1
2341 executable('systemd-random-seed',
2342 'src/random-seed/random-seed.c',
2343 include_directories : includes,
2344 link_with : [libshared],
2345 install_rpath : rootlibexecdir,
2347 install_dir : rootlibexecdir)
2350 if conf.get('ENABLE_FIRSTBOOT') == 1
2351 executable('systemd-firstboot',
2352 'src/firstboot/firstboot.c',
2353 include_directories : includes,
2354 link_with : [libshared],
2355 dependencies : [libcrypt],
2356 install_rpath : rootlibexecdir,
2358 install_dir : rootbindir)
2361 executable('systemd-remount-fs',
2362 'src/remount-fs/remount-fs.c',
2363 include_directories : includes,
2364 link_with : [libcore_shared,
2366 install_rpath : rootlibexecdir,
2368 install_dir : rootlibexecdir)
2370 executable('systemd-machine-id-setup',
2371 'src/machine-id-setup/machine-id-setup-main.c',
2372 include_directories : includes,
2373 link_with : [libcore_shared,
2375 install_rpath : rootlibexecdir,
2377 install_dir : rootbindir)
2379 executable('systemd-fsck',
2381 include_directories : includes,
2382 link_with : [libshared],
2383 install_rpath : rootlibexecdir,
2385 install_dir : rootlibexecdir)
2387 executable('systemd-growfs',
2388 'src/partition/growfs.c',
2389 include_directories : includes,
2390 link_with : [libshared],
2391 dependencies : [libcryptsetup],
2392 install_rpath : rootlibexecdir,
2394 install_dir : rootlibexecdir)
2396 executable('systemd-makefs',
2397 'src/partition/makefs.c',
2398 include_directories : includes,
2399 link_with : [libshared],
2400 install_rpath : rootlibexecdir,
2402 install_dir : rootlibexecdir)
2404 executable('systemd-sleep',
2405 'src/sleep/sleep.c',
2406 include_directories : includes,
2407 link_with : [libshared],
2408 install_rpath : rootlibexecdir,
2410 install_dir : rootlibexecdir)
2412 install_data('src/sleep/sleep.conf',
2413 install_dir : pkgsysconfdir)
2415 exe = executable('systemd-sysctl',
2416 'src/sysctl/sysctl.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 install_rpath : rootlibexecdir,
2421 install_dir : rootlibexecdir)
2422 public_programs += exe
2424 executable('systemd-ac-power',
2425 'src/ac-power/ac-power.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 install_dir : rootlibexecdir)
2432 exe = executable('systemd-detect-virt',
2433 'src/detect-virt/detect-virt.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 public_programs += exe
2440 exe = executable('systemd-delta',
2441 'src/delta/delta.c',
2442 include_directories : includes,
2443 link_with : [libshared],
2444 install_rpath : rootlibexecdir,
2446 public_programs += exe
2448 exe = executable('systemd-escape',
2449 'src/escape/escape.c',
2450 include_directories : includes,
2451 link_with : [libshared],
2452 install_rpath : rootlibexecdir,
2454 install_dir : rootbindir)
2455 public_programs += exe
2457 exe = executable('systemd-notify',
2458 'src/notify/notify.c',
2459 include_directories : includes,
2460 link_with : [libshared],
2461 install_rpath : rootlibexecdir,
2463 install_dir : rootbindir)
2464 public_programs += exe
2466 executable('systemd-volatile-root',
2467 'src/volatile-root/volatile-root.c',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 install_rpath : rootlibexecdir,
2472 install_dir : rootlibexecdir)
2474 executable('systemd-cgroups-agent',
2475 'src/cgroups-agent/cgroups-agent.c',
2476 include_directories : includes,
2477 link_with : [libshared],
2478 install_rpath : rootlibexecdir,
2480 install_dir : rootlibexecdir)
2482 exe = executable('systemd-id128',
2483 'src/id128/id128.c',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 install_rpath : rootlibexecdir,
2488 public_programs += exe
2490 exe = executable('systemd-path',
2492 include_directories : includes,
2493 link_with : [libshared],
2494 install_rpath : rootlibexecdir,
2496 public_programs += exe
2498 exe = executable('systemd-ask-password',
2499 'src/ask-password/ask-password.c',
2500 include_directories : includes,
2501 link_with : [libshared],
2502 install_rpath : rootlibexecdir,
2504 install_dir : rootbindir)
2505 public_programs += exe
2507 executable('systemd-reply-password',
2508 'src/reply-password/reply-password.c',
2509 include_directories : includes,
2510 link_with : [libshared],
2511 install_rpath : rootlibexecdir,
2513 install_dir : rootlibexecdir)
2515 exe = executable('systemd-tty-ask-password-agent',
2516 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2517 include_directories : includes,
2518 link_with : [libshared],
2519 install_rpath : rootlibexecdir,
2521 install_dir : rootbindir)
2522 public_programs += exe
2524 exe = executable('systemd-cgls',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 install_rpath : rootlibexecdir,
2530 public_programs += exe
2532 exe = executable('systemd-cgtop',
2533 'src/cgtop/cgtop.c',
2534 include_directories : includes,
2535 link_with : [libshared],
2536 install_rpath : rootlibexecdir,
2538 public_programs += exe
2540 executable('systemd-initctl',
2541 'src/initctl/initctl.c',
2542 include_directories : includes,
2543 link_with : [libshared],
2544 install_rpath : rootlibexecdir,
2546 install_dir : rootlibexecdir)
2548 exe = executable('systemd-mount',
2549 'src/mount/mount-tool.c',
2550 include_directories : includes,
2551 link_with : [libshared],
2552 install_rpath : rootlibexecdir,
2554 public_programs += exe
2556 meson.add_install_script(meson_make_symlink,
2557 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2559 exe = executable('systemd-run',
2561 include_directories : includes,
2562 link_with : [libshared],
2563 install_rpath : rootlibexecdir,
2565 public_programs += exe
2567 exe = executable('systemd-stdio-bridge',
2568 'src/stdio-bridge/stdio-bridge.c',
2569 include_directories : includes,
2570 link_with : [libshared],
2571 dependencies : [versiondep],
2572 install_rpath : rootlibexecdir,
2574 public_programs += exe
2576 exe = executable('busctl',
2577 'src/busctl/busctl.c',
2578 'src/busctl/busctl-introspect.c',
2579 'src/busctl/busctl-introspect.h',
2580 include_directories : includes,
2581 link_with : [libshared],
2582 install_rpath : rootlibexecdir,
2584 public_programs += exe
2586 if conf.get('ENABLE_SYSUSERS') == 1
2587 exe = executable('systemd-sysusers',
2588 'src/sysusers/sysusers.c',
2589 include_directories : includes,
2590 link_with : [libshared],
2591 install_rpath : rootlibexecdir,
2593 install_dir : rootbindir)
2594 public_programs += exe
2597 if conf.get('ENABLE_TMPFILES') == 1
2598 exe = executable('systemd-tmpfiles',
2599 'src/tmpfiles/tmpfiles.c',
2600 include_directories : includes,
2601 link_with : [libshared],
2602 dependencies : [libacl],
2603 install_rpath : rootlibexecdir,
2605 install_dir : rootbindir)
2606 public_programs += exe
2608 if want_tests != 'false'
2609 test('test-systemd-tmpfiles',
2610 test_systemd_tmpfiles_py,
2611 # https://github.com/mesonbuild/meson/issues/2681
2612 args : exe.full_path())
2616 if conf.get('ENABLE_HWDB') == 1
2617 exe = executable('systemd-hwdb',
2619 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2620 include_directories : includes,
2621 link_with : [libudev_static],
2622 install_rpath : udev_rpath,
2624 install_dir : rootbindir)
2625 public_programs += exe
2628 if conf.get('ENABLE_QUOTACHECK') == 1
2629 executable('systemd-quotacheck',
2630 'src/quotacheck/quotacheck.c',
2631 include_directories : includes,
2632 link_with : [libshared],
2633 install_rpath : rootlibexecdir,
2635 install_dir : rootlibexecdir)
2638 exe = executable('systemd-socket-proxyd',
2639 'src/socket-proxy/socket-proxyd.c',
2640 include_directories : includes,
2641 link_with : [libshared],
2642 dependencies : [threads],
2643 install_rpath : rootlibexecdir,
2645 install_dir : rootlibexecdir)
2646 public_programs += exe
2648 exe = executable('systemd-udevd',
2649 systemd_udevd_sources,
2650 include_directories : includes,
2651 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2652 link_with : [libudev_core,
2655 dependencies : [versiondep,
2661 install_rpath : udev_rpath,
2663 install_dir : rootlibexecdir)
2664 public_programs += exe
2666 exe = executable('udevadm',
2668 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2669 include_directories : includes,
2670 link_with : [libudev_core,
2673 dependencies : [versiondep,
2679 install_rpath : udev_rpath,
2681 install_dir : rootbindir)
2682 public_programs += exe
2684 executable('systemd-shutdown',
2685 systemd_shutdown_sources,
2686 include_directories : includes,
2687 link_with : [libcore_shared,
2689 dependencies : [libmount],
2690 install_rpath : rootlibexecdir,
2692 install_dir : rootlibexecdir)
2694 executable('systemd-update-done',
2695 'src/update-done/update-done.c',
2696 include_directories : includes,
2697 link_with : [libshared],
2698 install_rpath : rootlibexecdir,
2700 install_dir : rootlibexecdir)
2702 executable('systemd-update-utmp',
2703 'src/update-utmp/update-utmp.c',
2704 include_directories : includes,
2705 link_with : [libshared],
2706 dependencies : [libaudit],
2707 install_rpath : rootlibexecdir,
2709 install_dir : rootlibexecdir)
2711 if conf.get('HAVE_KMOD') == 1
2712 executable('systemd-modules-load',
2713 'src/modules-load/modules-load.c',
2714 include_directories : includes,
2715 link_with : [libshared],
2716 dependencies : [libkmod],
2717 install_rpath : rootlibexecdir,
2719 install_dir : rootlibexecdir)
2721 meson.add_install_script('sh', '-c',
2722 mkdir_p.format(modulesloaddir))
2723 meson.add_install_script('sh', '-c',
2724 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2727 exe = executable('systemd-nspawn',
2728 systemd_nspawn_sources,
2729 include_directories : includes,
2730 link_with : [libcore_shared,
2733 dependencies : [libblkid],
2734 install_rpath : rootlibexecdir,
2736 public_programs += exe
2738 if conf.get('ENABLE_NETWORKD') == 1
2739 executable('systemd-networkd',
2740 systemd_networkd_sources,
2741 include_directories : includes,
2742 link_with : [libnetworkd_core,
2746 dependencies : [threads],
2747 install_rpath : rootlibexecdir,
2749 install_dir : rootlibexecdir)
2751 executable('systemd-networkd-wait-online',
2752 systemd_networkd_wait_online_sources,
2753 include_directories : includes,
2754 link_with : [libnetworkd_core,
2756 install_rpath : rootlibexecdir,
2758 install_dir : rootlibexecdir)
2760 exe = executable('networkctl',
2762 include_directories : includes,
2763 link_with : [libsystemd_network,
2765 install_rpath : rootlibexecdir,
2767 install_dir : rootbindir)
2768 public_programs += exe
2771 executable('systemd-sulogin-shell',
2772 ['src/sulogin-shell/sulogin-shell.c'],
2773 include_directories : includes,
2774 link_with : [libshared],
2775 install_rpath : rootlibexecdir,
2777 install_dir : rootlibexecdir)
2779 ############################################################
2782 'systemd-runtest.env',
2783 output : 'systemd-runtest.env',
2784 command : ['sh', '-c', '{ ' +
2785 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2786 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2788 build_by_default : true)
2790 foreach tuple : tests
2792 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2793 dependencies = tuple[2]
2794 condition = tuple.length() >= 4 ? tuple[3] : ''
2795 type = tuple.length() >= 5 ? tuple[4] : ''
2796 defs = tuple.length() >= 6 ? tuple[5] : []
2797 incs = tuple.length() >= 7 ? tuple[6] : includes
2800 name = sources[0].split('/')[-1].split('.')[0]
2801 if type.startswith('timeout=')
2802 timeout = type.split('=')[1].to_int()
2806 if condition == '' or conf.get(condition) == 1
2810 include_directories : incs,
2811 link_with : link_with,
2812 dependencies : [versiondep,
2815 build_by_default : want_tests != 'false',
2816 install_rpath : rootlibexecdir,
2817 install : install_tests,
2818 install_dir : join_paths(testsdir, type))
2821 message('@0@ is a manual test'.format(name))
2822 elif type == 'unsafe' and want_tests != 'unsafe'
2823 message('@0@ is an unsafe test'.format(name))
2824 elif want_tests != 'false'
2830 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2835 'test-libsystemd-sym',
2836 test_libsystemd_sym_c,
2837 include_directories : includes,
2838 link_with : [libsystemd],
2839 build_by_default : want_tests != 'false',
2840 install : install_tests,
2841 install_dir : testsdir)
2842 if want_tests != 'false'
2843 test('test-libsystemd-sym', exe)
2847 'test-libsystemd-static-sym',
2848 test_libsystemd_sym_c,
2849 include_directories : includes,
2850 link_with : [install_libsystemd_static],
2851 dependencies : [threads], # threads is already included in dependencies on the library,
2852 # but does not seem to get propagated. Add here as a work-around.
2853 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2854 install : install_tests and static_libsystemd_pic,
2855 install_dir : testsdir)
2856 if want_tests != 'false' and static_libsystemd_pic
2857 test('test-libsystemd-static-sym', exe)
2863 include_directories : includes,
2864 c_args : '-Wno-deprecated-declarations',
2865 link_with : [libudev],
2866 build_by_default : want_tests != 'false',
2867 install : install_tests,
2868 install_dir : testsdir)
2869 if want_tests != 'false'
2870 test('test-libudev-sym', exe)
2874 'test-libudev-static-sym',
2876 include_directories : includes,
2877 c_args : '-Wno-deprecated-declarations',
2878 link_with : [install_libudev_static],
2879 build_by_default : want_tests != 'false' and static_libudev_pic,
2880 install : install_tests and static_libudev_pic,
2881 install_dir : testsdir)
2882 if want_tests != 'false' and static_libudev_pic
2883 test('test-libudev-static-sym', exe)
2886 ############################################################
2890 if get_option('tests') != 'false'
2891 foreach tuple : fuzzers
2893 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2894 dependencies = tuple[2]
2895 defs = tuple.length() >= 4 ? tuple[3] : []
2896 incs = tuple.length() >= 5 ? tuple[4] : includes
2899 dependencies += fuzzing_engine
2901 sources += 'src/fuzz/fuzz-main.c'
2904 name = sources[0].split('/')[-1].split('.')[0]
2906 fuzzer_exes += executable(
2909 include_directories : [incs, include_directories('src/fuzz')],
2910 link_with : link_with,
2911 dependencies : dependencies,
2917 run_target('fuzzers',
2918 depends : fuzzer_exes,
2921 ############################################################
2923 make_directive_index_py = find_program('tools/make-directive-index.py')
2924 make_man_index_py = find_program('tools/make-man-index.py')
2925 xml_helper_py = find_program('tools/xml_helper.py')
2926 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2930 subdir('sysusers.d')
2931 subdir('tmpfiles.d')
2936 subdir('shell-completion/bash')
2937 subdir('shell-completion/zsh')
2938 subdir('docs/sysvinit')
2939 subdir('docs/var-log')
2941 install_subdir('factory/etc',
2942 install_dir : factorydir)
2944 install_data('xorg/50-systemd-user.sh',
2945 install_dir : xinitrcdir)
2946 install_data('modprobe.d/systemd.conf',
2947 install_dir : modprobedir)
2948 install_data('LICENSE.GPL2',
2952 'docs/CODING_STYLE.md',
2953 'docs/DISTRO_PORTING.md',
2954 'docs/ENVIRONMENT.md',
2956 'docs/TRANSIENT-SETTINGS.md',
2957 'docs/TRANSLATORS.md',
2958 'docs/UIDS-GIDS.md',
2959 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2960 install_dir : docdir)
2962 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2963 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2965 ############################################################
2967 meson_check_help = find_program('tools/meson-check-help.sh')
2969 foreach exec : public_programs
2970 name = exec.full_path().split('/')[-1]
2971 if want_tests != 'false'
2972 test('check-help-' + name,
2974 args : exec.full_path())
2978 ############################################################
2980 # Enable tests for all supported sanitizers
2981 foreach tuple : sanitizers
2982 sanitizer = tuple[0]
2985 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2987 foreach p : fuzz_regression_tests
2988 b = p.split('/')[-2]
2989 c = p.split('/')[-1]
2991 name = '@0@:@1@'.format(b, sanitizer)
2994 if want_tests == 'false'
2995 message('Not compiling @0@ because tests is set to false'.format(name))
2997 exe = custom_target(
3001 command : [env, 'ln', '-fs',
3002 join_paths(build.full_path(), b),
3004 build_by_default : true)
3006 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3011 if want_tests != 'false' and slow_tests
3012 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3014 args : [exe.full_path(),
3015 join_paths(project_source_root, p)])
3022 ############################################################
3025 all_files = run_command(
3027 ['--git-dir=@0@/.git'.format(project_source_root),
3030 all_files = files(all_files.stdout().split())
3035 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3038 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3042 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3045 command : [meson_git_contrib_sh])
3049 git_head = run_command(
3051 ['--git-dir=@0@/.git'.format(project_source_root),
3052 'rev-parse', 'HEAD']).stdout().strip()
3053 git_head_short = run_command(
3055 ['--git-dir=@0@/.git'.format(project_source_root),
3056 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3060 command : ['git', 'archive',
3061 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3063 '--prefix', 'systemd-@0@/'.format(git_head),
3067 ############################################################
3069 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3072 depends : [man, libsystemd, libudev],
3073 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3075 ############################################################
3078 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3080 'split /usr: @0@'.format(split_usr),
3081 'split bin-sbin: @0@'.format(split_bin),
3082 'prefix directory: @0@'.format(prefixdir),
3083 'rootprefix directory: @0@'.format(rootprefixdir),
3084 'sysconf directory: @0@'.format(sysconfdir),
3085 'include directory: @0@'.format(includedir),
3086 'lib directory: @0@'.format(libdir),
3087 'rootlib directory: @0@'.format(rootlibdir),
3088 'SysV init scripts: @0@'.format(sysvinit_path),
3089 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3090 'PAM modules directory: @0@'.format(pamlibdir),
3091 'PAM configuration directory: @0@'.format(pamconfdir),
3092 'RPM macros directory: @0@'.format(rpmmacrosdir),
3093 'modprobe.d directory: @0@'.format(modprobedir),
3094 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3095 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3096 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3097 'bash completions directory: @0@'.format(bashcompletiondir),
3098 'zsh completions directory: @0@'.format(zshcompletiondir),
3099 'extra start script: @0@'.format(get_option('rc-local')),
3100 'extra stop script: @0@'.format(get_option('halt-local')),
3101 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3102 get_option('debug-tty')),
3103 'TTY GID: @0@'.format(tty_gid),
3104 'users GID: @0@'.format(substs.get('USERS_GID')),
3105 'maximum system UID: @0@'.format(system_uid_max),
3106 'maximum system GID: @0@'.format(system_gid_max),
3107 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3108 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3109 'minimum container UID base: @0@'.format(container_uid_base_min),
3110 'maximum container UID base: @0@'.format(container_uid_base_max),
3111 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3112 'render group access mode: @0@'.format(get_option('group-render-mode')),
3113 'certificate root directory: @0@'.format(get_option('certificate-root')),
3114 'support URL: @0@'.format(support_url),
3115 'nobody user name: @0@'.format(nobody_user),
3116 'nobody group name: @0@'.format(nobody_group),
3117 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3118 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3120 'default DNSSEC mode: @0@'.format(default_dnssec),
3121 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3122 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3123 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3124 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3125 'default locale: @0@'.format(default_locale)]
3127 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3128 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3130 'default DNS servers: @0@'.format(alt_dns_servers),
3131 'default NTP servers: @0@'.format(alt_ntp_servers)]
3133 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3134 '@@0@'.format(time_epoch)).stdout().strip()
3136 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3139 'static libsystemd: @0@'.format(static_libsystemd),
3140 'static libudev: @0@'.format(static_libudev)]
3143 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3144 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3145 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3147 if conf.get('ENABLE_EFI') == 1
3148 status += 'efi arch: @0@'.format(efi_arch)
3152 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3153 'EFI CC @0@'.format(' '.join(efi_cc)),
3154 'EFI lib directory: @0@'.format(efi_libdir),
3155 'EFI lds directory: @0@'.format(efi_ldsdir),
3156 'EFI include directory: @0@'.format(efi_incdir)]
3208 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3209 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3212 ['legacy pkla', install_polkit_pkla],
3214 ['gnu-efi', have_gnu_efi],
3227 ['man pages', want_man],
3228 ['html pages', want_html],
3229 ['man page indices', want_man and have_lxml],
3234 ['adm group', get_option('adm-group')],
3235 ['wheel group', get_option('wheel-group')],
3238 ['debug mmap cache'],
3241 ['valgrind', conf.get('VALGRIND') == 1],
3242 ['trace logging', conf.get('LOG_TRACE') == 1],
3243 ['link-udev-shared', get_option('link-udev-shared')],
3244 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3247 if tuple.length() >= 2
3250 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3251 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3252 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3263 'enabled features: @0@'.format(', '.join(found)),
3265 'disabled features: @0@'.format(', '.join(missing)),
3267 message('\n '.join(status))
3269 if rootprefixdir != rootprefix_default
3271 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3272 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3273 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))