1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.23.0'
16 libudev_version = '1.6.11'
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_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
26 substs = configuration_data()
27 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PACKAGE_VERSION', meson.project_version())
30 want_ossfuzz = get_option('oss-fuzz')
31 want_libfuzzer = get_option('llvm-fuzz')
32 if want_ossfuzz and want_libfuzzer
33 error('only one of oss-fuzz and llvm-fuzz can be specified')
35 fuzzer_build = want_ossfuzz or want_libfuzzer
37 #####################################################################
39 # Try to install the git pre-commit hook
40 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
41 if git_hook.returncode() == 0
42 message(git_hook.stdout().strip())
45 #####################################################################
47 if get_option('split-usr') == 'auto'
48 split_usr = run_command('test', '-L', '/bin').returncode() != 0
50 split_usr = get_option('split-usr') == 'true'
52 conf.set10('HAVE_SPLIT_USR', split_usr,
53 description : '/usr/bin and /bin directories are separate')
55 if get_option('split-bin') == 'auto'
56 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
58 split_bin = get_option('split-bin') == 'true'
60 conf.set10('HAVE_SPLIT_BIN', split_bin,
61 description : 'bin and sbin directories are separate')
63 rootprefixdir = get_option('rootprefix')
64 # Unusual rootprefixdir values are used by some distros
65 # (see https://github.com/systemd/systemd/pull/7461).
66 rootprefix_default = split_usr ? '/' : '/usr'
67 if rootprefixdir == ''
68 rootprefixdir = rootprefix_default
71 sysvinit_path = get_option('sysvinit-path')
72 sysvrcnd_path = get_option('sysvrcnd-path')
73 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
74 description : 'SysV init scripts and rcN.d links are supported')
76 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
77 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
78 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
80 # join_paths ignore the preceding arguments if an absolute component is
81 # encountered, so this should canonicalize various paths when they are
82 # absolute or relative.
83 prefixdir = get_option('prefix')
84 if not prefixdir.startswith('/')
85 error('Prefix is not absolute: "@0@"'.format(prefixdir))
87 bindir = join_paths(prefixdir, get_option('bindir'))
88 libdir = join_paths(prefixdir, get_option('libdir'))
89 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
90 includedir = join_paths(prefixdir, get_option('includedir'))
91 datadir = join_paths(prefixdir, get_option('datadir'))
92 localstatedir = join_paths('/', get_option('localstatedir'))
94 rootbindir = join_paths(rootprefixdir, 'bin')
95 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
96 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
98 rootlibdir = get_option('rootlibdir')
100 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
103 # Dirs of external packages
104 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
105 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
106 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
107 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
108 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
109 varlogdir = join_paths(localstatedir, 'log')
110 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
111 rpmmacrosdir = get_option('rpmmacrosdir')
112 if rpmmacrosdir != 'no'
113 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
115 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
118 pkgdatadir = join_paths(datadir, 'systemd')
119 environmentdir = join_paths(prefixdir, 'lib/environment.d')
120 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
121 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
122 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
123 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
124 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
125 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
126 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
127 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
128 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
129 pkgincludedir = join_paths(includedir, 'systemd')
130 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
131 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
132 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
133 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
134 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
135 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
136 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
137 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
138 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
139 udevhomedir = udevlibexecdir
140 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
141 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
142 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
143 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
144 factorydir = join_paths(datadir, 'factory')
145 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
146 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
147 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
148 catalogstatedir = join_paths(systemdstatedir, 'catalog')
149 randomseeddir = join_paths(localstatedir, 'lib/systemd')
150 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
152 docdir = get_option('docdir')
154 docdir = join_paths(datadir, 'doc/systemd')
157 dbuspolicydir = get_option('dbuspolicydir')
158 if dbuspolicydir == ''
159 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
162 dbussessionservicedir = get_option('dbussessionservicedir')
163 if dbussessionservicedir == ''
164 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
167 dbussystemservicedir = get_option('dbussystemservicedir')
168 if dbussystemservicedir == ''
169 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
172 pamlibdir = get_option('pamlibdir')
174 pamlibdir = join_paths(rootlibdir, 'security')
177 pamconfdir = get_option('pamconfdir')
179 pamconfdir = join_paths(sysconfdir, 'pam.d')
182 memory_accounting_default = get_option('memory-accounting-default')
184 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
185 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
186 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
187 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
188 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
189 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
190 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
192 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
194 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
195 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
196 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
197 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
198 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
199 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
200 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
201 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
202 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
203 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
204 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
205 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
206 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
207 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
208 conf.set_quoted('ROOTPREFIX', rootprefixdir)
209 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
210 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
211 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
212 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
213 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
214 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
215 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
216 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
217 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
218 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
219 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
220 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
221 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
222 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
223 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
224 conf.set_quoted('LIBDIR', libdir)
225 conf.set_quoted('ROOTLIBDIR', rootlibdir)
226 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
227 conf.set_quoted('BOOTLIBDIR', bootlibdir)
228 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
229 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
230 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
231 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
232 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
233 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
234 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
235 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
236 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
238 substs.set('prefix', prefixdir)
239 substs.set('exec_prefix', prefixdir)
240 substs.set('libdir', libdir)
241 substs.set('rootlibdir', rootlibdir)
242 substs.set('includedir', includedir)
243 substs.set('pkgsysconfdir', pkgsysconfdir)
244 substs.set('bindir', bindir)
245 substs.set('rootbindir', rootbindir)
246 substs.set('rootlibexecdir', rootlibexecdir)
247 substs.set('systemunitdir', systemunitdir)
248 substs.set('userunitdir', userunitdir)
249 substs.set('systempresetdir', systempresetdir)
250 substs.set('userpresetdir', userpresetdir)
251 substs.set('udevhwdbdir', udevhwdbdir)
252 substs.set('udevrulesdir', udevrulesdir)
253 substs.set('udevlibexecdir', udevlibexecdir)
254 substs.set('environmentdir', environmentdir)
255 substs.set('catalogdir', catalogdir)
256 substs.set('tmpfilesdir', tmpfilesdir)
257 substs.set('sysusersdir', sysusersdir)
258 substs.set('sysctldir', sysctldir)
259 substs.set('binfmtdir', binfmtdir)
260 substs.set('modulesloaddir', modulesloaddir)
261 substs.set('modprobedir', modprobedir)
262 substs.set('systemgeneratordir', systemgeneratordir)
263 substs.set('usergeneratordir', usergeneratordir)
264 substs.set('systemenvgeneratordir', systemenvgeneratordir)
265 substs.set('userenvgeneratordir', userenvgeneratordir)
266 substs.set('systemshutdowndir', systemshutdowndir)
267 substs.set('systemsleepdir', systemsleepdir)
268 substs.set('VARLOGDIR', varlogdir)
269 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
270 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
271 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
272 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
273 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
274 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
275 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
276 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
277 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
279 #####################################################################
281 cc = meson.get_compiler('c')
282 pkgconfig = import('pkgconfig')
283 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
284 meson_build_sh = find_program('tools/meson-build.sh')
286 want_tests = get_option('tests')
287 slow_tests = want_tests != 'false' and get_option('slow-tests')
288 install_tests = get_option('install-tests')
290 cxx = find_program('c++', required : fuzzer_build)
292 # Used only for tests
294 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
300 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
302 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
305 possible_cc_flags = [
309 '-Wmissing-include-dirs',
310 '-Wold-style-definition',
314 '-Wsuggest-attribute=noreturn',
315 '-Werror=missing-prototypes',
316 '-Werror=implicit-function-declaration',
317 '-Werror=missing-declarations',
318 '-Werror=return-type',
319 '-Werror=incompatible-pointer-types',
321 '-Wstrict-prototypes',
323 '-Wmissing-noreturn',
324 '-Wimplicit-fallthrough=5',
327 '-Wstrict-aliasing=2',
330 '-Werror=shift-count-overflow',
331 '-Werror=shift-overflow=2',
335 # negative arguments are correctly detected starting with meson 0.46.
336 '-Wno-unused-parameter',
337 '-Wno-missing-field-initializers',
338 '-Wno-unused-result',
339 '-Wno-format-signedness',
341 # work-around for gcc 7.1 turning this on on its own.
342 '-Wno-error=nonnull',
344 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
345 # optimizations enabled, producing essentially false positives.
346 '-Wno-maybe-uninitialized',
350 '-fdiagnostics-show-option',
351 '-fno-strict-aliasing',
352 '-fvisibility=hidden',
354 '-fstack-protector-strong',
355 '--param=ssp-buffer-size=4',
358 # --as-needed and --no-undefined are provided by meson by default,
359 # run mesonconf to see what is enabled
360 possible_link_flags = [
365 # the oss-fuzz fuzzers are not built with -fPIE, so don't
366 # enable it when we are linking against them
368 possible_cc_flags += '-fPIE'
369 possible_link_flags += '-pie'
372 if cc.get_id() == 'clang'
373 possible_cc_flags += [
374 '-Wno-typedef-redefinition',
375 '-Wno-gnu-variable-sized-type-not-at-end',
379 if get_option('buildtype') != 'debug'
380 possible_cc_flags += [
381 '-ffunction-sections',
385 possible_link_flags += '-Wl,--gc-sections'
388 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
389 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
393 #include <inttypes.h>
394 typedef uint64_t usec_t;
395 usec_t now(clockid_t clock);
400 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
401 add_project_arguments('-Werror=shadow', language : 'c')
404 cpp = ' '.join(cc.cmd_array()) + ' -E'
406 #####################################################################
407 # compilation result tests
409 conf.set('_GNU_SOURCE', true)
410 conf.set('__SANE_USERSPACE_TYPES__', true)
412 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
417 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
418 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
422 #include <linux/ethtool.h>
423 #include <linux/fib_rules.h>
424 #include <sys/stat.h>
427 foreach decl : ['char16_t',
429 'struct fib_rule_uid_range',
430 'struct fib_rule_port_range',
434 # We get -1 if the size cannot be determined
435 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
437 if decl == 'struct statx'
439 want_linux_stat_h = false
441 have = cc.sizeof(decl,
442 prefix : decl_headers + '#include <linux/stat.h>',
443 args : '-D_GNU_SOURCE') > 0
444 want_linux_stat_h = have
448 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
451 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
453 foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
454 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
455 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
456 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
457 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
458 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
459 ['FRA_TUN_ID', 'linux/fib_rules.h'],
460 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
461 ['FRA_PAD', 'linux/fib_rules.h'],
462 ['FRA_L3MDEV', 'linux/fib_rules.h'],
463 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
464 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
465 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
466 ['FOU_CMD_GET', 'linux/fou.h'],
467 ['IFA_FLAGS', 'linux/if_addr.h'],
468 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
469 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
470 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
471 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
472 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
473 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
474 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
475 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
476 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
477 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
478 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
479 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
480 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
481 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
482 ['IFLA_PAD', 'linux/if_link.h'],
483 ['IFLA_XDP', 'linux/if_link.h'],
484 ['IFLA_EVENT', 'linux/if_link.h'],
485 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
486 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
487 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
488 ['IFLA_MAX_MTU', 'linux/if_link.h'],
489 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
490 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
491 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
492 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
493 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
494 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
495 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
496 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
497 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
498 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
499 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
500 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
501 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
502 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
503 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
504 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
505 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
506 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
507 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
508 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
509 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
510 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
511 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
512 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
513 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
514 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
515 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
516 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
517 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
518 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
519 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
520 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
521 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
522 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
523 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
524 # if_tunnel.h is buggy and cannot be included on its own
525 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
526 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
527 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
528 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
529 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
530 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
531 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
532 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
533 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
534 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
535 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
537 prefix = decl.length() > 2 ? decl[2] : ''
538 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
539 conf.set10('HAVE_' + decl[0], have)
542 foreach ident : ['secure_getenv', '__secure_getenv']
543 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
547 ['memfd_create', '''#include <sys/mman.h>'''],
548 ['gettid', '''#include <sys/types.h>
549 #include <unistd.h>'''],
550 ['pivot_root', '''#include <stdlib.h>
551 #include <unistd.h>'''], # no known header declares pivot_root
552 ['name_to_handle_at', '''#include <sys/types.h>
553 #include <sys/stat.h>
554 #include <fcntl.h>'''],
555 ['setns', '''#include <sched.h>'''],
556 ['renameat2', '''#include <stdio.h>
557 #include <fcntl.h>'''],
558 ['kcmp', '''#include <linux/kcmp.h>'''],
559 ['keyctl', '''#include <sys/types.h>
560 #include <keyutils.h>'''],
561 ['copy_file_range', '''#include <sys/syscall.h>
562 #include <unistd.h>'''],
563 ['bpf', '''#include <sys/syscall.h>
564 #include <unistd.h>'''],
565 ['statx', '''#include <sys/types.h>
566 #include <sys/stat.h>
567 #include <unistd.h>'''],
568 ['explicit_bzero' , '''#include <string.h>'''],
569 ['reallocarray', '''#include <malloc.h>'''],
572 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
573 conf.set10('HAVE_' + ident[0].to_upper(), have)
576 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
577 conf.set10('USE_SYS_RANDOM_H', true)
578 conf.set10('HAVE_GETRANDOM', true)
580 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
581 conf.set10('USE_SYS_RANDOM_H', false)
582 conf.set10('HAVE_GETRANDOM', have)
585 #####################################################################
587 sed = find_program('sed')
588 awk = find_program('awk')
589 m4 = find_program('m4')
590 stat = find_program('stat')
591 git = find_program('git', required : false)
592 env = find_program('env')
593 perl = find_program('perl', required : false)
595 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
596 mkdir_p = 'mkdir -p $DESTDIR/@0@'
597 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
598 splash_bmp = files('test/splash.bmp')
600 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
601 # /usr/sbin, /sbin, and fall back to the default from middle column.
602 progs = [['quotaon', '/usr/sbin/quotaon' ],
603 ['quotacheck', '/usr/sbin/quotacheck' ],
604 ['kmod', '/usr/bin/kmod' ],
605 ['kexec', '/usr/sbin/kexec' ],
606 ['sulogin', '/usr/sbin/sulogin' ],
607 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
608 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
609 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
610 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
613 path = get_option(prog[0] + '-path')
615 message('Using @1@ for @0@'.format(prog[0], path))
617 exe = find_program(prog[0],
618 '/usr/sbin/' + prog[0],
621 path = exe.found() ? exe.path() : prog[1]
623 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
624 conf.set_quoted(name, path)
625 substs.set(name, path)
628 conf.set_quoted('TELINIT', get_option('telinit-path'))
630 if run_command('ln', '--relative', '--help').returncode() != 0
631 error('ln does not support --relative (added in coreutils 8.16)')
634 ############################################################
636 gperf = find_program('gperf')
638 gperf_test_format = '''
640 const char * in_word_set(const char *, @0@);
643 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
644 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
645 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
646 if cc.compiles(gperf_test)
647 gperf_len_type = 'size_t'
649 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
650 if cc.compiles(gperf_test)
651 gperf_len_type = 'unsigned'
653 error('unable to determine gperf len type')
656 message('gperf len type is @0@'.format(gperf_len_type))
657 conf.set('GPERF_LEN_TYPE', gperf_len_type,
658 description : 'The type of gperf "len" parameter')
660 ############################################################
662 if not cc.has_header('sys/capability.h')
663 error('POSIX caps headers not found')
665 foreach header : ['crypt.h',
666 'linux/btrfs_tree.h',
669 'linux/vm_sockets.h',
672 'valgrind/memcheck.h',
673 'valgrind/valgrind.h',
676 conf.set10('HAVE_' + header.underscorify().to_upper(),
677 cc.has_header(header))
680 ############################################################
682 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
683 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
684 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
686 default_hierarchy = get_option('default-hierarchy')
687 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
688 description : 'default cgroup hierarchy as string')
689 if default_hierarchy == 'legacy'
690 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
691 elif default_hierarchy == 'hybrid'
692 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
694 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
697 default_net_naming_scheme = get_option('default-net-naming-scheme')
698 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
700 time_epoch = get_option('time-epoch')
703 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
705 conf.set('TIME_EPOCH', time_epoch)
707 system_uid_max = get_option('system-uid-max')
708 if system_uid_max == -1
709 system_uid_max = run_command(
711 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
712 '/etc/login.defs').stdout().strip()
713 if system_uid_max == ''
716 system_uid_max = system_uid_max.to_int()
719 conf.set('SYSTEM_UID_MAX', system_uid_max)
720 substs.set('systemuidmax', system_uid_max)
722 system_gid_max = get_option('system-gid-max')
723 if system_gid_max == -1
724 system_gid_max = run_command(
726 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
727 '/etc/login.defs').stdout().strip()
728 if system_gid_max == ''
731 system_gid_max = system_gid_max.to_int()
734 conf.set('SYSTEM_GID_MAX', system_gid_max)
735 substs.set('systemgidmax', system_gid_max)
737 dynamic_uid_min = get_option('dynamic-uid-min')
738 dynamic_uid_max = get_option('dynamic-uid-max')
739 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
740 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
741 substs.set('dynamicuidmin', dynamic_uid_min)
742 substs.set('dynamicuidmax', dynamic_uid_max)
744 container_uid_base_min = get_option('container-uid-base-min')
745 container_uid_base_max = get_option('container-uid-base-max')
746 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
747 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
748 substs.set('containeruidbasemin', container_uid_base_min)
749 substs.set('containeruidbasemax', container_uid_base_max)
751 nobody_user = get_option('nobody-user')
752 nobody_group = get_option('nobody-group')
754 if not meson.is_cross_build()
755 getent_result = run_command('getent', 'passwd', '65534')
756 if getent_result.returncode() == 0
757 name = getent_result.stdout().split(':')[0]
758 if name != nobody_user
760 '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) +
761 'Your build will result in an user table setup that is incompatible with the local system.')
764 id_result = run_command('id', '-u', nobody_user)
765 if id_result.returncode() == 0
766 id = id_result.stdout().to_int()
769 '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) +
770 'Your build will result in an user table setup that is incompatible with the local system.')
774 getent_result = run_command('getent', 'group', '65534')
775 if getent_result.returncode() == 0
776 name = getent_result.stdout().split(':')[0]
777 if name != nobody_group
779 '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) +
780 'Your build will result in an group table setup that is incompatible with the local system.')
783 id_result = run_command('id', '-g', nobody_group)
784 if id_result.returncode() == 0
785 id = id_result.stdout().to_int()
788 '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) +
789 'Your build will result in an group table setup that is incompatible with the local system.')
793 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
795 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
796 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
799 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
800 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
801 substs.set('NOBODY_USER_NAME', nobody_user)
802 substs.set('NOBODY_GROUP_NAME', nobody_group)
804 tty_gid = get_option('tty-gid')
805 conf.set('TTY_GID', tty_gid)
806 substs.set('TTY_GID', tty_gid)
808 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
809 users_gid = get_option('users-gid')
810 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
812 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
813 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
815 dev_kvm_mode = get_option('dev-kvm-mode')
816 substs.set('DEV_KVM_MODE', dev_kvm_mode)
817 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
818 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
820 kill_user_processes = get_option('default-kill-user-processes')
821 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
822 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
823 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
825 dns_servers = get_option('dns-servers')
826 conf.set_quoted('DNS_SERVERS', dns_servers)
827 substs.set('DNS_SERVERS', dns_servers)
829 ntp_servers = get_option('ntp-servers')
830 conf.set_quoted('NTP_SERVERS', ntp_servers)
831 substs.set('NTP_SERVERS', ntp_servers)
833 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
835 substs.set('SUSHELL', get_option('debug-shell'))
836 substs.set('DEBUGTTY', get_option('debug-tty'))
838 enable_debug_hashmap = false
839 enable_debug_mmap_cache = false
840 enable_debug_siphash = false
841 enable_debug_udev = false
842 foreach name : get_option('debug-extra')
844 enable_debug_hashmap = true
845 elif name == 'mmap-cache'
846 enable_debug_mmap_cache = true
847 elif name == 'siphash'
848 enable_debug_siphash = true
850 enable_debug_udev = true
852 message('unknown debug option "@0@", ignoring'.format(name))
855 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
856 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
857 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
858 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
860 conf.set10('VALGRIND', get_option('valgrind'))
861 conf.set10('LOG_TRACE', get_option('log-trace'))
863 #####################################################################
865 threads = dependency('threads')
866 librt = cc.find_library('rt')
867 libm = cc.find_library('m')
868 libdl = cc.find_library('dl')
869 libcrypt = cc.find_library('crypt')
871 libcap = dependency('libcap', required : false)
872 if not libcap.found()
873 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
874 libcap = cc.find_library('cap')
877 libmount = dependency('mount',
878 version : fuzzer_build ? '>= 0' : '>= 2.30')
880 want_seccomp = get_option('seccomp')
881 if want_seccomp != 'false' and not fuzzer_build
882 libseccomp = dependency('libseccomp',
883 version : '>= 2.3.1',
884 required : want_seccomp == 'true')
885 have = libseccomp.found()
890 conf.set10('HAVE_SECCOMP', have)
892 want_selinux = get_option('selinux')
893 if want_selinux != 'false' and not fuzzer_build
894 libselinux = dependency('libselinux',
895 version : '>= 2.1.9',
896 required : want_selinux == 'true')
897 have = libselinux.found()
902 conf.set10('HAVE_SELINUX', have)
904 want_apparmor = get_option('apparmor')
905 if want_apparmor != 'false' and not fuzzer_build
906 libapparmor = dependency('libapparmor',
907 required : want_apparmor == 'true')
908 have = libapparmor.found()
913 conf.set10('HAVE_APPARMOR', have)
915 smack_run_label = get_option('smack-run-label')
916 if smack_run_label != ''
917 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
920 want_polkit = get_option('polkit')
921 install_polkit = false
922 install_polkit_pkla = false
923 if want_polkit != 'false' and not fuzzer_build
924 install_polkit = true
926 libpolkit = dependency('polkit-gobject-1',
928 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
929 message('Old polkit detected, will install pkla files')
930 install_polkit_pkla = true
933 conf.set10('ENABLE_POLKIT', install_polkit)
935 want_acl = get_option('acl')
936 if want_acl != 'false' and not fuzzer_build
937 libacl = cc.find_library('acl', required : want_acl == 'true')
938 have = libacl.found()
943 conf.set10('HAVE_ACL', have)
945 want_audit = get_option('audit')
946 if want_audit != 'false' and not fuzzer_build
947 libaudit = dependency('audit', required : want_audit == 'true')
948 have = libaudit.found()
953 conf.set10('HAVE_AUDIT', have)
955 want_blkid = get_option('blkid')
956 if want_blkid != 'false' and not fuzzer_build
957 libblkid = dependency('blkid', required : want_blkid == 'true')
958 have = libblkid.found()
963 conf.set10('HAVE_BLKID', have)
965 want_kmod = get_option('kmod')
966 if want_kmod != 'false' and not fuzzer_build
967 libkmod = dependency('libkmod',
969 required : want_kmod == 'true')
970 have = libkmod.found()
975 conf.set10('HAVE_KMOD', have)
977 want_pam = get_option('pam')
978 if want_pam != 'false' and not fuzzer_build
979 libpam = cc.find_library('pam', required : want_pam == 'true')
980 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
981 have = libpam.found() and libpam_misc.found()
987 conf.set10('HAVE_PAM', have)
989 want_microhttpd = get_option('microhttpd')
990 if want_microhttpd != 'false' and not fuzzer_build
991 libmicrohttpd = dependency('libmicrohttpd',
992 version : '>= 0.9.33',
993 required : want_microhttpd == 'true')
994 have = libmicrohttpd.found()
999 conf.set10('HAVE_MICROHTTPD', have)
1001 want_libcryptsetup = get_option('libcryptsetup')
1002 if want_libcryptsetup != 'false' and not fuzzer_build
1003 libcryptsetup = dependency('libcryptsetup',
1004 version : '>= 1.6.0',
1005 required : want_libcryptsetup == 'true')
1006 have = libcryptsetup.found()
1007 have_sector = cc.has_member(
1008 'struct crypt_params_plain',
1010 prefix : '#include <libcryptsetup.h>')
1016 conf.set10('HAVE_LIBCRYPTSETUP', have)
1017 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1019 want_libcurl = get_option('libcurl')
1020 if want_libcurl != 'false' and not fuzzer_build
1021 libcurl = dependency('libcurl',
1022 version : '>= 7.32.0',
1023 required : want_libcurl == 'true')
1024 have = libcurl.found()
1029 conf.set10('HAVE_LIBCURL', have)
1031 want_libidn = get_option('libidn')
1032 want_libidn2 = get_option('libidn2')
1033 if want_libidn == 'true' and want_libidn2 == 'true'
1034 error('libidn and libidn2 cannot be requested simultaneously')
1037 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1038 libidn = dependency('libidn',
1039 required : want_libidn == 'true')
1040 have = libidn.found()
1045 conf.set10('HAVE_LIBIDN', have)
1046 if not have and want_libidn2 != 'false' and not fuzzer_build
1047 # libidn is used for both libidn and libidn2 objects
1048 libidn = dependency('libidn2',
1049 required : want_libidn2 == 'true')
1050 have = libidn.found()
1054 conf.set10('HAVE_LIBIDN2', have)
1056 want_libiptc = get_option('libiptc')
1057 if want_libiptc != 'false' and not fuzzer_build
1058 libiptc = dependency('libiptc',
1059 required : want_libiptc == 'true')
1060 have = libiptc.found()
1065 conf.set10('HAVE_LIBIPTC', have)
1067 want_qrencode = get_option('qrencode')
1068 if want_qrencode != 'false' and not fuzzer_build
1069 libqrencode = dependency('libqrencode',
1070 required : want_qrencode == 'true')
1071 have = libqrencode.found()
1076 conf.set10('HAVE_QRENCODE', have)
1078 want_gcrypt = get_option('gcrypt')
1079 if want_gcrypt != 'false' and not fuzzer_build
1080 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1081 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1082 have = libgcrypt.found() and libgpg_error.found()
1087 # link to neither of the libs if one is not found
1091 conf.set10('HAVE_GCRYPT', have)
1093 want_gnutls = get_option('gnutls')
1094 if want_gnutls != 'false' and not fuzzer_build
1095 libgnutls = dependency('gnutls',
1096 version : '>= 3.1.4',
1097 required : want_gnutls == 'true')
1098 have = libgnutls.found()
1103 conf.set10('HAVE_GNUTLS', have)
1105 want_openssl = get_option('openssl')
1106 if want_openssl != 'false' and not fuzzer_build
1107 libopenssl = dependency('openssl',
1108 version : '>= 1.1.0',
1109 required : want_openssl == 'true')
1110 have = libopenssl.found()
1115 conf.set10('HAVE_OPENSSL', have)
1117 want_elfutils = get_option('elfutils')
1118 if want_elfutils != 'false' and not fuzzer_build
1119 libdw = dependency('libdw',
1120 required : want_elfutils == 'true')
1121 have = libdw.found()
1126 conf.set10('HAVE_ELFUTILS', have)
1128 want_zlib = get_option('zlib')
1129 if want_zlib != 'false' and not fuzzer_build
1130 libz = dependency('zlib',
1131 required : want_zlib == 'true')
1137 conf.set10('HAVE_ZLIB', have)
1139 want_bzip2 = get_option('bzip2')
1140 if want_bzip2 != 'false' and not fuzzer_build
1141 libbzip2 = cc.find_library('bz2',
1142 required : want_bzip2 == 'true')
1143 have = libbzip2.found()
1148 conf.set10('HAVE_BZIP2', have)
1150 want_xz = get_option('xz')
1151 if want_xz != 'false' and not fuzzer_build
1152 libxz = dependency('liblzma',
1153 required : want_xz == 'true')
1154 have = libxz.found()
1159 conf.set10('HAVE_XZ', have)
1161 want_lz4 = get_option('lz4')
1162 if want_lz4 != 'false' and not fuzzer_build
1163 liblz4 = dependency('liblz4',
1164 version : '>= 1.3.0',
1165 required : want_lz4 == 'true')
1166 have = liblz4.found()
1171 conf.set10('HAVE_LZ4', have)
1173 want_xkbcommon = get_option('xkbcommon')
1174 if want_xkbcommon != 'false' and not fuzzer_build
1175 libxkbcommon = dependency('xkbcommon',
1176 version : '>= 0.3.0',
1177 required : want_xkbcommon == 'true')
1178 have = libxkbcommon.found()
1183 conf.set10('HAVE_XKBCOMMON', have)
1185 want_pcre2 = get_option('pcre2')
1186 if want_pcre2 != 'false'
1187 libpcre2 = dependency('libpcre2-8',
1188 required : want_pcre2 == 'true')
1189 have = libpcre2.found()
1194 conf.set10('HAVE_PCRE2', have)
1196 want_glib = get_option('glib')
1197 if want_glib != 'false' and not fuzzer_build
1198 libglib = dependency('glib-2.0',
1199 version : '>= 2.22.0',
1200 required : want_glib == 'true')
1201 libgobject = dependency('gobject-2.0',
1202 version : '>= 2.22.0',
1203 required : want_glib == 'true')
1204 libgio = dependency('gio-2.0',
1205 required : want_glib == 'true')
1206 have = libglib.found() and libgobject.found() and libgio.found()
1213 conf.set10('HAVE_GLIB', have)
1215 want_dbus = get_option('dbus')
1216 if want_dbus != 'false' and not fuzzer_build
1217 libdbus = dependency('dbus-1',
1218 version : '>= 1.3.2',
1219 required : want_dbus == 'true')
1220 have = libdbus.found()
1225 conf.set10('HAVE_DBUS', have)
1227 default_dnssec = get_option('default-dnssec')
1229 default_dnssec = 'no'
1231 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1232 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1233 default_dnssec = 'no'
1235 conf.set('DEFAULT_DNSSEC_MODE',
1236 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1237 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1239 dns_over_tls = get_option('dns-over-tls')
1240 if dns_over_tls != 'false'
1241 if dns_over_tls == 'openssl'
1244 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1245 if dns_over_tls == 'gnutls' and not have_gnutls
1246 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1249 if dns_over_tls == 'gnutls' or have_gnutls
1250 have_openssl = false
1252 have_openssl = conf.get('HAVE_OPENSSL') == 1
1253 if dns_over_tls != 'auto' and not have_openssl
1254 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1255 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1258 have = have_gnutls or have_openssl
1262 have_openssl = false
1264 conf.set10('ENABLE_DNS_OVER_TLS', have)
1265 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1266 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1268 default_dns_over_tls = get_option('default-dns-over-tls')
1270 default_dns_over_tls = 'no'
1272 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1273 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1274 default_dns_over_tls = 'no'
1276 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1277 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1278 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1280 want_importd = get_option('importd')
1281 if want_importd != 'false'
1282 have = (conf.get('HAVE_LIBCURL') == 1 and
1283 conf.get('HAVE_ZLIB') == 1 and
1284 conf.get('HAVE_XZ') == 1 and
1285 conf.get('HAVE_GCRYPT') == 1)
1286 if want_importd == 'true' and not have
1287 error('importd support was requested, but dependencies are not available')
1292 conf.set10('ENABLE_IMPORTD', have)
1294 want_remote = get_option('remote')
1295 if want_remote != 'false'
1296 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1297 conf.get('HAVE_LIBCURL') == 1]
1298 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1299 # it's possible to build one without the other. Complain only if
1300 # support was explictly requested. The auxiliary files like sysusers
1301 # config should be installed when any of the programs are built.
1302 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1303 error('remote support was requested, but dependencies are not available')
1305 have = have_deps[0] or have_deps[1]
1309 conf.set10('ENABLE_REMOTE', have)
1311 foreach term : ['utmp',
1343 have = get_option(term)
1344 name = 'ENABLE_' + term.underscorify().to_upper()
1345 conf.set10(name, have)
1348 foreach tuple : [['nss-mymachines', 'machined'],
1349 ['nss-resolve', 'resolve']]
1350 want = get_option(tuple[0])
1352 have = get_option(tuple[1])
1353 if want == 'true' and not have
1354 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1359 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1360 conf.set10(name, have)
1364 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1365 'ENABLE_NSS_MYMACHINES',
1366 'ENABLE_NSS_RESOLVE',
1367 'ENABLE_NSS_SYSTEMD']
1368 if conf.get(term) == 1
1372 conf.set10('ENABLE_NSS', enable_nss)
1374 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1379 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1381 #####################################################################
1383 if get_option('efi')
1384 efi_arch = host_machine.cpu_family()
1386 if efi_arch == 'x86'
1387 EFI_MACHINE_TYPE_NAME = 'ia32'
1388 gnu_efi_arch = 'ia32'
1389 elif efi_arch == 'x86_64'
1390 EFI_MACHINE_TYPE_NAME = 'x64'
1391 gnu_efi_arch = 'x86_64'
1392 elif efi_arch == 'arm'
1393 EFI_MACHINE_TYPE_NAME = 'arm'
1394 gnu_efi_arch = 'arm'
1395 elif efi_arch == 'aarch64'
1396 EFI_MACHINE_TYPE_NAME = 'aa64'
1397 gnu_efi_arch = 'aarch64'
1399 EFI_MACHINE_TYPE_NAME = ''
1404 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1406 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1410 conf.set10('ENABLE_EFI', have)
1412 #####################################################################
1414 config_h = configure_file(
1415 output : 'config.h',
1416 configuration : conf)
1418 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1420 includes = include_directories('src/basic',
1424 'src/journal-remote',
1428 'src/time-wait-sync',
1433 'src/libsystemd/sd-bus',
1434 'src/libsystemd/sd-device',
1435 'src/libsystemd/sd-event',
1436 'src/libsystemd/sd-hwdb',
1437 'src/libsystemd/sd-id128',
1438 'src/libsystemd/sd-netlink',
1439 'src/libsystemd/sd-network',
1440 'src/libsystemd/sd-resolve',
1441 'src/libsystemd-network',
1444 add_project_arguments('-include', 'config.h', language : 'c')
1446 generate_gperfs = find_program('tools/generate-gperfs.py')
1450 subdir('src/systemd')
1452 subdir('src/libsystemd')
1453 subdir('src/libsystemd-network')
1454 subdir('src/journal')
1457 libjournal_core = static_library(
1459 libjournal_core_sources,
1461 include_directories : includes,
1464 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1465 libsystemd = shared_library(
1468 version : libsystemd_version,
1469 include_directories : includes,
1470 link_args : ['-shared',
1471 '-Wl,--version-script=' + libsystemd_sym_path],
1472 link_with : [libbasic,
1474 link_whole : [libsystemd_static,
1476 dependencies : [threads,
1480 link_depends : libsystemd_sym,
1482 install_dir : rootlibdir)
1484 static_libsystemd = get_option('static-libsystemd')
1485 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1487 install_libsystemd_static = static_library(
1490 journal_client_sources,
1492 basic_gcrypt_sources,
1494 include_directories : includes,
1495 build_by_default : static_libsystemd != 'false',
1496 install : static_libsystemd != 'false',
1497 install_dir : rootlibdir,
1498 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1499 dependencies : [threads,
1508 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1510 ############################################################
1512 # binaries that have --help and are intended for use by humans,
1513 # usually, but not always, installed in /bin.
1514 public_programs = []
1516 subdir('src/libudev')
1517 subdir('src/shared')
1520 subdir('src/network')
1522 subdir('src/analyze')
1523 subdir('src/journal-remote')
1524 subdir('src/coredump')
1525 subdir('src/hostname')
1526 subdir('src/import')
1527 subdir('src/kernel-install')
1528 subdir('src/locale')
1529 subdir('src/machine')
1530 subdir('src/portable')
1531 subdir('src/nspawn')
1532 subdir('src/resolve')
1533 subdir('src/timedate')
1534 subdir('src/timesync')
1535 subdir('src/vconsole')
1536 subdir('src/boot/efi')
1543 ############################################################
1545 # only static linking apart from libdl, to make sure that the
1546 # module is linked to all libraries that it uses.
1547 test_dlopen = executable(
1551 include_directories : includes,
1552 link_with : [libbasic],
1553 dependencies : [libdl],
1554 build_by_default : want_tests != 'false')
1556 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1557 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1558 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1559 ['resolve', 'ENABLE_NSS_RESOLVE']]
1561 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1565 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1566 version_script_arg = join_paths(meson.source_root(), sym)
1568 nss = shared_library(
1570 'src/nss-@0@/nss-@0@.c'.format(module),
1573 include_directories : includes,
1574 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1575 link_args : ['-Wl,-z,nodelete',
1577 '-Wl,--version-script=' + version_script_arg,
1579 link_with : [libsystemd_static,
1581 dependencies : [threads,
1585 install_dir : rootlibdir)
1587 # We cannot use shared_module because it does not support version suffix.
1588 # Unfortunately shared_library insists on creating the symlink…
1589 meson.add_install_script('sh', '-c',
1590 'rm $DESTDIR@0@/libnss_@1@.so'
1591 .format(rootlibdir, module))
1593 if want_tests != 'false'
1594 test('dlopen-nss_' + module,
1596 # path to dlopen must include a slash
1597 args : nss.full_path())
1602 ############################################################
1604 executable('systemd',
1606 include_directories : includes,
1607 link_with : [libcore,
1609 dependencies : [threads,
1615 install_rpath : rootlibexecdir,
1617 install_dir : rootlibexecdir)
1619 meson.add_install_script(meson_make_symlink,
1620 join_paths(rootlibexecdir, 'systemd'),
1621 join_paths(rootsbindir, 'init'))
1623 exe = executable('systemd-analyze',
1624 systemd_analyze_sources,
1625 include_directories : includes,
1626 link_with : [libcore,
1628 dependencies : [threads,
1634 install_rpath : rootlibexecdir,
1636 public_programs += exe
1638 executable('systemd-journald',
1639 systemd_journald_sources,
1640 include_directories : includes,
1641 link_with : [libjournal_core,
1643 dependencies : [threads,
1647 install_rpath : rootlibexecdir,
1649 install_dir : rootlibexecdir)
1651 exe = executable('systemd-cat',
1652 systemd_cat_sources,
1653 include_directories : includes,
1654 link_with : [libjournal_core,
1656 dependencies : [threads],
1657 install_rpath : rootlibexecdir,
1659 public_programs += exe
1661 exe = executable('journalctl',
1663 include_directories : includes,
1664 link_with : [libshared],
1665 dependencies : [threads,
1670 install_rpath : rootlibexecdir,
1672 install_dir : rootbindir)
1673 public_programs += exe
1675 executable('systemd-getty-generator',
1676 'src/getty-generator/getty-generator.c',
1677 include_directories : includes,
1678 link_with : [libshared],
1679 install_rpath : rootlibexecdir,
1681 install_dir : systemgeneratordir)
1683 executable('systemd-debug-generator',
1684 'src/debug-generator/debug-generator.c',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 install_rpath : rootlibexecdir,
1689 install_dir : systemgeneratordir)
1691 executable('systemd-run-generator',
1692 'src/run-generator/run-generator.c',
1693 include_directories : includes,
1694 link_with : [libshared],
1695 install_rpath : rootlibexecdir,
1697 install_dir : systemgeneratordir)
1699 executable('systemd-fstab-generator',
1700 'src/fstab-generator/fstab-generator.c',
1701 'src/core/mount-setup.c',
1702 include_directories : includes,
1703 link_with : [libshared],
1704 install_rpath : rootlibexecdir,
1706 install_dir : systemgeneratordir)
1708 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1709 executable('30-systemd-environment-d-generator',
1710 'src/environment-d-generator/environment-d-generator.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 install_rpath : rootlibexecdir,
1715 install_dir : userenvgeneratordir)
1717 meson.add_install_script(meson_make_symlink,
1718 join_paths(sysconfdir, 'environment'),
1719 join_paths(environmentdir, '99-environment.conf'))
1722 if conf.get('ENABLE_HIBERNATE') == 1
1723 executable('systemd-hibernate-resume-generator',
1724 'src/hibernate-resume/hibernate-resume-generator.c',
1725 include_directories : includes,
1726 link_with : [libshared],
1727 install_rpath : rootlibexecdir,
1729 install_dir : systemgeneratordir)
1731 executable('systemd-hibernate-resume',
1732 'src/hibernate-resume/hibernate-resume.c',
1733 include_directories : includes,
1734 link_with : [libshared],
1735 install_rpath : rootlibexecdir,
1737 install_dir : rootlibexecdir)
1740 if conf.get('HAVE_BLKID') == 1
1741 executable('systemd-gpt-auto-generator',
1742 'src/gpt-auto-generator/gpt-auto-generator.c',
1743 'src/shared/blkid-util.h',
1744 include_directories : includes,
1745 link_with : [libshared],
1746 dependencies : libblkid,
1747 install_rpath : rootlibexecdir,
1749 install_dir : systemgeneratordir)
1751 exe = executable('systemd-dissect',
1752 'src/dissect/dissect.c',
1753 include_directories : includes,
1754 link_with : [libshared],
1755 install_rpath : rootlibexecdir,
1757 install_dir : rootlibexecdir)
1758 public_programs += exe
1761 if conf.get('ENABLE_RESOLVE') == 1
1762 executable('systemd-resolved',
1763 systemd_resolved_sources,
1764 include_directories : includes,
1765 link_with : [libshared,
1767 libsystemd_resolve_core],
1768 dependencies : systemd_resolved_dependencies,
1769 install_rpath : rootlibexecdir,
1771 install_dir : rootlibexecdir)
1773 exe = executable('resolvectl',
1775 include_directories : includes,
1776 link_with : [libshared,
1778 libsystemd_resolve_core],
1779 dependencies : [threads,
1783 install_rpath : rootlibexecdir,
1785 public_programs += exe
1787 meson.add_install_script(meson_make_symlink,
1788 join_paths(bindir, 'resolvectl'),
1789 join_paths(rootsbindir, 'resolvconf'))
1791 meson.add_install_script(meson_make_symlink,
1792 join_paths(bindir, 'resolvectl'),
1793 join_paths(bindir, 'systemd-resolve'))
1796 if conf.get('ENABLE_LOGIND') == 1
1797 executable('systemd-logind',
1798 systemd_logind_sources,
1799 include_directories : includes,
1800 link_with : [liblogind_core,
1802 dependencies : [threads,
1804 install_rpath : rootlibexecdir,
1806 install_dir : rootlibexecdir)
1808 exe = executable('loginctl',
1810 include_directories : includes,
1811 link_with : [libshared],
1812 dependencies : [threads,
1815 install_rpath : rootlibexecdir,
1817 install_dir : rootbindir)
1818 public_programs += exe
1820 exe = executable('systemd-inhibit',
1821 'src/login/inhibit.c',
1822 include_directories : includes,
1823 link_with : [libshared],
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootbindir)
1827 public_programs += exe
1829 if conf.get('HAVE_PAM') == 1
1830 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1831 pam_systemd = shared_library(
1835 include_directories : includes,
1836 link_args : ['-shared',
1837 '-Wl,--version-script=' + version_script_arg],
1838 link_with : [libsystemd_static,
1840 dependencies : [threads,
1843 link_depends : pam_systemd_sym,
1845 install_dir : pamlibdir)
1847 if want_tests != 'false'
1848 test('dlopen-pam_systemd',
1850 # path to dlopen must include a slash
1851 args : pam_systemd.full_path())
1855 executable('systemd-user-runtime-dir',
1856 user_runtime_dir_sources,
1857 include_directories : includes,
1858 link_with : [libshared],
1859 install_rpath : rootlibexecdir,
1861 install_dir : rootlibexecdir)
1864 if conf.get('HAVE_PAM') == 1
1865 executable('systemd-user-sessions',
1866 'src/user-sessions/user-sessions.c',
1867 include_directories : includes,
1868 link_with : [libshared],
1869 install_rpath : rootlibexecdir,
1871 install_dir : rootlibexecdir)
1874 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1875 exe = executable('bootctl',
1876 'src/boot/bootctl.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 dependencies : [libblkid],
1880 install_rpath : rootlibexecdir,
1882 public_programs += exe
1884 executable('systemd-bless-boot',
1885 'src/boot/bless-boot.c',
1886 include_directories : includes,
1887 link_with : [libshared],
1888 dependencies : [libblkid],
1889 install_rpath : rootlibexecdir,
1891 install_dir : rootlibexecdir)
1893 executable('systemd-bless-boot-generator',
1894 'src/boot/bless-boot-generator.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 install_rpath : rootlibexecdir,
1899 install_dir : systemgeneratordir)
1902 executable('systemd-boot-check-no-failures',
1903 'src/boot/boot-check-no-failures.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 dependencies : [libblkid],
1907 install_rpath : rootlibexecdir,
1909 install_dir : rootlibexecdir)
1911 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 dependencies : [threads],
1915 install_rpath : rootlibexecdir,
1917 public_programs += exe
1920 if get_option('link-systemctl-shared')
1921 systemctl_link_with = [libshared]
1923 systemctl_link_with = [libsystemd_static,
1929 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1930 include_directories : includes,
1931 link_with : systemctl_link_with,
1932 dependencies : [threads,
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootbindir)
1940 public_programs += exe
1942 if conf.get('ENABLE_PORTABLED') == 1
1943 executable('systemd-portabled',
1944 systemd_portabled_sources,
1945 include_directories : includes,
1946 link_with : [libshared],
1947 dependencies : [threads],
1948 install_rpath : rootlibexecdir,
1950 install_dir : rootlibexecdir)
1952 exe = executable('portablectl', 'src/portable/portablectl.c',
1953 include_directories : includes,
1954 link_with : [libshared],
1955 dependencies : [threads],
1956 install_rpath : rootlibexecdir,
1958 install_dir : rootbindir)
1959 public_programs += exe
1962 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1963 meson.add_install_script(meson_make_symlink,
1964 join_paths(rootbindir, 'systemctl'),
1965 join_paths(rootsbindir, alias))
1968 if conf.get('ENABLE_BACKLIGHT') == 1
1969 executable('systemd-backlight',
1970 'src/backlight/backlight.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 install_rpath : rootlibexecdir,
1975 install_dir : rootlibexecdir)
1978 if conf.get('ENABLE_RFKILL') == 1
1979 executable('systemd-rfkill',
1980 'src/rfkill/rfkill.c',
1981 include_directories : includes,
1982 link_with : [libshared],
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootlibexecdir)
1988 executable('systemd-system-update-generator',
1989 'src/system-update-generator/system-update-generator.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1994 install_dir : systemgeneratordir)
1996 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1997 executable('systemd-cryptsetup',
1998 'src/cryptsetup/cryptsetup.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 dependencies : [libcryptsetup],
2002 install_rpath : rootlibexecdir,
2004 install_dir : rootlibexecdir)
2006 executable('systemd-cryptsetup-generator',
2007 'src/cryptsetup/cryptsetup-generator.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 dependencies : [libcryptsetup],
2011 install_rpath : rootlibexecdir,
2013 install_dir : systemgeneratordir)
2015 executable('systemd-veritysetup',
2016 'src/veritysetup/veritysetup.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : [libcryptsetup],
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootlibexecdir)
2024 executable('systemd-veritysetup-generator',
2025 'src/veritysetup/veritysetup-generator.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [libcryptsetup],
2029 install_rpath : rootlibexecdir,
2031 install_dir : systemgeneratordir)
2034 if conf.get('HAVE_SYSV_COMPAT') == 1
2035 executable('systemd-sysv-generator',
2036 'src/sysv-generator/sysv-generator.c',
2037 include_directories : includes,
2038 link_with : [libshared],
2039 install_rpath : rootlibexecdir,
2041 install_dir : systemgeneratordir)
2043 executable('systemd-rc-local-generator',
2044 'src/rc-local-generator/rc-local-generator.c',
2045 include_directories : includes,
2046 link_with : [libshared],
2047 install_rpath : rootlibexecdir,
2049 install_dir : systemgeneratordir)
2052 if conf.get('ENABLE_HOSTNAMED') == 1
2053 executable('systemd-hostnamed',
2054 'src/hostname/hostnamed.c',
2055 include_directories : includes,
2056 link_with : [libshared],
2057 install_rpath : rootlibexecdir,
2059 install_dir : rootlibexecdir)
2061 exe = executable('hostnamectl',
2062 'src/hostname/hostnamectl.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 install_rpath : rootlibexecdir,
2067 public_programs += exe
2070 if conf.get('ENABLE_LOCALED') == 1
2071 if conf.get('HAVE_XKBCOMMON') == 1
2072 # logind will load libxkbcommon.so dynamically on its own
2078 executable('systemd-localed',
2079 systemd_localed_sources,
2080 include_directories : includes,
2081 link_with : [libshared],
2082 dependencies : deps,
2083 install_rpath : rootlibexecdir,
2085 install_dir : rootlibexecdir)
2087 exe = executable('localectl',
2089 include_directories : includes,
2090 link_with : [libshared],
2091 install_rpath : rootlibexecdir,
2093 public_programs += exe
2096 if conf.get('ENABLE_TIMEDATED') == 1
2097 executable('systemd-timedated',
2098 'src/timedate/timedated.c',
2099 include_directories : includes,
2100 link_with : [libshared],
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootlibexecdir)
2106 if conf.get('ENABLE_TIMEDATECTL') == 1
2107 exe = executable('timedatectl',
2108 'src/timedate/timedatectl.c',
2109 include_directories : includes,
2110 install_rpath : rootlibexecdir,
2111 link_with : [libshared],
2112 dependencies : [libm],
2114 public_programs += exe
2117 if conf.get('ENABLE_TIMESYNCD') == 1
2118 executable('systemd-timesyncd',
2119 systemd_timesyncd_sources,
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [threads,
2124 install_rpath : rootlibexecdir,
2126 install_dir : rootlibexecdir)
2128 executable('systemd-time-wait-sync',
2129 'src/time-wait-sync/time-wait-sync.c',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 install_rpath : rootlibexecdir,
2134 install_dir : rootlibexecdir)
2137 if conf.get('ENABLE_MACHINED') == 1
2138 executable('systemd-machined',
2139 systemd_machined_sources,
2140 include_directories : includes,
2141 link_with : [libmachine_core,
2143 install_rpath : rootlibexecdir,
2145 install_dir : rootlibexecdir)
2147 exe = executable('machinectl',
2148 'src/machine/machinectl.c',
2149 include_directories : includes,
2150 link_with : [libshared],
2151 dependencies : [threads,
2154 install_rpath : rootlibexecdir,
2156 install_dir : rootbindir)
2157 public_programs += exe
2160 if conf.get('ENABLE_IMPORTD') == 1
2161 executable('systemd-importd',
2162 systemd_importd_sources,
2163 include_directories : includes,
2164 link_with : [libshared],
2165 dependencies : [threads],
2166 install_rpath : rootlibexecdir,
2168 install_dir : rootlibexecdir)
2170 systemd_pull = executable('systemd-pull',
2171 systemd_pull_sources,
2172 include_directories : includes,
2173 link_with : [libshared],
2174 dependencies : [libcurl,
2179 install_rpath : rootlibexecdir,
2181 install_dir : rootlibexecdir)
2183 systemd_import = executable('systemd-import',
2184 systemd_import_sources,
2185 include_directories : includes,
2186 link_with : [libshared],
2187 dependencies : [libcurl,
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootlibexecdir)
2195 systemd_import_fs = executable('systemd-import-fs',
2196 systemd_import_fs_sources,
2197 include_directories : includes,
2198 link_with : [libshared],
2199 install_rpath : rootlibexecdir,
2201 install_dir : rootlibexecdir)
2203 systemd_export = executable('systemd-export',
2204 systemd_export_sources,
2205 include_directories : includes,
2206 link_with : [libshared],
2207 dependencies : [libcurl,
2211 install_rpath : rootlibexecdir,
2213 install_dir : rootlibexecdir)
2215 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2218 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2219 exe = executable('systemd-journal-upload',
2220 systemd_journal_upload_sources,
2221 include_directories : includes,
2222 link_with : [libshared],
2223 dependencies : [threads,
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootlibexecdir)
2231 public_programs += exe
2234 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2235 s_j_remote = executable('systemd-journal-remote',
2236 systemd_journal_remote_sources,
2237 include_directories : includes,
2238 link_with : [libshared,
2239 libsystemd_journal_remote],
2240 dependencies : [threads,
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootlibexecdir)
2249 s_j_gatewayd = executable('systemd-journal-gatewayd',
2250 systemd_journal_gatewayd_sources,
2251 include_directories : includes,
2252 link_with : [libshared],
2253 dependencies : [threads,
2258 install_rpath : rootlibexecdir,
2260 install_dir : rootlibexecdir)
2261 public_programs += [s_j_remote, s_j_gatewayd]
2264 if conf.get('ENABLE_COREDUMP') == 1
2265 executable('systemd-coredump',
2266 systemd_coredump_sources,
2267 include_directories : includes,
2268 link_with : [libshared],
2269 dependencies : [threads,
2274 install_rpath : rootlibexecdir,
2276 install_dir : rootlibexecdir)
2278 exe = executable('coredumpctl',
2279 coredumpctl_sources,
2280 include_directories : includes,
2281 link_with : [libshared],
2282 dependencies : [threads,
2285 install_rpath : rootlibexecdir,
2287 public_programs += exe
2290 if conf.get('ENABLE_BINFMT') == 1
2291 exe = executable('systemd-binfmt',
2292 'src/binfmt/binfmt.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2297 install_dir : rootlibexecdir)
2298 public_programs += exe
2300 meson.add_install_script('sh', '-c',
2301 mkdir_p.format(binfmtdir))
2302 meson.add_install_script('sh', '-c',
2303 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2306 if conf.get('ENABLE_VCONSOLE') == 1
2307 executable('systemd-vconsole-setup',
2308 'src/vconsole/vconsole-setup.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2313 install_dir : rootlibexecdir)
2316 if conf.get('ENABLE_RANDOMSEED') == 1
2317 executable('systemd-random-seed',
2318 'src/random-seed/random-seed.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 install_rpath : rootlibexecdir,
2323 install_dir : rootlibexecdir)
2326 if conf.get('ENABLE_FIRSTBOOT') == 1
2327 executable('systemd-firstboot',
2328 'src/firstboot/firstboot.c',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 dependencies : [libcrypt],
2332 install_rpath : rootlibexecdir,
2334 install_dir : rootbindir)
2337 executable('systemd-remount-fs',
2338 'src/remount-fs/remount-fs.c',
2339 'src/core/mount-setup.c',
2340 'src/core/mount-setup.h',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2345 install_dir : rootlibexecdir)
2347 executable('systemd-machine-id-setup',
2348 'src/machine-id-setup/machine-id-setup-main.c',
2349 'src/core/machine-id-setup.c',
2350 'src/core/machine-id-setup.h',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 install_rpath : rootlibexecdir,
2355 install_dir : rootbindir)
2357 executable('systemd-fsck',
2359 include_directories : includes,
2360 link_with : [libshared],
2361 install_rpath : rootlibexecdir,
2363 install_dir : rootlibexecdir)
2365 executable('systemd-growfs',
2366 'src/partition/growfs.c',
2367 include_directories : includes,
2368 link_with : [libshared],
2369 dependencies : [libcryptsetup],
2370 install_rpath : rootlibexecdir,
2372 install_dir : rootlibexecdir)
2374 executable('systemd-makefs',
2375 'src/partition/makefs.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 install_rpath : rootlibexecdir,
2380 install_dir : rootlibexecdir)
2382 executable('systemd-sleep',
2383 'src/sleep/sleep.c',
2384 include_directories : includes,
2385 link_with : [libshared],
2386 install_rpath : rootlibexecdir,
2388 install_dir : rootlibexecdir)
2390 exe = executable('systemd-sysctl',
2391 'src/sysctl/sysctl.c',
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2396 install_dir : rootlibexecdir)
2397 public_programs += exe
2399 executable('systemd-ac-power',
2400 'src/ac-power/ac-power.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2405 install_dir : rootlibexecdir)
2407 exe = executable('systemd-detect-virt',
2408 'src/detect-virt/detect-virt.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2413 public_programs += exe
2415 exe = executable('systemd-delta',
2416 'src/delta/delta.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 install_rpath : rootlibexecdir,
2421 public_programs += exe
2423 exe = executable('systemd-escape',
2424 'src/escape/escape.c',
2425 include_directories : includes,
2426 link_with : [libshared],
2427 install_rpath : rootlibexecdir,
2429 install_dir : rootbindir)
2430 public_programs += exe
2432 exe = executable('systemd-notify',
2433 'src/notify/notify.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 install_dir : rootbindir)
2439 public_programs += exe
2441 executable('systemd-volatile-root',
2442 'src/volatile-root/volatile-root.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 install_rpath : rootlibexecdir,
2447 install_dir : rootlibexecdir)
2449 executable('systemd-cgroups-agent',
2450 'src/cgroups-agent/cgroups-agent.c',
2451 include_directories : includes,
2452 link_with : [libshared],
2453 install_rpath : rootlibexecdir,
2455 install_dir : rootlibexecdir)
2457 exe = executable('systemd-id128',
2458 'src/id128/id128.c',
2459 include_directories : includes,
2460 link_with : [libshared],
2461 install_rpath : rootlibexecdir,
2463 public_programs += exe
2465 exe = executable('systemd-path',
2467 include_directories : includes,
2468 link_with : [libshared],
2469 install_rpath : rootlibexecdir,
2471 public_programs += exe
2473 exe = executable('systemd-ask-password',
2474 'src/ask-password/ask-password.c',
2475 include_directories : includes,
2476 link_with : [libshared],
2477 install_rpath : rootlibexecdir,
2479 install_dir : rootbindir)
2480 public_programs += exe
2482 executable('systemd-reply-password',
2483 'src/reply-password/reply-password.c',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 install_rpath : rootlibexecdir,
2488 install_dir : rootlibexecdir)
2490 exe = executable('systemd-tty-ask-password-agent',
2491 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2492 include_directories : includes,
2493 link_with : [libshared],
2494 install_rpath : rootlibexecdir,
2496 install_dir : rootbindir)
2497 public_programs += exe
2499 exe = executable('systemd-cgls',
2501 include_directories : includes,
2502 link_with : [libshared],
2503 install_rpath : rootlibexecdir,
2505 public_programs += exe
2507 exe = executable('systemd-cgtop',
2508 'src/cgtop/cgtop.c',
2509 include_directories : includes,
2510 link_with : [libshared],
2511 install_rpath : rootlibexecdir,
2513 public_programs += exe
2515 executable('systemd-initctl',
2516 'src/initctl/initctl.c',
2517 include_directories : includes,
2518 link_with : [libshared],
2519 install_rpath : rootlibexecdir,
2521 install_dir : rootlibexecdir)
2523 exe = executable('systemd-mount',
2524 'src/mount/mount-tool.c',
2525 include_directories : includes,
2526 link_with : [libshared],
2527 install_rpath : rootlibexecdir,
2529 public_programs += exe
2531 meson.add_install_script(meson_make_symlink,
2532 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2534 exe = executable('systemd-run',
2536 include_directories : includes,
2537 link_with : [libshared],
2538 install_rpath : rootlibexecdir,
2540 public_programs += exe
2542 exe = executable('systemd-stdio-bridge',
2543 'src/stdio-bridge/stdio-bridge.c',
2544 include_directories : includes,
2545 link_with : [libshared],
2546 install_rpath : rootlibexecdir,
2548 public_programs += exe
2550 exe = executable('busctl',
2551 'src/busctl/busctl.c',
2552 'src/busctl/busctl-introspect.c',
2553 'src/busctl/busctl-introspect.h',
2554 include_directories : includes,
2555 link_with : [libshared],
2556 install_rpath : rootlibexecdir,
2558 public_programs += exe
2560 if conf.get('ENABLE_SYSUSERS') == 1
2561 exe = executable('systemd-sysusers',
2562 'src/sysusers/sysusers.c',
2563 include_directories : includes,
2564 link_with : [libshared],
2565 install_rpath : rootlibexecdir,
2567 install_dir : rootbindir)
2568 public_programs += exe
2571 if conf.get('ENABLE_TMPFILES') == 1
2572 exe = executable('systemd-tmpfiles',
2573 'src/tmpfiles/tmpfiles.c',
2574 include_directories : includes,
2575 link_with : [libshared],
2576 dependencies : [libacl],
2577 install_rpath : rootlibexecdir,
2579 install_dir : rootbindir)
2580 public_programs += exe
2582 if want_tests != 'false'
2583 test('test-systemd-tmpfiles',
2584 test_systemd_tmpfiles_py,
2585 # https://github.com/mesonbuild/meson/issues/2681
2586 args : exe.full_path())
2590 if conf.get('ENABLE_HWDB') == 1
2591 exe = executable('systemd-hwdb',
2593 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2594 include_directories : includes,
2595 link_with : [libudev_static],
2596 install_rpath : udev_rpath,
2598 install_dir : rootbindir)
2599 public_programs += exe
2602 if conf.get('ENABLE_QUOTACHECK') == 1
2603 executable('systemd-quotacheck',
2604 'src/quotacheck/quotacheck.c',
2605 include_directories : includes,
2606 link_with : [libshared],
2607 install_rpath : rootlibexecdir,
2609 install_dir : rootlibexecdir)
2612 exe = executable('systemd-socket-proxyd',
2613 'src/socket-proxy/socket-proxyd.c',
2614 include_directories : includes,
2615 link_with : [libshared],
2616 dependencies : [threads],
2617 install_rpath : rootlibexecdir,
2619 install_dir : rootlibexecdir)
2620 public_programs += exe
2622 exe = executable('systemd-udevd',
2623 systemd_udevd_sources,
2624 include_directories : includes,
2625 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2626 link_with : [libudev_core,
2629 dependencies : [threads,
2634 install_rpath : udev_rpath,
2636 install_dir : rootlibexecdir)
2637 public_programs += exe
2639 exe = executable('udevadm',
2641 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2642 include_directories : includes,
2643 link_with : [libudev_core,
2646 dependencies : [threads,
2651 install_rpath : udev_rpath,
2653 install_dir : rootbindir)
2654 public_programs += exe
2656 executable('systemd-shutdown',
2657 systemd_shutdown_sources,
2658 include_directories : includes,
2659 link_with : [libshared],
2660 dependencies : [libmount],
2661 install_rpath : rootlibexecdir,
2663 install_dir : rootlibexecdir)
2665 executable('systemd-update-done',
2666 'src/update-done/update-done.c',
2667 include_directories : includes,
2668 link_with : [libshared],
2669 install_rpath : rootlibexecdir,
2671 install_dir : rootlibexecdir)
2673 executable('systemd-update-utmp',
2674 'src/update-utmp/update-utmp.c',
2675 include_directories : includes,
2676 link_with : [libshared],
2677 dependencies : [libaudit],
2678 install_rpath : rootlibexecdir,
2680 install_dir : rootlibexecdir)
2682 if conf.get('HAVE_KMOD') == 1
2683 executable('systemd-modules-load',
2684 'src/modules-load/modules-load.c',
2685 include_directories : includes,
2686 link_with : [libshared],
2687 dependencies : [libkmod],
2688 install_rpath : rootlibexecdir,
2690 install_dir : rootlibexecdir)
2692 meson.add_install_script('sh', '-c',
2693 mkdir_p.format(modulesloaddir))
2694 meson.add_install_script('sh', '-c',
2695 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2698 exe = executable('systemd-nspawn',
2699 systemd_nspawn_sources,
2700 'src/core/mount-setup.c', # FIXME: use a variable?
2701 'src/core/mount-setup.h',
2702 'src/core/loopback-setup.c',
2703 'src/core/loopback-setup.h',
2704 include_directories : includes,
2705 link_with : [libnspawn_core,
2707 dependencies : [libblkid],
2708 install_rpath : rootlibexecdir,
2710 public_programs += exe
2712 if conf.get('ENABLE_NETWORKD') == 1
2713 executable('systemd-networkd',
2714 systemd_networkd_sources,
2715 include_directories : includes,
2716 link_with : [libnetworkd_core,
2720 dependencies : [threads],
2721 install_rpath : rootlibexecdir,
2723 install_dir : rootlibexecdir)
2725 executable('systemd-networkd-wait-online',
2726 systemd_networkd_wait_online_sources,
2727 include_directories : includes,
2728 link_with : [libnetworkd_core,
2730 install_rpath : rootlibexecdir,
2732 install_dir : rootlibexecdir)
2734 exe = executable('networkctl',
2736 include_directories : includes,
2737 link_with : [libsystemd_network,
2739 install_rpath : rootlibexecdir,
2741 install_dir : rootbindir)
2742 public_programs += exe
2745 executable('systemd-sulogin-shell',
2746 ['src/sulogin-shell/sulogin-shell.c'],
2747 include_directories : includes,
2748 link_with : [libshared],
2749 install_rpath : rootlibexecdir,
2751 install_dir : rootlibexecdir)
2753 ############################################################
2756 'systemd-runtest.env',
2757 output : 'systemd-runtest.env',
2758 command : ['sh', '-c', '{ ' +
2759 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2760 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2762 build_by_default : true)
2764 foreach tuple : tests
2766 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2767 dependencies = tuple[2]
2768 condition = tuple.length() >= 4 ? tuple[3] : ''
2769 type = tuple.length() >= 5 ? tuple[4] : ''
2770 defs = tuple.length() >= 6 ? tuple[5] : []
2771 incs = tuple.length() >= 7 ? tuple[6] : includes
2774 name = sources[0].split('/')[-1].split('.')[0]
2775 if type.startswith('timeout=')
2776 timeout = type.split('=')[1].to_int()
2780 if condition == '' or conf.get(condition) == 1
2784 include_directories : incs,
2785 link_with : link_with,
2786 dependencies : dependencies,
2788 build_by_default : want_tests != 'false',
2789 install_rpath : rootlibexecdir,
2790 install : install_tests,
2791 install_dir : join_paths(testsdir, type))
2794 message('@0@ is a manual test'.format(name))
2795 elif type == 'unsafe' and want_tests != 'unsafe'
2796 message('@0@ is an unsafe test'.format(name))
2797 elif want_tests != 'false'
2803 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2808 'test-libsystemd-sym',
2809 test_libsystemd_sym_c,
2810 include_directories : includes,
2811 link_with : [libsystemd],
2812 build_by_default : want_tests != 'false',
2813 install : install_tests,
2814 install_dir : testsdir)
2815 if want_tests != 'false'
2816 test('test-libsystemd-sym', exe)
2820 'test-libsystemd-static-sym',
2821 test_libsystemd_sym_c,
2822 include_directories : includes,
2823 link_with : [install_libsystemd_static],
2824 dependencies : [threads], # threads is already included in dependencies on the library,
2825 # but does not seem to get propagated. Add here as a work-around.
2826 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2827 install : install_tests and static_libsystemd_pic,
2828 install_dir : testsdir)
2829 if want_tests != 'false' and static_libsystemd_pic
2830 test('test-libsystemd-static-sym', exe)
2836 include_directories : includes,
2837 c_args : '-Wno-deprecated-declarations',
2838 link_with : [libudev],
2839 build_by_default : want_tests != 'false',
2840 install : install_tests,
2841 install_dir : testsdir)
2842 if want_tests != 'false'
2843 test('test-libudev-sym', exe)
2847 'test-libudev-static-sym',
2849 include_directories : includes,
2850 c_args : '-Wno-deprecated-declarations',
2851 link_with : [install_libudev_static],
2852 build_by_default : want_tests != 'false' and static_libudev_pic,
2853 install : install_tests and static_libudev_pic,
2854 install_dir : testsdir)
2855 if want_tests != 'false' and static_libudev_pic
2856 test('test-libudev-static-sym', exe)
2859 ############################################################
2863 if get_option('tests') != 'false'
2864 foreach tuple : fuzzers
2866 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2867 dependencies = tuple[2]
2868 defs = tuple.length() >= 4 ? tuple[3] : []
2869 incs = tuple.length() >= 5 ? tuple[4] : includes
2872 dependencies += fuzzing_engine
2874 sources += 'src/fuzz/fuzz-main.c'
2877 name = sources[0].split('/')[-1].split('.')[0]
2879 fuzzer_exes += executable(
2882 include_directories : [incs, include_directories('src/fuzz')],
2883 link_with : link_with,
2884 dependencies : dependencies,
2890 run_target('fuzzers',
2891 depends : fuzzer_exes,
2894 ############################################################
2896 make_directive_index_py = find_program('tools/make-directive-index.py')
2897 make_man_index_py = find_program('tools/make-man-index.py')
2898 xml_helper_py = find_program('tools/xml_helper.py')
2899 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2903 subdir('sysusers.d')
2904 subdir('tmpfiles.d')
2909 subdir('shell-completion/bash')
2910 subdir('shell-completion/zsh')
2911 subdir('docs/sysvinit')
2912 subdir('docs/var-log')
2914 install_subdir('factory/etc',
2915 install_dir : factorydir)
2917 install_data('xorg/50-systemd-user.sh',
2918 install_dir : xinitrcdir)
2919 install_data('modprobe.d/systemd.conf',
2920 install_dir : modprobedir)
2921 install_data('LICENSE.GPL2',
2925 'docs/CODING_STYLE.md',
2926 'docs/DISTRO_PORTING.md',
2927 'docs/ENVIRONMENT.md',
2929 'docs/TRANSIENT-SETTINGS.md',
2930 'docs/TRANSLATORS.md',
2931 'docs/UIDS-GIDS.md',
2932 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2933 install_dir : docdir)
2935 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2936 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2938 ############################################################
2940 meson_check_help = find_program('tools/meson-check-help.sh')
2942 foreach exec : public_programs
2943 name = exec.full_path().split('/')[-1]
2944 if want_tests != 'false'
2945 test('check-help-' + name,
2947 args : exec.full_path())
2951 ############################################################
2953 # Enable tests for all supported sanitizers
2954 foreach tuple : sanitizers
2955 sanitizer = tuple[0]
2958 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2960 foreach p : fuzz_regression_tests
2961 b = p.split('/')[-2]
2962 c = p.split('/')[-1]
2964 name = '@0@:@1@'.format(b, sanitizer)
2967 if want_tests == 'false'
2968 message('Not compiling @0@ because tests is set to false'.format(name))
2970 exe = custom_target(
2974 command : [env, 'ln', '-fs',
2975 join_paths(build.full_path(), b),
2977 build_by_default : true)
2979 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2984 if want_tests != 'false' and slow_tests
2985 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2987 args : [exe.full_path(),
2988 join_paths(meson.source_root(), p)])
2995 ############################################################
2998 all_files = run_command(
3000 ['--git-dir=@0@/.git'.format(meson.source_root()),
3003 all_files = files(all_files.stdout().split())
3008 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3011 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3015 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3018 command : [meson_git_contrib_sh])
3022 git_head = run_command(
3024 ['--git-dir=@0@/.git'.format(meson.source_root()),
3025 'rev-parse', 'HEAD']).stdout().strip()
3026 git_head_short = run_command(
3028 ['--git-dir=@0@/.git'.format(meson.source_root()),
3029 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3033 command : ['git', 'archive',
3034 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3036 '--prefix', 'systemd-@0@/'.format(git_head),
3040 ############################################################
3042 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3045 depends : [man, libsystemd, libudev],
3046 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3050 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
3052 ############################################################
3055 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3057 'split /usr: @0@'.format(split_usr),
3058 'split bin-sbin: @0@'.format(split_bin),
3059 'prefix directory: @0@'.format(prefixdir),
3060 'rootprefix directory: @0@'.format(rootprefixdir),
3061 'sysconf directory: @0@'.format(sysconfdir),
3062 'include directory: @0@'.format(includedir),
3063 'lib directory: @0@'.format(libdir),
3064 'rootlib directory: @0@'.format(rootlibdir),
3065 'SysV init scripts: @0@'.format(sysvinit_path),
3066 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3067 'PAM modules directory: @0@'.format(pamlibdir),
3068 'PAM configuration directory: @0@'.format(pamconfdir),
3069 'RPM macros directory: @0@'.format(rpmmacrosdir),
3070 'modprobe.d directory: @0@'.format(modprobedir),
3071 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3072 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3073 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3074 'bash completions directory: @0@'.format(bashcompletiondir),
3075 'zsh completions directory: @0@'.format(zshcompletiondir),
3076 'extra start script: @0@'.format(get_option('rc-local')),
3077 'extra stop script: @0@'.format(get_option('halt-local')),
3078 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3079 get_option('debug-tty')),
3080 'TTY GID: @0@'.format(tty_gid),
3081 'users GID: @0@'.format(substs.get('USERS_GID')),
3082 'maximum system UID: @0@'.format(system_uid_max),
3083 'maximum system GID: @0@'.format(system_gid_max),
3084 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3085 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3086 'minimum container UID base: @0@'.format(container_uid_base_min),
3087 'maximum container UID base: @0@'.format(container_uid_base_max),
3088 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3089 'render group access mode: @0@'.format(get_option('group-render-mode')),
3090 'certificate root directory: @0@'.format(get_option('certificate-root')),
3091 'support URL: @0@'.format(support_url),
3092 'nobody user name: @0@'.format(nobody_user),
3093 'nobody group name: @0@'.format(nobody_group),
3094 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3095 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3097 'default DNSSEC mode: @0@'.format(default_dnssec),
3098 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3099 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3100 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3101 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3103 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3104 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3106 'default DNS servers: @0@'.format(alt_dns_servers),
3107 'default NTP servers: @0@'.format(alt_ntp_servers)]
3109 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3110 '@@0@'.format(time_epoch)).stdout().strip()
3112 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3115 'static libsystemd: @0@'.format(static_libsystemd),
3116 'static libudev: @0@'.format(static_libudev)]
3119 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3120 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3121 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3123 if conf.get('ENABLE_EFI') == 1
3124 status += 'efi arch: @0@'.format(efi_arch)
3128 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3129 'EFI CC @0@'.format(' '.join(efi_cc)),
3130 'EFI lib directory: @0@'.format(efi_libdir),
3131 'EFI lds directory: @0@'.format(efi_ldsdir),
3132 'EFI include directory: @0@'.format(efi_incdir)]
3184 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3185 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3188 ['legacy pkla', install_polkit_pkla],
3190 ['gnu-efi', have_gnu_efi],
3203 ['man pages', want_man],
3204 ['html pages', want_html],
3205 ['man page indices', want_man and have_lxml],
3210 ['adm group', get_option('adm-group')],
3211 ['wheel group', get_option('wheel-group')],
3214 ['debug mmap cache'],
3217 ['valgrind', conf.get('VALGRIND') == 1],
3218 ['trace logging', conf.get('LOG_TRACE') == 1],
3219 ['link-udev-shared', get_option('link-udev-shared')],
3220 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3223 if tuple.length() >= 2
3226 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3227 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3228 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3239 'enabled features: @0@'.format(', '.join(found)),
3241 'disabled features: @0@'.format(', '.join(missing)),
3243 message('\n '.join(status))
3245 if rootprefixdir != rootprefix_default
3247 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3248 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3249 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))