1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.44',
15 libsystemd_version = '0.23.0'
16 libudev_version = '1.6.11'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
26 substs = configuration_data()
27 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PACKAGE_VERSION', meson.project_version())
30 #####################################################################
32 # Try to install the git pre-commit hook
33 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
34 if git_hook.returncode() == 0
35 message(git_hook.stdout().strip())
38 #####################################################################
40 if get_option('split-usr') == 'auto'
41 split_usr = run_command('test', '-L', '/bin').returncode() != 0
43 split_usr = get_option('split-usr') == 'true'
45 conf.set10('HAVE_SPLIT_USR', split_usr,
46 description : '/usr/bin and /bin directories are separate')
48 if get_option('split-bin') == 'auto'
49 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
51 split_bin = get_option('split-bin') == 'true'
53 conf.set10('HAVE_SPLIT_BIN', split_bin,
54 description : 'bin and sbin directories are separate')
56 rootprefixdir = get_option('rootprefix')
57 # Unusual rootprefixdir values are used by some distros
58 # (see https://github.com/systemd/systemd/pull/7461).
59 rootprefix_default = split_usr ? '/' : '/usr'
60 if rootprefixdir == ''
61 rootprefixdir = rootprefix_default
64 sysvinit_path = get_option('sysvinit-path')
65 sysvrcnd_path = get_option('sysvrcnd-path')
66 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
67 description : 'SysV init scripts and rcN.d links are supported')
69 # join_paths ignore the preceding arguments if an absolute component is
70 # encountered, so this should canonicalize various paths when they are
71 # absolute or relative.
72 prefixdir = get_option('prefix')
73 if not prefixdir.startswith('/')
74 error('Prefix is not absolute: "@0@"'.format(prefixdir))
76 bindir = join_paths(prefixdir, get_option('bindir'))
77 libdir = join_paths(prefixdir, get_option('libdir'))
78 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
79 includedir = join_paths(prefixdir, get_option('includedir'))
80 datadir = join_paths(prefixdir, get_option('datadir'))
81 localstatedir = join_paths('/', get_option('localstatedir'))
83 rootbindir = join_paths(rootprefixdir, 'bin')
84 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
85 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
87 rootlibdir = get_option('rootlibdir')
89 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
92 # Dirs of external packages
93 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
94 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
95 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
96 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
97 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
98 varlogdir = join_paths(localstatedir, 'log')
99 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
100 rpmmacrosdir = get_option('rpmmacrosdir')
101 if rpmmacrosdir != 'no'
102 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
104 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
107 pkgdatadir = join_paths(datadir, 'systemd')
108 environmentdir = join_paths(prefixdir, 'lib/environment.d')
109 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
110 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
111 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
112 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
113 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
114 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
115 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
116 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
117 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
118 pkgincludedir = join_paths(includedir, 'systemd')
119 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
120 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
121 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
122 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
123 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
124 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
125 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
126 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
127 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
128 udevhomedir = udevlibexecdir
129 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
130 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
131 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
132 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
133 factorydir = join_paths(datadir, 'factory')
134 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
135 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
136 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
137 catalogstatedir = join_paths(systemdstatedir, 'catalog')
138 randomseeddir = join_paths(localstatedir, 'lib/systemd')
139 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
141 docdir = get_option('docdir')
143 docdir = join_paths(datadir, 'doc/systemd')
146 dbuspolicydir = get_option('dbuspolicydir')
147 if dbuspolicydir == ''
148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
151 dbussessionservicedir = get_option('dbussessionservicedir')
152 if dbussessionservicedir == ''
153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
156 dbussystemservicedir = get_option('dbussystemservicedir')
157 if dbussystemservicedir == ''
158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
161 pamlibdir = get_option('pamlibdir')
163 pamlibdir = join_paths(rootlibdir, 'security')
166 pamconfdir = get_option('pamconfdir')
168 pamconfdir = join_paths(sysconfdir, 'pam.d')
171 memory_accounting_default = get_option('memory-accounting-default')
173 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
174 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
175 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
176 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
177 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
178 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
179 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
181 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
183 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
184 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
185 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
186 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
187 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
188 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
189 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
190 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
191 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
192 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
193 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
194 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
195 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
196 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
197 conf.set_quoted('ROOTPREFIX', rootprefixdir)
198 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
199 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
200 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
201 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
202 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
203 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
204 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
205 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
206 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
207 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
208 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
209 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
210 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
211 conf.set_quoted('LIBDIR', libdir)
212 conf.set_quoted('ROOTLIBDIR', rootlibdir)
213 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
214 conf.set_quoted('BOOTLIBDIR', bootlibdir)
215 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
216 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
217 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
218 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
219 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
220 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
221 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
222 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
224 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
225 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
227 substs.set('prefix', prefixdir)
228 substs.set('exec_prefix', prefixdir)
229 substs.set('libdir', libdir)
230 substs.set('rootlibdir', rootlibdir)
231 substs.set('includedir', includedir)
232 substs.set('pkgsysconfdir', pkgsysconfdir)
233 substs.set('bindir', bindir)
234 substs.set('rootbindir', rootbindir)
235 substs.set('rootlibexecdir', rootlibexecdir)
236 substs.set('systemunitdir', systemunitdir)
237 substs.set('userunitdir', userunitdir)
238 substs.set('systempresetdir', systempresetdir)
239 substs.set('userpresetdir', userpresetdir)
240 substs.set('udevhwdbdir', udevhwdbdir)
241 substs.set('udevrulesdir', udevrulesdir)
242 substs.set('udevlibexecdir', udevlibexecdir)
243 substs.set('environmentdir', environmentdir)
244 substs.set('catalogdir', catalogdir)
245 substs.set('tmpfilesdir', tmpfilesdir)
246 substs.set('sysusersdir', sysusersdir)
247 substs.set('sysctldir', sysctldir)
248 substs.set('binfmtdir', binfmtdir)
249 substs.set('modulesloaddir', modulesloaddir)
250 substs.set('modprobedir', modprobedir)
251 substs.set('systemgeneratordir', systemgeneratordir)
252 substs.set('usergeneratordir', usergeneratordir)
253 substs.set('systemenvgeneratordir', systemenvgeneratordir)
254 substs.set('userenvgeneratordir', userenvgeneratordir)
255 substs.set('systemshutdowndir', systemshutdowndir)
256 substs.set('systemsleepdir', systemsleepdir)
257 substs.set('VARLOGDIR', varlogdir)
258 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
259 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
260 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
261 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
262 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
263 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
264 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
265 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
267 #####################################################################
269 cc = meson.get_compiler('c')
270 pkgconfig = import('pkgconfig')
271 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
272 meson_build_sh = find_program('tools/meson-build.sh')
274 if get_option('tests') != 'false'
275 cxx = find_program('c++', required : false)
277 # Used only for tests
282 want_ossfuzz = get_option('oss-fuzz')
283 want_libfuzzer = get_option('llvm-fuzz')
284 fuzzer_build = want_ossfuzz or want_libfuzzer
285 if want_ossfuzz and want_libfuzzer
286 error('only one of oss-fuzz and llvm-fuzz can be specified')
289 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
292 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
295 possible_cc_flags = [
299 '-Wmissing-include-dirs',
300 '-Wold-style-definition',
304 '-Wsuggest-attribute=noreturn',
305 '-Werror=missing-prototypes',
306 '-Werror=implicit-function-declaration',
307 '-Werror=missing-declarations',
308 '-Werror=return-type',
309 '-Werror=incompatible-pointer-types',
311 '-Wstrict-prototypes',
313 '-Wmissing-noreturn',
314 '-Wimplicit-fallthrough=5',
317 '-Wstrict-aliasing=2',
320 '-Werror=shift-count-overflow',
321 '-Werror=shift-overflow=2',
326 '-fdiagnostics-show-option',
327 '-fno-strict-aliasing',
328 '-fvisibility=hidden',
330 '-fstack-protector-strong',
331 '--param=ssp-buffer-size=4',
334 # --as-needed and --no-undefined are provided by meson by default,
335 # run mesonconf to see what is enabled
336 possible_link_flags = [
341 # the oss-fuzz fuzzers are not built with -fPIE, so don't
342 # enable it when we are linking against them
344 possible_cc_flags += '-fPIE'
345 possible_link_flags += '-pie'
348 if cc.get_id() == 'clang'
349 possible_cc_flags += [
350 '-Wno-typedef-redefinition',
351 '-Wno-gnu-variable-sized-type-not-at-end',
355 if get_option('buildtype') != 'debug'
356 possible_cc_flags += [
357 '-ffunction-sections',
361 possible_link_flags += '-Wl,--gc-sections'
364 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
366 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
367 # arguments, just emits a warning. So test for the "positive" version instead.
368 foreach arg : ['unused-parameter',
369 'missing-field-initializers',
372 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
374 if cc.has_argument('-W' + arg)
375 add_project_arguments('-Wno-' + arg, language : 'c')
381 #include <inttypes.h>
382 typedef uint64_t usec_t;
383 usec_t now(clockid_t clock);
388 ''', name : '-Werror=shadow with local shadowing')
389 add_project_arguments('-Werror=shadow', language : 'c')
392 link_test_c = files('tools/meson-link-test.c')
394 foreach arg : possible_link_flags
395 have = run_command(check_compilation_sh,
396 cc.cmd_array(), '-x', 'c', arg,
397 '-include', link_test_c).returncode() == 0
398 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
400 add_project_link_arguments(arg, language : 'c')
404 cpp = ' '.join(cc.cmd_array()) + ' -E'
406 #####################################################################
407 # compilation result tests
409 conf.set('_GNU_SOURCE', true)
410 conf.set('__SANE_USERSPACE_TYPES__', true)
412 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
417 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
418 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
422 #include <linux/ethtool.h>
423 #include <linux/fib_rules.h>
424 #include <sys/stat.h>
426 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
428 foreach decl : ['char16_t',
431 'struct ethtool_link_settings',
432 'struct fib_rule_uid_range',
436 # We get -1 if the size cannot be determined
437 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
439 if decl == 'struct statx'
441 want_linux_stat_h = false
443 have = cc.sizeof(decl,
444 prefix : decl_headers + '#include <linux/stat.h>',
445 args : '-D_GNU_SOURCE') > 0
446 want_linux_stat_h = have
450 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
453 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
455 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
456 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
457 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
458 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
459 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
460 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
461 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
462 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
463 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
464 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
465 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
466 # if_tunnel.h is buggy and cannot be included on its own
467 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
468 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
469 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
470 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
471 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
472 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
473 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
474 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
475 ['NDA_IFINDEX', 'linux/neighbour.h'],
476 ['IFA_FLAGS', 'linux/if_addr.h'],
477 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
478 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
479 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
481 prefix = decl.length() > 2 ? decl[2] : ''
482 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
483 conf.set10('HAVE_' + decl[0], have)
486 foreach ident : ['secure_getenv', '__secure_getenv']
487 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
491 ['memfd_create', '''#include <sys/mman.h>'''],
492 ['gettid', '''#include <sys/types.h>
493 #include <unistd.h>'''],
494 ['pivot_root', '''#include <stdlib.h>
495 #include <unistd.h>'''], # no known header declares pivot_root
496 ['name_to_handle_at', '''#include <sys/types.h>
497 #include <sys/stat.h>
498 #include <fcntl.h>'''],
499 ['setns', '''#include <sched.h>'''],
500 ['renameat2', '''#include <stdio.h>
501 #include <fcntl.h>'''],
502 ['kcmp', '''#include <linux/kcmp.h>'''],
503 ['keyctl', '''#include <sys/types.h>
504 #include <keyutils.h>'''],
505 ['copy_file_range', '''#include <sys/syscall.h>
506 #include <unistd.h>'''],
507 ['bpf', '''#include <sys/syscall.h>
508 #include <unistd.h>'''],
509 ['statx', '''#include <sys/types.h>
510 #include <sys/stat.h>
511 #include <unistd.h>'''],
512 ['explicit_bzero' , '''#include <string.h>'''],
513 ['reallocarray', '''#include <malloc.h>'''],
516 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
517 conf.set10('HAVE_' + ident[0].to_upper(), have)
520 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
521 conf.set10('USE_SYS_RANDOM_H', true)
522 conf.set10('HAVE_GETRANDOM', true)
524 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
525 conf.set10('USE_SYS_RANDOM_H', false)
526 conf.set10('HAVE_GETRANDOM', have)
529 #####################################################################
531 sed = find_program('sed')
532 awk = find_program('awk')
533 m4 = find_program('m4')
534 stat = find_program('stat')
535 git = find_program('git', required : false)
536 env = find_program('env')
537 perl = find_program('perl', required : false)
539 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
540 mkdir_p = 'mkdir -p $DESTDIR/@0@'
541 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
542 splash_bmp = files('test/splash.bmp')
544 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
545 # /usr/sbin, /sbin, and fall back to the default from middle column.
546 progs = [['quotaon', '/usr/sbin/quotaon' ],
547 ['quotacheck', '/usr/sbin/quotacheck' ],
548 ['kmod', '/usr/bin/kmod' ],
549 ['kexec', '/usr/sbin/kexec' ],
550 ['sulogin', '/usr/sbin/sulogin' ],
551 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
552 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
553 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
554 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
557 path = get_option(prog[0] + '-path')
559 message('Using @1@ for @0@'.format(prog[0], path))
561 exe = find_program(prog[0],
562 '/usr/sbin/' + prog[0],
565 path = exe.found() ? exe.path() : prog[1]
567 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
568 conf.set_quoted(name, path)
569 substs.set(name, path)
572 conf.set_quoted('TELINIT', get_option('telinit-path'))
574 if run_command('ln', '--relative', '--help').returncode() != 0
575 error('ln does not support --relative (added in coreutils 8.16)')
578 ############################################################
580 gperf = find_program('gperf')
582 gperf_test_format = '''
584 const char * in_word_set(const char *, @0@);
587 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
588 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
589 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
590 if cc.compiles(gperf_test)
591 gperf_len_type = 'size_t'
593 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
594 if cc.compiles(gperf_test)
595 gperf_len_type = 'unsigned'
597 error('unable to determine gperf len type')
600 message('gperf len type is @0@'.format(gperf_len_type))
601 conf.set('GPERF_LEN_TYPE', gperf_len_type,
602 description : 'The type of gperf "len" parameter')
604 ############################################################
606 if not cc.has_header('sys/capability.h')
607 error('POSIX caps headers not found')
609 foreach header : ['crypt.h',
612 'linux/vm_sockets.h',
614 'valgrind/memcheck.h',
615 'valgrind/valgrind.h',
618 conf.set10('HAVE_' + header.underscorify().to_upper(),
619 cc.has_header(header))
622 ############################################################
624 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
625 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
626 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
628 default_hierarchy = get_option('default-hierarchy')
629 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
630 description : 'default cgroup hierarchy as string')
631 if default_hierarchy == 'legacy'
632 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
633 elif default_hierarchy == 'hybrid'
634 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
636 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
639 time_epoch = get_option('time-epoch')
642 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
644 time_epoch = time_epoch.to_int()
645 conf.set('TIME_EPOCH', time_epoch)
647 system_uid_max = get_option('system-uid-max')
648 if system_uid_max == ''
649 system_uid_max = run_command(
651 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
652 '/etc/login.defs').stdout().strip()
653 if system_uid_max == ''
654 system_uid_max = '999'
657 system_uid_max = system_uid_max.to_int()
658 conf.set('SYSTEM_UID_MAX', system_uid_max)
659 substs.set('systemuidmax', system_uid_max)
660 message('maximum system UID is @0@'.format(system_uid_max))
662 system_gid_max = get_option('system-gid-max')
663 if system_gid_max == ''
664 system_gid_max = run_command(
666 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
667 '/etc/login.defs').stdout().strip()
668 if system_gid_max == ''
669 system_gid_max = '999'
672 system_gid_max = system_gid_max.to_int()
673 conf.set('SYSTEM_GID_MAX', system_gid_max)
674 substs.set('systemgidmax', system_gid_max)
675 message('maximum system GID is @0@'.format(system_gid_max))
677 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
678 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
679 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
680 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
681 substs.set('dynamicuidmin', dynamic_uid_min)
682 substs.set('dynamicuidmax', dynamic_uid_max)
684 container_uid_base_min = get_option('container-uid-base-min').to_int()
685 container_uid_base_max = get_option('container-uid-base-max').to_int()
686 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
687 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
688 substs.set('containeruidbasemin', container_uid_base_min)
689 substs.set('containeruidbasemax', container_uid_base_max)
691 nobody_user = get_option('nobody-user')
692 nobody_group = get_option('nobody-group')
694 getent_result = run_command('getent', 'passwd', '65534')
695 if getent_result.returncode() == 0
696 name = getent_result.stdout().split(':')[0]
697 if name != nobody_user
699 '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) +
700 'Your build will result in an user table setup that is incompatible with the local system.')
703 id_result = run_command('id', '-u', nobody_user)
704 if id_result.returncode() == 0
705 id = id_result.stdout().to_int()
708 '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) +
709 'Your build will result in an user table setup that is incompatible with the local system.')
713 getent_result = run_command('getent', 'group', '65534')
714 if getent_result.returncode() == 0
715 name = getent_result.stdout().split(':')[0]
716 if name != nobody_group
718 '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) +
719 'Your build will result in an group table setup that is incompatible with the local system.')
722 id_result = run_command('id', '-g', nobody_group)
723 if id_result.returncode() == 0
724 id = id_result.stdout().to_int()
727 '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) +
728 'Your build will result in an group table setup that is incompatible with the local system.')
731 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
733 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
734 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
737 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
738 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
739 substs.set('NOBODY_USER_NAME', nobody_user)
740 substs.set('NOBODY_GROUP_NAME', nobody_group)
742 tty_gid = get_option('tty-gid')
743 conf.set('TTY_GID', tty_gid)
744 substs.set('TTY_GID', tty_gid)
746 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
747 if get_option('users-gid') != ''
748 users_gid = get_option('users-gid').to_int()
752 substs.set('USERS_GID', users_gid)
754 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
755 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
757 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
758 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
760 kill_user_processes = get_option('default-kill-user-processes')
761 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
762 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
763 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
765 dns_servers = get_option('dns-servers')
766 conf.set_quoted('DNS_SERVERS', dns_servers)
767 substs.set('DNS_SERVERS', dns_servers)
769 ntp_servers = get_option('ntp-servers')
770 conf.set_quoted('NTP_SERVERS', ntp_servers)
771 substs.set('NTP_SERVERS', ntp_servers)
773 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
775 substs.set('SUSHELL', get_option('debug-shell'))
776 substs.set('DEBUGTTY', get_option('debug-tty'))
778 enable_debug_hashmap = false
779 enable_debug_mmap_cache = false
780 foreach name : get_option('debug')
782 enable_debug_hashmap = true
783 elif name == 'mmap-cache'
784 enable_debug_mmap_cache = true
786 message('unknown debug option "@0@", ignoring'.format(name))
789 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
790 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
792 conf.set10('VALGRIND', get_option('valgrind'))
794 #####################################################################
796 threads = dependency('threads')
797 librt = cc.find_library('rt')
798 libm = cc.find_library('m')
799 libdl = cc.find_library('dl')
800 libcrypt = cc.find_library('crypt')
802 libcap = dependency('libcap', required : false)
803 if not libcap.found()
804 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
805 libcap = cc.find_library('cap')
808 libmount = dependency('mount',
809 version : fuzzer_build ? '>= 0' : '>= 2.30')
811 want_seccomp = get_option('seccomp')
812 if want_seccomp != 'false' and not fuzzer_build
813 libseccomp = dependency('libseccomp',
814 version : '>= 2.3.1',
815 required : want_seccomp == 'true')
816 have = libseccomp.found()
821 conf.set10('HAVE_SECCOMP', have)
823 want_selinux = get_option('selinux')
824 if want_selinux != 'false' and not fuzzer_build
825 libselinux = dependency('libselinux',
826 version : '>= 2.1.9',
827 required : want_selinux == 'true')
828 have = libselinux.found()
833 conf.set10('HAVE_SELINUX', have)
835 want_apparmor = get_option('apparmor')
836 if want_apparmor != 'false' and not fuzzer_build
837 libapparmor = dependency('libapparmor',
838 required : want_apparmor == 'true')
839 have = libapparmor.found()
844 conf.set10('HAVE_APPARMOR', have)
846 smack_run_label = get_option('smack-run-label')
847 if smack_run_label != ''
848 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
851 want_polkit = get_option('polkit')
852 install_polkit = false
853 install_polkit_pkla = false
854 if want_polkit != 'false' and not fuzzer_build
855 install_polkit = true
857 libpolkit = dependency('polkit-gobject-1',
859 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
860 message('Old polkit detected, will install pkla files')
861 install_polkit_pkla = true
864 conf.set10('ENABLE_POLKIT', install_polkit)
866 want_acl = get_option('acl')
867 if want_acl != 'false' and not fuzzer_build
868 libacl = cc.find_library('acl', required : want_acl == 'true')
869 have = libacl.found()
874 conf.set10('HAVE_ACL', have)
876 want_audit = get_option('audit')
877 if want_audit != 'false' and not fuzzer_build
878 libaudit = dependency('audit', required : want_audit == 'true')
879 have = libaudit.found()
884 conf.set10('HAVE_AUDIT', have)
886 want_blkid = get_option('blkid')
887 if want_blkid != 'false' and not fuzzer_build
888 libblkid = dependency('blkid', required : want_blkid == 'true')
889 have = libblkid.found()
894 conf.set10('HAVE_BLKID', have)
896 want_kmod = get_option('kmod')
897 if want_kmod != 'false' and not fuzzer_build
898 libkmod = dependency('libkmod',
900 required : want_kmod == 'true')
901 have = libkmod.found()
906 conf.set10('HAVE_KMOD', have)
908 want_pam = get_option('pam')
909 if want_pam != 'false' and not fuzzer_build
910 libpam = cc.find_library('pam', required : want_pam == 'true')
911 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
912 have = libpam.found() and libpam_misc.found()
918 conf.set10('HAVE_PAM', have)
920 want_microhttpd = get_option('microhttpd')
921 if want_microhttpd != 'false' and not fuzzer_build
922 libmicrohttpd = dependency('libmicrohttpd',
923 version : '>= 0.9.33',
924 required : want_microhttpd == 'true')
925 have = libmicrohttpd.found()
930 conf.set10('HAVE_MICROHTTPD', have)
932 want_libcryptsetup = get_option('libcryptsetup')
933 if want_libcryptsetup != 'false' and not fuzzer_build
934 libcryptsetup = dependency('libcryptsetup',
935 version : '>= 1.6.0',
936 required : want_libcryptsetup == 'true')
937 have = libcryptsetup.found()
942 conf.set10('HAVE_LIBCRYPTSETUP', have)
944 want_libcurl = get_option('libcurl')
945 if want_libcurl != 'false' and not fuzzer_build
946 libcurl = dependency('libcurl',
947 version : '>= 7.32.0',
948 required : want_libcurl == 'true')
949 have = libcurl.found()
954 conf.set10('HAVE_LIBCURL', have)
956 want_libidn = get_option('libidn')
957 want_libidn2 = get_option('libidn2')
958 if want_libidn == 'true' and want_libidn2 == 'true'
959 error('libidn and libidn2 cannot be requested simultaneously')
962 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
963 libidn = dependency('libidn',
964 required : want_libidn == 'true')
965 have = libidn.found()
970 conf.set10('HAVE_LIBIDN', have)
971 if not have and want_libidn2 != 'false' and not fuzzer_build
972 # libidn is used for both libidn and libidn2 objects
973 libidn = dependency('libidn2',
974 required : want_libidn2 == 'true')
975 have = libidn.found()
979 conf.set10('HAVE_LIBIDN2', have)
981 want_libiptc = get_option('libiptc')
982 if want_libiptc != 'false' and not fuzzer_build
983 libiptc = dependency('libiptc',
984 required : want_libiptc == 'true')
985 have = libiptc.found()
990 conf.set10('HAVE_LIBIPTC', have)
992 want_qrencode = get_option('qrencode')
993 if want_qrencode != 'false' and not fuzzer_build
994 libqrencode = dependency('libqrencode',
995 required : want_qrencode == 'true')
996 have = libqrencode.found()
1001 conf.set10('HAVE_QRENCODE', have)
1003 want_gcrypt = get_option('gcrypt')
1004 if want_gcrypt != 'false' and not fuzzer_build
1005 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1006 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1007 have = libgcrypt.found() and libgpg_error.found()
1012 # link to neither of the libs if one is not found
1016 conf.set10('HAVE_GCRYPT', have)
1018 want_gnutls = get_option('gnutls')
1019 if want_gnutls != 'false' and not fuzzer_build
1020 libgnutls = dependency('gnutls',
1021 version : '>= 3.1.4',
1022 required : want_gnutls == 'true')
1023 have = libgnutls.found()
1028 conf.set10('HAVE_GNUTLS', have)
1030 want_elfutils = get_option('elfutils')
1031 if want_elfutils != 'false' and not fuzzer_build
1032 libdw = dependency('libdw',
1033 required : want_elfutils == 'true')
1034 have = libdw.found()
1039 conf.set10('HAVE_ELFUTILS', have)
1041 want_zlib = get_option('zlib')
1042 if want_zlib != 'false' and not fuzzer_build
1043 libz = dependency('zlib',
1044 required : want_zlib == 'true')
1050 conf.set10('HAVE_ZLIB', have)
1052 want_bzip2 = get_option('bzip2')
1053 if want_bzip2 != 'false' and not fuzzer_build
1054 libbzip2 = cc.find_library('bz2',
1055 required : want_bzip2 == 'true')
1056 have = libbzip2.found()
1061 conf.set10('HAVE_BZIP2', have)
1063 want_xz = get_option('xz')
1064 if want_xz != 'false' and not fuzzer_build
1065 libxz = dependency('liblzma',
1066 required : want_xz == 'true')
1067 have = libxz.found()
1072 conf.set10('HAVE_XZ', have)
1074 want_lz4 = get_option('lz4')
1075 if want_lz4 != 'false' and not fuzzer_build
1076 liblz4 = dependency('liblz4',
1077 required : want_lz4 == 'true')
1078 have = liblz4.found()
1083 conf.set10('HAVE_LZ4', have)
1085 want_xkbcommon = get_option('xkbcommon')
1086 if want_xkbcommon != 'false' and not fuzzer_build
1087 libxkbcommon = dependency('xkbcommon',
1088 version : '>= 0.3.0',
1089 required : want_xkbcommon == 'true')
1090 have = libxkbcommon.found()
1095 conf.set10('HAVE_XKBCOMMON', have)
1097 want_pcre2 = get_option('pcre2')
1098 if want_pcre2 != 'false'
1099 libpcre2 = dependency('libpcre2-8',
1100 required : want_pcre2 == 'true')
1101 have = libpcre2.found()
1106 conf.set10('HAVE_PCRE2', have)
1108 want_glib = get_option('glib')
1109 if want_glib != 'false' and not fuzzer_build
1110 libglib = dependency('glib-2.0',
1111 version : '>= 2.22.0',
1112 required : want_glib == 'true')
1113 libgobject = dependency('gobject-2.0',
1114 version : '>= 2.22.0',
1115 required : want_glib == 'true')
1116 libgio = dependency('gio-2.0',
1117 required : want_glib == 'true')
1118 have = libglib.found() and libgobject.found() and libgio.found()
1125 conf.set10('HAVE_GLIB', have)
1127 want_dbus = get_option('dbus')
1128 if want_dbus != 'false' and not fuzzer_build
1129 libdbus = dependency('dbus-1',
1130 version : '>= 1.3.2',
1131 required : want_dbus == 'true')
1132 have = libdbus.found()
1137 conf.set10('HAVE_DBUS', have)
1139 default_dnssec = get_option('default-dnssec')
1141 default_dnssec = 'no'
1143 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1144 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1145 default_dnssec = 'no'
1147 conf.set('DEFAULT_DNSSEC_MODE',
1148 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1149 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1151 dns_over_tls = get_option('dns-over-tls')
1152 if dns_over_tls != 'false'
1153 have = (conf.get('HAVE_GNUTLS') == 1 and
1154 libgnutls.version().version_compare('>=3.5.3'))
1155 if dns_over_tls == 'true' and not have
1156 error('DNS-over-TLS support was requested, but dependencies are not available')
1161 conf.set10('ENABLE_DNS_OVER_TLS', have)
1163 default_dns_over_tls = get_option('default-dns-over-tls')
1165 default_dns_over_tls = 'no'
1167 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1168 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1169 default_dns_over_tls = 'no'
1171 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1172 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1173 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1175 want_importd = get_option('importd')
1176 if want_importd != 'false'
1177 have = (conf.get('HAVE_LIBCURL') == 1 and
1178 conf.get('HAVE_ZLIB') == 1 and
1179 conf.get('HAVE_BZIP2') == 1 and
1180 conf.get('HAVE_XZ') == 1 and
1181 conf.get('HAVE_GCRYPT') == 1)
1182 if want_importd == 'true' and not have
1183 error('importd support was requested, but dependencies are not available')
1188 conf.set10('ENABLE_IMPORTD', have)
1190 want_remote = get_option('remote')
1191 if want_remote != 'false'
1192 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1193 conf.get('HAVE_LIBCURL') == 1]
1194 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1195 # it's possible to build one without the other. Complain only if
1196 # support was explictly requested. The auxiliary files like sysusers
1197 # config should be installed when any of the programs are built.
1198 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1199 error('remote support was requested, but dependencies are not available')
1201 have = have_deps[0] or have_deps[1]
1205 conf.set10('ENABLE_REMOTE', have)
1207 foreach term : ['utmp',
1239 have = get_option(term)
1240 name = 'ENABLE_' + term.underscorify().to_upper()
1241 conf.set10(name, have)
1244 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1246 want_tests = get_option('tests')
1247 install_tests = get_option('install-tests')
1248 slow_tests = get_option('slow-tests')
1252 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1254 #####################################################################
1256 if get_option('efi')
1257 efi_arch = host_machine.cpu_family()
1259 if efi_arch == 'x86'
1260 EFI_MACHINE_TYPE_NAME = 'ia32'
1261 gnu_efi_arch = 'ia32'
1262 elif efi_arch == 'x86_64'
1263 EFI_MACHINE_TYPE_NAME = 'x64'
1264 gnu_efi_arch = 'x86_64'
1265 elif efi_arch == 'arm'
1266 EFI_MACHINE_TYPE_NAME = 'arm'
1267 gnu_efi_arch = 'arm'
1268 elif efi_arch == 'aarch64'
1269 EFI_MACHINE_TYPE_NAME = 'aa64'
1270 gnu_efi_arch = 'aarch64'
1272 EFI_MACHINE_TYPE_NAME = ''
1277 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1279 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1283 conf.set10('ENABLE_EFI', have)
1285 #####################################################################
1287 config_h = configure_file(
1288 output : 'config.h',
1289 configuration : conf)
1291 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1293 includes = include_directories('src/basic',
1297 'src/journal-remote',
1301 'src/time-wait-sync',
1306 'src/libsystemd/sd-bus',
1307 'src/libsystemd/sd-device',
1308 'src/libsystemd/sd-hwdb',
1309 'src/libsystemd/sd-id128',
1310 'src/libsystemd/sd-netlink',
1311 'src/libsystemd/sd-network',
1312 'src/libsystemd-network',
1315 add_project_arguments('-include', 'config.h', language : 'c')
1319 subdir('src/systemd')
1321 subdir('src/libsystemd')
1322 subdir('src/libsystemd-network')
1323 subdir('src/journal')
1326 libjournal_core = static_library(
1328 libjournal_core_sources,
1330 include_directories : includes,
1333 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1334 libsystemd = shared_library(
1336 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1337 version : libsystemd_version,
1338 include_directories : includes,
1339 link_args : ['-shared',
1340 '-Wl,--version-script=' + libsystemd_sym_path],
1341 link_with : [libbasic,
1343 link_whole : [libsystemd_static,
1345 dependencies : [threads,
1349 link_depends : libsystemd_sym,
1351 install_dir : rootlibdir)
1353 static_libsystemd = get_option('static-libsystemd')
1354 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1356 install_libsystemd_static = static_library(
1359 journal_client_sources,
1361 basic_gcrypt_sources,
1362 include_directories : includes,
1363 build_by_default : static_libsystemd != 'false',
1364 install : static_libsystemd != 'false',
1365 install_dir : rootlibdir,
1366 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1367 dependencies : [threads,
1376 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1378 ############################################################
1380 # binaries that have --help and are intended for use by humans,
1381 # usually, but not always, installed in /bin.
1382 public_programs = []
1384 subdir('src/libudev')
1385 subdir('src/shared')
1388 subdir('src/network')
1390 subdir('src/analyze')
1391 subdir('src/journal-remote')
1392 subdir('src/coredump')
1393 subdir('src/hostname')
1394 subdir('src/import')
1395 subdir('src/kernel-install')
1396 subdir('src/locale')
1397 subdir('src/machine')
1398 subdir('src/portable')
1399 subdir('src/nspawn')
1400 subdir('src/resolve')
1401 subdir('src/timedate')
1402 subdir('src/timesync')
1403 subdir('src/vconsole')
1404 subdir('src/boot/efi')
1411 ############################################################
1413 # only static linking apart from libdl, to make sure that the
1414 # module is linked to all libraries that it uses.
1415 test_dlopen = executable(
1418 include_directories : includes,
1419 link_with : [libbasic],
1420 dependencies : [libdl])
1422 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1423 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1424 ['mymachines', 'ENABLE_MACHINED'],
1425 ['resolve', 'ENABLE_RESOLVE']]
1427 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1431 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1432 version_script_arg = join_paths(meson.current_source_dir(), sym)
1434 nss = shared_library(
1436 'src/nss-@0@/nss-@0@.c'.format(module),
1438 include_directories : includes,
1439 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1440 link_args : ['-Wl,-z,nodelete',
1442 '-Wl,--version-script=' + version_script_arg,
1444 link_with : [libsystemd_static,
1446 dependencies : [threads,
1450 install_dir : rootlibdir)
1452 # We cannot use shared_module because it does not support version suffix.
1453 # Unfortunately shared_library insists on creating the symlink…
1454 meson.add_install_script('sh', '-c',
1455 'rm $DESTDIR@0@/libnss_@1@.so'
1456 .format(rootlibdir, module))
1458 test('dlopen-nss_' + module,
1460 args : [nss.full_path()]) # path to dlopen must include a slash
1464 ############################################################
1466 executable('systemd',
1468 include_directories : includes,
1469 link_with : [libcore,
1471 dependencies : [threads,
1477 install_rpath : rootlibexecdir,
1479 install_dir : rootlibexecdir)
1481 meson.add_install_script(meson_make_symlink,
1482 join_paths(rootlibexecdir, 'systemd'),
1483 join_paths(rootsbindir, 'init'))
1485 exe = executable('systemd-analyze',
1486 systemd_analyze_sources,
1487 include_directories : includes,
1488 link_with : [libcore,
1490 dependencies : [threads,
1496 install_rpath : rootlibexecdir,
1498 public_programs += [exe]
1500 executable('systemd-journald',
1501 systemd_journald_sources,
1502 include_directories : includes,
1503 link_with : [libjournal_core,
1505 dependencies : [threads,
1509 install_rpath : rootlibexecdir,
1511 install_dir : rootlibexecdir)
1513 exe = executable('systemd-cat',
1514 systemd_cat_sources,
1515 include_directories : includes,
1516 link_with : [libjournal_core,
1518 dependencies : [threads],
1519 install_rpath : rootlibexecdir,
1521 public_programs += [exe]
1523 exe = executable('journalctl',
1525 include_directories : includes,
1526 link_with : [libshared],
1527 dependencies : [threads,
1532 install_rpath : rootlibexecdir,
1534 install_dir : rootbindir)
1535 public_programs += [exe]
1537 executable('systemd-getty-generator',
1538 'src/getty-generator/getty-generator.c',
1539 include_directories : includes,
1540 link_with : [libshared],
1541 install_rpath : rootlibexecdir,
1543 install_dir : systemgeneratordir)
1545 executable('systemd-debug-generator',
1546 'src/debug-generator/debug-generator.c',
1547 include_directories : includes,
1548 link_with : [libshared],
1549 install_rpath : rootlibexecdir,
1551 install_dir : systemgeneratordir)
1553 executable('systemd-fstab-generator',
1554 'src/fstab-generator/fstab-generator.c',
1555 'src/core/mount-setup.c',
1556 include_directories : includes,
1557 link_with : [libshared],
1558 install_rpath : rootlibexecdir,
1560 install_dir : systemgeneratordir)
1562 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1563 executable('30-systemd-environment-d-generator',
1564 'src/environment-d-generator/environment-d-generator.c',
1565 include_directories : includes,
1566 link_with : [libshared],
1567 install_rpath : rootlibexecdir,
1569 install_dir : userenvgeneratordir)
1571 meson.add_install_script(meson_make_symlink,
1572 join_paths(sysconfdir, 'environment'),
1573 join_paths(environmentdir, '99-environment.conf'))
1576 if conf.get('ENABLE_HIBERNATE') == 1
1577 executable('systemd-hibernate-resume-generator',
1578 'src/hibernate-resume/hibernate-resume-generator.c',
1579 include_directories : includes,
1580 link_with : [libshared],
1581 install_rpath : rootlibexecdir,
1583 install_dir : systemgeneratordir)
1585 executable('systemd-hibernate-resume',
1586 'src/hibernate-resume/hibernate-resume.c',
1587 include_directories : includes,
1588 link_with : [libshared],
1589 install_rpath : rootlibexecdir,
1591 install_dir : rootlibexecdir)
1594 if conf.get('HAVE_BLKID') == 1
1595 executable('systemd-gpt-auto-generator',
1596 'src/gpt-auto-generator/gpt-auto-generator.c',
1597 'src/basic/blkid-util.h',
1598 include_directories : includes,
1599 link_with : [libshared],
1600 dependencies : libblkid,
1601 install_rpath : rootlibexecdir,
1603 install_dir : systemgeneratordir)
1605 exe = executable('systemd-dissect',
1606 'src/dissect/dissect.c',
1607 include_directories : includes,
1608 link_with : [libshared],
1609 install_rpath : rootlibexecdir,
1611 install_dir : rootlibexecdir)
1612 public_programs += [exe]
1615 if conf.get('ENABLE_RESOLVE') == 1
1616 executable('systemd-resolved',
1617 systemd_resolved_sources,
1618 include_directories : includes,
1619 link_with : [libshared,
1621 libsystemd_resolve_core],
1622 dependencies : systemd_resolved_dependencies,
1623 install_rpath : rootlibexecdir,
1625 install_dir : rootlibexecdir)
1627 exe = executable('resolvectl',
1629 include_directories : includes,
1630 link_with : [libshared,
1632 libsystemd_resolve_core],
1633 dependencies : [threads,
1637 install_rpath : rootlibexecdir,
1639 public_programs += [exe]
1641 meson.add_install_script(meson_make_symlink,
1642 join_paths(bindir, 'resolvectl'),
1643 join_paths(rootsbindir, 'resolvconf'))
1645 meson.add_install_script(meson_make_symlink,
1646 join_paths(bindir, 'resolvectl'),
1647 join_paths(bindir, 'systemd-resolve'))
1650 if conf.get('ENABLE_LOGIND') == 1
1651 executable('systemd-logind',
1652 systemd_logind_sources,
1653 include_directories : includes,
1654 link_with : [liblogind_core,
1656 dependencies : [threads,
1658 install_rpath : rootlibexecdir,
1660 install_dir : rootlibexecdir)
1662 exe = executable('loginctl',
1664 include_directories : includes,
1665 link_with : [libshared],
1666 dependencies : [threads,
1669 install_rpath : rootlibexecdir,
1671 install_dir : rootbindir)
1672 public_programs += [exe]
1674 exe = executable('systemd-inhibit',
1675 'src/login/inhibit.c',
1676 include_directories : includes,
1677 link_with : [libshared],
1678 install_rpath : rootlibexecdir,
1680 install_dir : rootbindir)
1681 public_programs += [exe]
1683 if conf.get('HAVE_PAM') == 1
1684 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1685 pam_systemd = shared_library(
1689 include_directories : includes,
1690 link_args : ['-shared',
1691 '-Wl,--version-script=' + version_script_arg],
1692 link_with : [libsystemd_static,
1694 dependencies : [threads,
1697 link_depends : pam_systemd_sym,
1699 install_dir : pamlibdir)
1701 test('dlopen-pam_systemd',
1703 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1707 executable('systemd-user-runtime-dir',
1708 user_runtime_dir_sources,
1709 include_directories : includes,
1710 link_with : [libshared, liblogind_core],
1711 install_rpath : rootlibexecdir,
1713 install_dir : rootlibexecdir)
1715 if conf.get('HAVE_PAM') == 1
1716 executable('systemd-user-sessions',
1717 'src/user-sessions/user-sessions.c',
1718 include_directories : includes,
1719 link_with : [libshared],
1720 install_rpath : rootlibexecdir,
1722 install_dir : rootlibexecdir)
1725 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1726 exe = executable('bootctl',
1727 'src/boot/bootctl.c',
1728 include_directories : includes,
1729 link_with : [libshared],
1730 dependencies : [libblkid],
1731 install_rpath : rootlibexecdir,
1733 public_programs += [exe]
1736 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1737 include_directories : includes,
1738 link_with : [libshared],
1739 dependencies : [threads],
1740 install_rpath : rootlibexecdir,
1742 public_programs += [exe]
1745 if get_option('link-systemctl-shared')
1746 systemctl_link_with = [libshared]
1748 systemctl_link_with = [libsystemd_static,
1754 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1755 include_directories : includes,
1756 link_with : systemctl_link_with,
1757 dependencies : [threads,
1762 install_rpath : rootlibexecdir,
1764 install_dir : rootbindir)
1765 public_programs += [exe]
1767 if conf.get('ENABLE_PORTABLED') == 1
1768 executable('systemd-portabled',
1769 systemd_portabled_sources,
1770 include_directories : includes,
1771 link_with : [libshared],
1772 dependencies : [threads],
1773 install_rpath : rootlibexecdir,
1775 install_dir : rootlibexecdir)
1777 exe = executable('portablectl', 'src/portable/portablectl.c',
1778 include_directories : includes,
1779 link_with : [libshared],
1780 dependencies : [threads],
1781 install_rpath : rootlibexecdir,
1783 install_dir : rootlibexecdir)
1784 public_programs += [exe]
1787 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1788 meson.add_install_script(meson_make_symlink,
1789 join_paths(rootbindir, 'systemctl'),
1790 join_paths(rootsbindir, alias))
1793 if conf.get('ENABLE_BACKLIGHT') == 1
1794 executable('systemd-backlight',
1795 'src/backlight/backlight.c',
1796 include_directories : includes,
1797 link_with : [libshared],
1798 install_rpath : rootlibexecdir,
1800 install_dir : rootlibexecdir)
1803 if conf.get('ENABLE_RFKILL') == 1
1804 executable('systemd-rfkill',
1805 'src/rfkill/rfkill.c',
1806 include_directories : includes,
1807 link_with : [libshared],
1808 install_rpath : rootlibexecdir,
1810 install_dir : rootlibexecdir)
1813 executable('systemd-system-update-generator',
1814 'src/system-update-generator/system-update-generator.c',
1815 include_directories : includes,
1816 link_with : [libshared],
1817 install_rpath : rootlibexecdir,
1819 install_dir : systemgeneratordir)
1821 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1822 executable('systemd-cryptsetup',
1823 'src/cryptsetup/cryptsetup.c',
1824 include_directories : includes,
1825 link_with : [libshared],
1826 dependencies : [libcryptsetup],
1827 install_rpath : rootlibexecdir,
1829 install_dir : rootlibexecdir)
1831 executable('systemd-cryptsetup-generator',
1832 'src/cryptsetup/cryptsetup-generator.c',
1833 include_directories : includes,
1834 link_with : [libshared],
1835 dependencies : [libcryptsetup],
1836 install_rpath : rootlibexecdir,
1838 install_dir : systemgeneratordir)
1840 executable('systemd-veritysetup',
1841 'src/veritysetup/veritysetup.c',
1842 include_directories : includes,
1843 link_with : [libshared],
1844 dependencies : [libcryptsetup],
1845 install_rpath : rootlibexecdir,
1847 install_dir : rootlibexecdir)
1849 executable('systemd-veritysetup-generator',
1850 'src/veritysetup/veritysetup-generator.c',
1851 include_directories : includes,
1852 link_with : [libshared],
1853 dependencies : [libcryptsetup],
1854 install_rpath : rootlibexecdir,
1856 install_dir : systemgeneratordir)
1859 if conf.get('HAVE_SYSV_COMPAT') == 1
1860 executable('systemd-sysv-generator',
1861 'src/sysv-generator/sysv-generator.c',
1862 include_directories : includes,
1863 link_with : [libshared],
1864 install_rpath : rootlibexecdir,
1866 install_dir : systemgeneratordir)
1868 executable('systemd-rc-local-generator',
1869 'src/rc-local-generator/rc-local-generator.c',
1870 include_directories : includes,
1871 link_with : [libshared],
1872 install_rpath : rootlibexecdir,
1874 install_dir : systemgeneratordir)
1877 if conf.get('ENABLE_HOSTNAMED') == 1
1878 executable('systemd-hostnamed',
1879 'src/hostname/hostnamed.c',
1880 include_directories : includes,
1881 link_with : [libshared],
1882 install_rpath : rootlibexecdir,
1884 install_dir : rootlibexecdir)
1886 exe = executable('hostnamectl',
1887 'src/hostname/hostnamectl.c',
1888 include_directories : includes,
1889 link_with : [libshared],
1890 install_rpath : rootlibexecdir,
1892 public_programs += [exe]
1895 if conf.get('ENABLE_LOCALED') == 1
1896 if conf.get('HAVE_XKBCOMMON') == 1
1897 # logind will load libxkbcommon.so dynamically on its own
1903 executable('systemd-localed',
1904 systemd_localed_sources,
1905 include_directories : includes,
1906 link_with : [libshared],
1907 dependencies : deps,
1908 install_rpath : rootlibexecdir,
1910 install_dir : rootlibexecdir)
1912 exe = executable('localectl',
1914 include_directories : includes,
1915 link_with : [libshared],
1916 install_rpath : rootlibexecdir,
1918 public_programs += [exe]
1921 if conf.get('ENABLE_TIMEDATED') == 1
1922 executable('systemd-timedated',
1923 'src/timedate/timedated.c',
1924 include_directories : includes,
1925 link_with : [libshared],
1926 install_rpath : rootlibexecdir,
1928 install_dir : rootlibexecdir)
1931 if conf.get('ENABLE_TIMEDATECTL') == 1
1932 exe = executable('timedatectl',
1933 'src/timedate/timedatectl.c',
1934 include_directories : includes,
1935 install_rpath : rootlibexecdir,
1936 link_with : [libshared],
1937 dependencies : [libm],
1939 public_programs += [exe]
1942 if conf.get('ENABLE_TIMESYNCD') == 1
1943 executable('systemd-timesyncd',
1944 systemd_timesyncd_sources,
1945 include_directories : includes,
1946 link_with : [libshared],
1947 dependencies : [threads,
1949 install_rpath : rootlibexecdir,
1951 install_dir : rootlibexecdir)
1953 executable('systemd-time-wait-sync',
1954 'src/time-wait-sync/time-wait-sync.c',
1955 include_directories : includes,
1956 link_with : [libshared],
1957 install_rpath : rootlibexecdir,
1959 install_dir : rootlibexecdir)
1962 if conf.get('ENABLE_MACHINED') == 1
1963 executable('systemd-machined',
1964 systemd_machined_sources,
1965 include_directories : includes,
1966 link_with : [libmachine_core,
1968 install_rpath : rootlibexecdir,
1970 install_dir : rootlibexecdir)
1972 exe = executable('machinectl',
1973 'src/machine/machinectl.c',
1974 include_directories : includes,
1975 link_with : [libshared],
1976 dependencies : [threads,
1979 install_rpath : rootlibexecdir,
1981 install_dir : rootbindir)
1982 public_programs += [exe]
1985 if conf.get('ENABLE_IMPORTD') == 1
1986 executable('systemd-importd',
1987 systemd_importd_sources,
1988 include_directories : includes,
1989 link_with : [libshared],
1990 dependencies : [threads],
1991 install_rpath : rootlibexecdir,
1993 install_dir : rootlibexecdir)
1995 systemd_pull = executable('systemd-pull',
1996 systemd_pull_sources,
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : [libcurl,
2004 install_rpath : rootlibexecdir,
2006 install_dir : rootlibexecdir)
2008 systemd_import = executable('systemd-import',
2009 systemd_import_sources,
2010 include_directories : includes,
2011 link_with : [libshared],
2012 dependencies : [libcurl,
2016 install_rpath : rootlibexecdir,
2018 install_dir : rootlibexecdir)
2020 systemd_export = executable('systemd-export',
2021 systemd_export_sources,
2022 include_directories : includes,
2023 link_with : [libshared],
2024 dependencies : [libcurl,
2028 install_rpath : rootlibexecdir,
2030 install_dir : rootlibexecdir)
2031 public_programs += [systemd_pull, systemd_import, systemd_export]
2034 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2035 exe = executable('systemd-journal-upload',
2036 systemd_journal_upload_sources,
2037 include_directories : includes,
2038 link_with : [libshared],
2039 dependencies : [threads,
2044 install_rpath : rootlibexecdir,
2046 install_dir : rootlibexecdir)
2047 public_programs += [exe]
2050 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2051 s_j_remote = executable('systemd-journal-remote',
2052 systemd_journal_remote_sources,
2053 include_directories : includes,
2054 link_with : [libshared,
2055 libsystemd_journal_remote],
2056 dependencies : [threads,
2061 install_rpath : rootlibexecdir,
2063 install_dir : rootlibexecdir)
2065 s_j_gatewayd = executable('systemd-journal-gatewayd',
2066 systemd_journal_gatewayd_sources,
2067 include_directories : includes,
2068 link_with : [libshared],
2069 dependencies : [threads,
2074 install_rpath : rootlibexecdir,
2076 install_dir : rootlibexecdir)
2077 public_programs += [s_j_remote, s_j_gatewayd]
2080 if conf.get('ENABLE_COREDUMP') == 1
2081 executable('systemd-coredump',
2082 systemd_coredump_sources,
2083 include_directories : includes,
2084 link_with : [libshared],
2085 dependencies : [threads,
2090 install_rpath : rootlibexecdir,
2092 install_dir : rootlibexecdir)
2094 exe = executable('coredumpctl',
2095 coredumpctl_sources,
2096 include_directories : includes,
2097 link_with : [libshared],
2098 dependencies : [threads,
2101 install_rpath : rootlibexecdir,
2103 public_programs += [exe]
2106 if conf.get('ENABLE_BINFMT') == 1
2107 exe = executable('systemd-binfmt',
2108 'src/binfmt/binfmt.c',
2109 include_directories : includes,
2110 link_with : [libshared],
2111 install_rpath : rootlibexecdir,
2113 install_dir : rootlibexecdir)
2114 public_programs += [exe]
2116 meson.add_install_script('sh', '-c',
2117 mkdir_p.format(binfmtdir))
2118 meson.add_install_script('sh', '-c',
2119 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2122 if conf.get('ENABLE_VCONSOLE') == 1
2123 executable('systemd-vconsole-setup',
2124 'src/vconsole/vconsole-setup.c',
2125 include_directories : includes,
2126 link_with : [libshared],
2127 install_rpath : rootlibexecdir,
2129 install_dir : rootlibexecdir)
2132 if conf.get('ENABLE_RANDOMSEED') == 1
2133 executable('systemd-random-seed',
2134 'src/random-seed/random-seed.c',
2135 include_directories : includes,
2136 link_with : [libshared],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2142 if conf.get('ENABLE_FIRSTBOOT') == 1
2143 executable('systemd-firstboot',
2144 'src/firstboot/firstboot.c',
2145 include_directories : includes,
2146 link_with : [libshared],
2147 dependencies : [libcrypt],
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootbindir)
2153 executable('systemd-remount-fs',
2154 'src/remount-fs/remount-fs.c',
2155 'src/core/mount-setup.c',
2156 'src/core/mount-setup.h',
2157 include_directories : includes,
2158 link_with : [libshared],
2159 install_rpath : rootlibexecdir,
2161 install_dir : rootlibexecdir)
2163 executable('systemd-machine-id-setup',
2164 'src/machine-id-setup/machine-id-setup-main.c',
2165 'src/core/machine-id-setup.c',
2166 'src/core/machine-id-setup.h',
2167 include_directories : includes,
2168 link_with : [libshared],
2169 install_rpath : rootlibexecdir,
2171 install_dir : rootbindir)
2173 executable('systemd-fsck',
2175 include_directories : includes,
2176 link_with : [libshared],
2177 install_rpath : rootlibexecdir,
2179 install_dir : rootlibexecdir)
2181 executable('systemd-growfs',
2182 'src/partition/growfs.c',
2183 include_directories : includes,
2184 link_with : [libshared],
2185 dependencies : [libcryptsetup],
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootlibexecdir)
2190 executable('systemd-makefs',
2191 'src/partition/makefs.c',
2192 include_directories : includes,
2193 link_with : [libshared],
2194 install_rpath : rootlibexecdir,
2196 install_dir : rootlibexecdir)
2198 executable('systemd-sleep',
2199 'src/sleep/sleep.c',
2200 include_directories : includes,
2201 link_with : [libshared],
2202 install_rpath : rootlibexecdir,
2204 install_dir : rootlibexecdir)
2206 exe = executable('systemd-sysctl',
2207 'src/sysctl/sysctl.c',
2208 include_directories : includes,
2209 link_with : [libshared],
2210 install_rpath : rootlibexecdir,
2212 install_dir : rootlibexecdir)
2213 public_programs += [exe]
2215 executable('systemd-ac-power',
2216 'src/ac-power/ac-power.c',
2217 include_directories : includes,
2218 link_with : [libshared],
2219 install_rpath : rootlibexecdir,
2221 install_dir : rootlibexecdir)
2223 exe = executable('systemd-detect-virt',
2224 'src/detect-virt/detect-virt.c',
2225 include_directories : includes,
2226 link_with : [libshared],
2227 install_rpath : rootlibexecdir,
2229 public_programs += [exe]
2231 exe = executable('systemd-delta',
2232 'src/delta/delta.c',
2233 include_directories : includes,
2234 link_with : [libshared],
2235 install_rpath : rootlibexecdir,
2237 public_programs += [exe]
2239 exe = executable('systemd-escape',
2240 'src/escape/escape.c',
2241 include_directories : includes,
2242 link_with : [libshared],
2243 install_rpath : rootlibexecdir,
2245 install_dir : rootbindir)
2246 public_programs += [exe]
2248 exe = executable('systemd-notify',
2249 'src/notify/notify.c',
2250 include_directories : includes,
2251 link_with : [libshared],
2252 install_rpath : rootlibexecdir,
2254 install_dir : rootbindir)
2255 public_programs += [exe]
2257 executable('systemd-volatile-root',
2258 'src/volatile-root/volatile-root.c',
2259 include_directories : includes,
2260 link_with : [libshared],
2261 install_rpath : rootlibexecdir,
2263 install_dir : rootlibexecdir)
2265 executable('systemd-cgroups-agent',
2266 'src/cgroups-agent/cgroups-agent.c',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2271 install_dir : rootlibexecdir)
2273 exe = executable('systemd-path',
2275 include_directories : includes,
2276 link_with : [libshared],
2277 install_rpath : rootlibexecdir,
2279 public_programs += [exe]
2281 exe = executable('systemd-ask-password',
2282 'src/ask-password/ask-password.c',
2283 include_directories : includes,
2284 link_with : [libshared],
2285 install_rpath : rootlibexecdir,
2287 install_dir : rootbindir)
2288 public_programs += [exe]
2290 executable('systemd-reply-password',
2291 'src/reply-password/reply-password.c',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 install_rpath : rootlibexecdir,
2296 install_dir : rootlibexecdir)
2298 exe = executable('systemd-tty-ask-password-agent',
2299 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2300 include_directories : includes,
2301 link_with : [libshared],
2302 install_rpath : rootlibexecdir,
2304 install_dir : rootbindir)
2305 public_programs += [exe]
2307 exe = executable('systemd-cgls',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2313 public_programs += [exe]
2315 exe = executable('systemd-cgtop',
2316 'src/cgtop/cgtop.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2321 public_programs += [exe]
2323 executable('systemd-initctl',
2324 'src/initctl/initctl.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 install_rpath : rootlibexecdir,
2329 install_dir : rootlibexecdir)
2331 exe = executable('systemd-mount',
2332 'src/mount/mount-tool.c',
2333 include_directories : includes,
2334 link_with : [libshared],
2335 install_rpath : rootlibexecdir,
2337 public_programs += [exe]
2339 meson.add_install_script(meson_make_symlink,
2340 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2342 exe = executable('systemd-run',
2344 include_directories : includes,
2345 link_with : [libshared],
2346 install_rpath : rootlibexecdir,
2348 public_programs += [exe]
2350 exe = executable('systemd-stdio-bridge',
2351 'src/stdio-bridge/stdio-bridge.c',
2352 include_directories : includes,
2353 link_with : [libshared],
2354 install_rpath : rootlibexecdir,
2356 public_programs += [exe]
2358 exe = executable('busctl',
2359 'src/busctl/busctl.c',
2360 'src/busctl/busctl-introspect.c',
2361 'src/busctl/busctl-introspect.h',
2362 include_directories : includes,
2363 link_with : [libshared],
2364 install_rpath : rootlibexecdir,
2366 public_programs += [exe]
2368 if conf.get('ENABLE_SYSUSERS') == 1
2369 exe = executable('systemd-sysusers',
2370 'src/sysusers/sysusers.c',
2371 include_directories : includes,
2372 link_with : [libshared],
2373 install_rpath : rootlibexecdir,
2375 install_dir : rootbindir)
2376 public_programs += [exe]
2379 if conf.get('ENABLE_TMPFILES') == 1
2380 exe = executable('systemd-tmpfiles',
2381 'src/tmpfiles/tmpfiles.c',
2382 include_directories : includes,
2383 link_with : [libshared],
2384 dependencies : [libacl],
2385 install_rpath : rootlibexecdir,
2387 install_dir : rootbindir)
2388 public_programs += [exe]
2390 test('test-systemd-tmpfiles',
2391 test_systemd_tmpfiles_py,
2392 args : exe.full_path())
2393 # https://github.com/mesonbuild/meson/issues/2681
2396 if conf.get('ENABLE_HWDB') == 1
2397 exe = executable('systemd-hwdb',
2399 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2400 include_directories : includes,
2401 link_with : [libudev_static],
2402 install_rpath : udev_rpath,
2404 install_dir : rootbindir)
2405 public_programs += [exe]
2408 if conf.get('ENABLE_QUOTACHECK') == 1
2409 executable('systemd-quotacheck',
2410 'src/quotacheck/quotacheck.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 install_rpath : rootlibexecdir,
2415 install_dir : rootlibexecdir)
2418 exe = executable('systemd-socket-proxyd',
2419 'src/socket-proxy/socket-proxyd.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 dependencies : [threads],
2423 install_rpath : rootlibexecdir,
2425 install_dir : rootlibexecdir)
2426 public_programs += [exe]
2428 exe = executable('systemd-udevd',
2429 systemd_udevd_sources,
2430 include_directories : includes,
2431 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2432 link_with : [libudev_core,
2435 dependencies : [threads,
2440 install_rpath : udev_rpath,
2442 install_dir : rootlibexecdir)
2443 public_programs += [exe]
2445 exe = executable('udevadm',
2447 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2448 include_directories : includes,
2449 link_with : [libudev_core,
2452 dependencies : [threads,
2457 install_rpath : udev_rpath,
2459 install_dir : rootbindir)
2460 public_programs += [exe]
2462 executable('systemd-shutdown',
2463 systemd_shutdown_sources,
2464 include_directories : includes,
2465 link_with : [libshared],
2466 dependencies : [libmount],
2467 install_rpath : rootlibexecdir,
2469 install_dir : rootlibexecdir)
2471 executable('systemd-update-done',
2472 'src/update-done/update-done.c',
2473 include_directories : includes,
2474 link_with : [libshared],
2475 install_rpath : rootlibexecdir,
2477 install_dir : rootlibexecdir)
2479 executable('systemd-update-utmp',
2480 'src/update-utmp/update-utmp.c',
2481 include_directories : includes,
2482 link_with : [libshared],
2483 dependencies : [libaudit],
2484 install_rpath : rootlibexecdir,
2486 install_dir : rootlibexecdir)
2488 if conf.get('HAVE_KMOD') == 1
2489 executable('systemd-modules-load',
2490 'src/modules-load/modules-load.c',
2491 include_directories : includes,
2492 link_with : [libshared],
2493 dependencies : [libkmod],
2494 install_rpath : rootlibexecdir,
2496 install_dir : rootlibexecdir)
2498 meson.add_install_script('sh', '-c',
2499 mkdir_p.format(modulesloaddir))
2500 meson.add_install_script('sh', '-c',
2501 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2504 exe = executable('systemd-nspawn',
2505 systemd_nspawn_sources,
2506 'src/core/mount-setup.c', # FIXME: use a variable?
2507 'src/core/mount-setup.h',
2508 'src/core/loopback-setup.c',
2509 'src/core/loopback-setup.h',
2510 include_directories : includes,
2511 link_with : [libnspawn_core,
2513 dependencies : [libblkid],
2514 install_rpath : rootlibexecdir,
2516 public_programs += [exe]
2518 if conf.get('ENABLE_NETWORKD') == 1
2519 executable('systemd-networkd',
2520 systemd_networkd_sources,
2521 include_directories : includes,
2522 link_with : [libnetworkd_core,
2526 dependencies : [threads],
2527 install_rpath : rootlibexecdir,
2529 install_dir : rootlibexecdir)
2531 executable('systemd-networkd-wait-online',
2532 systemd_networkd_wait_online_sources,
2533 include_directories : includes,
2534 link_with : [libnetworkd_core,
2536 install_rpath : rootlibexecdir,
2538 install_dir : rootlibexecdir)
2540 exe = executable('networkctl',
2542 include_directories : includes,
2543 link_with : [libsystemd_network,
2545 install_rpath : rootlibexecdir,
2547 install_dir : rootbindir)
2548 public_programs += [exe]
2551 executable('systemd-sulogin-shell',
2552 ['src/sulogin-shell/sulogin-shell.c'],
2553 include_directories : includes,
2554 link_with : [libshared],
2555 install_rpath : rootlibexecdir,
2557 install_dir : rootlibexecdir)
2559 ############################################################
2561 foreach tuple : tests
2563 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2564 dependencies = tuple[2]
2565 condition = tuple.length() >= 4 ? tuple[3] : ''
2566 type = tuple.length() >= 5 ? tuple[4] : ''
2567 defs = tuple.length() >= 6 ? tuple[5] : []
2568 incs = tuple.length() >= 7 ? tuple[6] : includes
2571 name = sources[0].split('/')[-1].split('.')[0]
2572 if type.startswith('timeout=')
2573 timeout = type.split('=')[1].to_int()
2576 if want_tests == 'false'
2577 message('Not compiling @0@ because tests is set to false'.format(name))
2578 elif condition == '' or conf.get(condition) == 1
2582 include_directories : incs,
2583 link_with : link_with,
2584 dependencies : dependencies,
2586 install_rpath : rootlibexecdir,
2587 install : install_tests,
2588 install_dir : join_paths(testsdir, type))
2591 message('@0@ is a manual test'.format(name))
2592 elif type == 'unsafe' and want_tests != 'unsafe'
2593 message('@0@ is an unsafe test'.format(name))
2600 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2605 'test-libsystemd-sym',
2606 test_libsystemd_sym_c,
2607 include_directories : includes,
2608 link_with : [libsystemd],
2609 install : install_tests,
2610 install_dir : testsdir)
2611 test('test-libsystemd-sym', exe)
2614 'test-libsystemd-static-sym',
2615 test_libsystemd_sym_c,
2616 include_directories : includes,
2617 link_with : [install_libsystemd_static],
2618 dependencies : [threads], # threads is already included in dependencies on the library,
2619 # but does not seem to get propagated. Add here as a work-around.
2620 build_by_default : static_libsystemd_pic,
2621 install : install_tests and static_libsystemd_pic,
2622 install_dir : testsdir)
2623 if static_libsystemd_pic
2624 test('test-libsystemd-static-sym', exe)
2630 include_directories : includes,
2631 c_args : ['-Wno-deprecated-declarations'],
2632 link_with : [libudev],
2633 install : install_tests,
2634 install_dir : testsdir)
2635 test('test-libudev-sym', exe)
2638 'test-libudev-static-sym',
2640 include_directories : includes,
2641 c_args : ['-Wno-deprecated-declarations'],
2642 link_with : [install_libudev_static],
2643 build_by_default : static_libudev_pic,
2644 install : install_tests and static_libudev_pic,
2645 install_dir : testsdir)
2646 if static_libudev_pic
2647 test('test-libudev-static-sym', exe)
2650 ############################################################
2654 foreach tuple : fuzzers
2656 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2657 dependencies = tuple[2]
2658 defs = tuple.length() >= 4 ? tuple[3] : []
2659 incs = tuple.length() >= 5 ? tuple[4] : includes
2662 dependencies += fuzzing_engine
2664 sources += 'src/fuzz/fuzz-main.c'
2667 name = sources[0].split('/')[-1].split('.')[0]
2669 fuzzer_exes += executable(
2672 include_directories : [incs, include_directories('src/fuzz')],
2673 link_with : link_with,
2674 dependencies : dependencies,
2679 run_target('fuzzers',
2680 depends : fuzzer_exes,
2683 ############################################################
2685 make_directive_index_py = find_program('tools/make-directive-index.py')
2686 make_man_index_py = find_program('tools/make-man-index.py')
2687 xml_helper_py = find_program('tools/xml_helper.py')
2688 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2692 subdir('sysusers.d')
2693 subdir('tmpfiles.d')
2698 subdir('shell-completion/bash')
2699 subdir('shell-completion/zsh')
2700 subdir('doc/sysvinit')
2701 subdir('doc/var-log')
2703 # FIXME: figure out if the warning is true:
2704 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2705 install_subdir('factory/etc',
2706 install_dir : factorydir)
2709 install_data('xorg/50-systemd-user.sh',
2710 install_dir : xinitrcdir)
2711 install_data('modprobe.d/systemd.conf',
2712 install_dir : modprobedir)
2713 install_data('LICENSE.GPL2',
2718 'doc/DISTRO_PORTING',
2719 'doc/ENVIRONMENT.md',
2721 'doc/TRANSIENT-SETTINGS.md',
2724 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2725 install_dir : docdir)
2727 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2728 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2730 ############################################################
2732 meson_check_help = find_program('tools/meson-check-help.sh')
2734 foreach exec : public_programs
2735 name = exec.full_path().split('/')[-1]
2736 test('check-help-' + name,
2738 args : [exec.full_path()])
2741 ############################################################
2743 # Enable tests for all supported sanitizers
2744 foreach tuple : sanitizers
2745 sanitizer = tuple[0]
2748 have = run_command(check_compilation_sh,
2749 cc.cmd_array(), '-x', 'c',
2750 '-fsanitize=@0@'.format(sanitizer),
2751 '-include', link_test_c).returncode() == 0
2752 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2756 foreach p : fuzz_regression_tests
2757 b = p.split('/')[-2]
2758 c = p.split('/')[-1]
2760 name = '@0@:@1@'.format(b, sanitizer)
2763 if want_tests == 'false'
2764 message('Not compiling @0@ because tests is set to false'.format(name))
2766 exe = custom_target(
2770 command : [env, 'ln', '-fs',
2771 join_paths(build.full_path(), b),
2773 build_by_default : true)
2775 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2780 if want_tests != 'false' and slow_tests
2781 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2783 args : [exe.full_path(),
2784 join_paths(meson.source_root(),
2785 'test/fuzz-regressions',
2793 ############################################################
2796 all_files = run_command(
2798 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2801 all_files = files(all_files.stdout().split())
2806 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2809 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2813 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2816 command : [meson_git_contrib_sh])
2820 git_head = run_command(
2822 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2823 'rev-parse', 'HEAD']).stdout().strip()
2824 git_head_short = run_command(
2826 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2827 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2831 command : ['git', 'archive',
2832 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2834 '--prefix', 'systemd-@0@/'.format(git_head),
2838 ############################################################
2840 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2843 depends : [man, libsystemd, libudev],
2844 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2846 ############################################################
2849 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2851 'split /usr: @0@'.format(split_usr),
2852 'split bin-sbin: @0@'.format(split_bin),
2853 'prefix directory: @0@'.format(prefixdir),
2854 'rootprefix directory: @0@'.format(rootprefixdir),
2855 'sysconf directory: @0@'.format(sysconfdir),
2856 'include directory: @0@'.format(includedir),
2857 'lib directory: @0@'.format(libdir),
2858 'rootlib directory: @0@'.format(rootlibdir),
2859 'SysV init scripts: @0@'.format(sysvinit_path),
2860 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2861 'PAM modules directory: @0@'.format(pamlibdir),
2862 'PAM configuration directory: @0@'.format(pamconfdir),
2863 'RPM macros directory: @0@'.format(rpmmacrosdir),
2864 'modprobe.d directory: @0@'.format(modprobedir),
2865 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2866 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2867 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2868 'bash completions directory: @0@'.format(bashcompletiondir),
2869 'zsh completions directory: @0@'.format(zshcompletiondir),
2870 'extra start script: @0@'.format(get_option('rc-local')),
2871 'extra stop script: @0@'.format(get_option('halt-local')),
2872 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2873 get_option('debug-tty')),
2874 'TTY GID: @0@'.format(tty_gid),
2875 'users GID: @0@'.format(users_gid),
2876 'maximum system UID: @0@'.format(system_uid_max),
2877 'maximum system GID: @0@'.format(system_gid_max),
2878 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2879 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2880 'minimum container UID base: @0@'.format(container_uid_base_min),
2881 'maximum container UID base: @0@'.format(container_uid_base_max),
2882 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2883 'render group access mode: @0@'.format(get_option('group-render-mode')),
2884 'certificate root directory: @0@'.format(get_option('certificate-root')),
2885 'support URL: @0@'.format(support_url),
2886 'nobody user name: @0@'.format(nobody_user),
2887 'nobody group name: @0@'.format(nobody_group),
2888 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2889 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2891 'default DNSSEC mode: @0@'.format(default_dnssec),
2892 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2893 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2894 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2896 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2897 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2899 'default DNS servers: @0@'.format(alt_dns_servers),
2900 'default NTP servers: @0@'.format(alt_ntp_servers)]
2902 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2903 '@@0@'.format(time_epoch)).stdout().strip()
2905 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2908 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2909 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2910 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2912 if conf.get('ENABLE_EFI') == 1
2914 'efi arch: @0@'.format(efi_arch)]
2918 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2919 'EFI CC @0@'.format(efi_cc),
2920 'EFI lib directory: @0@'.format(efi_libdir),
2921 'EFI lds directory: @0@'.format(efi_ldsdir),
2922 'EFI include directory: @0@'.format(efi_incdir)]
2977 ['legacy pkla', install_polkit_pkla],
2979 ['gnu-efi', have_gnu_efi],
2986 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2989 ['man pages', want_man],
2990 ['html pages', want_html],
2991 ['man page indices', want_man and have_lxml],
2996 ['adm group', get_option('adm-group')],
2997 ['wheel group', get_option('wheel-group')],
3000 ['debug mmap cache'],
3001 ['valgrind', conf.get('VALGRIND') == 1],
3004 if tuple.length() >= 2
3007 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3008 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3009 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3014 missing += [tuple[0]]
3020 'enabled features: @0@'.format(', '.join(found)),
3022 'disabled features: @0@'.format(', '.join(missing)),
3024 message('\n '.join(status))
3026 if rootprefixdir != rootprefix_default
3028 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3029 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3030 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))