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 time_epoch = get_option('time-epoch')
700 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
702 conf.set('TIME_EPOCH', time_epoch)
704 system_uid_max = get_option('system-uid-max')
705 if system_uid_max == -1
706 system_uid_max = run_command(
708 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
709 '/etc/login.defs').stdout().strip()
710 if system_uid_max == ''
713 system_uid_max = system_uid_max.to_int()
716 conf.set('SYSTEM_UID_MAX', system_uid_max)
717 substs.set('systemuidmax', system_uid_max)
719 system_gid_max = get_option('system-gid-max')
720 if system_gid_max == -1
721 system_gid_max = run_command(
723 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
724 '/etc/login.defs').stdout().strip()
725 if system_gid_max == ''
728 system_gid_max = system_gid_max.to_int()
731 conf.set('SYSTEM_GID_MAX', system_gid_max)
732 substs.set('systemgidmax', system_gid_max)
734 dynamic_uid_min = get_option('dynamic-uid-min')
735 dynamic_uid_max = get_option('dynamic-uid-max')
736 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
737 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
738 substs.set('dynamicuidmin', dynamic_uid_min)
739 substs.set('dynamicuidmax', dynamic_uid_max)
741 container_uid_base_min = get_option('container-uid-base-min')
742 container_uid_base_max = get_option('container-uid-base-max')
743 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
744 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
745 substs.set('containeruidbasemin', container_uid_base_min)
746 substs.set('containeruidbasemax', container_uid_base_max)
748 nobody_user = get_option('nobody-user')
749 nobody_group = get_option('nobody-group')
751 if not meson.is_cross_build()
752 getent_result = run_command('getent', 'passwd', '65534')
753 if getent_result.returncode() == 0
754 name = getent_result.stdout().split(':')[0]
755 if name != nobody_user
757 '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) +
758 'Your build will result in an user table setup that is incompatible with the local system.')
761 id_result = run_command('id', '-u', nobody_user)
762 if id_result.returncode() == 0
763 id = id_result.stdout().to_int()
766 '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) +
767 'Your build will result in an user table setup that is incompatible with the local system.')
771 getent_result = run_command('getent', 'group', '65534')
772 if getent_result.returncode() == 0
773 name = getent_result.stdout().split(':')[0]
774 if name != nobody_group
776 '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) +
777 'Your build will result in an group table setup that is incompatible with the local system.')
780 id_result = run_command('id', '-g', nobody_group)
781 if id_result.returncode() == 0
782 id = id_result.stdout().to_int()
785 '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) +
786 'Your build will result in an group table setup that is incompatible with the local system.')
790 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
792 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
793 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
796 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
797 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
798 substs.set('NOBODY_USER_NAME', nobody_user)
799 substs.set('NOBODY_GROUP_NAME', nobody_group)
801 tty_gid = get_option('tty-gid')
802 conf.set('TTY_GID', tty_gid)
803 substs.set('TTY_GID', tty_gid)
805 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
806 users_gid = get_option('users-gid')
807 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
809 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
810 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
812 dev_kvm_mode = get_option('dev-kvm-mode')
813 substs.set('DEV_KVM_MODE', dev_kvm_mode)
814 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
815 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
817 kill_user_processes = get_option('default-kill-user-processes')
818 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
819 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
820 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
822 dns_servers = get_option('dns-servers')
823 conf.set_quoted('DNS_SERVERS', dns_servers)
824 substs.set('DNS_SERVERS', dns_servers)
826 ntp_servers = get_option('ntp-servers')
827 conf.set_quoted('NTP_SERVERS', ntp_servers)
828 substs.set('NTP_SERVERS', ntp_servers)
830 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
832 substs.set('SUSHELL', get_option('debug-shell'))
833 substs.set('DEBUGTTY', get_option('debug-tty'))
835 enable_debug_hashmap = false
836 enable_debug_mmap_cache = false
837 enable_debug_siphash = false
838 enable_debug_udev = false
839 foreach name : get_option('debug-extra')
841 enable_debug_hashmap = true
842 elif name == 'mmap-cache'
843 enable_debug_mmap_cache = true
844 elif name == 'siphash'
845 enable_debug_siphash = true
847 enable_debug_udev = true
849 message('unknown debug option "@0@", ignoring'.format(name))
852 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
853 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
854 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
855 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
857 conf.set10('VALGRIND', get_option('valgrind'))
858 conf.set10('LOG_TRACE', get_option('log-trace'))
860 #####################################################################
862 threads = dependency('threads')
863 librt = cc.find_library('rt')
864 libm = cc.find_library('m')
865 libdl = cc.find_library('dl')
866 libcrypt = cc.find_library('crypt')
868 libcap = dependency('libcap', required : false)
869 if not libcap.found()
870 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
871 libcap = cc.find_library('cap')
874 libmount = dependency('mount',
875 version : fuzzer_build ? '>= 0' : '>= 2.30')
877 want_seccomp = get_option('seccomp')
878 if want_seccomp != 'false' and not fuzzer_build
879 libseccomp = dependency('libseccomp',
880 version : '>= 2.3.1',
881 required : want_seccomp == 'true')
882 have = libseccomp.found()
887 conf.set10('HAVE_SECCOMP', have)
889 want_selinux = get_option('selinux')
890 if want_selinux != 'false' and not fuzzer_build
891 libselinux = dependency('libselinux',
892 version : '>= 2.1.9',
893 required : want_selinux == 'true')
894 have = libselinux.found()
899 conf.set10('HAVE_SELINUX', have)
901 want_apparmor = get_option('apparmor')
902 if want_apparmor != 'false' and not fuzzer_build
903 libapparmor = dependency('libapparmor',
904 required : want_apparmor == 'true')
905 have = libapparmor.found()
910 conf.set10('HAVE_APPARMOR', have)
912 smack_run_label = get_option('smack-run-label')
913 if smack_run_label != ''
914 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
917 want_polkit = get_option('polkit')
918 install_polkit = false
919 install_polkit_pkla = false
920 if want_polkit != 'false' and not fuzzer_build
921 install_polkit = true
923 libpolkit = dependency('polkit-gobject-1',
925 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
926 message('Old polkit detected, will install pkla files')
927 install_polkit_pkla = true
930 conf.set10('ENABLE_POLKIT', install_polkit)
932 want_acl = get_option('acl')
933 if want_acl != 'false' and not fuzzer_build
934 libacl = cc.find_library('acl', required : want_acl == 'true')
935 have = libacl.found()
940 conf.set10('HAVE_ACL', have)
942 want_audit = get_option('audit')
943 if want_audit != 'false' and not fuzzer_build
944 libaudit = dependency('audit', required : want_audit == 'true')
945 have = libaudit.found()
950 conf.set10('HAVE_AUDIT', have)
952 want_blkid = get_option('blkid')
953 if want_blkid != 'false' and not fuzzer_build
954 libblkid = dependency('blkid', required : want_blkid == 'true')
955 have = libblkid.found()
960 conf.set10('HAVE_BLKID', have)
962 want_kmod = get_option('kmod')
963 if want_kmod != 'false' and not fuzzer_build
964 libkmod = dependency('libkmod',
966 required : want_kmod == 'true')
967 have = libkmod.found()
972 conf.set10('HAVE_KMOD', have)
974 want_pam = get_option('pam')
975 if want_pam != 'false' and not fuzzer_build
976 libpam = cc.find_library('pam', required : want_pam == 'true')
977 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
978 have = libpam.found() and libpam_misc.found()
984 conf.set10('HAVE_PAM', have)
986 want_microhttpd = get_option('microhttpd')
987 if want_microhttpd != 'false' and not fuzzer_build
988 libmicrohttpd = dependency('libmicrohttpd',
989 version : '>= 0.9.33',
990 required : want_microhttpd == 'true')
991 have = libmicrohttpd.found()
996 conf.set10('HAVE_MICROHTTPD', have)
998 want_libcryptsetup = get_option('libcryptsetup')
999 if want_libcryptsetup != 'false' and not fuzzer_build
1000 libcryptsetup = dependency('libcryptsetup',
1001 version : '>= 1.6.0',
1002 required : want_libcryptsetup == 'true')
1003 have = libcryptsetup.found()
1004 have_sector = cc.has_member(
1005 'struct crypt_params_plain',
1007 prefix : '#include <libcryptsetup.h>')
1013 conf.set10('HAVE_LIBCRYPTSETUP', have)
1014 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1016 want_libcurl = get_option('libcurl')
1017 if want_libcurl != 'false' and not fuzzer_build
1018 libcurl = dependency('libcurl',
1019 version : '>= 7.32.0',
1020 required : want_libcurl == 'true')
1021 have = libcurl.found()
1026 conf.set10('HAVE_LIBCURL', have)
1028 want_libidn = get_option('libidn')
1029 want_libidn2 = get_option('libidn2')
1030 if want_libidn == 'true' and want_libidn2 == 'true'
1031 error('libidn and libidn2 cannot be requested simultaneously')
1034 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1035 libidn = dependency('libidn',
1036 required : want_libidn == 'true')
1037 have = libidn.found()
1042 conf.set10('HAVE_LIBIDN', have)
1043 if not have and want_libidn2 != 'false' and not fuzzer_build
1044 # libidn is used for both libidn and libidn2 objects
1045 libidn = dependency('libidn2',
1046 required : want_libidn2 == 'true')
1047 have = libidn.found()
1051 conf.set10('HAVE_LIBIDN2', have)
1053 want_libiptc = get_option('libiptc')
1054 if want_libiptc != 'false' and not fuzzer_build
1055 libiptc = dependency('libiptc',
1056 required : want_libiptc == 'true')
1057 have = libiptc.found()
1062 conf.set10('HAVE_LIBIPTC', have)
1064 want_qrencode = get_option('qrencode')
1065 if want_qrencode != 'false' and not fuzzer_build
1066 libqrencode = dependency('libqrencode',
1067 required : want_qrencode == 'true')
1068 have = libqrencode.found()
1073 conf.set10('HAVE_QRENCODE', have)
1075 want_gcrypt = get_option('gcrypt')
1076 if want_gcrypt != 'false' and not fuzzer_build
1077 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1078 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1079 have = libgcrypt.found() and libgpg_error.found()
1084 # link to neither of the libs if one is not found
1088 conf.set10('HAVE_GCRYPT', have)
1090 want_gnutls = get_option('gnutls')
1091 if want_gnutls != 'false' and not fuzzer_build
1092 libgnutls = dependency('gnutls',
1093 version : '>= 3.1.4',
1094 required : want_gnutls == 'true')
1095 have = libgnutls.found()
1100 conf.set10('HAVE_GNUTLS', have)
1102 want_openssl = get_option('openssl')
1103 if want_openssl != 'false' and not fuzzer_build
1104 libopenssl = dependency('openssl',
1105 version : '>= 1.1.0',
1106 required : want_openssl == 'true')
1107 have = libopenssl.found()
1112 conf.set10('HAVE_OPENSSL', have)
1114 want_elfutils = get_option('elfutils')
1115 if want_elfutils != 'false' and not fuzzer_build
1116 libdw = dependency('libdw',
1117 required : want_elfutils == 'true')
1118 have = libdw.found()
1123 conf.set10('HAVE_ELFUTILS', have)
1125 want_zlib = get_option('zlib')
1126 if want_zlib != 'false' and not fuzzer_build
1127 libz = dependency('zlib',
1128 required : want_zlib == 'true')
1134 conf.set10('HAVE_ZLIB', have)
1136 want_bzip2 = get_option('bzip2')
1137 if want_bzip2 != 'false' and not fuzzer_build
1138 libbzip2 = cc.find_library('bz2',
1139 required : want_bzip2 == 'true')
1140 have = libbzip2.found()
1145 conf.set10('HAVE_BZIP2', have)
1147 want_xz = get_option('xz')
1148 if want_xz != 'false' and not fuzzer_build
1149 libxz = dependency('liblzma',
1150 required : want_xz == 'true')
1151 have = libxz.found()
1156 conf.set10('HAVE_XZ', have)
1158 want_lz4 = get_option('lz4')
1159 if want_lz4 != 'false' and not fuzzer_build
1160 liblz4 = dependency('liblz4',
1161 version : '>= 1.3.0',
1162 required : want_lz4 == 'true')
1163 have = liblz4.found()
1168 conf.set10('HAVE_LZ4', have)
1170 want_xkbcommon = get_option('xkbcommon')
1171 if want_xkbcommon != 'false' and not fuzzer_build
1172 libxkbcommon = dependency('xkbcommon',
1173 version : '>= 0.3.0',
1174 required : want_xkbcommon == 'true')
1175 have = libxkbcommon.found()
1180 conf.set10('HAVE_XKBCOMMON', have)
1182 want_pcre2 = get_option('pcre2')
1183 if want_pcre2 != 'false'
1184 libpcre2 = dependency('libpcre2-8',
1185 required : want_pcre2 == 'true')
1186 have = libpcre2.found()
1191 conf.set10('HAVE_PCRE2', have)
1193 want_glib = get_option('glib')
1194 if want_glib != 'false' and not fuzzer_build
1195 libglib = dependency('glib-2.0',
1196 version : '>= 2.22.0',
1197 required : want_glib == 'true')
1198 libgobject = dependency('gobject-2.0',
1199 version : '>= 2.22.0',
1200 required : want_glib == 'true')
1201 libgio = dependency('gio-2.0',
1202 required : want_glib == 'true')
1203 have = libglib.found() and libgobject.found() and libgio.found()
1210 conf.set10('HAVE_GLIB', have)
1212 want_dbus = get_option('dbus')
1213 if want_dbus != 'false' and not fuzzer_build
1214 libdbus = dependency('dbus-1',
1215 version : '>= 1.3.2',
1216 required : want_dbus == 'true')
1217 have = libdbus.found()
1222 conf.set10('HAVE_DBUS', have)
1224 default_dnssec = get_option('default-dnssec')
1226 default_dnssec = 'no'
1228 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1229 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1230 default_dnssec = 'no'
1232 conf.set('DEFAULT_DNSSEC_MODE',
1233 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1234 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1236 dns_over_tls = get_option('dns-over-tls')
1237 if dns_over_tls != 'false'
1238 if dns_over_tls == 'openssl'
1241 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1242 if dns_over_tls == 'gnutls' and not have_gnutls
1243 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1246 if dns_over_tls == 'gnutls' or have_gnutls
1247 have_openssl = false
1249 have_openssl = conf.get('HAVE_OPENSSL') == 1
1250 if dns_over_tls != 'auto' and not have_openssl
1251 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1252 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1255 have = have_gnutls or have_openssl
1259 have_openssl = false
1261 conf.set10('ENABLE_DNS_OVER_TLS', have)
1262 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1263 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1265 default_dns_over_tls = get_option('default-dns-over-tls')
1267 default_dns_over_tls = 'no'
1269 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1270 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1271 default_dns_over_tls = 'no'
1273 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1274 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1275 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1277 want_importd = get_option('importd')
1278 if want_importd != 'false'
1279 have = (conf.get('HAVE_LIBCURL') == 1 and
1280 conf.get('HAVE_ZLIB') == 1 and
1281 conf.get('HAVE_XZ') == 1 and
1282 conf.get('HAVE_GCRYPT') == 1)
1283 if want_importd == 'true' and not have
1284 error('importd support was requested, but dependencies are not available')
1289 conf.set10('ENABLE_IMPORTD', have)
1291 want_remote = get_option('remote')
1292 if want_remote != 'false'
1293 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1294 conf.get('HAVE_LIBCURL') == 1]
1295 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1296 # it's possible to build one without the other. Complain only if
1297 # support was explictly requested. The auxiliary files like sysusers
1298 # config should be installed when any of the programs are built.
1299 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1300 error('remote support was requested, but dependencies are not available')
1302 have = have_deps[0] or have_deps[1]
1306 conf.set10('ENABLE_REMOTE', have)
1308 foreach term : ['utmp',
1340 have = get_option(term)
1341 name = 'ENABLE_' + term.underscorify().to_upper()
1342 conf.set10(name, have)
1345 foreach tuple : [['nss-mymachines', 'machined'],
1346 ['nss-resolve', 'resolve']]
1347 want = get_option(tuple[0])
1349 have = get_option(tuple[1])
1350 if want == 'true' and not have
1351 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1356 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1357 conf.set10(name, have)
1361 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1362 'ENABLE_NSS_MYMACHINES',
1363 'ENABLE_NSS_RESOLVE',
1364 'ENABLE_NSS_SYSTEMD']
1365 if conf.get(term) == 1
1369 conf.set10('ENABLE_NSS', enable_nss)
1371 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1376 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1378 #####################################################################
1380 if get_option('efi')
1381 efi_arch = host_machine.cpu_family()
1383 if efi_arch == 'x86'
1384 EFI_MACHINE_TYPE_NAME = 'ia32'
1385 gnu_efi_arch = 'ia32'
1386 elif efi_arch == 'x86_64'
1387 EFI_MACHINE_TYPE_NAME = 'x64'
1388 gnu_efi_arch = 'x86_64'
1389 elif efi_arch == 'arm'
1390 EFI_MACHINE_TYPE_NAME = 'arm'
1391 gnu_efi_arch = 'arm'
1392 elif efi_arch == 'aarch64'
1393 EFI_MACHINE_TYPE_NAME = 'aa64'
1394 gnu_efi_arch = 'aarch64'
1396 EFI_MACHINE_TYPE_NAME = ''
1401 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1403 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1407 conf.set10('ENABLE_EFI', have)
1409 #####################################################################
1411 config_h = configure_file(
1412 output : 'config.h',
1413 configuration : conf)
1415 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1417 includes = include_directories('src/basic',
1421 'src/journal-remote',
1425 'src/time-wait-sync',
1430 'src/libsystemd/sd-bus',
1431 'src/libsystemd/sd-device',
1432 'src/libsystemd/sd-event',
1433 'src/libsystemd/sd-hwdb',
1434 'src/libsystemd/sd-id128',
1435 'src/libsystemd/sd-netlink',
1436 'src/libsystemd/sd-network',
1437 'src/libsystemd-network',
1440 add_project_arguments('-include', 'config.h', language : 'c')
1442 generate_gperfs = find_program('tools/generate-gperfs.py')
1446 subdir('src/systemd')
1448 subdir('src/libsystemd')
1449 subdir('src/libsystemd-network')
1450 subdir('src/journal')
1453 libjournal_core = static_library(
1455 libjournal_core_sources,
1457 include_directories : includes,
1460 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1461 libsystemd = shared_library(
1464 version : libsystemd_version,
1465 include_directories : includes,
1466 link_args : ['-shared',
1467 '-Wl,--version-script=' + libsystemd_sym_path],
1468 link_with : [libbasic,
1470 link_whole : [libsystemd_static,
1472 dependencies : [threads,
1476 link_depends : libsystemd_sym,
1478 install_dir : rootlibdir)
1480 static_libsystemd = get_option('static-libsystemd')
1481 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1483 install_libsystemd_static = static_library(
1486 journal_client_sources,
1488 basic_gcrypt_sources,
1490 include_directories : includes,
1491 build_by_default : static_libsystemd != 'false',
1492 install : static_libsystemd != 'false',
1493 install_dir : rootlibdir,
1494 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1495 dependencies : [threads,
1504 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1506 ############################################################
1508 # binaries that have --help and are intended for use by humans,
1509 # usually, but not always, installed in /bin.
1510 public_programs = []
1512 subdir('src/libudev')
1513 subdir('src/shared')
1516 subdir('src/network')
1518 subdir('src/analyze')
1519 subdir('src/journal-remote')
1520 subdir('src/coredump')
1521 subdir('src/hostname')
1522 subdir('src/import')
1523 subdir('src/kernel-install')
1524 subdir('src/locale')
1525 subdir('src/machine')
1526 subdir('src/portable')
1527 subdir('src/nspawn')
1528 subdir('src/resolve')
1529 subdir('src/timedate')
1530 subdir('src/timesync')
1531 subdir('src/vconsole')
1532 subdir('src/boot/efi')
1539 ############################################################
1541 # only static linking apart from libdl, to make sure that the
1542 # module is linked to all libraries that it uses.
1543 test_dlopen = executable(
1547 include_directories : includes,
1548 link_with : [libbasic],
1549 dependencies : [libdl],
1550 build_by_default : want_tests != 'false')
1552 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1553 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1554 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1555 ['resolve', 'ENABLE_NSS_RESOLVE']]
1557 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1561 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1562 version_script_arg = join_paths(meson.source_root(), sym)
1564 nss = shared_library(
1566 'src/nss-@0@/nss-@0@.c'.format(module),
1569 include_directories : includes,
1570 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1571 link_args : ['-Wl,-z,nodelete',
1573 '-Wl,--version-script=' + version_script_arg,
1575 link_with : [libsystemd_static,
1577 dependencies : [threads,
1581 install_dir : rootlibdir)
1583 # We cannot use shared_module because it does not support version suffix.
1584 # Unfortunately shared_library insists on creating the symlink…
1585 meson.add_install_script('sh', '-c',
1586 'rm $DESTDIR@0@/libnss_@1@.so'
1587 .format(rootlibdir, module))
1589 if want_tests != 'false'
1590 test('dlopen-nss_' + module,
1592 # path to dlopen must include a slash
1593 args : nss.full_path())
1598 ############################################################
1600 executable('systemd',
1602 include_directories : includes,
1603 link_with : [libcore,
1605 dependencies : [threads,
1611 install_rpath : rootlibexecdir,
1613 install_dir : rootlibexecdir)
1615 meson.add_install_script(meson_make_symlink,
1616 join_paths(rootlibexecdir, 'systemd'),
1617 join_paths(rootsbindir, 'init'))
1619 exe = executable('systemd-analyze',
1620 systemd_analyze_sources,
1621 include_directories : includes,
1622 link_with : [libcore,
1624 dependencies : [threads,
1630 install_rpath : rootlibexecdir,
1632 public_programs += exe
1634 executable('systemd-journald',
1635 systemd_journald_sources,
1636 include_directories : includes,
1637 link_with : [libjournal_core,
1639 dependencies : [threads,
1643 install_rpath : rootlibexecdir,
1645 install_dir : rootlibexecdir)
1647 exe = executable('systemd-cat',
1648 systemd_cat_sources,
1649 include_directories : includes,
1650 link_with : [libjournal_core,
1652 dependencies : [threads],
1653 install_rpath : rootlibexecdir,
1655 public_programs += exe
1657 exe = executable('journalctl',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 dependencies : [threads,
1666 install_rpath : rootlibexecdir,
1668 install_dir : rootbindir)
1669 public_programs += exe
1671 executable('systemd-getty-generator',
1672 'src/getty-generator/getty-generator.c',
1673 include_directories : includes,
1674 link_with : [libshared],
1675 install_rpath : rootlibexecdir,
1677 install_dir : systemgeneratordir)
1679 executable('systemd-debug-generator',
1680 'src/debug-generator/debug-generator.c',
1681 include_directories : includes,
1682 link_with : [libshared],
1683 install_rpath : rootlibexecdir,
1685 install_dir : systemgeneratordir)
1687 executable('systemd-run-generator',
1688 'src/run-generator/run-generator.c',
1689 include_directories : includes,
1690 link_with : [libshared],
1691 install_rpath : rootlibexecdir,
1693 install_dir : systemgeneratordir)
1695 executable('systemd-fstab-generator',
1696 'src/fstab-generator/fstab-generator.c',
1697 'src/core/mount-setup.c',
1698 include_directories : includes,
1699 link_with : [libshared],
1700 install_rpath : rootlibexecdir,
1702 install_dir : systemgeneratordir)
1704 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1705 executable('30-systemd-environment-d-generator',
1706 'src/environment-d-generator/environment-d-generator.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 install_rpath : rootlibexecdir,
1711 install_dir : userenvgeneratordir)
1713 meson.add_install_script(meson_make_symlink,
1714 join_paths(sysconfdir, 'environment'),
1715 join_paths(environmentdir, '99-environment.conf'))
1718 if conf.get('ENABLE_HIBERNATE') == 1
1719 executable('systemd-hibernate-resume-generator',
1720 'src/hibernate-resume/hibernate-resume-generator.c',
1721 include_directories : includes,
1722 link_with : [libshared],
1723 install_rpath : rootlibexecdir,
1725 install_dir : systemgeneratordir)
1727 executable('systemd-hibernate-resume',
1728 'src/hibernate-resume/hibernate-resume.c',
1729 include_directories : includes,
1730 link_with : [libshared],
1731 install_rpath : rootlibexecdir,
1733 install_dir : rootlibexecdir)
1736 if conf.get('HAVE_BLKID') == 1
1737 executable('systemd-gpt-auto-generator',
1738 'src/gpt-auto-generator/gpt-auto-generator.c',
1739 'src/shared/blkid-util.h',
1740 include_directories : includes,
1741 link_with : [libshared],
1742 dependencies : libblkid,
1743 install_rpath : rootlibexecdir,
1745 install_dir : systemgeneratordir)
1747 exe = executable('systemd-dissect',
1748 'src/dissect/dissect.c',
1749 include_directories : includes,
1750 link_with : [libshared],
1751 install_rpath : rootlibexecdir,
1753 install_dir : rootlibexecdir)
1754 public_programs += exe
1757 if conf.get('ENABLE_RESOLVE') == 1
1758 executable('systemd-resolved',
1759 systemd_resolved_sources,
1760 include_directories : includes,
1761 link_with : [libshared,
1763 libsystemd_resolve_core],
1764 dependencies : systemd_resolved_dependencies,
1765 install_rpath : rootlibexecdir,
1767 install_dir : rootlibexecdir)
1769 exe = executable('resolvectl',
1771 include_directories : includes,
1772 link_with : [libshared,
1774 libsystemd_resolve_core],
1775 dependencies : [threads,
1779 install_rpath : rootlibexecdir,
1781 public_programs += exe
1783 meson.add_install_script(meson_make_symlink,
1784 join_paths(bindir, 'resolvectl'),
1785 join_paths(rootsbindir, 'resolvconf'))
1787 meson.add_install_script(meson_make_symlink,
1788 join_paths(bindir, 'resolvectl'),
1789 join_paths(bindir, 'systemd-resolve'))
1792 if conf.get('ENABLE_LOGIND') == 1
1793 executable('systemd-logind',
1794 systemd_logind_sources,
1795 include_directories : includes,
1796 link_with : [liblogind_core,
1798 dependencies : [threads,
1800 install_rpath : rootlibexecdir,
1802 install_dir : rootlibexecdir)
1804 exe = executable('loginctl',
1806 include_directories : includes,
1807 link_with : [libshared],
1808 dependencies : [threads,
1811 install_rpath : rootlibexecdir,
1813 install_dir : rootbindir)
1814 public_programs += exe
1816 exe = executable('systemd-inhibit',
1817 'src/login/inhibit.c',
1818 include_directories : includes,
1819 link_with : [libshared],
1820 install_rpath : rootlibexecdir,
1822 install_dir : rootbindir)
1823 public_programs += exe
1825 if conf.get('HAVE_PAM') == 1
1826 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1827 pam_systemd = shared_library(
1831 include_directories : includes,
1832 link_args : ['-shared',
1833 '-Wl,--version-script=' + version_script_arg],
1834 link_with : [libsystemd_static,
1836 dependencies : [threads,
1839 link_depends : pam_systemd_sym,
1841 install_dir : pamlibdir)
1843 if want_tests != 'false'
1844 test('dlopen-pam_systemd',
1846 # path to dlopen must include a slash
1847 args : pam_systemd.full_path())
1851 executable('systemd-user-runtime-dir',
1852 user_runtime_dir_sources,
1853 include_directories : includes,
1854 link_with : [libshared],
1855 install_rpath : rootlibexecdir,
1857 install_dir : rootlibexecdir)
1860 if conf.get('HAVE_PAM') == 1
1861 executable('systemd-user-sessions',
1862 'src/user-sessions/user-sessions.c',
1863 include_directories : includes,
1864 link_with : [libshared],
1865 install_rpath : rootlibexecdir,
1867 install_dir : rootlibexecdir)
1870 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1871 exe = executable('bootctl',
1872 'src/boot/bootctl.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 dependencies : [libblkid],
1876 install_rpath : rootlibexecdir,
1878 public_programs += exe
1880 executable('systemd-bless-boot',
1881 'src/boot/bless-boot.c',
1882 include_directories : includes,
1883 link_with : [libshared],
1884 dependencies : [libblkid],
1885 install_rpath : rootlibexecdir,
1887 install_dir : rootlibexecdir)
1889 executable('systemd-bless-boot-generator',
1890 'src/boot/bless-boot-generator.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 install_rpath : rootlibexecdir,
1895 install_dir : systemgeneratordir)
1898 executable('systemd-boot-check-no-failures',
1899 'src/boot/boot-check-no-failures.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 dependencies : [libblkid],
1903 install_rpath : rootlibexecdir,
1905 install_dir : rootlibexecdir)
1907 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1908 include_directories : includes,
1909 link_with : [libshared],
1910 dependencies : [threads],
1911 install_rpath : rootlibexecdir,
1913 public_programs += exe
1916 if get_option('link-systemctl-shared')
1917 systemctl_link_with = [libshared]
1919 systemctl_link_with = [libsystemd_static,
1925 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1926 include_directories : includes,
1927 link_with : systemctl_link_with,
1928 dependencies : [threads,
1933 install_rpath : rootlibexecdir,
1935 install_dir : rootbindir)
1936 public_programs += exe
1938 if conf.get('ENABLE_PORTABLED') == 1
1939 executable('systemd-portabled',
1940 systemd_portabled_sources,
1941 include_directories : includes,
1942 link_with : [libshared],
1943 dependencies : [threads],
1944 install_rpath : rootlibexecdir,
1946 install_dir : rootlibexecdir)
1948 exe = executable('portablectl', 'src/portable/portablectl.c',
1949 include_directories : includes,
1950 link_with : [libshared],
1951 dependencies : [threads],
1952 install_rpath : rootlibexecdir,
1954 install_dir : rootbindir)
1955 public_programs += exe
1958 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1959 meson.add_install_script(meson_make_symlink,
1960 join_paths(rootbindir, 'systemctl'),
1961 join_paths(rootsbindir, alias))
1964 if conf.get('ENABLE_BACKLIGHT') == 1
1965 executable('systemd-backlight',
1966 'src/backlight/backlight.c',
1967 include_directories : includes,
1968 link_with : [libshared],
1969 install_rpath : rootlibexecdir,
1971 install_dir : rootlibexecdir)
1974 if conf.get('ENABLE_RFKILL') == 1
1975 executable('systemd-rfkill',
1976 'src/rfkill/rfkill.c',
1977 include_directories : includes,
1978 link_with : [libshared],
1979 install_rpath : rootlibexecdir,
1981 install_dir : rootlibexecdir)
1984 executable('systemd-system-update-generator',
1985 'src/system-update-generator/system-update-generator.c',
1986 include_directories : includes,
1987 link_with : [libshared],
1988 install_rpath : rootlibexecdir,
1990 install_dir : systemgeneratordir)
1992 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1993 executable('systemd-cryptsetup',
1994 'src/cryptsetup/cryptsetup.c',
1995 include_directories : includes,
1996 link_with : [libshared],
1997 dependencies : [libcryptsetup],
1998 install_rpath : rootlibexecdir,
2000 install_dir : rootlibexecdir)
2002 executable('systemd-cryptsetup-generator',
2003 'src/cryptsetup/cryptsetup-generator.c',
2004 include_directories : includes,
2005 link_with : [libshared],
2006 dependencies : [libcryptsetup],
2007 install_rpath : rootlibexecdir,
2009 install_dir : systemgeneratordir)
2011 executable('systemd-veritysetup',
2012 'src/veritysetup/veritysetup.c',
2013 include_directories : includes,
2014 link_with : [libshared],
2015 dependencies : [libcryptsetup],
2016 install_rpath : rootlibexecdir,
2018 install_dir : rootlibexecdir)
2020 executable('systemd-veritysetup-generator',
2021 'src/veritysetup/veritysetup-generator.c',
2022 include_directories : includes,
2023 link_with : [libshared],
2024 dependencies : [libcryptsetup],
2025 install_rpath : rootlibexecdir,
2027 install_dir : systemgeneratordir)
2030 if conf.get('HAVE_SYSV_COMPAT') == 1
2031 executable('systemd-sysv-generator',
2032 'src/sysv-generator/sysv-generator.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 install_rpath : rootlibexecdir,
2037 install_dir : systemgeneratordir)
2039 executable('systemd-rc-local-generator',
2040 'src/rc-local-generator/rc-local-generator.c',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 install_rpath : rootlibexecdir,
2045 install_dir : systemgeneratordir)
2048 if conf.get('ENABLE_HOSTNAMED') == 1
2049 executable('systemd-hostnamed',
2050 'src/hostname/hostnamed.c',
2051 include_directories : includes,
2052 link_with : [libshared],
2053 install_rpath : rootlibexecdir,
2055 install_dir : rootlibexecdir)
2057 exe = executable('hostnamectl',
2058 'src/hostname/hostnamectl.c',
2059 include_directories : includes,
2060 link_with : [libshared],
2061 install_rpath : rootlibexecdir,
2063 public_programs += exe
2066 if conf.get('ENABLE_LOCALED') == 1
2067 if conf.get('HAVE_XKBCOMMON') == 1
2068 # logind will load libxkbcommon.so dynamically on its own
2074 executable('systemd-localed',
2075 systemd_localed_sources,
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : deps,
2079 install_rpath : rootlibexecdir,
2081 install_dir : rootlibexecdir)
2083 exe = executable('localectl',
2085 include_directories : includes,
2086 link_with : [libshared],
2087 install_rpath : rootlibexecdir,
2089 public_programs += exe
2092 if conf.get('ENABLE_TIMEDATED') == 1
2093 executable('systemd-timedated',
2094 'src/timedate/timedated.c',
2095 include_directories : includes,
2096 link_with : [libshared],
2097 install_rpath : rootlibexecdir,
2099 install_dir : rootlibexecdir)
2102 if conf.get('ENABLE_TIMEDATECTL') == 1
2103 exe = executable('timedatectl',
2104 'src/timedate/timedatectl.c',
2105 include_directories : includes,
2106 install_rpath : rootlibexecdir,
2107 link_with : [libshared],
2108 dependencies : [libm],
2110 public_programs += exe
2113 if conf.get('ENABLE_TIMESYNCD') == 1
2114 executable('systemd-timesyncd',
2115 systemd_timesyncd_sources,
2116 include_directories : includes,
2117 link_with : [libshared],
2118 dependencies : [threads,
2120 install_rpath : rootlibexecdir,
2122 install_dir : rootlibexecdir)
2124 executable('systemd-time-wait-sync',
2125 'src/time-wait-sync/time-wait-sync.c',
2126 include_directories : includes,
2127 link_with : [libshared],
2128 install_rpath : rootlibexecdir,
2130 install_dir : rootlibexecdir)
2133 if conf.get('ENABLE_MACHINED') == 1
2134 executable('systemd-machined',
2135 systemd_machined_sources,
2136 include_directories : includes,
2137 link_with : [libmachine_core,
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2143 exe = executable('machinectl',
2144 'src/machine/machinectl.c',
2145 include_directories : includes,
2146 link_with : [libshared],
2147 dependencies : [threads,
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootbindir)
2153 public_programs += exe
2156 if conf.get('ENABLE_IMPORTD') == 1
2157 executable('systemd-importd',
2158 systemd_importd_sources,
2159 include_directories : includes,
2160 link_with : [libshared],
2161 dependencies : [threads],
2162 install_rpath : rootlibexecdir,
2164 install_dir : rootlibexecdir)
2166 systemd_pull = executable('systemd-pull',
2167 systemd_pull_sources,
2168 include_directories : includes,
2169 link_with : [libshared],
2170 dependencies : [libcurl,
2175 install_rpath : rootlibexecdir,
2177 install_dir : rootlibexecdir)
2179 systemd_import = executable('systemd-import',
2180 systemd_import_sources,
2181 include_directories : includes,
2182 link_with : [libshared],
2183 dependencies : [libcurl,
2187 install_rpath : rootlibexecdir,
2189 install_dir : rootlibexecdir)
2191 systemd_import_fs = executable('systemd-import-fs',
2192 systemd_import_fs_sources,
2193 include_directories : includes,
2194 link_with : [libshared],
2195 install_rpath : rootlibexecdir,
2197 install_dir : rootlibexecdir)
2199 systemd_export = executable('systemd-export',
2200 systemd_export_sources,
2201 include_directories : includes,
2202 link_with : [libshared],
2203 dependencies : [libcurl,
2207 install_rpath : rootlibexecdir,
2209 install_dir : rootlibexecdir)
2211 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2214 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2215 exe = executable('systemd-journal-upload',
2216 systemd_journal_upload_sources,
2217 include_directories : includes,
2218 link_with : [libshared],
2219 dependencies : [threads,
2224 install_rpath : rootlibexecdir,
2226 install_dir : rootlibexecdir)
2227 public_programs += exe
2230 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2231 s_j_remote = executable('systemd-journal-remote',
2232 systemd_journal_remote_sources,
2233 include_directories : includes,
2234 link_with : [libshared,
2235 libsystemd_journal_remote],
2236 dependencies : [threads,
2241 install_rpath : rootlibexecdir,
2243 install_dir : rootlibexecdir)
2245 s_j_gatewayd = executable('systemd-journal-gatewayd',
2246 systemd_journal_gatewayd_sources,
2247 include_directories : includes,
2248 link_with : [libshared],
2249 dependencies : [threads,
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootlibexecdir)
2257 public_programs += [s_j_remote, s_j_gatewayd]
2260 if conf.get('ENABLE_COREDUMP') == 1
2261 executable('systemd-coredump',
2262 systemd_coredump_sources,
2263 include_directories : includes,
2264 link_with : [libshared],
2265 dependencies : [threads,
2270 install_rpath : rootlibexecdir,
2272 install_dir : rootlibexecdir)
2274 exe = executable('coredumpctl',
2275 coredumpctl_sources,
2276 include_directories : includes,
2277 link_with : [libshared],
2278 dependencies : [threads,
2281 install_rpath : rootlibexecdir,
2283 public_programs += exe
2286 if conf.get('ENABLE_BINFMT') == 1
2287 exe = executable('systemd-binfmt',
2288 'src/binfmt/binfmt.c',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 install_rpath : rootlibexecdir,
2293 install_dir : rootlibexecdir)
2294 public_programs += exe
2296 meson.add_install_script('sh', '-c',
2297 mkdir_p.format(binfmtdir))
2298 meson.add_install_script('sh', '-c',
2299 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2302 if conf.get('ENABLE_VCONSOLE') == 1
2303 executable('systemd-vconsole-setup',
2304 'src/vconsole/vconsole-setup.c',
2305 include_directories : includes,
2306 link_with : [libshared],
2307 install_rpath : rootlibexecdir,
2309 install_dir : rootlibexecdir)
2312 if conf.get('ENABLE_RANDOMSEED') == 1
2313 executable('systemd-random-seed',
2314 'src/random-seed/random-seed.c',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 install_rpath : rootlibexecdir,
2319 install_dir : rootlibexecdir)
2322 if conf.get('ENABLE_FIRSTBOOT') == 1
2323 executable('systemd-firstboot',
2324 'src/firstboot/firstboot.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 dependencies : [libcrypt],
2328 install_rpath : rootlibexecdir,
2330 install_dir : rootbindir)
2333 executable('systemd-remount-fs',
2334 'src/remount-fs/remount-fs.c',
2335 'src/core/mount-setup.c',
2336 'src/core/mount-setup.h',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2341 install_dir : rootlibexecdir)
2343 executable('systemd-machine-id-setup',
2344 'src/machine-id-setup/machine-id-setup-main.c',
2345 'src/core/machine-id-setup.c',
2346 'src/core/machine-id-setup.h',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 install_rpath : rootlibexecdir,
2351 install_dir : rootbindir)
2353 executable('systemd-fsck',
2355 include_directories : includes,
2356 link_with : [libshared],
2357 install_rpath : rootlibexecdir,
2359 install_dir : rootlibexecdir)
2361 executable('systemd-growfs',
2362 'src/partition/growfs.c',
2363 include_directories : includes,
2364 link_with : [libshared],
2365 dependencies : [libcryptsetup],
2366 install_rpath : rootlibexecdir,
2368 install_dir : rootlibexecdir)
2370 executable('systemd-makefs',
2371 'src/partition/makefs.c',
2372 include_directories : includes,
2373 link_with : [libshared],
2374 install_rpath : rootlibexecdir,
2376 install_dir : rootlibexecdir)
2378 executable('systemd-sleep',
2379 'src/sleep/sleep.c',
2380 include_directories : includes,
2381 link_with : [libshared],
2382 install_rpath : rootlibexecdir,
2384 install_dir : rootlibexecdir)
2386 exe = executable('systemd-sysctl',
2387 'src/sysctl/sysctl.c',
2388 include_directories : includes,
2389 link_with : [libshared],
2390 install_rpath : rootlibexecdir,
2392 install_dir : rootlibexecdir)
2393 public_programs += exe
2395 executable('systemd-ac-power',
2396 'src/ac-power/ac-power.c',
2397 include_directories : includes,
2398 link_with : [libshared],
2399 install_rpath : rootlibexecdir,
2401 install_dir : rootlibexecdir)
2403 exe = executable('systemd-detect-virt',
2404 'src/detect-virt/detect-virt.c',
2405 include_directories : includes,
2406 link_with : [libshared],
2407 install_rpath : rootlibexecdir,
2409 public_programs += exe
2411 exe = executable('systemd-delta',
2412 'src/delta/delta.c',
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2417 public_programs += exe
2419 exe = executable('systemd-escape',
2420 'src/escape/escape.c',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 install_rpath : rootlibexecdir,
2425 install_dir : rootbindir)
2426 public_programs += exe
2428 exe = executable('systemd-notify',
2429 'src/notify/notify.c',
2430 include_directories : includes,
2431 link_with : [libshared],
2432 install_rpath : rootlibexecdir,
2434 install_dir : rootbindir)
2435 public_programs += exe
2437 executable('systemd-volatile-root',
2438 'src/volatile-root/volatile-root.c',
2439 include_directories : includes,
2440 link_with : [libshared],
2441 install_rpath : rootlibexecdir,
2443 install_dir : rootlibexecdir)
2445 executable('systemd-cgroups-agent',
2446 'src/cgroups-agent/cgroups-agent.c',
2447 include_directories : includes,
2448 link_with : [libshared],
2449 install_rpath : rootlibexecdir,
2451 install_dir : rootlibexecdir)
2453 exe = executable('systemd-id128',
2454 'src/id128/id128.c',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2459 public_programs += exe
2461 exe = executable('systemd-path',
2463 include_directories : includes,
2464 link_with : [libshared],
2465 install_rpath : rootlibexecdir,
2467 public_programs += exe
2469 exe = executable('systemd-ask-password',
2470 'src/ask-password/ask-password.c',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2475 install_dir : rootbindir)
2476 public_programs += exe
2478 executable('systemd-reply-password',
2479 'src/reply-password/reply-password.c',
2480 include_directories : includes,
2481 link_with : [libshared],
2482 install_rpath : rootlibexecdir,
2484 install_dir : rootlibexecdir)
2486 exe = executable('systemd-tty-ask-password-agent',
2487 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2492 install_dir : rootbindir)
2493 public_programs += exe
2495 exe = executable('systemd-cgls',
2497 include_directories : includes,
2498 link_with : [libshared],
2499 install_rpath : rootlibexecdir,
2501 public_programs += exe
2503 exe = executable('systemd-cgtop',
2504 'src/cgtop/cgtop.c',
2505 include_directories : includes,
2506 link_with : [libshared],
2507 install_rpath : rootlibexecdir,
2509 public_programs += exe
2511 executable('systemd-initctl',
2512 'src/initctl/initctl.c',
2513 include_directories : includes,
2514 link_with : [libshared],
2515 install_rpath : rootlibexecdir,
2517 install_dir : rootlibexecdir)
2519 exe = executable('systemd-mount',
2520 'src/mount/mount-tool.c',
2521 include_directories : includes,
2522 link_with : [libshared],
2523 install_rpath : rootlibexecdir,
2525 public_programs += exe
2527 meson.add_install_script(meson_make_symlink,
2528 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2530 exe = executable('systemd-run',
2532 include_directories : includes,
2533 link_with : [libshared],
2534 install_rpath : rootlibexecdir,
2536 public_programs += exe
2538 exe = executable('systemd-stdio-bridge',
2539 'src/stdio-bridge/stdio-bridge.c',
2540 include_directories : includes,
2541 link_with : [libshared],
2542 install_rpath : rootlibexecdir,
2544 public_programs += exe
2546 exe = executable('busctl',
2547 'src/busctl/busctl.c',
2548 'src/busctl/busctl-introspect.c',
2549 'src/busctl/busctl-introspect.h',
2550 include_directories : includes,
2551 link_with : [libshared],
2552 install_rpath : rootlibexecdir,
2554 public_programs += exe
2556 if conf.get('ENABLE_SYSUSERS') == 1
2557 exe = executable('systemd-sysusers',
2558 'src/sysusers/sysusers.c',
2559 include_directories : includes,
2560 link_with : [libshared],
2561 install_rpath : rootlibexecdir,
2563 install_dir : rootbindir)
2564 public_programs += exe
2567 if conf.get('ENABLE_TMPFILES') == 1
2568 exe = executable('systemd-tmpfiles',
2569 'src/tmpfiles/tmpfiles.c',
2570 include_directories : includes,
2571 link_with : [libshared],
2572 dependencies : [libacl],
2573 install_rpath : rootlibexecdir,
2575 install_dir : rootbindir)
2576 public_programs += exe
2578 if want_tests != 'false'
2579 test('test-systemd-tmpfiles',
2580 test_systemd_tmpfiles_py,
2581 # https://github.com/mesonbuild/meson/issues/2681
2582 args : exe.full_path())
2586 if conf.get('ENABLE_HWDB') == 1
2587 exe = executable('systemd-hwdb',
2589 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2590 include_directories : includes,
2591 link_with : [libudev_static],
2592 install_rpath : udev_rpath,
2594 install_dir : rootbindir)
2595 public_programs += exe
2598 if conf.get('ENABLE_QUOTACHECK') == 1
2599 executable('systemd-quotacheck',
2600 'src/quotacheck/quotacheck.c',
2601 include_directories : includes,
2602 link_with : [libshared],
2603 install_rpath : rootlibexecdir,
2605 install_dir : rootlibexecdir)
2608 exe = executable('systemd-socket-proxyd',
2609 'src/socket-proxy/socket-proxyd.c',
2610 include_directories : includes,
2611 link_with : [libshared],
2612 dependencies : [threads],
2613 install_rpath : rootlibexecdir,
2615 install_dir : rootlibexecdir)
2616 public_programs += exe
2618 exe = executable('systemd-udevd',
2619 systemd_udevd_sources,
2620 include_directories : includes,
2621 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2622 link_with : [libudev_core,
2625 dependencies : [threads,
2630 install_rpath : udev_rpath,
2632 install_dir : rootlibexecdir)
2633 public_programs += exe
2635 exe = executable('udevadm',
2637 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2638 include_directories : includes,
2639 link_with : [libudev_core,
2642 dependencies : [threads,
2647 install_rpath : udev_rpath,
2649 install_dir : rootbindir)
2650 public_programs += exe
2652 executable('systemd-shutdown',
2653 systemd_shutdown_sources,
2654 include_directories : includes,
2655 link_with : [libshared],
2656 dependencies : [libmount],
2657 install_rpath : rootlibexecdir,
2659 install_dir : rootlibexecdir)
2661 executable('systemd-update-done',
2662 'src/update-done/update-done.c',
2663 include_directories : includes,
2664 link_with : [libshared],
2665 install_rpath : rootlibexecdir,
2667 install_dir : rootlibexecdir)
2669 executable('systemd-update-utmp',
2670 'src/update-utmp/update-utmp.c',
2671 include_directories : includes,
2672 link_with : [libshared],
2673 dependencies : [libaudit],
2674 install_rpath : rootlibexecdir,
2676 install_dir : rootlibexecdir)
2678 if conf.get('HAVE_KMOD') == 1
2679 executable('systemd-modules-load',
2680 'src/modules-load/modules-load.c',
2681 include_directories : includes,
2682 link_with : [libshared],
2683 dependencies : [libkmod],
2684 install_rpath : rootlibexecdir,
2686 install_dir : rootlibexecdir)
2688 meson.add_install_script('sh', '-c',
2689 mkdir_p.format(modulesloaddir))
2690 meson.add_install_script('sh', '-c',
2691 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2694 exe = executable('systemd-nspawn',
2695 systemd_nspawn_sources,
2696 'src/core/mount-setup.c', # FIXME: use a variable?
2697 'src/core/mount-setup.h',
2698 'src/core/loopback-setup.c',
2699 'src/core/loopback-setup.h',
2700 include_directories : includes,
2701 link_with : [libnspawn_core,
2703 dependencies : [libblkid],
2704 install_rpath : rootlibexecdir,
2706 public_programs += exe
2708 if conf.get('ENABLE_NETWORKD') == 1
2709 executable('systemd-networkd',
2710 systemd_networkd_sources,
2711 include_directories : includes,
2712 link_with : [libnetworkd_core,
2716 dependencies : [threads],
2717 install_rpath : rootlibexecdir,
2719 install_dir : rootlibexecdir)
2721 executable('systemd-networkd-wait-online',
2722 systemd_networkd_wait_online_sources,
2723 include_directories : includes,
2724 link_with : [libnetworkd_core,
2726 install_rpath : rootlibexecdir,
2728 install_dir : rootlibexecdir)
2730 exe = executable('networkctl',
2732 include_directories : includes,
2733 link_with : [libsystemd_network,
2735 install_rpath : rootlibexecdir,
2737 install_dir : rootbindir)
2738 public_programs += exe
2741 executable('systemd-sulogin-shell',
2742 ['src/sulogin-shell/sulogin-shell.c'],
2743 include_directories : includes,
2744 link_with : [libshared],
2745 install_rpath : rootlibexecdir,
2747 install_dir : rootlibexecdir)
2749 ############################################################
2752 'systemd-runtest.env',
2753 output : 'systemd-runtest.env',
2754 command : ['sh', '-c', '{ ' +
2755 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2756 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2758 build_by_default : true)
2760 foreach tuple : tests
2762 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2763 dependencies = tuple[2]
2764 condition = tuple.length() >= 4 ? tuple[3] : ''
2765 type = tuple.length() >= 5 ? tuple[4] : ''
2766 defs = tuple.length() >= 6 ? tuple[5] : []
2767 incs = tuple.length() >= 7 ? tuple[6] : includes
2770 name = sources[0].split('/')[-1].split('.')[0]
2771 if type.startswith('timeout=')
2772 timeout = type.split('=')[1].to_int()
2776 if condition == '' or conf.get(condition) == 1
2780 include_directories : incs,
2781 link_with : link_with,
2782 dependencies : dependencies,
2784 build_by_default : want_tests != 'false',
2785 install_rpath : rootlibexecdir,
2786 install : install_tests,
2787 install_dir : join_paths(testsdir, type))
2790 message('@0@ is a manual test'.format(name))
2791 elif type == 'unsafe' and want_tests != 'unsafe'
2792 message('@0@ is an unsafe test'.format(name))
2793 elif want_tests != 'false'
2799 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2804 'test-libsystemd-sym',
2805 test_libsystemd_sym_c,
2806 include_directories : includes,
2807 link_with : [libsystemd],
2808 build_by_default : want_tests != 'false',
2809 install : install_tests,
2810 install_dir : testsdir)
2811 if want_tests != 'false'
2812 test('test-libsystemd-sym', exe)
2816 'test-libsystemd-static-sym',
2817 test_libsystemd_sym_c,
2818 include_directories : includes,
2819 link_with : [install_libsystemd_static],
2820 dependencies : [threads], # threads is already included in dependencies on the library,
2821 # but does not seem to get propagated. Add here as a work-around.
2822 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2823 install : install_tests and static_libsystemd_pic,
2824 install_dir : testsdir)
2825 if want_tests != 'false' and static_libsystemd_pic
2826 test('test-libsystemd-static-sym', exe)
2832 include_directories : includes,
2833 c_args : '-Wno-deprecated-declarations',
2834 link_with : [libudev],
2835 build_by_default : want_tests != 'false',
2836 install : install_tests,
2837 install_dir : testsdir)
2838 if want_tests != 'false'
2839 test('test-libudev-sym', exe)
2843 'test-libudev-static-sym',
2845 include_directories : includes,
2846 c_args : '-Wno-deprecated-declarations',
2847 link_with : [install_libudev_static],
2848 build_by_default : want_tests != 'false' and static_libudev_pic,
2849 install : install_tests and static_libudev_pic,
2850 install_dir : testsdir)
2851 if want_tests != 'false' and static_libudev_pic
2852 test('test-libudev-static-sym', exe)
2855 ############################################################
2859 if get_option('tests') != 'false'
2860 foreach tuple : fuzzers
2862 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2863 dependencies = tuple[2]
2864 defs = tuple.length() >= 4 ? tuple[3] : []
2865 incs = tuple.length() >= 5 ? tuple[4] : includes
2868 dependencies += fuzzing_engine
2870 sources += 'src/fuzz/fuzz-main.c'
2873 name = sources[0].split('/')[-1].split('.')[0]
2875 fuzzer_exes += executable(
2878 include_directories : [incs, include_directories('src/fuzz')],
2879 link_with : link_with,
2880 dependencies : dependencies,
2886 run_target('fuzzers',
2887 depends : fuzzer_exes,
2890 ############################################################
2892 make_directive_index_py = find_program('tools/make-directive-index.py')
2893 make_man_index_py = find_program('tools/make-man-index.py')
2894 xml_helper_py = find_program('tools/xml_helper.py')
2895 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2899 subdir('sysusers.d')
2900 subdir('tmpfiles.d')
2905 subdir('shell-completion/bash')
2906 subdir('shell-completion/zsh')
2907 subdir('docs/sysvinit')
2908 subdir('docs/var-log')
2910 install_subdir('factory/etc',
2911 install_dir : factorydir)
2913 install_data('xorg/50-systemd-user.sh',
2914 install_dir : xinitrcdir)
2915 install_data('modprobe.d/systemd.conf',
2916 install_dir : modprobedir)
2917 install_data('LICENSE.GPL2',
2921 'docs/CODING_STYLE.md',
2922 'docs/DISTRO_PORTING.md',
2923 'docs/ENVIRONMENT.md',
2925 'docs/TRANSIENT-SETTINGS.md',
2926 'docs/TRANSLATORS.md',
2927 'docs/UIDS-GIDS.md',
2928 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2929 install_dir : docdir)
2931 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2932 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2934 ############################################################
2936 meson_check_help = find_program('tools/meson-check-help.sh')
2938 foreach exec : public_programs
2939 name = exec.full_path().split('/')[-1]
2940 if want_tests != 'false'
2941 test('check-help-' + name,
2943 args : exec.full_path())
2947 ############################################################
2949 # Enable tests for all supported sanitizers
2950 foreach tuple : sanitizers
2951 sanitizer = tuple[0]
2954 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2956 foreach p : fuzz_regression_tests
2957 b = p.split('/')[-2]
2958 c = p.split('/')[-1]
2960 name = '@0@:@1@'.format(b, sanitizer)
2963 if want_tests == 'false'
2964 message('Not compiling @0@ because tests is set to false'.format(name))
2966 exe = custom_target(
2970 command : [env, 'ln', '-fs',
2971 join_paths(build.full_path(), b),
2973 build_by_default : true)
2975 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2980 if want_tests != 'false' and slow_tests
2981 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2983 args : [exe.full_path(),
2984 join_paths(meson.source_root(), p)])
2991 ############################################################
2994 all_files = run_command(
2996 ['--git-dir=@0@/.git'.format(meson.source_root()),
2999 all_files = files(all_files.stdout().split())
3004 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3007 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3011 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3014 command : [meson_git_contrib_sh])
3018 git_head = run_command(
3020 ['--git-dir=@0@/.git'.format(meson.source_root()),
3021 'rev-parse', 'HEAD']).stdout().strip()
3022 git_head_short = run_command(
3024 ['--git-dir=@0@/.git'.format(meson.source_root()),
3025 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3029 command : ['git', 'archive',
3030 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3032 '--prefix', 'systemd-@0@/'.format(git_head),
3036 ############################################################
3038 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3041 depends : [man, libsystemd, libudev],
3042 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3046 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
3048 ############################################################
3051 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3053 'split /usr: @0@'.format(split_usr),
3054 'split bin-sbin: @0@'.format(split_bin),
3055 'prefix directory: @0@'.format(prefixdir),
3056 'rootprefix directory: @0@'.format(rootprefixdir),
3057 'sysconf directory: @0@'.format(sysconfdir),
3058 'include directory: @0@'.format(includedir),
3059 'lib directory: @0@'.format(libdir),
3060 'rootlib directory: @0@'.format(rootlibdir),
3061 'SysV init scripts: @0@'.format(sysvinit_path),
3062 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3063 'PAM modules directory: @0@'.format(pamlibdir),
3064 'PAM configuration directory: @0@'.format(pamconfdir),
3065 'RPM macros directory: @0@'.format(rpmmacrosdir),
3066 'modprobe.d directory: @0@'.format(modprobedir),
3067 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3068 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3069 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3070 'bash completions directory: @0@'.format(bashcompletiondir),
3071 'zsh completions directory: @0@'.format(zshcompletiondir),
3072 'extra start script: @0@'.format(get_option('rc-local')),
3073 'extra stop script: @0@'.format(get_option('halt-local')),
3074 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3075 get_option('debug-tty')),
3076 'TTY GID: @0@'.format(tty_gid),
3077 'users GID: @0@'.format(substs.get('USERS_GID')),
3078 'maximum system UID: @0@'.format(system_uid_max),
3079 'maximum system GID: @0@'.format(system_gid_max),
3080 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3081 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3082 'minimum container UID base: @0@'.format(container_uid_base_min),
3083 'maximum container UID base: @0@'.format(container_uid_base_max),
3084 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3085 'render group access mode: @0@'.format(get_option('group-render-mode')),
3086 'certificate root directory: @0@'.format(get_option('certificate-root')),
3087 'support URL: @0@'.format(support_url),
3088 'nobody user name: @0@'.format(nobody_user),
3089 'nobody group name: @0@'.format(nobody_group),
3090 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3091 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3093 'default DNSSEC mode: @0@'.format(default_dnssec),
3094 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3095 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3096 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3098 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3099 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3101 'default DNS servers: @0@'.format(alt_dns_servers),
3102 'default NTP servers: @0@'.format(alt_ntp_servers)]
3104 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3105 '@@0@'.format(time_epoch)).stdout().strip()
3107 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3110 'static libsystemd: @0@'.format(static_libsystemd),
3111 'static libudev: @0@'.format(static_libudev)]
3114 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3115 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3116 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3118 if conf.get('ENABLE_EFI') == 1
3119 status += 'efi arch: @0@'.format(efi_arch)
3123 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3124 'EFI CC @0@'.format(efi_cc),
3125 'EFI lib directory: @0@'.format(efi_libdir),
3126 'EFI lds directory: @0@'.format(efi_ldsdir),
3127 'EFI include directory: @0@'.format(efi_incdir)]
3179 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3180 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3183 ['legacy pkla', install_polkit_pkla],
3185 ['gnu-efi', have_gnu_efi],
3198 ['man pages', want_man],
3199 ['html pages', want_html],
3200 ['man page indices', want_man and have_lxml],
3205 ['adm group', get_option('adm-group')],
3206 ['wheel group', get_option('wheel-group')],
3209 ['debug mmap cache'],
3212 ['valgrind', conf.get('VALGRIND') == 1],
3213 ['trace logging', conf.get('LOG_TRACE') == 1],
3214 ['link-udev-shared', get_option('link-udev-shared')],
3215 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3218 if tuple.length() >= 2
3221 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3222 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3223 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3234 'enabled features: @0@'.format(', '.join(found)),
3236 'disabled features: @0@'.format(', '.join(missing)),
3238 message('\n '.join(status))
3240 if rootprefixdir != rootprefix_default
3242 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3243 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3244 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))