1 # SPDX-License-Identifier: LGPL-2.1+
3 # Copyright 2017 Zbigniew Jędrzejewski-Szmek
5 project('systemd', 'c',
14 meson_version : '>= 0.41',
17 libsystemd_version = '0.22.0'
18 libudev_version = '1.6.10'
20 # We need the same data in three different formats, ugh!
21 # Also, for hysterical reasons, we use different variable
22 # names, sometimes. Not all variables are included in every
24 conf = configuration_data()
25 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
26 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
28 substs = configuration_data()
29 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
30 substs.set('PACKAGE_VERSION', meson.project_version())
34 #####################################################################
36 # Try to install the git pre-commit hook
37 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
38 if git_hook.returncode() == 0
39 message(git_hook.stdout().strip())
42 #####################################################################
44 if get_option('split-usr') == 'auto'
45 split_usr = run_command('test', '-L', '/bin').returncode() != 0
47 split_usr = get_option('split-usr') == 'true'
49 conf.set10('HAVE_SPLIT_USR', split_usr,
50 description : '/usr/bin and /bin directories are separate')
52 if get_option('split-bin') == 'auto'
53 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
55 split_bin = get_option('split-bin') == 'true'
57 conf.set10('HAVE_SPLIT_BIN', split_bin,
58 description : 'bin and sbin directories are separate')
60 rootprefixdir = get_option('rootprefix')
61 # Unusual rootprefixdir values are used by some distros
62 # (see https://github.com/systemd/systemd/pull/7461).
63 rootprefix_default = split_usr ? '/' : '/usr'
64 if rootprefixdir == ''
65 rootprefixdir = rootprefix_default
68 sysvinit_path = get_option('sysvinit-path')
69 sysvrcnd_path = get_option('sysvrcnd-path')
70 have = sysvinit_path != '' and sysvrcnd_path != ''
71 conf.set10('HAVE_SYSV_COMPAT', have,
72 description : 'SysV init scripts and rcN.d links are supported')
73 m4_defines += have ? ['-DHAVE_SYSV_COMPAT'] : []
75 # join_paths ignore the preceding arguments if an absolute component is
76 # encountered, so this should canonicalize various paths when they are
77 # absolute or relative.
78 prefixdir = get_option('prefix')
79 if not prefixdir.startswith('/')
80 error('Prefix is not absolute: "@0@"'.format(prefixdir))
82 bindir = join_paths(prefixdir, get_option('bindir'))
83 libdir = join_paths(prefixdir, get_option('libdir'))
84 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
85 includedir = join_paths(prefixdir, get_option('includedir'))
86 datadir = join_paths(prefixdir, get_option('datadir'))
87 localstatedir = join_paths('/', get_option('localstatedir'))
89 rootbindir = join_paths(rootprefixdir, 'bin')
90 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
91 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
93 rootlibdir = get_option('rootlibdir')
95 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
98 # Dirs of external packages
99 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
100 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
101 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
102 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
103 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
104 varlogdir = join_paths(localstatedir, 'log')
105 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
106 rpmmacrosdir = get_option('rpmmacrosdir')
107 if rpmmacrosdir != 'no'
108 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
110 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
113 pkgdatadir = join_paths(datadir, 'systemd')
114 environmentdir = join_paths(prefixdir, 'lib/environment.d')
115 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
116 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
117 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
118 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
119 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
120 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
121 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
122 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
123 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
124 pkgincludedir = join_paths(includedir, 'systemd')
125 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
126 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
127 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
128 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
129 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
130 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
131 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
132 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
133 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
134 udevhomedir = udevlibexecdir
135 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
136 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
137 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
138 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
139 factorydir = join_paths(datadir, 'factory')
140 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
141 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
142 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
143 catalogstatedir = join_paths(systemdstatedir, 'catalog')
144 randomseeddir = join_paths(localstatedir, 'lib/systemd')
146 docdir = get_option('docdir')
148 docdir = join_paths(datadir, 'doc/systemd')
151 dbuspolicydir = get_option('dbuspolicydir')
152 if dbuspolicydir == ''
153 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
156 dbussessionservicedir = get_option('dbussessionservicedir')
157 if dbussessionservicedir == ''
158 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
161 dbussystemservicedir = get_option('dbussystemservicedir')
162 if dbussystemservicedir == ''
163 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
166 pamlibdir = get_option('pamlibdir')
168 pamlibdir = join_paths(rootlibdir, 'security')
171 pamconfdir = get_option('pamconfdir')
173 pamconfdir = join_paths(sysconfdir, 'pam.d')
176 memory_accounting_default = get_option('memory-accounting-default')
178 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
179 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
180 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
181 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
182 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
183 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
184 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
186 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
188 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
189 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
190 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
191 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
192 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
193 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
194 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
195 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
196 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
197 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
198 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
199 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
200 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
201 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
202 conf.set_quoted('ROOTPREFIX', rootprefixdir)
203 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
204 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
205 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
206 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
207 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
208 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
209 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
210 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
211 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
212 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
213 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
214 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
215 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
216 conf.set_quoted('LIBDIR', libdir)
217 conf.set_quoted('ROOTLIBDIR', rootlibdir)
218 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
219 conf.set_quoted('BOOTLIBDIR', bootlibdir)
220 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
221 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
222 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
223 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
224 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
225 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
226 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
227 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
229 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
230 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
232 substs.set('prefix', prefixdir)
233 substs.set('exec_prefix', prefixdir)
234 substs.set('libdir', libdir)
235 substs.set('rootlibdir', rootlibdir)
236 substs.set('includedir', includedir)
237 substs.set('pkgsysconfdir', pkgsysconfdir)
238 substs.set('bindir', bindir)
239 substs.set('rootbindir', rootbindir)
240 substs.set('rootlibexecdir', rootlibexecdir)
241 substs.set('systemunitdir', systemunitdir)
242 substs.set('userunitdir', userunitdir)
243 substs.set('systempresetdir', systempresetdir)
244 substs.set('userpresetdir', userpresetdir)
245 substs.set('udevhwdbdir', udevhwdbdir)
246 substs.set('udevrulesdir', udevrulesdir)
247 substs.set('udevlibexecdir', udevlibexecdir)
248 substs.set('catalogdir', catalogdir)
249 substs.set('tmpfilesdir', tmpfilesdir)
250 substs.set('sysusersdir', sysusersdir)
251 substs.set('sysctldir', sysctldir)
252 substs.set('binfmtdir', binfmtdir)
253 substs.set('modulesloaddir', modulesloaddir)
254 substs.set('systemgeneratordir', systemgeneratordir)
255 substs.set('usergeneratordir', usergeneratordir)
256 substs.set('systemenvgeneratordir', systemenvgeneratordir)
257 substs.set('userenvgeneratordir', userenvgeneratordir)
258 substs.set('systemshutdowndir', systemshutdowndir)
259 substs.set('systemsleepdir', systemsleepdir)
260 substs.set('VARLOGDIR', varlogdir)
261 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
262 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
263 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
264 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
265 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
266 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
267 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
268 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
270 #####################################################################
272 cc = meson.get_compiler('c')
273 pkgconfig = import('pkgconfig')
274 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
275 meson_build_sh = find_program('tools/meson-build.sh')
277 if get_option('tests') != 'false'
278 cxx = find_program('c++', required : false)
280 # Used only for tests
285 want_ossfuzz = get_option('oss-fuzz')
286 want_libfuzzer = get_option('llvm-fuzz')
287 fuzzer_build = want_ossfuzz or want_libfuzzer
288 if want_ossfuzz and want_libfuzzer
289 error('only one of oss-fuzz and llvm-fuzz can be specified')
292 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
295 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
298 foreach arg : ['-Wextra',
301 '-Wmissing-include-dirs',
302 '-Wold-style-definition',
305 '-Wdeclaration-after-statement',
307 '-Wsuggest-attribute=noreturn',
308 '-Werror=missing-prototypes',
309 '-Werror=implicit-function-declaration',
310 '-Werror=missing-declarations',
311 '-Werror=return-type',
312 '-Werror=incompatible-pointer-types',
314 '-Wstrict-prototypes',
316 '-Wmissing-noreturn',
317 '-Wimplicit-fallthrough=5',
320 '-Wstrict-aliasing=2',
327 '-fdiagnostics-show-option',
328 '-fno-strict-aliasing',
329 '-fvisibility=hidden',
331 '-fstack-protector-strong',
332 '--param=ssp-buffer-size=4',
334 if cc.has_argument(arg)
335 add_project_arguments(arg, language : 'c')
339 # the oss-fuzz fuzzers are not built with -fPIE, so don't
340 # enable it when we are linking against them
342 if cc.has_argument('-fPIE')
343 add_project_arguments('-fPIE', language : 'c')
347 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
348 # arguments, just emits a warnings. So test for the "positive" version instead.
349 foreach arg : ['unused-parameter',
350 'missing-field-initializers',
353 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
355 if cc.has_argument('-W' + arg)
356 add_project_arguments('-Wno-' + arg, language : 'c')
362 #include <inttypes.h>
363 typedef uint64_t usec_t;
364 usec_t now(clockid_t clock);
369 ''', name : '-Werror=shadow with local shadowing')
370 add_project_arguments('-Werror=shadow', language : 'c')
373 if cc.get_id() == 'clang'
374 foreach arg : ['-Wno-typedef-redefinition',
375 '-Wno-gnu-variable-sized-type-not-at-end',
377 if cc.has_argument(arg)
378 add_project_arguments(arg, language : 'c')
383 link_test_c = files('tools/meson-link-test.c')
385 # --as-needed and --no-undefined are provided by meson by default,
386 # run mesonconf to see what is enabled
387 foreach arg : ['-Wl,-z,relro',
392 have = run_command(check_compilation_sh,
393 cc.cmd_array(), '-x', 'c', arg,
394 '-include', link_test_c).returncode() == 0
395 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
396 if have and (arg != '-pie' or not fuzzer_build)
397 add_project_link_arguments(arg, language : 'c')
401 if get_option('buildtype') != 'debug'
402 foreach arg : ['-ffunction-sections',
404 if cc.has_argument(arg)
405 add_project_arguments(arg, language : 'c')
409 foreach arg : ['-Wl,--gc-sections']
410 have = run_command(check_compilation_sh,
411 cc.cmd_array(), '-x', 'c', arg,
412 '-include', link_test_c).returncode() == 0
413 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
415 add_project_link_arguments(arg, language : 'c')
420 cpp = ' '.join(cc.cmd_array()) + ' -E'
422 #####################################################################
423 # compilation result tests
425 conf.set('_GNU_SOURCE', true)
426 conf.set('__SANE_USERSPACE_TYPES__', true)
428 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
429 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
430 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
431 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
432 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
433 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
434 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
438 #include <linux/ethtool.h>
439 #include <linux/fib_rules.h>
440 #include <linux/stat.h>
441 #include <sys/stat.h>
443 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
445 foreach decl : ['char16_t',
448 'struct ethtool_link_settings',
449 'struct fib_rule_uid_range',
453 # We get -1 if the size cannot be determined
454 have = cc.sizeof(decl, prefix : decl_headers) > 0
455 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
458 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
459 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
460 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
461 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
462 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
463 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
464 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
465 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
466 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
467 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
468 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
469 # if_tunnel.h is buggy and cannot be included on its own
470 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
471 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
472 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
473 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
474 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
475 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
476 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
477 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
478 ['NDA_IFINDEX', 'linux/neighbour.h'],
479 ['IFA_FLAGS', 'linux/if_addr.h'],
480 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
481 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
482 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
484 prefix = decl.length() > 2 ? decl[2] : ''
485 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
486 conf.set10('HAVE_' + decl[0], have)
489 foreach ident : ['secure_getenv', '__secure_getenv']
490 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
494 ['memfd_create', '''#include <sys/mman.h>'''],
495 ['gettid', '''#include <sys/types.h>
496 #include <unistd.h>'''],
497 ['pivot_root', '''#include <stdlib.h>
498 #include <unistd.h>'''], # no known header declares pivot_root
499 ['name_to_handle_at', '''#include <sys/types.h>
500 #include <sys/stat.h>
501 #include <fcntl.h>'''],
502 ['setns', '''#include <sched.h>'''],
503 ['renameat2', '''#include <stdio.h>
504 #include <fcntl.h>'''],
505 ['kcmp', '''#include <linux/kcmp.h>'''],
506 ['keyctl', '''#include <sys/types.h>
507 #include <keyutils.h>'''],
508 ['copy_file_range', '''#include <sys/syscall.h>
509 #include <unistd.h>'''],
510 ['bpf', '''#include <sys/syscall.h>
511 #include <unistd.h>'''],
512 ['statx', '''#include <sys/types.h>
513 #include <sys/stat.h>
514 #include <unistd.h>'''],
515 ['explicit_bzero' , '''#include <string.h>'''],
516 ['reallocarray', '''#include <malloc.h>'''],
519 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
520 conf.set10('HAVE_' + ident[0].to_upper(), have)
523 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
524 conf.set10('USE_SYS_RANDOM_H', true)
525 conf.set10('HAVE_GETRANDOM', true)
527 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
528 conf.set10('USE_SYS_RANDOM_H', false)
529 conf.set10('HAVE_GETRANDOM', have)
532 #####################################################################
534 sed = find_program('sed')
535 awk = find_program('awk')
536 m4 = find_program('m4')
537 stat = find_program('stat')
538 git = find_program('git', required : false)
539 env = find_program('env')
540 perl = find_program('perl', required : false)
542 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
543 mkdir_p = 'mkdir -p $DESTDIR/@0@'
544 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
545 splash_bmp = files('test/splash.bmp')
547 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
548 # /usr/sbin, /sbin, and fall back to the default from middle column.
549 progs = [['quotaon', '/usr/sbin/quotaon' ],
550 ['quotacheck', '/usr/sbin/quotacheck' ],
551 ['kmod', '/usr/bin/kmod' ],
552 ['kexec', '/usr/sbin/kexec' ],
553 ['sulogin', '/usr/sbin/sulogin' ],
554 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
555 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
556 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
557 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
560 path = get_option(prog[0] + '-path')
562 message('Using @1@ for @0@'.format(prog[0], path))
564 exe = find_program(prog[0],
565 '/usr/sbin/' + prog[0],
568 path = exe.found() ? exe.path() : prog[1]
570 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
571 conf.set_quoted(name, path)
572 substs.set(name, path)
575 conf.set_quoted('TELINIT', get_option('telinit-path'))
577 if run_command('ln', '--relative', '--help').returncode() != 0
578 error('ln does not support --relative (added in coreutils 8.16)')
581 ############################################################
583 gperf = find_program('gperf')
585 gperf_test_format = '''
587 const char * in_word_set(const char *, @0@);
590 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
591 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
592 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
593 if cc.compiles(gperf_test)
594 gperf_len_type = 'size_t'
596 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
597 if cc.compiles(gperf_test)
598 gperf_len_type = 'unsigned'
600 error('unable to determine gperf len type')
603 message('gperf len type is @0@'.format(gperf_len_type))
604 conf.set('GPERF_LEN_TYPE', gperf_len_type,
605 description : 'The type of gperf "len" parameter')
607 ############################################################
609 if not cc.has_header('sys/capability.h')
610 error('POSIX caps headers not found')
612 foreach header : ['crypt.h',
615 'linux/vm_sockets.h',
617 'valgrind/memcheck.h',
618 'valgrind/valgrind.h',
621 conf.set10('HAVE_' + header.underscorify().to_upper(),
622 cc.has_header(header))
625 ############################################################
627 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
628 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
629 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
631 default_hierarchy = get_option('default-hierarchy')
632 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
633 description : 'default cgroup hierarchy as string')
634 if default_hierarchy == 'legacy'
635 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
636 elif default_hierarchy == 'hybrid'
637 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
639 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
642 time_epoch = get_option('time-epoch')
645 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
647 time_epoch = time_epoch.to_int()
648 conf.set('TIME_EPOCH', time_epoch)
650 system_uid_max = get_option('system-uid-max')
651 if system_uid_max == ''
652 system_uid_max = run_command(
654 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
655 '/etc/login.defs').stdout().strip()
656 if system_uid_max == ''
657 system_uid_max = '999'
660 system_uid_max = system_uid_max.to_int()
661 conf.set('SYSTEM_UID_MAX', system_uid_max)
662 substs.set('systemuidmax', system_uid_max)
663 message('maximum system UID is @0@'.format(system_uid_max))
665 system_gid_max = get_option('system-gid-max')
666 if system_gid_max == ''
667 system_gid_max = run_command(
669 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
670 '/etc/login.defs').stdout().strip()
671 if system_gid_max == ''
672 system_gid_max = '999'
675 system_gid_max = system_gid_max.to_int()
676 conf.set('SYSTEM_GID_MAX', system_gid_max)
677 substs.set('systemgidmax', system_gid_max)
678 message('maximum system GID is @0@'.format(system_gid_max))
680 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
681 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
682 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
683 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
684 substs.set('dynamicuidmin', dynamic_uid_min)
685 substs.set('dynamicuidmax', dynamic_uid_max)
687 container_uid_base_min = get_option('container-uid-base-min').to_int()
688 container_uid_base_max = get_option('container-uid-base-max').to_int()
689 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
690 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
691 substs.set('containeruidbasemin', container_uid_base_min)
692 substs.set('containeruidbasemax', container_uid_base_max)
694 nobody_user = get_option('nobody-user')
695 nobody_group = get_option('nobody-group')
697 getent_result = run_command('getent', 'passwd', '65534')
698 if getent_result.returncode() == 0
699 name = getent_result.stdout().split(':')[0]
700 if name != nobody_user
701 message('WARNING:\n' +
702 ' 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) +
703 ' Your build will result in an user table setup that is incompatible with the local system.')
706 id_result = run_command('id', '-u', nobody_user)
707 if id_result.returncode() == 0
708 id = id_result.stdout().to_int()
710 message('WARNING:\n' +
711 ' 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) +
712 ' Your build will result in an user table setup that is incompatible with the local system.')
716 getent_result = run_command('getent', 'group', '65534')
717 if getent_result.returncode() == 0
718 name = getent_result.stdout().split(':')[0]
719 if name != nobody_group
720 message('WARNING:\n' +
721 ' 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) +
722 ' Your build will result in an group table setup that is incompatible with the local system.')
725 id_result = run_command('id', '-g', nobody_group)
726 if id_result.returncode() == 0
727 id = id_result.stdout().to_int()
729 message('WARNING:\n' +
730 ' 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) +
731 ' Your build will result in an group table setup that is incompatible with the local system.')
734 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
735 message('WARNING:\n' +
736 ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
737 ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
740 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
741 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
742 substs.set('NOBODY_USER_NAME', nobody_user)
743 substs.set('NOBODY_GROUP_NAME', nobody_group)
745 tty_gid = get_option('tty-gid')
746 conf.set('TTY_GID', tty_gid)
747 substs.set('TTY_GID', tty_gid)
749 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
750 if get_option('users-gid') != ''
751 users_gid = get_option('users-gid').to_int()
755 substs.set('USERS_GID', users_gid)
757 if get_option('adm-group')
758 m4_defines += ['-DENABLE_ADM_GROUP']
761 if get_option('wheel-group')
762 m4_defines += ['-DENABLE_WHEEL_GROUP']
765 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
766 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
768 kill_user_processes = get_option('default-kill-user-processes')
769 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
770 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
771 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
773 dns_servers = get_option('dns-servers')
774 conf.set_quoted('DNS_SERVERS', dns_servers)
775 substs.set('DNS_SERVERS', dns_servers)
777 ntp_servers = get_option('ntp-servers')
778 conf.set_quoted('NTP_SERVERS', ntp_servers)
779 substs.set('NTP_SERVERS', ntp_servers)
781 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
783 substs.set('SUSHELL', get_option('debug-shell'))
784 substs.set('DEBUGTTY', get_option('debug-tty'))
786 debug = get_option('debug')
787 enable_debug_hashmap = false
788 enable_debug_mmap_cache = false
790 foreach name : debug.split(',')
792 enable_debug_hashmap = true
793 elif name == 'mmap-cache'
794 enable_debug_mmap_cache = true
796 message('unknown debug option "@0@", ignoring'.format(name))
800 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
801 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
803 #####################################################################
805 threads = dependency('threads')
806 librt = cc.find_library('rt')
807 libm = cc.find_library('m')
808 libdl = cc.find_library('dl')
809 libcrypt = cc.find_library('crypt')
811 libcap = dependency('libcap', required : false)
812 if not libcap.found()
813 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
814 libcap = cc.find_library('cap')
817 libmount = dependency('mount',
818 version : fuzzer_build ? '>= 0' : '>= 2.30')
820 want_seccomp = get_option('seccomp')
821 if want_seccomp != 'false' and not fuzzer_build
822 libseccomp = dependency('libseccomp',
823 version : '>= 2.3.1',
824 required : want_seccomp == 'true')
825 have = libseccomp.found()
830 conf.set10('HAVE_SECCOMP', have)
831 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
833 want_selinux = get_option('selinux')
834 if want_selinux != 'false' and not fuzzer_build
835 libselinux = dependency('libselinux',
836 version : '>= 2.1.9',
837 required : want_selinux == 'true')
838 have = libselinux.found()
843 conf.set10('HAVE_SELINUX', have)
844 m4_defines += have ? ['-DHAVE_SELINUX'] : []
846 want_apparmor = get_option('apparmor')
847 if want_apparmor != 'false' and not fuzzer_build
848 libapparmor = dependency('libapparmor',
849 required : want_apparmor == 'true')
850 have = libapparmor.found()
855 conf.set10('HAVE_APPARMOR', have)
856 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
858 smack_run_label = get_option('smack-run-label')
859 if smack_run_label != ''
860 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
861 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
864 want_polkit = get_option('polkit')
865 install_polkit = false
866 install_polkit_pkla = false
867 if want_polkit != 'false' and not fuzzer_build
868 install_polkit = true
870 libpolkit = dependency('polkit-gobject-1',
872 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
873 message('Old polkit detected, will install pkla files')
874 install_polkit_pkla = true
877 conf.set10('ENABLE_POLKIT', install_polkit)
879 want_acl = get_option('acl')
880 if want_acl != 'false' and not fuzzer_build
881 libacl = cc.find_library('acl', required : want_acl == 'true')
882 have = libacl.found()
887 conf.set10('HAVE_ACL', have)
888 m4_defines += have ? ['-DHAVE_ACL'] : []
890 want_audit = get_option('audit')
891 if want_audit != 'false' and not fuzzer_build
892 libaudit = dependency('audit', required : want_audit == 'true')
893 have = libaudit.found()
898 conf.set10('HAVE_AUDIT', have)
900 want_blkid = get_option('blkid')
901 if want_blkid != 'false' and not fuzzer_build
902 libblkid = dependency('blkid', required : want_blkid == 'true')
903 have = libblkid.found()
908 conf.set10('HAVE_BLKID', have)
910 want_kmod = get_option('kmod')
911 if want_kmod != 'false' and not fuzzer_build
912 libkmod = dependency('libkmod',
914 required : want_kmod == 'true')
915 have = libkmod.found()
920 conf.set10('HAVE_KMOD', have)
922 want_pam = get_option('pam')
923 if want_pam != 'false' and not fuzzer_build
924 libpam = cc.find_library('pam', required : want_pam == 'true')
925 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
926 have = libpam.found() and libpam_misc.found()
932 conf.set10('HAVE_PAM', have)
933 m4_defines += have ? ['-DHAVE_PAM'] : []
935 want_microhttpd = get_option('microhttpd')
936 if want_microhttpd != 'false' and not fuzzer_build
937 libmicrohttpd = dependency('libmicrohttpd',
938 version : '>= 0.9.33',
939 required : want_microhttpd == 'true')
940 have = libmicrohttpd.found()
945 conf.set10('HAVE_MICROHTTPD', have)
946 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
948 want_libcryptsetup = get_option('libcryptsetup')
949 if want_libcryptsetup != 'false' and not fuzzer_build
950 libcryptsetup = dependency('libcryptsetup',
951 version : '>= 1.6.0',
952 required : want_libcryptsetup == 'true')
953 have = libcryptsetup.found()
958 conf.set10('HAVE_LIBCRYPTSETUP', have)
960 want_libcurl = get_option('libcurl')
961 if want_libcurl != 'false' and not fuzzer_build
962 libcurl = dependency('libcurl',
963 version : '>= 7.32.0',
964 required : want_libcurl == 'true')
965 have = libcurl.found()
970 conf.set10('HAVE_LIBCURL', have)
971 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
973 want_libidn = get_option('libidn')
974 want_libidn2 = get_option('libidn2')
975 if want_libidn == 'true' and want_libidn2 == 'true'
976 error('libidn and libidn2 cannot be requested simultaneously')
979 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
980 libidn = dependency('libidn',
981 required : want_libidn == 'true')
982 have = libidn.found()
987 conf.set10('HAVE_LIBIDN', have)
988 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
989 if not have and want_libidn2 != 'false' and not fuzzer_build
990 # libidn is used for both libidn and libidn2 objects
991 libidn = dependency('libidn2',
992 required : want_libidn2 == 'true')
993 have = libidn.found()
997 conf.set10('HAVE_LIBIDN2', have)
998 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
1000 want_libiptc = get_option('libiptc')
1001 if want_libiptc != 'false' and not fuzzer_build
1002 libiptc = dependency('libiptc',
1003 required : want_libiptc == 'true')
1004 have = libiptc.found()
1009 conf.set10('HAVE_LIBIPTC', have)
1010 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
1012 want_qrencode = get_option('qrencode')
1013 if want_qrencode != 'false' and not fuzzer_build
1014 libqrencode = dependency('libqrencode',
1015 required : want_qrencode == 'true')
1016 have = libqrencode.found()
1021 conf.set10('HAVE_QRENCODE', have)
1023 want_gcrypt = get_option('gcrypt')
1024 if want_gcrypt != 'false' and not fuzzer_build
1025 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1026 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1027 have = libgcrypt.found() and libgpg_error.found()
1032 # link to neither of the libs if one is not found
1036 conf.set10('HAVE_GCRYPT', have)
1038 want_gnutls = get_option('gnutls')
1039 if want_gnutls != 'false' and not fuzzer_build
1040 libgnutls = dependency('gnutls',
1041 version : '>= 3.1.4',
1042 required : want_gnutls == 'true')
1043 have = libgnutls.found()
1048 conf.set10('HAVE_GNUTLS', have)
1050 want_elfutils = get_option('elfutils')
1051 if want_elfutils != 'false' and not fuzzer_build
1052 libdw = dependency('libdw',
1053 required : want_elfutils == 'true')
1054 have = libdw.found()
1059 conf.set10('HAVE_ELFUTILS', have)
1061 want_zlib = get_option('zlib')
1062 if want_zlib != 'false' and not fuzzer_build
1063 libz = dependency('zlib',
1064 required : want_zlib == 'true')
1070 conf.set10('HAVE_ZLIB', have)
1072 want_bzip2 = get_option('bzip2')
1073 if want_bzip2 != 'false' and not fuzzer_build
1074 libbzip2 = cc.find_library('bz2',
1075 required : want_bzip2 == 'true')
1076 have = libbzip2.found()
1081 conf.set10('HAVE_BZIP2', have)
1083 want_xz = get_option('xz')
1084 if want_xz != 'false' and not fuzzer_build
1085 libxz = dependency('liblzma',
1086 required : want_xz == 'true')
1087 have = libxz.found()
1092 conf.set10('HAVE_XZ', have)
1094 want_lz4 = get_option('lz4')
1095 if want_lz4 != 'false' and not fuzzer_build
1096 liblz4 = dependency('liblz4',
1097 required : want_lz4 == 'true')
1098 have = liblz4.found()
1103 conf.set10('HAVE_LZ4', have)
1105 want_xkbcommon = get_option('xkbcommon')
1106 if want_xkbcommon != 'false' and not fuzzer_build
1107 libxkbcommon = dependency('xkbcommon',
1108 version : '>= 0.3.0',
1109 required : want_xkbcommon == 'true')
1110 have = libxkbcommon.found()
1115 conf.set10('HAVE_XKBCOMMON', have)
1117 want_pcre2 = get_option('pcre2')
1118 if want_pcre2 != 'false'
1119 libpcre2 = dependency('libpcre2-8',
1120 required : want_pcre2 == 'true')
1121 have = libpcre2.found()
1126 conf.set10('HAVE_PCRE2', have)
1128 want_glib = get_option('glib')
1129 if want_glib != 'false' and not fuzzer_build
1130 libglib = dependency('glib-2.0',
1131 version : '>= 2.22.0',
1132 required : want_glib == 'true')
1133 libgobject = dependency('gobject-2.0',
1134 version : '>= 2.22.0',
1135 required : want_glib == 'true')
1136 libgio = dependency('gio-2.0',
1137 required : want_glib == 'true')
1138 have = libglib.found() and libgobject.found() and libgio.found()
1145 conf.set10('HAVE_GLIB', have)
1147 want_dbus = get_option('dbus')
1148 if want_dbus != 'false' and not fuzzer_build
1149 libdbus = dependency('dbus-1',
1150 version : '>= 1.3.2',
1151 required : want_dbus == 'true')
1152 have = libdbus.found()
1157 conf.set10('HAVE_DBUS', have)
1159 default_dnssec = get_option('default-dnssec')
1161 default_dnssec = 'no'
1163 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1164 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1165 default_dnssec = 'no'
1167 conf.set('DEFAULT_DNSSEC_MODE',
1168 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1169 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1171 want_importd = get_option('importd')
1172 if want_importd != 'false'
1173 have = (conf.get('HAVE_LIBCURL') == 1 and
1174 conf.get('HAVE_ZLIB') == 1 and
1175 conf.get('HAVE_BZIP2') == 1 and
1176 conf.get('HAVE_XZ') == 1 and
1177 conf.get('HAVE_GCRYPT') == 1)
1178 if want_importd == 'true' and not have
1179 error('importd support was requested, but dependencies are not available')
1184 conf.set10('ENABLE_IMPORTD', have)
1186 want_remote = get_option('remote')
1187 if want_remote != 'false'
1188 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1189 conf.get('HAVE_LIBCURL') == 1]
1190 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1191 # it's possible to build one without the other. Complain only if
1192 # support was explictly requested. The auxiliary files like sysusers
1193 # config should be installed when any of the programs are built.
1194 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1195 error('remote support was requested, but dependencies are not available')
1197 have = have_deps[0] or have_deps[1]
1201 conf.set10('ENABLE_REMOTE', have)
1203 foreach term : ['utmp',
1234 have = get_option(term)
1235 name = 'ENABLE_' + term.underscorify().to_upper()
1236 conf.set10(name, have)
1237 m4_defines += have ? ['-D' + name] : []
1240 if get_option('timedated') or get_option('timesyncd')
1241 conf.set10('ENABLE_TIMEDATECTL', true)
1242 m4_defines += ['-DENABLE_TIMEDATECTL']
1244 conf.set10('ENABLE_TIMEDATECTL', false)
1247 want_tests = get_option('tests')
1248 install_tests = get_option('install-tests')
1249 slow_tests = get_option('slow-tests')
1253 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1255 #####################################################################
1257 if get_option('efi')
1258 efi_arch = host_machine.cpu_family()
1260 if efi_arch == 'x86'
1261 EFI_MACHINE_TYPE_NAME = 'ia32'
1262 gnu_efi_arch = 'ia32'
1263 elif efi_arch == 'x86_64'
1264 EFI_MACHINE_TYPE_NAME = 'x64'
1265 gnu_efi_arch = 'x86_64'
1266 elif efi_arch == 'arm'
1267 EFI_MACHINE_TYPE_NAME = 'arm'
1268 gnu_efi_arch = 'arm'
1269 elif efi_arch == 'aarch64'
1270 EFI_MACHINE_TYPE_NAME = 'aa64'
1271 gnu_efi_arch = 'aarch64'
1273 EFI_MACHINE_TYPE_NAME = ''
1278 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1280 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1284 conf.set10('ENABLE_EFI', have)
1286 #####################################################################
1288 config_h = configure_file(
1289 output : 'config.h',
1290 configuration : conf)
1292 includes = include_directories('src/basic',
1298 'src/time-wait-sync',
1303 'src/libsystemd/sd-bus',
1304 'src/libsystemd/sd-device',
1305 'src/libsystemd/sd-hwdb',
1306 'src/libsystemd/sd-id128',
1307 'src/libsystemd/sd-netlink',
1308 'src/libsystemd/sd-network',
1309 'src/libsystemd-network',
1312 add_project_arguments('-include', 'config.h', language : 'c')
1316 subdir('src/systemd')
1318 subdir('src/libsystemd')
1319 subdir('src/libsystemd-network')
1320 subdir('src/journal')
1323 libjournal_core = static_library(
1325 libjournal_core_sources,
1327 include_directories : includes,
1330 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1331 libsystemd = shared_library(
1333 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1334 version : libsystemd_version,
1335 include_directories : includes,
1336 link_args : ['-shared',
1337 '-Wl,--version-script=' + libsystemd_sym_path],
1338 link_with : [libbasic,
1340 link_whole : [libsystemd_static,
1342 dependencies : [threads,
1346 link_depends : libsystemd_sym,
1348 install_dir : rootlibdir)
1350 ############################################################
1352 # binaries that have --help and are intended for use by humans,
1353 # usually, but not always, installed in /bin.
1354 public_programs = []
1356 subdir('src/libudev')
1357 subdir('src/shared')
1360 subdir('src/network')
1362 subdir('src/analyze')
1363 subdir('src/journal-remote')
1364 subdir('src/coredump')
1365 subdir('src/hostname')
1366 subdir('src/import')
1367 subdir('src/kernel-install')
1368 subdir('src/locale')
1369 subdir('src/machine')
1370 subdir('src/nspawn')
1371 subdir('src/resolve')
1372 subdir('src/timedate')
1373 subdir('src/timesync')
1374 subdir('src/vconsole')
1375 subdir('src/boot/efi')
1382 ############################################################
1384 # only static linking apart from libdl, to make sure that the
1385 # module is linked to all libraries that it uses.
1386 test_dlopen = executable(
1389 include_directories : includes,
1390 link_with : [libbasic],
1391 dependencies : [libdl])
1393 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1394 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1395 ['mymachines', 'ENABLE_MACHINED'],
1396 ['resolve', 'ENABLE_RESOLVE']]
1398 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1402 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1403 version_script_arg = join_paths(meson.current_source_dir(), sym)
1405 nss = shared_library(
1407 'src/nss-@0@/nss-@0@.c'.format(module),
1409 include_directories : includes,
1410 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1411 link_args : ['-Wl,-z,nodelete',
1413 '-Wl,--version-script=' + version_script_arg,
1415 link_with : [libsystemd_static,
1417 dependencies : [threads,
1421 install_dir : rootlibdir)
1423 # We cannot use shared_module because it does not support version suffix.
1424 # Unfortunately shared_library insists on creating the symlink…
1425 meson.add_install_script('sh', '-c',
1426 'rm $DESTDIR@0@/libnss_@1@.so'
1427 .format(rootlibdir, module))
1429 test('dlopen-nss_' + module,
1431 args : [nss.full_path()]) # path to dlopen must include a slash
1435 ############################################################
1437 executable('systemd',
1439 include_directories : includes,
1440 link_with : [libcore,
1442 dependencies : [threads,
1448 install_rpath : rootlibexecdir,
1450 install_dir : rootlibexecdir)
1452 meson.add_install_script(meson_make_symlink,
1453 join_paths(rootlibexecdir, 'systemd'),
1454 join_paths(rootsbindir, 'init'))
1456 exe = executable('systemd-analyze',
1457 systemd_analyze_sources,
1458 include_directories : includes,
1459 link_with : [libcore,
1461 dependencies : [threads,
1467 install_rpath : rootlibexecdir,
1469 public_programs += [exe]
1471 executable('systemd-journald',
1472 systemd_journald_sources,
1473 include_directories : includes,
1474 link_with : [libjournal_core,
1476 dependencies : [threads,
1480 install_rpath : rootlibexecdir,
1482 install_dir : rootlibexecdir)
1484 exe = executable('systemd-cat',
1485 systemd_cat_sources,
1486 include_directories : includes,
1487 link_with : [libjournal_core,
1489 dependencies : [threads],
1490 install_rpath : rootlibexecdir,
1492 public_programs += [exe]
1494 exe = executable('journalctl',
1496 include_directories : includes,
1497 link_with : [libshared],
1498 dependencies : [threads,
1503 install_rpath : rootlibexecdir,
1505 install_dir : rootbindir)
1506 public_programs += [exe]
1508 executable('systemd-getty-generator',
1509 'src/getty-generator/getty-generator.c',
1510 include_directories : includes,
1511 link_with : [libshared],
1512 install_rpath : rootlibexecdir,
1514 install_dir : systemgeneratordir)
1516 executable('systemd-debug-generator',
1517 'src/debug-generator/debug-generator.c',
1518 include_directories : includes,
1519 link_with : [libshared],
1520 install_rpath : rootlibexecdir,
1522 install_dir : systemgeneratordir)
1524 executable('systemd-fstab-generator',
1525 'src/fstab-generator/fstab-generator.c',
1526 'src/core/mount-setup.c',
1527 include_directories : includes,
1528 link_with : [libshared],
1529 install_rpath : rootlibexecdir,
1531 install_dir : systemgeneratordir)
1533 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1534 executable('30-systemd-environment-d-generator',
1535 'src/environment-d-generator/environment-d-generator.c',
1536 include_directories : includes,
1537 link_with : [libshared],
1538 install_rpath : rootlibexecdir,
1540 install_dir : userenvgeneratordir)
1542 meson.add_install_script(meson_make_symlink,
1543 join_paths(sysconfdir, 'environment'),
1544 join_paths(environmentdir, '99-environment.conf'))
1547 if conf.get('ENABLE_HIBERNATE') == 1
1548 executable('systemd-hibernate-resume-generator',
1549 'src/hibernate-resume/hibernate-resume-generator.c',
1550 include_directories : includes,
1551 link_with : [libshared],
1552 install_rpath : rootlibexecdir,
1554 install_dir : systemgeneratordir)
1556 executable('systemd-hibernate-resume',
1557 'src/hibernate-resume/hibernate-resume.c',
1558 include_directories : includes,
1559 link_with : [libshared],
1560 install_rpath : rootlibexecdir,
1562 install_dir : rootlibexecdir)
1565 if conf.get('HAVE_BLKID') == 1
1566 executable('systemd-gpt-auto-generator',
1567 'src/gpt-auto-generator/gpt-auto-generator.c',
1568 'src/basic/blkid-util.h',
1569 include_directories : includes,
1570 link_with : [libshared],
1571 dependencies : libblkid,
1572 install_rpath : rootlibexecdir,
1574 install_dir : systemgeneratordir)
1576 exe = executable('systemd-dissect',
1577 'src/dissect/dissect.c',
1578 include_directories : includes,
1579 link_with : [libshared],
1580 install_rpath : rootlibexecdir,
1582 install_dir : rootlibexecdir)
1583 public_programs += [exe]
1586 if conf.get('ENABLE_RESOLVE') == 1
1587 executable('systemd-resolved',
1588 systemd_resolved_sources,
1589 include_directories : includes,
1590 link_with : [libshared,
1592 libsystemd_resolve_core],
1593 dependencies : [threads,
1597 install_rpath : rootlibexecdir,
1599 install_dir : rootlibexecdir)
1601 exe = executable('resolvectl',
1603 include_directories : includes,
1604 link_with : [libshared,
1606 libsystemd_resolve_core],
1607 dependencies : [threads,
1611 install_rpath : rootlibexecdir,
1613 public_programs += [exe]
1615 meson.add_install_script(meson_make_symlink,
1616 join_paths(bindir, 'resolvectl'),
1617 join_paths(rootsbindir, 'resolvconf'))
1619 meson.add_install_script(meson_make_symlink,
1620 join_paths(bindir, 'resolvectl'),
1621 join_paths(bindir, 'systemd-resolve'))
1624 if conf.get('ENABLE_LOGIND') == 1
1625 executable('systemd-logind',
1626 systemd_logind_sources,
1627 include_directories : includes,
1628 link_with : [liblogind_core,
1630 dependencies : [threads,
1632 install_rpath : rootlibexecdir,
1634 install_dir : rootlibexecdir)
1636 exe = executable('loginctl',
1638 include_directories : includes,
1639 link_with : [libshared],
1640 dependencies : [threads,
1643 install_rpath : rootlibexecdir,
1645 install_dir : rootbindir)
1646 public_programs += [exe]
1648 exe = executable('systemd-inhibit',
1649 'src/login/inhibit.c',
1650 include_directories : includes,
1651 link_with : [libshared],
1652 install_rpath : rootlibexecdir,
1654 install_dir : rootbindir)
1655 public_programs += [exe]
1657 if conf.get('HAVE_PAM') == 1
1658 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1659 pam_systemd = shared_library(
1663 include_directories : includes,
1664 link_args : ['-shared',
1665 '-Wl,--version-script=' + version_script_arg],
1666 link_with : [libsystemd_static,
1668 dependencies : [threads,
1671 link_depends : pam_systemd_sym,
1673 install_dir : pamlibdir)
1675 test('dlopen-pam_systemd',
1677 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1681 executable('systemd-user-runtime-dir',
1682 user_runtime_dir_sources,
1683 include_directories : includes,
1684 link_with : [libshared, liblogind_core],
1685 install_rpath : rootlibexecdir,
1687 install_dir : rootlibexecdir)
1689 if conf.get('HAVE_PAM') == 1
1690 executable('systemd-user-sessions',
1691 'src/user-sessions/user-sessions.c',
1692 include_directories : includes,
1693 link_with : [libshared],
1694 install_rpath : rootlibexecdir,
1696 install_dir : rootlibexecdir)
1699 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1700 exe = executable('bootctl',
1701 'src/boot/bootctl.c',
1702 include_directories : includes,
1703 link_with : [libshared],
1704 dependencies : [libblkid],
1705 install_rpath : rootlibexecdir,
1707 public_programs += [exe]
1710 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 dependencies : [threads],
1714 install_rpath : rootlibexecdir,
1716 public_programs += [exe]
1718 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1719 include_directories : includes,
1720 link_with : [libshared],
1721 dependencies : [threads,
1726 install_rpath : rootlibexecdir,
1728 install_dir : rootbindir)
1729 public_programs += [exe]
1731 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1732 meson.add_install_script(meson_make_symlink,
1733 join_paths(rootbindir, 'systemctl'),
1734 join_paths(rootsbindir, alias))
1737 if conf.get('ENABLE_BACKLIGHT') == 1
1738 executable('systemd-backlight',
1739 'src/backlight/backlight.c',
1740 include_directories : includes,
1741 link_with : [libshared],
1742 install_rpath : rootlibexecdir,
1744 install_dir : rootlibexecdir)
1747 if conf.get('ENABLE_RFKILL') == 1
1748 executable('systemd-rfkill',
1749 'src/rfkill/rfkill.c',
1750 include_directories : includes,
1751 link_with : [libshared],
1752 install_rpath : rootlibexecdir,
1754 install_dir : rootlibexecdir)
1757 executable('systemd-system-update-generator',
1758 'src/system-update-generator/system-update-generator.c',
1759 include_directories : includes,
1760 link_with : [libshared],
1761 install_rpath : rootlibexecdir,
1763 install_dir : systemgeneratordir)
1765 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1766 executable('systemd-cryptsetup',
1767 'src/cryptsetup/cryptsetup.c',
1768 include_directories : includes,
1769 link_with : [libshared],
1770 dependencies : [libcryptsetup],
1771 install_rpath : rootlibexecdir,
1773 install_dir : rootlibexecdir)
1775 executable('systemd-cryptsetup-generator',
1776 'src/cryptsetup/cryptsetup-generator.c',
1777 include_directories : includes,
1778 link_with : [libshared],
1779 dependencies : [libcryptsetup],
1780 install_rpath : rootlibexecdir,
1782 install_dir : systemgeneratordir)
1784 executable('systemd-veritysetup',
1785 'src/veritysetup/veritysetup.c',
1786 include_directories : includes,
1787 link_with : [libshared],
1788 dependencies : [libcryptsetup],
1789 install_rpath : rootlibexecdir,
1791 install_dir : rootlibexecdir)
1793 executable('systemd-veritysetup-generator',
1794 'src/veritysetup/veritysetup-generator.c',
1795 include_directories : includes,
1796 link_with : [libshared],
1797 dependencies : [libcryptsetup],
1798 install_rpath : rootlibexecdir,
1800 install_dir : systemgeneratordir)
1803 if conf.get('HAVE_SYSV_COMPAT') == 1
1804 executable('systemd-sysv-generator',
1805 'src/sysv-generator/sysv-generator.c',
1806 include_directories : includes,
1807 link_with : [libshared],
1808 install_rpath : rootlibexecdir,
1810 install_dir : systemgeneratordir)
1812 executable('systemd-rc-local-generator',
1813 'src/rc-local-generator/rc-local-generator.c',
1814 include_directories : includes,
1815 link_with : [libshared],
1816 install_rpath : rootlibexecdir,
1818 install_dir : systemgeneratordir)
1821 if conf.get('ENABLE_HOSTNAMED') == 1
1822 executable('systemd-hostnamed',
1823 'src/hostname/hostnamed.c',
1824 include_directories : includes,
1825 link_with : [libshared],
1826 install_rpath : rootlibexecdir,
1828 install_dir : rootlibexecdir)
1830 exe = executable('hostnamectl',
1831 'src/hostname/hostnamectl.c',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 install_rpath : rootlibexecdir,
1836 public_programs += [exe]
1839 if conf.get('ENABLE_LOCALED') == 1
1840 if conf.get('HAVE_XKBCOMMON') == 1
1841 # logind will load libxkbcommon.so dynamically on its own
1847 executable('systemd-localed',
1848 systemd_localed_sources,
1849 include_directories : includes,
1850 link_with : [libshared],
1851 dependencies : deps,
1852 install_rpath : rootlibexecdir,
1854 install_dir : rootlibexecdir)
1856 exe = executable('localectl',
1858 include_directories : includes,
1859 link_with : [libshared],
1860 install_rpath : rootlibexecdir,
1862 public_programs += [exe]
1865 if conf.get('ENABLE_TIMEDATED') == 1
1866 executable('systemd-timedated',
1867 'src/timedate/timedated.c',
1868 include_directories : includes,
1869 link_with : [libshared],
1870 install_rpath : rootlibexecdir,
1872 install_dir : rootlibexecdir)
1875 if conf.get('ENABLE_TIMEDATECTL') == 1
1876 exe = executable('timedatectl',
1877 'src/timedate/timedatectl.c',
1878 include_directories : includes,
1879 install_rpath : rootlibexecdir,
1880 link_with : [libshared],
1881 dependencies : [libm],
1883 public_programs += [exe]
1886 if conf.get('ENABLE_TIMESYNCD') == 1
1887 executable('systemd-timesyncd',
1888 systemd_timesyncd_sources,
1889 include_directories : includes,
1890 link_with : [libshared],
1891 dependencies : [threads,
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootlibexecdir)
1897 executable('systemd-time-wait-sync',
1898 'src/time-wait-sync/time-wait-sync.c',
1899 include_directories : includes,
1900 link_with : [libshared],
1901 install_rpath : rootlibexecdir,
1903 install_dir : rootlibexecdir)
1906 if conf.get('ENABLE_MACHINED') == 1
1907 executable('systemd-machined',
1908 systemd_machined_sources,
1909 include_directories : includes,
1910 link_with : [libmachine_core,
1912 install_rpath : rootlibexecdir,
1914 install_dir : rootlibexecdir)
1916 exe = executable('machinectl',
1917 'src/machine/machinectl.c',
1918 include_directories : includes,
1919 link_with : [libshared],
1920 dependencies : [threads,
1923 install_rpath : rootlibexecdir,
1925 install_dir : rootbindir)
1926 public_programs += [exe]
1929 if conf.get('ENABLE_IMPORTD') == 1
1930 executable('systemd-importd',
1931 systemd_importd_sources,
1932 include_directories : includes,
1933 link_with : [libshared],
1934 dependencies : [threads],
1935 install_rpath : rootlibexecdir,
1937 install_dir : rootlibexecdir)
1939 systemd_pull = executable('systemd-pull',
1940 systemd_pull_sources,
1941 include_directories : includes,
1942 link_with : [libshared],
1943 dependencies : [libcurl,
1948 install_rpath : rootlibexecdir,
1950 install_dir : rootlibexecdir)
1952 systemd_import = executable('systemd-import',
1953 systemd_import_sources,
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [libcurl,
1960 install_rpath : rootlibexecdir,
1962 install_dir : rootlibexecdir)
1964 systemd_export = executable('systemd-export',
1965 systemd_export_sources,
1966 include_directories : includes,
1967 link_with : [libshared],
1968 dependencies : [libcurl,
1972 install_rpath : rootlibexecdir,
1974 install_dir : rootlibexecdir)
1975 public_programs += [systemd_pull, systemd_import, systemd_export]
1978 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1979 exe = executable('systemd-journal-upload',
1980 systemd_journal_upload_sources,
1981 include_directories : includes,
1982 link_with : [libshared],
1983 dependencies : [threads,
1988 install_rpath : rootlibexecdir,
1990 install_dir : rootlibexecdir)
1991 public_programs += [exe]
1994 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1995 s_j_remote = executable('systemd-journal-remote',
1996 systemd_journal_remote_sources,
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : [threads,
2004 install_rpath : rootlibexecdir,
2006 install_dir : rootlibexecdir)
2008 s_j_gatewayd = executable('systemd-journal-gatewayd',
2009 systemd_journal_gatewayd_sources,
2010 include_directories : includes,
2011 link_with : [libshared],
2012 dependencies : [threads,
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2020 public_programs += [s_j_remote, s_j_gatewayd]
2023 if conf.get('ENABLE_COREDUMP') == 1
2024 executable('systemd-coredump',
2025 systemd_coredump_sources,
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [threads,
2033 install_rpath : rootlibexecdir,
2035 install_dir : rootlibexecdir)
2037 exe = executable('coredumpctl',
2038 coredumpctl_sources,
2039 include_directories : includes,
2040 link_with : [libshared],
2041 dependencies : [threads,
2044 install_rpath : rootlibexecdir,
2046 public_programs += [exe]
2049 if conf.get('ENABLE_BINFMT') == 1
2050 exe = executable('systemd-binfmt',
2051 'src/binfmt/binfmt.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 install_rpath : rootlibexecdir,
2056 install_dir : rootlibexecdir)
2057 public_programs += [exe]
2059 meson.add_install_script('sh', '-c',
2060 mkdir_p.format(binfmtdir))
2061 meson.add_install_script('sh', '-c',
2062 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2065 if conf.get('ENABLE_VCONSOLE') == 1
2066 executable('systemd-vconsole-setup',
2067 'src/vconsole/vconsole-setup.c',
2068 include_directories : includes,
2069 link_with : [libshared],
2070 install_rpath : rootlibexecdir,
2072 install_dir : rootlibexecdir)
2075 if conf.get('ENABLE_RANDOMSEED') == 1
2076 executable('systemd-random-seed',
2077 'src/random-seed/random-seed.c',
2078 include_directories : includes,
2079 link_with : [libshared],
2080 install_rpath : rootlibexecdir,
2082 install_dir : rootlibexecdir)
2085 if conf.get('ENABLE_FIRSTBOOT') == 1
2086 executable('systemd-firstboot',
2087 'src/firstboot/firstboot.c',
2088 include_directories : includes,
2089 link_with : [libshared],
2090 dependencies : [libcrypt],
2091 install_rpath : rootlibexecdir,
2093 install_dir : rootbindir)
2096 executable('systemd-remount-fs',
2097 'src/remount-fs/remount-fs.c',
2098 'src/core/mount-setup.c',
2099 'src/core/mount-setup.h',
2100 include_directories : includes,
2101 link_with : [libshared],
2102 install_rpath : rootlibexecdir,
2104 install_dir : rootlibexecdir)
2106 executable('systemd-machine-id-setup',
2107 'src/machine-id-setup/machine-id-setup-main.c',
2108 'src/core/machine-id-setup.c',
2109 'src/core/machine-id-setup.h',
2110 include_directories : includes,
2111 link_with : [libshared],
2112 install_rpath : rootlibexecdir,
2114 install_dir : rootbindir)
2116 executable('systemd-fsck',
2118 include_directories : includes,
2119 link_with : [libshared],
2120 install_rpath : rootlibexecdir,
2122 install_dir : rootlibexecdir)
2124 executable('systemd-growfs',
2125 'src/partition/growfs.c',
2126 include_directories : includes,
2127 link_with : [libshared],
2128 dependencies : [libcryptsetup],
2129 install_rpath : rootlibexecdir,
2131 install_dir : rootlibexecdir)
2133 executable('systemd-makefs',
2134 'src/partition/makefs.c',
2135 include_directories : includes,
2136 link_with : [libshared],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2141 executable('systemd-sleep',
2142 'src/sleep/sleep.c',
2143 include_directories : includes,
2144 link_with : [libshared],
2145 install_rpath : rootlibexecdir,
2147 install_dir : rootlibexecdir)
2149 exe = executable('systemd-sysctl',
2150 'src/sysctl/sysctl.c',
2151 include_directories : includes,
2152 link_with : [libshared],
2153 install_rpath : rootlibexecdir,
2155 install_dir : rootlibexecdir)
2156 public_programs += [exe]
2158 executable('systemd-ac-power',
2159 'src/ac-power/ac-power.c',
2160 include_directories : includes,
2161 link_with : [libshared],
2162 install_rpath : rootlibexecdir,
2164 install_dir : rootlibexecdir)
2166 exe = executable('systemd-detect-virt',
2167 'src/detect-virt/detect-virt.c',
2168 include_directories : includes,
2169 link_with : [libshared],
2170 install_rpath : rootlibexecdir,
2172 public_programs += [exe]
2174 exe = executable('systemd-delta',
2175 'src/delta/delta.c',
2176 include_directories : includes,
2177 link_with : [libshared],
2178 install_rpath : rootlibexecdir,
2180 public_programs += [exe]
2182 exe = executable('systemd-escape',
2183 'src/escape/escape.c',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootbindir)
2189 public_programs += [exe]
2191 exe = executable('systemd-notify',
2192 'src/notify/notify.c',
2193 include_directories : includes,
2194 link_with : [libshared],
2195 install_rpath : rootlibexecdir,
2197 install_dir : rootbindir)
2198 public_programs += [exe]
2200 executable('systemd-volatile-root',
2201 'src/volatile-root/volatile-root.c',
2202 include_directories : includes,
2203 link_with : [libshared],
2204 install_rpath : rootlibexecdir,
2206 install_dir : rootlibexecdir)
2208 executable('systemd-cgroups-agent',
2209 'src/cgroups-agent/cgroups-agent.c',
2210 include_directories : includes,
2211 link_with : [libshared],
2212 install_rpath : rootlibexecdir,
2214 install_dir : rootlibexecdir)
2216 exe = executable('systemd-path',
2218 include_directories : includes,
2219 link_with : [libshared],
2220 install_rpath : rootlibexecdir,
2222 public_programs += [exe]
2224 exe = executable('systemd-ask-password',
2225 'src/ask-password/ask-password.c',
2226 include_directories : includes,
2227 link_with : [libshared],
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootbindir)
2231 public_programs += [exe]
2233 executable('systemd-reply-password',
2234 'src/reply-password/reply-password.c',
2235 include_directories : includes,
2236 link_with : [libshared],
2237 install_rpath : rootlibexecdir,
2239 install_dir : rootlibexecdir)
2241 exe = executable('systemd-tty-ask-password-agent',
2242 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2243 include_directories : includes,
2244 link_with : [libshared],
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootbindir)
2248 public_programs += [exe]
2250 exe = executable('systemd-cgls',
2252 include_directories : includes,
2253 link_with : [libshared],
2254 install_rpath : rootlibexecdir,
2256 public_programs += [exe]
2258 exe = executable('systemd-cgtop',
2259 'src/cgtop/cgtop.c',
2260 include_directories : includes,
2261 link_with : [libshared],
2262 install_rpath : rootlibexecdir,
2264 public_programs += [exe]
2266 executable('systemd-initctl',
2267 'src/initctl/initctl.c',
2268 include_directories : includes,
2269 link_with : [libshared],
2270 install_rpath : rootlibexecdir,
2272 install_dir : rootlibexecdir)
2274 exe = executable('systemd-mount',
2275 'src/mount/mount-tool.c',
2276 include_directories : includes,
2277 link_with : [libshared],
2278 install_rpath : rootlibexecdir,
2280 public_programs += [exe]
2282 meson.add_install_script(meson_make_symlink,
2283 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2285 exe = executable('systemd-run',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2291 public_programs += [exe]
2293 exe = executable('systemd-stdio-bridge',
2294 'src/stdio-bridge/stdio-bridge.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 install_rpath : rootlibexecdir,
2299 public_programs += [exe]
2301 exe = executable('busctl',
2302 'src/busctl/busctl.c',
2303 'src/busctl/busctl-introspect.c',
2304 'src/busctl/busctl-introspect.h',
2305 include_directories : includes,
2306 link_with : [libshared],
2307 install_rpath : rootlibexecdir,
2309 public_programs += [exe]
2311 if conf.get('ENABLE_SYSUSERS') == 1
2312 exe = executable('systemd-sysusers',
2313 'src/sysusers/sysusers.c',
2314 include_directories : includes,
2315 link_with : [libshared],
2316 install_rpath : rootlibexecdir,
2318 install_dir : rootbindir)
2319 public_programs += [exe]
2322 if conf.get('ENABLE_TMPFILES') == 1
2323 exe = executable('systemd-tmpfiles',
2324 'src/tmpfiles/tmpfiles.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 dependencies : [libacl],
2328 install_rpath : rootlibexecdir,
2330 install_dir : rootbindir)
2331 public_programs += [exe]
2333 test('test-systemd-tmpfiles',
2334 test_systemd_tmpfiles_py,
2335 args : exe.full_path())
2336 # https://github.com/mesonbuild/meson/issues/2681
2339 if conf.get('ENABLE_HWDB') == 1
2340 exe = executable('systemd-hwdb',
2342 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2343 include_directories : includes,
2344 link_with : [libudev_static],
2345 install_rpath : udev_rpath,
2347 install_dir : rootbindir)
2348 public_programs += [exe]
2351 if conf.get('ENABLE_QUOTACHECK') == 1
2352 executable('systemd-quotacheck',
2353 'src/quotacheck/quotacheck.c',
2354 include_directories : includes,
2355 link_with : [libshared],
2356 install_rpath : rootlibexecdir,
2358 install_dir : rootlibexecdir)
2361 exe = executable('systemd-socket-proxyd',
2362 'src/socket-proxy/socket-proxyd.c',
2363 include_directories : includes,
2364 link_with : [libshared],
2365 dependencies : [threads],
2366 install_rpath : rootlibexecdir,
2368 install_dir : rootlibexecdir)
2369 public_programs += [exe]
2371 exe = executable('systemd-udevd',
2372 systemd_udevd_sources,
2373 include_directories : includes,
2374 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2375 link_with : [libudev_core,
2378 dependencies : [threads,
2383 install_rpath : udev_rpath,
2385 install_dir : rootlibexecdir)
2386 public_programs += [exe]
2388 exe = executable('udevadm',
2390 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2391 include_directories : includes,
2392 link_with : [libudev_core,
2395 dependencies : [threads,
2400 install_rpath : udev_rpath,
2402 install_dir : rootbindir)
2403 public_programs += [exe]
2405 executable('systemd-shutdown',
2406 systemd_shutdown_sources,
2407 include_directories : includes,
2408 link_with : [libshared],
2409 dependencies : [libmount],
2410 install_rpath : rootlibexecdir,
2412 install_dir : rootlibexecdir)
2414 executable('systemd-update-done',
2415 'src/update-done/update-done.c',
2416 include_directories : includes,
2417 link_with : [libshared],
2418 install_rpath : rootlibexecdir,
2420 install_dir : rootlibexecdir)
2422 executable('systemd-update-utmp',
2423 'src/update-utmp/update-utmp.c',
2424 include_directories : includes,
2425 link_with : [libshared],
2426 dependencies : [libaudit],
2427 install_rpath : rootlibexecdir,
2429 install_dir : rootlibexecdir)
2431 if conf.get('HAVE_KMOD') == 1
2432 executable('systemd-modules-load',
2433 'src/modules-load/modules-load.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 dependencies : [libkmod],
2437 install_rpath : rootlibexecdir,
2439 install_dir : rootlibexecdir)
2441 meson.add_install_script('sh', '-c',
2442 mkdir_p.format(modulesloaddir))
2443 meson.add_install_script('sh', '-c',
2444 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2447 exe = executable('systemd-nspawn',
2448 systemd_nspawn_sources,
2449 'src/core/mount-setup.c', # FIXME: use a variable?
2450 'src/core/mount-setup.h',
2451 'src/core/loopback-setup.c',
2452 'src/core/loopback-setup.h',
2453 include_directories : [includes, include_directories('src/nspawn')],
2454 link_with : [libshared],
2455 dependencies : [libacl,
2459 install_rpath : rootlibexecdir,
2461 public_programs += [exe]
2463 if conf.get('ENABLE_NETWORKD') == 1
2464 executable('systemd-networkd',
2465 systemd_networkd_sources,
2466 include_directories : includes,
2467 link_with : [libnetworkd_core,
2471 dependencies : [threads],
2472 install_rpath : rootlibexecdir,
2474 install_dir : rootlibexecdir)
2476 executable('systemd-networkd-wait-online',
2477 systemd_networkd_wait_online_sources,
2478 include_directories : includes,
2479 link_with : [libnetworkd_core,
2481 install_rpath : rootlibexecdir,
2483 install_dir : rootlibexecdir)
2485 exe = executable('networkctl',
2487 include_directories : includes,
2488 link_with : [libsystemd_network,
2490 install_rpath : rootlibexecdir,
2492 install_dir : rootbindir)
2493 public_programs += [exe]
2496 executable('systemd-sulogin-shell',
2497 ['src/sulogin-shell/sulogin-shell.c'],
2498 include_directories : includes,
2499 link_with : [libshared],
2500 install_rpath : rootlibexecdir,
2502 install_dir : rootlibexecdir)
2504 ############################################################
2506 foreach tuple : tests
2508 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2509 dependencies = tuple[2]
2510 condition = tuple.length() >= 4 ? tuple[3] : ''
2511 type = tuple.length() >= 5 ? tuple[4] : ''
2512 defs = tuple.length() >= 6 ? tuple[5] : []
2513 incs = tuple.length() >= 7 ? tuple[6] : includes
2516 name = sources[0].split('/')[-1].split('.')[0]
2517 if type.startswith('timeout=')
2518 timeout = type.split('=')[1].to_int()
2521 if want_tests == 'false'
2522 message('Not compiling @0@ because tests is set to false'.format(name))
2523 elif condition == '' or conf.get(condition) == 1
2527 include_directories : incs,
2528 link_with : link_with,
2529 dependencies : dependencies,
2531 install_rpath : rootlibexecdir,
2532 install : install_tests,
2533 install_dir : join_paths(testsdir, type))
2536 message('@0@ is a manual test'.format(name))
2537 elif type == 'unsafe' and want_tests != 'unsafe'
2538 message('@0@ is an unsafe test'.format(name))
2545 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2549 test_libsystemd_sym = executable(
2550 'test-libsystemd-sym',
2551 test_libsystemd_sym_c,
2552 include_directories : includes,
2553 link_with : [libsystemd],
2554 install : install_tests,
2555 install_dir : testsdir)
2556 test('test-libsystemd-sym',
2557 test_libsystemd_sym)
2559 test_libudev_sym = executable(
2562 include_directories : includes,
2563 c_args : ['-Wno-deprecated-declarations'],
2564 link_with : [libudev],
2565 install : install_tests,
2566 install_dir : testsdir)
2567 test('test-libudev-sym',
2570 ############################################################
2574 foreach tuple : fuzzers
2576 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2577 dependencies = tuple[2]
2578 defs = tuple.length() >= 4 ? tuple[3] : []
2579 incs = tuple.length() >= 5 ? tuple[4] : includes
2582 dependencies += fuzzing_engine
2584 sources += 'src/fuzz/fuzz-main.c'
2587 name = sources[0].split('/')[-1].split('.')[0]
2589 fuzzer_exes += executable(
2592 include_directories : [incs, include_directories('src/fuzz')],
2593 link_with : link_with,
2594 dependencies : dependencies,
2599 run_target('fuzzers',
2600 depends : fuzzer_exes,
2603 ############################################################
2605 make_directive_index_py = find_program('tools/make-directive-index.py')
2606 make_man_index_py = find_program('tools/make-man-index.py')
2607 xml_helper_py = find_program('tools/xml_helper.py')
2608 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2612 subdir('sysusers.d')
2613 subdir('tmpfiles.d')
2618 subdir('shell-completion/bash')
2619 subdir('shell-completion/zsh')
2620 subdir('doc/sysvinit')
2621 subdir('doc/var-log')
2623 # FIXME: figure out if the warning is true:
2624 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2625 install_subdir('factory/etc',
2626 install_dir : factorydir)
2629 install_data('xorg/50-systemd-user.sh',
2630 install_dir : xinitrcdir)
2631 install_data('modprobe.d/systemd.conf',
2632 install_dir : modprobedir)
2633 install_data('LICENSE.GPL2',
2638 'doc/DISTRO_PORTING',
2639 'doc/ENVIRONMENT.md',
2641 'doc/TRANSIENT-SETTINGS.md',
2644 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2645 install_dir : docdir)
2647 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2648 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2650 ############################################################
2652 meson_check_help = find_program('tools/meson-check-help.sh')
2654 foreach exec : public_programs
2655 name = exec.full_path().split('/')[-1]
2656 test('check-help-' + name,
2658 args : [exec.full_path()])
2661 ############################################################
2663 # Enable tests for all supported sanitizers
2664 foreach tuple : sanitizers
2665 sanitizer = tuple[0]
2668 have = run_command(check_compilation_sh,
2669 cc.cmd_array(), '-x', 'c',
2670 '-fsanitize=@0@'.format(sanitizer),
2671 '-include', link_test_c).returncode() == 0
2672 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2676 foreach p : fuzz_regression_tests
2677 b = p.split('/')[-2]
2678 c = p.split('/')[-1]
2680 name = '@0@:@1@'.format(b, sanitizer)
2683 if want_tests == 'false'
2684 message('Not compiling @0@ because tests is set to false'.format(name))
2686 exe = custom_target(
2690 command : [env, 'ln', '-fs',
2691 join_paths(build.full_path(), b),
2693 build_by_default : true)
2695 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2700 if want_tests != 'false' and slow_tests
2701 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2703 args : [exe.full_path(),
2704 join_paths(meson.source_root(),
2705 'test/fuzz-regressions',
2713 ############################################################
2716 all_files = run_command(
2718 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2721 all_files = files(all_files.stdout().split())
2726 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2730 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2734 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2737 command : [meson_git_contrib_sh])
2741 git_head = run_command(
2743 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2744 'rev-parse', 'HEAD']).stdout().strip()
2745 git_head_short = run_command(
2747 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2748 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2752 command : ['git', 'archive',
2753 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2755 '--prefix', 'systemd-@0@/'.format(git_head),
2759 ############################################################
2761 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2764 depends : [man, libsystemd, libudev],
2765 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2767 ############################################################
2770 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2772 'split /usr: @0@'.format(split_usr),
2773 'split bin-sbin: @0@'.format(split_bin),
2774 'prefix directory: @0@'.format(prefixdir),
2775 'rootprefix directory: @0@'.format(rootprefixdir),
2776 'sysconf directory: @0@'.format(sysconfdir),
2777 'include directory: @0@'.format(includedir),
2778 'lib directory: @0@'.format(libdir),
2779 'rootlib directory: @0@'.format(rootlibdir),
2780 'SysV init scripts: @0@'.format(sysvinit_path),
2781 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2782 'PAM modules directory: @0@'.format(pamlibdir),
2783 'PAM configuration directory: @0@'.format(pamconfdir),
2784 'RPM macros directory: @0@'.format(rpmmacrosdir),
2785 'modprobe.d directory: @0@'.format(modprobedir),
2786 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2787 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2788 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2789 'bash completions directory: @0@'.format(bashcompletiondir),
2790 'zsh completions directory: @0@'.format(zshcompletiondir),
2791 'extra start script: @0@'.format(get_option('rc-local')),
2792 'extra stop script: @0@'.format(get_option('halt-local')),
2793 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2794 get_option('debug-tty')),
2795 'TTY GID: @0@'.format(tty_gid),
2796 'users GID: @0@'.format(users_gid),
2797 'maximum system UID: @0@'.format(system_uid_max),
2798 'maximum system GID: @0@'.format(system_gid_max),
2799 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2800 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2801 'minimum container UID base: @0@'.format(container_uid_base_min),
2802 'maximum container UID base: @0@'.format(container_uid_base_max),
2803 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2804 'render group access mode: @0@'.format(get_option('group-render-mode')),
2805 'certificate root directory: @0@'.format(get_option('certificate-root')),
2806 'support URL: @0@'.format(support_url),
2807 'nobody user name: @0@'.format(nobody_user),
2808 'nobody group name: @0@'.format(nobody_group),
2809 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2810 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2812 'default DNSSEC mode: @0@'.format(default_dnssec),
2813 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2814 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2816 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2817 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2819 'default DNS servers: @0@'.format(alt_dns_servers),
2820 'default NTP servers: @0@'.format(alt_ntp_servers)]
2822 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2823 '@@0@'.format(time_epoch)).stdout().strip()
2825 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2828 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2829 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2830 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2832 if conf.get('ENABLE_EFI') == 1
2834 'efi arch: @0@'.format(efi_arch)]
2838 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2839 'EFI CC @0@'.format(efi_cc),
2840 'EFI lib directory: @0@'.format(efi_libdir),
2841 'EFI lds directory: @0@'.format(efi_ldsdir),
2842 'EFI include directory: @0@'.format(efi_incdir)]
2895 ['legacy pkla', install_polkit_pkla],
2897 ['gnu-efi', have_gnu_efi],
2904 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2907 ['man pages', want_man],
2908 ['html pages', want_html],
2909 ['man page indices', want_man and have_lxml],
2914 ['adm group', get_option('adm-group')],
2915 ['wheel group', get_option('wheel-group')],
2918 ['debug mmap cache'],
2921 if tuple.length() >= 2
2924 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2925 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2926 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2931 missing += [tuple[0]]
2937 'enabled features: @0@'.format(', '.join(found)),
2939 'disabled features: @0@'.format(', '.join(missing)),
2941 message('\n '.join(status))
2943 if rootprefixdir != rootprefix_default
2944 message('WARNING:\n' +
2945 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2946 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2947 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))