1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.25.0'
16 libudev_version = '1.6.13'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
29 want_ossfuzz = get_option('oss-fuzz')
30 want_libfuzzer = get_option('llvm-fuzz')
31 if want_ossfuzz and want_libfuzzer
32 error('only one of oss-fuzz and llvm-fuzz can be specified')
34 fuzzer_build = want_ossfuzz or want_libfuzzer
36 #####################################################################
38 # Try to install the git pre-commit hook
39 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
40 if git_hook.returncode() == 0
41 message(git_hook.stdout().strip())
44 #####################################################################
46 if get_option('split-usr') == 'auto'
47 split_usr = run_command('test', '-L', '/bin').returncode() != 0
49 split_usr = get_option('split-usr') == 'true'
51 conf.set10('HAVE_SPLIT_USR', split_usr,
52 description : '/usr/bin and /bin directories are separate')
54 if get_option('split-bin') == 'auto'
55 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
57 split_bin = get_option('split-bin') == 'true'
59 conf.set10('HAVE_SPLIT_BIN', split_bin,
60 description : 'bin and sbin directories are separate')
62 rootprefixdir = get_option('rootprefix')
63 # Unusual rootprefixdir values are used by some distros
64 # (see https://github.com/systemd/systemd/pull/7461).
65 rootprefix_default = split_usr ? '/' : '/usr'
66 if rootprefixdir == ''
67 rootprefixdir = rootprefix_default
69 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
71 sysvinit_path = get_option('sysvinit-path')
72 sysvrcnd_path = get_option('sysvrcnd-path')
73 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
74 description : 'SysV init scripts and rcN.d links are supported')
76 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
77 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
78 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
80 # join_paths ignores the preceding arguments if an absolute component is
81 # encountered, so this should canonicalize various paths when they are
82 # absolute or relative.
83 prefixdir = get_option('prefix')
84 if not prefixdir.startswith('/')
85 error('Prefix is not absolute: "@0@"'.format(prefixdir))
87 bindir = join_paths(prefixdir, get_option('bindir'))
88 libdir = join_paths(prefixdir, get_option('libdir'))
89 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
90 includedir = join_paths(prefixdir, get_option('includedir'))
91 datadir = join_paths(prefixdir, get_option('datadir'))
92 localstatedir = join_paths('/', get_option('localstatedir'))
94 rootbindir = join_paths(rootprefixdir, 'bin')
95 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
96 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
98 rootlibdir = get_option('rootlibdir')
100 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
103 # Dirs of external packages
104 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
105 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
106 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
107 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
108 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
109 varlogdir = join_paths(localstatedir, 'log')
110 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
111 rpmmacrosdir = get_option('rpmmacrosdir')
112 if rpmmacrosdir != 'no'
113 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
115 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
118 pkgdatadir = join_paths(datadir, 'systemd')
119 environmentdir = join_paths(prefixdir, 'lib/environment.d')
120 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
121 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
122 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
123 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
124 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
125 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
126 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
127 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
128 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
129 pkgincludedir = join_paths(includedir, 'systemd')
130 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
131 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
132 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
133 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
134 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
135 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
136 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
137 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
138 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
139 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
140 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
141 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
142 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
143 factorydir = join_paths(datadir, 'factory')
144 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
145 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
146 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
147 catalogstatedir = join_paths(systemdstatedir, 'catalog')
148 randomseeddir = join_paths(localstatedir, 'lib/systemd')
149 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
151 docdir = get_option('docdir')
153 docdir = join_paths(datadir, 'doc/systemd')
156 dbuspolicydir = get_option('dbuspolicydir')
157 if dbuspolicydir == ''
158 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
161 dbussessionservicedir = get_option('dbussessionservicedir')
162 if dbussessionservicedir == ''
163 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
166 dbussystemservicedir = get_option('dbussystemservicedir')
167 if dbussystemservicedir == ''
168 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
171 pamlibdir = get_option('pamlibdir')
173 pamlibdir = join_paths(rootlibdir, 'security')
176 pamconfdir = get_option('pamconfdir')
178 pamconfdir = join_paths(sysconfdir, 'pam.d')
181 memory_accounting_default = get_option('memory-accounting-default')
183 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
184 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
185 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
186 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
187 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
188 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
189 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
191 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
193 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
194 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
195 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
196 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
197 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
198 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
199 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
200 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
201 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
202 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
203 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
204 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
205 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
206 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
207 conf.set_quoted('ROOTPREFIX', rootprefixdir)
208 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
209 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
210 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
211 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
212 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
213 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
214 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
215 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
216 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
217 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
218 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
219 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
220 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
221 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
222 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
223 conf.set_quoted('LIBDIR', libdir)
224 conf.set_quoted('ROOTLIBDIR', rootlibdir)
225 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
226 conf.set_quoted('BOOTLIBDIR', bootlibdir)
227 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
228 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
229 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
230 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
231 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
232 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
233 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
234 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
235 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
237 substs.set('prefix', prefixdir)
238 substs.set('rootprefix', rootprefixdir)
239 substs.set('rootprefix_noslash', rootprefixdir_noslash)
240 substs.set('exec_prefix', prefixdir)
241 substs.set('libdir', libdir)
242 substs.set('rootlibdir', rootlibdir)
243 substs.set('includedir', includedir)
244 substs.set('sysconfdir', sysconfdir)
245 substs.set('bindir', bindir)
246 substs.set('rootbindir', rootbindir)
247 substs.set('rootlibexecdir', rootlibexecdir)
248 substs.set('systemunitdir', systemunitdir)
249 substs.set('userunitdir', userunitdir)
250 substs.set('systempresetdir', systempresetdir)
251 substs.set('userpresetdir', userpresetdir)
252 substs.set('udevhwdbdir', udevhwdbdir)
253 substs.set('udevrulesdir', udevrulesdir)
254 substs.set('udevlibexecdir', udevlibexecdir)
255 substs.set('environmentdir', environmentdir)
256 substs.set('catalogdir', catalogdir)
257 substs.set('tmpfilesdir', tmpfilesdir)
258 substs.set('sysusersdir', sysusersdir)
259 substs.set('sysctldir', sysctldir)
260 substs.set('binfmtdir', binfmtdir)
261 substs.set('modulesloaddir', modulesloaddir)
262 substs.set('modprobedir', modprobedir)
263 substs.set('systemgeneratordir', systemgeneratordir)
264 substs.set('usergeneratordir', usergeneratordir)
265 substs.set('systemenvgeneratordir', systemenvgeneratordir)
266 substs.set('userenvgeneratordir', userenvgeneratordir)
267 substs.set('systemshutdowndir', systemshutdowndir)
268 substs.set('systemsleepdir', systemsleepdir)
269 substs.set('VARLOGDIR', varlogdir)
270 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
271 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
272 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
273 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
274 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
275 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
276 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
277 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
278 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
280 #####################################################################
282 cc = meson.get_compiler('c')
283 pkgconfig = import('pkgconfig')
284 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
285 meson_build_sh = find_program('tools/meson-build.sh')
287 want_tests = get_option('tests')
288 slow_tests = want_tests != 'false' and get_option('slow-tests')
289 install_tests = get_option('install-tests')
291 if add_languages('cpp', required : fuzzer_build)
292 # Used only for tests
293 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
299 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
301 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
304 possible_cc_flags = [
308 '-Wmissing-include-dirs',
309 '-Wold-style-definition',
313 '-Wsuggest-attribute=noreturn',
314 '-Werror=missing-prototypes',
315 '-Werror=implicit-function-declaration',
316 '-Werror=missing-declarations',
317 '-Werror=return-type',
318 '-Werror=incompatible-pointer-types',
320 '-Wstrict-prototypes',
322 '-Wmissing-noreturn',
323 '-Wimplicit-fallthrough=5',
326 '-Wstrict-aliasing=2',
329 '-Werror=shift-count-overflow',
330 '-Werror=shift-overflow=2',
334 # negative arguments are correctly detected starting with meson 0.46.
335 '-Wno-unused-parameter',
336 '-Wno-missing-field-initializers',
337 '-Wno-unused-result',
338 '-Wno-format-signedness',
339 '-Wno-error=#warnings', # clang
340 '-Wno-string-plus-int', # clang
342 # work-around for gcc 7.1 turning this on on its own.
343 '-Wno-error=nonnull',
345 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
346 # optimizations enabled, producing essentially false positives.
347 '-Wno-maybe-uninitialized',
351 '-fdiagnostics-show-option',
352 '-fno-strict-aliasing',
353 '-fvisibility=hidden',
355 '-fstack-protector-strong',
356 '--param=ssp-buffer-size=4',
359 # --as-needed and --no-undefined are provided by meson by default,
360 # run mesonconf to see what is enabled
361 possible_link_flags = [
366 if cc.get_id() == 'clang'
367 possible_cc_flags += [
368 '-Wno-typedef-redefinition',
369 '-Wno-gnu-variable-sized-type-not-at-end',
373 if get_option('buildtype') != 'debug'
374 possible_cc_flags += [
375 '-ffunction-sections',
379 possible_link_flags += '-Wl,--gc-sections'
382 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
383 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
387 #include <inttypes.h>
388 typedef uint64_t usec_t;
389 usec_t now(clockid_t clock);
394 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
395 add_project_arguments('-Werror=shadow', language : 'c')
398 cpp = ' '.join(cc.cmd_array()) + ' -E'
400 #####################################################################
401 # compilation result tests
403 conf.set('_GNU_SOURCE', true)
404 conf.set('__SANE_USERSPACE_TYPES__', true)
406 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
407 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
408 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
409 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
410 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
411 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
412 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
416 #include <sys/stat.h>
419 foreach decl : ['char16_t',
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',
1448 'src/libsystemd/sd-bus',
1449 'src/libsystemd/sd-device',
1450 'src/libsystemd/sd-event',
1451 'src/libsystemd/sd-hwdb',
1452 'src/libsystemd/sd-id128',
1453 'src/libsystemd/sd-netlink',
1454 'src/libsystemd/sd-network',
1455 'src/libsystemd/sd-resolve',
1456 'src/libsystemd-network',
1459 add_project_arguments('-include', 'config.h', language : 'c')
1461 generate_gperfs = find_program('tools/generate-gperfs.py')
1465 subdir('src/systemd')
1467 subdir('src/libsystemd')
1468 subdir('src/libsystemd-network')
1469 subdir('src/journal')
1472 libjournal_core = static_library(
1474 libjournal_core_sources,
1476 include_directories : includes,
1479 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1480 libsystemd = shared_library(
1483 version : libsystemd_version,
1484 include_directories : includes,
1485 link_args : ['-shared',
1486 '-Wl,--version-script=' + libsystemd_sym_path],
1487 link_with : [libbasic,
1489 link_whole : [libsystemd_static,
1491 dependencies : [threads,
1495 link_depends : libsystemd_sym,
1497 install_dir : rootlibdir)
1499 static_libsystemd = get_option('static-libsystemd')
1500 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1502 install_libsystemd_static = static_library(
1505 journal_client_sources,
1507 basic_gcrypt_sources,
1509 include_directories : includes,
1510 build_by_default : static_libsystemd != 'false',
1511 install : static_libsystemd != 'false',
1512 install_dir : rootlibdir,
1513 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1514 dependencies : [threads,
1523 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1525 ############################################################
1527 # binaries that have --help and are intended for use by humans,
1528 # usually, but not always, installed in /bin.
1529 public_programs = []
1531 subdir('src/libudev')
1532 subdir('src/shared')
1534 subdir('src/shutdown')
1536 subdir('src/network')
1538 subdir('src/analyze')
1539 subdir('src/journal-remote')
1540 subdir('src/coredump')
1541 subdir('src/hostname')
1542 subdir('src/import')
1543 subdir('src/kernel-install')
1544 subdir('src/locale')
1545 subdir('src/machine')
1546 subdir('src/portable')
1547 subdir('src/nspawn')
1548 subdir('src/resolve')
1549 subdir('src/timedate')
1550 subdir('src/timesync')
1551 subdir('src/vconsole')
1552 subdir('src/boot/efi')
1559 ############################################################
1561 # only static linking apart from libdl, to make sure that the
1562 # module is linked to all libraries that it uses.
1563 test_dlopen = executable(
1567 include_directories : includes,
1568 link_with : [libbasic],
1569 dependencies : [libdl],
1570 build_by_default : want_tests != 'false')
1572 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1573 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1574 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1575 ['resolve', 'ENABLE_NSS_RESOLVE']]
1577 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1581 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1582 version_script_arg = join_paths(meson.source_root(), sym)
1584 nss = shared_library(
1586 'src/nss-@0@/nss-@0@.c'.format(module),
1589 include_directories : includes,
1590 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1591 link_args : ['-Wl,-z,nodelete',
1593 '-Wl,--version-script=' + version_script_arg,
1595 link_with : [libsystemd_static,
1597 dependencies : [threads,
1601 install_dir : rootlibdir)
1603 # We cannot use shared_module because it does not support version suffix.
1604 # Unfortunately shared_library insists on creating the symlink…
1605 meson.add_install_script('sh', '-c',
1606 'rm $DESTDIR@0@/libnss_@1@.so'
1607 .format(rootlibdir, module))
1609 if want_tests != 'false'
1610 test('dlopen-nss_' + module,
1612 # path to dlopen must include a slash
1613 args : nss.full_path())
1618 ############################################################
1620 executable('systemd',
1622 include_directories : includes,
1623 link_with : [libcore,
1625 dependencies : [versiondep,
1632 install_rpath : rootlibexecdir,
1634 install_dir : rootlibexecdir)
1636 meson.add_install_script(meson_make_symlink,
1637 join_paths(rootlibexecdir, 'systemd'),
1638 join_paths(rootsbindir, 'init'))
1640 exe = executable('systemd-analyze',
1641 systemd_analyze_sources,
1642 include_directories : includes,
1643 link_with : [libcore,
1645 dependencies : [versiondep,
1652 install_rpath : rootlibexecdir,
1654 public_programs += exe
1656 executable('systemd-journald',
1657 systemd_journald_sources,
1658 include_directories : includes,
1659 link_with : [libjournal_core,
1661 dependencies : [threads,
1665 install_rpath : rootlibexecdir,
1667 install_dir : rootlibexecdir)
1669 exe = executable('systemd-cat',
1670 systemd_cat_sources,
1671 include_directories : includes,
1672 link_with : [libjournal_core,
1674 dependencies : [threads],
1675 install_rpath : rootlibexecdir,
1677 public_programs += exe
1679 exe = executable('journalctl',
1681 include_directories : includes,
1682 link_with : [libshared],
1683 dependencies : [threads,
1688 install_rpath : rootlibexecdir,
1690 install_dir : rootbindir)
1691 public_programs += exe
1693 executable('systemd-getty-generator',
1694 'src/getty-generator/getty-generator.c',
1695 include_directories : includes,
1696 link_with : [libshared],
1697 install_rpath : rootlibexecdir,
1699 install_dir : systemgeneratordir)
1701 executable('systemd-debug-generator',
1702 'src/debug-generator/debug-generator.c',
1703 include_directories : includes,
1704 link_with : [libshared],
1705 install_rpath : rootlibexecdir,
1707 install_dir : systemgeneratordir)
1709 executable('systemd-run-generator',
1710 'src/run-generator/run-generator.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 install_rpath : rootlibexecdir,
1715 install_dir : systemgeneratordir)
1717 executable('systemd-fstab-generator',
1718 'src/fstab-generator/fstab-generator.c',
1719 include_directories : includes,
1720 link_with : [libcore_shared,
1722 install_rpath : rootlibexecdir,
1724 install_dir : systemgeneratordir)
1726 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1727 executable('30-systemd-environment-d-generator',
1728 'src/environment-d-generator/environment-d-generator.c',
1729 include_directories : includes,
1730 link_with : [libshared],
1731 install_rpath : rootlibexecdir,
1733 install_dir : userenvgeneratordir)
1735 meson.add_install_script(meson_make_symlink,
1736 join_paths(sysconfdir, 'environment'),
1737 join_paths(environmentdir, '99-environment.conf'))
1740 if conf.get('ENABLE_HIBERNATE') == 1
1741 executable('systemd-hibernate-resume-generator',
1742 'src/hibernate-resume/hibernate-resume-generator.c',
1743 include_directories : includes,
1744 link_with : [libshared],
1745 install_rpath : rootlibexecdir,
1747 install_dir : systemgeneratordir)
1749 executable('systemd-hibernate-resume',
1750 'src/hibernate-resume/hibernate-resume.c',
1751 include_directories : includes,
1752 link_with : [libshared],
1753 install_rpath : rootlibexecdir,
1755 install_dir : rootlibexecdir)
1758 if conf.get('HAVE_BLKID') == 1
1759 executable('systemd-gpt-auto-generator',
1760 'src/gpt-auto-generator/gpt-auto-generator.c',
1761 'src/shared/blkid-util.h',
1762 include_directories : includes,
1763 link_with : [libshared],
1764 dependencies : libblkid,
1765 install_rpath : rootlibexecdir,
1767 install_dir : systemgeneratordir)
1769 exe = executable('systemd-dissect',
1770 'src/dissect/dissect.c',
1771 include_directories : includes,
1772 link_with : [libshared],
1773 install_rpath : rootlibexecdir,
1775 install_dir : rootlibexecdir)
1776 public_programs += exe
1779 if conf.get('ENABLE_RESOLVE') == 1
1780 executable('systemd-resolved',
1781 systemd_resolved_sources,
1782 include_directories : includes,
1783 link_with : [libshared,
1785 libsystemd_resolve_core],
1786 dependencies : systemd_resolved_dependencies,
1787 install_rpath : rootlibexecdir,
1789 install_dir : rootlibexecdir)
1791 exe = executable('resolvectl',
1793 include_directories : includes,
1794 link_with : [libshared,
1796 libsystemd_resolve_core],
1797 dependencies : [threads,
1801 install_rpath : rootlibexecdir,
1803 public_programs += exe
1805 meson.add_install_script(meson_make_symlink,
1806 join_paths(bindir, 'resolvectl'),
1807 join_paths(rootsbindir, 'resolvconf'))
1809 meson.add_install_script(meson_make_symlink,
1810 join_paths(bindir, 'resolvectl'),
1811 join_paths(bindir, 'systemd-resolve'))
1814 if conf.get('ENABLE_LOGIND') == 1
1815 executable('systemd-logind',
1816 systemd_logind_sources,
1817 include_directories : includes,
1818 link_with : [liblogind_core,
1820 dependencies : [threads,
1822 install_rpath : rootlibexecdir,
1824 install_dir : rootlibexecdir)
1826 exe = executable('loginctl',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 dependencies : [threads,
1833 install_rpath : rootlibexecdir,
1835 install_dir : rootbindir)
1836 public_programs += exe
1838 exe = executable('systemd-inhibit',
1839 'src/login/inhibit.c',
1840 include_directories : includes,
1841 link_with : [libshared],
1842 install_rpath : rootlibexecdir,
1844 install_dir : rootbindir)
1845 public_programs += exe
1847 if conf.get('HAVE_PAM') == 1
1848 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1849 pam_systemd = shared_library(
1853 include_directories : includes,
1854 link_args : ['-shared',
1855 '-Wl,--version-script=' + version_script_arg],
1856 link_with : [libsystemd_static,
1858 dependencies : [threads,
1861 link_depends : pam_systemd_sym,
1863 install_dir : pamlibdir)
1865 if want_tests != 'false'
1866 test('dlopen-pam_systemd',
1868 # path to dlopen must include a slash
1869 args : pam_systemd.full_path())
1873 executable('systemd-user-runtime-dir',
1874 user_runtime_dir_sources,
1875 include_directories : includes,
1876 link_with : [libshared],
1877 install_rpath : rootlibexecdir,
1879 install_dir : rootlibexecdir)
1882 if conf.get('HAVE_PAM') == 1
1883 executable('systemd-user-sessions',
1884 'src/user-sessions/user-sessions.c',
1885 include_directories : includes,
1886 link_with : [libshared],
1887 install_rpath : rootlibexecdir,
1889 install_dir : rootlibexecdir)
1892 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1893 exe = executable('bootctl',
1894 'src/boot/bootctl.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 dependencies : [libblkid],
1898 install_rpath : rootlibexecdir,
1900 public_programs += exe
1902 executable('systemd-bless-boot',
1903 'src/boot/bless-boot.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 dependencies : [libblkid],
1907 install_rpath : rootlibexecdir,
1909 install_dir : rootlibexecdir)
1911 executable('systemd-bless-boot-generator',
1912 'src/boot/bless-boot-generator.c',
1913 include_directories : includes,
1914 link_with : [libshared],
1915 install_rpath : rootlibexecdir,
1917 install_dir : systemgeneratordir)
1920 executable('systemd-boot-check-no-failures',
1921 'src/boot/boot-check-no-failures.c',
1922 include_directories : includes,
1923 link_with : [libshared],
1924 dependencies : [libblkid],
1925 install_rpath : rootlibexecdir,
1927 install_dir : rootlibexecdir)
1929 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1930 include_directories : includes,
1931 link_with : [libshared],
1932 dependencies : [threads],
1933 install_rpath : rootlibexecdir,
1935 public_programs += exe
1938 if get_option('link-systemctl-shared')
1939 systemctl_link_with = [libshared]
1941 systemctl_link_with = [libsystemd_static,
1947 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1948 include_directories : includes,
1949 link_with : systemctl_link_with,
1950 dependencies : [threads,
1955 install_rpath : rootlibexecdir,
1957 install_dir : rootbindir)
1958 public_programs += exe
1960 if conf.get('ENABLE_PORTABLED') == 1
1961 executable('systemd-portabled',
1962 systemd_portabled_sources,
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [threads],
1966 install_rpath : rootlibexecdir,
1968 install_dir : rootlibexecdir)
1970 exe = executable('portablectl', 'src/portable/portablectl.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 dependencies : [threads],
1974 install_rpath : rootlibexecdir,
1976 install_dir : rootbindir)
1977 public_programs += exe
1980 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1981 meson.add_install_script(meson_make_symlink,
1982 join_paths(rootbindir, 'systemctl'),
1983 join_paths(rootsbindir, alias))
1986 if conf.get('ENABLE_BACKLIGHT') == 1
1987 executable('systemd-backlight',
1988 'src/backlight/backlight.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 install_rpath : rootlibexecdir,
1993 install_dir : rootlibexecdir)
1996 if conf.get('ENABLE_RFKILL') == 1
1997 executable('systemd-rfkill',
1998 'src/rfkill/rfkill.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 install_rpath : rootlibexecdir,
2003 install_dir : rootlibexecdir)
2006 executable('systemd-system-update-generator',
2007 'src/system-update-generator/system-update-generator.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2012 install_dir : systemgeneratordir)
2014 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2015 executable('systemd-cryptsetup',
2016 'src/cryptsetup/cryptsetup.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : [libcryptsetup],
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootlibexecdir)
2024 executable('systemd-cryptsetup-generator',
2025 'src/cryptsetup/cryptsetup-generator.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [libcryptsetup],
2029 install_rpath : rootlibexecdir,
2031 install_dir : systemgeneratordir)
2033 executable('systemd-veritysetup',
2034 'src/veritysetup/veritysetup.c',
2035 include_directories : includes,
2036 link_with : [libshared],
2037 dependencies : [libcryptsetup],
2038 install_rpath : rootlibexecdir,
2040 install_dir : rootlibexecdir)
2042 executable('systemd-veritysetup-generator',
2043 'src/veritysetup/veritysetup-generator.c',
2044 include_directories : includes,
2045 link_with : [libshared],
2046 dependencies : [libcryptsetup],
2047 install_rpath : rootlibexecdir,
2049 install_dir : systemgeneratordir)
2052 if conf.get('HAVE_SYSV_COMPAT') == 1
2053 executable('systemd-sysv-generator',
2054 'src/sysv-generator/sysv-generator.c',
2055 include_directories : includes,
2056 link_with : [libshared],
2057 install_rpath : rootlibexecdir,
2059 install_dir : systemgeneratordir)
2061 executable('systemd-rc-local-generator',
2062 'src/rc-local-generator/rc-local-generator.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 install_rpath : rootlibexecdir,
2067 install_dir : systemgeneratordir)
2070 if conf.get('ENABLE_HOSTNAMED') == 1
2071 executable('systemd-hostnamed',
2072 'src/hostname/hostnamed.c',
2073 include_directories : includes,
2074 link_with : [libshared],
2075 install_rpath : rootlibexecdir,
2077 install_dir : rootlibexecdir)
2079 exe = executable('hostnamectl',
2080 'src/hostname/hostnamectl.c',
2081 include_directories : includes,
2082 link_with : [libshared],
2083 install_rpath : rootlibexecdir,
2085 public_programs += exe
2088 if conf.get('ENABLE_LOCALED') == 1
2089 if conf.get('HAVE_XKBCOMMON') == 1
2090 # logind will load libxkbcommon.so dynamically on its own
2096 executable('systemd-localed',
2097 systemd_localed_sources,
2098 include_directories : includes,
2099 link_with : [libshared],
2100 dependencies : deps,
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootlibexecdir)
2105 exe = executable('localectl',
2107 include_directories : includes,
2108 link_with : [libshared],
2109 install_rpath : rootlibexecdir,
2111 public_programs += exe
2114 if conf.get('ENABLE_TIMEDATED') == 1
2115 executable('systemd-timedated',
2116 'src/timedate/timedated.c',
2117 include_directories : includes,
2118 link_with : [libshared],
2119 install_rpath : rootlibexecdir,
2121 install_dir : rootlibexecdir)
2124 if conf.get('ENABLE_TIMEDATECTL') == 1
2125 exe = executable('timedatectl',
2126 'src/timedate/timedatectl.c',
2127 include_directories : includes,
2128 install_rpath : rootlibexecdir,
2129 link_with : [libshared],
2130 dependencies : [libm],
2132 public_programs += exe
2135 if conf.get('ENABLE_TIMESYNCD') == 1
2136 executable('systemd-timesyncd',
2137 systemd_timesyncd_sources,
2138 include_directories : includes,
2139 link_with : [libshared],
2140 dependencies : [threads,
2142 install_rpath : rootlibexecdir,
2144 install_dir : rootlibexecdir)
2146 executable('systemd-time-wait-sync',
2147 'src/time-wait-sync/time-wait-sync.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2155 if conf.get('ENABLE_MACHINED') == 1
2156 executable('systemd-machined',
2157 systemd_machined_sources,
2158 include_directories : includes,
2159 link_with : [libmachine_core,
2161 install_rpath : rootlibexecdir,
2163 install_dir : rootlibexecdir)
2165 exe = executable('machinectl',
2166 'src/machine/machinectl.c',
2167 include_directories : includes,
2168 link_with : [libshared],
2169 dependencies : [threads,
2172 install_rpath : rootlibexecdir,
2174 install_dir : rootbindir)
2175 public_programs += exe
2178 if conf.get('ENABLE_IMPORTD') == 1
2179 executable('systemd-importd',
2180 systemd_importd_sources,
2181 include_directories : includes,
2182 link_with : [libshared],
2183 dependencies : [threads],
2184 install_rpath : rootlibexecdir,
2186 install_dir : rootlibexecdir)
2188 systemd_pull = executable('systemd-pull',
2189 systemd_pull_sources,
2190 include_directories : includes,
2191 link_with : [libshared],
2192 dependencies : [versiondep,
2198 install_rpath : rootlibexecdir,
2200 install_dir : rootlibexecdir)
2202 systemd_import = executable('systemd-import',
2203 systemd_import_sources,
2204 include_directories : includes,
2205 link_with : [libshared],
2206 dependencies : [libcurl,
2210 install_rpath : rootlibexecdir,
2212 install_dir : rootlibexecdir)
2214 systemd_import_fs = executable('systemd-import-fs',
2215 systemd_import_fs_sources,
2216 include_directories : includes,
2217 link_with : [libshared],
2218 install_rpath : rootlibexecdir,
2220 install_dir : rootlibexecdir)
2222 systemd_export = executable('systemd-export',
2223 systemd_export_sources,
2224 include_directories : includes,
2225 link_with : [libshared],
2226 dependencies : [libcurl,
2230 install_rpath : rootlibexecdir,
2232 install_dir : rootlibexecdir)
2234 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2237 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2238 exe = executable('systemd-journal-upload',
2239 systemd_journal_upload_sources,
2240 include_directories : includes,
2241 link_with : [libshared],
2242 dependencies : [versiondep,
2248 install_rpath : rootlibexecdir,
2250 install_dir : rootlibexecdir)
2251 public_programs += exe
2254 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2255 s_j_remote = executable('systemd-journal-remote',
2256 systemd_journal_remote_sources,
2257 include_directories : includes,
2258 link_with : [libshared,
2259 libsystemd_journal_remote],
2260 dependencies : [threads,
2265 install_rpath : rootlibexecdir,
2267 install_dir : rootlibexecdir)
2269 s_j_gatewayd = executable('systemd-journal-gatewayd',
2270 systemd_journal_gatewayd_sources,
2271 include_directories : includes,
2272 link_with : [libshared],
2273 dependencies : [threads,
2278 install_rpath : rootlibexecdir,
2280 install_dir : rootlibexecdir)
2281 public_programs += [s_j_remote, s_j_gatewayd]
2284 if conf.get('ENABLE_COREDUMP') == 1
2285 executable('systemd-coredump',
2286 systemd_coredump_sources,
2287 include_directories : includes,
2288 link_with : [libshared],
2289 dependencies : [threads,
2294 install_rpath : rootlibexecdir,
2296 install_dir : rootlibexecdir)
2298 exe = executable('coredumpctl',
2299 coredumpctl_sources,
2300 include_directories : includes,
2301 link_with : [libshared],
2302 dependencies : [threads,
2305 install_rpath : rootlibexecdir,
2307 public_programs += exe
2310 if conf.get('ENABLE_BINFMT') == 1
2311 exe = executable('systemd-binfmt',
2312 'src/binfmt/binfmt.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 install_rpath : rootlibexecdir,
2317 install_dir : rootlibexecdir)
2318 public_programs += exe
2320 meson.add_install_script('sh', '-c',
2321 mkdir_p.format(binfmtdir))
2322 meson.add_install_script('sh', '-c',
2323 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2326 if conf.get('ENABLE_VCONSOLE') == 1
2327 executable('systemd-vconsole-setup',
2328 'src/vconsole/vconsole-setup.c',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 install_rpath : rootlibexecdir,
2333 install_dir : rootlibexecdir)
2336 if conf.get('ENABLE_RANDOMSEED') == 1
2337 executable('systemd-random-seed',
2338 'src/random-seed/random-seed.c',
2339 include_directories : includes,
2340 link_with : [libshared],
2341 install_rpath : rootlibexecdir,
2343 install_dir : rootlibexecdir)
2346 if conf.get('ENABLE_FIRSTBOOT') == 1
2347 executable('systemd-firstboot',
2348 'src/firstboot/firstboot.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 dependencies : [libcrypt],
2352 install_rpath : rootlibexecdir,
2354 install_dir : rootbindir)
2357 executable('systemd-remount-fs',
2358 'src/remount-fs/remount-fs.c',
2359 include_directories : includes,
2360 link_with : [libcore_shared,
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootlibexecdir)
2366 executable('systemd-machine-id-setup',
2367 'src/machine-id-setup/machine-id-setup-main.c',
2368 include_directories : includes,
2369 link_with : [libcore_shared,
2371 install_rpath : rootlibexecdir,
2373 install_dir : rootbindir)
2375 executable('systemd-fsck',
2377 include_directories : includes,
2378 link_with : [libshared],
2379 install_rpath : rootlibexecdir,
2381 install_dir : rootlibexecdir)
2383 executable('systemd-growfs',
2384 'src/partition/growfs.c',
2385 include_directories : includes,
2386 link_with : [libshared],
2387 dependencies : [libcryptsetup],
2388 install_rpath : rootlibexecdir,
2390 install_dir : rootlibexecdir)
2392 executable('systemd-makefs',
2393 'src/partition/makefs.c',
2394 include_directories : includes,
2395 link_with : [libshared],
2396 install_rpath : rootlibexecdir,
2398 install_dir : rootlibexecdir)
2400 executable('systemd-sleep',
2401 'src/sleep/sleep.c',
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2406 install_dir : rootlibexecdir)
2408 install_data('src/sleep/sleep.conf',
2409 install_dir : pkgsysconfdir)
2411 exe = executable('systemd-sysctl',
2412 'src/sysctl/sysctl.c',
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2417 install_dir : rootlibexecdir)
2418 public_programs += exe
2420 executable('systemd-ac-power',
2421 'src/ac-power/ac-power.c',
2422 include_directories : includes,
2423 link_with : [libshared],
2424 install_rpath : rootlibexecdir,
2426 install_dir : rootlibexecdir)
2428 exe = executable('systemd-detect-virt',
2429 'src/detect-virt/detect-virt.c',
2430 include_directories : includes,
2431 link_with : [libshared],
2432 install_rpath : rootlibexecdir,
2434 public_programs += exe
2436 exe = executable('systemd-delta',
2437 'src/delta/delta.c',
2438 include_directories : includes,
2439 link_with : [libshared],
2440 install_rpath : rootlibexecdir,
2442 public_programs += exe
2444 exe = executable('systemd-escape',
2445 'src/escape/escape.c',
2446 include_directories : includes,
2447 link_with : [libshared],
2448 install_rpath : rootlibexecdir,
2450 install_dir : rootbindir)
2451 public_programs += exe
2453 exe = executable('systemd-notify',
2454 'src/notify/notify.c',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2459 install_dir : rootbindir)
2460 public_programs += exe
2462 executable('systemd-volatile-root',
2463 'src/volatile-root/volatile-root.c',
2464 include_directories : includes,
2465 link_with : [libshared],
2466 install_rpath : rootlibexecdir,
2468 install_dir : rootlibexecdir)
2470 executable('systemd-cgroups-agent',
2471 'src/cgroups-agent/cgroups-agent.c',
2472 include_directories : includes,
2473 link_with : [libshared],
2474 install_rpath : rootlibexecdir,
2476 install_dir : rootlibexecdir)
2478 exe = executable('systemd-id128',
2479 'src/id128/id128.c',
2480 include_directories : includes,
2481 link_with : [libshared],
2482 install_rpath : rootlibexecdir,
2484 public_programs += exe
2486 exe = executable('systemd-path',
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2492 public_programs += exe
2494 exe = executable('systemd-ask-password',
2495 'src/ask-password/ask-password.c',
2496 include_directories : includes,
2497 link_with : [libshared],
2498 install_rpath : rootlibexecdir,
2500 install_dir : rootbindir)
2501 public_programs += exe
2503 executable('systemd-reply-password',
2504 'src/reply-password/reply-password.c',
2505 include_directories : includes,
2506 link_with : [libshared],
2507 install_rpath : rootlibexecdir,
2509 install_dir : rootlibexecdir)
2511 exe = executable('systemd-tty-ask-password-agent',
2512 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2513 include_directories : includes,
2514 link_with : [libshared],
2515 install_rpath : rootlibexecdir,
2517 install_dir : rootbindir)
2518 public_programs += exe
2520 exe = executable('systemd-cgls',
2522 include_directories : includes,
2523 link_with : [libshared],
2524 install_rpath : rootlibexecdir,
2526 public_programs += exe
2528 exe = executable('systemd-cgtop',
2529 'src/cgtop/cgtop.c',
2530 include_directories : includes,
2531 link_with : [libshared],
2532 install_rpath : rootlibexecdir,
2534 public_programs += exe
2536 executable('systemd-initctl',
2537 'src/initctl/initctl.c',
2538 include_directories : includes,
2539 link_with : [libshared],
2540 install_rpath : rootlibexecdir,
2542 install_dir : rootlibexecdir)
2544 exe = executable('systemd-mount',
2545 'src/mount/mount-tool.c',
2546 include_directories : includes,
2547 link_with : [libshared],
2548 install_rpath : rootlibexecdir,
2550 public_programs += exe
2552 meson.add_install_script(meson_make_symlink,
2553 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2555 exe = executable('systemd-run',
2557 include_directories : includes,
2558 link_with : [libshared],
2559 install_rpath : rootlibexecdir,
2561 public_programs += exe
2563 exe = executable('systemd-stdio-bridge',
2564 'src/stdio-bridge/stdio-bridge.c',
2565 include_directories : includes,
2566 link_with : [libshared],
2567 dependencies : [versiondep],
2568 install_rpath : rootlibexecdir,
2570 public_programs += exe
2572 exe = executable('busctl',
2573 'src/busctl/busctl.c',
2574 'src/busctl/busctl-introspect.c',
2575 'src/busctl/busctl-introspect.h',
2576 include_directories : includes,
2577 link_with : [libshared],
2578 install_rpath : rootlibexecdir,
2580 public_programs += exe
2582 if conf.get('ENABLE_SYSUSERS') == 1
2583 exe = executable('systemd-sysusers',
2584 'src/sysusers/sysusers.c',
2585 include_directories : includes,
2586 link_with : [libshared],
2587 install_rpath : rootlibexecdir,
2589 install_dir : rootbindir)
2590 public_programs += exe
2593 if conf.get('ENABLE_TMPFILES') == 1
2594 exe = executable('systemd-tmpfiles',
2595 'src/tmpfiles/tmpfiles.c',
2596 include_directories : includes,
2597 link_with : [libshared],
2598 dependencies : [libacl],
2599 install_rpath : rootlibexecdir,
2601 install_dir : rootbindir)
2602 public_programs += exe
2604 if want_tests != 'false'
2605 test('test-systemd-tmpfiles',
2606 test_systemd_tmpfiles_py,
2607 # https://github.com/mesonbuild/meson/issues/2681
2608 args : exe.full_path())
2612 if conf.get('ENABLE_HWDB') == 1
2613 exe = executable('systemd-hwdb',
2615 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2616 include_directories : includes,
2617 link_with : [libudev_static],
2618 install_rpath : udev_rpath,
2620 install_dir : rootbindir)
2621 public_programs += exe
2624 if conf.get('ENABLE_QUOTACHECK') == 1
2625 executable('systemd-quotacheck',
2626 'src/quotacheck/quotacheck.c',
2627 include_directories : includes,
2628 link_with : [libshared],
2629 install_rpath : rootlibexecdir,
2631 install_dir : rootlibexecdir)
2634 exe = executable('systemd-socket-proxyd',
2635 'src/socket-proxy/socket-proxyd.c',
2636 include_directories : includes,
2637 link_with : [libshared],
2638 dependencies : [threads],
2639 install_rpath : rootlibexecdir,
2641 install_dir : rootlibexecdir)
2642 public_programs += exe
2644 exe = executable('systemd-udevd',
2645 systemd_udevd_sources,
2646 include_directories : includes,
2647 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2648 link_with : [libudev_core,
2651 dependencies : [versiondep,
2657 install_rpath : udev_rpath,
2659 install_dir : rootlibexecdir)
2660 public_programs += exe
2662 exe = executable('udevadm',
2664 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2665 include_directories : includes,
2666 link_with : [libudev_core,
2669 dependencies : [versiondep,
2675 install_rpath : udev_rpath,
2677 install_dir : rootbindir)
2678 public_programs += exe
2680 executable('systemd-shutdown',
2681 systemd_shutdown_sources,
2682 include_directories : includes,
2683 link_with : [libcore_shared,
2685 dependencies : [libmount],
2686 install_rpath : rootlibexecdir,
2688 install_dir : rootlibexecdir)
2690 executable('systemd-update-done',
2691 'src/update-done/update-done.c',
2692 include_directories : includes,
2693 link_with : [libshared],
2694 install_rpath : rootlibexecdir,
2696 install_dir : rootlibexecdir)
2698 executable('systemd-update-utmp',
2699 'src/update-utmp/update-utmp.c',
2700 include_directories : includes,
2701 link_with : [libshared],
2702 dependencies : [libaudit],
2703 install_rpath : rootlibexecdir,
2705 install_dir : rootlibexecdir)
2707 if conf.get('HAVE_KMOD') == 1
2708 executable('systemd-modules-load',
2709 'src/modules-load/modules-load.c',
2710 include_directories : includes,
2711 link_with : [libshared],
2712 dependencies : [libkmod],
2713 install_rpath : rootlibexecdir,
2715 install_dir : rootlibexecdir)
2717 meson.add_install_script('sh', '-c',
2718 mkdir_p.format(modulesloaddir))
2719 meson.add_install_script('sh', '-c',
2720 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2723 exe = executable('systemd-nspawn',
2724 systemd_nspawn_sources,
2725 include_directories : includes,
2726 link_with : [libcore_shared,
2729 dependencies : [libblkid],
2730 install_rpath : rootlibexecdir,
2732 public_programs += exe
2734 if conf.get('ENABLE_NETWORKD') == 1
2735 executable('systemd-networkd',
2736 systemd_networkd_sources,
2737 include_directories : includes,
2738 link_with : [libnetworkd_core,
2742 dependencies : [threads],
2743 install_rpath : rootlibexecdir,
2745 install_dir : rootlibexecdir)
2747 executable('systemd-networkd-wait-online',
2748 systemd_networkd_wait_online_sources,
2749 include_directories : includes,
2750 link_with : [libnetworkd_core,
2752 install_rpath : rootlibexecdir,
2754 install_dir : rootlibexecdir)
2756 exe = executable('networkctl',
2758 include_directories : includes,
2759 link_with : [libsystemd_network,
2761 install_rpath : rootlibexecdir,
2763 install_dir : rootbindir)
2764 public_programs += exe
2767 executable('systemd-sulogin-shell',
2768 ['src/sulogin-shell/sulogin-shell.c'],
2769 include_directories : includes,
2770 link_with : [libshared],
2771 install_rpath : rootlibexecdir,
2773 install_dir : rootlibexecdir)
2775 ############################################################
2778 'systemd-runtest.env',
2779 output : 'systemd-runtest.env',
2780 command : ['sh', '-c', '{ ' +
2781 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2782 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2784 build_by_default : true)
2786 foreach tuple : tests
2788 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2789 dependencies = tuple[2]
2790 condition = tuple.length() >= 4 ? tuple[3] : ''
2791 type = tuple.length() >= 5 ? tuple[4] : ''
2792 defs = tuple.length() >= 6 ? tuple[5] : []
2793 incs = tuple.length() >= 7 ? tuple[6] : includes
2796 name = sources[0].split('/')[-1].split('.')[0]
2797 if type.startswith('timeout=')
2798 timeout = type.split('=')[1].to_int()
2802 if condition == '' or conf.get(condition) == 1
2806 include_directories : incs,
2807 link_with : link_with,
2808 dependencies : [versiondep,
2811 build_by_default : want_tests != 'false',
2812 install_rpath : rootlibexecdir,
2813 install : install_tests,
2814 install_dir : join_paths(testsdir, type))
2817 message('@0@ is a manual test'.format(name))
2818 elif type == 'unsafe' and want_tests != 'unsafe'
2819 message('@0@ is an unsafe test'.format(name))
2820 elif want_tests != 'false'
2826 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2831 'test-libsystemd-sym',
2832 test_libsystemd_sym_c,
2833 include_directories : includes,
2834 link_with : [libsystemd],
2835 build_by_default : want_tests != 'false',
2836 install : install_tests,
2837 install_dir : testsdir)
2838 if want_tests != 'false'
2839 test('test-libsystemd-sym', exe)
2843 'test-libsystemd-static-sym',
2844 test_libsystemd_sym_c,
2845 include_directories : includes,
2846 link_with : [install_libsystemd_static],
2847 dependencies : [threads], # threads is already included in dependencies on the library,
2848 # but does not seem to get propagated. Add here as a work-around.
2849 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2850 install : install_tests and static_libsystemd_pic,
2851 install_dir : testsdir)
2852 if want_tests != 'false' and static_libsystemd_pic
2853 test('test-libsystemd-static-sym', exe)
2859 include_directories : includes,
2860 c_args : '-Wno-deprecated-declarations',
2861 link_with : [libudev],
2862 build_by_default : want_tests != 'false',
2863 install : install_tests,
2864 install_dir : testsdir)
2865 if want_tests != 'false'
2866 test('test-libudev-sym', exe)
2870 'test-libudev-static-sym',
2872 include_directories : includes,
2873 c_args : '-Wno-deprecated-declarations',
2874 link_with : [install_libudev_static],
2875 build_by_default : want_tests != 'false' and static_libudev_pic,
2876 install : install_tests and static_libudev_pic,
2877 install_dir : testsdir)
2878 if want_tests != 'false' and static_libudev_pic
2879 test('test-libudev-static-sym', exe)
2882 ############################################################
2886 if get_option('tests') != 'false'
2887 foreach tuple : fuzzers
2889 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2890 dependencies = tuple[2]
2891 defs = tuple.length() >= 4 ? tuple[3] : []
2892 incs = tuple.length() >= 5 ? tuple[4] : includes
2895 dependencies += fuzzing_engine
2897 sources += 'src/fuzz/fuzz-main.c'
2900 name = sources[0].split('/')[-1].split('.')[0]
2902 fuzzer_exes += executable(
2905 include_directories : [incs, include_directories('src/fuzz')],
2906 link_with : link_with,
2907 dependencies : dependencies,
2913 run_target('fuzzers',
2914 depends : fuzzer_exes,
2917 ############################################################
2919 make_directive_index_py = find_program('tools/make-directive-index.py')
2920 make_man_index_py = find_program('tools/make-man-index.py')
2921 xml_helper_py = find_program('tools/xml_helper.py')
2922 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2926 subdir('sysusers.d')
2927 subdir('tmpfiles.d')
2932 subdir('shell-completion/bash')
2933 subdir('shell-completion/zsh')
2934 subdir('docs/sysvinit')
2935 subdir('docs/var-log')
2937 install_subdir('factory/etc',
2938 install_dir : factorydir)
2940 install_data('xorg/50-systemd-user.sh',
2941 install_dir : xinitrcdir)
2942 install_data('modprobe.d/systemd.conf',
2943 install_dir : modprobedir)
2944 install_data('LICENSE.GPL2',
2948 'docs/CODING_STYLE.md',
2949 'docs/DISTRO_PORTING.md',
2950 'docs/ENVIRONMENT.md',
2952 'docs/TRANSIENT-SETTINGS.md',
2953 'docs/TRANSLATORS.md',
2954 'docs/UIDS-GIDS.md',
2955 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2956 install_dir : docdir)
2958 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2959 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2961 ############################################################
2963 meson_check_help = find_program('tools/meson-check-help.sh')
2965 foreach exec : public_programs
2966 name = exec.full_path().split('/')[-1]
2967 if want_tests != 'false'
2968 test('check-help-' + name,
2970 args : exec.full_path())
2974 ############################################################
2976 # Enable tests for all supported sanitizers
2977 foreach tuple : sanitizers
2978 sanitizer = tuple[0]
2981 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2983 foreach p : fuzz_regression_tests
2984 b = p.split('/')[-2]
2985 c = p.split('/')[-1]
2987 name = '@0@:@1@'.format(b, sanitizer)
2990 if want_tests == 'false'
2991 message('Not compiling @0@ because tests is set to false'.format(name))
2993 exe = custom_target(
2997 command : [env, 'ln', '-fs',
2998 join_paths(build.full_path(), b),
3000 build_by_default : true)
3002 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3007 if want_tests != 'false' and slow_tests
3008 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3010 args : [exe.full_path(),
3011 join_paths(meson.source_root(), p)])
3018 ############################################################
3021 all_files = run_command(
3023 ['--git-dir=@0@/.git'.format(meson.source_root()),
3026 all_files = files(all_files.stdout().split())
3031 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3034 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3038 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3041 command : [meson_git_contrib_sh])
3045 git_head = run_command(
3047 ['--git-dir=@0@/.git'.format(meson.source_root()),
3048 'rev-parse', 'HEAD']).stdout().strip()
3049 git_head_short = run_command(
3051 ['--git-dir=@0@/.git'.format(meson.source_root()),
3052 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3056 command : ['git', 'archive',
3057 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3059 '--prefix', 'systemd-@0@/'.format(git_head),
3063 ############################################################
3065 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3068 depends : [man, libsystemd, libudev],
3069 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3071 ############################################################
3074 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3076 'split /usr: @0@'.format(split_usr),
3077 'split bin-sbin: @0@'.format(split_bin),
3078 'prefix directory: @0@'.format(prefixdir),
3079 'rootprefix directory: @0@'.format(rootprefixdir),
3080 'sysconf directory: @0@'.format(sysconfdir),
3081 'include directory: @0@'.format(includedir),
3082 'lib directory: @0@'.format(libdir),
3083 'rootlib directory: @0@'.format(rootlibdir),
3084 'SysV init scripts: @0@'.format(sysvinit_path),
3085 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3086 'PAM modules directory: @0@'.format(pamlibdir),
3087 'PAM configuration directory: @0@'.format(pamconfdir),
3088 'RPM macros directory: @0@'.format(rpmmacrosdir),
3089 'modprobe.d directory: @0@'.format(modprobedir),
3090 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3091 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3092 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3093 'bash completions directory: @0@'.format(bashcompletiondir),
3094 'zsh completions directory: @0@'.format(zshcompletiondir),
3095 'extra start script: @0@'.format(get_option('rc-local')),
3096 'extra stop script: @0@'.format(get_option('halt-local')),
3097 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3098 get_option('debug-tty')),
3099 'TTY GID: @0@'.format(tty_gid),
3100 'users GID: @0@'.format(substs.get('USERS_GID')),
3101 'maximum system UID: @0@'.format(system_uid_max),
3102 'maximum system GID: @0@'.format(system_gid_max),
3103 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3104 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3105 'minimum container UID base: @0@'.format(container_uid_base_min),
3106 'maximum container UID base: @0@'.format(container_uid_base_max),
3107 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3108 'render group access mode: @0@'.format(get_option('group-render-mode')),
3109 'certificate root directory: @0@'.format(get_option('certificate-root')),
3110 'support URL: @0@'.format(support_url),
3111 'nobody user name: @0@'.format(nobody_user),
3112 'nobody group name: @0@'.format(nobody_group),
3113 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3114 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3116 'default DNSSEC mode: @0@'.format(default_dnssec),
3117 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3118 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3119 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3120 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3121 'default locale: @0@'.format(default_locale)]
3123 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3124 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3126 'default DNS servers: @0@'.format(alt_dns_servers),
3127 'default NTP servers: @0@'.format(alt_ntp_servers)]
3129 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3130 '@@0@'.format(time_epoch)).stdout().strip()
3132 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3135 'static libsystemd: @0@'.format(static_libsystemd),
3136 'static libudev: @0@'.format(static_libudev)]
3139 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3140 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3141 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3143 if conf.get('ENABLE_EFI') == 1
3144 status += 'efi arch: @0@'.format(efi_arch)
3148 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3149 'EFI CC @0@'.format(' '.join(efi_cc)),
3150 'EFI lib directory: @0@'.format(efi_libdir),
3151 'EFI lds directory: @0@'.format(efi_ldsdir),
3152 'EFI include directory: @0@'.format(efi_incdir)]
3204 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3205 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3208 ['legacy pkla', install_polkit_pkla],
3210 ['gnu-efi', have_gnu_efi],
3223 ['man pages', want_man],
3224 ['html pages', want_html],
3225 ['man page indices', want_man and have_lxml],
3230 ['adm group', get_option('adm-group')],
3231 ['wheel group', get_option('wheel-group')],
3234 ['debug mmap cache'],
3237 ['valgrind', conf.get('VALGRIND') == 1],
3238 ['trace logging', conf.get('LOG_TRACE') == 1],
3239 ['link-udev-shared', get_option('link-udev-shared')],
3240 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3243 if tuple.length() >= 2
3246 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3247 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3248 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3259 'enabled features: @0@'.format(', '.join(found)),
3261 'disabled features: @0@'.format(', '.join(missing)),
3263 message('\n '.join(status))
3265 if rootprefixdir != rootprefix_default
3267 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3268 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3269 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))