1 # SPDX-License-Identifier: LGPL-2.1+
3 # Copyright 2017 Zbigniew Jędrzejewski-Szmek
5 project('systemd', 'c',
14 meson_version : '>= 0.44',
17 libsystemd_version = '0.22.0'
18 libudev_version = '1.6.10'
20 # We need the same data in two 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())
32 #####################################################################
34 # Try to install the git pre-commit hook
35 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
36 if git_hook.returncode() == 0
37 message(git_hook.stdout().strip())
40 #####################################################################
42 if get_option('split-usr') == 'auto'
43 split_usr = run_command('test', '-L', '/bin').returncode() != 0
45 split_usr = get_option('split-usr') == 'true'
47 conf.set10('HAVE_SPLIT_USR', split_usr,
48 description : '/usr/bin and /bin directories are separate')
50 if get_option('split-bin') == 'auto'
51 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
53 split_bin = get_option('split-bin') == 'true'
55 conf.set10('HAVE_SPLIT_BIN', split_bin,
56 description : 'bin and sbin directories are separate')
58 rootprefixdir = get_option('rootprefix')
59 # Unusual rootprefixdir values are used by some distros
60 # (see https://github.com/systemd/systemd/pull/7461).
61 rootprefix_default = split_usr ? '/' : '/usr'
62 if rootprefixdir == ''
63 rootprefixdir = rootprefix_default
66 sysvinit_path = get_option('sysvinit-path')
67 sysvrcnd_path = get_option('sysvrcnd-path')
68 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
69 description : 'SysV init scripts and rcN.d links are supported')
71 # join_paths ignore the preceding arguments if an absolute component is
72 # encountered, so this should canonicalize various paths when they are
73 # absolute or relative.
74 prefixdir = get_option('prefix')
75 if not prefixdir.startswith('/')
76 error('Prefix is not absolute: "@0@"'.format(prefixdir))
78 bindir = join_paths(prefixdir, get_option('bindir'))
79 libdir = join_paths(prefixdir, get_option('libdir'))
80 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
81 includedir = join_paths(prefixdir, get_option('includedir'))
82 datadir = join_paths(prefixdir, get_option('datadir'))
83 localstatedir = join_paths('/', get_option('localstatedir'))
85 rootbindir = join_paths(rootprefixdir, 'bin')
86 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
87 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
89 rootlibdir = get_option('rootlibdir')
91 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
94 # Dirs of external packages
95 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
96 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
97 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
98 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
99 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
100 varlogdir = join_paths(localstatedir, 'log')
101 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
102 rpmmacrosdir = get_option('rpmmacrosdir')
103 if rpmmacrosdir != 'no'
104 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
106 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
109 pkgdatadir = join_paths(datadir, 'systemd')
110 environmentdir = join_paths(prefixdir, 'lib/environment.d')
111 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
112 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
113 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
114 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
115 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
116 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
117 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
118 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
119 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
120 pkgincludedir = join_paths(includedir, 'systemd')
121 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
122 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
123 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
124 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
125 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
126 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
127 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
128 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
129 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
130 udevhomedir = udevlibexecdir
131 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
132 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
133 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
134 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
135 factorydir = join_paths(datadir, 'factory')
136 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
137 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
138 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
139 catalogstatedir = join_paths(systemdstatedir, 'catalog')
140 randomseeddir = join_paths(localstatedir, 'lib/systemd')
142 docdir = get_option('docdir')
144 docdir = join_paths(datadir, 'doc/systemd')
147 dbuspolicydir = get_option('dbuspolicydir')
148 if dbuspolicydir == ''
149 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
152 dbussessionservicedir = get_option('dbussessionservicedir')
153 if dbussessionservicedir == ''
154 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
157 dbussystemservicedir = get_option('dbussystemservicedir')
158 if dbussystemservicedir == ''
159 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
162 pamlibdir = get_option('pamlibdir')
164 pamlibdir = join_paths(rootlibdir, 'security')
167 pamconfdir = get_option('pamconfdir')
169 pamconfdir = join_paths(sysconfdir, 'pam.d')
172 memory_accounting_default = get_option('memory-accounting-default')
174 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
175 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
176 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
177 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
178 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
179 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
180 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
182 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
184 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
185 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
186 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
187 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
188 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
189 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
190 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
191 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
192 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
193 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
194 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
195 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
196 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
197 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
198 conf.set_quoted('ROOTPREFIX', rootprefixdir)
199 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
200 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
201 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
202 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
203 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
204 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
205 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
206 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
207 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
208 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
209 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
210 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
211 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
212 conf.set_quoted('LIBDIR', libdir)
213 conf.set_quoted('ROOTLIBDIR', rootlibdir)
214 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
215 conf.set_quoted('BOOTLIBDIR', bootlibdir)
216 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
217 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
218 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
219 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
220 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
221 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
222 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
223 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
225 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
226 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
228 substs.set('prefix', prefixdir)
229 substs.set('exec_prefix', prefixdir)
230 substs.set('libdir', libdir)
231 substs.set('rootlibdir', rootlibdir)
232 substs.set('includedir', includedir)
233 substs.set('pkgsysconfdir', pkgsysconfdir)
234 substs.set('bindir', bindir)
235 substs.set('rootbindir', rootbindir)
236 substs.set('rootlibexecdir', rootlibexecdir)
237 substs.set('systemunitdir', systemunitdir)
238 substs.set('userunitdir', userunitdir)
239 substs.set('systempresetdir', systempresetdir)
240 substs.set('userpresetdir', userpresetdir)
241 substs.set('udevhwdbdir', udevhwdbdir)
242 substs.set('udevrulesdir', udevrulesdir)
243 substs.set('udevlibexecdir', udevlibexecdir)
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('systemgeneratordir', systemgeneratordir)
251 substs.set('usergeneratordir', usergeneratordir)
252 substs.set('systemenvgeneratordir', systemenvgeneratordir)
253 substs.set('userenvgeneratordir', userenvgeneratordir)
254 substs.set('systemshutdowndir', systemshutdowndir)
255 substs.set('systemsleepdir', systemsleepdir)
256 substs.set('VARLOGDIR', varlogdir)
257 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
258 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
259 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
260 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
261 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
262 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
263 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
264 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
266 #####################################################################
268 cc = meson.get_compiler('c')
269 pkgconfig = import('pkgconfig')
270 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
271 meson_build_sh = find_program('tools/meson-build.sh')
273 if get_option('tests') != 'false'
274 cxx = find_program('c++', required : false)
276 # Used only for tests
281 want_ossfuzz = get_option('oss-fuzz')
282 want_libfuzzer = get_option('llvm-fuzz')
283 fuzzer_build = want_ossfuzz or want_libfuzzer
284 if want_ossfuzz and want_libfuzzer
285 error('only one of oss-fuzz and llvm-fuzz can be specified')
288 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
291 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
294 possible_cc_flags = [
298 '-Wmissing-include-dirs',
299 '-Wold-style-definition',
302 '-Wdeclaration-after-statement',
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',
324 '-fdiagnostics-show-option',
325 '-fno-strict-aliasing',
326 '-fvisibility=hidden',
328 '-fstack-protector-strong',
329 '--param=ssp-buffer-size=4',
332 # --as-needed and --no-undefined are provided by meson by default,
333 # run mesonconf to see what is enabled
334 possible_link_flags = [
339 # the oss-fuzz fuzzers are not built with -fPIE, so don't
340 # enable it when we are linking against them
342 possible_cc_flags += '-fPIE'
343 possible_link_flags += '-pie'
346 if cc.get_id() == 'clang'
347 possible_cc_flags += [
348 '-Wno-typedef-redefinition',
349 '-Wno-gnu-variable-sized-type-not-at-end',
353 if get_option('buildtype') != 'debug'
354 possible_cc_flags += [
355 '-ffunction-sections',
359 possible_link_flags += '-Wl,--gc-sections'
362 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
364 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
365 # arguments, just emits a warnings. So test for the "positive" version instead.
366 foreach arg : ['unused-parameter',
367 'missing-field-initializers',
370 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
372 if cc.has_argument('-W' + arg)
373 add_project_arguments('-Wno-' + arg, language : 'c')
379 #include <inttypes.h>
380 typedef uint64_t usec_t;
381 usec_t now(clockid_t clock);
386 ''', name : '-Werror=shadow with local shadowing')
387 add_project_arguments('-Werror=shadow', language : 'c')
390 link_test_c = files('tools/meson-link-test.c')
392 foreach arg : possible_link_flags
393 have = run_command(check_compilation_sh,
394 cc.cmd_array(), '-x', 'c', arg,
395 '-include', link_test_c).returncode() == 0
396 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
398 add_project_link_arguments(arg, language : 'c')
402 cpp = ' '.join(cc.cmd_array()) + ' -E'
404 #####################################################################
405 # compilation result tests
407 conf.set('_GNU_SOURCE', true)
408 conf.set('__SANE_USERSPACE_TYPES__', true)
410 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
411 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
412 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
416 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
420 #include <linux/ethtool.h>
421 #include <linux/fib_rules.h>
422 #include <linux/stat.h>
423 #include <sys/stat.h>
425 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
427 foreach decl : ['char16_t',
430 'struct ethtool_link_settings',
431 'struct fib_rule_uid_range',
435 # We get -1 if the size cannot be determined
436 have = cc.sizeof(decl, prefix : decl_headers) > 0
437 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
440 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
441 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
442 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
443 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
444 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
445 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
446 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
447 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
448 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
449 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
450 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
451 # if_tunnel.h is buggy and cannot be included on its own
452 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
453 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
454 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
455 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
456 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
457 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
458 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
459 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
460 ['NDA_IFINDEX', 'linux/neighbour.h'],
461 ['IFA_FLAGS', 'linux/if_addr.h'],
462 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
463 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
464 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
466 prefix = decl.length() > 2 ? decl[2] : ''
467 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
468 conf.set10('HAVE_' + decl[0], have)
471 foreach ident : ['secure_getenv', '__secure_getenv']
472 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
476 ['memfd_create', '''#include <sys/mman.h>'''],
477 ['gettid', '''#include <sys/types.h>
478 #include <unistd.h>'''],
479 ['pivot_root', '''#include <stdlib.h>
480 #include <unistd.h>'''], # no known header declares pivot_root
481 ['name_to_handle_at', '''#include <sys/types.h>
482 #include <sys/stat.h>
483 #include <fcntl.h>'''],
484 ['setns', '''#include <sched.h>'''],
485 ['renameat2', '''#include <stdio.h>
486 #include <fcntl.h>'''],
487 ['kcmp', '''#include <linux/kcmp.h>'''],
488 ['keyctl', '''#include <sys/types.h>
489 #include <keyutils.h>'''],
490 ['copy_file_range', '''#include <sys/syscall.h>
491 #include <unistd.h>'''],
492 ['bpf', '''#include <sys/syscall.h>
493 #include <unistd.h>'''],
494 ['statx', '''#include <sys/types.h>
495 #include <sys/stat.h>
496 #include <unistd.h>'''],
497 ['explicit_bzero' , '''#include <string.h>'''],
498 ['reallocarray', '''#include <malloc.h>'''],
501 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
502 conf.set10('HAVE_' + ident[0].to_upper(), have)
505 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
506 conf.set10('USE_SYS_RANDOM_H', true)
507 conf.set10('HAVE_GETRANDOM', true)
509 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
510 conf.set10('USE_SYS_RANDOM_H', false)
511 conf.set10('HAVE_GETRANDOM', have)
514 #####################################################################
516 sed = find_program('sed')
517 awk = find_program('awk')
518 m4 = find_program('m4')
519 stat = find_program('stat')
520 git = find_program('git', required : false)
521 env = find_program('env')
522 perl = find_program('perl', required : false)
524 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
525 mkdir_p = 'mkdir -p $DESTDIR/@0@'
526 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
527 splash_bmp = files('test/splash.bmp')
529 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
530 # /usr/sbin, /sbin, and fall back to the default from middle column.
531 progs = [['quotaon', '/usr/sbin/quotaon' ],
532 ['quotacheck', '/usr/sbin/quotacheck' ],
533 ['kmod', '/usr/bin/kmod' ],
534 ['kexec', '/usr/sbin/kexec' ],
535 ['sulogin', '/usr/sbin/sulogin' ],
536 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
537 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
538 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
539 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
542 path = get_option(prog[0] + '-path')
544 message('Using @1@ for @0@'.format(prog[0], path))
546 exe = find_program(prog[0],
547 '/usr/sbin/' + prog[0],
550 path = exe.found() ? exe.path() : prog[1]
552 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
553 conf.set_quoted(name, path)
554 substs.set(name, path)
557 conf.set_quoted('TELINIT', get_option('telinit-path'))
559 if run_command('ln', '--relative', '--help').returncode() != 0
560 error('ln does not support --relative (added in coreutils 8.16)')
563 ############################################################
565 gperf = find_program('gperf')
567 gperf_test_format = '''
569 const char * in_word_set(const char *, @0@);
572 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
573 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
574 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
575 if cc.compiles(gperf_test)
576 gperf_len_type = 'size_t'
578 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
579 if cc.compiles(gperf_test)
580 gperf_len_type = 'unsigned'
582 error('unable to determine gperf len type')
585 message('gperf len type is @0@'.format(gperf_len_type))
586 conf.set('GPERF_LEN_TYPE', gperf_len_type,
587 description : 'The type of gperf "len" parameter')
589 ############################################################
591 if not cc.has_header('sys/capability.h')
592 error('POSIX caps headers not found')
594 foreach header : ['crypt.h',
597 'linux/vm_sockets.h',
599 'valgrind/memcheck.h',
600 'valgrind/valgrind.h',
603 conf.set10('HAVE_' + header.underscorify().to_upper(),
604 cc.has_header(header))
607 ############################################################
609 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
610 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
611 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
613 default_hierarchy = get_option('default-hierarchy')
614 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
615 description : 'default cgroup hierarchy as string')
616 if default_hierarchy == 'legacy'
617 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
618 elif default_hierarchy == 'hybrid'
619 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
621 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
624 time_epoch = get_option('time-epoch')
627 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
629 time_epoch = time_epoch.to_int()
630 conf.set('TIME_EPOCH', time_epoch)
632 system_uid_max = get_option('system-uid-max')
633 if system_uid_max == ''
634 system_uid_max = run_command(
636 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
637 '/etc/login.defs').stdout().strip()
638 if system_uid_max == ''
639 system_uid_max = '999'
642 system_uid_max = system_uid_max.to_int()
643 conf.set('SYSTEM_UID_MAX', system_uid_max)
644 substs.set('systemuidmax', system_uid_max)
645 message('maximum system UID is @0@'.format(system_uid_max))
647 system_gid_max = get_option('system-gid-max')
648 if system_gid_max == ''
649 system_gid_max = run_command(
651 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
652 '/etc/login.defs').stdout().strip()
653 if system_gid_max == ''
654 system_gid_max = '999'
657 system_gid_max = system_gid_max.to_int()
658 conf.set('SYSTEM_GID_MAX', system_gid_max)
659 substs.set('systemgidmax', system_gid_max)
660 message('maximum system GID is @0@'.format(system_gid_max))
662 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
663 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
664 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
665 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
666 substs.set('dynamicuidmin', dynamic_uid_min)
667 substs.set('dynamicuidmax', dynamic_uid_max)
669 container_uid_base_min = get_option('container-uid-base-min').to_int()
670 container_uid_base_max = get_option('container-uid-base-max').to_int()
671 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
672 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
673 substs.set('containeruidbasemin', container_uid_base_min)
674 substs.set('containeruidbasemax', container_uid_base_max)
676 nobody_user = get_option('nobody-user')
677 nobody_group = get_option('nobody-group')
679 getent_result = run_command('getent', 'passwd', '65534')
680 if getent_result.returncode() == 0
681 name = getent_result.stdout().split(':')[0]
682 if name != nobody_user
684 '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) +
685 'Your build will result in an user table setup that is incompatible with the local system.')
688 id_result = run_command('id', '-u', nobody_user)
689 if id_result.returncode() == 0
690 id = id_result.stdout().to_int()
693 '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) +
694 'Your build will result in an user table setup that is incompatible with the local system.')
698 getent_result = run_command('getent', 'group', '65534')
699 if getent_result.returncode() == 0
700 name = getent_result.stdout().split(':')[0]
701 if name != nobody_group
703 '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) +
704 'Your build will result in an group table setup that is incompatible with the local system.')
707 id_result = run_command('id', '-g', nobody_group)
708 if id_result.returncode() == 0
709 id = id_result.stdout().to_int()
712 '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) +
713 'Your build will result in an group table setup that is incompatible with the local system.')
716 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
718 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
719 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
722 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
723 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
724 substs.set('NOBODY_USER_NAME', nobody_user)
725 substs.set('NOBODY_GROUP_NAME', nobody_group)
727 tty_gid = get_option('tty-gid')
728 conf.set('TTY_GID', tty_gid)
729 substs.set('TTY_GID', tty_gid)
731 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
732 if get_option('users-gid') != ''
733 users_gid = get_option('users-gid').to_int()
737 substs.set('USERS_GID', users_gid)
739 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
740 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
742 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
743 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
745 kill_user_processes = get_option('default-kill-user-processes')
746 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
747 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
748 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
750 dns_servers = get_option('dns-servers')
751 conf.set_quoted('DNS_SERVERS', dns_servers)
752 substs.set('DNS_SERVERS', dns_servers)
754 ntp_servers = get_option('ntp-servers')
755 conf.set_quoted('NTP_SERVERS', ntp_servers)
756 substs.set('NTP_SERVERS', ntp_servers)
758 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
760 substs.set('SUSHELL', get_option('debug-shell'))
761 substs.set('DEBUGTTY', get_option('debug-tty'))
763 enable_debug_hashmap = false
764 enable_debug_mmap_cache = false
765 foreach name : get_option('debug')
767 enable_debug_hashmap = true
768 elif name == 'mmap-cache'
769 enable_debug_mmap_cache = true
771 message('unknown debug option "@0@", ignoring'.format(name))
774 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
775 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
777 conf.set10('VALGRIND', get_option('valgrind'))
779 #####################################################################
781 threads = dependency('threads')
782 librt = cc.find_library('rt')
783 libm = cc.find_library('m')
784 libdl = cc.find_library('dl')
785 libcrypt = cc.find_library('crypt')
787 libcap = dependency('libcap', required : false)
788 if not libcap.found()
789 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
790 libcap = cc.find_library('cap')
793 libmount = dependency('mount',
794 version : fuzzer_build ? '>= 0' : '>= 2.30')
796 want_seccomp = get_option('seccomp')
797 if want_seccomp != 'false' and not fuzzer_build
798 libseccomp = dependency('libseccomp',
799 version : '>= 2.3.1',
800 required : want_seccomp == 'true')
801 have = libseccomp.found()
806 conf.set10('HAVE_SECCOMP', have)
808 want_selinux = get_option('selinux')
809 if want_selinux != 'false' and not fuzzer_build
810 libselinux = dependency('libselinux',
811 version : '>= 2.1.9',
812 required : want_selinux == 'true')
813 have = libselinux.found()
818 conf.set10('HAVE_SELINUX', have)
820 want_apparmor = get_option('apparmor')
821 if want_apparmor != 'false' and not fuzzer_build
822 libapparmor = dependency('libapparmor',
823 required : want_apparmor == 'true')
824 have = libapparmor.found()
829 conf.set10('HAVE_APPARMOR', have)
831 smack_run_label = get_option('smack-run-label')
832 if smack_run_label != ''
833 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
836 want_polkit = get_option('polkit')
837 install_polkit = false
838 install_polkit_pkla = false
839 if want_polkit != 'false' and not fuzzer_build
840 install_polkit = true
842 libpolkit = dependency('polkit-gobject-1',
844 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
845 message('Old polkit detected, will install pkla files')
846 install_polkit_pkla = true
849 conf.set10('ENABLE_POLKIT', install_polkit)
851 want_acl = get_option('acl')
852 if want_acl != 'false' and not fuzzer_build
853 libacl = cc.find_library('acl', required : want_acl == 'true')
854 have = libacl.found()
859 conf.set10('HAVE_ACL', have)
861 want_audit = get_option('audit')
862 if want_audit != 'false' and not fuzzer_build
863 libaudit = dependency('audit', required : want_audit == 'true')
864 have = libaudit.found()
869 conf.set10('HAVE_AUDIT', have)
871 want_blkid = get_option('blkid')
872 if want_blkid != 'false' and not fuzzer_build
873 libblkid = dependency('blkid', required : want_blkid == 'true')
874 have = libblkid.found()
879 conf.set10('HAVE_BLKID', have)
881 want_kmod = get_option('kmod')
882 if want_kmod != 'false' and not fuzzer_build
883 libkmod = dependency('libkmod',
885 required : want_kmod == 'true')
886 have = libkmod.found()
891 conf.set10('HAVE_KMOD', have)
893 want_pam = get_option('pam')
894 if want_pam != 'false' and not fuzzer_build
895 libpam = cc.find_library('pam', required : want_pam == 'true')
896 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
897 have = libpam.found() and libpam_misc.found()
903 conf.set10('HAVE_PAM', have)
905 want_microhttpd = get_option('microhttpd')
906 if want_microhttpd != 'false' and not fuzzer_build
907 libmicrohttpd = dependency('libmicrohttpd',
908 version : '>= 0.9.33',
909 required : want_microhttpd == 'true')
910 have = libmicrohttpd.found()
915 conf.set10('HAVE_MICROHTTPD', have)
917 want_libcryptsetup = get_option('libcryptsetup')
918 if want_libcryptsetup != 'false' and not fuzzer_build
919 libcryptsetup = dependency('libcryptsetup',
920 version : '>= 1.6.0',
921 required : want_libcryptsetup == 'true')
922 have = libcryptsetup.found()
927 conf.set10('HAVE_LIBCRYPTSETUP', have)
929 want_libcurl = get_option('libcurl')
930 if want_libcurl != 'false' and not fuzzer_build
931 libcurl = dependency('libcurl',
932 version : '>= 7.32.0',
933 required : want_libcurl == 'true')
934 have = libcurl.found()
939 conf.set10('HAVE_LIBCURL', have)
941 want_libidn = get_option('libidn')
942 want_libidn2 = get_option('libidn2')
943 if want_libidn == 'true' and want_libidn2 == 'true'
944 error('libidn and libidn2 cannot be requested simultaneously')
947 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
948 libidn = dependency('libidn',
949 required : want_libidn == 'true')
950 have = libidn.found()
955 conf.set10('HAVE_LIBIDN', have)
956 if not have and want_libidn2 != 'false' and not fuzzer_build
957 # libidn is used for both libidn and libidn2 objects
958 libidn = dependency('libidn2',
959 required : want_libidn2 == 'true')
960 have = libidn.found()
964 conf.set10('HAVE_LIBIDN2', have)
966 want_libiptc = get_option('libiptc')
967 if want_libiptc != 'false' and not fuzzer_build
968 libiptc = dependency('libiptc',
969 required : want_libiptc == 'true')
970 have = libiptc.found()
975 conf.set10('HAVE_LIBIPTC', have)
977 want_qrencode = get_option('qrencode')
978 if want_qrencode != 'false' and not fuzzer_build
979 libqrencode = dependency('libqrencode',
980 required : want_qrencode == 'true')
981 have = libqrencode.found()
986 conf.set10('HAVE_QRENCODE', have)
988 want_gcrypt = get_option('gcrypt')
989 if want_gcrypt != 'false' and not fuzzer_build
990 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
991 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
992 have = libgcrypt.found() and libgpg_error.found()
997 # link to neither of the libs if one is not found
1001 conf.set10('HAVE_GCRYPT', have)
1003 want_gnutls = get_option('gnutls')
1004 if want_gnutls != 'false' and not fuzzer_build
1005 libgnutls = dependency('gnutls',
1006 version : '>= 3.1.4',
1007 required : want_gnutls == 'true')
1008 have = libgnutls.found()
1013 conf.set10('HAVE_GNUTLS', have)
1015 want_elfutils = get_option('elfutils')
1016 if want_elfutils != 'false' and not fuzzer_build
1017 libdw = dependency('libdw',
1018 required : want_elfutils == 'true')
1019 have = libdw.found()
1024 conf.set10('HAVE_ELFUTILS', have)
1026 want_zlib = get_option('zlib')
1027 if want_zlib != 'false' and not fuzzer_build
1028 libz = dependency('zlib',
1029 required : want_zlib == 'true')
1035 conf.set10('HAVE_ZLIB', have)
1037 want_bzip2 = get_option('bzip2')
1038 if want_bzip2 != 'false' and not fuzzer_build
1039 libbzip2 = cc.find_library('bz2',
1040 required : want_bzip2 == 'true')
1041 have = libbzip2.found()
1046 conf.set10('HAVE_BZIP2', have)
1048 want_xz = get_option('xz')
1049 if want_xz != 'false' and not fuzzer_build
1050 libxz = dependency('liblzma',
1051 required : want_xz == 'true')
1052 have = libxz.found()
1057 conf.set10('HAVE_XZ', have)
1059 want_lz4 = get_option('lz4')
1060 if want_lz4 != 'false' and not fuzzer_build
1061 liblz4 = dependency('liblz4',
1062 required : want_lz4 == 'true')
1063 have = liblz4.found()
1068 conf.set10('HAVE_LZ4', have)
1070 want_xkbcommon = get_option('xkbcommon')
1071 if want_xkbcommon != 'false' and not fuzzer_build
1072 libxkbcommon = dependency('xkbcommon',
1073 version : '>= 0.3.0',
1074 required : want_xkbcommon == 'true')
1075 have = libxkbcommon.found()
1080 conf.set10('HAVE_XKBCOMMON', have)
1082 want_pcre2 = get_option('pcre2')
1083 if want_pcre2 != 'false'
1084 libpcre2 = dependency('libpcre2-8',
1085 required : want_pcre2 == 'true')
1086 have = libpcre2.found()
1091 conf.set10('HAVE_PCRE2', have)
1093 want_glib = get_option('glib')
1094 if want_glib != 'false' and not fuzzer_build
1095 libglib = dependency('glib-2.0',
1096 version : '>= 2.22.0',
1097 required : want_glib == 'true')
1098 libgobject = dependency('gobject-2.0',
1099 version : '>= 2.22.0',
1100 required : want_glib == 'true')
1101 libgio = dependency('gio-2.0',
1102 required : want_glib == 'true')
1103 have = libglib.found() and libgobject.found() and libgio.found()
1110 conf.set10('HAVE_GLIB', have)
1112 want_dbus = get_option('dbus')
1113 if want_dbus != 'false' and not fuzzer_build
1114 libdbus = dependency('dbus-1',
1115 version : '>= 1.3.2',
1116 required : want_dbus == 'true')
1117 have = libdbus.found()
1122 conf.set10('HAVE_DBUS', have)
1124 default_dnssec = get_option('default-dnssec')
1126 default_dnssec = 'no'
1128 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1129 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1130 default_dnssec = 'no'
1132 conf.set('DEFAULT_DNSSEC_MODE',
1133 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1134 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1136 want_importd = get_option('importd')
1137 if want_importd != 'false'
1138 have = (conf.get('HAVE_LIBCURL') == 1 and
1139 conf.get('HAVE_ZLIB') == 1 and
1140 conf.get('HAVE_BZIP2') == 1 and
1141 conf.get('HAVE_XZ') == 1 and
1142 conf.get('HAVE_GCRYPT') == 1)
1143 if want_importd == 'true' and not have
1144 error('importd support was requested, but dependencies are not available')
1149 conf.set10('ENABLE_IMPORTD', have)
1151 want_remote = get_option('remote')
1152 if want_remote != 'false'
1153 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1154 conf.get('HAVE_LIBCURL') == 1]
1155 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1156 # it's possible to build one without the other. Complain only if
1157 # support was explictly requested. The auxiliary files like sysusers
1158 # config should be installed when any of the programs are built.
1159 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1160 error('remote support was requested, but dependencies are not available')
1162 have = have_deps[0] or have_deps[1]
1166 conf.set10('ENABLE_REMOTE', have)
1168 foreach term : ['utmp',
1199 have = get_option(term)
1200 name = 'ENABLE_' + term.underscorify().to_upper()
1201 conf.set10(name, have)
1204 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1206 want_tests = get_option('tests')
1207 install_tests = get_option('install-tests')
1208 slow_tests = get_option('slow-tests')
1212 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1214 #####################################################################
1216 if get_option('efi')
1217 efi_arch = host_machine.cpu_family()
1219 if efi_arch == 'x86'
1220 EFI_MACHINE_TYPE_NAME = 'ia32'
1221 gnu_efi_arch = 'ia32'
1222 elif efi_arch == 'x86_64'
1223 EFI_MACHINE_TYPE_NAME = 'x64'
1224 gnu_efi_arch = 'x86_64'
1225 elif efi_arch == 'arm'
1226 EFI_MACHINE_TYPE_NAME = 'arm'
1227 gnu_efi_arch = 'arm'
1228 elif efi_arch == 'aarch64'
1229 EFI_MACHINE_TYPE_NAME = 'aa64'
1230 gnu_efi_arch = 'aarch64'
1232 EFI_MACHINE_TYPE_NAME = ''
1237 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1239 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1243 conf.set10('ENABLE_EFI', have)
1245 #####################################################################
1247 config_h = configure_file(
1248 output : 'config.h',
1249 configuration : conf)
1251 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1253 includes = include_directories('src/basic',
1259 'src/time-wait-sync',
1264 'src/libsystemd/sd-bus',
1265 'src/libsystemd/sd-device',
1266 'src/libsystemd/sd-hwdb',
1267 'src/libsystemd/sd-id128',
1268 'src/libsystemd/sd-netlink',
1269 'src/libsystemd/sd-network',
1270 'src/libsystemd-network',
1273 add_project_arguments('-include', 'config.h', language : 'c')
1277 subdir('src/systemd')
1279 subdir('src/libsystemd')
1280 subdir('src/libsystemd-network')
1281 subdir('src/journal')
1284 libjournal_core = static_library(
1286 libjournal_core_sources,
1288 include_directories : includes,
1291 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1292 libsystemd = shared_library(
1294 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1295 version : libsystemd_version,
1296 include_directories : includes,
1297 link_args : ['-shared',
1298 '-Wl,--version-script=' + libsystemd_sym_path],
1299 link_with : [libbasic,
1301 link_whole : [libsystemd_static,
1303 dependencies : [threads,
1307 link_depends : libsystemd_sym,
1309 install_dir : rootlibdir)
1311 static_libsystemd = get_option('static-libsystemd')
1312 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1314 install_libsystemd_static = static_library(
1317 journal_client_sources,
1319 basic_gcrypt_sources,
1320 include_directories : includes,
1321 build_by_default : static_libsystemd != 'false',
1322 install : static_libsystemd != 'false',
1323 install_dir : rootlibdir,
1324 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1325 dependencies : [threads,
1334 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1336 ############################################################
1338 # binaries that have --help and are intended for use by humans,
1339 # usually, but not always, installed in /bin.
1340 public_programs = []
1342 subdir('src/libudev')
1343 subdir('src/shared')
1346 subdir('src/network')
1348 subdir('src/analyze')
1349 subdir('src/journal-remote')
1350 subdir('src/coredump')
1351 subdir('src/hostname')
1352 subdir('src/import')
1353 subdir('src/kernel-install')
1354 subdir('src/locale')
1355 subdir('src/machine')
1356 subdir('src/nspawn')
1357 subdir('src/resolve')
1358 subdir('src/timedate')
1359 subdir('src/timesync')
1360 subdir('src/vconsole')
1361 subdir('src/boot/efi')
1368 ############################################################
1370 # only static linking apart from libdl, to make sure that the
1371 # module is linked to all libraries that it uses.
1372 test_dlopen = executable(
1375 include_directories : includes,
1376 link_with : [libbasic],
1377 dependencies : [libdl])
1379 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1380 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1381 ['mymachines', 'ENABLE_MACHINED'],
1382 ['resolve', 'ENABLE_RESOLVE']]
1384 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1388 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1389 version_script_arg = join_paths(meson.current_source_dir(), sym)
1391 nss = shared_library(
1393 'src/nss-@0@/nss-@0@.c'.format(module),
1395 include_directories : includes,
1396 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1397 link_args : ['-Wl,-z,nodelete',
1399 '-Wl,--version-script=' + version_script_arg,
1401 link_with : [libsystemd_static,
1403 dependencies : [threads,
1407 install_dir : rootlibdir)
1409 # We cannot use shared_module because it does not support version suffix.
1410 # Unfortunately shared_library insists on creating the symlink…
1411 meson.add_install_script('sh', '-c',
1412 'rm $DESTDIR@0@/libnss_@1@.so'
1413 .format(rootlibdir, module))
1415 test('dlopen-nss_' + module,
1417 args : [nss.full_path()]) # path to dlopen must include a slash
1421 ############################################################
1423 executable('systemd',
1425 include_directories : includes,
1426 link_with : [libcore,
1428 dependencies : [threads,
1434 install_rpath : rootlibexecdir,
1436 install_dir : rootlibexecdir)
1438 meson.add_install_script(meson_make_symlink,
1439 join_paths(rootlibexecdir, 'systemd'),
1440 join_paths(rootsbindir, 'init'))
1442 exe = executable('systemd-analyze',
1443 systemd_analyze_sources,
1444 include_directories : includes,
1445 link_with : [libcore,
1447 dependencies : [threads,
1453 install_rpath : rootlibexecdir,
1455 public_programs += [exe]
1457 executable('systemd-journald',
1458 systemd_journald_sources,
1459 include_directories : includes,
1460 link_with : [libjournal_core,
1462 dependencies : [threads,
1466 install_rpath : rootlibexecdir,
1468 install_dir : rootlibexecdir)
1470 exe = executable('systemd-cat',
1471 systemd_cat_sources,
1472 include_directories : includes,
1473 link_with : [libjournal_core,
1475 dependencies : [threads],
1476 install_rpath : rootlibexecdir,
1478 public_programs += [exe]
1480 exe = executable('journalctl',
1482 include_directories : includes,
1483 link_with : [libshared],
1484 dependencies : [threads,
1489 install_rpath : rootlibexecdir,
1491 install_dir : rootbindir)
1492 public_programs += [exe]
1494 executable('systemd-getty-generator',
1495 'src/getty-generator/getty-generator.c',
1496 include_directories : includes,
1497 link_with : [libshared],
1498 install_rpath : rootlibexecdir,
1500 install_dir : systemgeneratordir)
1502 executable('systemd-debug-generator',
1503 'src/debug-generator/debug-generator.c',
1504 include_directories : includes,
1505 link_with : [libshared],
1506 install_rpath : rootlibexecdir,
1508 install_dir : systemgeneratordir)
1510 executable('systemd-fstab-generator',
1511 'src/fstab-generator/fstab-generator.c',
1512 'src/core/mount-setup.c',
1513 include_directories : includes,
1514 link_with : [libshared],
1515 install_rpath : rootlibexecdir,
1517 install_dir : systemgeneratordir)
1519 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1520 executable('30-systemd-environment-d-generator',
1521 'src/environment-d-generator/environment-d-generator.c',
1522 include_directories : includes,
1523 link_with : [libshared],
1524 install_rpath : rootlibexecdir,
1526 install_dir : userenvgeneratordir)
1528 meson.add_install_script(meson_make_symlink,
1529 join_paths(sysconfdir, 'environment'),
1530 join_paths(environmentdir, '99-environment.conf'))
1533 if conf.get('ENABLE_HIBERNATE') == 1
1534 executable('systemd-hibernate-resume-generator',
1535 'src/hibernate-resume/hibernate-resume-generator.c',
1536 include_directories : includes,
1537 link_with : [libshared],
1538 install_rpath : rootlibexecdir,
1540 install_dir : systemgeneratordir)
1542 executable('systemd-hibernate-resume',
1543 'src/hibernate-resume/hibernate-resume.c',
1544 include_directories : includes,
1545 link_with : [libshared],
1546 install_rpath : rootlibexecdir,
1548 install_dir : rootlibexecdir)
1551 if conf.get('HAVE_BLKID') == 1
1552 executable('systemd-gpt-auto-generator',
1553 'src/gpt-auto-generator/gpt-auto-generator.c',
1554 'src/basic/blkid-util.h',
1555 include_directories : includes,
1556 link_with : [libshared],
1557 dependencies : libblkid,
1558 install_rpath : rootlibexecdir,
1560 install_dir : systemgeneratordir)
1562 exe = executable('systemd-dissect',
1563 'src/dissect/dissect.c',
1564 include_directories : includes,
1565 link_with : [libshared],
1566 install_rpath : rootlibexecdir,
1568 install_dir : rootlibexecdir)
1569 public_programs += [exe]
1572 if conf.get('ENABLE_RESOLVE') == 1
1573 executable('systemd-resolved',
1574 systemd_resolved_sources,
1575 include_directories : includes,
1576 link_with : [libshared,
1578 libsystemd_resolve_core],
1579 dependencies : [threads,
1583 install_rpath : rootlibexecdir,
1585 install_dir : rootlibexecdir)
1587 exe = executable('resolvectl',
1589 include_directories : includes,
1590 link_with : [libshared,
1592 libsystemd_resolve_core],
1593 dependencies : [threads,
1597 install_rpath : rootlibexecdir,
1599 public_programs += [exe]
1601 meson.add_install_script(meson_make_symlink,
1602 join_paths(bindir, 'resolvectl'),
1603 join_paths(rootsbindir, 'resolvconf'))
1605 meson.add_install_script(meson_make_symlink,
1606 join_paths(bindir, 'resolvectl'),
1607 join_paths(bindir, 'systemd-resolve'))
1610 if conf.get('ENABLE_LOGIND') == 1
1611 executable('systemd-logind',
1612 systemd_logind_sources,
1613 include_directories : includes,
1614 link_with : [liblogind_core,
1616 dependencies : [threads,
1618 install_rpath : rootlibexecdir,
1620 install_dir : rootlibexecdir)
1622 exe = executable('loginctl',
1624 include_directories : includes,
1625 link_with : [libshared],
1626 dependencies : [threads,
1629 install_rpath : rootlibexecdir,
1631 install_dir : rootbindir)
1632 public_programs += [exe]
1634 exe = executable('systemd-inhibit',
1635 'src/login/inhibit.c',
1636 include_directories : includes,
1637 link_with : [libshared],
1638 install_rpath : rootlibexecdir,
1640 install_dir : rootbindir)
1641 public_programs += [exe]
1643 if conf.get('HAVE_PAM') == 1
1644 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1645 pam_systemd = shared_library(
1649 include_directories : includes,
1650 link_args : ['-shared',
1651 '-Wl,--version-script=' + version_script_arg],
1652 link_with : [libsystemd_static,
1654 dependencies : [threads,
1657 link_depends : pam_systemd_sym,
1659 install_dir : pamlibdir)
1661 test('dlopen-pam_systemd',
1663 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1667 executable('systemd-user-runtime-dir',
1668 user_runtime_dir_sources,
1669 include_directories : includes,
1670 link_with : [libshared, liblogind_core],
1671 install_rpath : rootlibexecdir,
1673 install_dir : rootlibexecdir)
1675 if conf.get('HAVE_PAM') == 1
1676 executable('systemd-user-sessions',
1677 'src/user-sessions/user-sessions.c',
1678 include_directories : includes,
1679 link_with : [libshared],
1680 install_rpath : rootlibexecdir,
1682 install_dir : rootlibexecdir)
1685 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1686 exe = executable('bootctl',
1687 'src/boot/bootctl.c',
1688 include_directories : includes,
1689 link_with : [libshared],
1690 dependencies : [libblkid],
1691 install_rpath : rootlibexecdir,
1693 public_programs += [exe]
1696 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 dependencies : [threads],
1700 install_rpath : rootlibexecdir,
1702 public_programs += [exe]
1704 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 dependencies : [threads,
1712 install_rpath : rootlibexecdir,
1714 install_dir : rootbindir)
1715 public_programs += [exe]
1717 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1718 meson.add_install_script(meson_make_symlink,
1719 join_paths(rootbindir, 'systemctl'),
1720 join_paths(rootsbindir, alias))
1723 if conf.get('ENABLE_BACKLIGHT') == 1
1724 executable('systemd-backlight',
1725 'src/backlight/backlight.c',
1726 include_directories : includes,
1727 link_with : [libshared],
1728 install_rpath : rootlibexecdir,
1730 install_dir : rootlibexecdir)
1733 if conf.get('ENABLE_RFKILL') == 1
1734 executable('systemd-rfkill',
1735 'src/rfkill/rfkill.c',
1736 include_directories : includes,
1737 link_with : [libshared],
1738 install_rpath : rootlibexecdir,
1740 install_dir : rootlibexecdir)
1743 executable('systemd-system-update-generator',
1744 'src/system-update-generator/system-update-generator.c',
1745 include_directories : includes,
1746 link_with : [libshared],
1747 install_rpath : rootlibexecdir,
1749 install_dir : systemgeneratordir)
1751 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1752 executable('systemd-cryptsetup',
1753 'src/cryptsetup/cryptsetup.c',
1754 include_directories : includes,
1755 link_with : [libshared],
1756 dependencies : [libcryptsetup],
1757 install_rpath : rootlibexecdir,
1759 install_dir : rootlibexecdir)
1761 executable('systemd-cryptsetup-generator',
1762 'src/cryptsetup/cryptsetup-generator.c',
1763 include_directories : includes,
1764 link_with : [libshared],
1765 dependencies : [libcryptsetup],
1766 install_rpath : rootlibexecdir,
1768 install_dir : systemgeneratordir)
1770 executable('systemd-veritysetup',
1771 'src/veritysetup/veritysetup.c',
1772 include_directories : includes,
1773 link_with : [libshared],
1774 dependencies : [libcryptsetup],
1775 install_rpath : rootlibexecdir,
1777 install_dir : rootlibexecdir)
1779 executable('systemd-veritysetup-generator',
1780 'src/veritysetup/veritysetup-generator.c',
1781 include_directories : includes,
1782 link_with : [libshared],
1783 dependencies : [libcryptsetup],
1784 install_rpath : rootlibexecdir,
1786 install_dir : systemgeneratordir)
1789 if conf.get('HAVE_SYSV_COMPAT') == 1
1790 executable('systemd-sysv-generator',
1791 'src/sysv-generator/sysv-generator.c',
1792 include_directories : includes,
1793 link_with : [libshared],
1794 install_rpath : rootlibexecdir,
1796 install_dir : systemgeneratordir)
1798 executable('systemd-rc-local-generator',
1799 'src/rc-local-generator/rc-local-generator.c',
1800 include_directories : includes,
1801 link_with : [libshared],
1802 install_rpath : rootlibexecdir,
1804 install_dir : systemgeneratordir)
1807 if conf.get('ENABLE_HOSTNAMED') == 1
1808 executable('systemd-hostnamed',
1809 'src/hostname/hostnamed.c',
1810 include_directories : includes,
1811 link_with : [libshared],
1812 install_rpath : rootlibexecdir,
1814 install_dir : rootlibexecdir)
1816 exe = executable('hostnamectl',
1817 'src/hostname/hostnamectl.c',
1818 include_directories : includes,
1819 link_with : [libshared],
1820 install_rpath : rootlibexecdir,
1822 public_programs += [exe]
1825 if conf.get('ENABLE_LOCALED') == 1
1826 if conf.get('HAVE_XKBCOMMON') == 1
1827 # logind will load libxkbcommon.so dynamically on its own
1833 executable('systemd-localed',
1834 systemd_localed_sources,
1835 include_directories : includes,
1836 link_with : [libshared],
1837 dependencies : deps,
1838 install_rpath : rootlibexecdir,
1840 install_dir : rootlibexecdir)
1842 exe = executable('localectl',
1844 include_directories : includes,
1845 link_with : [libshared],
1846 install_rpath : rootlibexecdir,
1848 public_programs += [exe]
1851 if conf.get('ENABLE_TIMEDATED') == 1
1852 executable('systemd-timedated',
1853 'src/timedate/timedated.c',
1854 include_directories : includes,
1855 link_with : [libshared],
1856 install_rpath : rootlibexecdir,
1858 install_dir : rootlibexecdir)
1861 if conf.get('ENABLE_TIMEDATECTL') == 1
1862 exe = executable('timedatectl',
1863 'src/timedate/timedatectl.c',
1864 include_directories : includes,
1865 install_rpath : rootlibexecdir,
1866 link_with : [libshared],
1867 dependencies : [libm],
1869 public_programs += [exe]
1872 if conf.get('ENABLE_TIMESYNCD') == 1
1873 executable('systemd-timesyncd',
1874 systemd_timesyncd_sources,
1875 include_directories : includes,
1876 link_with : [libshared],
1877 dependencies : [threads,
1879 install_rpath : rootlibexecdir,
1881 install_dir : rootlibexecdir)
1883 executable('systemd-time-wait-sync',
1884 'src/time-wait-sync/time-wait-sync.c',
1885 include_directories : includes,
1886 link_with : [libshared],
1887 install_rpath : rootlibexecdir,
1889 install_dir : rootlibexecdir)
1892 if conf.get('ENABLE_MACHINED') == 1
1893 executable('systemd-machined',
1894 systemd_machined_sources,
1895 include_directories : includes,
1896 link_with : [libmachine_core,
1898 install_rpath : rootlibexecdir,
1900 install_dir : rootlibexecdir)
1902 exe = executable('machinectl',
1903 'src/machine/machinectl.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 dependencies : [threads,
1909 install_rpath : rootlibexecdir,
1911 install_dir : rootbindir)
1912 public_programs += [exe]
1915 if conf.get('ENABLE_IMPORTD') == 1
1916 executable('systemd-importd',
1917 systemd_importd_sources,
1918 include_directories : includes,
1919 link_with : [libshared],
1920 dependencies : [threads],
1921 install_rpath : rootlibexecdir,
1923 install_dir : rootlibexecdir)
1925 systemd_pull = executable('systemd-pull',
1926 systemd_pull_sources,
1927 include_directories : includes,
1928 link_with : [libshared],
1929 dependencies : [libcurl,
1934 install_rpath : rootlibexecdir,
1936 install_dir : rootlibexecdir)
1938 systemd_import = executable('systemd-import',
1939 systemd_import_sources,
1940 include_directories : includes,
1941 link_with : [libshared],
1942 dependencies : [libcurl,
1946 install_rpath : rootlibexecdir,
1948 install_dir : rootlibexecdir)
1950 systemd_export = executable('systemd-export',
1951 systemd_export_sources,
1952 include_directories : includes,
1953 link_with : [libshared],
1954 dependencies : [libcurl,
1958 install_rpath : rootlibexecdir,
1960 install_dir : rootlibexecdir)
1961 public_programs += [systemd_pull, systemd_import, systemd_export]
1964 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1965 exe = executable('systemd-journal-upload',
1966 systemd_journal_upload_sources,
1967 include_directories : includes,
1968 link_with : [libshared],
1969 dependencies : [threads,
1974 install_rpath : rootlibexecdir,
1976 install_dir : rootlibexecdir)
1977 public_programs += [exe]
1980 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1981 s_j_remote = executable('systemd-journal-remote',
1982 systemd_journal_remote_sources,
1983 include_directories : includes,
1984 link_with : [libshared],
1985 dependencies : [threads,
1990 install_rpath : rootlibexecdir,
1992 install_dir : rootlibexecdir)
1994 s_j_gatewayd = executable('systemd-journal-gatewayd',
1995 systemd_journal_gatewayd_sources,
1996 include_directories : includes,
1997 link_with : [libshared],
1998 dependencies : [threads,
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootlibexecdir)
2006 public_programs += [s_j_remote, s_j_gatewayd]
2009 if conf.get('ENABLE_COREDUMP') == 1
2010 executable('systemd-coredump',
2011 systemd_coredump_sources,
2012 include_directories : includes,
2013 link_with : [libshared],
2014 dependencies : [threads,
2019 install_rpath : rootlibexecdir,
2021 install_dir : rootlibexecdir)
2023 exe = executable('coredumpctl',
2024 coredumpctl_sources,
2025 include_directories : includes,
2026 link_with : [libshared],
2027 dependencies : [threads,
2030 install_rpath : rootlibexecdir,
2032 public_programs += [exe]
2035 if conf.get('ENABLE_BINFMT') == 1
2036 exe = executable('systemd-binfmt',
2037 'src/binfmt/binfmt.c',
2038 include_directories : includes,
2039 link_with : [libshared],
2040 install_rpath : rootlibexecdir,
2042 install_dir : rootlibexecdir)
2043 public_programs += [exe]
2045 meson.add_install_script('sh', '-c',
2046 mkdir_p.format(binfmtdir))
2047 meson.add_install_script('sh', '-c',
2048 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2051 if conf.get('ENABLE_VCONSOLE') == 1
2052 executable('systemd-vconsole-setup',
2053 'src/vconsole/vconsole-setup.c',
2054 include_directories : includes,
2055 link_with : [libshared],
2056 install_rpath : rootlibexecdir,
2058 install_dir : rootlibexecdir)
2061 if conf.get('ENABLE_RANDOMSEED') == 1
2062 executable('systemd-random-seed',
2063 'src/random-seed/random-seed.c',
2064 include_directories : includes,
2065 link_with : [libshared],
2066 install_rpath : rootlibexecdir,
2068 install_dir : rootlibexecdir)
2071 if conf.get('ENABLE_FIRSTBOOT') == 1
2072 executable('systemd-firstboot',
2073 'src/firstboot/firstboot.c',
2074 include_directories : includes,
2075 link_with : [libshared],
2076 dependencies : [libcrypt],
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootbindir)
2082 executable('systemd-remount-fs',
2083 'src/remount-fs/remount-fs.c',
2084 'src/core/mount-setup.c',
2085 'src/core/mount-setup.h',
2086 include_directories : includes,
2087 link_with : [libshared],
2088 install_rpath : rootlibexecdir,
2090 install_dir : rootlibexecdir)
2092 executable('systemd-machine-id-setup',
2093 'src/machine-id-setup/machine-id-setup-main.c',
2094 'src/core/machine-id-setup.c',
2095 'src/core/machine-id-setup.h',
2096 include_directories : includes,
2097 link_with : [libshared],
2098 install_rpath : rootlibexecdir,
2100 install_dir : rootbindir)
2102 executable('systemd-fsck',
2104 include_directories : includes,
2105 link_with : [libshared],
2106 install_rpath : rootlibexecdir,
2108 install_dir : rootlibexecdir)
2110 executable('systemd-growfs',
2111 'src/partition/growfs.c',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 dependencies : [libcryptsetup],
2115 install_rpath : rootlibexecdir,
2117 install_dir : rootlibexecdir)
2119 executable('systemd-makefs',
2120 'src/partition/makefs.c',
2121 include_directories : includes,
2122 link_with : [libshared],
2123 install_rpath : rootlibexecdir,
2125 install_dir : rootlibexecdir)
2127 executable('systemd-sleep',
2128 'src/sleep/sleep.c',
2129 include_directories : includes,
2130 link_with : [libshared],
2131 install_rpath : rootlibexecdir,
2133 install_dir : rootlibexecdir)
2135 exe = executable('systemd-sysctl',
2136 'src/sysctl/sysctl.c',
2137 include_directories : includes,
2138 link_with : [libshared],
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2142 public_programs += [exe]
2144 executable('systemd-ac-power',
2145 'src/ac-power/ac-power.c',
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootlibexecdir)
2152 exe = executable('systemd-detect-virt',
2153 'src/detect-virt/detect-virt.c',
2154 include_directories : includes,
2155 link_with : [libshared],
2156 install_rpath : rootlibexecdir,
2158 public_programs += [exe]
2160 exe = executable('systemd-delta',
2161 'src/delta/delta.c',
2162 include_directories : includes,
2163 link_with : [libshared],
2164 install_rpath : rootlibexecdir,
2166 public_programs += [exe]
2168 exe = executable('systemd-escape',
2169 'src/escape/escape.c',
2170 include_directories : includes,
2171 link_with : [libshared],
2172 install_rpath : rootlibexecdir,
2174 install_dir : rootbindir)
2175 public_programs += [exe]
2177 exe = executable('systemd-notify',
2178 'src/notify/notify.c',
2179 include_directories : includes,
2180 link_with : [libshared],
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootbindir)
2184 public_programs += [exe]
2186 executable('systemd-volatile-root',
2187 'src/volatile-root/volatile-root.c',
2188 include_directories : includes,
2189 link_with : [libshared],
2190 install_rpath : rootlibexecdir,
2192 install_dir : rootlibexecdir)
2194 executable('systemd-cgroups-agent',
2195 'src/cgroups-agent/cgroups-agent.c',
2196 include_directories : includes,
2197 link_with : [libshared],
2198 install_rpath : rootlibexecdir,
2200 install_dir : rootlibexecdir)
2202 exe = executable('systemd-path',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2208 public_programs += [exe]
2210 exe = executable('systemd-ask-password',
2211 'src/ask-password/ask-password.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2216 install_dir : rootbindir)
2217 public_programs += [exe]
2219 executable('systemd-reply-password',
2220 'src/reply-password/reply-password.c',
2221 include_directories : includes,
2222 link_with : [libshared],
2223 install_rpath : rootlibexecdir,
2225 install_dir : rootlibexecdir)
2227 exe = executable('systemd-tty-ask-password-agent',
2228 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2233 install_dir : rootbindir)
2234 public_programs += [exe]
2236 exe = executable('systemd-cgls',
2238 include_directories : includes,
2239 link_with : [libshared],
2240 install_rpath : rootlibexecdir,
2242 public_programs += [exe]
2244 exe = executable('systemd-cgtop',
2245 'src/cgtop/cgtop.c',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 install_rpath : rootlibexecdir,
2250 public_programs += [exe]
2252 executable('systemd-initctl',
2253 'src/initctl/initctl.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 install_rpath : rootlibexecdir,
2258 install_dir : rootlibexecdir)
2260 exe = executable('systemd-mount',
2261 'src/mount/mount-tool.c',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 install_rpath : rootlibexecdir,
2266 public_programs += [exe]
2268 meson.add_install_script(meson_make_symlink,
2269 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2271 exe = executable('systemd-run',
2273 include_directories : includes,
2274 link_with : [libshared],
2275 install_rpath : rootlibexecdir,
2277 public_programs += [exe]
2279 exe = executable('systemd-stdio-bridge',
2280 'src/stdio-bridge/stdio-bridge.c',
2281 include_directories : includes,
2282 link_with : [libshared],
2283 install_rpath : rootlibexecdir,
2285 public_programs += [exe]
2287 exe = executable('busctl',
2288 'src/busctl/busctl.c',
2289 'src/busctl/busctl-introspect.c',
2290 'src/busctl/busctl-introspect.h',
2291 include_directories : includes,
2292 link_with : [libshared],
2293 install_rpath : rootlibexecdir,
2295 public_programs += [exe]
2297 if conf.get('ENABLE_SYSUSERS') == 1
2298 exe = executable('systemd-sysusers',
2299 'src/sysusers/sysusers.c',
2300 include_directories : includes,
2301 link_with : [libshared],
2302 install_rpath : rootlibexecdir,
2304 install_dir : rootbindir)
2305 public_programs += [exe]
2308 if conf.get('ENABLE_TMPFILES') == 1
2309 exe = executable('systemd-tmpfiles',
2310 'src/tmpfiles/tmpfiles.c',
2311 include_directories : includes,
2312 link_with : [libshared],
2313 dependencies : [libacl],
2314 install_rpath : rootlibexecdir,
2316 install_dir : rootbindir)
2317 public_programs += [exe]
2319 test('test-systemd-tmpfiles',
2320 test_systemd_tmpfiles_py,
2321 args : exe.full_path())
2322 # https://github.com/mesonbuild/meson/issues/2681
2325 if conf.get('ENABLE_HWDB') == 1
2326 exe = executable('systemd-hwdb',
2328 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2329 include_directories : includes,
2330 link_with : [libudev_static],
2331 install_rpath : udev_rpath,
2333 install_dir : rootbindir)
2334 public_programs += [exe]
2337 if conf.get('ENABLE_QUOTACHECK') == 1
2338 executable('systemd-quotacheck',
2339 'src/quotacheck/quotacheck.c',
2340 include_directories : includes,
2341 link_with : [libshared],
2342 install_rpath : rootlibexecdir,
2344 install_dir : rootlibexecdir)
2347 exe = executable('systemd-socket-proxyd',
2348 'src/socket-proxy/socket-proxyd.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 dependencies : [threads],
2352 install_rpath : rootlibexecdir,
2354 install_dir : rootlibexecdir)
2355 public_programs += [exe]
2357 exe = executable('systemd-udevd',
2358 systemd_udevd_sources,
2359 include_directories : includes,
2360 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2361 link_with : [libudev_core,
2364 dependencies : [threads,
2369 install_rpath : udev_rpath,
2371 install_dir : rootlibexecdir)
2372 public_programs += [exe]
2374 exe = executable('udevadm',
2376 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2377 include_directories : includes,
2378 link_with : [libudev_core,
2381 dependencies : [threads,
2386 install_rpath : udev_rpath,
2388 install_dir : rootbindir)
2389 public_programs += [exe]
2391 executable('systemd-shutdown',
2392 systemd_shutdown_sources,
2393 include_directories : includes,
2394 link_with : [libshared],
2395 dependencies : [libmount],
2396 install_rpath : rootlibexecdir,
2398 install_dir : rootlibexecdir)
2400 executable('systemd-update-done',
2401 'src/update-done/update-done.c',
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2406 install_dir : rootlibexecdir)
2408 executable('systemd-update-utmp',
2409 'src/update-utmp/update-utmp.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 dependencies : [libaudit],
2413 install_rpath : rootlibexecdir,
2415 install_dir : rootlibexecdir)
2417 if conf.get('HAVE_KMOD') == 1
2418 executable('systemd-modules-load',
2419 'src/modules-load/modules-load.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 dependencies : [libkmod],
2423 install_rpath : rootlibexecdir,
2425 install_dir : rootlibexecdir)
2427 meson.add_install_script('sh', '-c',
2428 mkdir_p.format(modulesloaddir))
2429 meson.add_install_script('sh', '-c',
2430 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2433 exe = executable('systemd-nspawn',
2434 systemd_nspawn_sources,
2435 'src/core/mount-setup.c', # FIXME: use a variable?
2436 'src/core/mount-setup.h',
2437 'src/core/loopback-setup.c',
2438 'src/core/loopback-setup.h',
2439 include_directories : [includes, include_directories('src/nspawn')],
2440 link_with : [libshared],
2441 dependencies : [libacl,
2445 install_rpath : rootlibexecdir,
2447 public_programs += [exe]
2449 if conf.get('ENABLE_NETWORKD') == 1
2450 executable('systemd-networkd',
2451 systemd_networkd_sources,
2452 include_directories : includes,
2453 link_with : [libnetworkd_core,
2457 dependencies : [threads],
2458 install_rpath : rootlibexecdir,
2460 install_dir : rootlibexecdir)
2462 executable('systemd-networkd-wait-online',
2463 systemd_networkd_wait_online_sources,
2464 include_directories : includes,
2465 link_with : [libnetworkd_core,
2467 install_rpath : rootlibexecdir,
2469 install_dir : rootlibexecdir)
2471 exe = executable('networkctl',
2473 include_directories : includes,
2474 link_with : [libsystemd_network,
2476 install_rpath : rootlibexecdir,
2478 install_dir : rootbindir)
2479 public_programs += [exe]
2482 executable('systemd-sulogin-shell',
2483 ['src/sulogin-shell/sulogin-shell.c'],
2484 include_directories : includes,
2485 link_with : [libshared],
2486 install_rpath : rootlibexecdir,
2488 install_dir : rootlibexecdir)
2490 ############################################################
2492 foreach tuple : tests
2494 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2495 dependencies = tuple[2]
2496 condition = tuple.length() >= 4 ? tuple[3] : ''
2497 type = tuple.length() >= 5 ? tuple[4] : ''
2498 defs = tuple.length() >= 6 ? tuple[5] : []
2499 incs = tuple.length() >= 7 ? tuple[6] : includes
2502 name = sources[0].split('/')[-1].split('.')[0]
2503 if type.startswith('timeout=')
2504 timeout = type.split('=')[1].to_int()
2507 if want_tests == 'false'
2508 message('Not compiling @0@ because tests is set to false'.format(name))
2509 elif condition == '' or conf.get(condition) == 1
2513 include_directories : incs,
2514 link_with : link_with,
2515 dependencies : dependencies,
2517 install_rpath : rootlibexecdir,
2518 install : install_tests,
2519 install_dir : join_paths(testsdir, type))
2522 message('@0@ is a manual test'.format(name))
2523 elif type == 'unsafe' and want_tests != 'unsafe'
2524 message('@0@ is an unsafe test'.format(name))
2531 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2536 'test-libsystemd-sym',
2537 test_libsystemd_sym_c,
2538 include_directories : includes,
2539 link_with : [libsystemd],
2540 install : install_tests,
2541 install_dir : testsdir)
2542 test('test-libsystemd-sym', exe)
2545 'test-libsystemd-static-sym',
2546 test_libsystemd_sym_c,
2547 include_directories : includes,
2548 link_with : [install_libsystemd_static],
2549 dependencies : [threads], # threads is already included in dependencies on the library,
2550 # but does not seem to get propagated. Add here as a work-around.
2551 build_by_default : static_libsystemd_pic,
2552 install : install_tests and static_libsystemd_pic,
2553 install_dir : testsdir)
2554 if static_libsystemd_pic
2555 test('test-libsystemd-static-sym', exe)
2561 include_directories : includes,
2562 c_args : ['-Wno-deprecated-declarations'],
2563 link_with : [libudev],
2564 install : install_tests,
2565 install_dir : testsdir)
2566 test('test-libudev-sym', exe)
2569 'test-libudev-static-sym',
2571 include_directories : includes,
2572 c_args : ['-Wno-deprecated-declarations'],
2573 link_with : [install_libudev_static],
2574 build_by_default : static_libudev_pic,
2575 install : install_tests and static_libudev_pic,
2576 install_dir : testsdir)
2577 if static_libudev_pic
2578 test('test-libudev-static-sym', exe)
2581 ############################################################
2585 foreach tuple : fuzzers
2587 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2588 dependencies = tuple[2]
2589 defs = tuple.length() >= 4 ? tuple[3] : []
2590 incs = tuple.length() >= 5 ? tuple[4] : includes
2593 dependencies += fuzzing_engine
2595 sources += 'src/fuzz/fuzz-main.c'
2598 name = sources[0].split('/')[-1].split('.')[0]
2600 fuzzer_exes += executable(
2603 include_directories : [incs, include_directories('src/fuzz')],
2604 link_with : link_with,
2605 dependencies : dependencies,
2610 run_target('fuzzers',
2611 depends : fuzzer_exes,
2614 ############################################################
2616 make_directive_index_py = find_program('tools/make-directive-index.py')
2617 make_man_index_py = find_program('tools/make-man-index.py')
2618 xml_helper_py = find_program('tools/xml_helper.py')
2619 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2623 subdir('sysusers.d')
2624 subdir('tmpfiles.d')
2629 subdir('shell-completion/bash')
2630 subdir('shell-completion/zsh')
2631 subdir('doc/sysvinit')
2632 subdir('doc/var-log')
2634 # FIXME: figure out if the warning is true:
2635 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2636 install_subdir('factory/etc',
2637 install_dir : factorydir)
2640 install_data('xorg/50-systemd-user.sh',
2641 install_dir : xinitrcdir)
2642 install_data('modprobe.d/systemd.conf',
2643 install_dir : modprobedir)
2644 install_data('LICENSE.GPL2',
2649 'doc/DISTRO_PORTING',
2650 'doc/ENVIRONMENT.md',
2652 'doc/TRANSIENT-SETTINGS.md',
2655 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2656 install_dir : docdir)
2658 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2659 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2661 ############################################################
2663 meson_check_help = find_program('tools/meson-check-help.sh')
2665 foreach exec : public_programs
2666 name = exec.full_path().split('/')[-1]
2667 test('check-help-' + name,
2669 args : [exec.full_path()])
2672 ############################################################
2674 # Enable tests for all supported sanitizers
2675 foreach tuple : sanitizers
2676 sanitizer = tuple[0]
2679 have = run_command(check_compilation_sh,
2680 cc.cmd_array(), '-x', 'c',
2681 '-fsanitize=@0@'.format(sanitizer),
2682 '-include', link_test_c).returncode() == 0
2683 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2687 foreach p : fuzz_regression_tests
2688 b = p.split('/')[-2]
2689 c = p.split('/')[-1]
2691 name = '@0@:@1@'.format(b, sanitizer)
2694 if want_tests == 'false'
2695 message('Not compiling @0@ because tests is set to false'.format(name))
2697 exe = custom_target(
2701 command : [env, 'ln', '-fs',
2702 join_paths(build.full_path(), b),
2704 build_by_default : true)
2706 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2711 if want_tests != 'false' and slow_tests
2712 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2714 args : [exe.full_path(),
2715 join_paths(meson.source_root(),
2716 'test/fuzz-regressions',
2724 ############################################################
2727 all_files = run_command(
2729 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2732 all_files = files(all_files.stdout().split())
2737 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2741 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2745 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2748 command : [meson_git_contrib_sh])
2752 git_head = run_command(
2754 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2755 'rev-parse', 'HEAD']).stdout().strip()
2756 git_head_short = run_command(
2758 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2759 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2763 command : ['git', 'archive',
2764 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2766 '--prefix', 'systemd-@0@/'.format(git_head),
2770 ############################################################
2772 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2775 depends : [man, libsystemd, libudev],
2776 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2778 ############################################################
2781 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2783 'split /usr: @0@'.format(split_usr),
2784 'split bin-sbin: @0@'.format(split_bin),
2785 'prefix directory: @0@'.format(prefixdir),
2786 'rootprefix directory: @0@'.format(rootprefixdir),
2787 'sysconf directory: @0@'.format(sysconfdir),
2788 'include directory: @0@'.format(includedir),
2789 'lib directory: @0@'.format(libdir),
2790 'rootlib directory: @0@'.format(rootlibdir),
2791 'SysV init scripts: @0@'.format(sysvinit_path),
2792 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2793 'PAM modules directory: @0@'.format(pamlibdir),
2794 'PAM configuration directory: @0@'.format(pamconfdir),
2795 'RPM macros directory: @0@'.format(rpmmacrosdir),
2796 'modprobe.d directory: @0@'.format(modprobedir),
2797 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2798 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2799 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2800 'bash completions directory: @0@'.format(bashcompletiondir),
2801 'zsh completions directory: @0@'.format(zshcompletiondir),
2802 'extra start script: @0@'.format(get_option('rc-local')),
2803 'extra stop script: @0@'.format(get_option('halt-local')),
2804 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2805 get_option('debug-tty')),
2806 'TTY GID: @0@'.format(tty_gid),
2807 'users GID: @0@'.format(users_gid),
2808 'maximum system UID: @0@'.format(system_uid_max),
2809 'maximum system GID: @0@'.format(system_gid_max),
2810 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2811 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2812 'minimum container UID base: @0@'.format(container_uid_base_min),
2813 'maximum container UID base: @0@'.format(container_uid_base_max),
2814 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2815 'render group access mode: @0@'.format(get_option('group-render-mode')),
2816 'certificate root directory: @0@'.format(get_option('certificate-root')),
2817 'support URL: @0@'.format(support_url),
2818 'nobody user name: @0@'.format(nobody_user),
2819 'nobody group name: @0@'.format(nobody_group),
2820 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2821 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2823 'default DNSSEC mode: @0@'.format(default_dnssec),
2824 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2825 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2827 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2828 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2830 'default DNS servers: @0@'.format(alt_dns_servers),
2831 'default NTP servers: @0@'.format(alt_ntp_servers)]
2833 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2834 '@@0@'.format(time_epoch)).stdout().strip()
2836 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2839 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2840 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2841 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2843 if conf.get('ENABLE_EFI') == 1
2845 'efi arch: @0@'.format(efi_arch)]
2849 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2850 'EFI CC @0@'.format(efi_cc),
2851 'EFI lib directory: @0@'.format(efi_libdir),
2852 'EFI lds directory: @0@'.format(efi_ldsdir),
2853 'EFI include directory: @0@'.format(efi_incdir)]
2906 ['legacy pkla', install_polkit_pkla],
2908 ['gnu-efi', have_gnu_efi],
2915 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2918 ['man pages', want_man],
2919 ['html pages', want_html],
2920 ['man page indices', want_man and have_lxml],
2925 ['adm group', get_option('adm-group')],
2926 ['wheel group', get_option('wheel-group')],
2929 ['debug mmap cache'],
2930 ['valgrind', conf.get('VALGRIND') == 1],
2933 if tuple.length() >= 2
2936 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2937 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2938 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2943 missing += [tuple[0]]
2949 'enabled features: @0@'.format(', '.join(found)),
2951 'disabled features: @0@'.format(', '.join(missing)),
2953 message('\n '.join(status))
2955 if rootprefixdir != rootprefix_default
2957 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2958 'systemd used fixed names for unit file directories and other paths, so anything\n' +
2959 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))