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_PAD', 'linux/fib_rules.h'],
460 ['FRA_L3MDEV', 'linux/fib_rules.h'],
461 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
462 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
463 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
464 ['FOU_CMD_GET', 'linux/fou.h'],
465 ['IFA_FLAGS', 'linux/if_addr.h'],
466 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
467 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
468 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
469 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
470 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
471 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
472 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
473 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
474 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
475 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
476 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
477 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
478 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
479 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
480 ['IFLA_PAD', 'linux/if_link.h'],
481 ['IFLA_XDP', 'linux/if_link.h'],
482 ['IFLA_EVENT', 'linux/if_link.h'],
483 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
484 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
485 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
486 ['IFLA_MAX_MTU', 'linux/if_link.h'],
487 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
488 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
489 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
490 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
491 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
492 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
493 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
494 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
495 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
496 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
497 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
498 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
499 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
500 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
501 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
502 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
503 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
504 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
505 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
506 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
507 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
508 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
509 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
510 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
511 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
512 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
513 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
514 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
515 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
516 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
517 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
518 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
519 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
520 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
521 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
522 # if_tunnel.h is buggy and cannot be included on its own
523 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
524 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
525 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
526 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
527 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
528 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
529 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
530 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
531 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
532 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
533 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
535 prefix = decl.length() > 2 ? decl[2] : ''
536 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
537 conf.set10('HAVE_' + decl[0], have)
540 foreach ident : ['secure_getenv', '__secure_getenv']
541 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
545 ['memfd_create', '''#include <sys/mman.h>'''],
546 ['gettid', '''#include <sys/types.h>
547 #include <unistd.h>'''],
548 ['pivot_root', '''#include <stdlib.h>
549 #include <unistd.h>'''], # no known header declares pivot_root
550 ['name_to_handle_at', '''#include <sys/types.h>
551 #include <sys/stat.h>
552 #include <fcntl.h>'''],
553 ['setns', '''#include <sched.h>'''],
554 ['renameat2', '''#include <stdio.h>
555 #include <fcntl.h>'''],
556 ['kcmp', '''#include <linux/kcmp.h>'''],
557 ['keyctl', '''#include <sys/types.h>
558 #include <keyutils.h>'''],
559 ['copy_file_range', '''#include <sys/syscall.h>
560 #include <unistd.h>'''],
561 ['bpf', '''#include <sys/syscall.h>
562 #include <unistd.h>'''],
563 ['statx', '''#include <sys/types.h>
564 #include <sys/stat.h>
565 #include <unistd.h>'''],
566 ['explicit_bzero' , '''#include <string.h>'''],
567 ['reallocarray', '''#include <malloc.h>'''],
570 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
571 conf.set10('HAVE_' + ident[0].to_upper(), have)
574 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
575 conf.set10('USE_SYS_RANDOM_H', true)
576 conf.set10('HAVE_GETRANDOM', true)
578 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
579 conf.set10('USE_SYS_RANDOM_H', false)
580 conf.set10('HAVE_GETRANDOM', have)
583 #####################################################################
585 sed = find_program('sed')
586 awk = find_program('awk')
587 m4 = find_program('m4')
588 stat = find_program('stat')
589 git = find_program('git', required : false)
590 env = find_program('env')
591 perl = find_program('perl', required : false)
593 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
594 mkdir_p = 'mkdir -p $DESTDIR/@0@'
595 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
596 splash_bmp = files('test/splash.bmp')
598 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
599 # /usr/sbin, /sbin, and fall back to the default from middle column.
600 progs = [['quotaon', '/usr/sbin/quotaon' ],
601 ['quotacheck', '/usr/sbin/quotacheck' ],
602 ['kmod', '/usr/bin/kmod' ],
603 ['kexec', '/usr/sbin/kexec' ],
604 ['sulogin', '/usr/sbin/sulogin' ],
605 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
606 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
607 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
608 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
611 path = get_option(prog[0] + '-path')
613 message('Using @1@ for @0@'.format(prog[0], path))
615 exe = find_program(prog[0],
616 '/usr/sbin/' + prog[0],
619 path = exe.found() ? exe.path() : prog[1]
621 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
622 conf.set_quoted(name, path)
623 substs.set(name, path)
626 conf.set_quoted('TELINIT', get_option('telinit-path'))
628 if run_command('ln', '--relative', '--help').returncode() != 0
629 error('ln does not support --relative (added in coreutils 8.16)')
632 ############################################################
634 gperf = find_program('gperf')
636 gperf_test_format = '''
638 const char * in_word_set(const char *, @0@);
641 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
642 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
643 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
644 if cc.compiles(gperf_test)
645 gperf_len_type = 'size_t'
647 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
648 if cc.compiles(gperf_test)
649 gperf_len_type = 'unsigned'
651 error('unable to determine gperf len type')
654 message('gperf len type is @0@'.format(gperf_len_type))
655 conf.set('GPERF_LEN_TYPE', gperf_len_type,
656 description : 'The type of gperf "len" parameter')
658 ############################################################
660 if not cc.has_header('sys/capability.h')
661 error('POSIX caps headers not found')
663 foreach header : ['crypt.h',
667 'linux/vm_sockets.h',
670 'valgrind/memcheck.h',
671 'valgrind/valgrind.h',
674 conf.set10('HAVE_' + header.underscorify().to_upper(),
675 cc.has_header(header))
678 ############################################################
680 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
681 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
682 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
684 default_hierarchy = get_option('default-hierarchy')
685 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
686 description : 'default cgroup hierarchy as string')
687 if default_hierarchy == 'legacy'
688 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
689 elif default_hierarchy == 'hybrid'
690 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
692 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
695 time_epoch = get_option('time-epoch')
698 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
700 conf.set('TIME_EPOCH', time_epoch)
702 system_uid_max = get_option('system-uid-max')
703 if system_uid_max == -1
704 system_uid_max = run_command(
706 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
707 '/etc/login.defs').stdout().strip()
708 if system_uid_max == ''
711 system_uid_max = system_uid_max.to_int()
714 conf.set('SYSTEM_UID_MAX', system_uid_max)
715 substs.set('systemuidmax', system_uid_max)
717 system_gid_max = get_option('system-gid-max')
718 if system_gid_max == -1
719 system_gid_max = run_command(
721 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
722 '/etc/login.defs').stdout().strip()
723 if system_gid_max == ''
726 system_gid_max = system_gid_max.to_int()
729 conf.set('SYSTEM_GID_MAX', system_gid_max)
730 substs.set('systemgidmax', system_gid_max)
732 dynamic_uid_min = get_option('dynamic-uid-min')
733 dynamic_uid_max = get_option('dynamic-uid-max')
734 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
735 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
736 substs.set('dynamicuidmin', dynamic_uid_min)
737 substs.set('dynamicuidmax', dynamic_uid_max)
739 container_uid_base_min = get_option('container-uid-base-min')
740 container_uid_base_max = get_option('container-uid-base-max')
741 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
742 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
743 substs.set('containeruidbasemin', container_uid_base_min)
744 substs.set('containeruidbasemax', container_uid_base_max)
746 nobody_user = get_option('nobody-user')
747 nobody_group = get_option('nobody-group')
749 if not meson.is_cross_build()
750 getent_result = run_command('getent', 'passwd', '65534')
751 if getent_result.returncode() == 0
752 name = getent_result.stdout().split(':')[0]
753 if name != nobody_user
755 '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) +
756 'Your build will result in an user table setup that is incompatible with the local system.')
759 id_result = run_command('id', '-u', nobody_user)
760 if id_result.returncode() == 0
761 id = id_result.stdout().to_int()
764 '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) +
765 'Your build will result in an user table setup that is incompatible with the local system.')
769 getent_result = run_command('getent', 'group', '65534')
770 if getent_result.returncode() == 0
771 name = getent_result.stdout().split(':')[0]
772 if name != nobody_group
774 '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) +
775 'Your build will result in an group table setup that is incompatible with the local system.')
778 id_result = run_command('id', '-g', nobody_group)
779 if id_result.returncode() == 0
780 id = id_result.stdout().to_int()
783 '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) +
784 'Your build will result in an group table setup that is incompatible with the local system.')
788 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
790 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
791 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
794 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
795 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
796 substs.set('NOBODY_USER_NAME', nobody_user)
797 substs.set('NOBODY_GROUP_NAME', nobody_group)
799 tty_gid = get_option('tty-gid')
800 conf.set('TTY_GID', tty_gid)
801 substs.set('TTY_GID', tty_gid)
803 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
804 users_gid = get_option('users-gid')
805 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
807 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
808 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
810 dev_kvm_mode = get_option('dev-kvm-mode')
811 substs.set('DEV_KVM_MODE', dev_kvm_mode)
812 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
813 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
815 kill_user_processes = get_option('default-kill-user-processes')
816 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
817 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
818 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
820 dns_servers = get_option('dns-servers')
821 conf.set_quoted('DNS_SERVERS', dns_servers)
822 substs.set('DNS_SERVERS', dns_servers)
824 ntp_servers = get_option('ntp-servers')
825 conf.set_quoted('NTP_SERVERS', ntp_servers)
826 substs.set('NTP_SERVERS', ntp_servers)
828 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
830 substs.set('SUSHELL', get_option('debug-shell'))
831 substs.set('DEBUGTTY', get_option('debug-tty'))
833 enable_debug_hashmap = false
834 enable_debug_mmap_cache = false
835 enable_debug_siphash = false
836 enable_debug_udev = false
837 foreach name : get_option('debug-extra')
839 enable_debug_hashmap = true
840 elif name == 'mmap-cache'
841 enable_debug_mmap_cache = true
842 elif name == 'siphash'
843 enable_debug_siphash = true
845 enable_debug_udev = true
847 message('unknown debug option "@0@", ignoring'.format(name))
850 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
851 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
852 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
853 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
855 conf.set10('VALGRIND', get_option('valgrind'))
856 conf.set10('LOG_TRACE', get_option('log-trace'))
858 #####################################################################
860 threads = dependency('threads')
861 librt = cc.find_library('rt')
862 libm = cc.find_library('m')
863 libdl = cc.find_library('dl')
864 libcrypt = cc.find_library('crypt')
866 libcap = dependency('libcap', required : false)
867 if not libcap.found()
868 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
869 libcap = cc.find_library('cap')
872 libmount = dependency('mount',
873 version : fuzzer_build ? '>= 0' : '>= 2.30')
875 want_seccomp = get_option('seccomp')
876 if want_seccomp != 'false' and not fuzzer_build
877 libseccomp = dependency('libseccomp',
878 version : '>= 2.3.1',
879 required : want_seccomp == 'true')
880 have = libseccomp.found()
885 conf.set10('HAVE_SECCOMP', have)
887 want_selinux = get_option('selinux')
888 if want_selinux != 'false' and not fuzzer_build
889 libselinux = dependency('libselinux',
890 version : '>= 2.1.9',
891 required : want_selinux == 'true')
892 have = libselinux.found()
897 conf.set10('HAVE_SELINUX', have)
899 want_apparmor = get_option('apparmor')
900 if want_apparmor != 'false' and not fuzzer_build
901 libapparmor = dependency('libapparmor',
902 required : want_apparmor == 'true')
903 have = libapparmor.found()
908 conf.set10('HAVE_APPARMOR', have)
910 smack_run_label = get_option('smack-run-label')
911 if smack_run_label != ''
912 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
915 want_polkit = get_option('polkit')
916 install_polkit = false
917 install_polkit_pkla = false
918 if want_polkit != 'false' and not fuzzer_build
919 install_polkit = true
921 libpolkit = dependency('polkit-gobject-1',
923 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
924 message('Old polkit detected, will install pkla files')
925 install_polkit_pkla = true
928 conf.set10('ENABLE_POLKIT', install_polkit)
930 want_acl = get_option('acl')
931 if want_acl != 'false' and not fuzzer_build
932 libacl = cc.find_library('acl', required : want_acl == 'true')
933 have = libacl.found()
938 conf.set10('HAVE_ACL', have)
940 want_audit = get_option('audit')
941 if want_audit != 'false' and not fuzzer_build
942 libaudit = dependency('audit', required : want_audit == 'true')
943 have = libaudit.found()
948 conf.set10('HAVE_AUDIT', have)
950 want_blkid = get_option('blkid')
951 if want_blkid != 'false' and not fuzzer_build
952 libblkid = dependency('blkid', required : want_blkid == 'true')
953 have = libblkid.found()
958 conf.set10('HAVE_BLKID', have)
960 want_kmod = get_option('kmod')
961 if want_kmod != 'false' and not fuzzer_build
962 libkmod = dependency('libkmod',
964 required : want_kmod == 'true')
965 have = libkmod.found()
970 conf.set10('HAVE_KMOD', have)
972 want_pam = get_option('pam')
973 if want_pam != 'false' and not fuzzer_build
974 libpam = cc.find_library('pam', required : want_pam == 'true')
975 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
976 have = libpam.found() and libpam_misc.found()
982 conf.set10('HAVE_PAM', have)
984 want_microhttpd = get_option('microhttpd')
985 if want_microhttpd != 'false' and not fuzzer_build
986 libmicrohttpd = dependency('libmicrohttpd',
987 version : '>= 0.9.33',
988 required : want_microhttpd == 'true')
989 have = libmicrohttpd.found()
994 conf.set10('HAVE_MICROHTTPD', have)
996 want_libcryptsetup = get_option('libcryptsetup')
997 if want_libcryptsetup != 'false' and not fuzzer_build
998 libcryptsetup = dependency('libcryptsetup',
999 version : '>= 1.6.0',
1000 required : want_libcryptsetup == 'true')
1001 have = libcryptsetup.found()
1002 have_sector = cc.has_member(
1003 'struct crypt_params_plain',
1005 prefix : '#include <libcryptsetup.h>')
1011 conf.set10('HAVE_LIBCRYPTSETUP', have)
1012 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1014 want_libcurl = get_option('libcurl')
1015 if want_libcurl != 'false' and not fuzzer_build
1016 libcurl = dependency('libcurl',
1017 version : '>= 7.32.0',
1018 required : want_libcurl == 'true')
1019 have = libcurl.found()
1024 conf.set10('HAVE_LIBCURL', have)
1026 want_libidn = get_option('libidn')
1027 want_libidn2 = get_option('libidn2')
1028 if want_libidn == 'true' and want_libidn2 == 'true'
1029 error('libidn and libidn2 cannot be requested simultaneously')
1032 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1033 libidn = dependency('libidn',
1034 required : want_libidn == 'true')
1035 have = libidn.found()
1040 conf.set10('HAVE_LIBIDN', have)
1041 if not have and want_libidn2 != 'false' and not fuzzer_build
1042 # libidn is used for both libidn and libidn2 objects
1043 libidn = dependency('libidn2',
1044 required : want_libidn2 == 'true')
1045 have = libidn.found()
1049 conf.set10('HAVE_LIBIDN2', have)
1051 want_libiptc = get_option('libiptc')
1052 if want_libiptc != 'false' and not fuzzer_build
1053 libiptc = dependency('libiptc',
1054 required : want_libiptc == 'true')
1055 have = libiptc.found()
1060 conf.set10('HAVE_LIBIPTC', have)
1062 want_qrencode = get_option('qrencode')
1063 if want_qrencode != 'false' and not fuzzer_build
1064 libqrencode = dependency('libqrencode',
1065 required : want_qrencode == 'true')
1066 have = libqrencode.found()
1071 conf.set10('HAVE_QRENCODE', have)
1073 want_gcrypt = get_option('gcrypt')
1074 if want_gcrypt != 'false' and not fuzzer_build
1075 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1076 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1077 have = libgcrypt.found() and libgpg_error.found()
1082 # link to neither of the libs if one is not found
1086 conf.set10('HAVE_GCRYPT', have)
1088 want_gnutls = get_option('gnutls')
1089 if want_gnutls != 'false' and not fuzzer_build
1090 libgnutls = dependency('gnutls',
1091 version : '>= 3.1.4',
1092 required : want_gnutls == 'true')
1093 have = libgnutls.found()
1098 conf.set10('HAVE_GNUTLS', have)
1100 want_openssl = get_option('openssl')
1101 if want_openssl != 'false' and not fuzzer_build
1102 libopenssl = dependency('openssl',
1103 version : '>= 1.1.0',
1104 required : want_openssl == 'true')
1105 have = libopenssl.found()
1110 conf.set10('HAVE_OPENSSL', have)
1112 want_elfutils = get_option('elfutils')
1113 if want_elfutils != 'false' and not fuzzer_build
1114 libdw = dependency('libdw',
1115 required : want_elfutils == 'true')
1116 have = libdw.found()
1121 conf.set10('HAVE_ELFUTILS', have)
1123 want_zlib = get_option('zlib')
1124 if want_zlib != 'false' and not fuzzer_build
1125 libz = dependency('zlib',
1126 required : want_zlib == 'true')
1132 conf.set10('HAVE_ZLIB', have)
1134 want_bzip2 = get_option('bzip2')
1135 if want_bzip2 != 'false' and not fuzzer_build
1136 libbzip2 = cc.find_library('bz2',
1137 required : want_bzip2 == 'true')
1138 have = libbzip2.found()
1143 conf.set10('HAVE_BZIP2', have)
1145 want_xz = get_option('xz')
1146 if want_xz != 'false' and not fuzzer_build
1147 libxz = dependency('liblzma',
1148 required : want_xz == 'true')
1149 have = libxz.found()
1154 conf.set10('HAVE_XZ', have)
1156 want_lz4 = get_option('lz4')
1157 if want_lz4 != 'false' and not fuzzer_build
1158 liblz4 = dependency('liblz4',
1159 version : '>= 1.3.0',
1160 required : want_lz4 == 'true')
1161 have = liblz4.found()
1166 conf.set10('HAVE_LZ4', have)
1168 want_xkbcommon = get_option('xkbcommon')
1169 if want_xkbcommon != 'false' and not fuzzer_build
1170 libxkbcommon = dependency('xkbcommon',
1171 version : '>= 0.3.0',
1172 required : want_xkbcommon == 'true')
1173 have = libxkbcommon.found()
1178 conf.set10('HAVE_XKBCOMMON', have)
1180 want_pcre2 = get_option('pcre2')
1181 if want_pcre2 != 'false'
1182 libpcre2 = dependency('libpcre2-8',
1183 required : want_pcre2 == 'true')
1184 have = libpcre2.found()
1189 conf.set10('HAVE_PCRE2', have)
1191 want_glib = get_option('glib')
1192 if want_glib != 'false' and not fuzzer_build
1193 libglib = dependency('glib-2.0',
1194 version : '>= 2.22.0',
1195 required : want_glib == 'true')
1196 libgobject = dependency('gobject-2.0',
1197 version : '>= 2.22.0',
1198 required : want_glib == 'true')
1199 libgio = dependency('gio-2.0',
1200 required : want_glib == 'true')
1201 have = libglib.found() and libgobject.found() and libgio.found()
1208 conf.set10('HAVE_GLIB', have)
1210 want_dbus = get_option('dbus')
1211 if want_dbus != 'false' and not fuzzer_build
1212 libdbus = dependency('dbus-1',
1213 version : '>= 1.3.2',
1214 required : want_dbus == 'true')
1215 have = libdbus.found()
1220 conf.set10('HAVE_DBUS', have)
1222 default_dnssec = get_option('default-dnssec')
1224 default_dnssec = 'no'
1226 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1227 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1228 default_dnssec = 'no'
1230 conf.set('DEFAULT_DNSSEC_MODE',
1231 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1232 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1234 dns_over_tls = get_option('dns-over-tls')
1235 if dns_over_tls != 'false'
1236 if dns_over_tls == 'openssl'
1239 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1240 if dns_over_tls == 'gnutls' and not have_gnutls
1241 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1244 if dns_over_tls == 'gnutls' or have_gnutls
1245 have_openssl = false
1247 have_openssl = conf.get('HAVE_OPENSSL') == 1
1248 if dns_over_tls != 'auto' and not have_openssl
1249 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1250 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1253 have = have_gnutls or have_openssl
1257 have_openssl = false
1259 conf.set10('ENABLE_DNS_OVER_TLS', have)
1260 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1261 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1263 default_dns_over_tls = get_option('default-dns-over-tls')
1265 default_dns_over_tls = 'no'
1267 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1268 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1269 default_dns_over_tls = 'no'
1271 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1272 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1273 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1275 want_importd = get_option('importd')
1276 if want_importd != 'false'
1277 have = (conf.get('HAVE_LIBCURL') == 1 and
1278 conf.get('HAVE_ZLIB') == 1 and
1279 conf.get('HAVE_XZ') == 1 and
1280 conf.get('HAVE_GCRYPT') == 1)
1281 if want_importd == 'true' and not have
1282 error('importd support was requested, but dependencies are not available')
1287 conf.set10('ENABLE_IMPORTD', have)
1289 want_remote = get_option('remote')
1290 if want_remote != 'false'
1291 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1292 conf.get('HAVE_LIBCURL') == 1]
1293 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1294 # it's possible to build one without the other. Complain only if
1295 # support was explictly requested. The auxiliary files like sysusers
1296 # config should be installed when any of the programs are built.
1297 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1298 error('remote support was requested, but dependencies are not available')
1300 have = have_deps[0] or have_deps[1]
1304 conf.set10('ENABLE_REMOTE', have)
1306 foreach term : ['utmp',
1338 have = get_option(term)
1339 name = 'ENABLE_' + term.underscorify().to_upper()
1340 conf.set10(name, have)
1343 foreach tuple : [['nss-mymachines', 'machined'],
1344 ['nss-resolve', 'resolve']]
1345 want = get_option(tuple[0])
1347 have = get_option(tuple[1])
1348 if want == 'true' and not have
1349 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1354 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1355 conf.set10(name, have)
1359 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1360 'ENABLE_NSS_MYMACHINES',
1361 'ENABLE_NSS_RESOLVE',
1362 'ENABLE_NSS_SYSTEMD']
1363 if conf.get(term) == 1
1367 conf.set10('ENABLE_NSS', enable_nss)
1369 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1374 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1376 #####################################################################
1378 if get_option('efi')
1379 efi_arch = host_machine.cpu_family()
1381 if efi_arch == 'x86'
1382 EFI_MACHINE_TYPE_NAME = 'ia32'
1383 gnu_efi_arch = 'ia32'
1384 elif efi_arch == 'x86_64'
1385 EFI_MACHINE_TYPE_NAME = 'x64'
1386 gnu_efi_arch = 'x86_64'
1387 elif efi_arch == 'arm'
1388 EFI_MACHINE_TYPE_NAME = 'arm'
1389 gnu_efi_arch = 'arm'
1390 elif efi_arch == 'aarch64'
1391 EFI_MACHINE_TYPE_NAME = 'aa64'
1392 gnu_efi_arch = 'aarch64'
1394 EFI_MACHINE_TYPE_NAME = ''
1399 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1401 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1405 conf.set10('ENABLE_EFI', have)
1407 #####################################################################
1409 config_h = configure_file(
1410 output : 'config.h',
1411 configuration : conf)
1413 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1415 includes = include_directories('src/basic',
1419 'src/journal-remote',
1423 'src/time-wait-sync',
1428 'src/libsystemd/sd-bus',
1429 'src/libsystemd/sd-device',
1430 'src/libsystemd/sd-event',
1431 'src/libsystemd/sd-hwdb',
1432 'src/libsystemd/sd-id128',
1433 'src/libsystemd/sd-netlink',
1434 'src/libsystemd/sd-network',
1435 'src/libsystemd-network',
1438 add_project_arguments('-include', 'config.h', language : 'c')
1440 generate_gperfs = find_program('tools/generate-gperfs.py')
1444 subdir('src/systemd')
1446 subdir('src/libsystemd')
1447 subdir('src/libsystemd-network')
1448 subdir('src/journal')
1451 libjournal_core = static_library(
1453 libjournal_core_sources,
1455 include_directories : includes,
1458 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1459 libsystemd = shared_library(
1462 version : libsystemd_version,
1463 include_directories : includes,
1464 link_args : ['-shared',
1465 '-Wl,--version-script=' + libsystemd_sym_path],
1466 link_with : [libbasic,
1468 link_whole : [libsystemd_static,
1470 dependencies : [threads,
1474 link_depends : libsystemd_sym,
1476 install_dir : rootlibdir)
1478 static_libsystemd = get_option('static-libsystemd')
1479 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1481 install_libsystemd_static = static_library(
1484 journal_client_sources,
1486 basic_gcrypt_sources,
1488 include_directories : includes,
1489 build_by_default : static_libsystemd != 'false',
1490 install : static_libsystemd != 'false',
1491 install_dir : rootlibdir,
1492 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1493 dependencies : [threads,
1502 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1504 ############################################################
1506 # binaries that have --help and are intended for use by humans,
1507 # usually, but not always, installed in /bin.
1508 public_programs = []
1510 subdir('src/libudev')
1511 subdir('src/shared')
1514 subdir('src/network')
1516 subdir('src/analyze')
1517 subdir('src/journal-remote')
1518 subdir('src/coredump')
1519 subdir('src/hostname')
1520 subdir('src/import')
1521 subdir('src/kernel-install')
1522 subdir('src/locale')
1523 subdir('src/machine')
1524 subdir('src/portable')
1525 subdir('src/nspawn')
1526 subdir('src/resolve')
1527 subdir('src/timedate')
1528 subdir('src/timesync')
1529 subdir('src/vconsole')
1530 subdir('src/boot/efi')
1537 ############################################################
1539 # only static linking apart from libdl, to make sure that the
1540 # module is linked to all libraries that it uses.
1541 test_dlopen = executable(
1545 include_directories : includes,
1546 link_with : [libbasic],
1547 dependencies : [libdl],
1548 build_by_default : want_tests != 'false')
1550 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1551 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1552 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1553 ['resolve', 'ENABLE_NSS_RESOLVE']]
1555 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1559 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1560 version_script_arg = join_paths(meson.source_root(), sym)
1562 nss = shared_library(
1564 'src/nss-@0@/nss-@0@.c'.format(module),
1567 include_directories : includes,
1568 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1569 link_args : ['-Wl,-z,nodelete',
1571 '-Wl,--version-script=' + version_script_arg,
1573 link_with : [libsystemd_static,
1575 dependencies : [threads,
1579 install_dir : rootlibdir)
1581 # We cannot use shared_module because it does not support version suffix.
1582 # Unfortunately shared_library insists on creating the symlink…
1583 meson.add_install_script('sh', '-c',
1584 'rm $DESTDIR@0@/libnss_@1@.so'
1585 .format(rootlibdir, module))
1587 if want_tests != 'false'
1588 test('dlopen-nss_' + module,
1590 # path to dlopen must include a slash
1591 args : nss.full_path())
1596 ############################################################
1598 executable('systemd',
1600 include_directories : includes,
1601 link_with : [libcore,
1603 dependencies : [threads,
1609 install_rpath : rootlibexecdir,
1611 install_dir : rootlibexecdir)
1613 meson.add_install_script(meson_make_symlink,
1614 join_paths(rootlibexecdir, 'systemd'),
1615 join_paths(rootsbindir, 'init'))
1617 exe = executable('systemd-analyze',
1618 systemd_analyze_sources,
1619 include_directories : includes,
1620 link_with : [libcore,
1622 dependencies : [threads,
1628 install_rpath : rootlibexecdir,
1630 public_programs += exe
1632 executable('systemd-journald',
1633 systemd_journald_sources,
1634 include_directories : includes,
1635 link_with : [libjournal_core,
1637 dependencies : [threads,
1641 install_rpath : rootlibexecdir,
1643 install_dir : rootlibexecdir)
1645 exe = executable('systemd-cat',
1646 systemd_cat_sources,
1647 include_directories : includes,
1648 link_with : [libjournal_core,
1650 dependencies : [threads],
1651 install_rpath : rootlibexecdir,
1653 public_programs += exe
1655 exe = executable('journalctl',
1657 include_directories : includes,
1658 link_with : [libshared],
1659 dependencies : [threads,
1664 install_rpath : rootlibexecdir,
1666 install_dir : rootbindir)
1667 public_programs += exe
1669 executable('systemd-getty-generator',
1670 'src/getty-generator/getty-generator.c',
1671 include_directories : includes,
1672 link_with : [libshared],
1673 install_rpath : rootlibexecdir,
1675 install_dir : systemgeneratordir)
1677 executable('systemd-debug-generator',
1678 'src/debug-generator/debug-generator.c',
1679 include_directories : includes,
1680 link_with : [libshared],
1681 install_rpath : rootlibexecdir,
1683 install_dir : systemgeneratordir)
1685 executable('systemd-run-generator',
1686 'src/run-generator/run-generator.c',
1687 include_directories : includes,
1688 link_with : [libshared],
1689 install_rpath : rootlibexecdir,
1691 install_dir : systemgeneratordir)
1693 executable('systemd-fstab-generator',
1694 'src/fstab-generator/fstab-generator.c',
1695 'src/core/mount-setup.c',
1696 include_directories : includes,
1697 link_with : [libshared],
1698 install_rpath : rootlibexecdir,
1700 install_dir : systemgeneratordir)
1702 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1703 executable('30-systemd-environment-d-generator',
1704 'src/environment-d-generator/environment-d-generator.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 install_rpath : rootlibexecdir,
1709 install_dir : userenvgeneratordir)
1711 meson.add_install_script(meson_make_symlink,
1712 join_paths(sysconfdir, 'environment'),
1713 join_paths(environmentdir, '99-environment.conf'))
1716 if conf.get('ENABLE_HIBERNATE') == 1
1717 executable('systemd-hibernate-resume-generator',
1718 'src/hibernate-resume/hibernate-resume-generator.c',
1719 include_directories : includes,
1720 link_with : [libshared],
1721 install_rpath : rootlibexecdir,
1723 install_dir : systemgeneratordir)
1725 executable('systemd-hibernate-resume',
1726 'src/hibernate-resume/hibernate-resume.c',
1727 include_directories : includes,
1728 link_with : [libshared],
1729 install_rpath : rootlibexecdir,
1731 install_dir : rootlibexecdir)
1734 if conf.get('HAVE_BLKID') == 1
1735 executable('systemd-gpt-auto-generator',
1736 'src/gpt-auto-generator/gpt-auto-generator.c',
1737 'src/shared/blkid-util.h',
1738 include_directories : includes,
1739 link_with : [libshared],
1740 dependencies : libblkid,
1741 install_rpath : rootlibexecdir,
1743 install_dir : systemgeneratordir)
1745 exe = executable('systemd-dissect',
1746 'src/dissect/dissect.c',
1747 include_directories : includes,
1748 link_with : [libshared],
1749 install_rpath : rootlibexecdir,
1751 install_dir : rootlibexecdir)
1752 public_programs += exe
1755 if conf.get('ENABLE_RESOLVE') == 1
1756 executable('systemd-resolved',
1757 systemd_resolved_sources,
1758 include_directories : includes,
1759 link_with : [libshared,
1761 libsystemd_resolve_core],
1762 dependencies : systemd_resolved_dependencies,
1763 install_rpath : rootlibexecdir,
1765 install_dir : rootlibexecdir)
1767 exe = executable('resolvectl',
1769 include_directories : includes,
1770 link_with : [libshared,
1772 libsystemd_resolve_core],
1773 dependencies : [threads,
1777 install_rpath : rootlibexecdir,
1779 public_programs += exe
1781 meson.add_install_script(meson_make_symlink,
1782 join_paths(bindir, 'resolvectl'),
1783 join_paths(rootsbindir, 'resolvconf'))
1785 meson.add_install_script(meson_make_symlink,
1786 join_paths(bindir, 'resolvectl'),
1787 join_paths(bindir, 'systemd-resolve'))
1790 if conf.get('ENABLE_LOGIND') == 1
1791 executable('systemd-logind',
1792 systemd_logind_sources,
1793 include_directories : includes,
1794 link_with : [liblogind_core,
1796 dependencies : [threads,
1798 install_rpath : rootlibexecdir,
1800 install_dir : rootlibexecdir)
1802 exe = executable('loginctl',
1804 include_directories : includes,
1805 link_with : [libshared],
1806 dependencies : [threads,
1809 install_rpath : rootlibexecdir,
1811 install_dir : rootbindir)
1812 public_programs += exe
1814 exe = executable('systemd-inhibit',
1815 'src/login/inhibit.c',
1816 include_directories : includes,
1817 link_with : [libshared],
1818 install_rpath : rootlibexecdir,
1820 install_dir : rootbindir)
1821 public_programs += exe
1823 if conf.get('HAVE_PAM') == 1
1824 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1825 pam_systemd = shared_library(
1829 include_directories : includes,
1830 link_args : ['-shared',
1831 '-Wl,--version-script=' + version_script_arg],
1832 link_with : [libsystemd_static,
1834 dependencies : [threads,
1837 link_depends : pam_systemd_sym,
1839 install_dir : pamlibdir)
1841 if want_tests != 'false'
1842 test('dlopen-pam_systemd',
1844 # path to dlopen must include a slash
1845 args : pam_systemd.full_path())
1849 executable('systemd-user-runtime-dir',
1850 user_runtime_dir_sources,
1851 include_directories : includes,
1852 link_with : [libshared],
1853 install_rpath : rootlibexecdir,
1855 install_dir : rootlibexecdir)
1858 if conf.get('HAVE_PAM') == 1
1859 executable('systemd-user-sessions',
1860 'src/user-sessions/user-sessions.c',
1861 include_directories : includes,
1862 link_with : [libshared],
1863 install_rpath : rootlibexecdir,
1865 install_dir : rootlibexecdir)
1868 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1869 exe = executable('bootctl',
1870 'src/boot/bootctl.c',
1871 include_directories : includes,
1872 link_with : [libshared],
1873 dependencies : [libblkid],
1874 install_rpath : rootlibexecdir,
1876 public_programs += exe
1878 executable('systemd-bless-boot',
1879 'src/boot/bless-boot.c',
1880 include_directories : includes,
1881 link_with : [libshared],
1882 dependencies : [libblkid],
1883 install_rpath : rootlibexecdir,
1885 install_dir : rootlibexecdir)
1887 executable('systemd-bless-boot-generator',
1888 'src/boot/bless-boot-generator.c',
1889 include_directories : includes,
1890 link_with : [libshared],
1891 install_rpath : rootlibexecdir,
1893 install_dir : systemgeneratordir)
1896 executable('systemd-boot-check-no-failures',
1897 'src/boot/boot-check-no-failures.c',
1898 include_directories : includes,
1899 link_with : [libshared],
1900 dependencies : [libblkid],
1901 install_rpath : rootlibexecdir,
1903 install_dir : rootlibexecdir)
1905 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1906 include_directories : includes,
1907 link_with : [libshared],
1908 dependencies : [threads],
1909 install_rpath : rootlibexecdir,
1911 public_programs += exe
1914 if get_option('link-systemctl-shared')
1915 systemctl_link_with = [libshared]
1917 systemctl_link_with = [libsystemd_static,
1923 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1924 include_directories : includes,
1925 link_with : systemctl_link_with,
1926 dependencies : [threads,
1931 install_rpath : rootlibexecdir,
1933 install_dir : rootbindir)
1934 public_programs += exe
1936 if conf.get('ENABLE_PORTABLED') == 1
1937 executable('systemd-portabled',
1938 systemd_portabled_sources,
1939 include_directories : includes,
1940 link_with : [libshared],
1941 dependencies : [threads],
1942 install_rpath : rootlibexecdir,
1944 install_dir : rootlibexecdir)
1946 exe = executable('portablectl', 'src/portable/portablectl.c',
1947 include_directories : includes,
1948 link_with : [libshared],
1949 dependencies : [threads],
1950 install_rpath : rootlibexecdir,
1952 install_dir : rootbindir)
1953 public_programs += exe
1956 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1957 meson.add_install_script(meson_make_symlink,
1958 join_paths(rootbindir, 'systemctl'),
1959 join_paths(rootsbindir, alias))
1962 if conf.get('ENABLE_BACKLIGHT') == 1
1963 executable('systemd-backlight',
1964 'src/backlight/backlight.c',
1965 include_directories : includes,
1966 link_with : [libshared],
1967 install_rpath : rootlibexecdir,
1969 install_dir : rootlibexecdir)
1972 if conf.get('ENABLE_RFKILL') == 1
1973 executable('systemd-rfkill',
1974 'src/rfkill/rfkill.c',
1975 include_directories : includes,
1976 link_with : [libshared],
1977 install_rpath : rootlibexecdir,
1979 install_dir : rootlibexecdir)
1982 executable('systemd-system-update-generator',
1983 'src/system-update-generator/system-update-generator.c',
1984 include_directories : includes,
1985 link_with : [libshared],
1986 install_rpath : rootlibexecdir,
1988 install_dir : systemgeneratordir)
1990 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1991 executable('systemd-cryptsetup',
1992 'src/cryptsetup/cryptsetup.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 dependencies : [libcryptsetup],
1996 install_rpath : rootlibexecdir,
1998 install_dir : rootlibexecdir)
2000 executable('systemd-cryptsetup-generator',
2001 'src/cryptsetup/cryptsetup-generator.c',
2002 include_directories : includes,
2003 link_with : [libshared],
2004 dependencies : [libcryptsetup],
2005 install_rpath : rootlibexecdir,
2007 install_dir : systemgeneratordir)
2009 executable('systemd-veritysetup',
2010 'src/veritysetup/veritysetup.c',
2011 include_directories : includes,
2012 link_with : [libshared],
2013 dependencies : [libcryptsetup],
2014 install_rpath : rootlibexecdir,
2016 install_dir : rootlibexecdir)
2018 executable('systemd-veritysetup-generator',
2019 'src/veritysetup/veritysetup-generator.c',
2020 include_directories : includes,
2021 link_with : [libshared],
2022 dependencies : [libcryptsetup],
2023 install_rpath : rootlibexecdir,
2025 install_dir : systemgeneratordir)
2028 if conf.get('HAVE_SYSV_COMPAT') == 1
2029 executable('systemd-sysv-generator',
2030 'src/sysv-generator/sysv-generator.c',
2031 include_directories : includes,
2032 link_with : [libshared],
2033 install_rpath : rootlibexecdir,
2035 install_dir : systemgeneratordir)
2037 executable('systemd-rc-local-generator',
2038 'src/rc-local-generator/rc-local-generator.c',
2039 include_directories : includes,
2040 link_with : [libshared],
2041 install_rpath : rootlibexecdir,
2043 install_dir : systemgeneratordir)
2046 if conf.get('ENABLE_HOSTNAMED') == 1
2047 executable('systemd-hostnamed',
2048 'src/hostname/hostnamed.c',
2049 include_directories : includes,
2050 link_with : [libshared],
2051 install_rpath : rootlibexecdir,
2053 install_dir : rootlibexecdir)
2055 exe = executable('hostnamectl',
2056 'src/hostname/hostnamectl.c',
2057 include_directories : includes,
2058 link_with : [libshared],
2059 install_rpath : rootlibexecdir,
2061 public_programs += exe
2064 if conf.get('ENABLE_LOCALED') == 1
2065 if conf.get('HAVE_XKBCOMMON') == 1
2066 # logind will load libxkbcommon.so dynamically on its own
2072 executable('systemd-localed',
2073 systemd_localed_sources,
2074 include_directories : includes,
2075 link_with : [libshared],
2076 dependencies : deps,
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootlibexecdir)
2081 exe = executable('localectl',
2083 include_directories : includes,
2084 link_with : [libshared],
2085 install_rpath : rootlibexecdir,
2087 public_programs += exe
2090 if conf.get('ENABLE_TIMEDATED') == 1
2091 executable('systemd-timedated',
2092 'src/timedate/timedated.c',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 install_rpath : rootlibexecdir,
2097 install_dir : rootlibexecdir)
2100 if conf.get('ENABLE_TIMEDATECTL') == 1
2101 exe = executable('timedatectl',
2102 'src/timedate/timedatectl.c',
2103 include_directories : includes,
2104 install_rpath : rootlibexecdir,
2105 link_with : [libshared],
2106 dependencies : [libm],
2108 public_programs += exe
2111 if conf.get('ENABLE_TIMESYNCD') == 1
2112 executable('systemd-timesyncd',
2113 systemd_timesyncd_sources,
2114 include_directories : includes,
2115 link_with : [libshared],
2116 dependencies : [threads,
2118 install_rpath : rootlibexecdir,
2120 install_dir : rootlibexecdir)
2122 executable('systemd-time-wait-sync',
2123 'src/time-wait-sync/time-wait-sync.c',
2124 include_directories : includes,
2125 link_with : [libshared],
2126 install_rpath : rootlibexecdir,
2128 install_dir : rootlibexecdir)
2131 if conf.get('ENABLE_MACHINED') == 1
2132 executable('systemd-machined',
2133 systemd_machined_sources,
2134 include_directories : includes,
2135 link_with : [libmachine_core,
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2141 exe = executable('machinectl',
2142 'src/machine/machinectl.c',
2143 include_directories : includes,
2144 link_with : [libshared],
2145 dependencies : [threads,
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootbindir)
2151 public_programs += exe
2154 if conf.get('ENABLE_IMPORTD') == 1
2155 executable('systemd-importd',
2156 systemd_importd_sources,
2157 include_directories : includes,
2158 link_with : [libshared],
2159 dependencies : [threads],
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootlibexecdir)
2164 systemd_pull = executable('systemd-pull',
2165 systemd_pull_sources,
2166 include_directories : includes,
2167 link_with : [libshared],
2168 dependencies : [libcurl,
2173 install_rpath : rootlibexecdir,
2175 install_dir : rootlibexecdir)
2177 systemd_import = executable('systemd-import',
2178 systemd_import_sources,
2179 include_directories : includes,
2180 link_with : [libshared],
2181 dependencies : [libcurl,
2185 install_rpath : rootlibexecdir,
2187 install_dir : rootlibexecdir)
2189 systemd_import_fs = executable('systemd-import-fs',
2190 systemd_import_fs_sources,
2191 include_directories : includes,
2192 link_with : [libshared],
2193 install_rpath : rootlibexecdir,
2195 install_dir : rootlibexecdir)
2197 systemd_export = executable('systemd-export',
2198 systemd_export_sources,
2199 include_directories : includes,
2200 link_with : [libshared],
2201 dependencies : [libcurl,
2205 install_rpath : rootlibexecdir,
2207 install_dir : rootlibexecdir)
2209 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2212 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2213 exe = executable('systemd-journal-upload',
2214 systemd_journal_upload_sources,
2215 include_directories : includes,
2216 link_with : [libshared],
2217 dependencies : [threads,
2222 install_rpath : rootlibexecdir,
2224 install_dir : rootlibexecdir)
2225 public_programs += exe
2228 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2229 s_j_remote = executable('systemd-journal-remote',
2230 systemd_journal_remote_sources,
2231 include_directories : includes,
2232 link_with : [libshared,
2233 libsystemd_journal_remote],
2234 dependencies : [threads,
2239 install_rpath : rootlibexecdir,
2241 install_dir : rootlibexecdir)
2243 s_j_gatewayd = executable('systemd-journal-gatewayd',
2244 systemd_journal_gatewayd_sources,
2245 include_directories : includes,
2246 link_with : [libshared],
2247 dependencies : [threads,
2252 install_rpath : rootlibexecdir,
2254 install_dir : rootlibexecdir)
2255 public_programs += [s_j_remote, s_j_gatewayd]
2258 if conf.get('ENABLE_COREDUMP') == 1
2259 executable('systemd-coredump',
2260 systemd_coredump_sources,
2261 include_directories : includes,
2262 link_with : [libshared],
2263 dependencies : [threads,
2268 install_rpath : rootlibexecdir,
2270 install_dir : rootlibexecdir)
2272 exe = executable('coredumpctl',
2273 coredumpctl_sources,
2274 include_directories : includes,
2275 link_with : [libshared],
2276 dependencies : [threads,
2279 install_rpath : rootlibexecdir,
2281 public_programs += exe
2284 if conf.get('ENABLE_BINFMT') == 1
2285 exe = executable('systemd-binfmt',
2286 'src/binfmt/binfmt.c',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2291 install_dir : rootlibexecdir)
2292 public_programs += exe
2294 meson.add_install_script('sh', '-c',
2295 mkdir_p.format(binfmtdir))
2296 meson.add_install_script('sh', '-c',
2297 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2300 if conf.get('ENABLE_VCONSOLE') == 1
2301 executable('systemd-vconsole-setup',
2302 'src/vconsole/vconsole-setup.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 install_rpath : rootlibexecdir,
2307 install_dir : rootlibexecdir)
2310 if conf.get('ENABLE_RANDOMSEED') == 1
2311 executable('systemd-random-seed',
2312 'src/random-seed/random-seed.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 install_rpath : rootlibexecdir,
2317 install_dir : rootlibexecdir)
2320 if conf.get('ENABLE_FIRSTBOOT') == 1
2321 executable('systemd-firstboot',
2322 'src/firstboot/firstboot.c',
2323 include_directories : includes,
2324 link_with : [libshared],
2325 dependencies : [libcrypt],
2326 install_rpath : rootlibexecdir,
2328 install_dir : rootbindir)
2331 executable('systemd-remount-fs',
2332 'src/remount-fs/remount-fs.c',
2333 'src/core/mount-setup.c',
2334 'src/core/mount-setup.h',
2335 include_directories : includes,
2336 link_with : [libshared],
2337 install_rpath : rootlibexecdir,
2339 install_dir : rootlibexecdir)
2341 executable('systemd-machine-id-setup',
2342 'src/machine-id-setup/machine-id-setup-main.c',
2343 'src/core/machine-id-setup.c',
2344 'src/core/machine-id-setup.h',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2349 install_dir : rootbindir)
2351 executable('systemd-fsck',
2353 include_directories : includes,
2354 link_with : [libshared],
2355 install_rpath : rootlibexecdir,
2357 install_dir : rootlibexecdir)
2359 executable('systemd-growfs',
2360 'src/partition/growfs.c',
2361 include_directories : includes,
2362 link_with : [libshared],
2363 dependencies : [libcryptsetup],
2364 install_rpath : rootlibexecdir,
2366 install_dir : rootlibexecdir)
2368 executable('systemd-makefs',
2369 'src/partition/makefs.c',
2370 include_directories : includes,
2371 link_with : [libshared],
2372 install_rpath : rootlibexecdir,
2374 install_dir : rootlibexecdir)
2376 executable('systemd-sleep',
2377 'src/sleep/sleep.c',
2378 include_directories : includes,
2379 link_with : [libshared],
2380 install_rpath : rootlibexecdir,
2382 install_dir : rootlibexecdir)
2384 exe = executable('systemd-sysctl',
2385 'src/sysctl/sysctl.c',
2386 include_directories : includes,
2387 link_with : [libshared],
2388 install_rpath : rootlibexecdir,
2390 install_dir : rootlibexecdir)
2391 public_programs += exe
2393 executable('systemd-ac-power',
2394 'src/ac-power/ac-power.c',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2399 install_dir : rootlibexecdir)
2401 exe = executable('systemd-detect-virt',
2402 'src/detect-virt/detect-virt.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 install_rpath : rootlibexecdir,
2407 public_programs += exe
2409 exe = executable('systemd-delta',
2410 'src/delta/delta.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 install_rpath : rootlibexecdir,
2415 public_programs += exe
2417 exe = executable('systemd-escape',
2418 'src/escape/escape.c',
2419 include_directories : includes,
2420 link_with : [libshared],
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootbindir)
2424 public_programs += exe
2426 exe = executable('systemd-notify',
2427 'src/notify/notify.c',
2428 include_directories : includes,
2429 link_with : [libshared],
2430 install_rpath : rootlibexecdir,
2432 install_dir : rootbindir)
2433 public_programs += exe
2435 executable('systemd-volatile-root',
2436 'src/volatile-root/volatile-root.c',
2437 include_directories : includes,
2438 link_with : [libshared],
2439 install_rpath : rootlibexecdir,
2441 install_dir : rootlibexecdir)
2443 executable('systemd-cgroups-agent',
2444 'src/cgroups-agent/cgroups-agent.c',
2445 include_directories : includes,
2446 link_with : [libshared],
2447 install_rpath : rootlibexecdir,
2449 install_dir : rootlibexecdir)
2451 exe = executable('systemd-id128',
2452 'src/id128/id128.c',
2453 include_directories : includes,
2454 link_with : [libshared],
2455 install_rpath : rootlibexecdir,
2457 public_programs += exe
2459 exe = executable('systemd-path',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2465 public_programs += exe
2467 exe = executable('systemd-ask-password',
2468 'src/ask-password/ask-password.c',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 install_rpath : rootlibexecdir,
2473 install_dir : rootbindir)
2474 public_programs += exe
2476 executable('systemd-reply-password',
2477 'src/reply-password/reply-password.c',
2478 include_directories : includes,
2479 link_with : [libshared],
2480 install_rpath : rootlibexecdir,
2482 install_dir : rootlibexecdir)
2484 exe = executable('systemd-tty-ask-password-agent',
2485 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2486 include_directories : includes,
2487 link_with : [libshared],
2488 install_rpath : rootlibexecdir,
2490 install_dir : rootbindir)
2491 public_programs += exe
2493 exe = executable('systemd-cgls',
2495 include_directories : includes,
2496 link_with : [libshared],
2497 install_rpath : rootlibexecdir,
2499 public_programs += exe
2501 exe = executable('systemd-cgtop',
2502 'src/cgtop/cgtop.c',
2503 include_directories : includes,
2504 link_with : [libshared],
2505 install_rpath : rootlibexecdir,
2507 public_programs += exe
2509 executable('systemd-initctl',
2510 'src/initctl/initctl.c',
2511 include_directories : includes,
2512 link_with : [libshared],
2513 install_rpath : rootlibexecdir,
2515 install_dir : rootlibexecdir)
2517 exe = executable('systemd-mount',
2518 'src/mount/mount-tool.c',
2519 include_directories : includes,
2520 link_with : [libshared],
2521 install_rpath : rootlibexecdir,
2523 public_programs += exe
2525 meson.add_install_script(meson_make_symlink,
2526 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2528 exe = executable('systemd-run',
2530 include_directories : includes,
2531 link_with : [libshared],
2532 install_rpath : rootlibexecdir,
2534 public_programs += exe
2536 exe = executable('systemd-stdio-bridge',
2537 'src/stdio-bridge/stdio-bridge.c',
2538 include_directories : includes,
2539 link_with : [libshared],
2540 install_rpath : rootlibexecdir,
2542 public_programs += exe
2544 exe = executable('busctl',
2545 'src/busctl/busctl.c',
2546 'src/busctl/busctl-introspect.c',
2547 'src/busctl/busctl-introspect.h',
2548 include_directories : includes,
2549 link_with : [libshared],
2550 install_rpath : rootlibexecdir,
2552 public_programs += exe
2554 if conf.get('ENABLE_SYSUSERS') == 1
2555 exe = executable('systemd-sysusers',
2556 'src/sysusers/sysusers.c',
2557 include_directories : includes,
2558 link_with : [libshared],
2559 install_rpath : rootlibexecdir,
2561 install_dir : rootbindir)
2562 public_programs += exe
2565 if conf.get('ENABLE_TMPFILES') == 1
2566 exe = executable('systemd-tmpfiles',
2567 'src/tmpfiles/tmpfiles.c',
2568 include_directories : includes,
2569 link_with : [libshared],
2570 dependencies : [libacl],
2571 install_rpath : rootlibexecdir,
2573 install_dir : rootbindir)
2574 public_programs += exe
2576 if want_tests != 'false'
2577 test('test-systemd-tmpfiles',
2578 test_systemd_tmpfiles_py,
2579 # https://github.com/mesonbuild/meson/issues/2681
2580 args : exe.full_path())
2584 if conf.get('ENABLE_HWDB') == 1
2585 exe = executable('systemd-hwdb',
2587 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2588 include_directories : includes,
2589 link_with : [libudev_static],
2590 install_rpath : udev_rpath,
2592 install_dir : rootbindir)
2593 public_programs += exe
2596 if conf.get('ENABLE_QUOTACHECK') == 1
2597 executable('systemd-quotacheck',
2598 'src/quotacheck/quotacheck.c',
2599 include_directories : includes,
2600 link_with : [libshared],
2601 install_rpath : rootlibexecdir,
2603 install_dir : rootlibexecdir)
2606 exe = executable('systemd-socket-proxyd',
2607 'src/socket-proxy/socket-proxyd.c',
2608 include_directories : includes,
2609 link_with : [libshared],
2610 dependencies : [threads],
2611 install_rpath : rootlibexecdir,
2613 install_dir : rootlibexecdir)
2614 public_programs += exe
2616 exe = executable('systemd-udevd',
2617 systemd_udevd_sources,
2618 include_directories : includes,
2619 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2620 link_with : [libudev_core,
2623 dependencies : [threads,
2628 install_rpath : udev_rpath,
2630 install_dir : rootlibexecdir)
2631 public_programs += exe
2633 exe = executable('udevadm',
2635 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2636 include_directories : includes,
2637 link_with : [libudev_core,
2640 dependencies : [threads,
2645 install_rpath : udev_rpath,
2647 install_dir : rootbindir)
2648 public_programs += exe
2650 executable('systemd-shutdown',
2651 systemd_shutdown_sources,
2652 include_directories : includes,
2653 link_with : [libshared],
2654 dependencies : [libmount],
2655 install_rpath : rootlibexecdir,
2657 install_dir : rootlibexecdir)
2659 executable('systemd-update-done',
2660 'src/update-done/update-done.c',
2661 include_directories : includes,
2662 link_with : [libshared],
2663 install_rpath : rootlibexecdir,
2665 install_dir : rootlibexecdir)
2667 executable('systemd-update-utmp',
2668 'src/update-utmp/update-utmp.c',
2669 include_directories : includes,
2670 link_with : [libshared],
2671 dependencies : [libaudit],
2672 install_rpath : rootlibexecdir,
2674 install_dir : rootlibexecdir)
2676 if conf.get('HAVE_KMOD') == 1
2677 executable('systemd-modules-load',
2678 'src/modules-load/modules-load.c',
2679 include_directories : includes,
2680 link_with : [libshared],
2681 dependencies : [libkmod],
2682 install_rpath : rootlibexecdir,
2684 install_dir : rootlibexecdir)
2686 meson.add_install_script('sh', '-c',
2687 mkdir_p.format(modulesloaddir))
2688 meson.add_install_script('sh', '-c',
2689 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2692 exe = executable('systemd-nspawn',
2693 systemd_nspawn_sources,
2694 'src/core/mount-setup.c', # FIXME: use a variable?
2695 'src/core/mount-setup.h',
2696 'src/core/loopback-setup.c',
2697 'src/core/loopback-setup.h',
2698 include_directories : includes,
2699 link_with : [libnspawn_core,
2701 dependencies : [libblkid],
2702 install_rpath : rootlibexecdir,
2704 public_programs += exe
2706 if conf.get('ENABLE_NETWORKD') == 1
2707 executable('systemd-networkd',
2708 systemd_networkd_sources,
2709 include_directories : includes,
2710 link_with : [libnetworkd_core,
2714 dependencies : [threads],
2715 install_rpath : rootlibexecdir,
2717 install_dir : rootlibexecdir)
2719 executable('systemd-networkd-wait-online',
2720 systemd_networkd_wait_online_sources,
2721 include_directories : includes,
2722 link_with : [libnetworkd_core,
2724 install_rpath : rootlibexecdir,
2726 install_dir : rootlibexecdir)
2728 exe = executable('networkctl',
2730 include_directories : includes,
2731 link_with : [libsystemd_network,
2733 install_rpath : rootlibexecdir,
2735 install_dir : rootbindir)
2736 public_programs += exe
2739 executable('systemd-sulogin-shell',
2740 ['src/sulogin-shell/sulogin-shell.c'],
2741 include_directories : includes,
2742 link_with : [libshared],
2743 install_rpath : rootlibexecdir,
2745 install_dir : rootlibexecdir)
2747 ############################################################
2750 'systemd-runtest.env',
2751 output : 'systemd-runtest.env',
2752 command : ['sh', '-c', '{ ' +
2753 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2754 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2756 build_by_default : true)
2758 foreach tuple : tests
2760 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2761 dependencies = tuple[2]
2762 condition = tuple.length() >= 4 ? tuple[3] : ''
2763 type = tuple.length() >= 5 ? tuple[4] : ''
2764 defs = tuple.length() >= 6 ? tuple[5] : []
2765 incs = tuple.length() >= 7 ? tuple[6] : includes
2768 name = sources[0].split('/')[-1].split('.')[0]
2769 if type.startswith('timeout=')
2770 timeout = type.split('=')[1].to_int()
2774 if condition == '' or conf.get(condition) == 1
2778 include_directories : incs,
2779 link_with : link_with,
2780 dependencies : dependencies,
2782 build_by_default : want_tests != 'false',
2783 install_rpath : rootlibexecdir,
2784 install : install_tests,
2785 install_dir : join_paths(testsdir, type))
2788 message('@0@ is a manual test'.format(name))
2789 elif type == 'unsafe' and want_tests != 'unsafe'
2790 message('@0@ is an unsafe test'.format(name))
2791 elif want_tests != 'false'
2797 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2802 'test-libsystemd-sym',
2803 test_libsystemd_sym_c,
2804 include_directories : includes,
2805 link_with : [libsystemd],
2806 build_by_default : want_tests != 'false',
2807 install : install_tests,
2808 install_dir : testsdir)
2809 if want_tests != 'false'
2810 test('test-libsystemd-sym', exe)
2814 'test-libsystemd-static-sym',
2815 test_libsystemd_sym_c,
2816 include_directories : includes,
2817 link_with : [install_libsystemd_static],
2818 dependencies : [threads], # threads is already included in dependencies on the library,
2819 # but does not seem to get propagated. Add here as a work-around.
2820 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2821 install : install_tests and static_libsystemd_pic,
2822 install_dir : testsdir)
2823 if want_tests != 'false' and static_libsystemd_pic
2824 test('test-libsystemd-static-sym', exe)
2830 include_directories : includes,
2831 c_args : '-Wno-deprecated-declarations',
2832 link_with : [libudev],
2833 build_by_default : want_tests != 'false',
2834 install : install_tests,
2835 install_dir : testsdir)
2836 if want_tests != 'false'
2837 test('test-libudev-sym', exe)
2841 'test-libudev-static-sym',
2843 include_directories : includes,
2844 c_args : '-Wno-deprecated-declarations',
2845 link_with : [install_libudev_static],
2846 build_by_default : want_tests != 'false' and static_libudev_pic,
2847 install : install_tests and static_libudev_pic,
2848 install_dir : testsdir)
2849 if want_tests != 'false' and static_libudev_pic
2850 test('test-libudev-static-sym', exe)
2853 ############################################################
2857 if get_option('tests') != 'false'
2858 foreach tuple : fuzzers
2860 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2861 dependencies = tuple[2]
2862 defs = tuple.length() >= 4 ? tuple[3] : []
2863 incs = tuple.length() >= 5 ? tuple[4] : includes
2866 dependencies += fuzzing_engine
2868 sources += 'src/fuzz/fuzz-main.c'
2871 name = sources[0].split('/')[-1].split('.')[0]
2873 fuzzer_exes += executable(
2876 include_directories : [incs, include_directories('src/fuzz')],
2877 link_with : link_with,
2878 dependencies : dependencies,
2884 run_target('fuzzers',
2885 depends : fuzzer_exes,
2888 ############################################################
2890 make_directive_index_py = find_program('tools/make-directive-index.py')
2891 make_man_index_py = find_program('tools/make-man-index.py')
2892 xml_helper_py = find_program('tools/xml_helper.py')
2893 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2897 subdir('sysusers.d')
2898 subdir('tmpfiles.d')
2903 subdir('shell-completion/bash')
2904 subdir('shell-completion/zsh')
2905 subdir('docs/sysvinit')
2906 subdir('docs/var-log')
2908 install_subdir('factory/etc',
2909 install_dir : factorydir)
2911 install_data('xorg/50-systemd-user.sh',
2912 install_dir : xinitrcdir)
2913 install_data('modprobe.d/systemd.conf',
2914 install_dir : modprobedir)
2915 install_data('LICENSE.GPL2',
2919 'docs/CODING_STYLE.md',
2920 'docs/DISTRO_PORTING.md',
2921 'docs/ENVIRONMENT.md',
2923 'docs/TRANSIENT-SETTINGS.md',
2924 'docs/TRANSLATORS.md',
2925 'docs/UIDS-GIDS.md',
2926 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2927 install_dir : docdir)
2929 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2930 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2932 ############################################################
2934 meson_check_help = find_program('tools/meson-check-help.sh')
2936 foreach exec : public_programs
2937 name = exec.full_path().split('/')[-1]
2938 if want_tests != 'false'
2939 test('check-help-' + name,
2941 args : exec.full_path())
2945 ############################################################
2947 # Enable tests for all supported sanitizers
2948 foreach tuple : sanitizers
2949 sanitizer = tuple[0]
2952 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2954 foreach p : fuzz_regression_tests
2955 b = p.split('/')[-2]
2956 c = p.split('/')[-1]
2958 name = '@0@:@1@'.format(b, sanitizer)
2961 if want_tests == 'false'
2962 message('Not compiling @0@ because tests is set to false'.format(name))
2964 exe = custom_target(
2968 command : [env, 'ln', '-fs',
2969 join_paths(build.full_path(), b),
2971 build_by_default : true)
2973 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2978 if want_tests != 'false' and slow_tests
2979 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2981 args : [exe.full_path(),
2982 join_paths(meson.source_root(), p)])
2989 ############################################################
2992 all_files = run_command(
2994 ['--git-dir=@0@/.git'.format(meson.source_root()),
2997 all_files = files(all_files.stdout().split())
3002 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3005 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3009 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3012 command : [meson_git_contrib_sh])
3016 git_head = run_command(
3018 ['--git-dir=@0@/.git'.format(meson.source_root()),
3019 'rev-parse', 'HEAD']).stdout().strip()
3020 git_head_short = run_command(
3022 ['--git-dir=@0@/.git'.format(meson.source_root()),
3023 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3027 command : ['git', 'archive',
3028 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3030 '--prefix', 'systemd-@0@/'.format(git_head),
3034 ############################################################
3036 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3039 depends : [man, libsystemd, libudev],
3040 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3044 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
3046 ############################################################
3049 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3051 'split /usr: @0@'.format(split_usr),
3052 'split bin-sbin: @0@'.format(split_bin),
3053 'prefix directory: @0@'.format(prefixdir),
3054 'rootprefix directory: @0@'.format(rootprefixdir),
3055 'sysconf directory: @0@'.format(sysconfdir),
3056 'include directory: @0@'.format(includedir),
3057 'lib directory: @0@'.format(libdir),
3058 'rootlib directory: @0@'.format(rootlibdir),
3059 'SysV init scripts: @0@'.format(sysvinit_path),
3060 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3061 'PAM modules directory: @0@'.format(pamlibdir),
3062 'PAM configuration directory: @0@'.format(pamconfdir),
3063 'RPM macros directory: @0@'.format(rpmmacrosdir),
3064 'modprobe.d directory: @0@'.format(modprobedir),
3065 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3066 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3067 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3068 'bash completions directory: @0@'.format(bashcompletiondir),
3069 'zsh completions directory: @0@'.format(zshcompletiondir),
3070 'extra start script: @0@'.format(get_option('rc-local')),
3071 'extra stop script: @0@'.format(get_option('halt-local')),
3072 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3073 get_option('debug-tty')),
3074 'TTY GID: @0@'.format(tty_gid),
3075 'users GID: @0@'.format(substs.get('USERS_GID')),
3076 'maximum system UID: @0@'.format(system_uid_max),
3077 'maximum system GID: @0@'.format(system_gid_max),
3078 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3079 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3080 'minimum container UID base: @0@'.format(container_uid_base_min),
3081 'maximum container UID base: @0@'.format(container_uid_base_max),
3082 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3083 'render group access mode: @0@'.format(get_option('group-render-mode')),
3084 'certificate root directory: @0@'.format(get_option('certificate-root')),
3085 'support URL: @0@'.format(support_url),
3086 'nobody user name: @0@'.format(nobody_user),
3087 'nobody group name: @0@'.format(nobody_group),
3088 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3089 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3091 'default DNSSEC mode: @0@'.format(default_dnssec),
3092 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3093 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3094 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3096 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3097 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3099 'default DNS servers: @0@'.format(alt_dns_servers),
3100 'default NTP servers: @0@'.format(alt_ntp_servers)]
3102 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3103 '@@0@'.format(time_epoch)).stdout().strip()
3105 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3108 'static libsystemd: @0@'.format(static_libsystemd),
3109 'static libudev: @0@'.format(static_libudev)]
3112 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3113 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3114 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3116 if conf.get('ENABLE_EFI') == 1
3117 status += 'efi arch: @0@'.format(efi_arch)
3121 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3122 'EFI CC @0@'.format(efi_cc),
3123 'EFI lib directory: @0@'.format(efi_libdir),
3124 'EFI lds directory: @0@'.format(efi_ldsdir),
3125 'EFI include directory: @0@'.format(efi_incdir)]
3177 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3178 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3181 ['legacy pkla', install_polkit_pkla],
3183 ['gnu-efi', have_gnu_efi],
3196 ['man pages', want_man],
3197 ['html pages', want_html],
3198 ['man page indices', want_man and have_lxml],
3203 ['adm group', get_option('adm-group')],
3204 ['wheel group', get_option('wheel-group')],
3207 ['debug mmap cache'],
3210 ['valgrind', conf.get('VALGRIND') == 1],
3211 ['trace logging', conf.get('LOG_TRACE') == 1],
3212 ['link-udev-shared', get_option('link-udev-shared')],
3213 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3216 if tuple.length() >= 2
3219 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3220 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3221 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3232 'enabled features: @0@'.format(', '.join(found)),
3234 'disabled features: @0@'.format(', '.join(missing)),
3236 message('\n '.join(status))
3238 if rootprefixdir != rootprefix_default
3240 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3241 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3242 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))