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
70 sysvinit_path = get_option('sysvinit-path')
71 sysvrcnd_path = get_option('sysvrcnd-path')
72 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
73 description : 'SysV init scripts and rcN.d links are supported')
75 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
76 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
77 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
79 # join_paths ignore the preceding arguments if an absolute component is
80 # encountered, so this should canonicalize various paths when they are
81 # absolute or relative.
82 prefixdir = get_option('prefix')
83 if not prefixdir.startswith('/')
84 error('Prefix is not absolute: "@0@"'.format(prefixdir))
86 bindir = join_paths(prefixdir, get_option('bindir'))
87 libdir = join_paths(prefixdir, get_option('libdir'))
88 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
89 includedir = join_paths(prefixdir, get_option('includedir'))
90 datadir = join_paths(prefixdir, get_option('datadir'))
91 localstatedir = join_paths('/', get_option('localstatedir'))
93 rootbindir = join_paths(rootprefixdir, 'bin')
94 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
95 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
97 rootlibdir = get_option('rootlibdir')
99 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
102 # Dirs of external packages
103 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
104 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
105 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
106 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
107 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
108 varlogdir = join_paths(localstatedir, 'log')
109 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
110 rpmmacrosdir = get_option('rpmmacrosdir')
111 if rpmmacrosdir != 'no'
112 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
114 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
117 pkgdatadir = join_paths(datadir, 'systemd')
118 environmentdir = join_paths(prefixdir, 'lib/environment.d')
119 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
120 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
121 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
122 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
123 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
124 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
125 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
126 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
127 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
128 pkgincludedir = join_paths(includedir, 'systemd')
129 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
130 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
131 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
132 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
133 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
134 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
135 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
136 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
137 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
138 udevhomedir = udevlibexecdir
139 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
140 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
141 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
142 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
143 factorydir = join_paths(datadir, 'factory')
144 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
145 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
146 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
147 catalogstatedir = join_paths(systemdstatedir, 'catalog')
148 randomseeddir = join_paths(localstatedir, 'lib/systemd')
149 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
151 docdir = get_option('docdir')
153 docdir = join_paths(datadir, 'doc/systemd')
156 dbuspolicydir = get_option('dbuspolicydir')
157 if dbuspolicydir == ''
158 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
161 dbussessionservicedir = get_option('dbussessionservicedir')
162 if dbussessionservicedir == ''
163 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
166 dbussystemservicedir = get_option('dbussystemservicedir')
167 if dbussystemservicedir == ''
168 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
171 pamlibdir = get_option('pamlibdir')
173 pamlibdir = join_paths(rootlibdir, 'security')
176 pamconfdir = get_option('pamconfdir')
178 pamconfdir = join_paths(sysconfdir, 'pam.d')
181 memory_accounting_default = get_option('memory-accounting-default')
183 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
184 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
185 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
186 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
187 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
188 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
189 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
191 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
193 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
194 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
195 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
196 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
197 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
198 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
199 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
200 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
201 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
202 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
203 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
204 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
205 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
206 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
207 conf.set_quoted('ROOTPREFIX', rootprefixdir)
208 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
209 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
210 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
211 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
212 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
213 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
214 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
215 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
216 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
217 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
218 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
219 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
220 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
221 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
222 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
223 conf.set_quoted('LIBDIR', libdir)
224 conf.set_quoted('ROOTLIBDIR', rootlibdir)
225 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
226 conf.set_quoted('BOOTLIBDIR', bootlibdir)
227 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
228 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
229 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
230 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
231 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
232 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
233 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
234 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
235 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
237 substs.set('prefix', prefixdir)
238 substs.set('exec_prefix', prefixdir)
239 substs.set('libdir', libdir)
240 substs.set('rootlibdir', rootlibdir)
241 substs.set('includedir', includedir)
242 substs.set('pkgsysconfdir', pkgsysconfdir)
243 substs.set('bindir', bindir)
244 substs.set('rootbindir', rootbindir)
245 substs.set('rootlibexecdir', rootlibexecdir)
246 substs.set('systemunitdir', systemunitdir)
247 substs.set('userunitdir', userunitdir)
248 substs.set('systempresetdir', systempresetdir)
249 substs.set('userpresetdir', userpresetdir)
250 substs.set('udevhwdbdir', udevhwdbdir)
251 substs.set('udevrulesdir', udevrulesdir)
252 substs.set('udevlibexecdir', udevlibexecdir)
253 substs.set('environmentdir', environmentdir)
254 substs.set('catalogdir', catalogdir)
255 substs.set('tmpfilesdir', tmpfilesdir)
256 substs.set('sysusersdir', sysusersdir)
257 substs.set('sysctldir', sysctldir)
258 substs.set('binfmtdir', binfmtdir)
259 substs.set('modulesloaddir', modulesloaddir)
260 substs.set('modprobedir', modprobedir)
261 substs.set('systemgeneratordir', systemgeneratordir)
262 substs.set('usergeneratordir', usergeneratordir)
263 substs.set('systemenvgeneratordir', systemenvgeneratordir)
264 substs.set('userenvgeneratordir', userenvgeneratordir)
265 substs.set('systemshutdowndir', systemshutdowndir)
266 substs.set('systemsleepdir', systemsleepdir)
267 substs.set('VARLOGDIR', varlogdir)
268 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
269 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
270 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
271 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
272 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
273 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
274 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
275 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
276 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
278 #####################################################################
280 cc = meson.get_compiler('c')
281 pkgconfig = import('pkgconfig')
282 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
283 meson_build_sh = find_program('tools/meson-build.sh')
285 want_tests = get_option('tests')
286 slow_tests = want_tests != 'false' and get_option('slow-tests')
287 install_tests = get_option('install-tests')
289 if add_languages('cpp', required : fuzzer_build)
290 # Used only for tests
291 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
297 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
299 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
302 possible_cc_flags = [
306 '-Wmissing-include-dirs',
307 '-Wold-style-definition',
311 '-Wsuggest-attribute=noreturn',
312 '-Werror=missing-prototypes',
313 '-Werror=implicit-function-declaration',
314 '-Werror=missing-declarations',
315 '-Werror=return-type',
316 '-Werror=incompatible-pointer-types',
318 '-Wstrict-prototypes',
320 '-Wmissing-noreturn',
321 '-Wimplicit-fallthrough=5',
324 '-Wstrict-aliasing=2',
327 '-Werror=shift-count-overflow',
328 '-Werror=shift-overflow=2',
332 # negative arguments are correctly detected starting with meson 0.46.
333 '-Wno-unused-parameter',
334 '-Wno-missing-field-initializers',
335 '-Wno-unused-result',
336 '-Wno-format-signedness',
338 # work-around for gcc 7.1 turning this on on its own.
339 '-Wno-error=nonnull',
341 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
342 # optimizations enabled, producing essentially false positives.
343 '-Wno-maybe-uninitialized',
347 '-fdiagnostics-show-option',
348 '-fno-strict-aliasing',
349 '-fvisibility=hidden',
351 '-fstack-protector-strong',
352 '--param=ssp-buffer-size=4',
355 # --as-needed and --no-undefined are provided by meson by default,
356 # run mesonconf to see what is enabled
357 possible_link_flags = [
362 if cc.get_id() == 'clang'
363 possible_cc_flags += [
364 '-Wno-typedef-redefinition',
365 '-Wno-gnu-variable-sized-type-not-at-end',
369 if get_option('buildtype') != 'debug'
370 possible_cc_flags += [
371 '-ffunction-sections',
375 possible_link_flags += '-Wl,--gc-sections'
378 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
379 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
383 #include <inttypes.h>
384 typedef uint64_t usec_t;
385 usec_t now(clockid_t clock);
390 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
391 add_project_arguments('-Werror=shadow', language : 'c')
394 cpp = ' '.join(cc.cmd_array()) + ' -E'
396 #####################################################################
397 # compilation result tests
399 conf.set('_GNU_SOURCE', true)
400 conf.set('__SANE_USERSPACE_TYPES__', true)
402 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
403 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
404 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
405 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
406 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
407 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
408 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
412 #include <linux/ethtool.h>
413 #include <linux/fib_rules.h>
414 #include <sys/stat.h>
417 foreach decl : ['char16_t',
419 'struct fib_rule_uid_range',
420 'struct fib_rule_port_range',
424 # We get -1 if the size cannot be determined
425 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
427 if decl == 'struct statx'
429 want_linux_stat_h = false
431 have = cc.sizeof(decl,
432 prefix : decl_headers + '#include <linux/stat.h>',
433 args : '-D_GNU_SOURCE') > 0
434 want_linux_stat_h = have
438 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
441 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
443 foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
444 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
445 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
446 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
447 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
448 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
449 ['FRA_TUN_ID', 'linux/fib_rules.h'],
450 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
451 ['FRA_PAD', 'linux/fib_rules.h'],
452 ['FRA_L3MDEV', 'linux/fib_rules.h'],
453 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
454 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
455 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
456 ['FOU_CMD_GET', 'linux/fou.h'],
457 ['IFA_FLAGS', 'linux/if_addr.h'],
458 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
459 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
460 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
461 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
462 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
463 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
464 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
465 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
466 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
467 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
468 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
469 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
470 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
471 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
472 ['IFLA_PAD', 'linux/if_link.h'],
473 ['IFLA_XDP', 'linux/if_link.h'],
474 ['IFLA_EVENT', 'linux/if_link.h'],
475 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
476 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
477 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
478 ['IFLA_MAX_MTU', 'linux/if_link.h'],
479 ['IFLA_BOND_MODE', 'linux/if_link.h'],
480 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
481 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
482 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
483 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
484 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
485 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
486 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
487 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
488 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
489 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
490 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
491 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
492 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
493 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
494 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
495 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
496 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
497 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
498 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
499 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
500 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
501 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
502 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
503 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
504 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
505 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
506 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
507 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
508 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
509 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
510 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
511 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
512 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
513 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
514 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
515 # if_tunnel.h is buggy and cannot be included on its own
516 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
517 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
518 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
519 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
520 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
521 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
522 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
523 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
524 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
525 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
526 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
528 prefix = decl.length() > 2 ? decl[2] : ''
529 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
530 conf.set10('HAVE_' + decl[0], have)
533 foreach ident : ['secure_getenv', '__secure_getenv']
534 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
538 ['memfd_create', '''#include <sys/mman.h>'''],
539 ['gettid', '''#include <sys/types.h>
540 #include <unistd.h>'''],
541 ['pivot_root', '''#include <stdlib.h>
542 #include <unistd.h>'''], # no known header declares pivot_root
543 ['name_to_handle_at', '''#include <sys/types.h>
544 #include <sys/stat.h>
545 #include <fcntl.h>'''],
546 ['setns', '''#include <sched.h>'''],
547 ['renameat2', '''#include <stdio.h>
548 #include <fcntl.h>'''],
549 ['kcmp', '''#include <linux/kcmp.h>'''],
550 ['keyctl', '''#include <sys/types.h>
551 #include <keyutils.h>'''],
552 ['copy_file_range', '''#include <sys/syscall.h>
553 #include <unistd.h>'''],
554 ['bpf', '''#include <sys/syscall.h>
555 #include <unistd.h>'''],
556 ['statx', '''#include <sys/types.h>
557 #include <sys/stat.h>
558 #include <unistd.h>'''],
559 ['explicit_bzero' , '''#include <string.h>'''],
560 ['reallocarray', '''#include <malloc.h>'''],
563 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
564 conf.set10('HAVE_' + ident[0].to_upper(), have)
567 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
568 conf.set10('USE_SYS_RANDOM_H', true)
569 conf.set10('HAVE_GETRANDOM', true)
571 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
572 conf.set10('USE_SYS_RANDOM_H', false)
573 conf.set10('HAVE_GETRANDOM', have)
576 #####################################################################
578 vcs_tagger = [meson.source_root() + '/tools/meson-vcs-tag.sh',
580 get_option('version-tag'),
581 meson.project_version()]
584 input : 'src/version/version.h.in',
585 output : 'version.h',
588 versiondep = declare_dependency(sources: version_h)
590 sed = find_program('sed')
591 awk = find_program('awk')
592 m4 = find_program('m4')
593 stat = find_program('stat')
594 git = find_program('git', required : false)
595 env = find_program('env')
596 perl = find_program('perl', required : false)
598 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
599 mkdir_p = 'mkdir -p $DESTDIR/@0@'
600 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
601 splash_bmp = files('test/splash.bmp')
603 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
604 # /usr/sbin, /sbin, and fall back to the default from middle column.
605 progs = [['quotaon', '/usr/sbin/quotaon' ],
606 ['quotacheck', '/usr/sbin/quotacheck' ],
607 ['kmod', '/usr/bin/kmod' ],
608 ['kexec', '/usr/sbin/kexec' ],
609 ['sulogin', '/usr/sbin/sulogin' ],
610 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
611 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
612 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
613 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
616 path = get_option(prog[0] + '-path')
618 message('Using @1@ for @0@'.format(prog[0], path))
620 exe = find_program(prog[0],
621 '/usr/sbin/' + prog[0],
624 path = exe.found() ? exe.path() : prog[1]
626 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
627 conf.set_quoted(name, path)
628 substs.set(name, path)
631 conf.set_quoted('TELINIT', get_option('telinit-path'))
633 if run_command('ln', '--relative', '--help').returncode() != 0
634 error('ln does not support --relative (added in coreutils 8.16)')
637 ############################################################
639 gperf = find_program('gperf')
641 gperf_test_format = '''
643 const char * in_word_set(const char *, @0@);
646 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
647 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
648 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
649 if cc.compiles(gperf_test)
650 gperf_len_type = 'size_t'
652 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
653 if cc.compiles(gperf_test)
654 gperf_len_type = 'unsigned'
656 error('unable to determine gperf len type')
659 message('gperf len type is @0@'.format(gperf_len_type))
660 conf.set('GPERF_LEN_TYPE', gperf_len_type,
661 description : 'The type of gperf "len" parameter')
663 ############################################################
665 if not cc.has_header('sys/capability.h')
666 error('POSIX caps headers not found')
668 foreach header : ['crypt.h',
669 'linux/btrfs_tree.h',
672 'linux/vm_sockets.h',
675 'valgrind/memcheck.h',
676 'valgrind/valgrind.h',
679 conf.set10('HAVE_' + header.underscorify().to_upper(),
680 cc.has_header(header))
683 ############################################################
685 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
686 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
687 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
689 default_hierarchy = get_option('default-hierarchy')
690 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
691 description : 'default cgroup hierarchy as string')
692 if default_hierarchy == 'legacy'
693 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
694 elif default_hierarchy == 'hybrid'
695 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
697 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
700 default_net_naming_scheme = get_option('default-net-naming-scheme')
701 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
703 time_epoch = get_option('time-epoch')
706 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
708 conf.set('TIME_EPOCH', time_epoch)
710 system_uid_max = get_option('system-uid-max')
711 if system_uid_max == -1
712 system_uid_max = run_command(
714 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
715 '/etc/login.defs').stdout().strip()
716 if system_uid_max == ''
719 system_uid_max = system_uid_max.to_int()
722 conf.set('SYSTEM_UID_MAX', system_uid_max)
723 substs.set('systemuidmax', system_uid_max)
725 system_gid_max = get_option('system-gid-max')
726 if system_gid_max == -1
727 system_gid_max = run_command(
729 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
730 '/etc/login.defs').stdout().strip()
731 if system_gid_max == ''
734 system_gid_max = system_gid_max.to_int()
737 conf.set('SYSTEM_GID_MAX', system_gid_max)
738 substs.set('systemgidmax', system_gid_max)
740 dynamic_uid_min = get_option('dynamic-uid-min')
741 dynamic_uid_max = get_option('dynamic-uid-max')
742 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
743 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
744 substs.set('dynamicuidmin', dynamic_uid_min)
745 substs.set('dynamicuidmax', dynamic_uid_max)
747 container_uid_base_min = get_option('container-uid-base-min')
748 container_uid_base_max = get_option('container-uid-base-max')
749 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
750 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
751 substs.set('containeruidbasemin', container_uid_base_min)
752 substs.set('containeruidbasemax', container_uid_base_max)
754 nobody_user = get_option('nobody-user')
755 nobody_group = get_option('nobody-group')
757 if not meson.is_cross_build()
758 getent_result = run_command('getent', 'passwd', '65534')
759 if getent_result.returncode() == 0
760 name = getent_result.stdout().split(':')[0]
761 if name != nobody_user
763 '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) +
764 'Your build will result in an user table setup that is incompatible with the local system.')
767 id_result = run_command('id', '-u', nobody_user)
768 if id_result.returncode() == 0
769 id = id_result.stdout().to_int()
772 '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) +
773 'Your build will result in an user table setup that is incompatible with the local system.')
777 getent_result = run_command('getent', 'group', '65534')
778 if getent_result.returncode() == 0
779 name = getent_result.stdout().split(':')[0]
780 if name != nobody_group
782 '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) +
783 'Your build will result in an group table setup that is incompatible with the local system.')
786 id_result = run_command('id', '-g', nobody_group)
787 if id_result.returncode() == 0
788 id = id_result.stdout().to_int()
791 '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) +
792 'Your build will result in an group table setup that is incompatible with the local system.')
796 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
798 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
799 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
802 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
803 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
804 substs.set('NOBODY_USER_NAME', nobody_user)
805 substs.set('NOBODY_GROUP_NAME', nobody_group)
807 tty_gid = get_option('tty-gid')
808 conf.set('TTY_GID', tty_gid)
809 substs.set('TTY_GID', tty_gid)
811 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
812 users_gid = get_option('users-gid')
813 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
815 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
816 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
818 dev_kvm_mode = get_option('dev-kvm-mode')
819 substs.set('DEV_KVM_MODE', dev_kvm_mode)
820 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
821 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
823 kill_user_processes = get_option('default-kill-user-processes')
824 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
825 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
826 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
828 dns_servers = get_option('dns-servers')
829 conf.set_quoted('DNS_SERVERS', dns_servers)
830 substs.set('DNS_SERVERS', dns_servers)
832 ntp_servers = get_option('ntp-servers')
833 conf.set_quoted('NTP_SERVERS', ntp_servers)
834 substs.set('NTP_SERVERS', ntp_servers)
836 default_locale = get_option('default-locale')
837 if default_locale == ''
838 if not meson.is_cross_build()
839 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
840 default_locale = run_command(choose_default_locale_sh).stdout().strip()
842 default_locale = 'C.UTF-8'
845 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
847 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
849 substs.set('SUSHELL', get_option('debug-shell'))
850 substs.set('DEBUGTTY', get_option('debug-tty'))
852 enable_debug_hashmap = false
853 enable_debug_mmap_cache = false
854 enable_debug_siphash = false
855 enable_debug_udev = false
856 foreach name : get_option('debug-extra')
858 enable_debug_hashmap = true
859 elif name == 'mmap-cache'
860 enable_debug_mmap_cache = true
861 elif name == 'siphash'
862 enable_debug_siphash = true
864 enable_debug_udev = true
866 message('unknown debug option "@0@", ignoring'.format(name))
869 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
870 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
871 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
872 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
874 conf.set10('VALGRIND', get_option('valgrind'))
875 conf.set10('LOG_TRACE', get_option('log-trace'))
877 #####################################################################
879 threads = dependency('threads')
880 librt = cc.find_library('rt')
881 libm = cc.find_library('m')
882 libdl = cc.find_library('dl')
883 libcrypt = cc.find_library('crypt')
885 libcap = dependency('libcap', required : false)
886 if not libcap.found()
887 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
888 libcap = cc.find_library('cap')
891 libmount = dependency('mount',
892 version : fuzzer_build ? '>= 0' : '>= 2.30')
894 want_seccomp = get_option('seccomp')
895 if want_seccomp != 'false' and not fuzzer_build
896 libseccomp = dependency('libseccomp',
897 version : '>= 2.3.1',
898 required : want_seccomp == 'true')
899 have = libseccomp.found()
904 conf.set10('HAVE_SECCOMP', have)
906 want_selinux = get_option('selinux')
907 if want_selinux != 'false' and not fuzzer_build
908 libselinux = dependency('libselinux',
909 version : '>= 2.1.9',
910 required : want_selinux == 'true')
911 have = libselinux.found()
916 conf.set10('HAVE_SELINUX', have)
918 want_apparmor = get_option('apparmor')
919 if want_apparmor != 'false' and not fuzzer_build
920 libapparmor = dependency('libapparmor',
921 required : want_apparmor == 'true')
922 have = libapparmor.found()
927 conf.set10('HAVE_APPARMOR', have)
929 smack_run_label = get_option('smack-run-label')
930 if smack_run_label != ''
931 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
934 want_polkit = get_option('polkit')
935 install_polkit = false
936 install_polkit_pkla = false
937 if want_polkit != 'false' and not fuzzer_build
938 install_polkit = true
940 libpolkit = dependency('polkit-gobject-1',
942 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
943 message('Old polkit detected, will install pkla files')
944 install_polkit_pkla = true
947 conf.set10('ENABLE_POLKIT', install_polkit)
949 want_acl = get_option('acl')
950 if want_acl != 'false' and not fuzzer_build
951 libacl = cc.find_library('acl', required : want_acl == 'true')
952 have = libacl.found()
957 conf.set10('HAVE_ACL', have)
959 want_audit = get_option('audit')
960 if want_audit != 'false' and not fuzzer_build
961 libaudit = dependency('audit', required : want_audit == 'true')
962 have = libaudit.found()
967 conf.set10('HAVE_AUDIT', have)
969 want_blkid = get_option('blkid')
970 if want_blkid != 'false' and not fuzzer_build
971 libblkid = dependency('blkid', required : want_blkid == 'true')
972 have = libblkid.found()
977 conf.set10('HAVE_BLKID', have)
979 want_kmod = get_option('kmod')
980 if want_kmod != 'false' and not fuzzer_build
981 libkmod = dependency('libkmod',
983 required : want_kmod == 'true')
984 have = libkmod.found()
989 conf.set10('HAVE_KMOD', have)
991 want_pam = get_option('pam')
992 if want_pam != 'false' and not fuzzer_build
993 libpam = cc.find_library('pam', required : want_pam == 'true')
994 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
995 have = libpam.found() and libpam_misc.found()
1001 conf.set10('HAVE_PAM', have)
1003 want_microhttpd = get_option('microhttpd')
1004 if want_microhttpd != 'false' and not fuzzer_build
1005 libmicrohttpd = dependency('libmicrohttpd',
1006 version : '>= 0.9.33',
1007 required : want_microhttpd == 'true')
1008 have = libmicrohttpd.found()
1013 conf.set10('HAVE_MICROHTTPD', have)
1015 want_libcryptsetup = get_option('libcryptsetup')
1016 if want_libcryptsetup != 'false' and not fuzzer_build
1017 libcryptsetup = dependency('libcryptsetup',
1018 version : '>= 1.6.0',
1019 required : want_libcryptsetup == 'true')
1020 have = libcryptsetup.found()
1021 have_sector = cc.has_member(
1022 'struct crypt_params_plain',
1024 prefix : '#include <libcryptsetup.h>')
1030 conf.set10('HAVE_LIBCRYPTSETUP', have)
1031 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1033 want_libcurl = get_option('libcurl')
1034 if want_libcurl != 'false' and not fuzzer_build
1035 libcurl = dependency('libcurl',
1036 version : '>= 7.32.0',
1037 required : want_libcurl == 'true')
1038 have = libcurl.found()
1043 conf.set10('HAVE_LIBCURL', have)
1045 want_libidn = get_option('libidn')
1046 want_libidn2 = get_option('libidn2')
1047 if want_libidn == 'true' and want_libidn2 == 'true'
1048 error('libidn and libidn2 cannot be requested simultaneously')
1051 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1052 libidn = dependency('libidn',
1053 required : want_libidn == 'true')
1054 have = libidn.found()
1059 conf.set10('HAVE_LIBIDN', have)
1060 if not have and want_libidn2 != 'false' and not fuzzer_build
1061 # libidn is used for both libidn and libidn2 objects
1062 libidn = dependency('libidn2',
1063 required : want_libidn2 == 'true')
1064 have = libidn.found()
1068 conf.set10('HAVE_LIBIDN2', have)
1070 want_libiptc = get_option('libiptc')
1071 if want_libiptc != 'false' and not fuzzer_build
1072 libiptc = dependency('libiptc',
1073 required : want_libiptc == 'true')
1074 have = libiptc.found()
1079 conf.set10('HAVE_LIBIPTC', have)
1081 want_qrencode = get_option('qrencode')
1082 if want_qrencode != 'false' and not fuzzer_build
1083 libqrencode = dependency('libqrencode',
1084 required : want_qrencode == 'true')
1085 have = libqrencode.found()
1090 conf.set10('HAVE_QRENCODE', have)
1092 want_gcrypt = get_option('gcrypt')
1093 if want_gcrypt != 'false' and not fuzzer_build
1094 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1095 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1096 have = libgcrypt.found() and libgpg_error.found()
1101 # link to neither of the libs if one is not found
1105 conf.set10('HAVE_GCRYPT', have)
1107 want_gnutls = get_option('gnutls')
1108 if want_gnutls != 'false' and not fuzzer_build
1109 libgnutls = dependency('gnutls',
1110 version : '>= 3.1.4',
1111 required : want_gnutls == 'true')
1112 have = libgnutls.found()
1117 conf.set10('HAVE_GNUTLS', have)
1119 want_openssl = get_option('openssl')
1120 if want_openssl != 'false' and not fuzzer_build
1121 libopenssl = dependency('openssl',
1122 version : '>= 1.1.0',
1123 required : want_openssl == 'true')
1124 have = libopenssl.found()
1129 conf.set10('HAVE_OPENSSL', have)
1131 want_elfutils = get_option('elfutils')
1132 if want_elfutils != 'false' and not fuzzer_build
1133 libdw = dependency('libdw',
1134 required : want_elfutils == 'true')
1135 have = libdw.found()
1140 conf.set10('HAVE_ELFUTILS', have)
1142 want_zlib = get_option('zlib')
1143 if want_zlib != 'false' and not fuzzer_build
1144 libz = dependency('zlib',
1145 required : want_zlib == 'true')
1151 conf.set10('HAVE_ZLIB', have)
1153 want_bzip2 = get_option('bzip2')
1154 if want_bzip2 != 'false' and not fuzzer_build
1155 libbzip2 = cc.find_library('bz2',
1156 required : want_bzip2 == 'true')
1157 have = libbzip2.found()
1162 conf.set10('HAVE_BZIP2', have)
1164 want_xz = get_option('xz')
1165 if want_xz != 'false' and not fuzzer_build
1166 libxz = dependency('liblzma',
1167 required : want_xz == 'true')
1168 have = libxz.found()
1173 conf.set10('HAVE_XZ', have)
1175 want_lz4 = get_option('lz4')
1176 if want_lz4 != 'false' and not fuzzer_build
1177 liblz4 = dependency('liblz4',
1178 version : '>= 1.3.0',
1179 required : want_lz4 == 'true')
1180 have = liblz4.found()
1185 conf.set10('HAVE_LZ4', have)
1187 want_xkbcommon = get_option('xkbcommon')
1188 if want_xkbcommon != 'false' and not fuzzer_build
1189 libxkbcommon = dependency('xkbcommon',
1190 version : '>= 0.3.0',
1191 required : want_xkbcommon == 'true')
1192 have = libxkbcommon.found()
1197 conf.set10('HAVE_XKBCOMMON', have)
1199 want_pcre2 = get_option('pcre2')
1200 if want_pcre2 != 'false'
1201 libpcre2 = dependency('libpcre2-8',
1202 required : want_pcre2 == 'true')
1203 have = libpcre2.found()
1208 conf.set10('HAVE_PCRE2', have)
1210 want_glib = get_option('glib')
1211 if want_glib != 'false' and not fuzzer_build
1212 libglib = dependency('glib-2.0',
1213 version : '>= 2.22.0',
1214 required : want_glib == 'true')
1215 libgobject = dependency('gobject-2.0',
1216 version : '>= 2.22.0',
1217 required : want_glib == 'true')
1218 libgio = dependency('gio-2.0',
1219 required : want_glib == 'true')
1220 have = libglib.found() and libgobject.found() and libgio.found()
1227 conf.set10('HAVE_GLIB', have)
1229 want_dbus = get_option('dbus')
1230 if want_dbus != 'false' and not fuzzer_build
1231 libdbus = dependency('dbus-1',
1232 version : '>= 1.3.2',
1233 required : want_dbus == 'true')
1234 have = libdbus.found()
1239 conf.set10('HAVE_DBUS', have)
1241 default_dnssec = get_option('default-dnssec')
1243 default_dnssec = 'no'
1245 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1246 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1247 default_dnssec = 'no'
1249 conf.set('DEFAULT_DNSSEC_MODE',
1250 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1251 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1253 dns_over_tls = get_option('dns-over-tls')
1254 if dns_over_tls != 'false'
1255 if dns_over_tls == 'openssl'
1258 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1259 if dns_over_tls == 'gnutls' and not have_gnutls
1260 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1263 if dns_over_tls == 'gnutls' or have_gnutls
1264 have_openssl = false
1266 have_openssl = conf.get('HAVE_OPENSSL') == 1
1267 if dns_over_tls != 'auto' and not have_openssl
1268 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1269 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1272 have = have_gnutls or have_openssl
1276 have_openssl = false
1278 conf.set10('ENABLE_DNS_OVER_TLS', have)
1279 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1280 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1282 default_dns_over_tls = get_option('default-dns-over-tls')
1284 default_dns_over_tls = 'no'
1286 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1287 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1288 default_dns_over_tls = 'no'
1290 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1291 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1292 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1294 want_importd = get_option('importd')
1295 if want_importd != 'false'
1296 have = (conf.get('HAVE_LIBCURL') == 1 and
1297 conf.get('HAVE_ZLIB') == 1 and
1298 conf.get('HAVE_XZ') == 1 and
1299 conf.get('HAVE_GCRYPT') == 1)
1300 if want_importd == 'true' and not have
1301 error('importd support was requested, but dependencies are not available')
1306 conf.set10('ENABLE_IMPORTD', have)
1308 want_remote = get_option('remote')
1309 if want_remote != 'false'
1310 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1311 conf.get('HAVE_LIBCURL') == 1]
1312 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1313 # it's possible to build one without the other. Complain only if
1314 # support was explictly requested. The auxiliary files like sysusers
1315 # config should be installed when any of the programs are built.
1316 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1317 error('remote support was requested, but dependencies are not available')
1319 have = have_deps[0] or have_deps[1]
1323 conf.set10('ENABLE_REMOTE', have)
1325 foreach term : ['utmp',
1357 have = get_option(term)
1358 name = 'ENABLE_' + term.underscorify().to_upper()
1359 conf.set10(name, have)
1362 foreach tuple : [['nss-mymachines', 'machined'],
1363 ['nss-resolve', 'resolve']]
1364 want = get_option(tuple[0])
1366 have = get_option(tuple[1])
1367 if want == 'true' and not have
1368 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1373 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1374 conf.set10(name, have)
1378 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1379 'ENABLE_NSS_MYMACHINES',
1380 'ENABLE_NSS_RESOLVE',
1381 'ENABLE_NSS_SYSTEMD']
1382 if conf.get(term) == 1
1386 conf.set10('ENABLE_NSS', enable_nss)
1388 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1393 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1395 #####################################################################
1397 if get_option('efi')
1398 efi_arch = host_machine.cpu_family()
1400 if efi_arch == 'x86'
1401 EFI_MACHINE_TYPE_NAME = 'ia32'
1402 gnu_efi_arch = 'ia32'
1403 elif efi_arch == 'x86_64'
1404 EFI_MACHINE_TYPE_NAME = 'x64'
1405 gnu_efi_arch = 'x86_64'
1406 elif efi_arch == 'arm'
1407 EFI_MACHINE_TYPE_NAME = 'arm'
1408 gnu_efi_arch = 'arm'
1409 elif efi_arch == 'aarch64'
1410 EFI_MACHINE_TYPE_NAME = 'aa64'
1411 gnu_efi_arch = 'aarch64'
1413 EFI_MACHINE_TYPE_NAME = ''
1418 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1420 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1424 conf.set10('ENABLE_EFI', have)
1426 #####################################################################
1428 config_h = configure_file(
1429 output : 'config.h',
1430 configuration : conf)
1432 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1434 includes = include_directories('src/basic',
1438 'src/journal-remote',
1442 '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')
1534 subdir('src/network')
1536 subdir('src/analyze')
1537 subdir('src/journal-remote')
1538 subdir('src/coredump')
1539 subdir('src/hostname')
1540 subdir('src/import')
1541 subdir('src/kernel-install')
1542 subdir('src/locale')
1543 subdir('src/machine')
1544 subdir('src/portable')
1545 subdir('src/nspawn')
1546 subdir('src/resolve')
1547 subdir('src/timedate')
1548 subdir('src/timesync')
1549 subdir('src/vconsole')
1550 subdir('src/boot/efi')
1557 ############################################################
1559 # only static linking apart from libdl, to make sure that the
1560 # module is linked to all libraries that it uses.
1561 test_dlopen = executable(
1565 include_directories : includes,
1566 link_with : [libbasic],
1567 dependencies : [libdl],
1568 build_by_default : want_tests != 'false')
1570 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1571 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1572 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1573 ['resolve', 'ENABLE_NSS_RESOLVE']]
1575 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1579 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1580 version_script_arg = join_paths(meson.source_root(), sym)
1582 nss = shared_library(
1584 'src/nss-@0@/nss-@0@.c'.format(module),
1587 include_directories : includes,
1588 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1589 link_args : ['-Wl,-z,nodelete',
1591 '-Wl,--version-script=' + version_script_arg,
1593 link_with : [libsystemd_static,
1595 dependencies : [threads,
1599 install_dir : rootlibdir)
1601 # We cannot use shared_module because it does not support version suffix.
1602 # Unfortunately shared_library insists on creating the symlink…
1603 meson.add_install_script('sh', '-c',
1604 'rm $DESTDIR@0@/libnss_@1@.so'
1605 .format(rootlibdir, module))
1607 if want_tests != 'false'
1608 test('dlopen-nss_' + module,
1610 # path to dlopen must include a slash
1611 args : nss.full_path())
1616 ############################################################
1618 executable('systemd',
1620 include_directories : includes,
1621 link_with : [libcore,
1623 dependencies : [threads,
1629 install_rpath : rootlibexecdir,
1631 install_dir : rootlibexecdir)
1633 meson.add_install_script(meson_make_symlink,
1634 join_paths(rootlibexecdir, 'systemd'),
1635 join_paths(rootsbindir, 'init'))
1637 exe = executable('systemd-analyze',
1638 systemd_analyze_sources,
1639 include_directories : includes,
1640 link_with : [libcore,
1642 dependencies : [threads,
1648 install_rpath : rootlibexecdir,
1650 public_programs += exe
1652 executable('systemd-journald',
1653 systemd_journald_sources,
1654 include_directories : includes,
1655 link_with : [libjournal_core,
1657 dependencies : [threads,
1661 install_rpath : rootlibexecdir,
1663 install_dir : rootlibexecdir)
1665 exe = executable('systemd-cat',
1666 systemd_cat_sources,
1667 include_directories : includes,
1668 link_with : [libjournal_core,
1670 dependencies : [threads],
1671 install_rpath : rootlibexecdir,
1673 public_programs += exe
1675 exe = executable('journalctl',
1677 include_directories : includes,
1678 link_with : [libshared],
1679 dependencies : [threads,
1684 install_rpath : rootlibexecdir,
1686 install_dir : rootbindir)
1687 public_programs += exe
1689 executable('systemd-getty-generator',
1690 'src/getty-generator/getty-generator.c',
1691 include_directories : includes,
1692 link_with : [libshared],
1693 install_rpath : rootlibexecdir,
1695 install_dir : systemgeneratordir)
1697 executable('systemd-debug-generator',
1698 'src/debug-generator/debug-generator.c',
1699 include_directories : includes,
1700 link_with : [libshared],
1701 install_rpath : rootlibexecdir,
1703 install_dir : systemgeneratordir)
1705 executable('systemd-run-generator',
1706 'src/run-generator/run-generator.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 install_rpath : rootlibexecdir,
1711 install_dir : systemgeneratordir)
1713 executable('systemd-fstab-generator',
1714 'src/fstab-generator/fstab-generator.c',
1715 'src/core/mount-setup.c',
1716 include_directories : includes,
1717 link_with : [libshared],
1718 install_rpath : rootlibexecdir,
1720 install_dir : systemgeneratordir)
1722 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1723 executable('30-systemd-environment-d-generator',
1724 'src/environment-d-generator/environment-d-generator.c',
1725 include_directories : includes,
1726 link_with : [libshared],
1727 install_rpath : rootlibexecdir,
1729 install_dir : userenvgeneratordir)
1731 meson.add_install_script(meson_make_symlink,
1732 join_paths(sysconfdir, 'environment'),
1733 join_paths(environmentdir, '99-environment.conf'))
1736 if conf.get('ENABLE_HIBERNATE') == 1
1737 executable('systemd-hibernate-resume-generator',
1738 'src/hibernate-resume/hibernate-resume-generator.c',
1739 include_directories : includes,
1740 link_with : [libshared],
1741 install_rpath : rootlibexecdir,
1743 install_dir : systemgeneratordir)
1745 executable('systemd-hibernate-resume',
1746 'src/hibernate-resume/hibernate-resume.c',
1747 include_directories : includes,
1748 link_with : [libshared],
1749 install_rpath : rootlibexecdir,
1751 install_dir : rootlibexecdir)
1754 if conf.get('HAVE_BLKID') == 1
1755 executable('systemd-gpt-auto-generator',
1756 'src/gpt-auto-generator/gpt-auto-generator.c',
1757 'src/shared/blkid-util.h',
1758 include_directories : includes,
1759 link_with : [libshared],
1760 dependencies : libblkid,
1761 install_rpath : rootlibexecdir,
1763 install_dir : systemgeneratordir)
1765 exe = executable('systemd-dissect',
1766 'src/dissect/dissect.c',
1767 include_directories : includes,
1768 link_with : [libshared],
1769 install_rpath : rootlibexecdir,
1771 install_dir : rootlibexecdir)
1772 public_programs += exe
1775 if conf.get('ENABLE_RESOLVE') == 1
1776 executable('systemd-resolved',
1777 systemd_resolved_sources,
1778 include_directories : includes,
1779 link_with : [libshared,
1781 libsystemd_resolve_core],
1782 dependencies : systemd_resolved_dependencies,
1783 install_rpath : rootlibexecdir,
1785 install_dir : rootlibexecdir)
1787 exe = executable('resolvectl',
1789 include_directories : includes,
1790 link_with : [libshared,
1792 libsystemd_resolve_core],
1793 dependencies : [threads,
1797 install_rpath : rootlibexecdir,
1799 public_programs += exe
1801 meson.add_install_script(meson_make_symlink,
1802 join_paths(bindir, 'resolvectl'),
1803 join_paths(rootsbindir, 'resolvconf'))
1805 meson.add_install_script(meson_make_symlink,
1806 join_paths(bindir, 'resolvectl'),
1807 join_paths(bindir, 'systemd-resolve'))
1810 if conf.get('ENABLE_LOGIND') == 1
1811 executable('systemd-logind',
1812 systemd_logind_sources,
1813 include_directories : includes,
1814 link_with : [liblogind_core,
1816 dependencies : [threads,
1818 install_rpath : rootlibexecdir,
1820 install_dir : rootlibexecdir)
1822 exe = executable('loginctl',
1824 include_directories : includes,
1825 link_with : [libshared],
1826 dependencies : [threads,
1829 install_rpath : rootlibexecdir,
1831 install_dir : rootbindir)
1832 public_programs += exe
1834 exe = executable('systemd-inhibit',
1835 'src/login/inhibit.c',
1836 include_directories : includes,
1837 link_with : [libshared],
1838 install_rpath : rootlibexecdir,
1840 install_dir : rootbindir)
1841 public_programs += exe
1843 if conf.get('HAVE_PAM') == 1
1844 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1845 pam_systemd = shared_library(
1849 include_directories : includes,
1850 link_args : ['-shared',
1851 '-Wl,--version-script=' + version_script_arg],
1852 link_with : [libsystemd_static,
1854 dependencies : [threads,
1857 link_depends : pam_systemd_sym,
1859 install_dir : pamlibdir)
1861 if want_tests != 'false'
1862 test('dlopen-pam_systemd',
1864 # path to dlopen must include a slash
1865 args : pam_systemd.full_path())
1869 executable('systemd-user-runtime-dir',
1870 user_runtime_dir_sources,
1871 include_directories : includes,
1872 link_with : [libshared],
1873 install_rpath : rootlibexecdir,
1875 install_dir : rootlibexecdir)
1878 if conf.get('HAVE_PAM') == 1
1879 executable('systemd-user-sessions',
1880 'src/user-sessions/user-sessions.c',
1881 include_directories : includes,
1882 link_with : [libshared],
1883 install_rpath : rootlibexecdir,
1885 install_dir : rootlibexecdir)
1888 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1889 exe = executable('bootctl',
1890 'src/boot/bootctl.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 dependencies : [libblkid],
1894 install_rpath : rootlibexecdir,
1896 public_programs += exe
1898 executable('systemd-bless-boot',
1899 'src/boot/bless-boot.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 dependencies : [libblkid],
1903 install_rpath : rootlibexecdir,
1905 install_dir : rootlibexecdir)
1907 executable('systemd-bless-boot-generator',
1908 'src/boot/bless-boot-generator.c',
1909 include_directories : includes,
1910 link_with : [libshared],
1911 install_rpath : rootlibexecdir,
1913 install_dir : systemgeneratordir)
1916 executable('systemd-boot-check-no-failures',
1917 'src/boot/boot-check-no-failures.c',
1918 include_directories : includes,
1919 link_with : [libshared],
1920 dependencies : [libblkid],
1921 install_rpath : rootlibexecdir,
1923 install_dir : rootlibexecdir)
1925 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1926 include_directories : includes,
1927 link_with : [libshared],
1928 dependencies : [threads],
1929 install_rpath : rootlibexecdir,
1931 public_programs += exe
1934 if get_option('link-systemctl-shared')
1935 systemctl_link_with = [libshared]
1937 systemctl_link_with = [libsystemd_static,
1943 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1944 include_directories : includes,
1945 link_with : systemctl_link_with,
1946 dependencies : [threads,
1951 install_rpath : rootlibexecdir,
1953 install_dir : rootbindir)
1954 public_programs += exe
1956 if conf.get('ENABLE_PORTABLED') == 1
1957 executable('systemd-portabled',
1958 systemd_portabled_sources,
1959 include_directories : includes,
1960 link_with : [libshared],
1961 dependencies : [threads],
1962 install_rpath : rootlibexecdir,
1964 install_dir : rootlibexecdir)
1966 exe = executable('portablectl', 'src/portable/portablectl.c',
1967 include_directories : includes,
1968 link_with : [libshared],
1969 dependencies : [threads],
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootbindir)
1973 public_programs += exe
1976 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1977 meson.add_install_script(meson_make_symlink,
1978 join_paths(rootbindir, 'systemctl'),
1979 join_paths(rootsbindir, alias))
1982 if conf.get('ENABLE_BACKLIGHT') == 1
1983 executable('systemd-backlight',
1984 'src/backlight/backlight.c',
1985 include_directories : includes,
1986 link_with : [libshared],
1987 install_rpath : rootlibexecdir,
1989 install_dir : rootlibexecdir)
1992 if conf.get('ENABLE_RFKILL') == 1
1993 executable('systemd-rfkill',
1994 'src/rfkill/rfkill.c',
1995 include_directories : includes,
1996 link_with : [libshared],
1997 install_rpath : rootlibexecdir,
1999 install_dir : rootlibexecdir)
2002 executable('systemd-system-update-generator',
2003 'src/system-update-generator/system-update-generator.c',
2004 include_directories : includes,
2005 link_with : [libshared],
2006 install_rpath : rootlibexecdir,
2008 install_dir : systemgeneratordir)
2010 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2011 executable('systemd-cryptsetup',
2012 'src/cryptsetup/cryptsetup.c',
2013 include_directories : includes,
2014 link_with : [libshared],
2015 dependencies : [libcryptsetup],
2016 install_rpath : rootlibexecdir,
2018 install_dir : rootlibexecdir)
2020 executable('systemd-cryptsetup-generator',
2021 'src/cryptsetup/cryptsetup-generator.c',
2022 include_directories : includes,
2023 link_with : [libshared],
2024 dependencies : [libcryptsetup],
2025 install_rpath : rootlibexecdir,
2027 install_dir : systemgeneratordir)
2029 executable('systemd-veritysetup',
2030 'src/veritysetup/veritysetup.c',
2031 include_directories : includes,
2032 link_with : [libshared],
2033 dependencies : [libcryptsetup],
2034 install_rpath : rootlibexecdir,
2036 install_dir : rootlibexecdir)
2038 executable('systemd-veritysetup-generator',
2039 'src/veritysetup/veritysetup-generator.c',
2040 include_directories : includes,
2041 link_with : [libshared],
2042 dependencies : [libcryptsetup],
2043 install_rpath : rootlibexecdir,
2045 install_dir : systemgeneratordir)
2048 if conf.get('HAVE_SYSV_COMPAT') == 1
2049 executable('systemd-sysv-generator',
2050 'src/sysv-generator/sysv-generator.c',
2051 include_directories : includes,
2052 link_with : [libshared],
2053 install_rpath : rootlibexecdir,
2055 install_dir : systemgeneratordir)
2057 executable('systemd-rc-local-generator',
2058 'src/rc-local-generator/rc-local-generator.c',
2059 include_directories : includes,
2060 link_with : [libshared],
2061 install_rpath : rootlibexecdir,
2063 install_dir : systemgeneratordir)
2066 if conf.get('ENABLE_HOSTNAMED') == 1
2067 executable('systemd-hostnamed',
2068 'src/hostname/hostnamed.c',
2069 include_directories : includes,
2070 link_with : [libshared],
2071 install_rpath : rootlibexecdir,
2073 install_dir : rootlibexecdir)
2075 exe = executable('hostnamectl',
2076 'src/hostname/hostnamectl.c',
2077 include_directories : includes,
2078 link_with : [libshared],
2079 install_rpath : rootlibexecdir,
2081 public_programs += exe
2084 if conf.get('ENABLE_LOCALED') == 1
2085 if conf.get('HAVE_XKBCOMMON') == 1
2086 # logind will load libxkbcommon.so dynamically on its own
2092 executable('systemd-localed',
2093 systemd_localed_sources,
2094 include_directories : includes,
2095 link_with : [libshared],
2096 dependencies : deps,
2097 install_rpath : rootlibexecdir,
2099 install_dir : rootlibexecdir)
2101 exe = executable('localectl',
2103 include_directories : includes,
2104 link_with : [libshared],
2105 install_rpath : rootlibexecdir,
2107 public_programs += exe
2110 if conf.get('ENABLE_TIMEDATED') == 1
2111 executable('systemd-timedated',
2112 'src/timedate/timedated.c',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 install_rpath : rootlibexecdir,
2117 install_dir : rootlibexecdir)
2120 if conf.get('ENABLE_TIMEDATECTL') == 1
2121 exe = executable('timedatectl',
2122 'src/timedate/timedatectl.c',
2123 include_directories : includes,
2124 install_rpath : rootlibexecdir,
2125 link_with : [libshared],
2126 dependencies : [libm],
2128 public_programs += exe
2131 if conf.get('ENABLE_TIMESYNCD') == 1
2132 executable('systemd-timesyncd',
2133 systemd_timesyncd_sources,
2134 include_directories : includes,
2135 link_with : [libshared],
2136 dependencies : [threads,
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootlibexecdir)
2142 executable('systemd-time-wait-sync',
2143 'src/time-wait-sync/time-wait-sync.c',
2144 include_directories : includes,
2145 link_with : [libshared],
2146 install_rpath : rootlibexecdir,
2148 install_dir : rootlibexecdir)
2151 if conf.get('ENABLE_MACHINED') == 1
2152 executable('systemd-machined',
2153 systemd_machined_sources,
2154 include_directories : includes,
2155 link_with : [libmachine_core,
2157 install_rpath : rootlibexecdir,
2159 install_dir : rootlibexecdir)
2161 exe = executable('machinectl',
2162 'src/machine/machinectl.c',
2163 include_directories : includes,
2164 link_with : [libshared],
2165 dependencies : [threads,
2168 install_rpath : rootlibexecdir,
2170 install_dir : rootbindir)
2171 public_programs += exe
2174 if conf.get('ENABLE_IMPORTD') == 1
2175 executable('systemd-importd',
2176 systemd_importd_sources,
2177 include_directories : includes,
2178 link_with : [libshared],
2179 dependencies : [threads],
2180 install_rpath : rootlibexecdir,
2182 install_dir : rootlibexecdir)
2184 systemd_pull = executable('systemd-pull',
2185 systemd_pull_sources,
2186 include_directories : includes,
2187 link_with : [libshared],
2188 dependencies : [libcurl,
2193 install_rpath : rootlibexecdir,
2195 install_dir : rootlibexecdir)
2197 systemd_import = executable('systemd-import',
2198 systemd_import_sources,
2199 include_directories : includes,
2200 link_with : [libshared],
2201 dependencies : [libcurl,
2205 install_rpath : rootlibexecdir,
2207 install_dir : rootlibexecdir)
2209 systemd_import_fs = executable('systemd-import-fs',
2210 systemd_import_fs_sources,
2211 include_directories : includes,
2212 link_with : [libshared],
2213 install_rpath : rootlibexecdir,
2215 install_dir : rootlibexecdir)
2217 systemd_export = executable('systemd-export',
2218 systemd_export_sources,
2219 include_directories : includes,
2220 link_with : [libshared],
2221 dependencies : [libcurl,
2225 install_rpath : rootlibexecdir,
2227 install_dir : rootlibexecdir)
2229 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2232 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2233 exe = executable('systemd-journal-upload',
2234 systemd_journal_upload_sources,
2235 include_directories : includes,
2236 link_with : [libshared],
2237 dependencies : [threads,
2242 install_rpath : rootlibexecdir,
2244 install_dir : rootlibexecdir)
2245 public_programs += exe
2248 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2249 s_j_remote = executable('systemd-journal-remote',
2250 systemd_journal_remote_sources,
2251 include_directories : includes,
2252 link_with : [libshared,
2253 libsystemd_journal_remote],
2254 dependencies : [threads,
2259 install_rpath : rootlibexecdir,
2261 install_dir : rootlibexecdir)
2263 s_j_gatewayd = executable('systemd-journal-gatewayd',
2264 systemd_journal_gatewayd_sources,
2265 include_directories : includes,
2266 link_with : [libshared],
2267 dependencies : [threads,
2272 install_rpath : rootlibexecdir,
2274 install_dir : rootlibexecdir)
2275 public_programs += [s_j_remote, s_j_gatewayd]
2278 if conf.get('ENABLE_COREDUMP') == 1
2279 executable('systemd-coredump',
2280 systemd_coredump_sources,
2281 include_directories : includes,
2282 link_with : [libshared],
2283 dependencies : [threads,
2288 install_rpath : rootlibexecdir,
2290 install_dir : rootlibexecdir)
2292 exe = executable('coredumpctl',
2293 coredumpctl_sources,
2294 include_directories : includes,
2295 link_with : [libshared],
2296 dependencies : [threads,
2299 install_rpath : rootlibexecdir,
2301 public_programs += exe
2304 if conf.get('ENABLE_BINFMT') == 1
2305 exe = executable('systemd-binfmt',
2306 'src/binfmt/binfmt.c',
2307 include_directories : includes,
2308 link_with : [libshared],
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootlibexecdir)
2312 public_programs += exe
2314 meson.add_install_script('sh', '-c',
2315 mkdir_p.format(binfmtdir))
2316 meson.add_install_script('sh', '-c',
2317 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2320 if conf.get('ENABLE_VCONSOLE') == 1
2321 executable('systemd-vconsole-setup',
2322 'src/vconsole/vconsole-setup.c',
2323 include_directories : includes,
2324 link_with : [libshared],
2325 install_rpath : rootlibexecdir,
2327 install_dir : rootlibexecdir)
2330 if conf.get('ENABLE_RANDOMSEED') == 1
2331 executable('systemd-random-seed',
2332 'src/random-seed/random-seed.c',
2333 include_directories : includes,
2334 link_with : [libshared],
2335 install_rpath : rootlibexecdir,
2337 install_dir : rootlibexecdir)
2340 if conf.get('ENABLE_FIRSTBOOT') == 1
2341 executable('systemd-firstboot',
2342 'src/firstboot/firstboot.c',
2343 include_directories : includes,
2344 link_with : [libshared],
2345 dependencies : [libcrypt],
2346 install_rpath : rootlibexecdir,
2348 install_dir : rootbindir)
2351 executable('systemd-remount-fs',
2352 'src/remount-fs/remount-fs.c',
2353 'src/core/mount-setup.c',
2354 'src/core/mount-setup.h',
2355 include_directories : includes,
2356 link_with : [libshared],
2357 install_rpath : rootlibexecdir,
2359 install_dir : rootlibexecdir)
2361 executable('systemd-machine-id-setup',
2362 'src/machine-id-setup/machine-id-setup-main.c',
2363 'src/core/machine-id-setup.c',
2364 'src/core/machine-id-setup.h',
2365 include_directories : includes,
2366 link_with : [libshared],
2367 install_rpath : rootlibexecdir,
2369 install_dir : rootbindir)
2371 executable('systemd-fsck',
2373 include_directories : includes,
2374 link_with : [libshared],
2375 install_rpath : rootlibexecdir,
2377 install_dir : rootlibexecdir)
2379 executable('systemd-growfs',
2380 'src/partition/growfs.c',
2381 include_directories : includes,
2382 link_with : [libshared],
2383 dependencies : [libcryptsetup],
2384 install_rpath : rootlibexecdir,
2386 install_dir : rootlibexecdir)
2388 executable('systemd-makefs',
2389 'src/partition/makefs.c',
2390 include_directories : includes,
2391 link_with : [libshared],
2392 install_rpath : rootlibexecdir,
2394 install_dir : rootlibexecdir)
2396 executable('systemd-sleep',
2397 'src/sleep/sleep.c',
2398 include_directories : includes,
2399 link_with : [libshared],
2400 install_rpath : rootlibexecdir,
2402 install_dir : rootlibexecdir)
2404 install_data('src/sleep/sleep.conf',
2405 install_dir : pkgsysconfdir)
2407 exe = executable('systemd-sysctl',
2408 'src/sysctl/sysctl.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2413 install_dir : rootlibexecdir)
2414 public_programs += exe
2416 executable('systemd-ac-power',
2417 'src/ac-power/ac-power.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 install_rpath : rootlibexecdir,
2422 install_dir : rootlibexecdir)
2424 exe = executable('systemd-detect-virt',
2425 'src/detect-virt/detect-virt.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 public_programs += exe
2432 exe = executable('systemd-delta',
2433 'src/delta/delta.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 public_programs += exe
2440 exe = executable('systemd-escape',
2441 'src/escape/escape.c',
2442 include_directories : includes,
2443 link_with : [libshared],
2444 install_rpath : rootlibexecdir,
2446 install_dir : rootbindir)
2447 public_programs += exe
2449 exe = executable('systemd-notify',
2450 'src/notify/notify.c',
2451 include_directories : includes,
2452 link_with : [libshared],
2453 install_rpath : rootlibexecdir,
2455 install_dir : rootbindir)
2456 public_programs += exe
2458 executable('systemd-volatile-root',
2459 'src/volatile-root/volatile-root.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2466 executable('systemd-cgroups-agent',
2467 'src/cgroups-agent/cgroups-agent.c',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 install_rpath : rootlibexecdir,
2472 install_dir : rootlibexecdir)
2474 exe = executable('systemd-id128',
2475 'src/id128/id128.c',
2476 include_directories : includes,
2477 link_with : [libshared],
2478 install_rpath : rootlibexecdir,
2480 public_programs += exe
2482 exe = executable('systemd-path',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 install_rpath : rootlibexecdir,
2488 public_programs += exe
2490 exe = executable('systemd-ask-password',
2491 'src/ask-password/ask-password.c',
2492 include_directories : includes,
2493 link_with : [libshared],
2494 install_rpath : rootlibexecdir,
2496 install_dir : rootbindir)
2497 public_programs += exe
2499 executable('systemd-reply-password',
2500 'src/reply-password/reply-password.c',
2501 include_directories : includes,
2502 link_with : [libshared],
2503 install_rpath : rootlibexecdir,
2505 install_dir : rootlibexecdir)
2507 exe = executable('systemd-tty-ask-password-agent',
2508 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2509 include_directories : includes,
2510 link_with : [libshared],
2511 install_rpath : rootlibexecdir,
2513 install_dir : rootbindir)
2514 public_programs += exe
2516 exe = executable('systemd-cgls',
2518 include_directories : includes,
2519 link_with : [libshared],
2520 install_rpath : rootlibexecdir,
2522 public_programs += exe
2524 exe = executable('systemd-cgtop',
2525 'src/cgtop/cgtop.c',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 install_rpath : rootlibexecdir,
2530 public_programs += exe
2532 executable('systemd-initctl',
2533 'src/initctl/initctl.c',
2534 include_directories : includes,
2535 link_with : [libshared],
2536 install_rpath : rootlibexecdir,
2538 install_dir : rootlibexecdir)
2540 exe = executable('systemd-mount',
2541 'src/mount/mount-tool.c',
2542 include_directories : includes,
2543 link_with : [libshared],
2544 install_rpath : rootlibexecdir,
2546 public_programs += exe
2548 meson.add_install_script(meson_make_symlink,
2549 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2551 exe = executable('systemd-run',
2553 include_directories : includes,
2554 link_with : [libshared],
2555 install_rpath : rootlibexecdir,
2557 public_programs += exe
2559 exe = executable('systemd-stdio-bridge',
2560 'src/stdio-bridge/stdio-bridge.c',
2561 include_directories : includes,
2562 link_with : [libshared],
2563 install_rpath : rootlibexecdir,
2565 public_programs += exe
2567 exe = executable('busctl',
2568 'src/busctl/busctl.c',
2569 'src/busctl/busctl-introspect.c',
2570 'src/busctl/busctl-introspect.h',
2571 include_directories : includes,
2572 link_with : [libshared],
2573 install_rpath : rootlibexecdir,
2575 public_programs += exe
2577 if conf.get('ENABLE_SYSUSERS') == 1
2578 exe = executable('systemd-sysusers',
2579 'src/sysusers/sysusers.c',
2580 include_directories : includes,
2581 link_with : [libshared],
2582 install_rpath : rootlibexecdir,
2584 install_dir : rootbindir)
2585 public_programs += exe
2588 if conf.get('ENABLE_TMPFILES') == 1
2589 exe = executable('systemd-tmpfiles',
2590 'src/tmpfiles/tmpfiles.c',
2591 include_directories : includes,
2592 link_with : [libshared],
2593 dependencies : [libacl],
2594 install_rpath : rootlibexecdir,
2596 install_dir : rootbindir)
2597 public_programs += exe
2599 if want_tests != 'false'
2600 test('test-systemd-tmpfiles',
2601 test_systemd_tmpfiles_py,
2602 # https://github.com/mesonbuild/meson/issues/2681
2603 args : exe.full_path())
2607 if conf.get('ENABLE_HWDB') == 1
2608 exe = executable('systemd-hwdb',
2610 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2611 include_directories : includes,
2612 link_with : [libudev_static],
2613 install_rpath : udev_rpath,
2615 install_dir : rootbindir)
2616 public_programs += exe
2619 if conf.get('ENABLE_QUOTACHECK') == 1
2620 executable('systemd-quotacheck',
2621 'src/quotacheck/quotacheck.c',
2622 include_directories : includes,
2623 link_with : [libshared],
2624 install_rpath : rootlibexecdir,
2626 install_dir : rootlibexecdir)
2629 exe = executable('systemd-socket-proxyd',
2630 'src/socket-proxy/socket-proxyd.c',
2631 include_directories : includes,
2632 link_with : [libshared],
2633 dependencies : [threads],
2634 install_rpath : rootlibexecdir,
2636 install_dir : rootlibexecdir)
2637 public_programs += exe
2639 exe = executable('systemd-udevd',
2640 systemd_udevd_sources,
2641 include_directories : includes,
2642 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2643 link_with : [libudev_core,
2646 dependencies : [threads,
2651 install_rpath : udev_rpath,
2653 install_dir : rootlibexecdir)
2654 public_programs += exe
2656 exe = executable('udevadm',
2658 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2659 include_directories : includes,
2660 link_with : [libudev_core,
2663 dependencies : [threads,
2668 install_rpath : udev_rpath,
2670 install_dir : rootbindir)
2671 public_programs += exe
2673 executable('systemd-shutdown',
2674 systemd_shutdown_sources,
2675 include_directories : includes,
2676 link_with : [libshared],
2677 dependencies : [libmount],
2678 install_rpath : rootlibexecdir,
2680 install_dir : rootlibexecdir)
2682 executable('systemd-update-done',
2683 'src/update-done/update-done.c',
2684 include_directories : includes,
2685 link_with : [libshared],
2686 install_rpath : rootlibexecdir,
2688 install_dir : rootlibexecdir)
2690 executable('systemd-update-utmp',
2691 'src/update-utmp/update-utmp.c',
2692 include_directories : includes,
2693 link_with : [libshared],
2694 dependencies : [libaudit],
2695 install_rpath : rootlibexecdir,
2697 install_dir : rootlibexecdir)
2699 if conf.get('HAVE_KMOD') == 1
2700 executable('systemd-modules-load',
2701 'src/modules-load/modules-load.c',
2702 include_directories : includes,
2703 link_with : [libshared],
2704 dependencies : [libkmod],
2705 install_rpath : rootlibexecdir,
2707 install_dir : rootlibexecdir)
2709 meson.add_install_script('sh', '-c',
2710 mkdir_p.format(modulesloaddir))
2711 meson.add_install_script('sh', '-c',
2712 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2715 exe = executable('systemd-nspawn',
2716 systemd_nspawn_sources,
2717 'src/core/mount-setup.c', # FIXME: use a variable?
2718 'src/core/mount-setup.h',
2719 'src/core/loopback-setup.c',
2720 'src/core/loopback-setup.h',
2721 include_directories : includes,
2722 link_with : [libnspawn_core,
2724 dependencies : [libblkid],
2725 install_rpath : rootlibexecdir,
2727 public_programs += exe
2729 if conf.get('ENABLE_NETWORKD') == 1
2730 executable('systemd-networkd',
2731 systemd_networkd_sources,
2732 include_directories : includes,
2733 link_with : [libnetworkd_core,
2737 dependencies : [threads],
2738 install_rpath : rootlibexecdir,
2740 install_dir : rootlibexecdir)
2742 executable('systemd-networkd-wait-online',
2743 systemd_networkd_wait_online_sources,
2744 include_directories : includes,
2745 link_with : [libnetworkd_core,
2747 install_rpath : rootlibexecdir,
2749 install_dir : rootlibexecdir)
2751 exe = executable('networkctl',
2753 include_directories : includes,
2754 link_with : [libsystemd_network,
2756 install_rpath : rootlibexecdir,
2758 install_dir : rootbindir)
2759 public_programs += exe
2762 executable('systemd-sulogin-shell',
2763 ['src/sulogin-shell/sulogin-shell.c'],
2764 include_directories : includes,
2765 link_with : [libshared],
2766 install_rpath : rootlibexecdir,
2768 install_dir : rootlibexecdir)
2770 ############################################################
2773 'systemd-runtest.env',
2774 output : 'systemd-runtest.env',
2775 command : ['sh', '-c', '{ ' +
2776 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2777 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2779 build_by_default : true)
2781 foreach tuple : tests
2783 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2784 dependencies = tuple[2]
2785 condition = tuple.length() >= 4 ? tuple[3] : ''
2786 type = tuple.length() >= 5 ? tuple[4] : ''
2787 defs = tuple.length() >= 6 ? tuple[5] : []
2788 incs = tuple.length() >= 7 ? tuple[6] : includes
2791 name = sources[0].split('/')[-1].split('.')[0]
2792 if type.startswith('timeout=')
2793 timeout = type.split('=')[1].to_int()
2797 if condition == '' or conf.get(condition) == 1
2801 include_directories : incs,
2802 link_with : link_with,
2803 dependencies : dependencies,
2805 build_by_default : want_tests != 'false',
2806 install_rpath : rootlibexecdir,
2807 install : install_tests,
2808 install_dir : join_paths(testsdir, type))
2811 message('@0@ is a manual test'.format(name))
2812 elif type == 'unsafe' and want_tests != 'unsafe'
2813 message('@0@ is an unsafe test'.format(name))
2814 elif want_tests != 'false'
2820 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2825 'test-libsystemd-sym',
2826 test_libsystemd_sym_c,
2827 include_directories : includes,
2828 link_with : [libsystemd],
2829 build_by_default : want_tests != 'false',
2830 install : install_tests,
2831 install_dir : testsdir)
2832 if want_tests != 'false'
2833 test('test-libsystemd-sym', exe)
2837 'test-libsystemd-static-sym',
2838 test_libsystemd_sym_c,
2839 include_directories : includes,
2840 link_with : [install_libsystemd_static],
2841 dependencies : [threads], # threads is already included in dependencies on the library,
2842 # but does not seem to get propagated. Add here as a work-around.
2843 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2844 install : install_tests and static_libsystemd_pic,
2845 install_dir : testsdir)
2846 if want_tests != 'false' and static_libsystemd_pic
2847 test('test-libsystemd-static-sym', exe)
2853 include_directories : includes,
2854 c_args : '-Wno-deprecated-declarations',
2855 link_with : [libudev],
2856 build_by_default : want_tests != 'false',
2857 install : install_tests,
2858 install_dir : testsdir)
2859 if want_tests != 'false'
2860 test('test-libudev-sym', exe)
2864 'test-libudev-static-sym',
2866 include_directories : includes,
2867 c_args : '-Wno-deprecated-declarations',
2868 link_with : [install_libudev_static],
2869 build_by_default : want_tests != 'false' and static_libudev_pic,
2870 install : install_tests and static_libudev_pic,
2871 install_dir : testsdir)
2872 if want_tests != 'false' and static_libudev_pic
2873 test('test-libudev-static-sym', exe)
2876 ############################################################
2880 if get_option('tests') != 'false'
2881 foreach tuple : fuzzers
2883 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2884 dependencies = tuple[2]
2885 defs = tuple.length() >= 4 ? tuple[3] : []
2886 incs = tuple.length() >= 5 ? tuple[4] : includes
2889 dependencies += fuzzing_engine
2891 sources += 'src/fuzz/fuzz-main.c'
2894 name = sources[0].split('/')[-1].split('.')[0]
2896 fuzzer_exes += executable(
2899 include_directories : [incs, include_directories('src/fuzz')],
2900 link_with : link_with,
2901 dependencies : dependencies,
2907 run_target('fuzzers',
2908 depends : fuzzer_exes,
2911 ############################################################
2913 make_directive_index_py = find_program('tools/make-directive-index.py')
2914 make_man_index_py = find_program('tools/make-man-index.py')
2915 xml_helper_py = find_program('tools/xml_helper.py')
2916 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2920 subdir('sysusers.d')
2921 subdir('tmpfiles.d')
2926 subdir('shell-completion/bash')
2927 subdir('shell-completion/zsh')
2928 subdir('docs/sysvinit')
2929 subdir('docs/var-log')
2931 install_subdir('factory/etc',
2932 install_dir : factorydir)
2934 install_data('xorg/50-systemd-user.sh',
2935 install_dir : xinitrcdir)
2936 install_data('modprobe.d/systemd.conf',
2937 install_dir : modprobedir)
2938 install_data('LICENSE.GPL2',
2942 'docs/CODING_STYLE.md',
2943 'docs/DISTRO_PORTING.md',
2944 'docs/ENVIRONMENT.md',
2946 'docs/TRANSIENT-SETTINGS.md',
2947 'docs/TRANSLATORS.md',
2948 'docs/UIDS-GIDS.md',
2949 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2950 install_dir : docdir)
2952 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2953 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2955 ############################################################
2957 meson_check_help = find_program('tools/meson-check-help.sh')
2959 foreach exec : public_programs
2960 name = exec.full_path().split('/')[-1]
2961 if want_tests != 'false'
2962 test('check-help-' + name,
2964 args : exec.full_path())
2968 ############################################################
2970 # Enable tests for all supported sanitizers
2971 foreach tuple : sanitizers
2972 sanitizer = tuple[0]
2975 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2977 foreach p : fuzz_regression_tests
2978 b = p.split('/')[-2]
2979 c = p.split('/')[-1]
2981 name = '@0@:@1@'.format(b, sanitizer)
2984 if want_tests == 'false'
2985 message('Not compiling @0@ because tests is set to false'.format(name))
2987 exe = custom_target(
2991 command : [env, 'ln', '-fs',
2992 join_paths(build.full_path(), b),
2994 build_by_default : true)
2996 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3001 if want_tests != 'false' and slow_tests
3002 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3004 args : [exe.full_path(),
3005 join_paths(meson.source_root(), p)])
3012 ############################################################
3015 all_files = run_command(
3017 ['--git-dir=@0@/.git'.format(meson.source_root()),
3020 all_files = files(all_files.stdout().split())
3025 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3028 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3032 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3035 command : [meson_git_contrib_sh])
3039 git_head = run_command(
3041 ['--git-dir=@0@/.git'.format(meson.source_root()),
3042 'rev-parse', 'HEAD']).stdout().strip()
3043 git_head_short = run_command(
3045 ['--git-dir=@0@/.git'.format(meson.source_root()),
3046 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3050 command : ['git', 'archive',
3051 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3053 '--prefix', 'systemd-@0@/'.format(git_head),
3057 ############################################################
3059 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3062 depends : [man, libsystemd, libudev],
3063 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3065 ############################################################
3068 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3070 'split /usr: @0@'.format(split_usr),
3071 'split bin-sbin: @0@'.format(split_bin),
3072 'prefix directory: @0@'.format(prefixdir),
3073 'rootprefix directory: @0@'.format(rootprefixdir),
3074 'sysconf directory: @0@'.format(sysconfdir),
3075 'include directory: @0@'.format(includedir),
3076 'lib directory: @0@'.format(libdir),
3077 'rootlib directory: @0@'.format(rootlibdir),
3078 'SysV init scripts: @0@'.format(sysvinit_path),
3079 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3080 'PAM modules directory: @0@'.format(pamlibdir),
3081 'PAM configuration directory: @0@'.format(pamconfdir),
3082 'RPM macros directory: @0@'.format(rpmmacrosdir),
3083 'modprobe.d directory: @0@'.format(modprobedir),
3084 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3085 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3086 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3087 'bash completions directory: @0@'.format(bashcompletiondir),
3088 'zsh completions directory: @0@'.format(zshcompletiondir),
3089 'extra start script: @0@'.format(get_option('rc-local')),
3090 'extra stop script: @0@'.format(get_option('halt-local')),
3091 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3092 get_option('debug-tty')),
3093 'TTY GID: @0@'.format(tty_gid),
3094 'users GID: @0@'.format(substs.get('USERS_GID')),
3095 'maximum system UID: @0@'.format(system_uid_max),
3096 'maximum system GID: @0@'.format(system_gid_max),
3097 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3098 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3099 'minimum container UID base: @0@'.format(container_uid_base_min),
3100 'maximum container UID base: @0@'.format(container_uid_base_max),
3101 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3102 'render group access mode: @0@'.format(get_option('group-render-mode')),
3103 'certificate root directory: @0@'.format(get_option('certificate-root')),
3104 'support URL: @0@'.format(support_url),
3105 'nobody user name: @0@'.format(nobody_user),
3106 'nobody group name: @0@'.format(nobody_group),
3107 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3108 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3110 'default DNSSEC mode: @0@'.format(default_dnssec),
3111 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3112 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3113 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3114 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3115 'default locale: @0@'.format(default_locale)]
3117 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3118 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3120 'default DNS servers: @0@'.format(alt_dns_servers),
3121 'default NTP servers: @0@'.format(alt_ntp_servers)]
3123 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3124 '@@0@'.format(time_epoch)).stdout().strip()
3126 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3129 'static libsystemd: @0@'.format(static_libsystemd),
3130 'static libudev: @0@'.format(static_libudev)]
3133 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3134 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3135 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3137 if conf.get('ENABLE_EFI') == 1
3138 status += 'efi arch: @0@'.format(efi_arch)
3142 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3143 'EFI CC @0@'.format(' '.join(efi_cc)),
3144 'EFI lib directory: @0@'.format(efi_libdir),
3145 'EFI lds directory: @0@'.format(efi_ldsdir),
3146 'EFI include directory: @0@'.format(efi_incdir)]
3198 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3199 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3202 ['legacy pkla', install_polkit_pkla],
3204 ['gnu-efi', have_gnu_efi],
3217 ['man pages', want_man],
3218 ['html pages', want_html],
3219 ['man page indices', want_man and have_lxml],
3224 ['adm group', get_option('adm-group')],
3225 ['wheel group', get_option('wheel-group')],
3228 ['debug mmap cache'],
3231 ['valgrind', conf.get('VALGRIND') == 1],
3232 ['trace logging', conf.get('LOG_TRACE') == 1],
3233 ['link-udev-shared', get_option('link-udev-shared')],
3234 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3237 if tuple.length() >= 2
3240 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3241 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3242 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3253 'enabled features: @0@'.format(', '.join(found)),
3255 'disabled features: @0@'.format(', '.join(missing)),
3257 message('\n '.join(status))
3259 if rootprefixdir != rootprefix_default
3261 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3262 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3263 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))