1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.24.0'
16 libudev_version = '1.6.12'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
29 want_ossfuzz = get_option('oss-fuzz')
30 want_libfuzzer = get_option('llvm-fuzz')
31 if want_ossfuzz and want_libfuzzer
32 error('only one of oss-fuzz and llvm-fuzz can be specified')
34 fuzzer_build = want_ossfuzz or want_libfuzzer
36 #####################################################################
38 # Try to install the git pre-commit hook
39 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
40 if git_hook.returncode() == 0
41 message(git_hook.stdout().strip())
44 #####################################################################
46 if get_option('split-usr') == 'auto'
47 split_usr = run_command('test', '-L', '/bin').returncode() != 0
49 split_usr = get_option('split-usr') == 'true'
51 conf.set10('HAVE_SPLIT_USR', split_usr,
52 description : '/usr/bin and /bin directories are separate')
54 if get_option('split-bin') == 'auto'
55 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
57 split_bin = get_option('split-bin') == 'true'
59 conf.set10('HAVE_SPLIT_BIN', split_bin,
60 description : 'bin and sbin directories are separate')
62 rootprefixdir = get_option('rootprefix')
63 # Unusual rootprefixdir values are used by some distros
64 # (see https://github.com/systemd/systemd/pull/7461).
65 rootprefix_default = split_usr ? '/' : '/usr'
66 if rootprefixdir == ''
67 rootprefixdir = rootprefix_default
70 sysvinit_path = get_option('sysvinit-path')
71 sysvrcnd_path = get_option('sysvrcnd-path')
72 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
73 description : 'SysV init scripts and rcN.d links are supported')
75 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
76 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
77 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
79 # join_paths ignore the preceding arguments if an absolute component is
80 # encountered, so this should canonicalize various paths when they are
81 # absolute or relative.
82 prefixdir = get_option('prefix')
83 if not prefixdir.startswith('/')
84 error('Prefix is not absolute: "@0@"'.format(prefixdir))
86 bindir = join_paths(prefixdir, get_option('bindir'))
87 libdir = join_paths(prefixdir, get_option('libdir'))
88 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
89 includedir = join_paths(prefixdir, get_option('includedir'))
90 datadir = join_paths(prefixdir, get_option('datadir'))
91 localstatedir = join_paths('/', get_option('localstatedir'))
93 rootbindir = join_paths(rootprefixdir, 'bin')
94 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
95 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
97 rootlibdir = get_option('rootlibdir')
99 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
102 # Dirs of external packages
103 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
104 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
105 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
106 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
107 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
108 varlogdir = join_paths(localstatedir, 'log')
109 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
110 rpmmacrosdir = get_option('rpmmacrosdir')
111 if rpmmacrosdir != 'no'
112 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
114 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
117 pkgdatadir = join_paths(datadir, 'systemd')
118 environmentdir = join_paths(prefixdir, 'lib/environment.d')
119 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
120 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
121 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
122 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
123 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
124 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
125 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
126 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
127 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
128 pkgincludedir = join_paths(includedir, 'systemd')
129 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
130 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
131 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
132 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
133 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
134 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
135 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
136 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
137 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
138 udevhomedir = udevlibexecdir
139 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
140 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
141 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
142 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
143 factorydir = join_paths(datadir, 'factory')
144 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
145 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
146 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
147 catalogstatedir = join_paths(systemdstatedir, 'catalog')
148 randomseeddir = join_paths(localstatedir, 'lib/systemd')
149 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
151 docdir = get_option('docdir')
153 docdir = join_paths(datadir, 'doc/systemd')
156 dbuspolicydir = get_option('dbuspolicydir')
157 if dbuspolicydir == ''
158 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
161 dbussessionservicedir = get_option('dbussessionservicedir')
162 if dbussessionservicedir == ''
163 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
166 dbussystemservicedir = get_option('dbussystemservicedir')
167 if dbussystemservicedir == ''
168 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
171 pamlibdir = get_option('pamlibdir')
173 pamlibdir = join_paths(rootlibdir, 'security')
176 pamconfdir = get_option('pamconfdir')
178 pamconfdir = join_paths(sysconfdir, 'pam.d')
181 memory_accounting_default = get_option('memory-accounting-default')
183 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
184 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
185 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
186 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
187 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
188 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
189 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
191 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
193 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
194 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
195 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
196 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
197 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
198 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
199 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
200 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
201 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
202 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
203 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
204 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
205 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
206 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
207 conf.set_quoted('ROOTPREFIX', rootprefixdir)
208 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
209 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
210 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
211 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
212 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
213 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
214 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
215 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
216 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
217 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
218 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
219 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
220 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
221 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
222 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
223 conf.set_quoted('LIBDIR', libdir)
224 conf.set_quoted('ROOTLIBDIR', rootlibdir)
225 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
226 conf.set_quoted('BOOTLIBDIR', bootlibdir)
227 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
228 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
229 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
230 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
231 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
232 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
233 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
234 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
235 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
237 substs.set('prefix', prefixdir)
238 substs.set('exec_prefix', prefixdir)
239 substs.set('libdir', libdir)
240 substs.set('rootlibdir', rootlibdir)
241 substs.set('includedir', includedir)
242 substs.set('pkgsysconfdir', pkgsysconfdir)
243 substs.set('bindir', bindir)
244 substs.set('rootbindir', rootbindir)
245 substs.set('rootlibexecdir', rootlibexecdir)
246 substs.set('systemunitdir', systemunitdir)
247 substs.set('userunitdir', userunitdir)
248 substs.set('systempresetdir', systempresetdir)
249 substs.set('userpresetdir', userpresetdir)
250 substs.set('udevhwdbdir', udevhwdbdir)
251 substs.set('udevrulesdir', udevrulesdir)
252 substs.set('udevlibexecdir', udevlibexecdir)
253 substs.set('environmentdir', environmentdir)
254 substs.set('catalogdir', catalogdir)
255 substs.set('tmpfilesdir', tmpfilesdir)
256 substs.set('sysusersdir', sysusersdir)
257 substs.set('sysctldir', sysctldir)
258 substs.set('binfmtdir', binfmtdir)
259 substs.set('modulesloaddir', modulesloaddir)
260 substs.set('modprobedir', modprobedir)
261 substs.set('systemgeneratordir', systemgeneratordir)
262 substs.set('usergeneratordir', usergeneratordir)
263 substs.set('systemenvgeneratordir', systemenvgeneratordir)
264 substs.set('userenvgeneratordir', userenvgeneratordir)
265 substs.set('systemshutdowndir', systemshutdowndir)
266 substs.set('systemsleepdir', systemsleepdir)
267 substs.set('VARLOGDIR', varlogdir)
268 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
269 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
270 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
271 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
272 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
273 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
274 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
275 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
276 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
278 #####################################################################
280 cc = meson.get_compiler('c')
281 pkgconfig = import('pkgconfig')
282 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
283 meson_build_sh = find_program('tools/meson-build.sh')
285 want_tests = get_option('tests')
286 slow_tests = want_tests != 'false' and get_option('slow-tests')
287 install_tests = get_option('install-tests')
289 if add_languages('cpp', required : fuzzer_build)
290 # Used only for tests
291 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
297 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
299 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
302 possible_cc_flags = [
306 '-Wmissing-include-dirs',
307 '-Wold-style-definition',
311 '-Wsuggest-attribute=noreturn',
312 '-Werror=missing-prototypes',
313 '-Werror=implicit-function-declaration',
314 '-Werror=missing-declarations',
315 '-Werror=return-type',
316 '-Werror=incompatible-pointer-types',
318 '-Wstrict-prototypes',
320 '-Wmissing-noreturn',
321 '-Wimplicit-fallthrough=5',
324 '-Wstrict-aliasing=2',
327 '-Werror=shift-count-overflow',
328 '-Werror=shift-overflow=2',
332 # negative arguments are correctly detected starting with meson 0.46.
333 '-Wno-unused-parameter',
334 '-Wno-missing-field-initializers',
335 '-Wno-unused-result',
336 '-Wno-format-signedness',
338 # work-around for gcc 7.1 turning this on on its own.
339 '-Wno-error=nonnull',
341 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
342 # optimizations enabled, producing essentially false positives.
343 '-Wno-maybe-uninitialized',
347 '-fdiagnostics-show-option',
348 '-fno-strict-aliasing',
349 '-fvisibility=hidden',
351 '-fstack-protector-strong',
352 '--param=ssp-buffer-size=4',
355 # --as-needed and --no-undefined are provided by meson by default,
356 # run mesonconf to see what is enabled
357 possible_link_flags = [
362 # the oss-fuzz fuzzers are not built with -fPIE, so don't
363 # enable it when we are linking against them
365 possible_cc_flags += '-fPIE'
366 possible_link_flags += '-pie'
369 if cc.get_id() == 'clang'
370 possible_cc_flags += [
371 '-Wno-typedef-redefinition',
372 '-Wno-gnu-variable-sized-type-not-at-end',
376 if get_option('buildtype') != 'debug'
377 possible_cc_flags += [
378 '-ffunction-sections',
382 possible_link_flags += '-Wl,--gc-sections'
385 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
386 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
390 #include <inttypes.h>
391 typedef uint64_t usec_t;
392 usec_t now(clockid_t clock);
397 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
398 add_project_arguments('-Werror=shadow', language : 'c')
401 cpp = ' '.join(cc.cmd_array()) + ' -E'
403 #####################################################################
404 # compilation result tests
406 conf.set('_GNU_SOURCE', true)
407 conf.set('__SANE_USERSPACE_TYPES__', true)
409 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
410 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
411 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
412 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
415 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
419 #include <linux/ethtool.h>
420 #include <linux/fib_rules.h>
421 #include <sys/stat.h>
424 foreach decl : ['char16_t',
426 'struct fib_rule_uid_range',
427 'struct fib_rule_port_range',
431 # We get -1 if the size cannot be determined
432 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
434 if decl == 'struct statx'
436 want_linux_stat_h = false
438 have = cc.sizeof(decl,
439 prefix : decl_headers + '#include <linux/stat.h>',
440 args : '-D_GNU_SOURCE') > 0
441 want_linux_stat_h = have
445 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
448 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
450 foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
451 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
452 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
453 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
454 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
455 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
456 ['FRA_TUN_ID', 'linux/fib_rules.h'],
457 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
458 ['FRA_PAD', 'linux/fib_rules.h'],
459 ['FRA_L3MDEV', 'linux/fib_rules.h'],
460 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
461 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
462 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
463 ['FOU_CMD_GET', 'linux/fou.h'],
464 ['IFA_FLAGS', 'linux/if_addr.h'],
465 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
466 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
467 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
468 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
469 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
470 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
471 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
472 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
473 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
474 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
475 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
476 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
477 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
478 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
479 ['IFLA_PAD', 'linux/if_link.h'],
480 ['IFLA_XDP', 'linux/if_link.h'],
481 ['IFLA_EVENT', 'linux/if_link.h'],
482 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
483 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
484 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
485 ['IFLA_MAX_MTU', 'linux/if_link.h'],
486 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
487 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
488 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
489 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
490 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
491 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
492 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
493 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
494 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
495 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
496 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
497 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
498 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
499 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
500 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
501 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
502 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
503 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
504 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
505 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
506 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
507 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
508 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
509 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
510 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
511 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
512 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
513 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
514 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
515 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
516 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
517 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
518 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
519 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
520 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
521 # if_tunnel.h is buggy and cannot be included on its own
522 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
523 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
524 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
525 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
526 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
527 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
528 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
529 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
530 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
531 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
532 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
534 prefix = decl.length() > 2 ? decl[2] : ''
535 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
536 conf.set10('HAVE_' + decl[0], have)
539 foreach ident : ['secure_getenv', '__secure_getenv']
540 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
544 ['memfd_create', '''#include <sys/mman.h>'''],
545 ['gettid', '''#include <sys/types.h>
546 #include <unistd.h>'''],
547 ['pivot_root', '''#include <stdlib.h>
548 #include <unistd.h>'''], # no known header declares pivot_root
549 ['name_to_handle_at', '''#include <sys/types.h>
550 #include <sys/stat.h>
551 #include <fcntl.h>'''],
552 ['setns', '''#include <sched.h>'''],
553 ['renameat2', '''#include <stdio.h>
554 #include <fcntl.h>'''],
555 ['kcmp', '''#include <linux/kcmp.h>'''],
556 ['keyctl', '''#include <sys/types.h>
557 #include <keyutils.h>'''],
558 ['copy_file_range', '''#include <sys/syscall.h>
559 #include <unistd.h>'''],
560 ['bpf', '''#include <sys/syscall.h>
561 #include <unistd.h>'''],
562 ['statx', '''#include <sys/types.h>
563 #include <sys/stat.h>
564 #include <unistd.h>'''],
565 ['explicit_bzero' , '''#include <string.h>'''],
566 ['reallocarray', '''#include <malloc.h>'''],
569 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
570 conf.set10('HAVE_' + ident[0].to_upper(), have)
573 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
574 conf.set10('USE_SYS_RANDOM_H', true)
575 conf.set10('HAVE_GETRANDOM', true)
577 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
578 conf.set10('USE_SYS_RANDOM_H', false)
579 conf.set10('HAVE_GETRANDOM', have)
582 #####################################################################
584 vcs_tagger = [meson.source_root() + '/tools/meson-vcs-tag.sh',
586 get_option('version-tag'),
587 meson.project_version()]
589 sed = find_program('sed')
590 awk = find_program('awk')
591 m4 = find_program('m4')
592 stat = find_program('stat')
593 git = find_program('git', required : false)
594 env = find_program('env')
595 perl = find_program('perl', required : false)
597 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
598 mkdir_p = 'mkdir -p $DESTDIR/@0@'
599 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
600 splash_bmp = files('test/splash.bmp')
602 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
603 # /usr/sbin, /sbin, and fall back to the default from middle column.
604 progs = [['quotaon', '/usr/sbin/quotaon' ],
605 ['quotacheck', '/usr/sbin/quotacheck' ],
606 ['kmod', '/usr/bin/kmod' ],
607 ['kexec', '/usr/sbin/kexec' ],
608 ['sulogin', '/usr/sbin/sulogin' ],
609 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
610 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
611 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
612 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
615 path = get_option(prog[0] + '-path')
617 message('Using @1@ for @0@'.format(prog[0], path))
619 exe = find_program(prog[0],
620 '/usr/sbin/' + prog[0],
623 path = exe.found() ? exe.path() : prog[1]
625 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
626 conf.set_quoted(name, path)
627 substs.set(name, path)
630 conf.set_quoted('TELINIT', get_option('telinit-path'))
632 if run_command('ln', '--relative', '--help').returncode() != 0
633 error('ln does not support --relative (added in coreutils 8.16)')
636 ############################################################
638 gperf = find_program('gperf')
640 gperf_test_format = '''
642 const char * in_word_set(const char *, @0@);
645 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
646 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
647 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
648 if cc.compiles(gperf_test)
649 gperf_len_type = 'size_t'
651 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
652 if cc.compiles(gperf_test)
653 gperf_len_type = 'unsigned'
655 error('unable to determine gperf len type')
658 message('gperf len type is @0@'.format(gperf_len_type))
659 conf.set('GPERF_LEN_TYPE', gperf_len_type,
660 description : 'The type of gperf "len" parameter')
662 ############################################################
664 if not cc.has_header('sys/capability.h')
665 error('POSIX caps headers not found')
667 foreach header : ['crypt.h',
668 'linux/btrfs_tree.h',
671 'linux/vm_sockets.h',
674 'valgrind/memcheck.h',
675 'valgrind/valgrind.h',
678 conf.set10('HAVE_' + header.underscorify().to_upper(),
679 cc.has_header(header))
682 ############################################################
684 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
685 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
686 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
688 default_hierarchy = get_option('default-hierarchy')
689 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
690 description : 'default cgroup hierarchy as string')
691 if default_hierarchy == 'legacy'
692 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
693 elif default_hierarchy == 'hybrid'
694 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
696 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
699 default_net_naming_scheme = get_option('default-net-naming-scheme')
700 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
702 time_epoch = get_option('time-epoch')
705 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
707 conf.set('TIME_EPOCH', time_epoch)
709 system_uid_max = get_option('system-uid-max')
710 if system_uid_max == -1
711 system_uid_max = run_command(
713 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
714 '/etc/login.defs').stdout().strip()
715 if system_uid_max == ''
718 system_uid_max = system_uid_max.to_int()
721 conf.set('SYSTEM_UID_MAX', system_uid_max)
722 substs.set('systemuidmax', system_uid_max)
724 system_gid_max = get_option('system-gid-max')
725 if system_gid_max == -1
726 system_gid_max = run_command(
728 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
729 '/etc/login.defs').stdout().strip()
730 if system_gid_max == ''
733 system_gid_max = system_gid_max.to_int()
736 conf.set('SYSTEM_GID_MAX', system_gid_max)
737 substs.set('systemgidmax', system_gid_max)
739 dynamic_uid_min = get_option('dynamic-uid-min')
740 dynamic_uid_max = get_option('dynamic-uid-max')
741 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
742 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
743 substs.set('dynamicuidmin', dynamic_uid_min)
744 substs.set('dynamicuidmax', dynamic_uid_max)
746 container_uid_base_min = get_option('container-uid-base-min')
747 container_uid_base_max = get_option('container-uid-base-max')
748 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
749 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
750 substs.set('containeruidbasemin', container_uid_base_min)
751 substs.set('containeruidbasemax', container_uid_base_max)
753 nobody_user = get_option('nobody-user')
754 nobody_group = get_option('nobody-group')
756 if not meson.is_cross_build()
757 getent_result = run_command('getent', 'passwd', '65534')
758 if getent_result.returncode() == 0
759 name = getent_result.stdout().split(':')[0]
760 if name != nobody_user
762 '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) +
763 'Your build will result in an user table setup that is incompatible with the local system.')
766 id_result = run_command('id', '-u', nobody_user)
767 if id_result.returncode() == 0
768 id = id_result.stdout().to_int()
771 '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) +
772 'Your build will result in an user table setup that is incompatible with the local system.')
776 getent_result = run_command('getent', 'group', '65534')
777 if getent_result.returncode() == 0
778 name = getent_result.stdout().split(':')[0]
779 if name != nobody_group
781 '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) +
782 'Your build will result in an group table setup that is incompatible with the local system.')
785 id_result = run_command('id', '-g', nobody_group)
786 if id_result.returncode() == 0
787 id = id_result.stdout().to_int()
790 '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) +
791 'Your build will result in an group table setup that is incompatible with the local system.')
795 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
797 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
798 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
801 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
802 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
803 substs.set('NOBODY_USER_NAME', nobody_user)
804 substs.set('NOBODY_GROUP_NAME', nobody_group)
806 tty_gid = get_option('tty-gid')
807 conf.set('TTY_GID', tty_gid)
808 substs.set('TTY_GID', tty_gid)
810 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
811 users_gid = get_option('users-gid')
812 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
814 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
815 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
817 dev_kvm_mode = get_option('dev-kvm-mode')
818 substs.set('DEV_KVM_MODE', dev_kvm_mode)
819 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
820 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
822 kill_user_processes = get_option('default-kill-user-processes')
823 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
824 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
825 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
827 dns_servers = get_option('dns-servers')
828 conf.set_quoted('DNS_SERVERS', dns_servers)
829 substs.set('DNS_SERVERS', dns_servers)
831 ntp_servers = get_option('ntp-servers')
832 conf.set_quoted('NTP_SERVERS', ntp_servers)
833 substs.set('NTP_SERVERS', ntp_servers)
835 default_locale = get_option('default-locale')
836 if default_locale == ''
837 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
838 default_locale = run_command(choose_default_locale_sh).stdout().strip()
840 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
842 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
844 substs.set('SUSHELL', get_option('debug-shell'))
845 substs.set('DEBUGTTY', get_option('debug-tty'))
847 enable_debug_hashmap = false
848 enable_debug_mmap_cache = false
849 enable_debug_siphash = false
850 enable_debug_udev = false
851 foreach name : get_option('debug-extra')
853 enable_debug_hashmap = true
854 elif name == 'mmap-cache'
855 enable_debug_mmap_cache = true
856 elif name == 'siphash'
857 enable_debug_siphash = true
859 enable_debug_udev = true
861 message('unknown debug option "@0@", ignoring'.format(name))
864 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
865 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
866 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
867 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
869 conf.set10('VALGRIND', get_option('valgrind'))
870 conf.set10('LOG_TRACE', get_option('log-trace'))
872 #####################################################################
874 threads = dependency('threads')
875 librt = cc.find_library('rt')
876 libm = cc.find_library('m')
877 libdl = cc.find_library('dl')
878 libcrypt = cc.find_library('crypt')
880 libcap = dependency('libcap', required : false)
881 if not libcap.found()
882 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
883 libcap = cc.find_library('cap')
886 libmount = dependency('mount',
887 version : fuzzer_build ? '>= 0' : '>= 2.30')
889 want_seccomp = get_option('seccomp')
890 if want_seccomp != 'false' and not fuzzer_build
891 libseccomp = dependency('libseccomp',
892 version : '>= 2.3.1',
893 required : want_seccomp == 'true')
894 have = libseccomp.found()
899 conf.set10('HAVE_SECCOMP', have)
901 want_selinux = get_option('selinux')
902 if want_selinux != 'false' and not fuzzer_build
903 libselinux = dependency('libselinux',
904 version : '>= 2.1.9',
905 required : want_selinux == 'true')
906 have = libselinux.found()
911 conf.set10('HAVE_SELINUX', have)
913 want_apparmor = get_option('apparmor')
914 if want_apparmor != 'false' and not fuzzer_build
915 libapparmor = dependency('libapparmor',
916 required : want_apparmor == 'true')
917 have = libapparmor.found()
922 conf.set10('HAVE_APPARMOR', have)
924 smack_run_label = get_option('smack-run-label')
925 if smack_run_label != ''
926 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
929 want_polkit = get_option('polkit')
930 install_polkit = false
931 install_polkit_pkla = false
932 if want_polkit != 'false' and not fuzzer_build
933 install_polkit = true
935 libpolkit = dependency('polkit-gobject-1',
937 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
938 message('Old polkit detected, will install pkla files')
939 install_polkit_pkla = true
942 conf.set10('ENABLE_POLKIT', install_polkit)
944 want_acl = get_option('acl')
945 if want_acl != 'false' and not fuzzer_build
946 libacl = cc.find_library('acl', required : want_acl == 'true')
947 have = libacl.found()
952 conf.set10('HAVE_ACL', have)
954 want_audit = get_option('audit')
955 if want_audit != 'false' and not fuzzer_build
956 libaudit = dependency('audit', required : want_audit == 'true')
957 have = libaudit.found()
962 conf.set10('HAVE_AUDIT', have)
964 want_blkid = get_option('blkid')
965 if want_blkid != 'false' and not fuzzer_build
966 libblkid = dependency('blkid', required : want_blkid == 'true')
967 have = libblkid.found()
972 conf.set10('HAVE_BLKID', have)
974 want_kmod = get_option('kmod')
975 if want_kmod != 'false' and not fuzzer_build
976 libkmod = dependency('libkmod',
978 required : want_kmod == 'true')
979 have = libkmod.found()
984 conf.set10('HAVE_KMOD', have)
986 want_pam = get_option('pam')
987 if want_pam != 'false' and not fuzzer_build
988 libpam = cc.find_library('pam', required : want_pam == 'true')
989 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
990 have = libpam.found() and libpam_misc.found()
996 conf.set10('HAVE_PAM', have)
998 want_microhttpd = get_option('microhttpd')
999 if want_microhttpd != 'false' and not fuzzer_build
1000 libmicrohttpd = dependency('libmicrohttpd',
1001 version : '>= 0.9.33',
1002 required : want_microhttpd == 'true')
1003 have = libmicrohttpd.found()
1008 conf.set10('HAVE_MICROHTTPD', have)
1010 want_libcryptsetup = get_option('libcryptsetup')
1011 if want_libcryptsetup != 'false' and not fuzzer_build
1012 libcryptsetup = dependency('libcryptsetup',
1013 version : '>= 1.6.0',
1014 required : want_libcryptsetup == 'true')
1015 have = libcryptsetup.found()
1016 have_sector = cc.has_member(
1017 'struct crypt_params_plain',
1019 prefix : '#include <libcryptsetup.h>')
1025 conf.set10('HAVE_LIBCRYPTSETUP', have)
1026 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1028 want_libcurl = get_option('libcurl')
1029 if want_libcurl != 'false' and not fuzzer_build
1030 libcurl = dependency('libcurl',
1031 version : '>= 7.32.0',
1032 required : want_libcurl == 'true')
1033 have = libcurl.found()
1038 conf.set10('HAVE_LIBCURL', have)
1040 want_libidn = get_option('libidn')
1041 want_libidn2 = get_option('libidn2')
1042 if want_libidn == 'true' and want_libidn2 == 'true'
1043 error('libidn and libidn2 cannot be requested simultaneously')
1046 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1047 libidn = dependency('libidn',
1048 required : want_libidn == 'true')
1049 have = libidn.found()
1054 conf.set10('HAVE_LIBIDN', have)
1055 if not have and want_libidn2 != 'false' and not fuzzer_build
1056 # libidn is used for both libidn and libidn2 objects
1057 libidn = dependency('libidn2',
1058 required : want_libidn2 == 'true')
1059 have = libidn.found()
1063 conf.set10('HAVE_LIBIDN2', have)
1065 want_libiptc = get_option('libiptc')
1066 if want_libiptc != 'false' and not fuzzer_build
1067 libiptc = dependency('libiptc',
1068 required : want_libiptc == 'true')
1069 have = libiptc.found()
1074 conf.set10('HAVE_LIBIPTC', have)
1076 want_qrencode = get_option('qrencode')
1077 if want_qrencode != 'false' and not fuzzer_build
1078 libqrencode = dependency('libqrencode',
1079 required : want_qrencode == 'true')
1080 have = libqrencode.found()
1085 conf.set10('HAVE_QRENCODE', have)
1087 want_gcrypt = get_option('gcrypt')
1088 if want_gcrypt != 'false' and not fuzzer_build
1089 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1090 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1091 have = libgcrypt.found() and libgpg_error.found()
1096 # link to neither of the libs if one is not found
1100 conf.set10('HAVE_GCRYPT', have)
1102 want_gnutls = get_option('gnutls')
1103 if want_gnutls != 'false' and not fuzzer_build
1104 libgnutls = dependency('gnutls',
1105 version : '>= 3.1.4',
1106 required : want_gnutls == 'true')
1107 have = libgnutls.found()
1112 conf.set10('HAVE_GNUTLS', have)
1114 want_openssl = get_option('openssl')
1115 if want_openssl != 'false' and not fuzzer_build
1116 libopenssl = dependency('openssl',
1117 version : '>= 1.1.0',
1118 required : want_openssl == 'true')
1119 have = libopenssl.found()
1124 conf.set10('HAVE_OPENSSL', have)
1126 want_elfutils = get_option('elfutils')
1127 if want_elfutils != 'false' and not fuzzer_build
1128 libdw = dependency('libdw',
1129 required : want_elfutils == 'true')
1130 have = libdw.found()
1135 conf.set10('HAVE_ELFUTILS', have)
1137 want_zlib = get_option('zlib')
1138 if want_zlib != 'false' and not fuzzer_build
1139 libz = dependency('zlib',
1140 required : want_zlib == 'true')
1146 conf.set10('HAVE_ZLIB', have)
1148 want_bzip2 = get_option('bzip2')
1149 if want_bzip2 != 'false' and not fuzzer_build
1150 libbzip2 = cc.find_library('bz2',
1151 required : want_bzip2 == 'true')
1152 have = libbzip2.found()
1157 conf.set10('HAVE_BZIP2', have)
1159 want_xz = get_option('xz')
1160 if want_xz != 'false' and not fuzzer_build
1161 libxz = dependency('liblzma',
1162 required : want_xz == 'true')
1163 have = libxz.found()
1168 conf.set10('HAVE_XZ', have)
1170 want_lz4 = get_option('lz4')
1171 if want_lz4 != 'false' and not fuzzer_build
1172 liblz4 = dependency('liblz4',
1173 version : '>= 1.3.0',
1174 required : want_lz4 == 'true')
1175 have = liblz4.found()
1180 conf.set10('HAVE_LZ4', have)
1182 want_xkbcommon = get_option('xkbcommon')
1183 if want_xkbcommon != 'false' and not fuzzer_build
1184 libxkbcommon = dependency('xkbcommon',
1185 version : '>= 0.3.0',
1186 required : want_xkbcommon == 'true')
1187 have = libxkbcommon.found()
1192 conf.set10('HAVE_XKBCOMMON', have)
1194 want_pcre2 = get_option('pcre2')
1195 if want_pcre2 != 'false'
1196 libpcre2 = dependency('libpcre2-8',
1197 required : want_pcre2 == 'true')
1198 have = libpcre2.found()
1203 conf.set10('HAVE_PCRE2', have)
1205 want_glib = get_option('glib')
1206 if want_glib != 'false' and not fuzzer_build
1207 libglib = dependency('glib-2.0',
1208 version : '>= 2.22.0',
1209 required : want_glib == 'true')
1210 libgobject = dependency('gobject-2.0',
1211 version : '>= 2.22.0',
1212 required : want_glib == 'true')
1213 libgio = dependency('gio-2.0',
1214 required : want_glib == 'true')
1215 have = libglib.found() and libgobject.found() and libgio.found()
1222 conf.set10('HAVE_GLIB', have)
1224 want_dbus = get_option('dbus')
1225 if want_dbus != 'false' and not fuzzer_build
1226 libdbus = dependency('dbus-1',
1227 version : '>= 1.3.2',
1228 required : want_dbus == 'true')
1229 have = libdbus.found()
1234 conf.set10('HAVE_DBUS', have)
1236 default_dnssec = get_option('default-dnssec')
1238 default_dnssec = 'no'
1240 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1241 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1242 default_dnssec = 'no'
1244 conf.set('DEFAULT_DNSSEC_MODE',
1245 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1246 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1248 dns_over_tls = get_option('dns-over-tls')
1249 if dns_over_tls != 'false'
1250 if dns_over_tls == 'openssl'
1253 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1254 if dns_over_tls == 'gnutls' and not have_gnutls
1255 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1258 if dns_over_tls == 'gnutls' or have_gnutls
1259 have_openssl = false
1261 have_openssl = conf.get('HAVE_OPENSSL') == 1
1262 if dns_over_tls != 'auto' and not have_openssl
1263 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1264 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1267 have = have_gnutls or have_openssl
1271 have_openssl = false
1273 conf.set10('ENABLE_DNS_OVER_TLS', have)
1274 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1275 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1277 default_dns_over_tls = get_option('default-dns-over-tls')
1279 default_dns_over_tls = 'no'
1281 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1282 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1283 default_dns_over_tls = 'no'
1285 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1286 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1287 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1289 want_importd = get_option('importd')
1290 if want_importd != 'false'
1291 have = (conf.get('HAVE_LIBCURL') == 1 and
1292 conf.get('HAVE_ZLIB') == 1 and
1293 conf.get('HAVE_XZ') == 1 and
1294 conf.get('HAVE_GCRYPT') == 1)
1295 if want_importd == 'true' and not have
1296 error('importd support was requested, but dependencies are not available')
1301 conf.set10('ENABLE_IMPORTD', have)
1303 want_remote = get_option('remote')
1304 if want_remote != 'false'
1305 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1306 conf.get('HAVE_LIBCURL') == 1]
1307 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1308 # it's possible to build one without the other. Complain only if
1309 # support was explictly requested. The auxiliary files like sysusers
1310 # config should be installed when any of the programs are built.
1311 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1312 error('remote support was requested, but dependencies are not available')
1314 have = have_deps[0] or have_deps[1]
1318 conf.set10('ENABLE_REMOTE', have)
1320 foreach term : ['utmp',
1352 have = get_option(term)
1353 name = 'ENABLE_' + term.underscorify().to_upper()
1354 conf.set10(name, have)
1357 foreach tuple : [['nss-mymachines', 'machined'],
1358 ['nss-resolve', 'resolve']]
1359 want = get_option(tuple[0])
1361 have = get_option(tuple[1])
1362 if want == 'true' and not have
1363 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1368 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1369 conf.set10(name, have)
1373 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1374 'ENABLE_NSS_MYMACHINES',
1375 'ENABLE_NSS_RESOLVE',
1376 'ENABLE_NSS_SYSTEMD']
1377 if conf.get(term) == 1
1381 conf.set10('ENABLE_NSS', enable_nss)
1383 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1388 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1390 #####################################################################
1392 if get_option('efi')
1393 efi_arch = host_machine.cpu_family()
1395 if efi_arch == 'x86'
1396 EFI_MACHINE_TYPE_NAME = 'ia32'
1397 gnu_efi_arch = 'ia32'
1398 elif efi_arch == 'x86_64'
1399 EFI_MACHINE_TYPE_NAME = 'x64'
1400 gnu_efi_arch = 'x86_64'
1401 elif efi_arch == 'arm'
1402 EFI_MACHINE_TYPE_NAME = 'arm'
1403 gnu_efi_arch = 'arm'
1404 elif efi_arch == 'aarch64'
1405 EFI_MACHINE_TYPE_NAME = 'aa64'
1406 gnu_efi_arch = 'aarch64'
1408 EFI_MACHINE_TYPE_NAME = ''
1413 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1415 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1419 conf.set10('ENABLE_EFI', have)
1421 #####################################################################
1423 config_h = configure_file(
1424 output : 'config.h',
1425 configuration : conf)
1427 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1429 includes = include_directories('src/basic',
1433 'src/journal-remote',
1437 'src/time-wait-sync',
1442 'src/libsystemd/sd-bus',
1443 'src/libsystemd/sd-device',
1444 'src/libsystemd/sd-event',
1445 'src/libsystemd/sd-hwdb',
1446 'src/libsystemd/sd-id128',
1447 'src/libsystemd/sd-netlink',
1448 'src/libsystemd/sd-network',
1449 'src/libsystemd/sd-resolve',
1450 'src/libsystemd-network',
1453 add_project_arguments('-include', 'config.h', language : 'c')
1455 generate_gperfs = find_program('tools/generate-gperfs.py')
1459 subdir('src/systemd')
1461 subdir('src/libsystemd')
1462 subdir('src/libsystemd-network')
1463 subdir('src/journal')
1466 libjournal_core = static_library(
1468 libjournal_core_sources,
1470 include_directories : includes,
1473 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1474 libsystemd = shared_library(
1477 version : libsystemd_version,
1478 include_directories : includes,
1479 link_args : ['-shared',
1480 '-Wl,--version-script=' + libsystemd_sym_path],
1481 link_with : [libbasic,
1483 link_whole : [libsystemd_static,
1485 dependencies : [threads,
1489 link_depends : libsystemd_sym,
1491 install_dir : rootlibdir)
1493 static_libsystemd = get_option('static-libsystemd')
1494 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1496 install_libsystemd_static = static_library(
1499 journal_client_sources,
1501 basic_gcrypt_sources,
1503 include_directories : includes,
1504 build_by_default : static_libsystemd != 'false',
1505 install : static_libsystemd != 'false',
1506 install_dir : rootlibdir,
1507 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1508 dependencies : [threads,
1517 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1519 ############################################################
1521 # binaries that have --help and are intended for use by humans,
1522 # usually, but not always, installed in /bin.
1523 public_programs = []
1525 subdir('src/libudev')
1526 subdir('src/shared')
1529 subdir('src/network')
1531 subdir('src/analyze')
1532 subdir('src/journal-remote')
1533 subdir('src/coredump')
1534 subdir('src/hostname')
1535 subdir('src/import')
1536 subdir('src/kernel-install')
1537 subdir('src/locale')
1538 subdir('src/machine')
1539 subdir('src/portable')
1540 subdir('src/nspawn')
1541 subdir('src/resolve')
1542 subdir('src/timedate')
1543 subdir('src/timesync')
1544 subdir('src/vconsole')
1545 subdir('src/boot/efi')
1552 ############################################################
1554 # only static linking apart from libdl, to make sure that the
1555 # module is linked to all libraries that it uses.
1556 test_dlopen = executable(
1560 include_directories : includes,
1561 link_with : [libbasic],
1562 dependencies : [libdl],
1563 build_by_default : want_tests != 'false')
1565 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1566 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1567 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1568 ['resolve', 'ENABLE_NSS_RESOLVE']]
1570 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1574 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1575 version_script_arg = join_paths(meson.source_root(), sym)
1577 nss = shared_library(
1579 'src/nss-@0@/nss-@0@.c'.format(module),
1582 include_directories : includes,
1583 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1584 link_args : ['-Wl,-z,nodelete',
1586 '-Wl,--version-script=' + version_script_arg,
1588 link_with : [libsystemd_static,
1590 dependencies : [threads,
1594 install_dir : rootlibdir)
1596 # We cannot use shared_module because it does not support version suffix.
1597 # Unfortunately shared_library insists on creating the symlink…
1598 meson.add_install_script('sh', '-c',
1599 'rm $DESTDIR@0@/libnss_@1@.so'
1600 .format(rootlibdir, module))
1602 if want_tests != 'false'
1603 test('dlopen-nss_' + module,
1605 # path to dlopen must include a slash
1606 args : nss.full_path())
1611 ############################################################
1613 executable('systemd',
1615 include_directories : includes,
1616 link_with : [libcore,
1618 dependencies : [threads,
1624 install_rpath : rootlibexecdir,
1626 install_dir : rootlibexecdir)
1628 meson.add_install_script(meson_make_symlink,
1629 join_paths(rootlibexecdir, 'systemd'),
1630 join_paths(rootsbindir, 'init'))
1632 exe = executable('systemd-analyze',
1633 systemd_analyze_sources,
1634 include_directories : includes,
1635 link_with : [libcore,
1637 dependencies : [threads,
1643 install_rpath : rootlibexecdir,
1645 public_programs += exe
1647 executable('systemd-journald',
1648 systemd_journald_sources,
1649 include_directories : includes,
1650 link_with : [libjournal_core,
1652 dependencies : [threads,
1656 install_rpath : rootlibexecdir,
1658 install_dir : rootlibexecdir)
1660 exe = executable('systemd-cat',
1661 systemd_cat_sources,
1662 include_directories : includes,
1663 link_with : [libjournal_core,
1665 dependencies : [threads],
1666 install_rpath : rootlibexecdir,
1668 public_programs += exe
1670 exe = executable('journalctl',
1672 include_directories : includes,
1673 link_with : [libshared],
1674 dependencies : [threads,
1679 install_rpath : rootlibexecdir,
1681 install_dir : rootbindir)
1682 public_programs += exe
1684 executable('systemd-getty-generator',
1685 'src/getty-generator/getty-generator.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 install_rpath : rootlibexecdir,
1690 install_dir : systemgeneratordir)
1692 executable('systemd-debug-generator',
1693 'src/debug-generator/debug-generator.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 install_rpath : rootlibexecdir,
1698 install_dir : systemgeneratordir)
1700 executable('systemd-run-generator',
1701 'src/run-generator/run-generator.c',
1702 include_directories : includes,
1703 link_with : [libshared],
1704 install_rpath : rootlibexecdir,
1706 install_dir : systemgeneratordir)
1708 executable('systemd-fstab-generator',
1709 'src/fstab-generator/fstab-generator.c',
1710 'src/core/mount-setup.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 install_rpath : rootlibexecdir,
1715 install_dir : systemgeneratordir)
1717 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1718 executable('30-systemd-environment-d-generator',
1719 'src/environment-d-generator/environment-d-generator.c',
1720 include_directories : includes,
1721 link_with : [libshared],
1722 install_rpath : rootlibexecdir,
1724 install_dir : userenvgeneratordir)
1726 meson.add_install_script(meson_make_symlink,
1727 join_paths(sysconfdir, 'environment'),
1728 join_paths(environmentdir, '99-environment.conf'))
1731 if conf.get('ENABLE_HIBERNATE') == 1
1732 executable('systemd-hibernate-resume-generator',
1733 'src/hibernate-resume/hibernate-resume-generator.c',
1734 include_directories : includes,
1735 link_with : [libshared],
1736 install_rpath : rootlibexecdir,
1738 install_dir : systemgeneratordir)
1740 executable('systemd-hibernate-resume',
1741 'src/hibernate-resume/hibernate-resume.c',
1742 include_directories : includes,
1743 link_with : [libshared],
1744 install_rpath : rootlibexecdir,
1746 install_dir : rootlibexecdir)
1749 if conf.get('HAVE_BLKID') == 1
1750 executable('systemd-gpt-auto-generator',
1751 'src/gpt-auto-generator/gpt-auto-generator.c',
1752 'src/shared/blkid-util.h',
1753 include_directories : includes,
1754 link_with : [libshared],
1755 dependencies : libblkid,
1756 install_rpath : rootlibexecdir,
1758 install_dir : systemgeneratordir)
1760 exe = executable('systemd-dissect',
1761 'src/dissect/dissect.c',
1762 include_directories : includes,
1763 link_with : [libshared],
1764 install_rpath : rootlibexecdir,
1766 install_dir : rootlibexecdir)
1767 public_programs += exe
1770 if conf.get('ENABLE_RESOLVE') == 1
1771 executable('systemd-resolved',
1772 systemd_resolved_sources,
1773 include_directories : includes,
1774 link_with : [libshared,
1776 libsystemd_resolve_core],
1777 dependencies : systemd_resolved_dependencies,
1778 install_rpath : rootlibexecdir,
1780 install_dir : rootlibexecdir)
1782 exe = executable('resolvectl',
1784 include_directories : includes,
1785 link_with : [libshared,
1787 libsystemd_resolve_core],
1788 dependencies : [threads,
1792 install_rpath : rootlibexecdir,
1794 public_programs += exe
1796 meson.add_install_script(meson_make_symlink,
1797 join_paths(bindir, 'resolvectl'),
1798 join_paths(rootsbindir, 'resolvconf'))
1800 meson.add_install_script(meson_make_symlink,
1801 join_paths(bindir, 'resolvectl'),
1802 join_paths(bindir, 'systemd-resolve'))
1805 if conf.get('ENABLE_LOGIND') == 1
1806 executable('systemd-logind',
1807 systemd_logind_sources,
1808 include_directories : includes,
1809 link_with : [liblogind_core,
1811 dependencies : [threads,
1813 install_rpath : rootlibexecdir,
1815 install_dir : rootlibexecdir)
1817 exe = executable('loginctl',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 dependencies : [threads,
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootbindir)
1827 public_programs += exe
1829 exe = executable('systemd-inhibit',
1830 'src/login/inhibit.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 install_rpath : rootlibexecdir,
1835 install_dir : rootbindir)
1836 public_programs += exe
1838 if conf.get('HAVE_PAM') == 1
1839 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1840 pam_systemd = shared_library(
1844 include_directories : includes,
1845 link_args : ['-shared',
1846 '-Wl,--version-script=' + version_script_arg],
1847 link_with : [libsystemd_static,
1849 dependencies : [threads,
1852 link_depends : pam_systemd_sym,
1854 install_dir : pamlibdir)
1856 if want_tests != 'false'
1857 test('dlopen-pam_systemd',
1859 # path to dlopen must include a slash
1860 args : pam_systemd.full_path())
1864 executable('systemd-user-runtime-dir',
1865 user_runtime_dir_sources,
1866 include_directories : includes,
1867 link_with : [libshared],
1868 install_rpath : rootlibexecdir,
1870 install_dir : rootlibexecdir)
1873 if conf.get('HAVE_PAM') == 1
1874 executable('systemd-user-sessions',
1875 'src/user-sessions/user-sessions.c',
1876 include_directories : includes,
1877 link_with : [libshared],
1878 install_rpath : rootlibexecdir,
1880 install_dir : rootlibexecdir)
1883 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1884 exe = executable('bootctl',
1885 'src/boot/bootctl.c',
1886 include_directories : includes,
1887 link_with : [libshared],
1888 dependencies : [libblkid],
1889 install_rpath : rootlibexecdir,
1891 public_programs += exe
1893 executable('systemd-bless-boot',
1894 'src/boot/bless-boot.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 dependencies : [libblkid],
1898 install_rpath : rootlibexecdir,
1900 install_dir : rootlibexecdir)
1902 executable('systemd-bless-boot-generator',
1903 'src/boot/bless-boot-generator.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 install_rpath : rootlibexecdir,
1908 install_dir : systemgeneratordir)
1911 executable('systemd-boot-check-no-failures',
1912 'src/boot/boot-check-no-failures.c',
1913 include_directories : includes,
1914 link_with : [libshared],
1915 dependencies : [libblkid],
1916 install_rpath : rootlibexecdir,
1918 install_dir : rootlibexecdir)
1920 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1921 include_directories : includes,
1922 link_with : [libshared],
1923 dependencies : [threads],
1924 install_rpath : rootlibexecdir,
1926 public_programs += exe
1929 if get_option('link-systemctl-shared')
1930 systemctl_link_with = [libshared]
1932 systemctl_link_with = [libsystemd_static,
1938 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1939 include_directories : includes,
1940 link_with : systemctl_link_with,
1941 dependencies : [threads,
1946 install_rpath : rootlibexecdir,
1948 install_dir : rootbindir)
1949 public_programs += exe
1951 if conf.get('ENABLE_PORTABLED') == 1
1952 executable('systemd-portabled',
1953 systemd_portabled_sources,
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [threads],
1957 install_rpath : rootlibexecdir,
1959 install_dir : rootlibexecdir)
1961 exe = executable('portablectl', 'src/portable/portablectl.c',
1962 include_directories : includes,
1963 link_with : [libshared],
1964 dependencies : [threads],
1965 install_rpath : rootlibexecdir,
1967 install_dir : rootbindir)
1968 public_programs += exe
1971 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1972 meson.add_install_script(meson_make_symlink,
1973 join_paths(rootbindir, 'systemctl'),
1974 join_paths(rootsbindir, alias))
1977 if conf.get('ENABLE_BACKLIGHT') == 1
1978 executable('systemd-backlight',
1979 'src/backlight/backlight.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 install_rpath : rootlibexecdir,
1984 install_dir : rootlibexecdir)
1987 if conf.get('ENABLE_RFKILL') == 1
1988 executable('systemd-rfkill',
1989 'src/rfkill/rfkill.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootlibexecdir)
1997 executable('systemd-system-update-generator',
1998 'src/system-update-generator/system-update-generator.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 install_rpath : rootlibexecdir,
2003 install_dir : systemgeneratordir)
2005 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2006 executable('systemd-cryptsetup',
2007 'src/cryptsetup/cryptsetup.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 dependencies : [libcryptsetup],
2011 install_rpath : rootlibexecdir,
2013 install_dir : rootlibexecdir)
2015 executable('systemd-cryptsetup-generator',
2016 'src/cryptsetup/cryptsetup-generator.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : [libcryptsetup],
2020 install_rpath : rootlibexecdir,
2022 install_dir : systemgeneratordir)
2024 executable('systemd-veritysetup',
2025 'src/veritysetup/veritysetup.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [libcryptsetup],
2029 install_rpath : rootlibexecdir,
2031 install_dir : rootlibexecdir)
2033 executable('systemd-veritysetup-generator',
2034 'src/veritysetup/veritysetup-generator.c',
2035 include_directories : includes,
2036 link_with : [libshared],
2037 dependencies : [libcryptsetup],
2038 install_rpath : rootlibexecdir,
2040 install_dir : systemgeneratordir)
2043 if conf.get('HAVE_SYSV_COMPAT') == 1
2044 executable('systemd-sysv-generator',
2045 'src/sysv-generator/sysv-generator.c',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2050 install_dir : systemgeneratordir)
2052 executable('systemd-rc-local-generator',
2053 'src/rc-local-generator/rc-local-generator.c',
2054 include_directories : includes,
2055 link_with : [libshared],
2056 install_rpath : rootlibexecdir,
2058 install_dir : systemgeneratordir)
2061 if conf.get('ENABLE_HOSTNAMED') == 1
2062 executable('systemd-hostnamed',
2063 'src/hostname/hostnamed.c',
2064 include_directories : includes,
2065 link_with : [libshared],
2066 install_rpath : rootlibexecdir,
2068 install_dir : rootlibexecdir)
2070 exe = executable('hostnamectl',
2071 'src/hostname/hostnamectl.c',
2072 include_directories : includes,
2073 link_with : [libshared],
2074 install_rpath : rootlibexecdir,
2076 public_programs += exe
2079 if conf.get('ENABLE_LOCALED') == 1
2080 if conf.get('HAVE_XKBCOMMON') == 1
2081 # logind will load libxkbcommon.so dynamically on its own
2087 executable('systemd-localed',
2088 systemd_localed_sources,
2089 include_directories : includes,
2090 link_with : [libshared],
2091 dependencies : deps,
2092 install_rpath : rootlibexecdir,
2094 install_dir : rootlibexecdir)
2096 exe = executable('localectl',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2102 public_programs += exe
2105 if conf.get('ENABLE_TIMEDATED') == 1
2106 executable('systemd-timedated',
2107 'src/timedate/timedated.c',
2108 include_directories : includes,
2109 link_with : [libshared],
2110 install_rpath : rootlibexecdir,
2112 install_dir : rootlibexecdir)
2115 if conf.get('ENABLE_TIMEDATECTL') == 1
2116 exe = executable('timedatectl',
2117 'src/timedate/timedatectl.c',
2118 include_directories : includes,
2119 install_rpath : rootlibexecdir,
2120 link_with : [libshared],
2121 dependencies : [libm],
2123 public_programs += exe
2126 if conf.get('ENABLE_TIMESYNCD') == 1
2127 executable('systemd-timesyncd',
2128 systemd_timesyncd_sources,
2129 include_directories : includes,
2130 link_with : [libshared],
2131 dependencies : [threads,
2133 install_rpath : rootlibexecdir,
2135 install_dir : rootlibexecdir)
2137 executable('systemd-time-wait-sync',
2138 'src/time-wait-sync/time-wait-sync.c',
2139 include_directories : includes,
2140 link_with : [libshared],
2141 install_rpath : rootlibexecdir,
2143 install_dir : rootlibexecdir)
2146 if conf.get('ENABLE_MACHINED') == 1
2147 executable('systemd-machined',
2148 systemd_machined_sources,
2149 include_directories : includes,
2150 link_with : [libmachine_core,
2152 install_rpath : rootlibexecdir,
2154 install_dir : rootlibexecdir)
2156 exe = executable('machinectl',
2157 'src/machine/machinectl.c',
2158 include_directories : includes,
2159 link_with : [libshared],
2160 dependencies : [threads,
2163 install_rpath : rootlibexecdir,
2165 install_dir : rootbindir)
2166 public_programs += exe
2169 if conf.get('ENABLE_IMPORTD') == 1
2170 executable('systemd-importd',
2171 systemd_importd_sources,
2172 include_directories : includes,
2173 link_with : [libshared],
2174 dependencies : [threads],
2175 install_rpath : rootlibexecdir,
2177 install_dir : rootlibexecdir)
2179 systemd_pull = executable('systemd-pull',
2180 systemd_pull_sources,
2181 include_directories : includes,
2182 link_with : [libshared],
2183 dependencies : [libcurl,
2188 install_rpath : rootlibexecdir,
2190 install_dir : rootlibexecdir)
2192 systemd_import = executable('systemd-import',
2193 systemd_import_sources,
2194 include_directories : includes,
2195 link_with : [libshared],
2196 dependencies : [libcurl,
2200 install_rpath : rootlibexecdir,
2202 install_dir : rootlibexecdir)
2204 systemd_import_fs = executable('systemd-import-fs',
2205 systemd_import_fs_sources,
2206 include_directories : includes,
2207 link_with : [libshared],
2208 install_rpath : rootlibexecdir,
2210 install_dir : rootlibexecdir)
2212 systemd_export = executable('systemd-export',
2213 systemd_export_sources,
2214 include_directories : includes,
2215 link_with : [libshared],
2216 dependencies : [libcurl,
2220 install_rpath : rootlibexecdir,
2222 install_dir : rootlibexecdir)
2224 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2227 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2228 exe = executable('systemd-journal-upload',
2229 systemd_journal_upload_sources,
2230 include_directories : includes,
2231 link_with : [libshared],
2232 dependencies : [threads,
2237 install_rpath : rootlibexecdir,
2239 install_dir : rootlibexecdir)
2240 public_programs += exe
2243 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2244 s_j_remote = executable('systemd-journal-remote',
2245 systemd_journal_remote_sources,
2246 include_directories : includes,
2247 link_with : [libshared,
2248 libsystemd_journal_remote],
2249 dependencies : [threads,
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootlibexecdir)
2258 s_j_gatewayd = executable('systemd-journal-gatewayd',
2259 systemd_journal_gatewayd_sources,
2260 include_directories : includes,
2261 link_with : [libshared],
2262 dependencies : [threads,
2267 install_rpath : rootlibexecdir,
2269 install_dir : rootlibexecdir)
2270 public_programs += [s_j_remote, s_j_gatewayd]
2273 if conf.get('ENABLE_COREDUMP') == 1
2274 executable('systemd-coredump',
2275 systemd_coredump_sources,
2276 include_directories : includes,
2277 link_with : [libshared],
2278 dependencies : [threads,
2283 install_rpath : rootlibexecdir,
2285 install_dir : rootlibexecdir)
2287 exe = executable('coredumpctl',
2288 coredumpctl_sources,
2289 include_directories : includes,
2290 link_with : [libshared],
2291 dependencies : [threads,
2294 install_rpath : rootlibexecdir,
2296 public_programs += exe
2299 if conf.get('ENABLE_BINFMT') == 1
2300 exe = executable('systemd-binfmt',
2301 'src/binfmt/binfmt.c',
2302 include_directories : includes,
2303 link_with : [libshared],
2304 install_rpath : rootlibexecdir,
2306 install_dir : rootlibexecdir)
2307 public_programs += exe
2309 meson.add_install_script('sh', '-c',
2310 mkdir_p.format(binfmtdir))
2311 meson.add_install_script('sh', '-c',
2312 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2315 if conf.get('ENABLE_VCONSOLE') == 1
2316 executable('systemd-vconsole-setup',
2317 'src/vconsole/vconsole-setup.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 install_rpath : rootlibexecdir,
2322 install_dir : rootlibexecdir)
2325 if conf.get('ENABLE_RANDOMSEED') == 1
2326 executable('systemd-random-seed',
2327 'src/random-seed/random-seed.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2332 install_dir : rootlibexecdir)
2335 if conf.get('ENABLE_FIRSTBOOT') == 1
2336 executable('systemd-firstboot',
2337 'src/firstboot/firstboot.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 dependencies : [libcrypt],
2341 install_rpath : rootlibexecdir,
2343 install_dir : rootbindir)
2346 executable('systemd-remount-fs',
2347 'src/remount-fs/remount-fs.c',
2348 'src/core/mount-setup.c',
2349 'src/core/mount-setup.h',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 install_rpath : rootlibexecdir,
2354 install_dir : rootlibexecdir)
2356 executable('systemd-machine-id-setup',
2357 'src/machine-id-setup/machine-id-setup-main.c',
2358 'src/core/machine-id-setup.c',
2359 'src/core/machine-id-setup.h',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootbindir)
2366 executable('systemd-fsck',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2372 install_dir : rootlibexecdir)
2374 executable('systemd-growfs',
2375 'src/partition/growfs.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 dependencies : [libcryptsetup],
2379 install_rpath : rootlibexecdir,
2381 install_dir : rootlibexecdir)
2383 executable('systemd-makefs',
2384 'src/partition/makefs.c',
2385 include_directories : includes,
2386 link_with : [libshared],
2387 install_rpath : rootlibexecdir,
2389 install_dir : rootlibexecdir)
2391 executable('systemd-sleep',
2392 'src/sleep/sleep.c',
2393 include_directories : includes,
2394 link_with : [libshared],
2395 install_rpath : rootlibexecdir,
2397 install_dir : rootlibexecdir)
2399 exe = executable('systemd-sysctl',
2400 'src/sysctl/sysctl.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2405 install_dir : rootlibexecdir)
2406 public_programs += exe
2408 executable('systemd-ac-power',
2409 'src/ac-power/ac-power.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 install_rpath : rootlibexecdir,
2414 install_dir : rootlibexecdir)
2416 exe = executable('systemd-detect-virt',
2417 'src/detect-virt/detect-virt.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 install_rpath : rootlibexecdir,
2422 public_programs += exe
2424 exe = executable('systemd-delta',
2425 'src/delta/delta.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 public_programs += exe
2432 exe = executable('systemd-escape',
2433 'src/escape/escape.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 install_dir : rootbindir)
2439 public_programs += exe
2441 exe = executable('systemd-notify',
2442 'src/notify/notify.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 install_rpath : rootlibexecdir,
2447 install_dir : rootbindir)
2448 public_programs += exe
2450 executable('systemd-volatile-root',
2451 'src/volatile-root/volatile-root.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootlibexecdir)
2458 executable('systemd-cgroups-agent',
2459 'src/cgroups-agent/cgroups-agent.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2466 exe = executable('systemd-id128',
2467 'src/id128/id128.c',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 install_rpath : rootlibexecdir,
2472 public_programs += exe
2474 exe = executable('systemd-path',
2476 include_directories : includes,
2477 link_with : [libshared],
2478 install_rpath : rootlibexecdir,
2480 public_programs += exe
2482 exe = executable('systemd-ask-password',
2483 'src/ask-password/ask-password.c',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 install_rpath : rootlibexecdir,
2488 install_dir : rootbindir)
2489 public_programs += exe
2491 executable('systemd-reply-password',
2492 'src/reply-password/reply-password.c',
2493 include_directories : includes,
2494 link_with : [libshared],
2495 install_rpath : rootlibexecdir,
2497 install_dir : rootlibexecdir)
2499 exe = executable('systemd-tty-ask-password-agent',
2500 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2501 include_directories : includes,
2502 link_with : [libshared],
2503 install_rpath : rootlibexecdir,
2505 install_dir : rootbindir)
2506 public_programs += exe
2508 exe = executable('systemd-cgls',
2510 include_directories : includes,
2511 link_with : [libshared],
2512 install_rpath : rootlibexecdir,
2514 public_programs += exe
2516 exe = executable('systemd-cgtop',
2517 'src/cgtop/cgtop.c',
2518 include_directories : includes,
2519 link_with : [libshared],
2520 install_rpath : rootlibexecdir,
2522 public_programs += exe
2524 executable('systemd-initctl',
2525 'src/initctl/initctl.c',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 install_rpath : rootlibexecdir,
2530 install_dir : rootlibexecdir)
2532 exe = executable('systemd-mount',
2533 'src/mount/mount-tool.c',
2534 include_directories : includes,
2535 link_with : [libshared],
2536 install_rpath : rootlibexecdir,
2538 public_programs += exe
2540 meson.add_install_script(meson_make_symlink,
2541 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2543 exe = executable('systemd-run',
2545 include_directories : includes,
2546 link_with : [libshared],
2547 install_rpath : rootlibexecdir,
2549 public_programs += exe
2551 exe = executable('systemd-stdio-bridge',
2552 'src/stdio-bridge/stdio-bridge.c',
2553 include_directories : includes,
2554 link_with : [libshared],
2555 install_rpath : rootlibexecdir,
2557 public_programs += exe
2559 exe = executable('busctl',
2560 'src/busctl/busctl.c',
2561 'src/busctl/busctl-introspect.c',
2562 'src/busctl/busctl-introspect.h',
2563 include_directories : includes,
2564 link_with : [libshared],
2565 install_rpath : rootlibexecdir,
2567 public_programs += exe
2569 if conf.get('ENABLE_SYSUSERS') == 1
2570 exe = executable('systemd-sysusers',
2571 'src/sysusers/sysusers.c',
2572 include_directories : includes,
2573 link_with : [libshared],
2574 install_rpath : rootlibexecdir,
2576 install_dir : rootbindir)
2577 public_programs += exe
2580 if conf.get('ENABLE_TMPFILES') == 1
2581 exe = executable('systemd-tmpfiles',
2582 'src/tmpfiles/tmpfiles.c',
2583 include_directories : includes,
2584 link_with : [libshared],
2585 dependencies : [libacl],
2586 install_rpath : rootlibexecdir,
2588 install_dir : rootbindir)
2589 public_programs += exe
2591 if want_tests != 'false'
2592 test('test-systemd-tmpfiles',
2593 test_systemd_tmpfiles_py,
2594 # https://github.com/mesonbuild/meson/issues/2681
2595 args : exe.full_path())
2599 if conf.get('ENABLE_HWDB') == 1
2600 exe = executable('systemd-hwdb',
2602 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2603 include_directories : includes,
2604 link_with : [libudev_static],
2605 install_rpath : udev_rpath,
2607 install_dir : rootbindir)
2608 public_programs += exe
2611 if conf.get('ENABLE_QUOTACHECK') == 1
2612 executable('systemd-quotacheck',
2613 'src/quotacheck/quotacheck.c',
2614 include_directories : includes,
2615 link_with : [libshared],
2616 install_rpath : rootlibexecdir,
2618 install_dir : rootlibexecdir)
2621 exe = executable('systemd-socket-proxyd',
2622 'src/socket-proxy/socket-proxyd.c',
2623 include_directories : includes,
2624 link_with : [libshared],
2625 dependencies : [threads],
2626 install_rpath : rootlibexecdir,
2628 install_dir : rootlibexecdir)
2629 public_programs += exe
2631 exe = executable('systemd-udevd',
2632 systemd_udevd_sources,
2633 include_directories : includes,
2634 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2635 link_with : [libudev_core,
2638 dependencies : [threads,
2643 install_rpath : udev_rpath,
2645 install_dir : rootlibexecdir)
2646 public_programs += exe
2648 exe = executable('udevadm',
2650 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2651 include_directories : includes,
2652 link_with : [libudev_core,
2655 dependencies : [threads,
2660 install_rpath : udev_rpath,
2662 install_dir : rootbindir)
2663 public_programs += exe
2665 executable('systemd-shutdown',
2666 systemd_shutdown_sources,
2667 include_directories : includes,
2668 link_with : [libshared],
2669 dependencies : [libmount],
2670 install_rpath : rootlibexecdir,
2672 install_dir : rootlibexecdir)
2674 executable('systemd-update-done',
2675 'src/update-done/update-done.c',
2676 include_directories : includes,
2677 link_with : [libshared],
2678 install_rpath : rootlibexecdir,
2680 install_dir : rootlibexecdir)
2682 executable('systemd-update-utmp',
2683 'src/update-utmp/update-utmp.c',
2684 include_directories : includes,
2685 link_with : [libshared],
2686 dependencies : [libaudit],
2687 install_rpath : rootlibexecdir,
2689 install_dir : rootlibexecdir)
2691 if conf.get('HAVE_KMOD') == 1
2692 executable('systemd-modules-load',
2693 'src/modules-load/modules-load.c',
2694 include_directories : includes,
2695 link_with : [libshared],
2696 dependencies : [libkmod],
2697 install_rpath : rootlibexecdir,
2699 install_dir : rootlibexecdir)
2701 meson.add_install_script('sh', '-c',
2702 mkdir_p.format(modulesloaddir))
2703 meson.add_install_script('sh', '-c',
2704 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2707 exe = executable('systemd-nspawn',
2708 systemd_nspawn_sources,
2709 'src/core/mount-setup.c', # FIXME: use a variable?
2710 'src/core/mount-setup.h',
2711 'src/core/loopback-setup.c',
2712 'src/core/loopback-setup.h',
2713 include_directories : includes,
2714 link_with : [libnspawn_core,
2716 dependencies : [libblkid],
2717 install_rpath : rootlibexecdir,
2719 public_programs += exe
2721 if conf.get('ENABLE_NETWORKD') == 1
2722 executable('systemd-networkd',
2723 systemd_networkd_sources,
2724 include_directories : includes,
2725 link_with : [libnetworkd_core,
2729 dependencies : [threads],
2730 install_rpath : rootlibexecdir,
2732 install_dir : rootlibexecdir)
2734 executable('systemd-networkd-wait-online',
2735 systemd_networkd_wait_online_sources,
2736 include_directories : includes,
2737 link_with : [libnetworkd_core,
2739 install_rpath : rootlibexecdir,
2741 install_dir : rootlibexecdir)
2743 exe = executable('networkctl',
2745 include_directories : includes,
2746 link_with : [libsystemd_network,
2748 install_rpath : rootlibexecdir,
2750 install_dir : rootbindir)
2751 public_programs += exe
2754 executable('systemd-sulogin-shell',
2755 ['src/sulogin-shell/sulogin-shell.c'],
2756 include_directories : includes,
2757 link_with : [libshared],
2758 install_rpath : rootlibexecdir,
2760 install_dir : rootlibexecdir)
2762 ############################################################
2765 'systemd-runtest.env',
2766 output : 'systemd-runtest.env',
2767 command : ['sh', '-c', '{ ' +
2768 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2769 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2771 build_by_default : true)
2773 foreach tuple : tests
2775 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2776 dependencies = tuple[2]
2777 condition = tuple.length() >= 4 ? tuple[3] : ''
2778 type = tuple.length() >= 5 ? tuple[4] : ''
2779 defs = tuple.length() >= 6 ? tuple[5] : []
2780 incs = tuple.length() >= 7 ? tuple[6] : includes
2783 name = sources[0].split('/')[-1].split('.')[0]
2784 if type.startswith('timeout=')
2785 timeout = type.split('=')[1].to_int()
2789 if condition == '' or conf.get(condition) == 1
2793 include_directories : incs,
2794 link_with : link_with,
2795 dependencies : dependencies,
2797 build_by_default : want_tests != 'false',
2798 install_rpath : rootlibexecdir,
2799 install : install_tests,
2800 install_dir : join_paths(testsdir, type))
2803 message('@0@ is a manual test'.format(name))
2804 elif type == 'unsafe' and want_tests != 'unsafe'
2805 message('@0@ is an unsafe test'.format(name))
2806 elif want_tests != 'false'
2812 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2817 'test-libsystemd-sym',
2818 test_libsystemd_sym_c,
2819 include_directories : includes,
2820 link_with : [libsystemd],
2821 build_by_default : want_tests != 'false',
2822 install : install_tests,
2823 install_dir : testsdir)
2824 if want_tests != 'false'
2825 test('test-libsystemd-sym', exe)
2829 'test-libsystemd-static-sym',
2830 test_libsystemd_sym_c,
2831 include_directories : includes,
2832 link_with : [install_libsystemd_static],
2833 dependencies : [threads], # threads is already included in dependencies on the library,
2834 # but does not seem to get propagated. Add here as a work-around.
2835 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2836 install : install_tests and static_libsystemd_pic,
2837 install_dir : testsdir)
2838 if want_tests != 'false' and static_libsystemd_pic
2839 test('test-libsystemd-static-sym', exe)
2845 include_directories : includes,
2846 c_args : '-Wno-deprecated-declarations',
2847 link_with : [libudev],
2848 build_by_default : want_tests != 'false',
2849 install : install_tests,
2850 install_dir : testsdir)
2851 if want_tests != 'false'
2852 test('test-libudev-sym', exe)
2856 'test-libudev-static-sym',
2858 include_directories : includes,
2859 c_args : '-Wno-deprecated-declarations',
2860 link_with : [install_libudev_static],
2861 build_by_default : want_tests != 'false' and static_libudev_pic,
2862 install : install_tests and static_libudev_pic,
2863 install_dir : testsdir)
2864 if want_tests != 'false' and static_libudev_pic
2865 test('test-libudev-static-sym', exe)
2868 ############################################################
2872 if get_option('tests') != 'false'
2873 foreach tuple : fuzzers
2875 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2876 dependencies = tuple[2]
2877 defs = tuple.length() >= 4 ? tuple[3] : []
2878 incs = tuple.length() >= 5 ? tuple[4] : includes
2881 dependencies += fuzzing_engine
2883 sources += 'src/fuzz/fuzz-main.c'
2886 name = sources[0].split('/')[-1].split('.')[0]
2888 fuzzer_exes += executable(
2891 include_directories : [incs, include_directories('src/fuzz')],
2892 link_with : link_with,
2893 dependencies : dependencies,
2901 depends : [fuzzer_exes, version_h],
2904 ############################################################
2906 make_directive_index_py = find_program('tools/make-directive-index.py')
2907 make_man_index_py = find_program('tools/make-man-index.py')
2908 xml_helper_py = find_program('tools/xml_helper.py')
2909 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2913 subdir('sysusers.d')
2914 subdir('tmpfiles.d')
2919 subdir('shell-completion/bash')
2920 subdir('shell-completion/zsh')
2921 subdir('docs/sysvinit')
2922 subdir('docs/var-log')
2924 install_subdir('factory/etc',
2925 install_dir : factorydir)
2927 install_data('xorg/50-systemd-user.sh',
2928 install_dir : xinitrcdir)
2929 install_data('modprobe.d/systemd.conf',
2930 install_dir : modprobedir)
2931 install_data('LICENSE.GPL2',
2935 'docs/CODING_STYLE.md',
2936 'docs/DISTRO_PORTING.md',
2937 'docs/ENVIRONMENT.md',
2939 'docs/TRANSIENT-SETTINGS.md',
2940 'docs/TRANSLATORS.md',
2941 'docs/UIDS-GIDS.md',
2942 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2943 install_dir : docdir)
2945 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2946 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2948 ############################################################
2950 meson_check_help = find_program('tools/meson-check-help.sh')
2952 foreach exec : public_programs
2953 name = exec.full_path().split('/')[-1]
2954 if want_tests != 'false'
2955 test('check-help-' + name,
2957 args : exec.full_path())
2961 ############################################################
2963 # Enable tests for all supported sanitizers
2964 foreach tuple : sanitizers
2965 sanitizer = tuple[0]
2968 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2970 foreach p : fuzz_regression_tests
2971 b = p.split('/')[-2]
2972 c = p.split('/')[-1]
2974 name = '@0@:@1@'.format(b, sanitizer)
2977 if want_tests == 'false'
2978 message('Not compiling @0@ because tests is set to false'.format(name))
2980 exe = custom_target(
2984 command : [env, 'ln', '-fs',
2985 join_paths(build.full_path(), b),
2987 build_by_default : true)
2989 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2994 if want_tests != 'false' and slow_tests
2995 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2997 args : [exe.full_path(),
2998 join_paths(meson.source_root(), p)])
3005 ############################################################
3008 all_files = run_command(
3010 ['--git-dir=@0@/.git'.format(meson.source_root()),
3013 all_files = files(all_files.stdout().split())
3018 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3021 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3025 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3028 command : [meson_git_contrib_sh])
3032 git_head = run_command(
3034 ['--git-dir=@0@/.git'.format(meson.source_root()),
3035 'rev-parse', 'HEAD']).stdout().strip()
3036 git_head_short = run_command(
3038 ['--git-dir=@0@/.git'.format(meson.source_root()),
3039 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3043 command : ['git', 'archive',
3044 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3046 '--prefix', 'systemd-@0@/'.format(git_head),
3050 ############################################################
3052 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3055 depends : [man, libsystemd, libudev],
3056 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3060 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
3062 ############################################################
3065 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3067 'split /usr: @0@'.format(split_usr),
3068 'split bin-sbin: @0@'.format(split_bin),
3069 'prefix directory: @0@'.format(prefixdir),
3070 'rootprefix directory: @0@'.format(rootprefixdir),
3071 'sysconf directory: @0@'.format(sysconfdir),
3072 'include directory: @0@'.format(includedir),
3073 'lib directory: @0@'.format(libdir),
3074 'rootlib directory: @0@'.format(rootlibdir),
3075 'SysV init scripts: @0@'.format(sysvinit_path),
3076 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3077 'PAM modules directory: @0@'.format(pamlibdir),
3078 'PAM configuration directory: @0@'.format(pamconfdir),
3079 'RPM macros directory: @0@'.format(rpmmacrosdir),
3080 'modprobe.d directory: @0@'.format(modprobedir),
3081 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3082 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3083 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3084 'bash completions directory: @0@'.format(bashcompletiondir),
3085 'zsh completions directory: @0@'.format(zshcompletiondir),
3086 'extra start script: @0@'.format(get_option('rc-local')),
3087 'extra stop script: @0@'.format(get_option('halt-local')),
3088 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3089 get_option('debug-tty')),
3090 'TTY GID: @0@'.format(tty_gid),
3091 'users GID: @0@'.format(substs.get('USERS_GID')),
3092 'maximum system UID: @0@'.format(system_uid_max),
3093 'maximum system GID: @0@'.format(system_gid_max),
3094 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3095 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3096 'minimum container UID base: @0@'.format(container_uid_base_min),
3097 'maximum container UID base: @0@'.format(container_uid_base_max),
3098 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3099 'render group access mode: @0@'.format(get_option('group-render-mode')),
3100 'certificate root directory: @0@'.format(get_option('certificate-root')),
3101 'support URL: @0@'.format(support_url),
3102 'nobody user name: @0@'.format(nobody_user),
3103 'nobody group name: @0@'.format(nobody_group),
3104 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3105 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3107 'default DNSSEC mode: @0@'.format(default_dnssec),
3108 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3109 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3110 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3111 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3112 'default locale: @0@'.format(default_locale)]
3114 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3115 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3117 'default DNS servers: @0@'.format(alt_dns_servers),
3118 'default NTP servers: @0@'.format(alt_ntp_servers)]
3120 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3121 '@@0@'.format(time_epoch)).stdout().strip()
3123 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3126 'static libsystemd: @0@'.format(static_libsystemd),
3127 'static libudev: @0@'.format(static_libudev)]
3130 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3131 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3132 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3134 if conf.get('ENABLE_EFI') == 1
3135 status += 'efi arch: @0@'.format(efi_arch)
3139 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3140 'EFI CC @0@'.format(' '.join(efi_cc)),
3141 'EFI lib directory: @0@'.format(efi_libdir),
3142 'EFI lds directory: @0@'.format(efi_ldsdir),
3143 'EFI include directory: @0@'.format(efi_incdir)]
3195 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3196 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3199 ['legacy pkla', install_polkit_pkla],
3201 ['gnu-efi', have_gnu_efi],
3214 ['man pages', want_man],
3215 ['html pages', want_html],
3216 ['man page indices', want_man and have_lxml],
3221 ['adm group', get_option('adm-group')],
3222 ['wheel group', get_option('wheel-group')],
3225 ['debug mmap cache'],
3228 ['valgrind', conf.get('VALGRIND') == 1],
3229 ['trace logging', conf.get('LOG_TRACE') == 1],
3230 ['link-udev-shared', get_option('link-udev-shared')],
3231 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3234 if tuple.length() >= 2
3237 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3238 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3239 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3250 'enabled features: @0@'.format(', '.join(found)),
3252 'disabled features: @0@'.format(', '.join(missing)),
3254 message('\n '.join(status))
3256 if rootprefixdir != rootprefix_default
3258 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3259 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3260 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))