1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.25.0'
16 libudev_version = '1.6.13'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
29 want_ossfuzz = get_option('oss-fuzz')
30 want_libfuzzer = get_option('llvm-fuzz')
31 if want_ossfuzz and want_libfuzzer
32 error('only one of oss-fuzz and llvm-fuzz can be specified')
34 fuzzer_build = want_ossfuzz or want_libfuzzer
36 #####################################################################
38 # Try to install the git pre-commit hook
39 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
40 if git_hook.returncode() == 0
41 message(git_hook.stdout().strip())
44 #####################################################################
46 if get_option('split-usr') == 'auto'
47 split_usr = run_command('test', '-L', '/bin').returncode() != 0
49 split_usr = get_option('split-usr') == 'true'
51 conf.set10('HAVE_SPLIT_USR', split_usr,
52 description : '/usr/bin and /bin directories are separate')
54 if get_option('split-bin') == 'auto'
55 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
57 split_bin = get_option('split-bin') == 'true'
59 conf.set10('HAVE_SPLIT_BIN', split_bin,
60 description : 'bin and sbin directories are separate')
62 rootprefixdir = get_option('rootprefix')
63 # Unusual rootprefixdir values are used by some distros
64 # (see https://github.com/systemd/systemd/pull/7461).
65 rootprefix_default = split_usr ? '/' : '/usr'
66 if rootprefixdir == ''
67 rootprefixdir = rootprefix_default
69 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
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 ignores 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 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
140 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
141 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
142 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
143 factorydir = join_paths(datadir, 'factory')
144 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
145 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
146 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
147 catalogstatedir = join_paths(systemdstatedir, 'catalog')
148 randomseeddir = join_paths(localstatedir, 'lib/systemd')
149 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
151 docdir = get_option('docdir')
153 docdir = join_paths(datadir, 'doc/systemd')
156 dbuspolicydir = get_option('dbuspolicydir')
157 if dbuspolicydir == ''
158 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
161 dbussessionservicedir = get_option('dbussessionservicedir')
162 if dbussessionservicedir == ''
163 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
166 dbussystemservicedir = get_option('dbussystemservicedir')
167 if dbussystemservicedir == ''
168 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
171 pamlibdir = get_option('pamlibdir')
173 pamlibdir = join_paths(rootlibdir, 'security')
176 pamconfdir = get_option('pamconfdir')
178 pamconfdir = join_paths(sysconfdir, 'pam.d')
181 memory_accounting_default = get_option('memory-accounting-default')
183 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
184 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
185 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
186 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
187 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
188 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
189 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
191 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
193 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
194 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
195 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
196 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
197 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
198 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
199 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
200 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
201 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
202 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
203 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
204 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
205 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
206 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
207 conf.set_quoted('ROOTPREFIX', rootprefixdir)
208 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
209 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
210 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
211 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
212 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
213 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
214 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
215 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
216 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
217 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
218 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
219 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
220 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
221 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
222 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
223 conf.set_quoted('LIBDIR', libdir)
224 conf.set_quoted('ROOTLIBDIR', rootlibdir)
225 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
226 conf.set_quoted('BOOTLIBDIR', bootlibdir)
227 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
228 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
229 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
230 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
231 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
232 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
233 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
234 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
235 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
237 substs.set('prefix', prefixdir)
238 substs.set('rootprefix', rootprefixdir)
239 substs.set('rootprefix_noslash', rootprefixdir_noslash)
240 substs.set('exec_prefix', prefixdir)
241 substs.set('libdir', libdir)
242 substs.set('rootlibdir', rootlibdir)
243 substs.set('includedir', includedir)
244 substs.set('sysconfdir', sysconfdir)
245 substs.set('bindir', bindir)
246 substs.set('rootbindir', rootbindir)
247 substs.set('rootlibexecdir', rootlibexecdir)
248 substs.set('systemunitdir', systemunitdir)
249 substs.set('userunitdir', userunitdir)
250 substs.set('systempresetdir', systempresetdir)
251 substs.set('userpresetdir', userpresetdir)
252 substs.set('udevhwdbdir', udevhwdbdir)
253 substs.set('udevrulesdir', udevrulesdir)
254 substs.set('udevlibexecdir', udevlibexecdir)
255 substs.set('environmentdir', environmentdir)
256 substs.set('catalogdir', catalogdir)
257 substs.set('tmpfilesdir', tmpfilesdir)
258 substs.set('sysusersdir', sysusersdir)
259 substs.set('sysctldir', sysctldir)
260 substs.set('binfmtdir', binfmtdir)
261 substs.set('modulesloaddir', modulesloaddir)
262 substs.set('modprobedir', modprobedir)
263 substs.set('systemgeneratordir', systemgeneratordir)
264 substs.set('usergeneratordir', usergeneratordir)
265 substs.set('systemenvgeneratordir', systemenvgeneratordir)
266 substs.set('userenvgeneratordir', userenvgeneratordir)
267 substs.set('systemshutdowndir', systemshutdowndir)
268 substs.set('systemsleepdir', systemsleepdir)
269 substs.set('VARLOGDIR', varlogdir)
270 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
271 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
272 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
273 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
274 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
275 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
276 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
277 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
278 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
280 #####################################################################
282 cc = meson.get_compiler('c')
283 pkgconfig = import('pkgconfig')
284 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
285 meson_build_sh = find_program('tools/meson-build.sh')
287 want_tests = get_option('tests')
288 slow_tests = want_tests != 'false' and get_option('slow-tests')
289 install_tests = get_option('install-tests')
291 if add_languages('cpp', required : fuzzer_build)
292 # Used only for tests
293 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
299 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
301 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
304 possible_cc_flags = [
308 '-Wmissing-include-dirs',
309 '-Wold-style-definition',
313 '-Wsuggest-attribute=noreturn',
314 '-Werror=missing-prototypes',
315 '-Werror=implicit-function-declaration',
316 '-Werror=missing-declarations',
317 '-Werror=return-type',
318 '-Werror=incompatible-pointer-types',
320 '-Wstrict-prototypes',
322 '-Wmissing-noreturn',
323 '-Wimplicit-fallthrough=5',
326 '-Wstrict-aliasing=2',
329 '-Werror=shift-count-overflow',
330 '-Werror=shift-overflow=2',
334 # negative arguments are correctly detected starting with meson 0.46.
335 '-Wno-unused-parameter',
336 '-Wno-missing-field-initializers',
337 '-Wno-unused-result',
338 '-Wno-format-signedness',
339 '-Wno-error=#warnings',
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 if cc.get_id() == 'clang'
366 possible_cc_flags += [
367 '-Wno-typedef-redefinition',
368 '-Wno-gnu-variable-sized-type-not-at-end',
372 if get_option('buildtype') != 'debug'
373 possible_cc_flags += [
374 '-ffunction-sections',
378 possible_link_flags += '-Wl,--gc-sections'
381 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
382 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
386 #include <inttypes.h>
387 typedef uint64_t usec_t;
388 usec_t now(clockid_t clock);
393 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
394 add_project_arguments('-Werror=shadow', language : 'c')
397 cpp = ' '.join(cc.cmd_array()) + ' -E'
399 #####################################################################
400 # compilation result tests
402 conf.set('_GNU_SOURCE', true)
403 conf.set('__SANE_USERSPACE_TYPES__', true)
405 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
406 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
407 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
408 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
409 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
410 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
411 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
415 #include <sys/stat.h>
418 foreach decl : ['char16_t',
423 # We get -1 if the size cannot be determined
424 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
426 if decl == 'struct statx'
428 want_linux_stat_h = false
430 have = cc.sizeof(decl,
431 prefix : decl_headers + '#include <linux/stat.h>',
432 args : '-D_GNU_SOURCE') > 0
433 want_linux_stat_h = have
437 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
440 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
442 foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
443 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
444 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
445 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
446 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
447 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
448 ['FRA_TUN_ID', 'linux/fib_rules.h'],
449 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
450 ['FRA_PAD', 'linux/fib_rules.h'],
451 ['FRA_L3MDEV', 'linux/fib_rules.h'],
452 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
453 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
454 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
455 ['FOU_CMD_GET', 'linux/fou.h'],
456 ['IFA_FLAGS', 'linux/if_addr.h'],
457 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
458 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
459 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
460 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
461 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
462 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
463 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
464 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
465 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
466 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
467 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
468 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
469 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
470 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
471 ['IFLA_PAD', 'linux/if_link.h'],
472 ['IFLA_XDP', 'linux/if_link.h'],
473 ['IFLA_EVENT', 'linux/if_link.h'],
474 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
475 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
476 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
477 ['IFLA_MAX_MTU', 'linux/if_link.h'],
478 ['IFLA_BOND_MODE', 'linux/if_link.h'],
479 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
480 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
481 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
482 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
483 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
484 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
485 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
486 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
487 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
488 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
489 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
490 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
491 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
492 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
493 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
494 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
495 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
496 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
497 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
498 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
499 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
500 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
501 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
502 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
503 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
504 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
505 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
506 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
507 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
508 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
509 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
510 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
511 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
512 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
513 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
514 # if_tunnel.h is buggy and cannot be included on its own
515 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
516 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
517 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
518 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
519 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
520 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
521 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
522 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
523 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
524 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
525 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
527 prefix = decl.length() > 2 ? decl[2] : ''
528 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
529 conf.set10('HAVE_' + decl[0], have)
532 foreach ident : ['secure_getenv', '__secure_getenv']
533 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
537 ['memfd_create', '''#include <sys/mman.h>'''],
538 ['gettid', '''#include <sys/types.h>
539 #include <unistd.h>'''],
540 ['pivot_root', '''#include <stdlib.h>
541 #include <unistd.h>'''], # no known header declares pivot_root
542 ['name_to_handle_at', '''#include <sys/types.h>
543 #include <sys/stat.h>
544 #include <fcntl.h>'''],
545 ['setns', '''#include <sched.h>'''],
546 ['renameat2', '''#include <stdio.h>
547 #include <fcntl.h>'''],
548 ['kcmp', '''#include <linux/kcmp.h>'''],
549 ['keyctl', '''#include <sys/types.h>
550 #include <keyutils.h>'''],
551 ['copy_file_range', '''#include <sys/syscall.h>
552 #include <unistd.h>'''],
553 ['bpf', '''#include <sys/syscall.h>
554 #include <unistd.h>'''],
555 ['statx', '''#include <sys/types.h>
556 #include <sys/stat.h>
557 #include <unistd.h>'''],
558 ['explicit_bzero' , '''#include <string.h>'''],
559 ['reallocarray', '''#include <malloc.h>'''],
562 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
563 conf.set10('HAVE_' + ident[0].to_upper(), have)
566 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
567 conf.set10('USE_SYS_RANDOM_H', true)
568 conf.set10('HAVE_GETRANDOM', true)
570 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
571 conf.set10('USE_SYS_RANDOM_H', false)
572 conf.set10('HAVE_GETRANDOM', have)
575 #####################################################################
577 vcs_tagger = [meson.source_root() + '/tools/meson-vcs-tag.sh',
579 get_option('version-tag'),
580 meson.project_version()]
583 input : 'src/version/version.h.in',
584 output : 'version.h',
587 versiondep = declare_dependency(sources: version_h)
589 sed = find_program('sed')
590 awk = find_program('awk')
591 m4 = find_program('m4')
592 stat = find_program('stat')
593 git = find_program('git', required : false)
594 env = find_program('env')
595 perl = find_program('perl', required : false)
597 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
598 mkdir_p = 'mkdir -p $DESTDIR/@0@'
599 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
600 splash_bmp = files('test/splash.bmp')
602 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
603 # /usr/sbin, /sbin, and fall back to the default from middle column.
604 progs = [['quotaon', '/usr/sbin/quotaon' ],
605 ['quotacheck', '/usr/sbin/quotacheck' ],
606 ['kmod', '/usr/bin/kmod' ],
607 ['kexec', '/usr/sbin/kexec' ],
608 ['sulogin', '/usr/sbin/sulogin' ],
609 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
610 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
611 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
612 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
615 path = get_option(prog[0] + '-path')
617 message('Using @1@ for @0@'.format(prog[0], path))
619 exe = find_program(prog[0],
620 '/usr/sbin/' + prog[0],
623 path = exe.found() ? exe.path() : prog[1]
625 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
626 conf.set_quoted(name, path)
627 substs.set(name, path)
630 conf.set_quoted('TELINIT', get_option('telinit-path'))
632 if run_command('ln', '--relative', '--help').returncode() != 0
633 error('ln does not support --relative (added in coreutils 8.16)')
636 ############################################################
638 gperf = find_program('gperf')
640 gperf_test_format = '''
642 const char * in_word_set(const char *, @0@);
645 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
646 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
647 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
648 if cc.compiles(gperf_test)
649 gperf_len_type = 'size_t'
651 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
652 if cc.compiles(gperf_test)
653 gperf_len_type = 'unsigned'
655 error('unable to determine gperf len type')
658 message('gperf len type is @0@'.format(gperf_len_type))
659 conf.set('GPERF_LEN_TYPE', gperf_len_type,
660 description : 'The type of gperf "len" parameter')
662 ############################################################
664 if not cc.has_header('sys/capability.h')
665 error('POSIX caps headers not found')
667 foreach header : ['crypt.h',
668 'linux/btrfs_tree.h',
671 'linux/vm_sockets.h',
674 'valgrind/memcheck.h',
675 'valgrind/valgrind.h',
678 conf.set10('HAVE_' + header.underscorify().to_upper(),
679 cc.has_header(header))
682 ############################################################
684 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
685 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
686 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
688 default_hierarchy = get_option('default-hierarchy')
689 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
690 description : 'default cgroup hierarchy as string')
691 if default_hierarchy == 'legacy'
692 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
693 elif default_hierarchy == 'hybrid'
694 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
696 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
699 default_net_naming_scheme = get_option('default-net-naming-scheme')
700 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
702 time_epoch = get_option('time-epoch')
705 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
707 conf.set('TIME_EPOCH', time_epoch)
709 system_uid_max = get_option('system-uid-max')
710 if system_uid_max == -1
711 system_uid_max = run_command(
713 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
714 '/etc/login.defs').stdout().strip()
715 if system_uid_max == ''
718 system_uid_max = system_uid_max.to_int()
721 conf.set('SYSTEM_UID_MAX', system_uid_max)
722 substs.set('systemuidmax', system_uid_max)
724 system_gid_max = get_option('system-gid-max')
725 if system_gid_max == -1
726 system_gid_max = run_command(
728 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
729 '/etc/login.defs').stdout().strip()
730 if system_gid_max == ''
733 system_gid_max = system_gid_max.to_int()
736 conf.set('SYSTEM_GID_MAX', system_gid_max)
737 substs.set('systemgidmax', system_gid_max)
739 dynamic_uid_min = get_option('dynamic-uid-min')
740 dynamic_uid_max = get_option('dynamic-uid-max')
741 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
742 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
743 substs.set('dynamicuidmin', dynamic_uid_min)
744 substs.set('dynamicuidmax', dynamic_uid_max)
746 container_uid_base_min = get_option('container-uid-base-min')
747 container_uid_base_max = get_option('container-uid-base-max')
748 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
749 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
750 substs.set('containeruidbasemin', container_uid_base_min)
751 substs.set('containeruidbasemax', container_uid_base_max)
753 nobody_user = get_option('nobody-user')
754 nobody_group = get_option('nobody-group')
756 if not meson.is_cross_build()
757 getent_result = run_command('getent', 'passwd', '65534')
758 if getent_result.returncode() == 0
759 name = getent_result.stdout().split(':')[0]
760 if name != nobody_user
762 'The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
763 'Your build will result in an user table setup that is incompatible with the local system.')
766 id_result = run_command('id', '-u', nobody_user)
767 if id_result.returncode() == 0
768 id = id_result.stdout().to_int()
771 'The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
772 'Your build will result in an user table setup that is incompatible with the local system.')
776 getent_result = run_command('getent', 'group', '65534')
777 if getent_result.returncode() == 0
778 name = getent_result.stdout().split(':')[0]
779 if name != nobody_group
781 'The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
782 'Your build will result in an group table setup that is incompatible with the local system.')
785 id_result = run_command('id', '-g', nobody_group)
786 if id_result.returncode() == 0
787 id = id_result.stdout().to_int()
790 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
791 'Your build will result in an group table setup that is incompatible with the local system.')
795 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
797 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
798 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
801 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
802 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
803 substs.set('NOBODY_USER_NAME', nobody_user)
804 substs.set('NOBODY_GROUP_NAME', nobody_group)
806 tty_gid = get_option('tty-gid')
807 conf.set('TTY_GID', tty_gid)
808 substs.set('TTY_GID', tty_gid)
810 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
811 users_gid = get_option('users-gid')
812 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
814 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
815 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
817 dev_kvm_mode = get_option('dev-kvm-mode')
818 substs.set('DEV_KVM_MODE', dev_kvm_mode)
819 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
820 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
822 kill_user_processes = get_option('default-kill-user-processes')
823 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
824 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
825 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
827 dns_servers = get_option('dns-servers')
828 conf.set_quoted('DNS_SERVERS', dns_servers)
829 substs.set('DNS_SERVERS', dns_servers)
831 ntp_servers = get_option('ntp-servers')
832 conf.set_quoted('NTP_SERVERS', ntp_servers)
833 substs.set('NTP_SERVERS', ntp_servers)
835 default_locale = get_option('default-locale')
836 if default_locale == ''
837 if not meson.is_cross_build()
838 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
839 default_locale = run_command(choose_default_locale_sh).stdout().strip()
841 default_locale = 'C.UTF-8'
844 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
846 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
848 substs.set('SUSHELL', get_option('debug-shell'))
849 substs.set('DEBUGTTY', get_option('debug-tty'))
851 enable_debug_hashmap = false
852 enable_debug_mmap_cache = false
853 enable_debug_siphash = false
854 enable_debug_udev = false
855 foreach name : get_option('debug-extra')
857 enable_debug_hashmap = true
858 elif name == 'mmap-cache'
859 enable_debug_mmap_cache = true
860 elif name == 'siphash'
861 enable_debug_siphash = true
863 enable_debug_udev = true
865 message('unknown debug option "@0@", ignoring'.format(name))
868 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
869 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
870 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
871 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
873 conf.set10('VALGRIND', get_option('valgrind'))
874 conf.set10('LOG_TRACE', get_option('log-trace'))
876 #####################################################################
878 threads = dependency('threads')
879 librt = cc.find_library('rt')
880 libm = cc.find_library('m')
881 libdl = cc.find_library('dl')
882 libcrypt = cc.find_library('crypt')
884 libcap = dependency('libcap', required : false)
885 if not libcap.found()
886 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
887 libcap = cc.find_library('cap')
890 libmount = dependency('mount',
891 version : fuzzer_build ? '>= 0' : '>= 2.30')
893 want_seccomp = get_option('seccomp')
894 if want_seccomp != 'false' and not fuzzer_build
895 libseccomp = dependency('libseccomp',
896 version : '>= 2.3.1',
897 required : want_seccomp == 'true')
898 have = libseccomp.found()
903 conf.set10('HAVE_SECCOMP', have)
905 want_selinux = get_option('selinux')
906 if want_selinux != 'false' and not fuzzer_build
907 libselinux = dependency('libselinux',
908 version : '>= 2.1.9',
909 required : want_selinux == 'true')
910 have = libselinux.found()
915 conf.set10('HAVE_SELINUX', have)
917 want_apparmor = get_option('apparmor')
918 if want_apparmor != 'false' and not fuzzer_build
919 libapparmor = dependency('libapparmor',
920 required : want_apparmor == 'true')
921 have = libapparmor.found()
926 conf.set10('HAVE_APPARMOR', have)
928 smack_run_label = get_option('smack-run-label')
929 if smack_run_label != ''
930 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
933 want_polkit = get_option('polkit')
934 install_polkit = false
935 install_polkit_pkla = false
936 if want_polkit != 'false' and not fuzzer_build
937 install_polkit = true
939 libpolkit = dependency('polkit-gobject-1',
941 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
942 message('Old polkit detected, will install pkla files')
943 install_polkit_pkla = true
946 conf.set10('ENABLE_POLKIT', install_polkit)
948 want_acl = get_option('acl')
949 if want_acl != 'false' and not fuzzer_build
950 libacl = cc.find_library('acl', required : want_acl == 'true')
951 have = libacl.found()
956 conf.set10('HAVE_ACL', have)
958 want_audit = get_option('audit')
959 if want_audit != 'false' and not fuzzer_build
960 libaudit = dependency('audit', required : want_audit == 'true')
961 have = libaudit.found()
966 conf.set10('HAVE_AUDIT', have)
968 want_blkid = get_option('blkid')
969 if want_blkid != 'false' and not fuzzer_build
970 libblkid = dependency('blkid', required : want_blkid == 'true')
971 have = libblkid.found()
976 conf.set10('HAVE_BLKID', have)
978 want_kmod = get_option('kmod')
979 if want_kmod != 'false' and not fuzzer_build
980 libkmod = dependency('libkmod',
982 required : want_kmod == 'true')
983 have = libkmod.found()
988 conf.set10('HAVE_KMOD', have)
990 want_pam = get_option('pam')
991 if want_pam != 'false' and not fuzzer_build
992 libpam = cc.find_library('pam', required : want_pam == 'true')
993 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
994 have = libpam.found() and libpam_misc.found()
1000 conf.set10('HAVE_PAM', have)
1002 want_microhttpd = get_option('microhttpd')
1003 if want_microhttpd != 'false' and not fuzzer_build
1004 libmicrohttpd = dependency('libmicrohttpd',
1005 version : '>= 0.9.33',
1006 required : want_microhttpd == 'true')
1007 have = libmicrohttpd.found()
1012 conf.set10('HAVE_MICROHTTPD', have)
1014 want_libcryptsetup = get_option('libcryptsetup')
1015 if want_libcryptsetup != 'false' and not fuzzer_build
1016 libcryptsetup = dependency('libcryptsetup',
1017 version : '>= 1.6.0',
1018 required : want_libcryptsetup == 'true')
1019 have = libcryptsetup.found()
1020 have_sector = cc.has_member(
1021 'struct crypt_params_plain',
1023 prefix : '#include <libcryptsetup.h>')
1029 conf.set10('HAVE_LIBCRYPTSETUP', have)
1030 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1032 want_libcurl = get_option('libcurl')
1033 if want_libcurl != 'false' and not fuzzer_build
1034 libcurl = dependency('libcurl',
1035 version : '>= 7.32.0',
1036 required : want_libcurl == 'true')
1037 have = libcurl.found()
1042 conf.set10('HAVE_LIBCURL', have)
1044 want_libidn = get_option('libidn')
1045 want_libidn2 = get_option('libidn2')
1046 if want_libidn == 'true' and want_libidn2 == 'true'
1047 error('libidn and libidn2 cannot be requested simultaneously')
1050 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1051 libidn = dependency('libidn',
1052 required : want_libidn == 'true')
1053 have = libidn.found()
1058 conf.set10('HAVE_LIBIDN', have)
1059 if not have and want_libidn2 != 'false' and not fuzzer_build
1060 # libidn is used for both libidn and libidn2 objects
1061 libidn = dependency('libidn2',
1062 required : want_libidn2 == 'true')
1063 have = libidn.found()
1067 conf.set10('HAVE_LIBIDN2', have)
1069 want_libiptc = get_option('libiptc')
1070 if want_libiptc != 'false' and not fuzzer_build
1071 libiptc = dependency('libiptc',
1072 required : want_libiptc == 'true')
1073 have = libiptc.found()
1078 conf.set10('HAVE_LIBIPTC', have)
1080 want_qrencode = get_option('qrencode')
1081 if want_qrencode != 'false' and not fuzzer_build
1082 libqrencode = dependency('libqrencode',
1083 required : want_qrencode == 'true')
1084 have = libqrencode.found()
1089 conf.set10('HAVE_QRENCODE', have)
1091 want_gcrypt = get_option('gcrypt')
1092 if want_gcrypt != 'false' and not fuzzer_build
1093 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1094 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1095 have = libgcrypt.found() and libgpg_error.found()
1100 # link to neither of the libs if one is not found
1104 conf.set10('HAVE_GCRYPT', have)
1106 want_gnutls = get_option('gnutls')
1107 if want_gnutls != 'false' and not fuzzer_build
1108 libgnutls = dependency('gnutls',
1109 version : '>= 3.1.4',
1110 required : want_gnutls == 'true')
1111 have = libgnutls.found()
1116 conf.set10('HAVE_GNUTLS', have)
1118 want_openssl = get_option('openssl')
1119 if want_openssl != 'false' and not fuzzer_build
1120 libopenssl = dependency('openssl',
1121 version : '>= 1.1.0',
1122 required : want_openssl == 'true')
1123 have = libopenssl.found()
1128 conf.set10('HAVE_OPENSSL', have)
1130 want_elfutils = get_option('elfutils')
1131 if want_elfutils != 'false' and not fuzzer_build
1132 libdw = dependency('libdw',
1133 required : want_elfutils == 'true')
1134 have = libdw.found()
1139 conf.set10('HAVE_ELFUTILS', have)
1141 want_zlib = get_option('zlib')
1142 if want_zlib != 'false' and not fuzzer_build
1143 libz = dependency('zlib',
1144 required : want_zlib == 'true')
1150 conf.set10('HAVE_ZLIB', have)
1152 want_bzip2 = get_option('bzip2')
1153 if want_bzip2 != 'false' and not fuzzer_build
1154 libbzip2 = cc.find_library('bz2',
1155 required : want_bzip2 == 'true')
1156 have = libbzip2.found()
1161 conf.set10('HAVE_BZIP2', have)
1163 want_xz = get_option('xz')
1164 if want_xz != 'false' and not fuzzer_build
1165 libxz = dependency('liblzma',
1166 required : want_xz == 'true')
1167 have = libxz.found()
1172 conf.set10('HAVE_XZ', have)
1174 want_lz4 = get_option('lz4')
1175 if want_lz4 != 'false' and not fuzzer_build
1176 liblz4 = dependency('liblz4',
1177 version : '>= 1.3.0',
1178 required : want_lz4 == 'true')
1179 have = liblz4.found()
1184 conf.set10('HAVE_LZ4', have)
1186 want_xkbcommon = get_option('xkbcommon')
1187 if want_xkbcommon != 'false' and not fuzzer_build
1188 libxkbcommon = dependency('xkbcommon',
1189 version : '>= 0.3.0',
1190 required : want_xkbcommon == 'true')
1191 have = libxkbcommon.found()
1196 conf.set10('HAVE_XKBCOMMON', have)
1198 want_pcre2 = get_option('pcre2')
1199 if want_pcre2 != 'false'
1200 libpcre2 = dependency('libpcre2-8',
1201 required : want_pcre2 == 'true')
1202 have = libpcre2.found()
1207 conf.set10('HAVE_PCRE2', have)
1209 want_glib = get_option('glib')
1210 if want_glib != 'false' and not fuzzer_build
1211 libglib = dependency('glib-2.0',
1212 version : '>= 2.22.0',
1213 required : want_glib == 'true')
1214 libgobject = dependency('gobject-2.0',
1215 version : '>= 2.22.0',
1216 required : want_glib == 'true')
1217 libgio = dependency('gio-2.0',
1218 required : want_glib == 'true')
1219 have = libglib.found() and libgobject.found() and libgio.found()
1226 conf.set10('HAVE_GLIB', have)
1228 want_dbus = get_option('dbus')
1229 if want_dbus != 'false' and not fuzzer_build
1230 libdbus = dependency('dbus-1',
1231 version : '>= 1.3.2',
1232 required : want_dbus == 'true')
1233 have = libdbus.found()
1238 conf.set10('HAVE_DBUS', have)
1240 default_dnssec = get_option('default-dnssec')
1242 default_dnssec = 'no'
1244 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1245 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1246 default_dnssec = 'no'
1248 conf.set('DEFAULT_DNSSEC_MODE',
1249 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1250 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1252 dns_over_tls = get_option('dns-over-tls')
1253 if dns_over_tls != 'false'
1254 if dns_over_tls == 'openssl'
1257 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1258 if dns_over_tls == 'gnutls' and not have_gnutls
1259 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1262 if dns_over_tls == 'gnutls' or have_gnutls
1263 have_openssl = false
1265 have_openssl = conf.get('HAVE_OPENSSL') == 1
1266 if dns_over_tls != 'auto' and not have_openssl
1267 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1268 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1271 have = have_gnutls or have_openssl
1275 have_openssl = false
1277 conf.set10('ENABLE_DNS_OVER_TLS', have)
1278 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1279 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1281 default_dns_over_tls = get_option('default-dns-over-tls')
1283 default_dns_over_tls = 'no'
1285 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1286 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1287 default_dns_over_tls = 'no'
1289 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1290 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1291 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1293 want_importd = get_option('importd')
1294 if want_importd != 'false'
1295 have = (conf.get('HAVE_LIBCURL') == 1 and
1296 conf.get('HAVE_ZLIB') == 1 and
1297 conf.get('HAVE_XZ') == 1 and
1298 conf.get('HAVE_GCRYPT') == 1)
1299 if want_importd == 'true' and not have
1300 error('importd support was requested, but dependencies are not available')
1305 conf.set10('ENABLE_IMPORTD', have)
1307 want_remote = get_option('remote')
1308 if want_remote != 'false'
1309 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1310 conf.get('HAVE_LIBCURL') == 1]
1311 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1312 # it's possible to build one without the other. Complain only if
1313 # support was explictly requested. The auxiliary files like sysusers
1314 # config should be installed when any of the programs are built.
1315 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1316 error('remote support was requested, but dependencies are not available')
1318 have = have_deps[0] or have_deps[1]
1322 conf.set10('ENABLE_REMOTE', have)
1324 foreach term : ['utmp',
1356 have = get_option(term)
1357 name = 'ENABLE_' + term.underscorify().to_upper()
1358 conf.set10(name, have)
1361 foreach tuple : [['nss-mymachines', 'machined'],
1362 ['nss-resolve', 'resolve']]
1363 want = get_option(tuple[0])
1365 have = get_option(tuple[1])
1366 if want == 'true' and not have
1367 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1372 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1373 conf.set10(name, have)
1377 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1378 'ENABLE_NSS_MYMACHINES',
1379 'ENABLE_NSS_RESOLVE',
1380 'ENABLE_NSS_SYSTEMD']
1381 if conf.get(term) == 1
1385 conf.set10('ENABLE_NSS', enable_nss)
1387 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1392 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1394 #####################################################################
1396 if get_option('efi')
1397 efi_arch = host_machine.cpu_family()
1399 if efi_arch == 'x86'
1400 EFI_MACHINE_TYPE_NAME = 'ia32'
1401 gnu_efi_arch = 'ia32'
1402 elif efi_arch == 'x86_64'
1403 EFI_MACHINE_TYPE_NAME = 'x64'
1404 gnu_efi_arch = 'x86_64'
1405 elif efi_arch == 'arm'
1406 EFI_MACHINE_TYPE_NAME = 'arm'
1407 gnu_efi_arch = 'arm'
1408 elif efi_arch == 'aarch64'
1409 EFI_MACHINE_TYPE_NAME = 'aa64'
1410 gnu_efi_arch = 'aarch64'
1412 EFI_MACHINE_TYPE_NAME = ''
1417 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1419 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1423 conf.set10('ENABLE_EFI', have)
1425 #####################################################################
1427 config_h = configure_file(
1428 output : 'config.h',
1429 configuration : conf)
1431 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1433 includes = include_directories('src/basic',
1437 'src/journal-remote',
1441 'src/time-wait-sync',
1447 'src/libsystemd/sd-bus',
1448 'src/libsystemd/sd-device',
1449 'src/libsystemd/sd-event',
1450 'src/libsystemd/sd-hwdb',
1451 'src/libsystemd/sd-id128',
1452 'src/libsystemd/sd-netlink',
1453 'src/libsystemd/sd-network',
1454 'src/libsystemd/sd-resolve',
1455 'src/libsystemd-network',
1458 add_project_arguments('-include', 'config.h', language : 'c')
1460 generate_gperfs = find_program('tools/generate-gperfs.py')
1464 subdir('src/systemd')
1466 subdir('src/libsystemd')
1467 subdir('src/libsystemd-network')
1468 subdir('src/journal')
1471 libjournal_core = static_library(
1473 libjournal_core_sources,
1475 include_directories : includes,
1478 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1479 libsystemd = shared_library(
1482 version : libsystemd_version,
1483 include_directories : includes,
1484 link_args : ['-shared',
1485 '-Wl,--version-script=' + libsystemd_sym_path],
1486 link_with : [libbasic,
1488 link_whole : [libsystemd_static,
1490 dependencies : [threads,
1494 link_depends : libsystemd_sym,
1496 install_dir : rootlibdir)
1498 static_libsystemd = get_option('static-libsystemd')
1499 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1501 install_libsystemd_static = static_library(
1504 journal_client_sources,
1506 basic_gcrypt_sources,
1508 include_directories : includes,
1509 build_by_default : static_libsystemd != 'false',
1510 install : static_libsystemd != 'false',
1511 install_dir : rootlibdir,
1512 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1513 dependencies : [threads,
1522 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1524 ############################################################
1526 # binaries that have --help and are intended for use by humans,
1527 # usually, but not always, installed in /bin.
1528 public_programs = []
1530 subdir('src/libudev')
1531 subdir('src/shared')
1533 subdir('src/shutdown')
1535 subdir('src/network')
1537 subdir('src/analyze')
1538 subdir('src/journal-remote')
1539 subdir('src/coredump')
1540 subdir('src/hostname')
1541 subdir('src/import')
1542 subdir('src/kernel-install')
1543 subdir('src/locale')
1544 subdir('src/machine')
1545 subdir('src/portable')
1546 subdir('src/nspawn')
1547 subdir('src/resolve')
1548 subdir('src/timedate')
1549 subdir('src/timesync')
1550 subdir('src/vconsole')
1551 subdir('src/boot/efi')
1558 ############################################################
1560 # only static linking apart from libdl, to make sure that the
1561 # module is linked to all libraries that it uses.
1562 test_dlopen = executable(
1566 include_directories : includes,
1567 link_with : [libbasic],
1568 dependencies : [libdl],
1569 build_by_default : want_tests != 'false')
1571 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1572 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1573 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1574 ['resolve', 'ENABLE_NSS_RESOLVE']]
1576 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1580 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1581 version_script_arg = join_paths(meson.source_root(), sym)
1583 nss = shared_library(
1585 'src/nss-@0@/nss-@0@.c'.format(module),
1588 include_directories : includes,
1589 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1590 link_args : ['-Wl,-z,nodelete',
1592 '-Wl,--version-script=' + version_script_arg,
1594 link_with : [libsystemd_static,
1596 dependencies : [threads,
1600 install_dir : rootlibdir)
1602 # We cannot use shared_module because it does not support version suffix.
1603 # Unfortunately shared_library insists on creating the symlink…
1604 meson.add_install_script('sh', '-c',
1605 'rm $DESTDIR@0@/libnss_@1@.so'
1606 .format(rootlibdir, module))
1608 if want_tests != 'false'
1609 test('dlopen-nss_' + module,
1611 # path to dlopen must include a slash
1612 args : nss.full_path())
1617 ############################################################
1619 executable('systemd',
1621 include_directories : includes,
1622 link_with : [libcore,
1624 dependencies : [versiondep,
1631 install_rpath : rootlibexecdir,
1633 install_dir : rootlibexecdir)
1635 meson.add_install_script(meson_make_symlink,
1636 join_paths(rootlibexecdir, 'systemd'),
1637 join_paths(rootsbindir, 'init'))
1639 exe = executable('systemd-analyze',
1640 systemd_analyze_sources,
1641 include_directories : includes,
1642 link_with : [libcore,
1644 dependencies : [versiondep,
1651 install_rpath : rootlibexecdir,
1653 public_programs += exe
1655 executable('systemd-journald',
1656 systemd_journald_sources,
1657 include_directories : includes,
1658 link_with : [libjournal_core,
1660 dependencies : [threads,
1664 install_rpath : rootlibexecdir,
1666 install_dir : rootlibexecdir)
1668 exe = executable('systemd-cat',
1669 systemd_cat_sources,
1670 include_directories : includes,
1671 link_with : [libjournal_core,
1673 dependencies : [threads],
1674 install_rpath : rootlibexecdir,
1676 public_programs += exe
1678 exe = executable('journalctl',
1680 include_directories : includes,
1681 link_with : [libshared],
1682 dependencies : [threads,
1687 install_rpath : rootlibexecdir,
1689 install_dir : rootbindir)
1690 public_programs += exe
1692 executable('systemd-getty-generator',
1693 'src/getty-generator/getty-generator.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 install_rpath : rootlibexecdir,
1698 install_dir : systemgeneratordir)
1700 executable('systemd-debug-generator',
1701 'src/debug-generator/debug-generator.c',
1702 include_directories : includes,
1703 link_with : [libshared],
1704 install_rpath : rootlibexecdir,
1706 install_dir : systemgeneratordir)
1708 executable('systemd-run-generator',
1709 'src/run-generator/run-generator.c',
1710 include_directories : includes,
1711 link_with : [libshared],
1712 install_rpath : rootlibexecdir,
1714 install_dir : systemgeneratordir)
1716 executable('systemd-fstab-generator',
1717 'src/fstab-generator/fstab-generator.c',
1718 'src/core/mount-setup.c',
1719 include_directories : includes,
1720 link_with : [libshared],
1721 install_rpath : rootlibexecdir,
1723 install_dir : systemgeneratordir)
1725 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1726 executable('30-systemd-environment-d-generator',
1727 'src/environment-d-generator/environment-d-generator.c',
1728 include_directories : includes,
1729 link_with : [libshared],
1730 install_rpath : rootlibexecdir,
1732 install_dir : userenvgeneratordir)
1734 meson.add_install_script(meson_make_symlink,
1735 join_paths(sysconfdir, 'environment'),
1736 join_paths(environmentdir, '99-environment.conf'))
1739 if conf.get('ENABLE_HIBERNATE') == 1
1740 executable('systemd-hibernate-resume-generator',
1741 'src/hibernate-resume/hibernate-resume-generator.c',
1742 include_directories : includes,
1743 link_with : [libshared],
1744 install_rpath : rootlibexecdir,
1746 install_dir : systemgeneratordir)
1748 executable('systemd-hibernate-resume',
1749 'src/hibernate-resume/hibernate-resume.c',
1750 include_directories : includes,
1751 link_with : [libshared],
1752 install_rpath : rootlibexecdir,
1754 install_dir : rootlibexecdir)
1757 if conf.get('HAVE_BLKID') == 1
1758 executable('systemd-gpt-auto-generator',
1759 'src/gpt-auto-generator/gpt-auto-generator.c',
1760 'src/shared/blkid-util.h',
1761 include_directories : includes,
1762 link_with : [libshared],
1763 dependencies : libblkid,
1764 install_rpath : rootlibexecdir,
1766 install_dir : systemgeneratordir)
1768 exe = executable('systemd-dissect',
1769 'src/dissect/dissect.c',
1770 include_directories : includes,
1771 link_with : [libshared],
1772 install_rpath : rootlibexecdir,
1774 install_dir : rootlibexecdir)
1775 public_programs += exe
1778 if conf.get('ENABLE_RESOLVE') == 1
1779 executable('systemd-resolved',
1780 systemd_resolved_sources,
1781 include_directories : includes,
1782 link_with : [libshared,
1784 libsystemd_resolve_core],
1785 dependencies : systemd_resolved_dependencies,
1786 install_rpath : rootlibexecdir,
1788 install_dir : rootlibexecdir)
1790 exe = executable('resolvectl',
1792 include_directories : includes,
1793 link_with : [libshared,
1795 libsystemd_resolve_core],
1796 dependencies : [threads,
1800 install_rpath : rootlibexecdir,
1802 public_programs += exe
1804 meson.add_install_script(meson_make_symlink,
1805 join_paths(bindir, 'resolvectl'),
1806 join_paths(rootsbindir, 'resolvconf'))
1808 meson.add_install_script(meson_make_symlink,
1809 join_paths(bindir, 'resolvectl'),
1810 join_paths(bindir, 'systemd-resolve'))
1813 if conf.get('ENABLE_LOGIND') == 1
1814 executable('systemd-logind',
1815 systemd_logind_sources,
1816 include_directories : includes,
1817 link_with : [liblogind_core,
1819 dependencies : [threads,
1821 install_rpath : rootlibexecdir,
1823 install_dir : rootlibexecdir)
1825 exe = executable('loginctl',
1827 include_directories : includes,
1828 link_with : [libshared],
1829 dependencies : [threads,
1832 install_rpath : rootlibexecdir,
1834 install_dir : rootbindir)
1835 public_programs += exe
1837 exe = executable('systemd-inhibit',
1838 'src/login/inhibit.c',
1839 include_directories : includes,
1840 link_with : [libshared],
1841 install_rpath : rootlibexecdir,
1843 install_dir : rootbindir)
1844 public_programs += exe
1846 if conf.get('HAVE_PAM') == 1
1847 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1848 pam_systemd = shared_library(
1852 include_directories : includes,
1853 link_args : ['-shared',
1854 '-Wl,--version-script=' + version_script_arg],
1855 link_with : [libsystemd_static,
1857 dependencies : [threads,
1860 link_depends : pam_systemd_sym,
1862 install_dir : pamlibdir)
1864 if want_tests != 'false'
1865 test('dlopen-pam_systemd',
1867 # path to dlopen must include a slash
1868 args : pam_systemd.full_path())
1872 executable('systemd-user-runtime-dir',
1873 user_runtime_dir_sources,
1874 include_directories : includes,
1875 link_with : [libshared],
1876 install_rpath : rootlibexecdir,
1878 install_dir : rootlibexecdir)
1881 if conf.get('HAVE_PAM') == 1
1882 executable('systemd-user-sessions',
1883 'src/user-sessions/user-sessions.c',
1884 include_directories : includes,
1885 link_with : [libshared],
1886 install_rpath : rootlibexecdir,
1888 install_dir : rootlibexecdir)
1891 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1892 exe = executable('bootctl',
1893 'src/boot/bootctl.c',
1894 include_directories : includes,
1895 link_with : [libshared],
1896 dependencies : [libblkid],
1897 install_rpath : rootlibexecdir,
1899 public_programs += exe
1901 executable('systemd-bless-boot',
1902 'src/boot/bless-boot.c',
1903 include_directories : includes,
1904 link_with : [libshared],
1905 dependencies : [libblkid],
1906 install_rpath : rootlibexecdir,
1908 install_dir : rootlibexecdir)
1910 executable('systemd-bless-boot-generator',
1911 'src/boot/bless-boot-generator.c',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 install_rpath : rootlibexecdir,
1916 install_dir : systemgeneratordir)
1919 executable('systemd-boot-check-no-failures',
1920 'src/boot/boot-check-no-failures.c',
1921 include_directories : includes,
1922 link_with : [libshared],
1923 dependencies : [libblkid],
1924 install_rpath : rootlibexecdir,
1926 install_dir : rootlibexecdir)
1928 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 dependencies : [threads],
1932 install_rpath : rootlibexecdir,
1934 public_programs += exe
1937 if get_option('link-systemctl-shared')
1938 systemctl_link_with = [libshared]
1940 systemctl_link_with = [libsystemd_static,
1946 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1947 include_directories : includes,
1948 link_with : systemctl_link_with,
1949 dependencies : [threads,
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootbindir)
1957 public_programs += exe
1959 if conf.get('ENABLE_PORTABLED') == 1
1960 executable('systemd-portabled',
1961 systemd_portabled_sources,
1962 include_directories : includes,
1963 link_with : [libshared],
1964 dependencies : [threads],
1965 install_rpath : rootlibexecdir,
1967 install_dir : rootlibexecdir)
1969 exe = executable('portablectl', 'src/portable/portablectl.c',
1970 include_directories : includes,
1971 link_with : [libshared],
1972 dependencies : [threads],
1973 install_rpath : rootlibexecdir,
1975 install_dir : rootbindir)
1976 public_programs += exe
1979 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1980 meson.add_install_script(meson_make_symlink,
1981 join_paths(rootbindir, 'systemctl'),
1982 join_paths(rootsbindir, alias))
1985 if conf.get('ENABLE_BACKLIGHT') == 1
1986 executable('systemd-backlight',
1987 'src/backlight/backlight.c',
1988 include_directories : includes,
1989 link_with : [libshared],
1990 install_rpath : rootlibexecdir,
1992 install_dir : rootlibexecdir)
1995 if conf.get('ENABLE_RFKILL') == 1
1996 executable('systemd-rfkill',
1997 'src/rfkill/rfkill.c',
1998 include_directories : includes,
1999 link_with : [libshared],
2000 install_rpath : rootlibexecdir,
2002 install_dir : rootlibexecdir)
2005 executable('systemd-system-update-generator',
2006 'src/system-update-generator/system-update-generator.c',
2007 include_directories : includes,
2008 link_with : [libshared],
2009 install_rpath : rootlibexecdir,
2011 install_dir : systemgeneratordir)
2013 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2014 executable('systemd-cryptsetup',
2015 'src/cryptsetup/cryptsetup.c',
2016 include_directories : includes,
2017 link_with : [libshared],
2018 dependencies : [libcryptsetup],
2019 install_rpath : rootlibexecdir,
2021 install_dir : rootlibexecdir)
2023 executable('systemd-cryptsetup-generator',
2024 'src/cryptsetup/cryptsetup-generator.c',
2025 include_directories : includes,
2026 link_with : [libshared],
2027 dependencies : [libcryptsetup],
2028 install_rpath : rootlibexecdir,
2030 install_dir : systemgeneratordir)
2032 executable('systemd-veritysetup',
2033 'src/veritysetup/veritysetup.c',
2034 include_directories : includes,
2035 link_with : [libshared],
2036 dependencies : [libcryptsetup],
2037 install_rpath : rootlibexecdir,
2039 install_dir : rootlibexecdir)
2041 executable('systemd-veritysetup-generator',
2042 'src/veritysetup/veritysetup-generator.c',
2043 include_directories : includes,
2044 link_with : [libshared],
2045 dependencies : [libcryptsetup],
2046 install_rpath : rootlibexecdir,
2048 install_dir : systemgeneratordir)
2051 if conf.get('HAVE_SYSV_COMPAT') == 1
2052 executable('systemd-sysv-generator',
2053 'src/sysv-generator/sysv-generator.c',
2054 include_directories : includes,
2055 link_with : [libshared],
2056 install_rpath : rootlibexecdir,
2058 install_dir : systemgeneratordir)
2060 executable('systemd-rc-local-generator',
2061 'src/rc-local-generator/rc-local-generator.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 install_rpath : rootlibexecdir,
2066 install_dir : systemgeneratordir)
2069 if conf.get('ENABLE_HOSTNAMED') == 1
2070 executable('systemd-hostnamed',
2071 'src/hostname/hostnamed.c',
2072 include_directories : includes,
2073 link_with : [libshared],
2074 install_rpath : rootlibexecdir,
2076 install_dir : rootlibexecdir)
2078 exe = executable('hostnamectl',
2079 'src/hostname/hostnamectl.c',
2080 include_directories : includes,
2081 link_with : [libshared],
2082 install_rpath : rootlibexecdir,
2084 public_programs += exe
2087 if conf.get('ENABLE_LOCALED') == 1
2088 if conf.get('HAVE_XKBCOMMON') == 1
2089 # logind will load libxkbcommon.so dynamically on its own
2095 executable('systemd-localed',
2096 systemd_localed_sources,
2097 include_directories : includes,
2098 link_with : [libshared],
2099 dependencies : deps,
2100 install_rpath : rootlibexecdir,
2102 install_dir : rootlibexecdir)
2104 exe = executable('localectl',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 install_rpath : rootlibexecdir,
2110 public_programs += exe
2113 if conf.get('ENABLE_TIMEDATED') == 1
2114 executable('systemd-timedated',
2115 'src/timedate/timedated.c',
2116 include_directories : includes,
2117 link_with : [libshared],
2118 install_rpath : rootlibexecdir,
2120 install_dir : rootlibexecdir)
2123 if conf.get('ENABLE_TIMEDATECTL') == 1
2124 exe = executable('timedatectl',
2125 'src/timedate/timedatectl.c',
2126 include_directories : includes,
2127 install_rpath : rootlibexecdir,
2128 link_with : [libshared],
2129 dependencies : [libm],
2131 public_programs += exe
2134 if conf.get('ENABLE_TIMESYNCD') == 1
2135 executable('systemd-timesyncd',
2136 systemd_timesyncd_sources,
2137 include_directories : includes,
2138 link_with : [libshared],
2139 dependencies : [threads,
2141 install_rpath : rootlibexecdir,
2143 install_dir : rootlibexecdir)
2145 executable('systemd-time-wait-sync',
2146 'src/time-wait-sync/time-wait-sync.c',
2147 include_directories : includes,
2148 link_with : [libshared],
2149 install_rpath : rootlibexecdir,
2151 install_dir : rootlibexecdir)
2154 if conf.get('ENABLE_MACHINED') == 1
2155 executable('systemd-machined',
2156 systemd_machined_sources,
2157 include_directories : includes,
2158 link_with : [libmachine_core,
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootlibexecdir)
2164 exe = executable('machinectl',
2165 'src/machine/machinectl.c',
2166 include_directories : includes,
2167 link_with : [libshared],
2168 dependencies : [threads,
2171 install_rpath : rootlibexecdir,
2173 install_dir : rootbindir)
2174 public_programs += exe
2177 if conf.get('ENABLE_IMPORTD') == 1
2178 executable('systemd-importd',
2179 systemd_importd_sources,
2180 include_directories : includes,
2181 link_with : [libshared],
2182 dependencies : [threads],
2183 install_rpath : rootlibexecdir,
2185 install_dir : rootlibexecdir)
2187 systemd_pull = executable('systemd-pull',
2188 systemd_pull_sources,
2189 include_directories : includes,
2190 link_with : [libshared],
2191 dependencies : [versiondep,
2197 install_rpath : rootlibexecdir,
2199 install_dir : rootlibexecdir)
2201 systemd_import = executable('systemd-import',
2202 systemd_import_sources,
2203 include_directories : includes,
2204 link_with : [libshared],
2205 dependencies : [libcurl,
2209 install_rpath : rootlibexecdir,
2211 install_dir : rootlibexecdir)
2213 systemd_import_fs = executable('systemd-import-fs',
2214 systemd_import_fs_sources,
2215 include_directories : includes,
2216 link_with : [libshared],
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootlibexecdir)
2221 systemd_export = executable('systemd-export',
2222 systemd_export_sources,
2223 include_directories : includes,
2224 link_with : [libshared],
2225 dependencies : [libcurl,
2229 install_rpath : rootlibexecdir,
2231 install_dir : rootlibexecdir)
2233 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2236 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2237 exe = executable('systemd-journal-upload',
2238 systemd_journal_upload_sources,
2239 include_directories : includes,
2240 link_with : [libshared],
2241 dependencies : [versiondep,
2247 install_rpath : rootlibexecdir,
2249 install_dir : rootlibexecdir)
2250 public_programs += exe
2253 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2254 s_j_remote = executable('systemd-journal-remote',
2255 systemd_journal_remote_sources,
2256 include_directories : includes,
2257 link_with : [libshared,
2258 libsystemd_journal_remote],
2259 dependencies : [threads,
2264 install_rpath : rootlibexecdir,
2266 install_dir : rootlibexecdir)
2268 s_j_gatewayd = executable('systemd-journal-gatewayd',
2269 systemd_journal_gatewayd_sources,
2270 include_directories : includes,
2271 link_with : [libshared],
2272 dependencies : [threads,
2277 install_rpath : rootlibexecdir,
2279 install_dir : rootlibexecdir)
2280 public_programs += [s_j_remote, s_j_gatewayd]
2283 if conf.get('ENABLE_COREDUMP') == 1
2284 executable('systemd-coredump',
2285 systemd_coredump_sources,
2286 include_directories : includes,
2287 link_with : [libshared],
2288 dependencies : [threads,
2293 install_rpath : rootlibexecdir,
2295 install_dir : rootlibexecdir)
2297 exe = executable('coredumpctl',
2298 coredumpctl_sources,
2299 include_directories : includes,
2300 link_with : [libshared],
2301 dependencies : [threads,
2304 install_rpath : rootlibexecdir,
2306 public_programs += exe
2309 if conf.get('ENABLE_BINFMT') == 1
2310 exe = executable('systemd-binfmt',
2311 'src/binfmt/binfmt.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2316 install_dir : rootlibexecdir)
2317 public_programs += exe
2319 meson.add_install_script('sh', '-c',
2320 mkdir_p.format(binfmtdir))
2321 meson.add_install_script('sh', '-c',
2322 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2325 if conf.get('ENABLE_VCONSOLE') == 1
2326 executable('systemd-vconsole-setup',
2327 'src/vconsole/vconsole-setup.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2332 install_dir : rootlibexecdir)
2335 if conf.get('ENABLE_RANDOMSEED') == 1
2336 executable('systemd-random-seed',
2337 'src/random-seed/random-seed.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2342 install_dir : rootlibexecdir)
2345 if conf.get('ENABLE_FIRSTBOOT') == 1
2346 executable('systemd-firstboot',
2347 'src/firstboot/firstboot.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 dependencies : [libcrypt],
2351 install_rpath : rootlibexecdir,
2353 install_dir : rootbindir)
2356 executable('systemd-remount-fs',
2357 'src/remount-fs/remount-fs.c',
2358 'src/core/mount-setup.c',
2359 'src/core/mount-setup.h',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootlibexecdir)
2366 executable('systemd-machine-id-setup',
2367 'src/machine-id-setup/machine-id-setup-main.c',
2368 'src/core/machine-id-setup.c',
2369 'src/core/machine-id-setup.h',
2370 include_directories : includes,
2371 link_with : [libshared],
2372 install_rpath : rootlibexecdir,
2374 install_dir : rootbindir)
2376 executable('systemd-fsck',
2378 include_directories : includes,
2379 link_with : [libshared],
2380 install_rpath : rootlibexecdir,
2382 install_dir : rootlibexecdir)
2384 executable('systemd-growfs',
2385 'src/partition/growfs.c',
2386 include_directories : includes,
2387 link_with : [libshared],
2388 dependencies : [libcryptsetup],
2389 install_rpath : rootlibexecdir,
2391 install_dir : rootlibexecdir)
2393 executable('systemd-makefs',
2394 'src/partition/makefs.c',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2399 install_dir : rootlibexecdir)
2401 executable('systemd-sleep',
2402 'src/sleep/sleep.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 install_rpath : rootlibexecdir,
2407 install_dir : rootlibexecdir)
2409 install_data('src/sleep/sleep.conf',
2410 install_dir : pkgsysconfdir)
2412 exe = executable('systemd-sysctl',
2413 'src/sysctl/sysctl.c',
2414 include_directories : includes,
2415 link_with : [libshared],
2416 install_rpath : rootlibexecdir,
2418 install_dir : rootlibexecdir)
2419 public_programs += exe
2421 executable('systemd-ac-power',
2422 'src/ac-power/ac-power.c',
2423 include_directories : includes,
2424 link_with : [libshared],
2425 install_rpath : rootlibexecdir,
2427 install_dir : rootlibexecdir)
2429 exe = executable('systemd-detect-virt',
2430 'src/detect-virt/detect-virt.c',
2431 include_directories : includes,
2432 link_with : [libshared],
2433 install_rpath : rootlibexecdir,
2435 public_programs += exe
2437 exe = executable('systemd-delta',
2438 'src/delta/delta.c',
2439 include_directories : includes,
2440 link_with : [libshared],
2441 install_rpath : rootlibexecdir,
2443 public_programs += exe
2445 exe = executable('systemd-escape',
2446 'src/escape/escape.c',
2447 include_directories : includes,
2448 link_with : [libshared],
2449 install_rpath : rootlibexecdir,
2451 install_dir : rootbindir)
2452 public_programs += exe
2454 exe = executable('systemd-notify',
2455 'src/notify/notify.c',
2456 include_directories : includes,
2457 link_with : [libshared],
2458 install_rpath : rootlibexecdir,
2460 install_dir : rootbindir)
2461 public_programs += exe
2463 executable('systemd-volatile-root',
2464 'src/volatile-root/volatile-root.c',
2465 include_directories : includes,
2466 link_with : [libshared],
2467 install_rpath : rootlibexecdir,
2469 install_dir : rootlibexecdir)
2471 executable('systemd-cgroups-agent',
2472 'src/cgroups-agent/cgroups-agent.c',
2473 include_directories : includes,
2474 link_with : [libshared],
2475 install_rpath : rootlibexecdir,
2477 install_dir : rootlibexecdir)
2479 exe = executable('systemd-id128',
2480 'src/id128/id128.c',
2481 include_directories : includes,
2482 link_with : [libshared],
2483 install_rpath : rootlibexecdir,
2485 public_programs += exe
2487 exe = executable('systemd-path',
2489 include_directories : includes,
2490 link_with : [libshared],
2491 install_rpath : rootlibexecdir,
2493 public_programs += exe
2495 exe = executable('systemd-ask-password',
2496 'src/ask-password/ask-password.c',
2497 include_directories : includes,
2498 link_with : [libshared],
2499 install_rpath : rootlibexecdir,
2501 install_dir : rootbindir)
2502 public_programs += exe
2504 executable('systemd-reply-password',
2505 'src/reply-password/reply-password.c',
2506 include_directories : includes,
2507 link_with : [libshared],
2508 install_rpath : rootlibexecdir,
2510 install_dir : rootlibexecdir)
2512 exe = executable('systemd-tty-ask-password-agent',
2513 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2514 include_directories : includes,
2515 link_with : [libshared],
2516 install_rpath : rootlibexecdir,
2518 install_dir : rootbindir)
2519 public_programs += exe
2521 exe = executable('systemd-cgls',
2523 include_directories : includes,
2524 link_with : [libshared],
2525 install_rpath : rootlibexecdir,
2527 public_programs += exe
2529 exe = executable('systemd-cgtop',
2530 'src/cgtop/cgtop.c',
2531 include_directories : includes,
2532 link_with : [libshared],
2533 install_rpath : rootlibexecdir,
2535 public_programs += exe
2537 executable('systemd-initctl',
2538 'src/initctl/initctl.c',
2539 include_directories : includes,
2540 link_with : [libshared],
2541 install_rpath : rootlibexecdir,
2543 install_dir : rootlibexecdir)
2545 exe = executable('systemd-mount',
2546 'src/mount/mount-tool.c',
2547 include_directories : includes,
2548 link_with : [libshared],
2549 install_rpath : rootlibexecdir,
2551 public_programs += exe
2553 meson.add_install_script(meson_make_symlink,
2554 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2556 exe = executable('systemd-run',
2558 include_directories : includes,
2559 link_with : [libshared],
2560 install_rpath : rootlibexecdir,
2562 public_programs += exe
2564 exe = executable('systemd-stdio-bridge',
2565 'src/stdio-bridge/stdio-bridge.c',
2566 include_directories : includes,
2567 link_with : [libshared],
2568 dependencies : [versiondep],
2569 install_rpath : rootlibexecdir,
2571 public_programs += exe
2573 exe = executable('busctl',
2574 'src/busctl/busctl.c',
2575 'src/busctl/busctl-introspect.c',
2576 'src/busctl/busctl-introspect.h',
2577 include_directories : includes,
2578 link_with : [libshared],
2579 install_rpath : rootlibexecdir,
2581 public_programs += exe
2583 if conf.get('ENABLE_SYSUSERS') == 1
2584 exe = executable('systemd-sysusers',
2585 'src/sysusers/sysusers.c',
2586 include_directories : includes,
2587 link_with : [libshared],
2588 install_rpath : rootlibexecdir,
2590 install_dir : rootbindir)
2591 public_programs += exe
2594 if conf.get('ENABLE_TMPFILES') == 1
2595 exe = executable('systemd-tmpfiles',
2596 'src/tmpfiles/tmpfiles.c',
2597 include_directories : includes,
2598 link_with : [libshared],
2599 dependencies : [libacl],
2600 install_rpath : rootlibexecdir,
2602 install_dir : rootbindir)
2603 public_programs += exe
2605 if want_tests != 'false'
2606 test('test-systemd-tmpfiles',
2607 test_systemd_tmpfiles_py,
2608 # https://github.com/mesonbuild/meson/issues/2681
2609 args : exe.full_path())
2613 if conf.get('ENABLE_HWDB') == 1
2614 exe = executable('systemd-hwdb',
2616 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2617 include_directories : includes,
2618 link_with : [libudev_static],
2619 install_rpath : udev_rpath,
2621 install_dir : rootbindir)
2622 public_programs += exe
2625 if conf.get('ENABLE_QUOTACHECK') == 1
2626 executable('systemd-quotacheck',
2627 'src/quotacheck/quotacheck.c',
2628 include_directories : includes,
2629 link_with : [libshared],
2630 install_rpath : rootlibexecdir,
2632 install_dir : rootlibexecdir)
2635 exe = executable('systemd-socket-proxyd',
2636 'src/socket-proxy/socket-proxyd.c',
2637 include_directories : includes,
2638 link_with : [libshared],
2639 dependencies : [threads],
2640 install_rpath : rootlibexecdir,
2642 install_dir : rootlibexecdir)
2643 public_programs += exe
2645 exe = executable('systemd-udevd',
2646 systemd_udevd_sources,
2647 include_directories : includes,
2648 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2649 link_with : [libudev_core,
2652 dependencies : [versiondep,
2658 install_rpath : udev_rpath,
2660 install_dir : rootlibexecdir)
2661 public_programs += exe
2663 exe = executable('udevadm',
2665 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2666 include_directories : includes,
2667 link_with : [libudev_core,
2670 dependencies : [versiondep,
2676 install_rpath : udev_rpath,
2678 install_dir : rootbindir)
2679 public_programs += exe
2681 executable('systemd-shutdown',
2682 systemd_shutdown_sources,
2683 'src/core/mount-setup.c',
2684 'src/core/mount-setup.h',
2685 'src/core/killall.c',
2686 'src/core/killall.h',
2687 include_directories : includes,
2688 link_with : [libshared],
2689 dependencies : [libmount],
2690 install_rpath : rootlibexecdir,
2692 install_dir : rootlibexecdir)
2694 executable('systemd-update-done',
2695 'src/update-done/update-done.c',
2696 include_directories : includes,
2697 link_with : [libshared],
2698 install_rpath : rootlibexecdir,
2700 install_dir : rootlibexecdir)
2702 executable('systemd-update-utmp',
2703 'src/update-utmp/update-utmp.c',
2704 include_directories : includes,
2705 link_with : [libshared],
2706 dependencies : [libaudit],
2707 install_rpath : rootlibexecdir,
2709 install_dir : rootlibexecdir)
2711 if conf.get('HAVE_KMOD') == 1
2712 executable('systemd-modules-load',
2713 'src/modules-load/modules-load.c',
2714 include_directories : includes,
2715 link_with : [libshared],
2716 dependencies : [libkmod],
2717 install_rpath : rootlibexecdir,
2719 install_dir : rootlibexecdir)
2721 meson.add_install_script('sh', '-c',
2722 mkdir_p.format(modulesloaddir))
2723 meson.add_install_script('sh', '-c',
2724 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2727 exe = executable('systemd-nspawn',
2728 systemd_nspawn_sources,
2729 'src/core/mount-setup.c', # FIXME: use a variable?
2730 'src/core/mount-setup.h',
2731 'src/core/loopback-setup.c',
2732 'src/core/loopback-setup.h',
2733 include_directories : includes,
2734 link_with : [libnspawn_core,
2736 dependencies : [libblkid],
2737 install_rpath : rootlibexecdir,
2739 public_programs += exe
2741 if conf.get('ENABLE_NETWORKD') == 1
2742 executable('systemd-networkd',
2743 systemd_networkd_sources,
2744 include_directories : includes,
2745 link_with : [libnetworkd_core,
2749 dependencies : [threads],
2750 install_rpath : rootlibexecdir,
2752 install_dir : rootlibexecdir)
2754 executable('systemd-networkd-wait-online',
2755 systemd_networkd_wait_online_sources,
2756 include_directories : includes,
2757 link_with : [libnetworkd_core,
2759 install_rpath : rootlibexecdir,
2761 install_dir : rootlibexecdir)
2763 exe = executable('networkctl',
2765 include_directories : includes,
2766 link_with : [libsystemd_network,
2768 install_rpath : rootlibexecdir,
2770 install_dir : rootbindir)
2771 public_programs += exe
2774 executable('systemd-sulogin-shell',
2775 ['src/sulogin-shell/sulogin-shell.c'],
2776 include_directories : includes,
2777 link_with : [libshared],
2778 install_rpath : rootlibexecdir,
2780 install_dir : rootlibexecdir)
2782 ############################################################
2785 'systemd-runtest.env',
2786 output : 'systemd-runtest.env',
2787 command : ['sh', '-c', '{ ' +
2788 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2789 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2791 build_by_default : true)
2793 foreach tuple : tests
2795 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2796 dependencies = tuple[2]
2797 condition = tuple.length() >= 4 ? tuple[3] : ''
2798 type = tuple.length() >= 5 ? tuple[4] : ''
2799 defs = tuple.length() >= 6 ? tuple[5] : []
2800 incs = tuple.length() >= 7 ? tuple[6] : includes
2803 name = sources[0].split('/')[-1].split('.')[0]
2804 if type.startswith('timeout=')
2805 timeout = type.split('=')[1].to_int()
2809 if condition == '' or conf.get(condition) == 1
2813 include_directories : incs,
2814 link_with : link_with,
2815 dependencies : [versiondep,
2818 build_by_default : want_tests != 'false',
2819 install_rpath : rootlibexecdir,
2820 install : install_tests,
2821 install_dir : join_paths(testsdir, type))
2824 message('@0@ is a manual test'.format(name))
2825 elif type == 'unsafe' and want_tests != 'unsafe'
2826 message('@0@ is an unsafe test'.format(name))
2827 elif want_tests != 'false'
2833 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2838 'test-libsystemd-sym',
2839 test_libsystemd_sym_c,
2840 include_directories : includes,
2841 link_with : [libsystemd],
2842 build_by_default : want_tests != 'false',
2843 install : install_tests,
2844 install_dir : testsdir)
2845 if want_tests != 'false'
2846 test('test-libsystemd-sym', exe)
2850 'test-libsystemd-static-sym',
2851 test_libsystemd_sym_c,
2852 include_directories : includes,
2853 link_with : [install_libsystemd_static],
2854 dependencies : [threads], # threads is already included in dependencies on the library,
2855 # but does not seem to get propagated. Add here as a work-around.
2856 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2857 install : install_tests and static_libsystemd_pic,
2858 install_dir : testsdir)
2859 if want_tests != 'false' and static_libsystemd_pic
2860 test('test-libsystemd-static-sym', exe)
2866 include_directories : includes,
2867 c_args : '-Wno-deprecated-declarations',
2868 link_with : [libudev],
2869 build_by_default : want_tests != 'false',
2870 install : install_tests,
2871 install_dir : testsdir)
2872 if want_tests != 'false'
2873 test('test-libudev-sym', exe)
2877 'test-libudev-static-sym',
2879 include_directories : includes,
2880 c_args : '-Wno-deprecated-declarations',
2881 link_with : [install_libudev_static],
2882 build_by_default : want_tests != 'false' and static_libudev_pic,
2883 install : install_tests and static_libudev_pic,
2884 install_dir : testsdir)
2885 if want_tests != 'false' and static_libudev_pic
2886 test('test-libudev-static-sym', exe)
2889 ############################################################
2893 if get_option('tests') != 'false'
2894 foreach tuple : fuzzers
2896 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2897 dependencies = tuple[2]
2898 defs = tuple.length() >= 4 ? tuple[3] : []
2899 incs = tuple.length() >= 5 ? tuple[4] : includes
2902 dependencies += fuzzing_engine
2904 sources += 'src/fuzz/fuzz-main.c'
2907 name = sources[0].split('/')[-1].split('.')[0]
2909 fuzzer_exes += executable(
2912 include_directories : [incs, include_directories('src/fuzz')],
2913 link_with : link_with,
2914 dependencies : dependencies,
2920 run_target('fuzzers',
2921 depends : fuzzer_exes,
2924 ############################################################
2926 make_directive_index_py = find_program('tools/make-directive-index.py')
2927 make_man_index_py = find_program('tools/make-man-index.py')
2928 xml_helper_py = find_program('tools/xml_helper.py')
2929 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2933 subdir('sysusers.d')
2934 subdir('tmpfiles.d')
2939 subdir('shell-completion/bash')
2940 subdir('shell-completion/zsh')
2941 subdir('docs/sysvinit')
2942 subdir('docs/var-log')
2944 install_subdir('factory/etc',
2945 install_dir : factorydir)
2947 install_data('xorg/50-systemd-user.sh',
2948 install_dir : xinitrcdir)
2949 install_data('modprobe.d/systemd.conf',
2950 install_dir : modprobedir)
2951 install_data('LICENSE.GPL2',
2955 'docs/CODING_STYLE.md',
2956 'docs/DISTRO_PORTING.md',
2957 'docs/ENVIRONMENT.md',
2959 'docs/TRANSIENT-SETTINGS.md',
2960 'docs/TRANSLATORS.md',
2961 'docs/UIDS-GIDS.md',
2962 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2963 install_dir : docdir)
2965 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2966 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2968 ############################################################
2970 meson_check_help = find_program('tools/meson-check-help.sh')
2972 foreach exec : public_programs
2973 name = exec.full_path().split('/')[-1]
2974 if want_tests != 'false'
2975 test('check-help-' + name,
2977 args : exec.full_path())
2981 ############################################################
2983 # Enable tests for all supported sanitizers
2984 foreach tuple : sanitizers
2985 sanitizer = tuple[0]
2988 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2990 foreach p : fuzz_regression_tests
2991 b = p.split('/')[-2]
2992 c = p.split('/')[-1]
2994 name = '@0@:@1@'.format(b, sanitizer)
2997 if want_tests == 'false'
2998 message('Not compiling @0@ because tests is set to false'.format(name))
3000 exe = custom_target(
3004 command : [env, 'ln', '-fs',
3005 join_paths(build.full_path(), b),
3007 build_by_default : true)
3009 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3014 if want_tests != 'false' and slow_tests
3015 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3017 args : [exe.full_path(),
3018 join_paths(meson.source_root(), p)])
3025 ############################################################
3028 all_files = run_command(
3030 ['--git-dir=@0@/.git'.format(meson.source_root()),
3033 all_files = files(all_files.stdout().split())
3038 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3041 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3045 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3048 command : [meson_git_contrib_sh])
3052 git_head = run_command(
3054 ['--git-dir=@0@/.git'.format(meson.source_root()),
3055 'rev-parse', 'HEAD']).stdout().strip()
3056 git_head_short = run_command(
3058 ['--git-dir=@0@/.git'.format(meson.source_root()),
3059 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3063 command : ['git', 'archive',
3064 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3066 '--prefix', 'systemd-@0@/'.format(git_head),
3070 ############################################################
3072 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3075 depends : [man, libsystemd, libudev],
3076 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3078 ############################################################
3081 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3083 'split /usr: @0@'.format(split_usr),
3084 'split bin-sbin: @0@'.format(split_bin),
3085 'prefix directory: @0@'.format(prefixdir),
3086 'rootprefix directory: @0@'.format(rootprefixdir),
3087 'sysconf directory: @0@'.format(sysconfdir),
3088 'include directory: @0@'.format(includedir),
3089 'lib directory: @0@'.format(libdir),
3090 'rootlib directory: @0@'.format(rootlibdir),
3091 'SysV init scripts: @0@'.format(sysvinit_path),
3092 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3093 'PAM modules directory: @0@'.format(pamlibdir),
3094 'PAM configuration directory: @0@'.format(pamconfdir),
3095 'RPM macros directory: @0@'.format(rpmmacrosdir),
3096 'modprobe.d directory: @0@'.format(modprobedir),
3097 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3098 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3099 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3100 'bash completions directory: @0@'.format(bashcompletiondir),
3101 'zsh completions directory: @0@'.format(zshcompletiondir),
3102 'extra start script: @0@'.format(get_option('rc-local')),
3103 'extra stop script: @0@'.format(get_option('halt-local')),
3104 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3105 get_option('debug-tty')),
3106 'TTY GID: @0@'.format(tty_gid),
3107 'users GID: @0@'.format(substs.get('USERS_GID')),
3108 'maximum system UID: @0@'.format(system_uid_max),
3109 'maximum system GID: @0@'.format(system_gid_max),
3110 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3111 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3112 'minimum container UID base: @0@'.format(container_uid_base_min),
3113 'maximum container UID base: @0@'.format(container_uid_base_max),
3114 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3115 'render group access mode: @0@'.format(get_option('group-render-mode')),
3116 'certificate root directory: @0@'.format(get_option('certificate-root')),
3117 'support URL: @0@'.format(support_url),
3118 'nobody user name: @0@'.format(nobody_user),
3119 'nobody group name: @0@'.format(nobody_group),
3120 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3121 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3123 'default DNSSEC mode: @0@'.format(default_dnssec),
3124 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3125 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3126 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3127 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3128 'default locale: @0@'.format(default_locale)]
3130 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3131 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3133 'default DNS servers: @0@'.format(alt_dns_servers),
3134 'default NTP servers: @0@'.format(alt_ntp_servers)]
3136 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3137 '@@0@'.format(time_epoch)).stdout().strip()
3139 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3142 'static libsystemd: @0@'.format(static_libsystemd),
3143 'static libudev: @0@'.format(static_libudev)]
3146 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3147 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3148 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3150 if conf.get('ENABLE_EFI') == 1
3151 status += 'efi arch: @0@'.format(efi_arch)
3155 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3156 'EFI CC @0@'.format(' '.join(efi_cc)),
3157 'EFI lib directory: @0@'.format(efi_libdir),
3158 'EFI lds directory: @0@'.format(efi_ldsdir),
3159 'EFI include directory: @0@'.format(efi_incdir)]
3211 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3212 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3215 ['legacy pkla', install_polkit_pkla],
3217 ['gnu-efi', have_gnu_efi],
3230 ['man pages', want_man],
3231 ['html pages', want_html],
3232 ['man page indices', want_man and have_lxml],
3237 ['adm group', get_option('adm-group')],
3238 ['wheel group', get_option('wheel-group')],
3241 ['debug mmap cache'],
3244 ['valgrind', conf.get('VALGRIND') == 1],
3245 ['trace logging', conf.get('LOG_TRACE') == 1],
3246 ['link-udev-shared', get_option('link-udev-shared')],
3247 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3250 if tuple.length() >= 2
3253 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3254 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3255 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3266 'enabled features: @0@'.format(', '.join(found)),
3268 'disabled features: @0@'.format(', '.join(missing)),
3270 message('\n '.join(status))
3272 if rootprefixdir != rootprefix_default
3274 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3275 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3276 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))