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 <linux/stat.h>
425 #include <sys/stat.h>
427 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
429 foreach decl : ['char16_t',
432 'struct ethtool_link_settings',
433 'struct fib_rule_uid_range',
437 # We get -1 if the size cannot be determined
438 have = cc.sizeof(decl, prefix : decl_headers) > 0
439 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
442 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
443 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
444 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
445 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
446 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
447 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
448 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
449 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
450 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
451 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
452 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
453 # if_tunnel.h is buggy and cannot be included on its own
454 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
455 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
456 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
457 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
458 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
459 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
460 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
461 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
462 ['NDA_IFINDEX', 'linux/neighbour.h'],
463 ['IFA_FLAGS', 'linux/if_addr.h'],
464 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
465 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
466 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
468 prefix = decl.length() > 2 ? decl[2] : ''
469 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
470 conf.set10('HAVE_' + decl[0], have)
473 foreach ident : ['secure_getenv', '__secure_getenv']
474 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
478 ['memfd_create', '''#include <sys/mman.h>'''],
479 ['gettid', '''#include <sys/types.h>
480 #include <unistd.h>'''],
481 ['pivot_root', '''#include <stdlib.h>
482 #include <unistd.h>'''], # no known header declares pivot_root
483 ['name_to_handle_at', '''#include <sys/types.h>
484 #include <sys/stat.h>
485 #include <fcntl.h>'''],
486 ['setns', '''#include <sched.h>'''],
487 ['renameat2', '''#include <stdio.h>
488 #include <fcntl.h>'''],
489 ['kcmp', '''#include <linux/kcmp.h>'''],
490 ['keyctl', '''#include <sys/types.h>
491 #include <keyutils.h>'''],
492 ['copy_file_range', '''#include <sys/syscall.h>
493 #include <unistd.h>'''],
494 ['bpf', '''#include <sys/syscall.h>
495 #include <unistd.h>'''],
496 ['statx', '''#include <sys/types.h>
497 #include <sys/stat.h>
498 #include <unistd.h>'''],
499 ['explicit_bzero' , '''#include <string.h>'''],
500 ['reallocarray', '''#include <malloc.h>'''],
503 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
504 conf.set10('HAVE_' + ident[0].to_upper(), have)
507 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
508 conf.set10('USE_SYS_RANDOM_H', true)
509 conf.set10('HAVE_GETRANDOM', true)
511 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
512 conf.set10('USE_SYS_RANDOM_H', false)
513 conf.set10('HAVE_GETRANDOM', have)
516 #####################################################################
518 sed = find_program('sed')
519 awk = find_program('awk')
520 m4 = find_program('m4')
521 stat = find_program('stat')
522 git = find_program('git', required : false)
523 env = find_program('env')
524 perl = find_program('perl', required : false)
526 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
527 mkdir_p = 'mkdir -p $DESTDIR/@0@'
528 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
529 splash_bmp = files('test/splash.bmp')
531 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
532 # /usr/sbin, /sbin, and fall back to the default from middle column.
533 progs = [['quotaon', '/usr/sbin/quotaon' ],
534 ['quotacheck', '/usr/sbin/quotacheck' ],
535 ['kmod', '/usr/bin/kmod' ],
536 ['kexec', '/usr/sbin/kexec' ],
537 ['sulogin', '/usr/sbin/sulogin' ],
538 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
539 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
540 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
541 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
544 path = get_option(prog[0] + '-path')
546 message('Using @1@ for @0@'.format(prog[0], path))
548 exe = find_program(prog[0],
549 '/usr/sbin/' + prog[0],
552 path = exe.found() ? exe.path() : prog[1]
554 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
555 conf.set_quoted(name, path)
556 substs.set(name, path)
559 conf.set_quoted('TELINIT', get_option('telinit-path'))
561 if run_command('ln', '--relative', '--help').returncode() != 0
562 error('ln does not support --relative (added in coreutils 8.16)')
565 ############################################################
567 gperf = find_program('gperf')
569 gperf_test_format = '''
571 const char * in_word_set(const char *, @0@);
574 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
575 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
576 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
577 if cc.compiles(gperf_test)
578 gperf_len_type = 'size_t'
580 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
581 if cc.compiles(gperf_test)
582 gperf_len_type = 'unsigned'
584 error('unable to determine gperf len type')
587 message('gperf len type is @0@'.format(gperf_len_type))
588 conf.set('GPERF_LEN_TYPE', gperf_len_type,
589 description : 'The type of gperf "len" parameter')
591 ############################################################
593 if not cc.has_header('sys/capability.h')
594 error('POSIX caps headers not found')
596 foreach header : ['crypt.h',
599 'linux/vm_sockets.h',
601 'valgrind/memcheck.h',
602 'valgrind/valgrind.h',
605 conf.set10('HAVE_' + header.underscorify().to_upper(),
606 cc.has_header(header))
609 ############################################################
611 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
612 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
613 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
615 default_hierarchy = get_option('default-hierarchy')
616 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
617 description : 'default cgroup hierarchy as string')
618 if default_hierarchy == 'legacy'
619 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
620 elif default_hierarchy == 'hybrid'
621 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
623 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
626 time_epoch = get_option('time-epoch')
629 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
631 time_epoch = time_epoch.to_int()
632 conf.set('TIME_EPOCH', time_epoch)
634 system_uid_max = get_option('system-uid-max')
635 if system_uid_max == ''
636 system_uid_max = run_command(
638 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
639 '/etc/login.defs').stdout().strip()
640 if system_uid_max == ''
641 system_uid_max = '999'
644 system_uid_max = system_uid_max.to_int()
645 conf.set('SYSTEM_UID_MAX', system_uid_max)
646 substs.set('systemuidmax', system_uid_max)
647 message('maximum system UID is @0@'.format(system_uid_max))
649 system_gid_max = get_option('system-gid-max')
650 if system_gid_max == ''
651 system_gid_max = run_command(
653 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
654 '/etc/login.defs').stdout().strip()
655 if system_gid_max == ''
656 system_gid_max = '999'
659 system_gid_max = system_gid_max.to_int()
660 conf.set('SYSTEM_GID_MAX', system_gid_max)
661 substs.set('systemgidmax', system_gid_max)
662 message('maximum system GID is @0@'.format(system_gid_max))
664 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
665 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
666 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
667 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
668 substs.set('dynamicuidmin', dynamic_uid_min)
669 substs.set('dynamicuidmax', dynamic_uid_max)
671 container_uid_base_min = get_option('container-uid-base-min').to_int()
672 container_uid_base_max = get_option('container-uid-base-max').to_int()
673 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
674 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
675 substs.set('containeruidbasemin', container_uid_base_min)
676 substs.set('containeruidbasemax', container_uid_base_max)
678 nobody_user = get_option('nobody-user')
679 nobody_group = get_option('nobody-group')
681 getent_result = run_command('getent', 'passwd', '65534')
682 if getent_result.returncode() == 0
683 name = getent_result.stdout().split(':')[0]
684 if name != nobody_user
686 '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) +
687 'Your build will result in an user table setup that is incompatible with the local system.')
690 id_result = run_command('id', '-u', nobody_user)
691 if id_result.returncode() == 0
692 id = id_result.stdout().to_int()
695 '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) +
696 'Your build will result in an user table setup that is incompatible with the local system.')
700 getent_result = run_command('getent', 'group', '65534')
701 if getent_result.returncode() == 0
702 name = getent_result.stdout().split(':')[0]
703 if name != nobody_group
705 '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) +
706 'Your build will result in an group table setup that is incompatible with the local system.')
709 id_result = run_command('id', '-g', nobody_group)
710 if id_result.returncode() == 0
711 id = id_result.stdout().to_int()
714 '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) +
715 'Your build will result in an group table setup that is incompatible with the local system.')
718 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
720 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
721 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
724 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
725 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
726 substs.set('NOBODY_USER_NAME', nobody_user)
727 substs.set('NOBODY_GROUP_NAME', nobody_group)
729 tty_gid = get_option('tty-gid')
730 conf.set('TTY_GID', tty_gid)
731 substs.set('TTY_GID', tty_gid)
733 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
734 if get_option('users-gid') != ''
735 users_gid = get_option('users-gid').to_int()
739 substs.set('USERS_GID', users_gid)
741 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
742 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
744 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
745 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
747 kill_user_processes = get_option('default-kill-user-processes')
748 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
749 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
750 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
752 dns_servers = get_option('dns-servers')
753 conf.set_quoted('DNS_SERVERS', dns_servers)
754 substs.set('DNS_SERVERS', dns_servers)
756 ntp_servers = get_option('ntp-servers')
757 conf.set_quoted('NTP_SERVERS', ntp_servers)
758 substs.set('NTP_SERVERS', ntp_servers)
760 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
762 substs.set('SUSHELL', get_option('debug-shell'))
763 substs.set('DEBUGTTY', get_option('debug-tty'))
765 enable_debug_hashmap = false
766 enable_debug_mmap_cache = false
767 foreach name : get_option('debug')
769 enable_debug_hashmap = true
770 elif name == 'mmap-cache'
771 enable_debug_mmap_cache = true
773 message('unknown debug option "@0@", ignoring'.format(name))
776 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
777 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
779 conf.set10('VALGRIND', get_option('valgrind'))
781 #####################################################################
783 threads = dependency('threads')
784 librt = cc.find_library('rt')
785 libm = cc.find_library('m')
786 libdl = cc.find_library('dl')
787 libcrypt = cc.find_library('crypt')
789 libcap = dependency('libcap', required : false)
790 if not libcap.found()
791 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
792 libcap = cc.find_library('cap')
795 libmount = dependency('mount',
796 version : fuzzer_build ? '>= 0' : '>= 2.30')
798 want_seccomp = get_option('seccomp')
799 if want_seccomp != 'false' and not fuzzer_build
800 libseccomp = dependency('libseccomp',
801 version : '>= 2.3.1',
802 required : want_seccomp == 'true')
803 have = libseccomp.found()
808 conf.set10('HAVE_SECCOMP', have)
810 want_selinux = get_option('selinux')
811 if want_selinux != 'false' and not fuzzer_build
812 libselinux = dependency('libselinux',
813 version : '>= 2.1.9',
814 required : want_selinux == 'true')
815 have = libselinux.found()
820 conf.set10('HAVE_SELINUX', have)
822 want_apparmor = get_option('apparmor')
823 if want_apparmor != 'false' and not fuzzer_build
824 libapparmor = dependency('libapparmor',
825 required : want_apparmor == 'true')
826 have = libapparmor.found()
831 conf.set10('HAVE_APPARMOR', have)
833 smack_run_label = get_option('smack-run-label')
834 if smack_run_label != ''
835 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
838 want_polkit = get_option('polkit')
839 install_polkit = false
840 install_polkit_pkla = false
841 if want_polkit != 'false' and not fuzzer_build
842 install_polkit = true
844 libpolkit = dependency('polkit-gobject-1',
846 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
847 message('Old polkit detected, will install pkla files')
848 install_polkit_pkla = true
851 conf.set10('ENABLE_POLKIT', install_polkit)
853 want_acl = get_option('acl')
854 if want_acl != 'false' and not fuzzer_build
855 libacl = cc.find_library('acl', required : want_acl == 'true')
856 have = libacl.found()
861 conf.set10('HAVE_ACL', have)
863 want_audit = get_option('audit')
864 if want_audit != 'false' and not fuzzer_build
865 libaudit = dependency('audit', required : want_audit == 'true')
866 have = libaudit.found()
871 conf.set10('HAVE_AUDIT', have)
873 want_blkid = get_option('blkid')
874 if want_blkid != 'false' and not fuzzer_build
875 libblkid = dependency('blkid', required : want_blkid == 'true')
876 have = libblkid.found()
881 conf.set10('HAVE_BLKID', have)
883 want_kmod = get_option('kmod')
884 if want_kmod != 'false' and not fuzzer_build
885 libkmod = dependency('libkmod',
887 required : want_kmod == 'true')
888 have = libkmod.found()
893 conf.set10('HAVE_KMOD', have)
895 want_pam = get_option('pam')
896 if want_pam != 'false' and not fuzzer_build
897 libpam = cc.find_library('pam', required : want_pam == 'true')
898 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
899 have = libpam.found() and libpam_misc.found()
905 conf.set10('HAVE_PAM', have)
907 want_microhttpd = get_option('microhttpd')
908 if want_microhttpd != 'false' and not fuzzer_build
909 libmicrohttpd = dependency('libmicrohttpd',
910 version : '>= 0.9.33',
911 required : want_microhttpd == 'true')
912 have = libmicrohttpd.found()
917 conf.set10('HAVE_MICROHTTPD', have)
919 want_libcryptsetup = get_option('libcryptsetup')
920 if want_libcryptsetup != 'false' and not fuzzer_build
921 libcryptsetup = dependency('libcryptsetup',
922 version : '>= 1.6.0',
923 required : want_libcryptsetup == 'true')
924 have = libcryptsetup.found()
929 conf.set10('HAVE_LIBCRYPTSETUP', have)
931 want_libcurl = get_option('libcurl')
932 if want_libcurl != 'false' and not fuzzer_build
933 libcurl = dependency('libcurl',
934 version : '>= 7.32.0',
935 required : want_libcurl == 'true')
936 have = libcurl.found()
941 conf.set10('HAVE_LIBCURL', have)
943 want_libidn = get_option('libidn')
944 want_libidn2 = get_option('libidn2')
945 if want_libidn == 'true' and want_libidn2 == 'true'
946 error('libidn and libidn2 cannot be requested simultaneously')
949 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
950 libidn = dependency('libidn',
951 required : want_libidn == 'true')
952 have = libidn.found()
957 conf.set10('HAVE_LIBIDN', have)
958 if not have and want_libidn2 != 'false' and not fuzzer_build
959 # libidn is used for both libidn and libidn2 objects
960 libidn = dependency('libidn2',
961 required : want_libidn2 == 'true')
962 have = libidn.found()
966 conf.set10('HAVE_LIBIDN2', have)
968 want_libiptc = get_option('libiptc')
969 if want_libiptc != 'false' and not fuzzer_build
970 libiptc = dependency('libiptc',
971 required : want_libiptc == 'true')
972 have = libiptc.found()
977 conf.set10('HAVE_LIBIPTC', have)
979 want_qrencode = get_option('qrencode')
980 if want_qrencode != 'false' and not fuzzer_build
981 libqrencode = dependency('libqrencode',
982 required : want_qrencode == 'true')
983 have = libqrencode.found()
988 conf.set10('HAVE_QRENCODE', have)
990 want_gcrypt = get_option('gcrypt')
991 if want_gcrypt != 'false' and not fuzzer_build
992 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
993 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
994 have = libgcrypt.found() and libgpg_error.found()
999 # link to neither of the libs if one is not found
1003 conf.set10('HAVE_GCRYPT', have)
1005 want_gnutls = get_option('gnutls')
1006 if want_gnutls != 'false' and not fuzzer_build
1007 libgnutls = dependency('gnutls',
1008 version : '>= 3.1.4',
1009 required : want_gnutls == 'true')
1010 have = libgnutls.found()
1015 conf.set10('HAVE_GNUTLS', have)
1017 want_elfutils = get_option('elfutils')
1018 if want_elfutils != 'false' and not fuzzer_build
1019 libdw = dependency('libdw',
1020 required : want_elfutils == 'true')
1021 have = libdw.found()
1026 conf.set10('HAVE_ELFUTILS', have)
1028 want_zlib = get_option('zlib')
1029 if want_zlib != 'false' and not fuzzer_build
1030 libz = dependency('zlib',
1031 required : want_zlib == 'true')
1037 conf.set10('HAVE_ZLIB', have)
1039 want_bzip2 = get_option('bzip2')
1040 if want_bzip2 != 'false' and not fuzzer_build
1041 libbzip2 = cc.find_library('bz2',
1042 required : want_bzip2 == 'true')
1043 have = libbzip2.found()
1048 conf.set10('HAVE_BZIP2', have)
1050 want_xz = get_option('xz')
1051 if want_xz != 'false' and not fuzzer_build
1052 libxz = dependency('liblzma',
1053 required : want_xz == 'true')
1054 have = libxz.found()
1059 conf.set10('HAVE_XZ', have)
1061 want_lz4 = get_option('lz4')
1062 if want_lz4 != 'false' and not fuzzer_build
1063 liblz4 = dependency('liblz4',
1064 required : want_lz4 == 'true')
1065 have = liblz4.found()
1070 conf.set10('HAVE_LZ4', have)
1072 want_xkbcommon = get_option('xkbcommon')
1073 if want_xkbcommon != 'false' and not fuzzer_build
1074 libxkbcommon = dependency('xkbcommon',
1075 version : '>= 0.3.0',
1076 required : want_xkbcommon == 'true')
1077 have = libxkbcommon.found()
1082 conf.set10('HAVE_XKBCOMMON', have)
1084 want_pcre2 = get_option('pcre2')
1085 if want_pcre2 != 'false'
1086 libpcre2 = dependency('libpcre2-8',
1087 required : want_pcre2 == 'true')
1088 have = libpcre2.found()
1093 conf.set10('HAVE_PCRE2', have)
1095 want_glib = get_option('glib')
1096 if want_glib != 'false' and not fuzzer_build
1097 libglib = dependency('glib-2.0',
1098 version : '>= 2.22.0',
1099 required : want_glib == 'true')
1100 libgobject = dependency('gobject-2.0',
1101 version : '>= 2.22.0',
1102 required : want_glib == 'true')
1103 libgio = dependency('gio-2.0',
1104 required : want_glib == 'true')
1105 have = libglib.found() and libgobject.found() and libgio.found()
1112 conf.set10('HAVE_GLIB', have)
1114 want_dbus = get_option('dbus')
1115 if want_dbus != 'false' and not fuzzer_build
1116 libdbus = dependency('dbus-1',
1117 version : '>= 1.3.2',
1118 required : want_dbus == 'true')
1119 have = libdbus.found()
1124 conf.set10('HAVE_DBUS', have)
1126 default_dnssec = get_option('default-dnssec')
1128 default_dnssec = 'no'
1130 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1131 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1132 default_dnssec = 'no'
1134 conf.set('DEFAULT_DNSSEC_MODE',
1135 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1136 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1138 dns_over_tls = get_option('dns-over-tls')
1139 if dns_over_tls != 'false'
1140 have = (conf.get('HAVE_GNUTLS') == 1 and
1141 libgnutls.version().version_compare('>=3.5.3'))
1142 if dns_over_tls == 'true' and not have
1143 error('DNS-over-TLS support was requested, but dependencies are not available')
1148 conf.set10('ENABLE_DNS_OVER_TLS', have)
1150 default_dns_over_tls = get_option('default-dns-over-tls')
1152 default_dns_over_tls = 'no'
1154 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1155 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1156 default_dns_over_tls = 'no'
1158 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1159 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1160 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1162 want_importd = get_option('importd')
1163 if want_importd != 'false'
1164 have = (conf.get('HAVE_LIBCURL') == 1 and
1165 conf.get('HAVE_ZLIB') == 1 and
1166 conf.get('HAVE_BZIP2') == 1 and
1167 conf.get('HAVE_XZ') == 1 and
1168 conf.get('HAVE_GCRYPT') == 1)
1169 if want_importd == 'true' and not have
1170 error('importd support was requested, but dependencies are not available')
1175 conf.set10('ENABLE_IMPORTD', have)
1177 want_remote = get_option('remote')
1178 if want_remote != 'false'
1179 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1180 conf.get('HAVE_LIBCURL') == 1]
1181 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1182 # it's possible to build one without the other. Complain only if
1183 # support was explictly requested. The auxiliary files like sysusers
1184 # config should be installed when any of the programs are built.
1185 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1186 error('remote support was requested, but dependencies are not available')
1188 have = have_deps[0] or have_deps[1]
1192 conf.set10('ENABLE_REMOTE', have)
1194 foreach term : ['utmp',
1226 have = get_option(term)
1227 name = 'ENABLE_' + term.underscorify().to_upper()
1228 conf.set10(name, have)
1231 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1233 want_tests = get_option('tests')
1234 install_tests = get_option('install-tests')
1235 slow_tests = get_option('slow-tests')
1239 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1241 #####################################################################
1243 if get_option('efi')
1244 efi_arch = host_machine.cpu_family()
1246 if efi_arch == 'x86'
1247 EFI_MACHINE_TYPE_NAME = 'ia32'
1248 gnu_efi_arch = 'ia32'
1249 elif efi_arch == 'x86_64'
1250 EFI_MACHINE_TYPE_NAME = 'x64'
1251 gnu_efi_arch = 'x86_64'
1252 elif efi_arch == 'arm'
1253 EFI_MACHINE_TYPE_NAME = 'arm'
1254 gnu_efi_arch = 'arm'
1255 elif efi_arch == 'aarch64'
1256 EFI_MACHINE_TYPE_NAME = 'aa64'
1257 gnu_efi_arch = 'aarch64'
1259 EFI_MACHINE_TYPE_NAME = ''
1264 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1266 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1270 conf.set10('ENABLE_EFI', have)
1272 #####################################################################
1274 config_h = configure_file(
1275 output : 'config.h',
1276 configuration : conf)
1278 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1280 includes = include_directories('src/basic',
1284 'src/journal-remote',
1288 'src/time-wait-sync',
1293 'src/libsystemd/sd-bus',
1294 'src/libsystemd/sd-device',
1295 'src/libsystemd/sd-hwdb',
1296 'src/libsystemd/sd-id128',
1297 'src/libsystemd/sd-netlink',
1298 'src/libsystemd/sd-network',
1299 'src/libsystemd-network',
1302 add_project_arguments('-include', 'config.h', language : 'c')
1306 subdir('src/systemd')
1308 subdir('src/libsystemd')
1309 subdir('src/libsystemd-network')
1310 subdir('src/journal')
1313 libjournal_core = static_library(
1315 libjournal_core_sources,
1317 include_directories : includes,
1320 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1321 libsystemd = shared_library(
1323 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1324 version : libsystemd_version,
1325 include_directories : includes,
1326 link_args : ['-shared',
1327 '-Wl,--version-script=' + libsystemd_sym_path],
1328 link_with : [libbasic,
1330 link_whole : [libsystemd_static,
1332 dependencies : [threads,
1336 link_depends : libsystemd_sym,
1338 install_dir : rootlibdir)
1340 static_libsystemd = get_option('static-libsystemd')
1341 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1343 install_libsystemd_static = static_library(
1346 journal_client_sources,
1348 basic_gcrypt_sources,
1349 include_directories : includes,
1350 build_by_default : static_libsystemd != 'false',
1351 install : static_libsystemd != 'false',
1352 install_dir : rootlibdir,
1353 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1354 dependencies : [threads,
1363 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1365 ############################################################
1367 # binaries that have --help and are intended for use by humans,
1368 # usually, but not always, installed in /bin.
1369 public_programs = []
1371 subdir('src/libudev')
1372 subdir('src/shared')
1375 subdir('src/network')
1377 subdir('src/analyze')
1378 subdir('src/journal-remote')
1379 subdir('src/coredump')
1380 subdir('src/hostname')
1381 subdir('src/import')
1382 subdir('src/kernel-install')
1383 subdir('src/locale')
1384 subdir('src/machine')
1385 subdir('src/portable')
1386 subdir('src/nspawn')
1387 subdir('src/resolve')
1388 subdir('src/timedate')
1389 subdir('src/timesync')
1390 subdir('src/vconsole')
1391 subdir('src/boot/efi')
1398 ############################################################
1400 # only static linking apart from libdl, to make sure that the
1401 # module is linked to all libraries that it uses.
1402 test_dlopen = executable(
1405 include_directories : includes,
1406 link_with : [libbasic],
1407 dependencies : [libdl])
1409 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1410 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1411 ['mymachines', 'ENABLE_MACHINED'],
1412 ['resolve', 'ENABLE_RESOLVE']]
1414 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1418 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1419 version_script_arg = join_paths(meson.current_source_dir(), sym)
1421 nss = shared_library(
1423 'src/nss-@0@/nss-@0@.c'.format(module),
1425 include_directories : includes,
1426 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1427 link_args : ['-Wl,-z,nodelete',
1429 '-Wl,--version-script=' + version_script_arg,
1431 link_with : [libsystemd_static,
1433 dependencies : [threads,
1437 install_dir : rootlibdir)
1439 # We cannot use shared_module because it does not support version suffix.
1440 # Unfortunately shared_library insists on creating the symlink…
1441 meson.add_install_script('sh', '-c',
1442 'rm $DESTDIR@0@/libnss_@1@.so'
1443 .format(rootlibdir, module))
1445 test('dlopen-nss_' + module,
1447 args : [nss.full_path()]) # path to dlopen must include a slash
1451 ############################################################
1453 executable('systemd',
1455 include_directories : includes,
1456 link_with : [libcore,
1458 dependencies : [threads,
1464 install_rpath : rootlibexecdir,
1466 install_dir : rootlibexecdir)
1468 meson.add_install_script(meson_make_symlink,
1469 join_paths(rootlibexecdir, 'systemd'),
1470 join_paths(rootsbindir, 'init'))
1472 exe = executable('systemd-analyze',
1473 systemd_analyze_sources,
1474 include_directories : includes,
1475 link_with : [libcore,
1477 dependencies : [threads,
1483 install_rpath : rootlibexecdir,
1485 public_programs += [exe]
1487 executable('systemd-journald',
1488 systemd_journald_sources,
1489 include_directories : includes,
1490 link_with : [libjournal_core,
1492 dependencies : [threads,
1496 install_rpath : rootlibexecdir,
1498 install_dir : rootlibexecdir)
1500 exe = executable('systemd-cat',
1501 systemd_cat_sources,
1502 include_directories : includes,
1503 link_with : [libjournal_core,
1505 dependencies : [threads],
1506 install_rpath : rootlibexecdir,
1508 public_programs += [exe]
1510 exe = executable('journalctl',
1512 include_directories : includes,
1513 link_with : [libshared],
1514 dependencies : [threads,
1519 install_rpath : rootlibexecdir,
1521 install_dir : rootbindir)
1522 public_programs += [exe]
1524 executable('systemd-getty-generator',
1525 'src/getty-generator/getty-generator.c',
1526 include_directories : includes,
1527 link_with : [libshared],
1528 install_rpath : rootlibexecdir,
1530 install_dir : systemgeneratordir)
1532 executable('systemd-debug-generator',
1533 'src/debug-generator/debug-generator.c',
1534 include_directories : includes,
1535 link_with : [libshared],
1536 install_rpath : rootlibexecdir,
1538 install_dir : systemgeneratordir)
1540 executable('systemd-fstab-generator',
1541 'src/fstab-generator/fstab-generator.c',
1542 'src/core/mount-setup.c',
1543 include_directories : includes,
1544 link_with : [libshared],
1545 install_rpath : rootlibexecdir,
1547 install_dir : systemgeneratordir)
1549 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1550 executable('30-systemd-environment-d-generator',
1551 'src/environment-d-generator/environment-d-generator.c',
1552 include_directories : includes,
1553 link_with : [libshared],
1554 install_rpath : rootlibexecdir,
1556 install_dir : userenvgeneratordir)
1558 meson.add_install_script(meson_make_symlink,
1559 join_paths(sysconfdir, 'environment'),
1560 join_paths(environmentdir, '99-environment.conf'))
1563 if conf.get('ENABLE_HIBERNATE') == 1
1564 executable('systemd-hibernate-resume-generator',
1565 'src/hibernate-resume/hibernate-resume-generator.c',
1566 include_directories : includes,
1567 link_with : [libshared],
1568 install_rpath : rootlibexecdir,
1570 install_dir : systemgeneratordir)
1572 executable('systemd-hibernate-resume',
1573 'src/hibernate-resume/hibernate-resume.c',
1574 include_directories : includes,
1575 link_with : [libshared],
1576 install_rpath : rootlibexecdir,
1578 install_dir : rootlibexecdir)
1581 if conf.get('HAVE_BLKID') == 1
1582 executable('systemd-gpt-auto-generator',
1583 'src/gpt-auto-generator/gpt-auto-generator.c',
1584 'src/basic/blkid-util.h',
1585 include_directories : includes,
1586 link_with : [libshared],
1587 dependencies : libblkid,
1588 install_rpath : rootlibexecdir,
1590 install_dir : systemgeneratordir)
1592 exe = executable('systemd-dissect',
1593 'src/dissect/dissect.c',
1594 include_directories : includes,
1595 link_with : [libshared],
1596 install_rpath : rootlibexecdir,
1598 install_dir : rootlibexecdir)
1599 public_programs += [exe]
1602 if conf.get('ENABLE_RESOLVE') == 1
1603 executable('systemd-resolved',
1604 systemd_resolved_sources,
1605 include_directories : includes,
1606 link_with : [libshared,
1608 libsystemd_resolve_core],
1609 dependencies : systemd_resolved_dependencies,
1610 install_rpath : rootlibexecdir,
1612 install_dir : rootlibexecdir)
1614 exe = executable('resolvectl',
1616 include_directories : includes,
1617 link_with : [libshared,
1619 libsystemd_resolve_core],
1620 dependencies : [threads,
1624 install_rpath : rootlibexecdir,
1626 public_programs += [exe]
1628 meson.add_install_script(meson_make_symlink,
1629 join_paths(bindir, 'resolvectl'),
1630 join_paths(rootsbindir, 'resolvconf'))
1632 meson.add_install_script(meson_make_symlink,
1633 join_paths(bindir, 'resolvectl'),
1634 join_paths(bindir, 'systemd-resolve'))
1637 if conf.get('ENABLE_LOGIND') == 1
1638 executable('systemd-logind',
1639 systemd_logind_sources,
1640 include_directories : includes,
1641 link_with : [liblogind_core,
1643 dependencies : [threads,
1645 install_rpath : rootlibexecdir,
1647 install_dir : rootlibexecdir)
1649 exe = executable('loginctl',
1651 include_directories : includes,
1652 link_with : [libshared],
1653 dependencies : [threads,
1656 install_rpath : rootlibexecdir,
1658 install_dir : rootbindir)
1659 public_programs += [exe]
1661 exe = executable('systemd-inhibit',
1662 'src/login/inhibit.c',
1663 include_directories : includes,
1664 link_with : [libshared],
1665 install_rpath : rootlibexecdir,
1667 install_dir : rootbindir)
1668 public_programs += [exe]
1670 if conf.get('HAVE_PAM') == 1
1671 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1672 pam_systemd = shared_library(
1676 include_directories : includes,
1677 link_args : ['-shared',
1678 '-Wl,--version-script=' + version_script_arg],
1679 link_with : [libsystemd_static,
1681 dependencies : [threads,
1684 link_depends : pam_systemd_sym,
1686 install_dir : pamlibdir)
1688 test('dlopen-pam_systemd',
1690 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1694 executable('systemd-user-runtime-dir',
1695 user_runtime_dir_sources,
1696 include_directories : includes,
1697 link_with : [libshared, liblogind_core],
1698 install_rpath : rootlibexecdir,
1700 install_dir : rootlibexecdir)
1702 if conf.get('HAVE_PAM') == 1
1703 executable('systemd-user-sessions',
1704 'src/user-sessions/user-sessions.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 install_rpath : rootlibexecdir,
1709 install_dir : rootlibexecdir)
1712 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1713 exe = executable('bootctl',
1714 'src/boot/bootctl.c',
1715 include_directories : includes,
1716 link_with : [libshared],
1717 dependencies : [libblkid],
1718 install_rpath : rootlibexecdir,
1720 public_programs += [exe]
1723 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1724 include_directories : includes,
1725 link_with : [libshared],
1726 dependencies : [threads],
1727 install_rpath : rootlibexecdir,
1729 public_programs += [exe]
1732 if get_option('link-systemctl-shared')
1733 systemctl_link_with = [libshared]
1735 systemctl_link_with = [libsystemd_static,
1741 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1742 include_directories : includes,
1743 link_with : systemctl_link_with,
1744 dependencies : [threads,
1749 install_rpath : rootlibexecdir,
1751 install_dir : rootbindir)
1752 public_programs += [exe]
1754 if conf.get('ENABLE_PORTABLED') == 1
1755 executable('systemd-portabled',
1756 systemd_portabled_sources,
1757 include_directories : includes,
1758 link_with : [libshared],
1759 dependencies : [threads],
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootlibexecdir)
1764 exe = executable('portablectl', 'src/portable/portablectl.c',
1765 include_directories : includes,
1766 link_with : [libshared],
1767 dependencies : [threads],
1768 install_rpath : rootlibexecdir,
1770 install_dir : rootlibexecdir)
1771 public_programs += [exe]
1774 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1775 meson.add_install_script(meson_make_symlink,
1776 join_paths(rootbindir, 'systemctl'),
1777 join_paths(rootsbindir, alias))
1780 if conf.get('ENABLE_BACKLIGHT') == 1
1781 executable('systemd-backlight',
1782 'src/backlight/backlight.c',
1783 include_directories : includes,
1784 link_with : [libshared],
1785 install_rpath : rootlibexecdir,
1787 install_dir : rootlibexecdir)
1790 if conf.get('ENABLE_RFKILL') == 1
1791 executable('systemd-rfkill',
1792 'src/rfkill/rfkill.c',
1793 include_directories : includes,
1794 link_with : [libshared],
1795 install_rpath : rootlibexecdir,
1797 install_dir : rootlibexecdir)
1800 executable('systemd-system-update-generator',
1801 'src/system-update-generator/system-update-generator.c',
1802 include_directories : includes,
1803 link_with : [libshared],
1804 install_rpath : rootlibexecdir,
1806 install_dir : systemgeneratordir)
1808 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1809 executable('systemd-cryptsetup',
1810 'src/cryptsetup/cryptsetup.c',
1811 include_directories : includes,
1812 link_with : [libshared],
1813 dependencies : [libcryptsetup],
1814 install_rpath : rootlibexecdir,
1816 install_dir : rootlibexecdir)
1818 executable('systemd-cryptsetup-generator',
1819 'src/cryptsetup/cryptsetup-generator.c',
1820 include_directories : includes,
1821 link_with : [libshared],
1822 dependencies : [libcryptsetup],
1823 install_rpath : rootlibexecdir,
1825 install_dir : systemgeneratordir)
1827 executable('systemd-veritysetup',
1828 'src/veritysetup/veritysetup.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 dependencies : [libcryptsetup],
1832 install_rpath : rootlibexecdir,
1834 install_dir : rootlibexecdir)
1836 executable('systemd-veritysetup-generator',
1837 'src/veritysetup/veritysetup-generator.c',
1838 include_directories : includes,
1839 link_with : [libshared],
1840 dependencies : [libcryptsetup],
1841 install_rpath : rootlibexecdir,
1843 install_dir : systemgeneratordir)
1846 if conf.get('HAVE_SYSV_COMPAT') == 1
1847 executable('systemd-sysv-generator',
1848 'src/sysv-generator/sysv-generator.c',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 install_rpath : rootlibexecdir,
1853 install_dir : systemgeneratordir)
1855 executable('systemd-rc-local-generator',
1856 'src/rc-local-generator/rc-local-generator.c',
1857 include_directories : includes,
1858 link_with : [libshared],
1859 install_rpath : rootlibexecdir,
1861 install_dir : systemgeneratordir)
1864 if conf.get('ENABLE_HOSTNAMED') == 1
1865 executable('systemd-hostnamed',
1866 'src/hostname/hostnamed.c',
1867 include_directories : includes,
1868 link_with : [libshared],
1869 install_rpath : rootlibexecdir,
1871 install_dir : rootlibexecdir)
1873 exe = executable('hostnamectl',
1874 'src/hostname/hostnamectl.c',
1875 include_directories : includes,
1876 link_with : [libshared],
1877 install_rpath : rootlibexecdir,
1879 public_programs += [exe]
1882 if conf.get('ENABLE_LOCALED') == 1
1883 if conf.get('HAVE_XKBCOMMON') == 1
1884 # logind will load libxkbcommon.so dynamically on its own
1890 executable('systemd-localed',
1891 systemd_localed_sources,
1892 include_directories : includes,
1893 link_with : [libshared],
1894 dependencies : deps,
1895 install_rpath : rootlibexecdir,
1897 install_dir : rootlibexecdir)
1899 exe = executable('localectl',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 install_rpath : rootlibexecdir,
1905 public_programs += [exe]
1908 if conf.get('ENABLE_TIMEDATED') == 1
1909 executable('systemd-timedated',
1910 'src/timedate/timedated.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 install_rpath : rootlibexecdir,
1915 install_dir : rootlibexecdir)
1918 if conf.get('ENABLE_TIMEDATECTL') == 1
1919 exe = executable('timedatectl',
1920 'src/timedate/timedatectl.c',
1921 include_directories : includes,
1922 install_rpath : rootlibexecdir,
1923 link_with : [libshared],
1924 dependencies : [libm],
1926 public_programs += [exe]
1929 if conf.get('ENABLE_TIMESYNCD') == 1
1930 executable('systemd-timesyncd',
1931 systemd_timesyncd_sources,
1932 include_directories : includes,
1933 link_with : [libshared],
1934 dependencies : [threads,
1936 install_rpath : rootlibexecdir,
1938 install_dir : rootlibexecdir)
1940 executable('systemd-time-wait-sync',
1941 'src/time-wait-sync/time-wait-sync.c',
1942 include_directories : includes,
1943 link_with : [libshared],
1944 install_rpath : rootlibexecdir,
1946 install_dir : rootlibexecdir)
1949 if conf.get('ENABLE_MACHINED') == 1
1950 executable('systemd-machined',
1951 systemd_machined_sources,
1952 include_directories : includes,
1953 link_with : [libmachine_core,
1955 install_rpath : rootlibexecdir,
1957 install_dir : rootlibexecdir)
1959 exe = executable('machinectl',
1960 'src/machine/machinectl.c',
1961 include_directories : includes,
1962 link_with : [libshared],
1963 dependencies : [threads,
1966 install_rpath : rootlibexecdir,
1968 install_dir : rootbindir)
1969 public_programs += [exe]
1972 if conf.get('ENABLE_IMPORTD') == 1
1973 executable('systemd-importd',
1974 systemd_importd_sources,
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [threads],
1978 install_rpath : rootlibexecdir,
1980 install_dir : rootlibexecdir)
1982 systemd_pull = executable('systemd-pull',
1983 systemd_pull_sources,
1984 include_directories : includes,
1985 link_with : [libshared],
1986 dependencies : [libcurl,
1991 install_rpath : rootlibexecdir,
1993 install_dir : rootlibexecdir)
1995 systemd_import = executable('systemd-import',
1996 systemd_import_sources,
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : [libcurl,
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootlibexecdir)
2007 systemd_export = executable('systemd-export',
2008 systemd_export_sources,
2009 include_directories : includes,
2010 link_with : [libshared],
2011 dependencies : [libcurl,
2015 install_rpath : rootlibexecdir,
2017 install_dir : rootlibexecdir)
2018 public_programs += [systemd_pull, systemd_import, systemd_export]
2021 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2022 exe = executable('systemd-journal-upload',
2023 systemd_journal_upload_sources,
2024 include_directories : includes,
2025 link_with : [libshared],
2026 dependencies : [threads,
2031 install_rpath : rootlibexecdir,
2033 install_dir : rootlibexecdir)
2034 public_programs += [exe]
2037 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2038 s_j_remote = executable('systemd-journal-remote',
2039 systemd_journal_remote_sources,
2040 include_directories : includes,
2041 link_with : [libshared,
2042 libsystemd_journal_remote],
2043 dependencies : [threads,
2048 install_rpath : rootlibexecdir,
2050 install_dir : rootlibexecdir)
2052 s_j_gatewayd = executable('systemd-journal-gatewayd',
2053 systemd_journal_gatewayd_sources,
2054 include_directories : includes,
2055 link_with : [libshared],
2056 dependencies : [threads,
2061 install_rpath : rootlibexecdir,
2063 install_dir : rootlibexecdir)
2064 public_programs += [s_j_remote, s_j_gatewayd]
2067 if conf.get('ENABLE_COREDUMP') == 1
2068 executable('systemd-coredump',
2069 systemd_coredump_sources,
2070 include_directories : includes,
2071 link_with : [libshared],
2072 dependencies : [threads,
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootlibexecdir)
2081 exe = executable('coredumpctl',
2082 coredumpctl_sources,
2083 include_directories : includes,
2084 link_with : [libshared],
2085 dependencies : [threads,
2088 install_rpath : rootlibexecdir,
2090 public_programs += [exe]
2093 if conf.get('ENABLE_BINFMT') == 1
2094 exe = executable('systemd-binfmt',
2095 'src/binfmt/binfmt.c',
2096 include_directories : includes,
2097 link_with : [libshared],
2098 install_rpath : rootlibexecdir,
2100 install_dir : rootlibexecdir)
2101 public_programs += [exe]
2103 meson.add_install_script('sh', '-c',
2104 mkdir_p.format(binfmtdir))
2105 meson.add_install_script('sh', '-c',
2106 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2109 if conf.get('ENABLE_VCONSOLE') == 1
2110 executable('systemd-vconsole-setup',
2111 'src/vconsole/vconsole-setup.c',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootlibexecdir)
2119 if conf.get('ENABLE_RANDOMSEED') == 1
2120 executable('systemd-random-seed',
2121 'src/random-seed/random-seed.c',
2122 include_directories : includes,
2123 link_with : [libshared],
2124 install_rpath : rootlibexecdir,
2126 install_dir : rootlibexecdir)
2129 if conf.get('ENABLE_FIRSTBOOT') == 1
2130 executable('systemd-firstboot',
2131 'src/firstboot/firstboot.c',
2132 include_directories : includes,
2133 link_with : [libshared],
2134 dependencies : [libcrypt],
2135 install_rpath : rootlibexecdir,
2137 install_dir : rootbindir)
2140 executable('systemd-remount-fs',
2141 'src/remount-fs/remount-fs.c',
2142 'src/core/mount-setup.c',
2143 'src/core/mount-setup.h',
2144 include_directories : includes,
2145 link_with : [libshared],
2146 install_rpath : rootlibexecdir,
2148 install_dir : rootlibexecdir)
2150 executable('systemd-machine-id-setup',
2151 'src/machine-id-setup/machine-id-setup-main.c',
2152 'src/core/machine-id-setup.c',
2153 'src/core/machine-id-setup.h',
2154 include_directories : includes,
2155 link_with : [libshared],
2156 install_rpath : rootlibexecdir,
2158 install_dir : rootbindir)
2160 executable('systemd-fsck',
2162 include_directories : includes,
2163 link_with : [libshared],
2164 install_rpath : rootlibexecdir,
2166 install_dir : rootlibexecdir)
2168 executable('systemd-growfs',
2169 'src/partition/growfs.c',
2170 include_directories : includes,
2171 link_with : [libshared],
2172 dependencies : [libcryptsetup],
2173 install_rpath : rootlibexecdir,
2175 install_dir : rootlibexecdir)
2177 executable('systemd-makefs',
2178 'src/partition/makefs.c',
2179 include_directories : includes,
2180 link_with : [libshared],
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootlibexecdir)
2185 executable('systemd-sleep',
2186 'src/sleep/sleep.c',
2187 include_directories : includes,
2188 link_with : [libshared],
2189 install_rpath : rootlibexecdir,
2191 install_dir : rootlibexecdir)
2193 exe = executable('systemd-sysctl',
2194 'src/sysctl/sysctl.c',
2195 include_directories : includes,
2196 link_with : [libshared],
2197 install_rpath : rootlibexecdir,
2199 install_dir : rootlibexecdir)
2200 public_programs += [exe]
2202 executable('systemd-ac-power',
2203 'src/ac-power/ac-power.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2208 install_dir : rootlibexecdir)
2210 exe = executable('systemd-detect-virt',
2211 'src/detect-virt/detect-virt.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2216 public_programs += [exe]
2218 exe = executable('systemd-delta',
2219 'src/delta/delta.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2224 public_programs += [exe]
2226 exe = executable('systemd-escape',
2227 'src/escape/escape.c',
2228 include_directories : includes,
2229 link_with : [libshared],
2230 install_rpath : rootlibexecdir,
2232 install_dir : rootbindir)
2233 public_programs += [exe]
2235 exe = executable('systemd-notify',
2236 'src/notify/notify.c',
2237 include_directories : includes,
2238 link_with : [libshared],
2239 install_rpath : rootlibexecdir,
2241 install_dir : rootbindir)
2242 public_programs += [exe]
2244 executable('systemd-volatile-root',
2245 'src/volatile-root/volatile-root.c',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 install_rpath : rootlibexecdir,
2250 install_dir : rootlibexecdir)
2252 executable('systemd-cgroups-agent',
2253 'src/cgroups-agent/cgroups-agent.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 install_rpath : rootlibexecdir,
2258 install_dir : rootlibexecdir)
2260 exe = executable('systemd-path',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 install_rpath : rootlibexecdir,
2266 public_programs += [exe]
2268 exe = executable('systemd-ask-password',
2269 'src/ask-password/ask-password.c',
2270 include_directories : includes,
2271 link_with : [libshared],
2272 install_rpath : rootlibexecdir,
2274 install_dir : rootbindir)
2275 public_programs += [exe]
2277 executable('systemd-reply-password',
2278 'src/reply-password/reply-password.c',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 install_rpath : rootlibexecdir,
2283 install_dir : rootlibexecdir)
2285 exe = executable('systemd-tty-ask-password-agent',
2286 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2291 install_dir : rootbindir)
2292 public_programs += [exe]
2294 exe = executable('systemd-cgls',
2296 include_directories : includes,
2297 link_with : [libshared],
2298 install_rpath : rootlibexecdir,
2300 public_programs += [exe]
2302 exe = executable('systemd-cgtop',
2303 'src/cgtop/cgtop.c',
2304 include_directories : includes,
2305 link_with : [libshared],
2306 install_rpath : rootlibexecdir,
2308 public_programs += [exe]
2310 executable('systemd-initctl',
2311 'src/initctl/initctl.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2316 install_dir : rootlibexecdir)
2318 exe = executable('systemd-mount',
2319 'src/mount/mount-tool.c',
2320 include_directories : includes,
2321 link_with : [libshared],
2322 install_rpath : rootlibexecdir,
2324 public_programs += [exe]
2326 meson.add_install_script(meson_make_symlink,
2327 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2329 exe = executable('systemd-run',
2331 include_directories : includes,
2332 link_with : [libshared],
2333 install_rpath : rootlibexecdir,
2335 public_programs += [exe]
2337 exe = executable('systemd-stdio-bridge',
2338 'src/stdio-bridge/stdio-bridge.c',
2339 include_directories : includes,
2340 link_with : [libshared],
2341 install_rpath : rootlibexecdir,
2343 public_programs += [exe]
2345 exe = executable('busctl',
2346 'src/busctl/busctl.c',
2347 'src/busctl/busctl-introspect.c',
2348 'src/busctl/busctl-introspect.h',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 install_rpath : rootlibexecdir,
2353 public_programs += [exe]
2355 if conf.get('ENABLE_SYSUSERS') == 1
2356 exe = executable('systemd-sysusers',
2357 'src/sysusers/sysusers.c',
2358 include_directories : includes,
2359 link_with : [libshared],
2360 install_rpath : rootlibexecdir,
2362 install_dir : rootbindir)
2363 public_programs += [exe]
2366 if conf.get('ENABLE_TMPFILES') == 1
2367 exe = executable('systemd-tmpfiles',
2368 'src/tmpfiles/tmpfiles.c',
2369 include_directories : includes,
2370 link_with : [libshared],
2371 dependencies : [libacl],
2372 install_rpath : rootlibexecdir,
2374 install_dir : rootbindir)
2375 public_programs += [exe]
2377 test('test-systemd-tmpfiles',
2378 test_systemd_tmpfiles_py,
2379 args : exe.full_path())
2380 # https://github.com/mesonbuild/meson/issues/2681
2383 if conf.get('ENABLE_HWDB') == 1
2384 exe = executable('systemd-hwdb',
2386 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2387 include_directories : includes,
2388 link_with : [libudev_static],
2389 install_rpath : udev_rpath,
2391 install_dir : rootbindir)
2392 public_programs += [exe]
2395 if conf.get('ENABLE_QUOTACHECK') == 1
2396 executable('systemd-quotacheck',
2397 'src/quotacheck/quotacheck.c',
2398 include_directories : includes,
2399 link_with : [libshared],
2400 install_rpath : rootlibexecdir,
2402 install_dir : rootlibexecdir)
2405 exe = executable('systemd-socket-proxyd',
2406 'src/socket-proxy/socket-proxyd.c',
2407 include_directories : includes,
2408 link_with : [libshared],
2409 dependencies : [threads],
2410 install_rpath : rootlibexecdir,
2412 install_dir : rootlibexecdir)
2413 public_programs += [exe]
2415 exe = executable('systemd-udevd',
2416 systemd_udevd_sources,
2417 include_directories : includes,
2418 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2419 link_with : [libudev_core,
2422 dependencies : [threads,
2427 install_rpath : udev_rpath,
2429 install_dir : rootlibexecdir)
2430 public_programs += [exe]
2432 exe = executable('udevadm',
2434 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2435 include_directories : includes,
2436 link_with : [libudev_core,
2439 dependencies : [threads,
2444 install_rpath : udev_rpath,
2446 install_dir : rootbindir)
2447 public_programs += [exe]
2449 executable('systemd-shutdown',
2450 systemd_shutdown_sources,
2451 include_directories : includes,
2452 link_with : [libshared],
2453 dependencies : [libmount],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootlibexecdir)
2458 executable('systemd-update-done',
2459 'src/update-done/update-done.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2466 executable('systemd-update-utmp',
2467 'src/update-utmp/update-utmp.c',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 dependencies : [libaudit],
2471 install_rpath : rootlibexecdir,
2473 install_dir : rootlibexecdir)
2475 if conf.get('HAVE_KMOD') == 1
2476 executable('systemd-modules-load',
2477 'src/modules-load/modules-load.c',
2478 include_directories : includes,
2479 link_with : [libshared],
2480 dependencies : [libkmod],
2481 install_rpath : rootlibexecdir,
2483 install_dir : rootlibexecdir)
2485 meson.add_install_script('sh', '-c',
2486 mkdir_p.format(modulesloaddir))
2487 meson.add_install_script('sh', '-c',
2488 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2491 exe = executable('systemd-nspawn',
2492 systemd_nspawn_sources,
2493 'src/core/mount-setup.c', # FIXME: use a variable?
2494 'src/core/mount-setup.h',
2495 'src/core/loopback-setup.c',
2496 'src/core/loopback-setup.h',
2497 include_directories : includes,
2498 link_with : [libnspawn_core,
2500 dependencies : [libblkid],
2501 install_rpath : rootlibexecdir,
2503 public_programs += [exe]
2505 if conf.get('ENABLE_NETWORKD') == 1
2506 executable('systemd-networkd',
2507 systemd_networkd_sources,
2508 include_directories : includes,
2509 link_with : [libnetworkd_core,
2513 dependencies : [threads],
2514 install_rpath : rootlibexecdir,
2516 install_dir : rootlibexecdir)
2518 executable('systemd-networkd-wait-online',
2519 systemd_networkd_wait_online_sources,
2520 include_directories : includes,
2521 link_with : [libnetworkd_core,
2523 install_rpath : rootlibexecdir,
2525 install_dir : rootlibexecdir)
2527 exe = executable('networkctl',
2529 include_directories : includes,
2530 link_with : [libsystemd_network,
2532 install_rpath : rootlibexecdir,
2534 install_dir : rootbindir)
2535 public_programs += [exe]
2538 executable('systemd-sulogin-shell',
2539 ['src/sulogin-shell/sulogin-shell.c'],
2540 include_directories : includes,
2541 link_with : [libshared],
2542 install_rpath : rootlibexecdir,
2544 install_dir : rootlibexecdir)
2546 ############################################################
2548 foreach tuple : tests
2550 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2551 dependencies = tuple[2]
2552 condition = tuple.length() >= 4 ? tuple[3] : ''
2553 type = tuple.length() >= 5 ? tuple[4] : ''
2554 defs = tuple.length() >= 6 ? tuple[5] : []
2555 incs = tuple.length() >= 7 ? tuple[6] : includes
2558 name = sources[0].split('/')[-1].split('.')[0]
2559 if type.startswith('timeout=')
2560 timeout = type.split('=')[1].to_int()
2563 if want_tests == 'false'
2564 message('Not compiling @0@ because tests is set to false'.format(name))
2565 elif condition == '' or conf.get(condition) == 1
2569 include_directories : incs,
2570 link_with : link_with,
2571 dependencies : dependencies,
2573 install_rpath : rootlibexecdir,
2574 install : install_tests,
2575 install_dir : join_paths(testsdir, type))
2578 message('@0@ is a manual test'.format(name))
2579 elif type == 'unsafe' and want_tests != 'unsafe'
2580 message('@0@ is an unsafe test'.format(name))
2587 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2592 'test-libsystemd-sym',
2593 test_libsystemd_sym_c,
2594 include_directories : includes,
2595 link_with : [libsystemd],
2596 install : install_tests,
2597 install_dir : testsdir)
2598 test('test-libsystemd-sym', exe)
2601 'test-libsystemd-static-sym',
2602 test_libsystemd_sym_c,
2603 include_directories : includes,
2604 link_with : [install_libsystemd_static],
2605 dependencies : [threads], # threads is already included in dependencies on the library,
2606 # but does not seem to get propagated. Add here as a work-around.
2607 build_by_default : static_libsystemd_pic,
2608 install : install_tests and static_libsystemd_pic,
2609 install_dir : testsdir)
2610 if static_libsystemd_pic
2611 test('test-libsystemd-static-sym', exe)
2617 include_directories : includes,
2618 c_args : ['-Wno-deprecated-declarations'],
2619 link_with : [libudev],
2620 install : install_tests,
2621 install_dir : testsdir)
2622 test('test-libudev-sym', exe)
2625 'test-libudev-static-sym',
2627 include_directories : includes,
2628 c_args : ['-Wno-deprecated-declarations'],
2629 link_with : [install_libudev_static],
2630 build_by_default : static_libudev_pic,
2631 install : install_tests and static_libudev_pic,
2632 install_dir : testsdir)
2633 if static_libudev_pic
2634 test('test-libudev-static-sym', exe)
2637 ############################################################
2641 foreach tuple : fuzzers
2643 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2644 dependencies = tuple[2]
2645 defs = tuple.length() >= 4 ? tuple[3] : []
2646 incs = tuple.length() >= 5 ? tuple[4] : includes
2649 dependencies += fuzzing_engine
2651 sources += 'src/fuzz/fuzz-main.c'
2654 name = sources[0].split('/')[-1].split('.')[0]
2656 fuzzer_exes += executable(
2659 include_directories : [incs, include_directories('src/fuzz')],
2660 link_with : link_with,
2661 dependencies : dependencies,
2666 run_target('fuzzers',
2667 depends : fuzzer_exes,
2670 ############################################################
2672 make_directive_index_py = find_program('tools/make-directive-index.py')
2673 make_man_index_py = find_program('tools/make-man-index.py')
2674 xml_helper_py = find_program('tools/xml_helper.py')
2675 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2679 subdir('sysusers.d')
2680 subdir('tmpfiles.d')
2685 subdir('shell-completion/bash')
2686 subdir('shell-completion/zsh')
2687 subdir('doc/sysvinit')
2688 subdir('doc/var-log')
2690 # FIXME: figure out if the warning is true:
2691 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2692 install_subdir('factory/etc',
2693 install_dir : factorydir)
2696 install_data('xorg/50-systemd-user.sh',
2697 install_dir : xinitrcdir)
2698 install_data('modprobe.d/systemd.conf',
2699 install_dir : modprobedir)
2700 install_data('LICENSE.GPL2',
2705 'doc/DISTRO_PORTING',
2706 'doc/ENVIRONMENT.md',
2708 'doc/TRANSIENT-SETTINGS.md',
2711 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2712 install_dir : docdir)
2714 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2715 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2717 ############################################################
2719 meson_check_help = find_program('tools/meson-check-help.sh')
2721 foreach exec : public_programs
2722 name = exec.full_path().split('/')[-1]
2723 test('check-help-' + name,
2725 args : [exec.full_path()])
2728 ############################################################
2730 # Enable tests for all supported sanitizers
2731 foreach tuple : sanitizers
2732 sanitizer = tuple[0]
2735 have = run_command(check_compilation_sh,
2736 cc.cmd_array(), '-x', 'c',
2737 '-fsanitize=@0@'.format(sanitizer),
2738 '-include', link_test_c).returncode() == 0
2739 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2743 foreach p : fuzz_regression_tests
2744 b = p.split('/')[-2]
2745 c = p.split('/')[-1]
2747 name = '@0@:@1@'.format(b, sanitizer)
2750 if want_tests == 'false'
2751 message('Not compiling @0@ because tests is set to false'.format(name))
2753 exe = custom_target(
2757 command : [env, 'ln', '-fs',
2758 join_paths(build.full_path(), b),
2760 build_by_default : true)
2762 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2767 if want_tests != 'false' and slow_tests
2768 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2770 args : [exe.full_path(),
2771 join_paths(meson.source_root(),
2772 'test/fuzz-regressions',
2780 ############################################################
2783 all_files = run_command(
2785 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2788 all_files = files(all_files.stdout().split())
2793 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2796 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2800 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2803 command : [meson_git_contrib_sh])
2807 git_head = run_command(
2809 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2810 'rev-parse', 'HEAD']).stdout().strip()
2811 git_head_short = run_command(
2813 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2814 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2818 command : ['git', 'archive',
2819 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2821 '--prefix', 'systemd-@0@/'.format(git_head),
2825 ############################################################
2827 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2830 depends : [man, libsystemd, libudev],
2831 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2833 ############################################################
2836 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2838 'split /usr: @0@'.format(split_usr),
2839 'split bin-sbin: @0@'.format(split_bin),
2840 'prefix directory: @0@'.format(prefixdir),
2841 'rootprefix directory: @0@'.format(rootprefixdir),
2842 'sysconf directory: @0@'.format(sysconfdir),
2843 'include directory: @0@'.format(includedir),
2844 'lib directory: @0@'.format(libdir),
2845 'rootlib directory: @0@'.format(rootlibdir),
2846 'SysV init scripts: @0@'.format(sysvinit_path),
2847 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2848 'PAM modules directory: @0@'.format(pamlibdir),
2849 'PAM configuration directory: @0@'.format(pamconfdir),
2850 'RPM macros directory: @0@'.format(rpmmacrosdir),
2851 'modprobe.d directory: @0@'.format(modprobedir),
2852 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2853 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2854 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2855 'bash completions directory: @0@'.format(bashcompletiondir),
2856 'zsh completions directory: @0@'.format(zshcompletiondir),
2857 'extra start script: @0@'.format(get_option('rc-local')),
2858 'extra stop script: @0@'.format(get_option('halt-local')),
2859 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2860 get_option('debug-tty')),
2861 'TTY GID: @0@'.format(tty_gid),
2862 'users GID: @0@'.format(users_gid),
2863 'maximum system UID: @0@'.format(system_uid_max),
2864 'maximum system GID: @0@'.format(system_gid_max),
2865 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2866 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2867 'minimum container UID base: @0@'.format(container_uid_base_min),
2868 'maximum container UID base: @0@'.format(container_uid_base_max),
2869 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2870 'render group access mode: @0@'.format(get_option('group-render-mode')),
2871 'certificate root directory: @0@'.format(get_option('certificate-root')),
2872 'support URL: @0@'.format(support_url),
2873 'nobody user name: @0@'.format(nobody_user),
2874 'nobody group name: @0@'.format(nobody_group),
2875 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2876 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2878 'default DNSSEC mode: @0@'.format(default_dnssec),
2879 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2880 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2881 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2883 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2884 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2886 'default DNS servers: @0@'.format(alt_dns_servers),
2887 'default NTP servers: @0@'.format(alt_ntp_servers)]
2889 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2890 '@@0@'.format(time_epoch)).stdout().strip()
2892 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2895 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2896 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2897 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2899 if conf.get('ENABLE_EFI') == 1
2901 'efi arch: @0@'.format(efi_arch)]
2905 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2906 'EFI CC @0@'.format(efi_cc),
2907 'EFI lib directory: @0@'.format(efi_libdir),
2908 'EFI lds directory: @0@'.format(efi_ldsdir),
2909 'EFI include directory: @0@'.format(efi_incdir)]
2964 ['legacy pkla', install_polkit_pkla],
2966 ['gnu-efi', have_gnu_efi],
2973 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2976 ['man pages', want_man],
2977 ['html pages', want_html],
2978 ['man page indices', want_man and have_lxml],
2983 ['adm group', get_option('adm-group')],
2984 ['wheel group', get_option('wheel-group')],
2987 ['debug mmap cache'],
2988 ['valgrind', conf.get('VALGRIND') == 1],
2991 if tuple.length() >= 2
2994 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2995 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2996 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3001 missing += [tuple[0]]
3007 'enabled features: @0@'.format(', '.join(found)),
3009 'disabled features: @0@'.format(', '.join(missing)),
3011 message('\n '.join(status))
3013 if rootprefixdir != rootprefix_default
3015 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3016 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3017 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))