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 # This is to be used instead of meson.source_root(), as the latter will return
30 # the wrong result when systemd is being built as a meson subproject
31 project_source_root = meson.current_source_dir()
33 want_ossfuzz = get_option('oss-fuzz')
34 want_libfuzzer = get_option('llvm-fuzz')
35 if want_ossfuzz and want_libfuzzer
36 error('only one of oss-fuzz and llvm-fuzz can be specified')
38 fuzzer_build = want_ossfuzz or want_libfuzzer
40 #####################################################################
42 # Try to install the git pre-commit hook
43 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
44 if git_hook.returncode() == 0
45 message(git_hook.stdout().strip())
48 #####################################################################
50 if get_option('split-usr') == 'auto'
51 split_usr = run_command('test', '-L', '/bin').returncode() != 0
53 split_usr = get_option('split-usr') == 'true'
55 conf.set10('HAVE_SPLIT_USR', split_usr,
56 description : '/usr/bin and /bin directories are separate')
58 if get_option('split-bin') == 'auto'
59 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
61 split_bin = get_option('split-bin') == 'true'
63 conf.set10('HAVE_SPLIT_BIN', split_bin,
64 description : 'bin and sbin directories are separate')
66 rootprefixdir = get_option('rootprefix')
67 # Unusual rootprefixdir values are used by some distros
68 # (see https://github.com/systemd/systemd/pull/7461).
69 rootprefix_default = split_usr ? '/' : '/usr'
70 if rootprefixdir == ''
71 rootprefixdir = rootprefix_default
73 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
75 sysvinit_path = get_option('sysvinit-path')
76 sysvrcnd_path = get_option('sysvrcnd-path')
77 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
78 description : 'SysV init scripts and rcN.d links are supported')
80 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
81 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
82 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
84 # join_paths ignores the preceding arguments if an absolute component is
85 # encountered, so this should canonicalize various paths when they are
86 # absolute or relative.
87 prefixdir = get_option('prefix')
88 if not prefixdir.startswith('/')
89 error('Prefix is not absolute: "@0@"'.format(prefixdir))
91 bindir = join_paths(prefixdir, get_option('bindir'))
92 libdir = join_paths(prefixdir, get_option('libdir'))
93 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
94 includedir = join_paths(prefixdir, get_option('includedir'))
95 datadir = join_paths(prefixdir, get_option('datadir'))
96 localstatedir = join_paths('/', get_option('localstatedir'))
98 rootbindir = join_paths(rootprefixdir, 'bin')
99 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
100 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
102 rootlibdir = get_option('rootlibdir')
104 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
107 # Dirs of external packages
108 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
109 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
110 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
111 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
112 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
113 varlogdir = join_paths(localstatedir, 'log')
114 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
115 rpmmacrosdir = get_option('rpmmacrosdir')
116 if rpmmacrosdir != 'no'
117 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
119 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
122 pkgdatadir = join_paths(datadir, 'systemd')
123 environmentdir = join_paths(prefixdir, 'lib/environment.d')
124 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
125 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
126 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
127 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
128 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
129 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
130 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
131 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
132 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
133 pkgincludedir = join_paths(includedir, 'systemd')
134 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
135 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
136 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
137 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
138 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
139 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
140 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
141 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
142 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
143 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
144 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
145 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
146 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
147 factorydir = join_paths(datadir, 'factory')
148 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
149 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
150 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
151 catalogstatedir = join_paths(systemdstatedir, 'catalog')
152 randomseeddir = join_paths(localstatedir, 'lib/systemd')
153 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
155 docdir = get_option('docdir')
157 docdir = join_paths(datadir, 'doc/systemd')
160 dbuspolicydir = get_option('dbuspolicydir')
161 if dbuspolicydir == ''
162 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
165 dbussessionservicedir = get_option('dbussessionservicedir')
166 if dbussessionservicedir == ''
167 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
170 dbussystemservicedir = get_option('dbussystemservicedir')
171 if dbussystemservicedir == ''
172 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
175 pamlibdir = get_option('pamlibdir')
177 pamlibdir = join_paths(rootlibdir, 'security')
180 pamconfdir = get_option('pamconfdir')
182 pamconfdir = join_paths(sysconfdir, 'pam.d')
185 memory_accounting_default = get_option('memory-accounting-default')
187 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
188 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
189 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
190 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
191 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
192 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
193 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
195 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
197 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
198 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
199 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
200 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
201 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
202 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
203 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
204 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
205 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
206 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
207 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
208 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
209 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
210 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
211 conf.set_quoted('ROOTPREFIX', rootprefixdir)
212 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
213 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
214 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
215 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
216 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
217 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
218 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
219 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
220 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
221 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
222 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
223 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
224 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
225 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
226 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
227 conf.set_quoted('LIBDIR', libdir)
228 conf.set_quoted('ROOTLIBDIR', rootlibdir)
229 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
230 conf.set_quoted('BOOTLIBDIR', bootlibdir)
231 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
232 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
233 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
234 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
235 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
236 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
237 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
238 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
239 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
241 substs.set('prefix', prefixdir)
242 substs.set('rootprefix', rootprefixdir)
243 substs.set('rootprefix_noslash', rootprefixdir_noslash)
244 substs.set('exec_prefix', prefixdir)
245 substs.set('libdir', libdir)
246 substs.set('rootlibdir', rootlibdir)
247 substs.set('includedir', includedir)
248 substs.set('sysconfdir', sysconfdir)
249 substs.set('bindir', bindir)
250 substs.set('rootbindir', rootbindir)
251 substs.set('rootlibexecdir', rootlibexecdir)
252 substs.set('systemunitdir', systemunitdir)
253 substs.set('userunitdir', userunitdir)
254 substs.set('systempresetdir', systempresetdir)
255 substs.set('userpresetdir', userpresetdir)
256 substs.set('udevhwdbdir', udevhwdbdir)
257 substs.set('udevrulesdir', udevrulesdir)
258 substs.set('udevlibexecdir', udevlibexecdir)
259 substs.set('environmentdir', environmentdir)
260 substs.set('catalogdir', catalogdir)
261 substs.set('tmpfilesdir', tmpfilesdir)
262 substs.set('sysusersdir', sysusersdir)
263 substs.set('sysctldir', sysctldir)
264 substs.set('binfmtdir', binfmtdir)
265 substs.set('modulesloaddir', modulesloaddir)
266 substs.set('modprobedir', modprobedir)
267 substs.set('systemgeneratordir', systemgeneratordir)
268 substs.set('usergeneratordir', usergeneratordir)
269 substs.set('systemenvgeneratordir', systemenvgeneratordir)
270 substs.set('userenvgeneratordir', userenvgeneratordir)
271 substs.set('systemshutdowndir', systemshutdowndir)
272 substs.set('systemsleepdir', systemsleepdir)
273 substs.set('VARLOGDIR', varlogdir)
274 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
275 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
276 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
277 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
278 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
279 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
280 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
281 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
282 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
284 #####################################################################
286 cc = meson.get_compiler('c')
287 pkgconfig = import('pkgconfig')
288 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
289 meson_build_sh = find_program('tools/meson-build.sh')
291 want_tests = get_option('tests')
292 slow_tests = want_tests != 'false' and get_option('slow-tests')
293 install_tests = get_option('install-tests')
295 if add_languages('cpp', required : fuzzer_build)
296 # Used only for tests
297 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
303 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
305 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
308 possible_cc_flags = [
312 '-Wmissing-include-dirs',
313 '-Wold-style-definition',
317 '-Wsuggest-attribute=noreturn',
318 '-Werror=missing-prototypes',
319 '-Werror=implicit-function-declaration',
320 '-Werror=missing-declarations',
321 '-Werror=return-type',
322 '-Werror=incompatible-pointer-types',
324 '-Wstrict-prototypes',
326 '-Wmissing-noreturn',
327 '-Wimplicit-fallthrough=5',
330 '-Wstrict-aliasing=2',
333 '-Werror=shift-count-overflow',
334 '-Werror=shift-overflow=2',
338 # negative arguments are correctly detected starting with meson 0.46.
339 '-Wno-unused-parameter',
340 '-Wno-missing-field-initializers',
341 '-Wno-unused-result',
342 '-Wno-format-signedness',
343 '-Wno-error=#warnings', # clang
344 '-Wno-string-plus-int', # clang
346 # work-around for gcc 7.1 turning this on on its own.
347 '-Wno-error=nonnull',
349 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
350 # optimizations enabled, producing essentially false positives.
351 '-Wno-maybe-uninitialized',
355 '-fdiagnostics-show-option',
356 '-fno-strict-aliasing',
357 '-fvisibility=hidden',
359 '-fstack-protector-strong',
360 '--param=ssp-buffer-size=4',
363 # --as-needed and --no-undefined are provided by meson by default,
364 # run mesonconf to see what is enabled
365 possible_link_flags = [
370 if cc.get_id() == 'clang'
371 possible_cc_flags += [
372 '-Wno-typedef-redefinition',
373 '-Wno-gnu-variable-sized-type-not-at-end',
377 if get_option('buildtype') != 'debug'
378 possible_cc_flags += [
379 '-ffunction-sections',
383 possible_link_flags += '-Wl,--gc-sections'
386 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
387 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
391 #include <inttypes.h>
392 typedef uint64_t usec_t;
393 usec_t now(clockid_t clock);
398 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
399 add_project_arguments('-Werror=shadow', language : 'c')
402 cpp = ' '.join(cc.cmd_array()) + ' -E'
404 #####################################################################
405 # compilation result tests
407 conf.set('_GNU_SOURCE', true)
408 conf.set('__SANE_USERSPACE_TYPES__', true)
410 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
411 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
412 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
416 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
420 #include <sys/stat.h>
423 foreach decl : ['char16_t',
428 # We get -1 if the size cannot be determined
429 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
431 if decl == 'struct statx'
433 want_linux_stat_h = false
435 have = cc.sizeof(decl,
436 prefix : decl_headers + '#include <linux/stat.h>',
437 args : '-D_GNU_SOURCE') > 0
438 want_linux_stat_h = have
442 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
445 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
447 foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
448 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
449 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
450 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
451 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
452 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
453 ['FRA_TUN_ID', 'linux/fib_rules.h'],
454 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
455 ['FRA_PAD', 'linux/fib_rules.h'],
456 ['FRA_L3MDEV', 'linux/fib_rules.h'],
457 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
458 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
459 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
460 ['FOU_CMD_GET', 'linux/fou.h'],
461 ['IFA_FLAGS', 'linux/if_addr.h'],
462 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
463 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
464 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
465 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
466 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
467 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
468 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
469 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
470 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
471 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
472 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
473 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
474 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
475 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
476 ['IFLA_PAD', 'linux/if_link.h'],
477 ['IFLA_XDP', 'linux/if_link.h'],
478 ['IFLA_EVENT', 'linux/if_link.h'],
479 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
480 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
481 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
482 ['IFLA_MAX_MTU', 'linux/if_link.h'],
483 ['IFLA_BOND_MODE', 'linux/if_link.h'],
484 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
485 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
486 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
487 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
488 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
489 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
490 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
491 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
492 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
493 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
494 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
495 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
496 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
497 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
498 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
499 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
500 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
501 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
502 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
503 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
504 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
505 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
506 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
507 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
508 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
509 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
510 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
511 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
512 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
513 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
514 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
515 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
516 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
517 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
518 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
519 # if_tunnel.h is buggy and cannot be included on its own
520 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
521 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
522 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
523 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
524 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
525 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
526 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
527 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
528 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
529 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
530 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
532 prefix = decl.length() > 2 ? decl[2] : ''
533 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
534 conf.set10('HAVE_' + decl[0], have)
537 foreach ident : ['secure_getenv', '__secure_getenv']
538 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
542 ['memfd_create', '''#include <sys/mman.h>'''],
543 ['gettid', '''#include <sys/types.h>
544 #include <unistd.h>'''],
545 ['pivot_root', '''#include <stdlib.h>
546 #include <unistd.h>'''], # no known header declares pivot_root
547 ['name_to_handle_at', '''#include <sys/types.h>
548 #include <sys/stat.h>
549 #include <fcntl.h>'''],
550 ['setns', '''#include <sched.h>'''],
551 ['renameat2', '''#include <stdio.h>
552 #include <fcntl.h>'''],
553 ['kcmp', '''#include <linux/kcmp.h>'''],
554 ['keyctl', '''#include <sys/types.h>
555 #include <keyutils.h>'''],
556 ['copy_file_range', '''#include <sys/syscall.h>
557 #include <unistd.h>'''],
558 ['bpf', '''#include <sys/syscall.h>
559 #include <unistd.h>'''],
560 ['statx', '''#include <sys/types.h>
561 #include <sys/stat.h>
562 #include <unistd.h>'''],
563 ['explicit_bzero' , '''#include <string.h>'''],
564 ['reallocarray', '''#include <malloc.h>'''],
567 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
568 conf.set10('HAVE_' + ident[0].to_upper(), have)
571 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
572 conf.set10('USE_SYS_RANDOM_H', true)
573 conf.set10('HAVE_GETRANDOM', true)
575 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
576 conf.set10('USE_SYS_RANDOM_H', false)
577 conf.set10('HAVE_GETRANDOM', have)
580 #####################################################################
582 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
584 get_option('version-tag'),
585 meson.project_version()]
588 input : 'src/version/version.h.in',
589 output : 'version.h',
592 versiondep = declare_dependency(sources: version_h)
594 sed = find_program('sed')
595 awk = find_program('awk')
596 m4 = find_program('m4')
597 stat = find_program('stat')
598 git = find_program('git', required : false)
599 env = find_program('env')
600 perl = find_program('perl', required : false)
602 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
603 mkdir_p = 'mkdir -p $DESTDIR/@0@'
604 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
605 splash_bmp = files('test/splash.bmp')
607 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
608 # /usr/sbin, /sbin, and fall back to the default from middle column.
609 progs = [['quotaon', '/usr/sbin/quotaon' ],
610 ['quotacheck', '/usr/sbin/quotacheck' ],
611 ['kmod', '/usr/bin/kmod' ],
612 ['kexec', '/usr/sbin/kexec' ],
613 ['sulogin', '/usr/sbin/sulogin' ],
614 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
615 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
616 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
617 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
620 path = get_option(prog[0] + '-path')
622 message('Using @1@ for @0@'.format(prog[0], path))
624 exe = find_program(prog[0],
625 '/usr/sbin/' + prog[0],
628 path = exe.found() ? exe.path() : prog[1]
630 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
631 conf.set_quoted(name, path)
632 substs.set(name, path)
635 conf.set_quoted('TELINIT', get_option('telinit-path'))
637 if run_command('ln', '--relative', '--help').returncode() != 0
638 error('ln does not support --relative (added in coreutils 8.16)')
641 ############################################################
643 gperf = find_program('gperf')
645 gperf_test_format = '''
647 const char * in_word_set(const char *, @0@);
650 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
651 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
652 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
653 if cc.compiles(gperf_test)
654 gperf_len_type = 'size_t'
656 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
657 if cc.compiles(gperf_test)
658 gperf_len_type = 'unsigned'
660 error('unable to determine gperf len type')
663 message('gperf len type is @0@'.format(gperf_len_type))
664 conf.set('GPERF_LEN_TYPE', gperf_len_type,
665 description : 'The type of gperf "len" parameter')
667 ############################################################
669 if not cc.has_header('sys/capability.h')
670 error('POSIX caps headers not found')
672 foreach header : ['crypt.h',
673 'linux/btrfs_tree.h',
676 'linux/vm_sockets.h',
679 'valgrind/memcheck.h',
680 'valgrind/valgrind.h',
683 conf.set10('HAVE_' + header.underscorify().to_upper(),
684 cc.has_header(header))
687 ############################################################
689 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
690 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
691 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
693 default_hierarchy = get_option('default-hierarchy')
694 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
695 description : 'default cgroup hierarchy as string')
696 if default_hierarchy == 'legacy'
697 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
698 elif default_hierarchy == 'hybrid'
699 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
701 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
704 default_net_naming_scheme = get_option('default-net-naming-scheme')
705 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
707 time_epoch = get_option('time-epoch')
710 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
712 conf.set('TIME_EPOCH', time_epoch)
714 system_uid_max = get_option('system-uid-max')
715 if system_uid_max == -1
716 system_uid_max = run_command(
718 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
719 '/etc/login.defs').stdout().strip()
720 if system_uid_max == ''
723 system_uid_max = system_uid_max.to_int()
726 conf.set('SYSTEM_UID_MAX', system_uid_max)
727 substs.set('systemuidmax', system_uid_max)
729 system_gid_max = get_option('system-gid-max')
730 if system_gid_max == -1
731 system_gid_max = run_command(
733 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
734 '/etc/login.defs').stdout().strip()
735 if system_gid_max == ''
738 system_gid_max = system_gid_max.to_int()
741 conf.set('SYSTEM_GID_MAX', system_gid_max)
742 substs.set('systemgidmax', system_gid_max)
744 dynamic_uid_min = get_option('dynamic-uid-min')
745 dynamic_uid_max = get_option('dynamic-uid-max')
746 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
747 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
748 substs.set('dynamicuidmin', dynamic_uid_min)
749 substs.set('dynamicuidmax', dynamic_uid_max)
751 container_uid_base_min = get_option('container-uid-base-min')
752 container_uid_base_max = get_option('container-uid-base-max')
753 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
754 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
755 substs.set('containeruidbasemin', container_uid_base_min)
756 substs.set('containeruidbasemax', container_uid_base_max)
758 nobody_user = get_option('nobody-user')
759 nobody_group = get_option('nobody-group')
761 if not meson.is_cross_build()
762 getent_result = run_command('getent', 'passwd', '65534')
763 if getent_result.returncode() == 0
764 name = getent_result.stdout().split(':')[0]
765 if name != nobody_user
767 '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) +
768 'Your build will result in an user table setup that is incompatible with the local system.')
771 id_result = run_command('id', '-u', nobody_user)
772 if id_result.returncode() == 0
773 id = id_result.stdout().to_int()
776 '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) +
777 'Your build will result in an user table setup that is incompatible with the local system.')
781 getent_result = run_command('getent', 'group', '65534')
782 if getent_result.returncode() == 0
783 name = getent_result.stdout().split(':')[0]
784 if name != nobody_group
786 '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) +
787 'Your build will result in an group table setup that is incompatible with the local system.')
790 id_result = run_command('id', '-g', nobody_group)
791 if id_result.returncode() == 0
792 id = id_result.stdout().to_int()
795 '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) +
796 'Your build will result in an group table setup that is incompatible with the local system.')
800 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
802 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
803 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
806 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
807 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
808 substs.set('NOBODY_USER_NAME', nobody_user)
809 substs.set('NOBODY_GROUP_NAME', nobody_group)
811 tty_gid = get_option('tty-gid')
812 conf.set('TTY_GID', tty_gid)
813 substs.set('TTY_GID', tty_gid)
815 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
816 users_gid = get_option('users-gid')
817 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
819 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
820 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
822 dev_kvm_mode = get_option('dev-kvm-mode')
823 substs.set('DEV_KVM_MODE', dev_kvm_mode)
824 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
825 group_render_mode = get_option('group-render-mode')
826 substs.set('GROUP_RENDER_MODE', group_render_mode)
827 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
829 kill_user_processes = get_option('default-kill-user-processes')
830 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
831 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
832 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
834 dns_servers = get_option('dns-servers')
835 conf.set_quoted('DNS_SERVERS', dns_servers)
836 substs.set('DNS_SERVERS', dns_servers)
838 ntp_servers = get_option('ntp-servers')
839 conf.set_quoted('NTP_SERVERS', ntp_servers)
840 substs.set('NTP_SERVERS', ntp_servers)
842 default_locale = get_option('default-locale')
843 if default_locale == ''
844 if not meson.is_cross_build()
845 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
846 default_locale = run_command(choose_default_locale_sh).stdout().strip()
848 default_locale = 'C.UTF-8'
851 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
853 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
855 substs.set('SUSHELL', get_option('debug-shell'))
856 substs.set('DEBUGTTY', get_option('debug-tty'))
858 enable_debug_hashmap = false
859 enable_debug_mmap_cache = false
860 enable_debug_siphash = false
861 enable_debug_udev = false
862 foreach name : get_option('debug-extra')
864 enable_debug_hashmap = true
865 elif name == 'mmap-cache'
866 enable_debug_mmap_cache = true
867 elif name == 'siphash'
868 enable_debug_siphash = true
870 enable_debug_udev = true
872 message('unknown debug option "@0@", ignoring'.format(name))
875 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
876 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
877 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
878 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
880 conf.set10('VALGRIND', get_option('valgrind'))
881 conf.set10('LOG_TRACE', get_option('log-trace'))
883 #####################################################################
885 threads = dependency('threads')
886 librt = cc.find_library('rt')
887 libm = cc.find_library('m')
888 libdl = cc.find_library('dl')
889 libcrypt = cc.find_library('crypt')
891 libcap = dependency('libcap', required : false)
892 if not libcap.found()
893 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
894 libcap = cc.find_library('cap')
897 libmount = dependency('mount',
898 version : fuzzer_build ? '>= 0' : '>= 2.30')
900 want_seccomp = get_option('seccomp')
901 if want_seccomp != 'false' and not fuzzer_build
902 libseccomp = dependency('libseccomp',
903 version : '>= 2.3.1',
904 required : want_seccomp == 'true')
905 have = libseccomp.found()
910 conf.set10('HAVE_SECCOMP', have)
912 want_selinux = get_option('selinux')
913 if want_selinux != 'false' and not fuzzer_build
914 libselinux = dependency('libselinux',
915 version : '>= 2.1.9',
916 required : want_selinux == 'true')
917 have = libselinux.found()
922 conf.set10('HAVE_SELINUX', have)
924 want_apparmor = get_option('apparmor')
925 if want_apparmor != 'false' and not fuzzer_build
926 libapparmor = dependency('libapparmor',
927 required : want_apparmor == 'true')
928 have = libapparmor.found()
933 conf.set10('HAVE_APPARMOR', have)
935 smack_run_label = get_option('smack-run-label')
936 if smack_run_label != ''
937 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
940 want_polkit = get_option('polkit')
941 install_polkit = false
942 install_polkit_pkla = false
943 if want_polkit != 'false' and not fuzzer_build
944 install_polkit = true
946 libpolkit = dependency('polkit-gobject-1',
948 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
949 message('Old polkit detected, will install pkla files')
950 install_polkit_pkla = true
953 conf.set10('ENABLE_POLKIT', install_polkit)
955 want_acl = get_option('acl')
956 if want_acl != 'false' and not fuzzer_build
957 libacl = cc.find_library('acl', required : want_acl == 'true')
958 have = libacl.found()
963 conf.set10('HAVE_ACL', have)
965 want_audit = get_option('audit')
966 if want_audit != 'false' and not fuzzer_build
967 libaudit = dependency('audit', required : want_audit == 'true')
968 have = libaudit.found()
973 conf.set10('HAVE_AUDIT', have)
975 want_blkid = get_option('blkid')
976 if want_blkid != 'false' and not fuzzer_build
977 libblkid = dependency('blkid', required : want_blkid == 'true')
978 have = libblkid.found()
983 conf.set10('HAVE_BLKID', have)
985 want_kmod = get_option('kmod')
986 if want_kmod != 'false' and not fuzzer_build
987 libkmod = dependency('libkmod',
989 required : want_kmod == 'true')
990 have = libkmod.found()
995 conf.set10('HAVE_KMOD', have)
997 want_pam = get_option('pam')
998 if want_pam != 'false' and not fuzzer_build
999 libpam = cc.find_library('pam', required : want_pam == 'true')
1000 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1001 have = libpam.found() and libpam_misc.found()
1007 conf.set10('HAVE_PAM', have)
1009 want_microhttpd = get_option('microhttpd')
1010 if want_microhttpd != 'false' and not fuzzer_build
1011 libmicrohttpd = dependency('libmicrohttpd',
1012 version : '>= 0.9.33',
1013 required : want_microhttpd == 'true')
1014 have = libmicrohttpd.found()
1019 conf.set10('HAVE_MICROHTTPD', have)
1021 want_libcryptsetup = get_option('libcryptsetup')
1022 if want_libcryptsetup != 'false' and not fuzzer_build
1023 libcryptsetup = dependency('libcryptsetup',
1024 version : '>= 1.6.0',
1025 required : want_libcryptsetup == 'true')
1026 have = libcryptsetup.found()
1027 have_sector = cc.has_member(
1028 'struct crypt_params_plain',
1030 prefix : '#include <libcryptsetup.h>')
1036 conf.set10('HAVE_LIBCRYPTSETUP', have)
1037 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1039 want_libcurl = get_option('libcurl')
1040 if want_libcurl != 'false' and not fuzzer_build
1041 libcurl = dependency('libcurl',
1042 version : '>= 7.32.0',
1043 required : want_libcurl == 'true')
1044 have = libcurl.found()
1049 conf.set10('HAVE_LIBCURL', have)
1051 want_libidn = get_option('libidn')
1052 want_libidn2 = get_option('libidn2')
1053 if want_libidn == 'true' and want_libidn2 == 'true'
1054 error('libidn and libidn2 cannot be requested simultaneously')
1057 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1058 libidn = dependency('libidn',
1059 required : want_libidn == 'true')
1060 have = libidn.found()
1065 conf.set10('HAVE_LIBIDN', have)
1066 if not have and want_libidn2 != 'false' and not fuzzer_build
1067 # libidn is used for both libidn and libidn2 objects
1068 libidn = dependency('libidn2',
1069 required : want_libidn2 == 'true')
1070 have = libidn.found()
1074 conf.set10('HAVE_LIBIDN2', have)
1076 want_libiptc = get_option('libiptc')
1077 if want_libiptc != 'false' and not fuzzer_build
1078 libiptc = dependency('libiptc',
1079 required : want_libiptc == 'true')
1080 have = libiptc.found()
1085 conf.set10('HAVE_LIBIPTC', have)
1087 want_qrencode = get_option('qrencode')
1088 if want_qrencode != 'false' and not fuzzer_build
1089 libqrencode = dependency('libqrencode',
1090 required : want_qrencode == 'true')
1091 have = libqrencode.found()
1096 conf.set10('HAVE_QRENCODE', have)
1098 want_gcrypt = get_option('gcrypt')
1099 if want_gcrypt != 'false' and not fuzzer_build
1100 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1101 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1102 have = libgcrypt.found() and libgpg_error.found()
1107 # link to neither of the libs if one is not found
1111 conf.set10('HAVE_GCRYPT', have)
1113 want_gnutls = get_option('gnutls')
1114 if want_gnutls != 'false' and not fuzzer_build
1115 libgnutls = dependency('gnutls',
1116 version : '>= 3.1.4',
1117 required : want_gnutls == 'true')
1118 have = libgnutls.found()
1123 conf.set10('HAVE_GNUTLS', have)
1125 want_openssl = get_option('openssl')
1126 if want_openssl != 'false' and not fuzzer_build
1127 libopenssl = dependency('openssl',
1128 version : '>= 1.1.0',
1129 required : want_openssl == 'true')
1130 have = libopenssl.found()
1135 conf.set10('HAVE_OPENSSL', have)
1137 want_elfutils = get_option('elfutils')
1138 if want_elfutils != 'false' and not fuzzer_build
1139 libdw = dependency('libdw',
1140 required : want_elfutils == 'true')
1141 have = libdw.found()
1146 conf.set10('HAVE_ELFUTILS', have)
1148 want_zlib = get_option('zlib')
1149 if want_zlib != 'false' and not fuzzer_build
1150 libz = dependency('zlib',
1151 required : want_zlib == 'true')
1157 conf.set10('HAVE_ZLIB', have)
1159 want_bzip2 = get_option('bzip2')
1160 if want_bzip2 != 'false' and not fuzzer_build
1161 libbzip2 = cc.find_library('bz2',
1162 required : want_bzip2 == 'true')
1163 have = libbzip2.found()
1168 conf.set10('HAVE_BZIP2', have)
1170 want_xz = get_option('xz')
1171 if want_xz != 'false' and not fuzzer_build
1172 libxz = dependency('liblzma',
1173 required : want_xz == 'true')
1174 have = libxz.found()
1179 conf.set10('HAVE_XZ', have)
1181 want_lz4 = get_option('lz4')
1182 if want_lz4 != 'false' and not fuzzer_build
1183 liblz4 = dependency('liblz4',
1184 version : '>= 1.3.0',
1185 required : want_lz4 == 'true')
1186 have = liblz4.found()
1191 conf.set10('HAVE_LZ4', have)
1193 want_xkbcommon = get_option('xkbcommon')
1194 if want_xkbcommon != 'false' and not fuzzer_build
1195 libxkbcommon = dependency('xkbcommon',
1196 version : '>= 0.3.0',
1197 required : want_xkbcommon == 'true')
1198 have = libxkbcommon.found()
1203 conf.set10('HAVE_XKBCOMMON', have)
1205 want_pcre2 = get_option('pcre2')
1206 if want_pcre2 != 'false'
1207 libpcre2 = dependency('libpcre2-8',
1208 required : want_pcre2 == 'true')
1209 have = libpcre2.found()
1214 conf.set10('HAVE_PCRE2', have)
1216 want_glib = get_option('glib')
1217 if want_glib != 'false' and not fuzzer_build
1218 libglib = dependency('glib-2.0',
1219 version : '>= 2.22.0',
1220 required : want_glib == 'true')
1221 libgobject = dependency('gobject-2.0',
1222 version : '>= 2.22.0',
1223 required : want_glib == 'true')
1224 libgio = dependency('gio-2.0',
1225 required : want_glib == 'true')
1226 have = libglib.found() and libgobject.found() and libgio.found()
1233 conf.set10('HAVE_GLIB', have)
1235 want_dbus = get_option('dbus')
1236 if want_dbus != 'false' and not fuzzer_build
1237 libdbus = dependency('dbus-1',
1238 version : '>= 1.3.2',
1239 required : want_dbus == 'true')
1240 have = libdbus.found()
1245 conf.set10('HAVE_DBUS', have)
1247 default_dnssec = get_option('default-dnssec')
1249 default_dnssec = 'no'
1251 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1252 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1253 default_dnssec = 'no'
1255 conf.set('DEFAULT_DNSSEC_MODE',
1256 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1257 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1259 dns_over_tls = get_option('dns-over-tls')
1260 if dns_over_tls != 'false'
1261 if dns_over_tls == 'openssl'
1264 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1265 if dns_over_tls == 'gnutls' and not have_gnutls
1266 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1269 if dns_over_tls == 'gnutls' or have_gnutls
1270 have_openssl = false
1272 have_openssl = conf.get('HAVE_OPENSSL') == 1
1273 if dns_over_tls != 'auto' and not have_openssl
1274 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1275 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1278 have = have_gnutls or have_openssl
1282 have_openssl = false
1284 conf.set10('ENABLE_DNS_OVER_TLS', have)
1285 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1286 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1288 default_dns_over_tls = get_option('default-dns-over-tls')
1290 default_dns_over_tls = 'no'
1292 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1293 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1294 default_dns_over_tls = 'no'
1296 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1297 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1298 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1300 want_importd = get_option('importd')
1301 if want_importd != 'false'
1302 have = (conf.get('HAVE_LIBCURL') == 1 and
1303 conf.get('HAVE_ZLIB') == 1 and
1304 conf.get('HAVE_XZ') == 1 and
1305 conf.get('HAVE_GCRYPT') == 1)
1306 if want_importd == 'true' and not have
1307 error('importd support was requested, but dependencies are not available')
1312 conf.set10('ENABLE_IMPORTD', have)
1314 want_remote = get_option('remote')
1315 if want_remote != 'false'
1316 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1317 conf.get('HAVE_LIBCURL') == 1]
1318 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1319 # it's possible to build one without the other. Complain only if
1320 # support was explictly requested. The auxiliary files like sysusers
1321 # config should be installed when any of the programs are built.
1322 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1323 error('remote support was requested, but dependencies are not available')
1325 have = have_deps[0] or have_deps[1]
1329 conf.set10('ENABLE_REMOTE', have)
1331 foreach term : ['utmp',
1363 have = get_option(term)
1364 name = 'ENABLE_' + term.underscorify().to_upper()
1365 conf.set10(name, have)
1368 foreach tuple : [['nss-mymachines', 'machined'],
1369 ['nss-resolve', 'resolve']]
1370 want = get_option(tuple[0])
1372 have = get_option(tuple[1])
1373 if want == 'true' and not have
1374 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1379 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1380 conf.set10(name, have)
1384 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1385 'ENABLE_NSS_MYMACHINES',
1386 'ENABLE_NSS_RESOLVE',
1387 'ENABLE_NSS_SYSTEMD']
1388 if conf.get(term) == 1
1392 conf.set10('ENABLE_NSS', enable_nss)
1394 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1399 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1401 #####################################################################
1403 if get_option('efi')
1404 efi_arch = host_machine.cpu_family()
1406 if efi_arch == 'x86'
1407 EFI_MACHINE_TYPE_NAME = 'ia32'
1408 gnu_efi_arch = 'ia32'
1409 elif efi_arch == 'x86_64'
1410 EFI_MACHINE_TYPE_NAME = 'x64'
1411 gnu_efi_arch = 'x86_64'
1412 elif efi_arch == 'arm'
1413 EFI_MACHINE_TYPE_NAME = 'arm'
1414 gnu_efi_arch = 'arm'
1415 elif efi_arch == 'aarch64'
1416 EFI_MACHINE_TYPE_NAME = 'aa64'
1417 gnu_efi_arch = 'aarch64'
1419 EFI_MACHINE_TYPE_NAME = ''
1424 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1426 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1430 conf.set10('ENABLE_EFI', have)
1432 #####################################################################
1434 config_h = configure_file(
1435 output : 'config.h',
1436 configuration : conf)
1438 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1440 includes = include_directories('src/basic',
1444 'src/journal-remote',
1448 'src/time-wait-sync',
1454 'src/libsystemd/sd-bus',
1455 'src/libsystemd/sd-device',
1456 'src/libsystemd/sd-event',
1457 'src/libsystemd/sd-hwdb',
1458 'src/libsystemd/sd-id128',
1459 'src/libsystemd/sd-netlink',
1460 'src/libsystemd/sd-network',
1461 'src/libsystemd/sd-resolve',
1462 'src/libsystemd-network',
1465 add_project_arguments('-include', 'config.h', language : 'c')
1467 generate_gperfs = find_program('tools/generate-gperfs.py')
1471 subdir('src/systemd')
1473 subdir('src/libsystemd')
1474 subdir('src/libsystemd-network')
1475 subdir('src/journal')
1478 libjournal_core = static_library(
1480 libjournal_core_sources,
1482 include_directories : includes,
1485 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1486 libsystemd = shared_library(
1489 version : libsystemd_version,
1490 include_directories : includes,
1491 link_args : ['-shared',
1492 '-Wl,--version-script=' + libsystemd_sym_path],
1493 link_with : [libbasic,
1495 link_whole : [libsystemd_static,
1497 dependencies : [threads,
1501 link_depends : libsystemd_sym,
1503 install_dir : rootlibdir)
1505 static_libsystemd = get_option('static-libsystemd')
1506 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1508 install_libsystemd_static = static_library(
1511 journal_client_sources,
1513 basic_gcrypt_sources,
1515 include_directories : includes,
1516 build_by_default : static_libsystemd != 'false',
1517 install : static_libsystemd != 'false',
1518 install_dir : rootlibdir,
1519 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1520 dependencies : [threads,
1529 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1531 ############################################################
1533 # binaries that have --help and are intended for use by humans,
1534 # usually, but not always, installed in /bin.
1535 public_programs = []
1537 subdir('src/libudev')
1538 subdir('src/shared')
1540 subdir('src/shutdown')
1542 subdir('src/network')
1544 subdir('src/analyze')
1545 subdir('src/journal-remote')
1546 subdir('src/coredump')
1547 subdir('src/hostname')
1548 subdir('src/import')
1549 subdir('src/kernel-install')
1550 subdir('src/locale')
1551 subdir('src/machine')
1552 subdir('src/portable')
1553 subdir('src/nspawn')
1554 subdir('src/resolve')
1555 subdir('src/timedate')
1556 subdir('src/timesync')
1557 subdir('src/vconsole')
1558 subdir('src/boot/efi')
1565 ############################################################
1567 # only static linking apart from libdl, to make sure that the
1568 # module is linked to all libraries that it uses.
1569 test_dlopen = executable(
1573 include_directories : includes,
1574 link_with : [libbasic],
1575 dependencies : [libdl],
1576 build_by_default : want_tests != 'false')
1578 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1579 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1580 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1581 ['resolve', 'ENABLE_NSS_RESOLVE']]
1583 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1587 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1588 version_script_arg = join_paths(project_source_root, sym)
1590 nss = shared_library(
1592 'src/nss-@0@/nss-@0@.c'.format(module),
1595 include_directories : includes,
1596 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1597 link_args : ['-Wl,-z,nodelete',
1599 '-Wl,--version-script=' + version_script_arg,
1601 link_with : [libsystemd_static,
1603 dependencies : [threads,
1607 install_dir : rootlibdir)
1609 # We cannot use shared_module because it does not support version suffix.
1610 # Unfortunately shared_library insists on creating the symlink…
1611 meson.add_install_script('sh', '-c',
1612 'rm $DESTDIR@0@/libnss_@1@.so'
1613 .format(rootlibdir, module))
1615 if want_tests != 'false'
1616 test('dlopen-nss_' + module,
1618 # path to dlopen must include a slash
1619 args : nss.full_path())
1624 ############################################################
1626 executable('systemd',
1628 include_directories : includes,
1629 link_with : [libcore,
1631 dependencies : [versiondep,
1638 install_rpath : rootlibexecdir,
1640 install_dir : rootlibexecdir)
1642 meson.add_install_script(meson_make_symlink,
1643 join_paths(rootlibexecdir, 'systemd'),
1644 join_paths(rootsbindir, 'init'))
1646 exe = executable('systemd-analyze',
1647 systemd_analyze_sources,
1648 include_directories : includes,
1649 link_with : [libcore,
1651 dependencies : [versiondep,
1658 install_rpath : rootlibexecdir,
1660 public_programs += exe
1662 executable('systemd-journald',
1663 systemd_journald_sources,
1664 include_directories : includes,
1665 link_with : [libjournal_core,
1667 dependencies : [threads,
1671 install_rpath : rootlibexecdir,
1673 install_dir : rootlibexecdir)
1675 exe = executable('systemd-cat',
1676 systemd_cat_sources,
1677 include_directories : includes,
1678 link_with : [libjournal_core,
1680 dependencies : [threads],
1681 install_rpath : rootlibexecdir,
1683 public_programs += exe
1685 exe = executable('journalctl',
1687 include_directories : includes,
1688 link_with : [libshared],
1689 dependencies : [threads,
1694 install_rpath : rootlibexecdir,
1696 install_dir : rootbindir)
1697 public_programs += exe
1699 executable('systemd-getty-generator',
1700 'src/getty-generator/getty-generator.c',
1701 include_directories : includes,
1702 link_with : [libshared],
1703 install_rpath : rootlibexecdir,
1705 install_dir : systemgeneratordir)
1707 executable('systemd-debug-generator',
1708 'src/debug-generator/debug-generator.c',
1709 include_directories : includes,
1710 link_with : [libshared],
1711 install_rpath : rootlibexecdir,
1713 install_dir : systemgeneratordir)
1715 executable('systemd-run-generator',
1716 'src/run-generator/run-generator.c',
1717 include_directories : includes,
1718 link_with : [libshared],
1719 install_rpath : rootlibexecdir,
1721 install_dir : systemgeneratordir)
1723 executable('systemd-fstab-generator',
1724 'src/fstab-generator/fstab-generator.c',
1725 include_directories : includes,
1726 link_with : [libcore_shared,
1728 install_rpath : rootlibexecdir,
1730 install_dir : systemgeneratordir)
1732 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1733 executable('30-systemd-environment-d-generator',
1734 'src/environment-d-generator/environment-d-generator.c',
1735 include_directories : includes,
1736 link_with : [libshared],
1737 install_rpath : rootlibexecdir,
1739 install_dir : userenvgeneratordir)
1741 meson.add_install_script(meson_make_symlink,
1742 join_paths(sysconfdir, 'environment'),
1743 join_paths(environmentdir, '99-environment.conf'))
1746 if conf.get('ENABLE_HIBERNATE') == 1
1747 executable('systemd-hibernate-resume-generator',
1748 'src/hibernate-resume/hibernate-resume-generator.c',
1749 include_directories : includes,
1750 link_with : [libshared],
1751 install_rpath : rootlibexecdir,
1753 install_dir : systemgeneratordir)
1755 executable('systemd-hibernate-resume',
1756 'src/hibernate-resume/hibernate-resume.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 install_rpath : rootlibexecdir,
1761 install_dir : rootlibexecdir)
1764 if conf.get('HAVE_BLKID') == 1
1765 executable('systemd-gpt-auto-generator',
1766 'src/gpt-auto-generator/gpt-auto-generator.c',
1767 'src/shared/blkid-util.h',
1768 include_directories : includes,
1769 link_with : [libshared],
1770 dependencies : libblkid,
1771 install_rpath : rootlibexecdir,
1773 install_dir : systemgeneratordir)
1775 exe = executable('systemd-dissect',
1776 'src/dissect/dissect.c',
1777 include_directories : includes,
1778 link_with : [libshared],
1779 install_rpath : rootlibexecdir,
1781 install_dir : rootlibexecdir)
1782 public_programs += exe
1785 if conf.get('ENABLE_RESOLVE') == 1
1786 executable('systemd-resolved',
1787 systemd_resolved_sources,
1788 include_directories : includes,
1789 link_with : [libshared,
1791 libsystemd_resolve_core],
1792 dependencies : systemd_resolved_dependencies,
1793 install_rpath : rootlibexecdir,
1795 install_dir : rootlibexecdir)
1797 exe = executable('resolvectl',
1799 include_directories : includes,
1800 link_with : [libshared,
1802 libsystemd_resolve_core],
1803 dependencies : [threads,
1807 install_rpath : rootlibexecdir,
1809 public_programs += exe
1811 meson.add_install_script(meson_make_symlink,
1812 join_paths(bindir, 'resolvectl'),
1813 join_paths(rootsbindir, 'resolvconf'))
1815 meson.add_install_script(meson_make_symlink,
1816 join_paths(bindir, 'resolvectl'),
1817 join_paths(bindir, 'systemd-resolve'))
1820 if conf.get('ENABLE_LOGIND') == 1
1821 executable('systemd-logind',
1822 systemd_logind_sources,
1823 include_directories : includes,
1824 link_with : [liblogind_core,
1826 dependencies : [threads,
1828 install_rpath : rootlibexecdir,
1830 install_dir : rootlibexecdir)
1832 exe = executable('loginctl',
1834 include_directories : includes,
1835 link_with : [libshared],
1836 dependencies : [threads,
1839 install_rpath : rootlibexecdir,
1841 install_dir : rootbindir)
1842 public_programs += exe
1844 exe = executable('systemd-inhibit',
1845 'src/login/inhibit.c',
1846 include_directories : includes,
1847 link_with : [libshared],
1848 install_rpath : rootlibexecdir,
1850 install_dir : rootbindir)
1851 public_programs += exe
1853 if conf.get('HAVE_PAM') == 1
1854 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1855 pam_systemd = shared_library(
1859 include_directories : includes,
1860 link_args : ['-shared',
1861 '-Wl,--version-script=' + version_script_arg],
1862 link_with : [libsystemd_static,
1864 dependencies : [threads,
1867 link_depends : pam_systemd_sym,
1869 install_dir : pamlibdir)
1871 if want_tests != 'false'
1872 test('dlopen-pam_systemd',
1874 # path to dlopen must include a slash
1875 args : pam_systemd.full_path())
1879 executable('systemd-user-runtime-dir',
1880 user_runtime_dir_sources,
1881 include_directories : includes,
1882 link_with : [libshared],
1883 install_rpath : rootlibexecdir,
1885 install_dir : rootlibexecdir)
1888 if conf.get('HAVE_PAM') == 1
1889 executable('systemd-user-sessions',
1890 'src/user-sessions/user-sessions.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootlibexecdir)
1898 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1899 exe = executable('bootctl',
1900 'src/boot/bootctl.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 dependencies : [libblkid],
1904 install_rpath : rootlibexecdir,
1906 public_programs += exe
1908 executable('systemd-bless-boot',
1909 'src/boot/bless-boot.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 dependencies : [libblkid],
1913 install_rpath : rootlibexecdir,
1915 install_dir : rootlibexecdir)
1917 executable('systemd-bless-boot-generator',
1918 'src/boot/bless-boot-generator.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 install_rpath : rootlibexecdir,
1923 install_dir : systemgeneratordir)
1926 executable('systemd-boot-check-no-failures',
1927 'src/boot/boot-check-no-failures.c',
1928 include_directories : includes,
1929 link_with : [libshared],
1930 dependencies : [libblkid],
1931 install_rpath : rootlibexecdir,
1933 install_dir : rootlibexecdir)
1935 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1936 include_directories : includes,
1937 link_with : [libshared],
1938 dependencies : [threads],
1939 install_rpath : rootlibexecdir,
1941 public_programs += exe
1944 if get_option('link-systemctl-shared')
1945 systemctl_link_with = [libshared]
1947 systemctl_link_with = [libsystemd_static,
1953 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1954 include_directories : includes,
1955 link_with : systemctl_link_with,
1956 dependencies : [threads,
1961 install_rpath : rootlibexecdir,
1963 install_dir : rootbindir)
1964 public_programs += exe
1966 if conf.get('ENABLE_PORTABLED') == 1
1967 executable('systemd-portabled',
1968 systemd_portabled_sources,
1969 include_directories : includes,
1970 link_with : [libshared],
1971 dependencies : [threads],
1972 install_rpath : rootlibexecdir,
1974 install_dir : rootlibexecdir)
1976 exe = executable('portablectl', 'src/portable/portablectl.c',
1977 include_directories : includes,
1978 link_with : [libshared],
1979 dependencies : [threads],
1980 install_rpath : rootlibexecdir,
1982 install_dir : rootbindir)
1983 public_programs += exe
1986 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1987 meson.add_install_script(meson_make_symlink,
1988 join_paths(rootbindir, 'systemctl'),
1989 join_paths(rootsbindir, alias))
1992 if conf.get('ENABLE_BACKLIGHT') == 1
1993 executable('systemd-backlight',
1994 'src/backlight/backlight.c',
1995 include_directories : includes,
1996 link_with : [libshared],
1997 install_rpath : rootlibexecdir,
1999 install_dir : rootlibexecdir)
2002 if conf.get('ENABLE_RFKILL') == 1
2003 executable('systemd-rfkill',
2004 'src/rfkill/rfkill.c',
2005 include_directories : includes,
2006 link_with : [libshared],
2007 install_rpath : rootlibexecdir,
2009 install_dir : rootlibexecdir)
2012 executable('systemd-system-update-generator',
2013 'src/system-update-generator/system-update-generator.c',
2014 include_directories : includes,
2015 link_with : [libshared],
2016 install_rpath : rootlibexecdir,
2018 install_dir : systemgeneratordir)
2020 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2021 executable('systemd-cryptsetup',
2022 'src/cryptsetup/cryptsetup.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [libcryptsetup],
2026 install_rpath : rootlibexecdir,
2028 install_dir : rootlibexecdir)
2030 executable('systemd-cryptsetup-generator',
2031 'src/cryptsetup/cryptsetup-generator.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 dependencies : [libcryptsetup],
2035 install_rpath : rootlibexecdir,
2037 install_dir : systemgeneratordir)
2039 executable('systemd-veritysetup',
2040 'src/veritysetup/veritysetup.c',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 dependencies : [libcryptsetup],
2044 install_rpath : rootlibexecdir,
2046 install_dir : rootlibexecdir)
2048 executable('systemd-veritysetup-generator',
2049 'src/veritysetup/veritysetup-generator.c',
2050 include_directories : includes,
2051 link_with : [libshared],
2052 dependencies : [libcryptsetup],
2053 install_rpath : rootlibexecdir,
2055 install_dir : systemgeneratordir)
2058 if conf.get('HAVE_SYSV_COMPAT') == 1
2059 executable('systemd-sysv-generator',
2060 'src/sysv-generator/sysv-generator.c',
2061 include_directories : includes,
2062 link_with : [libshared],
2063 install_rpath : rootlibexecdir,
2065 install_dir : systemgeneratordir)
2067 executable('systemd-rc-local-generator',
2068 'src/rc-local-generator/rc-local-generator.c',
2069 include_directories : includes,
2070 link_with : [libshared],
2071 install_rpath : rootlibexecdir,
2073 install_dir : systemgeneratordir)
2076 if conf.get('ENABLE_HOSTNAMED') == 1
2077 executable('systemd-hostnamed',
2078 'src/hostname/hostnamed.c',
2079 include_directories : includes,
2080 link_with : [libshared],
2081 install_rpath : rootlibexecdir,
2083 install_dir : rootlibexecdir)
2085 exe = executable('hostnamectl',
2086 'src/hostname/hostnamectl.c',
2087 include_directories : includes,
2088 link_with : [libshared],
2089 install_rpath : rootlibexecdir,
2091 public_programs += exe
2094 if conf.get('ENABLE_LOCALED') == 1
2095 if conf.get('HAVE_XKBCOMMON') == 1
2096 # logind will load libxkbcommon.so dynamically on its own
2102 executable('systemd-localed',
2103 systemd_localed_sources,
2104 include_directories : includes,
2105 link_with : [libshared],
2106 dependencies : deps,
2107 install_rpath : rootlibexecdir,
2109 install_dir : rootlibexecdir)
2111 exe = executable('localectl',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 install_rpath : rootlibexecdir,
2117 public_programs += exe
2120 if conf.get('ENABLE_TIMEDATED') == 1
2121 executable('systemd-timedated',
2122 'src/timedate/timedated.c',
2123 include_directories : includes,
2124 link_with : [libshared],
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootlibexecdir)
2130 if conf.get('ENABLE_TIMEDATECTL') == 1
2131 exe = executable('timedatectl',
2132 'src/timedate/timedatectl.c',
2133 include_directories : includes,
2134 install_rpath : rootlibexecdir,
2135 link_with : [libshared],
2136 dependencies : [libm],
2138 public_programs += exe
2141 if conf.get('ENABLE_TIMESYNCD') == 1
2142 executable('systemd-timesyncd',
2143 systemd_timesyncd_sources,
2144 include_directories : includes,
2145 link_with : [libshared],
2146 dependencies : [threads,
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootlibexecdir)
2152 executable('systemd-time-wait-sync',
2153 'src/time-wait-sync/time-wait-sync.c',
2154 include_directories : includes,
2155 link_with : [libshared],
2156 install_rpath : rootlibexecdir,
2158 install_dir : rootlibexecdir)
2161 if conf.get('ENABLE_MACHINED') == 1
2162 executable('systemd-machined',
2163 systemd_machined_sources,
2164 include_directories : includes,
2165 link_with : [libmachine_core,
2167 install_rpath : rootlibexecdir,
2169 install_dir : rootlibexecdir)
2171 exe = executable('machinectl',
2172 'src/machine/machinectl.c',
2173 include_directories : includes,
2174 link_with : [libshared],
2175 dependencies : [threads,
2178 install_rpath : rootlibexecdir,
2180 install_dir : rootbindir)
2181 public_programs += exe
2184 if conf.get('ENABLE_IMPORTD') == 1
2185 executable('systemd-importd',
2186 systemd_importd_sources,
2187 include_directories : includes,
2188 link_with : [libshared],
2189 dependencies : [threads],
2190 install_rpath : rootlibexecdir,
2192 install_dir : rootlibexecdir)
2194 systemd_pull = executable('systemd-pull',
2195 systemd_pull_sources,
2196 include_directories : includes,
2197 link_with : [libshared],
2198 dependencies : [versiondep,
2204 install_rpath : rootlibexecdir,
2206 install_dir : rootlibexecdir)
2208 systemd_import = executable('systemd-import',
2209 systemd_import_sources,
2210 include_directories : includes,
2211 link_with : [libshared],
2212 dependencies : [libcurl,
2216 install_rpath : rootlibexecdir,
2218 install_dir : rootlibexecdir)
2220 systemd_import_fs = executable('systemd-import-fs',
2221 systemd_import_fs_sources,
2222 include_directories : includes,
2223 link_with : [libshared],
2224 install_rpath : rootlibexecdir,
2226 install_dir : rootlibexecdir)
2228 systemd_export = executable('systemd-export',
2229 systemd_export_sources,
2230 include_directories : includes,
2231 link_with : [libshared],
2232 dependencies : [libcurl,
2236 install_rpath : rootlibexecdir,
2238 install_dir : rootlibexecdir)
2240 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2243 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2244 exe = executable('systemd-journal-upload',
2245 systemd_journal_upload_sources,
2246 include_directories : includes,
2247 link_with : [libshared],
2248 dependencies : [versiondep,
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootlibexecdir)
2257 public_programs += exe
2260 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2261 s_j_remote = executable('systemd-journal-remote',
2262 systemd_journal_remote_sources,
2263 include_directories : includes,
2264 link_with : [libshared,
2265 libsystemd_journal_remote],
2266 dependencies : [threads,
2271 install_rpath : rootlibexecdir,
2273 install_dir : rootlibexecdir)
2275 s_j_gatewayd = executable('systemd-journal-gatewayd',
2276 systemd_journal_gatewayd_sources,
2277 include_directories : includes,
2278 link_with : [libshared],
2279 dependencies : [threads,
2284 install_rpath : rootlibexecdir,
2286 install_dir : rootlibexecdir)
2287 public_programs += [s_j_remote, s_j_gatewayd]
2290 if conf.get('ENABLE_COREDUMP') == 1
2291 executable('systemd-coredump',
2292 systemd_coredump_sources,
2293 include_directories : includes,
2294 link_with : [libshared],
2295 dependencies : [threads,
2300 install_rpath : rootlibexecdir,
2302 install_dir : rootlibexecdir)
2304 exe = executable('coredumpctl',
2305 coredumpctl_sources,
2306 include_directories : includes,
2307 link_with : [libshared],
2308 dependencies : [threads,
2311 install_rpath : rootlibexecdir,
2313 public_programs += exe
2316 if conf.get('ENABLE_BINFMT') == 1
2317 exe = executable('systemd-binfmt',
2318 'src/binfmt/binfmt.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 install_rpath : rootlibexecdir,
2323 install_dir : rootlibexecdir)
2324 public_programs += exe
2326 meson.add_install_script('sh', '-c',
2327 mkdir_p.format(binfmtdir))
2328 meson.add_install_script('sh', '-c',
2329 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2332 if conf.get('ENABLE_VCONSOLE') == 1
2333 executable('systemd-vconsole-setup',
2334 'src/vconsole/vconsole-setup.c',
2335 include_directories : includes,
2336 link_with : [libshared],
2337 install_rpath : rootlibexecdir,
2339 install_dir : rootlibexecdir)
2342 if conf.get('ENABLE_RANDOMSEED') == 1
2343 executable('systemd-random-seed',
2344 'src/random-seed/random-seed.c',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2349 install_dir : rootlibexecdir)
2352 if conf.get('ENABLE_FIRSTBOOT') == 1
2353 executable('systemd-firstboot',
2354 'src/firstboot/firstboot.c',
2355 include_directories : includes,
2356 link_with : [libshared],
2357 dependencies : [libcrypt],
2358 install_rpath : rootlibexecdir,
2360 install_dir : rootbindir)
2363 executable('systemd-remount-fs',
2364 'src/remount-fs/remount-fs.c',
2365 include_directories : includes,
2366 link_with : [libcore_shared,
2368 install_rpath : rootlibexecdir,
2370 install_dir : rootlibexecdir)
2372 executable('systemd-machine-id-setup',
2373 'src/machine-id-setup/machine-id-setup-main.c',
2374 include_directories : includes,
2375 link_with : [libcore_shared,
2377 install_rpath : rootlibexecdir,
2379 install_dir : rootbindir)
2381 executable('systemd-fsck',
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2387 install_dir : rootlibexecdir)
2389 executable('systemd-growfs',
2390 'src/partition/growfs.c',
2391 include_directories : includes,
2392 link_with : [libshared],
2393 dependencies : [libcryptsetup],
2394 install_rpath : rootlibexecdir,
2396 install_dir : rootlibexecdir)
2398 executable('systemd-makefs',
2399 'src/partition/makefs.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootlibexecdir)
2406 executable('systemd-sleep',
2407 'src/sleep/sleep.c',
2408 include_directories : includes,
2409 link_with : [libshared],
2410 install_rpath : rootlibexecdir,
2412 install_dir : rootlibexecdir)
2414 install_data('src/sleep/sleep.conf',
2415 install_dir : pkgsysconfdir)
2417 exe = executable('systemd-sysctl',
2418 'src/sysctl/sysctl.c',
2419 include_directories : includes,
2420 link_with : [libshared],
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootlibexecdir)
2424 public_programs += exe
2426 executable('systemd-ac-power',
2427 'src/ac-power/ac-power.c',
2428 include_directories : includes,
2429 link_with : [libshared],
2430 install_rpath : rootlibexecdir,
2432 install_dir : rootlibexecdir)
2434 exe = executable('systemd-detect-virt',
2435 'src/detect-virt/detect-virt.c',
2436 include_directories : includes,
2437 link_with : [libshared],
2438 install_rpath : rootlibexecdir,
2440 public_programs += exe
2442 exe = executable('systemd-delta',
2443 'src/delta/delta.c',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 install_rpath : rootlibexecdir,
2448 public_programs += exe
2450 exe = executable('systemd-escape',
2451 'src/escape/escape.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootbindir)
2457 public_programs += exe
2459 exe = executable('systemd-notify',
2460 'src/notify/notify.c',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2465 install_dir : rootbindir)
2466 public_programs += exe
2468 executable('systemd-volatile-root',
2469 'src/volatile-root/volatile-root.c',
2470 include_directories : includes,
2471 link_with : [libshared],
2472 install_rpath : rootlibexecdir,
2474 install_dir : rootlibexecdir)
2476 executable('systemd-cgroups-agent',
2477 'src/cgroups-agent/cgroups-agent.c',
2478 include_directories : includes,
2479 link_with : [libshared],
2480 install_rpath : rootlibexecdir,
2482 install_dir : rootlibexecdir)
2484 exe = executable('systemd-id128',
2485 'src/id128/id128.c',
2486 include_directories : includes,
2487 link_with : [libshared],
2488 install_rpath : rootlibexecdir,
2490 public_programs += exe
2492 exe = executable('systemd-path',
2494 include_directories : includes,
2495 link_with : [libshared],
2496 install_rpath : rootlibexecdir,
2498 public_programs += exe
2500 exe = executable('systemd-ask-password',
2501 'src/ask-password/ask-password.c',
2502 include_directories : includes,
2503 link_with : [libshared],
2504 install_rpath : rootlibexecdir,
2506 install_dir : rootbindir)
2507 public_programs += exe
2509 executable('systemd-reply-password',
2510 'src/reply-password/reply-password.c',
2511 include_directories : includes,
2512 link_with : [libshared],
2513 install_rpath : rootlibexecdir,
2515 install_dir : rootlibexecdir)
2517 exe = executable('systemd-tty-ask-password-agent',
2518 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2519 include_directories : includes,
2520 link_with : [libshared],
2521 install_rpath : rootlibexecdir,
2523 install_dir : rootbindir)
2524 public_programs += exe
2526 exe = executable('systemd-cgls',
2528 include_directories : includes,
2529 link_with : [libshared],
2530 install_rpath : rootlibexecdir,
2532 public_programs += exe
2534 exe = executable('systemd-cgtop',
2535 'src/cgtop/cgtop.c',
2536 include_directories : includes,
2537 link_with : [libshared],
2538 install_rpath : rootlibexecdir,
2540 public_programs += exe
2542 executable('systemd-initctl',
2543 'src/initctl/initctl.c',
2544 include_directories : includes,
2545 link_with : [libshared],
2546 install_rpath : rootlibexecdir,
2548 install_dir : rootlibexecdir)
2550 exe = executable('systemd-mount',
2551 'src/mount/mount-tool.c',
2552 include_directories : includes,
2553 link_with : [libshared],
2554 install_rpath : rootlibexecdir,
2556 public_programs += exe
2558 meson.add_install_script(meson_make_symlink,
2559 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2561 exe = executable('systemd-run',
2563 include_directories : includes,
2564 link_with : [libshared],
2565 install_rpath : rootlibexecdir,
2567 public_programs += exe
2569 exe = executable('systemd-stdio-bridge',
2570 'src/stdio-bridge/stdio-bridge.c',
2571 include_directories : includes,
2572 link_with : [libshared],
2573 dependencies : [versiondep],
2574 install_rpath : rootlibexecdir,
2576 public_programs += exe
2578 exe = executable('busctl',
2579 'src/busctl/busctl.c',
2580 'src/busctl/busctl-introspect.c',
2581 'src/busctl/busctl-introspect.h',
2582 include_directories : includes,
2583 link_with : [libshared],
2584 install_rpath : rootlibexecdir,
2586 public_programs += exe
2588 if conf.get('ENABLE_SYSUSERS') == 1
2589 exe = executable('systemd-sysusers',
2590 'src/sysusers/sysusers.c',
2591 include_directories : includes,
2592 link_with : [libshared],
2593 install_rpath : rootlibexecdir,
2595 install_dir : rootbindir)
2596 public_programs += exe
2599 if conf.get('ENABLE_TMPFILES') == 1
2600 exe = executable('systemd-tmpfiles',
2601 'src/tmpfiles/tmpfiles.c',
2602 include_directories : includes,
2603 link_with : [libshared],
2604 dependencies : [libacl],
2605 install_rpath : rootlibexecdir,
2607 install_dir : rootbindir)
2608 public_programs += exe
2610 if want_tests != 'false'
2611 test('test-systemd-tmpfiles',
2612 test_systemd_tmpfiles_py,
2613 # https://github.com/mesonbuild/meson/issues/2681
2614 args : exe.full_path())
2618 if conf.get('ENABLE_HWDB') == 1
2619 exe = executable('systemd-hwdb',
2621 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2622 include_directories : includes,
2623 link_with : [libudev_static],
2624 install_rpath : udev_rpath,
2626 install_dir : rootbindir)
2627 public_programs += exe
2630 if conf.get('ENABLE_QUOTACHECK') == 1
2631 executable('systemd-quotacheck',
2632 'src/quotacheck/quotacheck.c',
2633 include_directories : includes,
2634 link_with : [libshared],
2635 install_rpath : rootlibexecdir,
2637 install_dir : rootlibexecdir)
2640 exe = executable('systemd-socket-proxyd',
2641 'src/socket-proxy/socket-proxyd.c',
2642 include_directories : includes,
2643 link_with : [libshared],
2644 dependencies : [threads],
2645 install_rpath : rootlibexecdir,
2647 install_dir : rootlibexecdir)
2648 public_programs += exe
2650 exe = executable('systemd-udevd',
2651 systemd_udevd_sources,
2652 include_directories : includes,
2653 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2654 link_with : [libudev_core,
2657 dependencies : [versiondep,
2663 install_rpath : udev_rpath,
2665 install_dir : rootlibexecdir)
2666 public_programs += exe
2668 exe = executable('udevadm',
2670 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2671 include_directories : includes,
2672 link_with : [libudev_core,
2675 dependencies : [versiondep,
2681 install_rpath : udev_rpath,
2683 install_dir : rootbindir)
2684 public_programs += exe
2686 executable('systemd-shutdown',
2687 systemd_shutdown_sources,
2688 include_directories : includes,
2689 link_with : [libcore_shared,
2691 dependencies : [libmount],
2692 install_rpath : rootlibexecdir,
2694 install_dir : rootlibexecdir)
2696 executable('systemd-update-done',
2697 'src/update-done/update-done.c',
2698 include_directories : includes,
2699 link_with : [libshared],
2700 install_rpath : rootlibexecdir,
2702 install_dir : rootlibexecdir)
2704 executable('systemd-update-utmp',
2705 'src/update-utmp/update-utmp.c',
2706 include_directories : includes,
2707 link_with : [libshared],
2708 dependencies : [libaudit],
2709 install_rpath : rootlibexecdir,
2711 install_dir : rootlibexecdir)
2713 if conf.get('HAVE_KMOD') == 1
2714 executable('systemd-modules-load',
2715 'src/modules-load/modules-load.c',
2716 include_directories : includes,
2717 link_with : [libshared],
2718 dependencies : [libkmod],
2719 install_rpath : rootlibexecdir,
2721 install_dir : rootlibexecdir)
2723 meson.add_install_script('sh', '-c',
2724 mkdir_p.format(modulesloaddir))
2725 meson.add_install_script('sh', '-c',
2726 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2729 exe = executable('systemd-nspawn',
2730 systemd_nspawn_sources,
2731 include_directories : includes,
2732 link_with : [libcore_shared,
2735 dependencies : [libblkid],
2736 install_rpath : rootlibexecdir,
2738 public_programs += exe
2740 if conf.get('ENABLE_NETWORKD') == 1
2741 executable('systemd-networkd',
2742 systemd_networkd_sources,
2743 include_directories : includes,
2744 link_with : [libnetworkd_core,
2748 dependencies : [threads],
2749 install_rpath : rootlibexecdir,
2751 install_dir : rootlibexecdir)
2753 executable('systemd-networkd-wait-online',
2754 systemd_networkd_wait_online_sources,
2755 include_directories : includes,
2756 link_with : [libnetworkd_core,
2758 install_rpath : rootlibexecdir,
2760 install_dir : rootlibexecdir)
2762 exe = executable('networkctl',
2764 include_directories : includes,
2765 link_with : [libsystemd_network,
2767 install_rpath : rootlibexecdir,
2769 install_dir : rootbindir)
2770 public_programs += exe
2773 executable('systemd-sulogin-shell',
2774 ['src/sulogin-shell/sulogin-shell.c'],
2775 include_directories : includes,
2776 link_with : [libshared],
2777 install_rpath : rootlibexecdir,
2779 install_dir : rootlibexecdir)
2781 ############################################################
2784 'systemd-runtest.env',
2785 output : 'systemd-runtest.env',
2786 command : ['sh', '-c', '{ ' +
2787 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2788 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2790 build_by_default : true)
2792 foreach tuple : tests
2794 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2795 dependencies = tuple[2]
2796 condition = tuple.length() >= 4 ? tuple[3] : ''
2797 type = tuple.length() >= 5 ? tuple[4] : ''
2798 defs = tuple.length() >= 6 ? tuple[5] : []
2799 incs = tuple.length() >= 7 ? tuple[6] : includes
2802 name = sources[0].split('/')[-1].split('.')[0]
2803 if type.startswith('timeout=')
2804 timeout = type.split('=')[1].to_int()
2808 if condition == '' or conf.get(condition) == 1
2812 include_directories : incs,
2813 link_with : link_with,
2814 dependencies : [versiondep,
2817 build_by_default : want_tests != 'false',
2818 install_rpath : rootlibexecdir,
2819 install : install_tests,
2820 install_dir : join_paths(testsdir, type))
2823 message('@0@ is a manual test'.format(name))
2824 elif type == 'unsafe' and want_tests != 'unsafe'
2825 message('@0@ is an unsafe test'.format(name))
2826 elif want_tests != 'false'
2832 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2837 'test-libsystemd-sym',
2838 test_libsystemd_sym_c,
2839 include_directories : includes,
2840 link_with : [libsystemd],
2841 build_by_default : want_tests != 'false',
2842 install : install_tests,
2843 install_dir : testsdir)
2844 if want_tests != 'false'
2845 test('test-libsystemd-sym', exe)
2849 'test-libsystemd-static-sym',
2850 test_libsystemd_sym_c,
2851 include_directories : includes,
2852 link_with : [install_libsystemd_static],
2853 dependencies : [threads], # threads is already included in dependencies on the library,
2854 # but does not seem to get propagated. Add here as a work-around.
2855 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2856 install : install_tests and static_libsystemd_pic,
2857 install_dir : testsdir)
2858 if want_tests != 'false' and static_libsystemd_pic
2859 test('test-libsystemd-static-sym', exe)
2865 include_directories : includes,
2866 c_args : '-Wno-deprecated-declarations',
2867 link_with : [libudev],
2868 build_by_default : want_tests != 'false',
2869 install : install_tests,
2870 install_dir : testsdir)
2871 if want_tests != 'false'
2872 test('test-libudev-sym', exe)
2876 'test-libudev-static-sym',
2878 include_directories : includes,
2879 c_args : '-Wno-deprecated-declarations',
2880 link_with : [install_libudev_static],
2881 build_by_default : want_tests != 'false' and static_libudev_pic,
2882 install : install_tests and static_libudev_pic,
2883 install_dir : testsdir)
2884 if want_tests != 'false' and static_libudev_pic
2885 test('test-libudev-static-sym', exe)
2888 ############################################################
2892 if get_option('tests') != 'false'
2893 foreach tuple : fuzzers
2895 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2896 dependencies = tuple[2]
2897 defs = tuple.length() >= 4 ? tuple[3] : []
2898 incs = tuple.length() >= 5 ? tuple[4] : includes
2901 dependencies += fuzzing_engine
2903 sources += 'src/fuzz/fuzz-main.c'
2906 name = sources[0].split('/')[-1].split('.')[0]
2908 fuzzer_exes += executable(
2911 include_directories : [incs, include_directories('src/fuzz')],
2912 link_with : link_with,
2913 dependencies : dependencies,
2919 run_target('fuzzers',
2920 depends : fuzzer_exes,
2923 ############################################################
2925 make_directive_index_py = find_program('tools/make-directive-index.py')
2926 make_man_index_py = find_program('tools/make-man-index.py')
2927 xml_helper_py = find_program('tools/xml_helper.py')
2928 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2932 subdir('sysusers.d')
2933 subdir('tmpfiles.d')
2938 subdir('shell-completion/bash')
2939 subdir('shell-completion/zsh')
2940 subdir('docs/sysvinit')
2941 subdir('docs/var-log')
2943 install_subdir('factory/etc',
2944 install_dir : factorydir)
2946 install_data('xorg/50-systemd-user.sh',
2947 install_dir : xinitrcdir)
2948 install_data('modprobe.d/systemd.conf',
2949 install_dir : modprobedir)
2950 install_data('LICENSE.GPL2',
2954 'docs/CODING_STYLE.md',
2955 'docs/DISTRO_PORTING.md',
2956 'docs/ENVIRONMENT.md',
2958 'docs/TRANSIENT-SETTINGS.md',
2959 'docs/TRANSLATORS.md',
2960 'docs/UIDS-GIDS.md',
2961 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2962 install_dir : docdir)
2964 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2965 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2967 ############################################################
2969 meson_check_help = find_program('tools/meson-check-help.sh')
2971 foreach exec : public_programs
2972 name = exec.full_path().split('/')[-1]
2973 if want_tests != 'false'
2974 test('check-help-' + name,
2976 args : exec.full_path())
2980 ############################################################
2982 # Enable tests for all supported sanitizers
2983 foreach tuple : sanitizers
2984 sanitizer = tuple[0]
2987 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2989 foreach p : fuzz_regression_tests
2990 b = p.split('/')[-2]
2991 c = p.split('/')[-1]
2993 name = '@0@:@1@'.format(b, sanitizer)
2996 if want_tests == 'false'
2997 message('Not compiling @0@ because tests is set to false'.format(name))
2999 exe = custom_target(
3003 command : [env, 'ln', '-fs',
3004 join_paths(build.full_path(), b),
3006 build_by_default : true)
3008 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3013 if want_tests != 'false' and slow_tests
3014 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3016 args : [exe.full_path(),
3017 join_paths(project_source_root, p)])
3024 ############################################################
3027 all_files = run_command(
3029 ['--git-dir=@0@/.git'.format(project_source_root),
3032 all_files = files(all_files.stdout().split())
3037 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3040 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3044 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3047 command : [meson_git_contrib_sh])
3051 git_head = run_command(
3053 ['--git-dir=@0@/.git'.format(project_source_root),
3054 'rev-parse', 'HEAD']).stdout().strip()
3055 git_head_short = run_command(
3057 ['--git-dir=@0@/.git'.format(project_source_root),
3058 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3062 command : ['git', 'archive',
3063 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3065 '--prefix', 'systemd-@0@/'.format(git_head),
3069 ############################################################
3071 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3074 depends : [man, libsystemd, libudev],
3075 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3077 ############################################################
3080 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3082 'split /usr: @0@'.format(split_usr),
3083 'split bin-sbin: @0@'.format(split_bin),
3084 'prefix directory: @0@'.format(prefixdir),
3085 'rootprefix directory: @0@'.format(rootprefixdir),
3086 'sysconf directory: @0@'.format(sysconfdir),
3087 'include directory: @0@'.format(includedir),
3088 'lib directory: @0@'.format(libdir),
3089 'rootlib directory: @0@'.format(rootlibdir),
3090 'SysV init scripts: @0@'.format(sysvinit_path),
3091 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3092 'PAM modules directory: @0@'.format(pamlibdir),
3093 'PAM configuration directory: @0@'.format(pamconfdir),
3094 'RPM macros directory: @0@'.format(rpmmacrosdir),
3095 'modprobe.d directory: @0@'.format(modprobedir),
3096 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3097 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3098 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3099 'bash completions directory: @0@'.format(bashcompletiondir),
3100 'zsh completions directory: @0@'.format(zshcompletiondir),
3101 'extra start script: @0@'.format(get_option('rc-local')),
3102 'extra stop script: @0@'.format(get_option('halt-local')),
3103 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3104 get_option('debug-tty')),
3105 'TTY GID: @0@'.format(tty_gid),
3106 'users GID: @0@'.format(substs.get('USERS_GID')),
3107 'maximum system UID: @0@'.format(system_uid_max),
3108 'maximum system GID: @0@'.format(system_gid_max),
3109 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3110 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3111 'minimum container UID base: @0@'.format(container_uid_base_min),
3112 'maximum container UID base: @0@'.format(container_uid_base_max),
3113 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3114 'render group access mode: @0@'.format(get_option('group-render-mode')),
3115 'certificate root directory: @0@'.format(get_option('certificate-root')),
3116 'support URL: @0@'.format(support_url),
3117 'nobody user name: @0@'.format(nobody_user),
3118 'nobody group name: @0@'.format(nobody_group),
3119 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3120 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3122 'default DNSSEC mode: @0@'.format(default_dnssec),
3123 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3124 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3125 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3126 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3127 'default locale: @0@'.format(default_locale)]
3129 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3130 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3132 'default DNS servers: @0@'.format(alt_dns_servers),
3133 'default NTP servers: @0@'.format(alt_ntp_servers)]
3135 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3136 '@@0@'.format(time_epoch)).stdout().strip()
3138 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3141 'static libsystemd: @0@'.format(static_libsystemd),
3142 'static libudev: @0@'.format(static_libudev)]
3145 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3146 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3147 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3149 if conf.get('ENABLE_EFI') == 1
3150 status += 'efi arch: @0@'.format(efi_arch)
3154 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3155 'EFI CC @0@'.format(' '.join(efi_cc)),
3156 'EFI lib directory: @0@'.format(efi_libdir),
3157 'EFI lds directory: @0@'.format(efi_ldsdir),
3158 'EFI include directory: @0@'.format(efi_incdir)]
3210 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3211 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3214 ['legacy pkla', install_polkit_pkla],
3216 ['gnu-efi', have_gnu_efi],
3229 ['man pages', want_man],
3230 ['html pages', want_html],
3231 ['man page indices', want_man and have_lxml],
3236 ['adm group', get_option('adm-group')],
3237 ['wheel group', get_option('wheel-group')],
3240 ['debug mmap cache'],
3243 ['valgrind', conf.get('VALGRIND') == 1],
3244 ['trace logging', conf.get('LOG_TRACE') == 1],
3245 ['link-udev-shared', get_option('link-udev-shared')],
3246 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3249 if tuple.length() >= 2
3252 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3253 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3254 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3265 'enabled features: @0@'.format(', '.join(found)),
3267 'disabled features: @0@'.format(', '.join(missing)),
3269 message('\n '.join(status))
3271 if rootprefixdir != rootprefix_default
3273 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3274 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3275 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))