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 #####################################################################
779 threads = dependency('threads')
780 librt = cc.find_library('rt')
781 libm = cc.find_library('m')
782 libdl = cc.find_library('dl')
783 libcrypt = cc.find_library('crypt')
785 libcap = dependency('libcap', required : false)
786 if not libcap.found()
787 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
788 libcap = cc.find_library('cap')
791 libmount = dependency('mount',
792 version : fuzzer_build ? '>= 0' : '>= 2.30')
794 want_seccomp = get_option('seccomp')
795 if want_seccomp != 'false' and not fuzzer_build
796 libseccomp = dependency('libseccomp',
797 version : '>= 2.3.1',
798 required : want_seccomp == 'true')
799 have = libseccomp.found()
804 conf.set10('HAVE_SECCOMP', have)
806 want_selinux = get_option('selinux')
807 if want_selinux != 'false' and not fuzzer_build
808 libselinux = dependency('libselinux',
809 version : '>= 2.1.9',
810 required : want_selinux == 'true')
811 have = libselinux.found()
816 conf.set10('HAVE_SELINUX', have)
818 want_apparmor = get_option('apparmor')
819 if want_apparmor != 'false' and not fuzzer_build
820 libapparmor = dependency('libapparmor',
821 required : want_apparmor == 'true')
822 have = libapparmor.found()
827 conf.set10('HAVE_APPARMOR', have)
829 smack_run_label = get_option('smack-run-label')
830 if smack_run_label != ''
831 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
834 want_polkit = get_option('polkit')
835 install_polkit = false
836 install_polkit_pkla = false
837 if want_polkit != 'false' and not fuzzer_build
838 install_polkit = true
840 libpolkit = dependency('polkit-gobject-1',
842 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
843 message('Old polkit detected, will install pkla files')
844 install_polkit_pkla = true
847 conf.set10('ENABLE_POLKIT', install_polkit)
849 want_acl = get_option('acl')
850 if want_acl != 'false' and not fuzzer_build
851 libacl = cc.find_library('acl', required : want_acl == 'true')
852 have = libacl.found()
857 conf.set10('HAVE_ACL', have)
859 want_audit = get_option('audit')
860 if want_audit != 'false' and not fuzzer_build
861 libaudit = dependency('audit', required : want_audit == 'true')
862 have = libaudit.found()
867 conf.set10('HAVE_AUDIT', have)
869 want_blkid = get_option('blkid')
870 if want_blkid != 'false' and not fuzzer_build
871 libblkid = dependency('blkid', required : want_blkid == 'true')
872 have = libblkid.found()
877 conf.set10('HAVE_BLKID', have)
879 want_kmod = get_option('kmod')
880 if want_kmod != 'false' and not fuzzer_build
881 libkmod = dependency('libkmod',
883 required : want_kmod == 'true')
884 have = libkmod.found()
889 conf.set10('HAVE_KMOD', have)
891 want_pam = get_option('pam')
892 if want_pam != 'false' and not fuzzer_build
893 libpam = cc.find_library('pam', required : want_pam == 'true')
894 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
895 have = libpam.found() and libpam_misc.found()
901 conf.set10('HAVE_PAM', have)
903 want_microhttpd = get_option('microhttpd')
904 if want_microhttpd != 'false' and not fuzzer_build
905 libmicrohttpd = dependency('libmicrohttpd',
906 version : '>= 0.9.33',
907 required : want_microhttpd == 'true')
908 have = libmicrohttpd.found()
913 conf.set10('HAVE_MICROHTTPD', have)
915 want_libcryptsetup = get_option('libcryptsetup')
916 if want_libcryptsetup != 'false' and not fuzzer_build
917 libcryptsetup = dependency('libcryptsetup',
918 version : '>= 1.6.0',
919 required : want_libcryptsetup == 'true')
920 have = libcryptsetup.found()
925 conf.set10('HAVE_LIBCRYPTSETUP', have)
927 want_libcurl = get_option('libcurl')
928 if want_libcurl != 'false' and not fuzzer_build
929 libcurl = dependency('libcurl',
930 version : '>= 7.32.0',
931 required : want_libcurl == 'true')
932 have = libcurl.found()
937 conf.set10('HAVE_LIBCURL', have)
939 want_libidn = get_option('libidn')
940 want_libidn2 = get_option('libidn2')
941 if want_libidn == 'true' and want_libidn2 == 'true'
942 error('libidn and libidn2 cannot be requested simultaneously')
945 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
946 libidn = dependency('libidn',
947 required : want_libidn == 'true')
948 have = libidn.found()
953 conf.set10('HAVE_LIBIDN', have)
954 if not have and want_libidn2 != 'false' and not fuzzer_build
955 # libidn is used for both libidn and libidn2 objects
956 libidn = dependency('libidn2',
957 required : want_libidn2 == 'true')
958 have = libidn.found()
962 conf.set10('HAVE_LIBIDN2', have)
964 want_libiptc = get_option('libiptc')
965 if want_libiptc != 'false' and not fuzzer_build
966 libiptc = dependency('libiptc',
967 required : want_libiptc == 'true')
968 have = libiptc.found()
973 conf.set10('HAVE_LIBIPTC', have)
975 want_qrencode = get_option('qrencode')
976 if want_qrencode != 'false' and not fuzzer_build
977 libqrencode = dependency('libqrencode',
978 required : want_qrencode == 'true')
979 have = libqrencode.found()
984 conf.set10('HAVE_QRENCODE', have)
986 want_gcrypt = get_option('gcrypt')
987 if want_gcrypt != 'false' and not fuzzer_build
988 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
989 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
990 have = libgcrypt.found() and libgpg_error.found()
995 # link to neither of the libs if one is not found
999 conf.set10('HAVE_GCRYPT', have)
1001 want_gnutls = get_option('gnutls')
1002 if want_gnutls != 'false' and not fuzzer_build
1003 libgnutls = dependency('gnutls',
1004 version : '>= 3.1.4',
1005 required : want_gnutls == 'true')
1006 have = libgnutls.found()
1011 conf.set10('HAVE_GNUTLS', have)
1013 want_elfutils = get_option('elfutils')
1014 if want_elfutils != 'false' and not fuzzer_build
1015 libdw = dependency('libdw',
1016 required : want_elfutils == 'true')
1017 have = libdw.found()
1022 conf.set10('HAVE_ELFUTILS', have)
1024 want_zlib = get_option('zlib')
1025 if want_zlib != 'false' and not fuzzer_build
1026 libz = dependency('zlib',
1027 required : want_zlib == 'true')
1033 conf.set10('HAVE_ZLIB', have)
1035 want_bzip2 = get_option('bzip2')
1036 if want_bzip2 != 'false' and not fuzzer_build
1037 libbzip2 = cc.find_library('bz2',
1038 required : want_bzip2 == 'true')
1039 have = libbzip2.found()
1044 conf.set10('HAVE_BZIP2', have)
1046 want_xz = get_option('xz')
1047 if want_xz != 'false' and not fuzzer_build
1048 libxz = dependency('liblzma',
1049 required : want_xz == 'true')
1050 have = libxz.found()
1055 conf.set10('HAVE_XZ', have)
1057 want_lz4 = get_option('lz4')
1058 if want_lz4 != 'false' and not fuzzer_build
1059 liblz4 = dependency('liblz4',
1060 required : want_lz4 == 'true')
1061 have = liblz4.found()
1066 conf.set10('HAVE_LZ4', have)
1068 want_xkbcommon = get_option('xkbcommon')
1069 if want_xkbcommon != 'false' and not fuzzer_build
1070 libxkbcommon = dependency('xkbcommon',
1071 version : '>= 0.3.0',
1072 required : want_xkbcommon == 'true')
1073 have = libxkbcommon.found()
1078 conf.set10('HAVE_XKBCOMMON', have)
1080 want_pcre2 = get_option('pcre2')
1081 if want_pcre2 != 'false'
1082 libpcre2 = dependency('libpcre2-8',
1083 required : want_pcre2 == 'true')
1084 have = libpcre2.found()
1089 conf.set10('HAVE_PCRE2', have)
1091 want_glib = get_option('glib')
1092 if want_glib != 'false' and not fuzzer_build
1093 libglib = dependency('glib-2.0',
1094 version : '>= 2.22.0',
1095 required : want_glib == 'true')
1096 libgobject = dependency('gobject-2.0',
1097 version : '>= 2.22.0',
1098 required : want_glib == 'true')
1099 libgio = dependency('gio-2.0',
1100 required : want_glib == 'true')
1101 have = libglib.found() and libgobject.found() and libgio.found()
1108 conf.set10('HAVE_GLIB', have)
1110 want_dbus = get_option('dbus')
1111 if want_dbus != 'false' and not fuzzer_build
1112 libdbus = dependency('dbus-1',
1113 version : '>= 1.3.2',
1114 required : want_dbus == 'true')
1115 have = libdbus.found()
1120 conf.set10('HAVE_DBUS', have)
1122 default_dnssec = get_option('default-dnssec')
1124 default_dnssec = 'no'
1126 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1127 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1128 default_dnssec = 'no'
1130 conf.set('DEFAULT_DNSSEC_MODE',
1131 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1132 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1134 want_importd = get_option('importd')
1135 if want_importd != 'false'
1136 have = (conf.get('HAVE_LIBCURL') == 1 and
1137 conf.get('HAVE_ZLIB') == 1 and
1138 conf.get('HAVE_BZIP2') == 1 and
1139 conf.get('HAVE_XZ') == 1 and
1140 conf.get('HAVE_GCRYPT') == 1)
1141 if want_importd == 'true' and not have
1142 error('importd support was requested, but dependencies are not available')
1147 conf.set10('ENABLE_IMPORTD', have)
1149 want_remote = get_option('remote')
1150 if want_remote != 'false'
1151 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1152 conf.get('HAVE_LIBCURL') == 1]
1153 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1154 # it's possible to build one without the other. Complain only if
1155 # support was explictly requested. The auxiliary files like sysusers
1156 # config should be installed when any of the programs are built.
1157 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1158 error('remote support was requested, but dependencies are not available')
1160 have = have_deps[0] or have_deps[1]
1164 conf.set10('ENABLE_REMOTE', have)
1166 foreach term : ['utmp',
1197 have = get_option(term)
1198 name = 'ENABLE_' + term.underscorify().to_upper()
1199 conf.set10(name, have)
1202 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1204 want_tests = get_option('tests')
1205 install_tests = get_option('install-tests')
1206 slow_tests = get_option('slow-tests')
1210 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1212 #####################################################################
1214 if get_option('efi')
1215 efi_arch = host_machine.cpu_family()
1217 if efi_arch == 'x86'
1218 EFI_MACHINE_TYPE_NAME = 'ia32'
1219 gnu_efi_arch = 'ia32'
1220 elif efi_arch == 'x86_64'
1221 EFI_MACHINE_TYPE_NAME = 'x64'
1222 gnu_efi_arch = 'x86_64'
1223 elif efi_arch == 'arm'
1224 EFI_MACHINE_TYPE_NAME = 'arm'
1225 gnu_efi_arch = 'arm'
1226 elif efi_arch == 'aarch64'
1227 EFI_MACHINE_TYPE_NAME = 'aa64'
1228 gnu_efi_arch = 'aarch64'
1230 EFI_MACHINE_TYPE_NAME = ''
1235 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1237 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1241 conf.set10('ENABLE_EFI', have)
1243 #####################################################################
1245 config_h = configure_file(
1246 output : 'config.h',
1247 configuration : conf)
1249 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1251 includes = include_directories('src/basic',
1257 'src/time-wait-sync',
1262 'src/libsystemd/sd-bus',
1263 'src/libsystemd/sd-device',
1264 'src/libsystemd/sd-hwdb',
1265 'src/libsystemd/sd-id128',
1266 'src/libsystemd/sd-netlink',
1267 'src/libsystemd/sd-network',
1268 'src/libsystemd-network',
1271 add_project_arguments('-include', 'config.h', language : 'c')
1275 subdir('src/systemd')
1277 subdir('src/libsystemd')
1278 subdir('src/libsystemd-network')
1279 subdir('src/journal')
1282 libjournal_core = static_library(
1284 libjournal_core_sources,
1286 include_directories : includes,
1289 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1290 libsystemd = shared_library(
1292 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1293 version : libsystemd_version,
1294 include_directories : includes,
1295 link_args : ['-shared',
1296 '-Wl,--version-script=' + libsystemd_sym_path],
1297 link_with : [libbasic,
1299 link_whole : [libsystemd_static,
1301 dependencies : [threads,
1305 link_depends : libsystemd_sym,
1307 install_dir : rootlibdir)
1309 static_libsystemd = get_option('static-libsystemd')
1310 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1312 install_libsystemd_static = static_library(
1315 journal_client_sources,
1317 basic_gcrypt_sources,
1318 include_directories : includes,
1319 build_by_default : static_libsystemd != 'false',
1320 install : static_libsystemd != 'false',
1321 install_dir : rootlibdir,
1322 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1323 dependencies : [threads,
1332 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1334 ############################################################
1336 # binaries that have --help and are intended for use by humans,
1337 # usually, but not always, installed in /bin.
1338 public_programs = []
1340 subdir('src/libudev')
1341 subdir('src/shared')
1344 subdir('src/network')
1346 subdir('src/analyze')
1347 subdir('src/journal-remote')
1348 subdir('src/coredump')
1349 subdir('src/hostname')
1350 subdir('src/import')
1351 subdir('src/kernel-install')
1352 subdir('src/locale')
1353 subdir('src/machine')
1354 subdir('src/nspawn')
1355 subdir('src/resolve')
1356 subdir('src/timedate')
1357 subdir('src/timesync')
1358 subdir('src/vconsole')
1359 subdir('src/boot/efi')
1366 ############################################################
1368 # only static linking apart from libdl, to make sure that the
1369 # module is linked to all libraries that it uses.
1370 test_dlopen = executable(
1373 include_directories : includes,
1374 link_with : [libbasic],
1375 dependencies : [libdl])
1377 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1378 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1379 ['mymachines', 'ENABLE_MACHINED'],
1380 ['resolve', 'ENABLE_RESOLVE']]
1382 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1386 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1387 version_script_arg = join_paths(meson.current_source_dir(), sym)
1389 nss = shared_library(
1391 'src/nss-@0@/nss-@0@.c'.format(module),
1393 include_directories : includes,
1394 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1395 link_args : ['-Wl,-z,nodelete',
1397 '-Wl,--version-script=' + version_script_arg,
1399 link_with : [libsystemd_static,
1401 dependencies : [threads,
1405 install_dir : rootlibdir)
1407 # We cannot use shared_module because it does not support version suffix.
1408 # Unfortunately shared_library insists on creating the symlink…
1409 meson.add_install_script('sh', '-c',
1410 'rm $DESTDIR@0@/libnss_@1@.so'
1411 .format(rootlibdir, module))
1413 test('dlopen-nss_' + module,
1415 args : [nss.full_path()]) # path to dlopen must include a slash
1419 ############################################################
1421 executable('systemd',
1423 include_directories : includes,
1424 link_with : [libcore,
1426 dependencies : [threads,
1432 install_rpath : rootlibexecdir,
1434 install_dir : rootlibexecdir)
1436 meson.add_install_script(meson_make_symlink,
1437 join_paths(rootlibexecdir, 'systemd'),
1438 join_paths(rootsbindir, 'init'))
1440 exe = executable('systemd-analyze',
1441 systemd_analyze_sources,
1442 include_directories : includes,
1443 link_with : [libcore,
1445 dependencies : [threads,
1451 install_rpath : rootlibexecdir,
1453 public_programs += [exe]
1455 executable('systemd-journald',
1456 systemd_journald_sources,
1457 include_directories : includes,
1458 link_with : [libjournal_core,
1460 dependencies : [threads,
1464 install_rpath : rootlibexecdir,
1466 install_dir : rootlibexecdir)
1468 exe = executable('systemd-cat',
1469 systemd_cat_sources,
1470 include_directories : includes,
1471 link_with : [libjournal_core,
1473 dependencies : [threads],
1474 install_rpath : rootlibexecdir,
1476 public_programs += [exe]
1478 exe = executable('journalctl',
1480 include_directories : includes,
1481 link_with : [libshared],
1482 dependencies : [threads,
1487 install_rpath : rootlibexecdir,
1489 install_dir : rootbindir)
1490 public_programs += [exe]
1492 executable('systemd-getty-generator',
1493 'src/getty-generator/getty-generator.c',
1494 include_directories : includes,
1495 link_with : [libshared],
1496 install_rpath : rootlibexecdir,
1498 install_dir : systemgeneratordir)
1500 executable('systemd-debug-generator',
1501 'src/debug-generator/debug-generator.c',
1502 include_directories : includes,
1503 link_with : [libshared],
1504 install_rpath : rootlibexecdir,
1506 install_dir : systemgeneratordir)
1508 executable('systemd-fstab-generator',
1509 'src/fstab-generator/fstab-generator.c',
1510 'src/core/mount-setup.c',
1511 include_directories : includes,
1512 link_with : [libshared],
1513 install_rpath : rootlibexecdir,
1515 install_dir : systemgeneratordir)
1517 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1518 executable('30-systemd-environment-d-generator',
1519 'src/environment-d-generator/environment-d-generator.c',
1520 include_directories : includes,
1521 link_with : [libshared],
1522 install_rpath : rootlibexecdir,
1524 install_dir : userenvgeneratordir)
1526 meson.add_install_script(meson_make_symlink,
1527 join_paths(sysconfdir, 'environment'),
1528 join_paths(environmentdir, '99-environment.conf'))
1531 if conf.get('ENABLE_HIBERNATE') == 1
1532 executable('systemd-hibernate-resume-generator',
1533 'src/hibernate-resume/hibernate-resume-generator.c',
1534 include_directories : includes,
1535 link_with : [libshared],
1536 install_rpath : rootlibexecdir,
1538 install_dir : systemgeneratordir)
1540 executable('systemd-hibernate-resume',
1541 'src/hibernate-resume/hibernate-resume.c',
1542 include_directories : includes,
1543 link_with : [libshared],
1544 install_rpath : rootlibexecdir,
1546 install_dir : rootlibexecdir)
1549 if conf.get('HAVE_BLKID') == 1
1550 executable('systemd-gpt-auto-generator',
1551 'src/gpt-auto-generator/gpt-auto-generator.c',
1552 'src/basic/blkid-util.h',
1553 include_directories : includes,
1554 link_with : [libshared],
1555 dependencies : libblkid,
1556 install_rpath : rootlibexecdir,
1558 install_dir : systemgeneratordir)
1560 exe = executable('systemd-dissect',
1561 'src/dissect/dissect.c',
1562 include_directories : includes,
1563 link_with : [libshared],
1564 install_rpath : rootlibexecdir,
1566 install_dir : rootlibexecdir)
1567 public_programs += [exe]
1570 if conf.get('ENABLE_RESOLVE') == 1
1571 executable('systemd-resolved',
1572 systemd_resolved_sources,
1573 include_directories : includes,
1574 link_with : [libshared,
1576 libsystemd_resolve_core],
1577 dependencies : [threads,
1581 install_rpath : rootlibexecdir,
1583 install_dir : rootlibexecdir)
1585 exe = executable('resolvectl',
1587 include_directories : includes,
1588 link_with : [libshared,
1590 libsystemd_resolve_core],
1591 dependencies : [threads,
1595 install_rpath : rootlibexecdir,
1597 public_programs += [exe]
1599 meson.add_install_script(meson_make_symlink,
1600 join_paths(bindir, 'resolvectl'),
1601 join_paths(rootsbindir, 'resolvconf'))
1603 meson.add_install_script(meson_make_symlink,
1604 join_paths(bindir, 'resolvectl'),
1605 join_paths(bindir, 'systemd-resolve'))
1608 if conf.get('ENABLE_LOGIND') == 1
1609 executable('systemd-logind',
1610 systemd_logind_sources,
1611 include_directories : includes,
1612 link_with : [liblogind_core,
1614 dependencies : [threads,
1616 install_rpath : rootlibexecdir,
1618 install_dir : rootlibexecdir)
1620 exe = executable('loginctl',
1622 include_directories : includes,
1623 link_with : [libshared],
1624 dependencies : [threads,
1627 install_rpath : rootlibexecdir,
1629 install_dir : rootbindir)
1630 public_programs += [exe]
1632 exe = executable('systemd-inhibit',
1633 'src/login/inhibit.c',
1634 include_directories : includes,
1635 link_with : [libshared],
1636 install_rpath : rootlibexecdir,
1638 install_dir : rootbindir)
1639 public_programs += [exe]
1641 if conf.get('HAVE_PAM') == 1
1642 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1643 pam_systemd = shared_library(
1647 include_directories : includes,
1648 link_args : ['-shared',
1649 '-Wl,--version-script=' + version_script_arg],
1650 link_with : [libsystemd_static,
1652 dependencies : [threads,
1655 link_depends : pam_systemd_sym,
1657 install_dir : pamlibdir)
1659 test('dlopen-pam_systemd',
1661 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1665 executable('systemd-user-runtime-dir',
1666 user_runtime_dir_sources,
1667 include_directories : includes,
1668 link_with : [libshared, liblogind_core],
1669 install_rpath : rootlibexecdir,
1671 install_dir : rootlibexecdir)
1673 if conf.get('HAVE_PAM') == 1
1674 executable('systemd-user-sessions',
1675 'src/user-sessions/user-sessions.c',
1676 include_directories : includes,
1677 link_with : [libshared],
1678 install_rpath : rootlibexecdir,
1680 install_dir : rootlibexecdir)
1683 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1684 exe = executable('bootctl',
1685 'src/boot/bootctl.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 dependencies : [libblkid],
1689 install_rpath : rootlibexecdir,
1691 public_programs += [exe]
1694 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1695 include_directories : includes,
1696 link_with : [libshared],
1697 dependencies : [threads],
1698 install_rpath : rootlibexecdir,
1700 public_programs += [exe]
1702 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1703 include_directories : includes,
1704 link_with : [libshared],
1705 dependencies : [threads,
1710 install_rpath : rootlibexecdir,
1712 install_dir : rootbindir)
1713 public_programs += [exe]
1715 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1716 meson.add_install_script(meson_make_symlink,
1717 join_paths(rootbindir, 'systemctl'),
1718 join_paths(rootsbindir, alias))
1721 if conf.get('ENABLE_BACKLIGHT') == 1
1722 executable('systemd-backlight',
1723 'src/backlight/backlight.c',
1724 include_directories : includes,
1725 link_with : [libshared],
1726 install_rpath : rootlibexecdir,
1728 install_dir : rootlibexecdir)
1731 if conf.get('ENABLE_RFKILL') == 1
1732 executable('systemd-rfkill',
1733 'src/rfkill/rfkill.c',
1734 include_directories : includes,
1735 link_with : [libshared],
1736 install_rpath : rootlibexecdir,
1738 install_dir : rootlibexecdir)
1741 executable('systemd-system-update-generator',
1742 'src/system-update-generator/system-update-generator.c',
1743 include_directories : includes,
1744 link_with : [libshared],
1745 install_rpath : rootlibexecdir,
1747 install_dir : systemgeneratordir)
1749 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1750 executable('systemd-cryptsetup',
1751 'src/cryptsetup/cryptsetup.c',
1752 include_directories : includes,
1753 link_with : [libshared],
1754 dependencies : [libcryptsetup],
1755 install_rpath : rootlibexecdir,
1757 install_dir : rootlibexecdir)
1759 executable('systemd-cryptsetup-generator',
1760 'src/cryptsetup/cryptsetup-generator.c',
1761 include_directories : includes,
1762 link_with : [libshared],
1763 dependencies : [libcryptsetup],
1764 install_rpath : rootlibexecdir,
1766 install_dir : systemgeneratordir)
1768 executable('systemd-veritysetup',
1769 'src/veritysetup/veritysetup.c',
1770 include_directories : includes,
1771 link_with : [libshared],
1772 dependencies : [libcryptsetup],
1773 install_rpath : rootlibexecdir,
1775 install_dir : rootlibexecdir)
1777 executable('systemd-veritysetup-generator',
1778 'src/veritysetup/veritysetup-generator.c',
1779 include_directories : includes,
1780 link_with : [libshared],
1781 dependencies : [libcryptsetup],
1782 install_rpath : rootlibexecdir,
1784 install_dir : systemgeneratordir)
1787 if conf.get('HAVE_SYSV_COMPAT') == 1
1788 executable('systemd-sysv-generator',
1789 'src/sysv-generator/sysv-generator.c',
1790 include_directories : includes,
1791 link_with : [libshared],
1792 install_rpath : rootlibexecdir,
1794 install_dir : systemgeneratordir)
1796 executable('systemd-rc-local-generator',
1797 'src/rc-local-generator/rc-local-generator.c',
1798 include_directories : includes,
1799 link_with : [libshared],
1800 install_rpath : rootlibexecdir,
1802 install_dir : systemgeneratordir)
1805 if conf.get('ENABLE_HOSTNAMED') == 1
1806 executable('systemd-hostnamed',
1807 'src/hostname/hostnamed.c',
1808 include_directories : includes,
1809 link_with : [libshared],
1810 install_rpath : rootlibexecdir,
1812 install_dir : rootlibexecdir)
1814 exe = executable('hostnamectl',
1815 'src/hostname/hostnamectl.c',
1816 include_directories : includes,
1817 link_with : [libshared],
1818 install_rpath : rootlibexecdir,
1820 public_programs += [exe]
1823 if conf.get('ENABLE_LOCALED') == 1
1824 if conf.get('HAVE_XKBCOMMON') == 1
1825 # logind will load libxkbcommon.so dynamically on its own
1831 executable('systemd-localed',
1832 systemd_localed_sources,
1833 include_directories : includes,
1834 link_with : [libshared],
1835 dependencies : deps,
1836 install_rpath : rootlibexecdir,
1838 install_dir : rootlibexecdir)
1840 exe = executable('localectl',
1842 include_directories : includes,
1843 link_with : [libshared],
1844 install_rpath : rootlibexecdir,
1846 public_programs += [exe]
1849 if conf.get('ENABLE_TIMEDATED') == 1
1850 executable('systemd-timedated',
1851 'src/timedate/timedated.c',
1852 include_directories : includes,
1853 link_with : [libshared],
1854 install_rpath : rootlibexecdir,
1856 install_dir : rootlibexecdir)
1859 if conf.get('ENABLE_TIMEDATECTL') == 1
1860 exe = executable('timedatectl',
1861 'src/timedate/timedatectl.c',
1862 include_directories : includes,
1863 install_rpath : rootlibexecdir,
1864 link_with : [libshared],
1865 dependencies : [libm],
1867 public_programs += [exe]
1870 if conf.get('ENABLE_TIMESYNCD') == 1
1871 executable('systemd-timesyncd',
1872 systemd_timesyncd_sources,
1873 include_directories : includes,
1874 link_with : [libshared],
1875 dependencies : [threads,
1877 install_rpath : rootlibexecdir,
1879 install_dir : rootlibexecdir)
1881 executable('systemd-time-wait-sync',
1882 'src/time-wait-sync/time-wait-sync.c',
1883 include_directories : includes,
1884 link_with : [libshared],
1885 install_rpath : rootlibexecdir,
1887 install_dir : rootlibexecdir)
1890 if conf.get('ENABLE_MACHINED') == 1
1891 executable('systemd-machined',
1892 systemd_machined_sources,
1893 include_directories : includes,
1894 link_with : [libmachine_core,
1896 install_rpath : rootlibexecdir,
1898 install_dir : rootlibexecdir)
1900 exe = executable('machinectl',
1901 'src/machine/machinectl.c',
1902 include_directories : includes,
1903 link_with : [libshared],
1904 dependencies : [threads,
1907 install_rpath : rootlibexecdir,
1909 install_dir : rootbindir)
1910 public_programs += [exe]
1913 if conf.get('ENABLE_IMPORTD') == 1
1914 executable('systemd-importd',
1915 systemd_importd_sources,
1916 include_directories : includes,
1917 link_with : [libshared],
1918 dependencies : [threads],
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootlibexecdir)
1923 systemd_pull = executable('systemd-pull',
1924 systemd_pull_sources,
1925 include_directories : includes,
1926 link_with : [libshared],
1927 dependencies : [libcurl,
1932 install_rpath : rootlibexecdir,
1934 install_dir : rootlibexecdir)
1936 systemd_import = executable('systemd-import',
1937 systemd_import_sources,
1938 include_directories : includes,
1939 link_with : [libshared],
1940 dependencies : [libcurl,
1944 install_rpath : rootlibexecdir,
1946 install_dir : rootlibexecdir)
1948 systemd_export = executable('systemd-export',
1949 systemd_export_sources,
1950 include_directories : includes,
1951 link_with : [libshared],
1952 dependencies : [libcurl,
1956 install_rpath : rootlibexecdir,
1958 install_dir : rootlibexecdir)
1959 public_programs += [systemd_pull, systemd_import, systemd_export]
1962 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1963 exe = executable('systemd-journal-upload',
1964 systemd_journal_upload_sources,
1965 include_directories : includes,
1966 link_with : [libshared],
1967 dependencies : [threads,
1972 install_rpath : rootlibexecdir,
1974 install_dir : rootlibexecdir)
1975 public_programs += [exe]
1978 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1979 s_j_remote = executable('systemd-journal-remote',
1980 systemd_journal_remote_sources,
1981 include_directories : includes,
1982 link_with : [libshared],
1983 dependencies : [threads,
1988 install_rpath : rootlibexecdir,
1990 install_dir : rootlibexecdir)
1992 s_j_gatewayd = executable('systemd-journal-gatewayd',
1993 systemd_journal_gatewayd_sources,
1994 include_directories : includes,
1995 link_with : [libshared],
1996 dependencies : [threads,
2001 install_rpath : rootlibexecdir,
2003 install_dir : rootlibexecdir)
2004 public_programs += [s_j_remote, s_j_gatewayd]
2007 if conf.get('ENABLE_COREDUMP') == 1
2008 executable('systemd-coredump',
2009 systemd_coredump_sources,
2010 include_directories : includes,
2011 link_with : [libshared],
2012 dependencies : [threads,
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2021 exe = executable('coredumpctl',
2022 coredumpctl_sources,
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [threads,
2028 install_rpath : rootlibexecdir,
2030 public_programs += [exe]
2033 if conf.get('ENABLE_BINFMT') == 1
2034 exe = executable('systemd-binfmt',
2035 'src/binfmt/binfmt.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 install_rpath : rootlibexecdir,
2040 install_dir : rootlibexecdir)
2041 public_programs += [exe]
2043 meson.add_install_script('sh', '-c',
2044 mkdir_p.format(binfmtdir))
2045 meson.add_install_script('sh', '-c',
2046 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2049 if conf.get('ENABLE_VCONSOLE') == 1
2050 executable('systemd-vconsole-setup',
2051 'src/vconsole/vconsole-setup.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 install_rpath : rootlibexecdir,
2056 install_dir : rootlibexecdir)
2059 if conf.get('ENABLE_RANDOMSEED') == 1
2060 executable('systemd-random-seed',
2061 'src/random-seed/random-seed.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 install_rpath : rootlibexecdir,
2066 install_dir : rootlibexecdir)
2069 if conf.get('ENABLE_FIRSTBOOT') == 1
2070 executable('systemd-firstboot',
2071 'src/firstboot/firstboot.c',
2072 include_directories : includes,
2073 link_with : [libshared],
2074 dependencies : [libcrypt],
2075 install_rpath : rootlibexecdir,
2077 install_dir : rootbindir)
2080 executable('systemd-remount-fs',
2081 'src/remount-fs/remount-fs.c',
2082 'src/core/mount-setup.c',
2083 'src/core/mount-setup.h',
2084 include_directories : includes,
2085 link_with : [libshared],
2086 install_rpath : rootlibexecdir,
2088 install_dir : rootlibexecdir)
2090 executable('systemd-machine-id-setup',
2091 'src/machine-id-setup/machine-id-setup-main.c',
2092 'src/core/machine-id-setup.c',
2093 'src/core/machine-id-setup.h',
2094 include_directories : includes,
2095 link_with : [libshared],
2096 install_rpath : rootlibexecdir,
2098 install_dir : rootbindir)
2100 executable('systemd-fsck',
2102 include_directories : includes,
2103 link_with : [libshared],
2104 install_rpath : rootlibexecdir,
2106 install_dir : rootlibexecdir)
2108 executable('systemd-growfs',
2109 'src/partition/growfs.c',
2110 include_directories : includes,
2111 link_with : [libshared],
2112 dependencies : [libcryptsetup],
2113 install_rpath : rootlibexecdir,
2115 install_dir : rootlibexecdir)
2117 executable('systemd-makefs',
2118 'src/partition/makefs.c',
2119 include_directories : includes,
2120 link_with : [libshared],
2121 install_rpath : rootlibexecdir,
2123 install_dir : rootlibexecdir)
2125 executable('systemd-sleep',
2126 'src/sleep/sleep.c',
2127 include_directories : includes,
2128 link_with : [libshared],
2129 install_rpath : rootlibexecdir,
2131 install_dir : rootlibexecdir)
2133 exe = executable('systemd-sysctl',
2134 'src/sysctl/sysctl.c',
2135 include_directories : includes,
2136 link_with : [libshared],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2140 public_programs += [exe]
2142 executable('systemd-ac-power',
2143 'src/ac-power/ac-power.c',
2144 include_directories : includes,
2145 link_with : [libshared],
2146 install_rpath : rootlibexecdir,
2148 install_dir : rootlibexecdir)
2150 exe = executable('systemd-detect-virt',
2151 'src/detect-virt/detect-virt.c',
2152 include_directories : includes,
2153 link_with : [libshared],
2154 install_rpath : rootlibexecdir,
2156 public_programs += [exe]
2158 exe = executable('systemd-delta',
2159 'src/delta/delta.c',
2160 include_directories : includes,
2161 link_with : [libshared],
2162 install_rpath : rootlibexecdir,
2164 public_programs += [exe]
2166 exe = executable('systemd-escape',
2167 'src/escape/escape.c',
2168 include_directories : includes,
2169 link_with : [libshared],
2170 install_rpath : rootlibexecdir,
2172 install_dir : rootbindir)
2173 public_programs += [exe]
2175 exe = executable('systemd-notify',
2176 'src/notify/notify.c',
2177 include_directories : includes,
2178 link_with : [libshared],
2179 install_rpath : rootlibexecdir,
2181 install_dir : rootbindir)
2182 public_programs += [exe]
2184 executable('systemd-volatile-root',
2185 'src/volatile-root/volatile-root.c',
2186 include_directories : includes,
2187 link_with : [libshared],
2188 install_rpath : rootlibexecdir,
2190 install_dir : rootlibexecdir)
2192 executable('systemd-cgroups-agent',
2193 'src/cgroups-agent/cgroups-agent.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 install_rpath : rootlibexecdir,
2198 install_dir : rootlibexecdir)
2200 exe = executable('systemd-path',
2202 include_directories : includes,
2203 link_with : [libshared],
2204 install_rpath : rootlibexecdir,
2206 public_programs += [exe]
2208 exe = executable('systemd-ask-password',
2209 'src/ask-password/ask-password.c',
2210 include_directories : includes,
2211 link_with : [libshared],
2212 install_rpath : rootlibexecdir,
2214 install_dir : rootbindir)
2215 public_programs += [exe]
2217 executable('systemd-reply-password',
2218 'src/reply-password/reply-password.c',
2219 include_directories : includes,
2220 link_with : [libshared],
2221 install_rpath : rootlibexecdir,
2223 install_dir : rootlibexecdir)
2225 exe = executable('systemd-tty-ask-password-agent',
2226 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2227 include_directories : includes,
2228 link_with : [libshared],
2229 install_rpath : rootlibexecdir,
2231 install_dir : rootbindir)
2232 public_programs += [exe]
2234 exe = executable('systemd-cgls',
2236 include_directories : includes,
2237 link_with : [libshared],
2238 install_rpath : rootlibexecdir,
2240 public_programs += [exe]
2242 exe = executable('systemd-cgtop',
2243 'src/cgtop/cgtop.c',
2244 include_directories : includes,
2245 link_with : [libshared],
2246 install_rpath : rootlibexecdir,
2248 public_programs += [exe]
2250 executable('systemd-initctl',
2251 'src/initctl/initctl.c',
2252 include_directories : includes,
2253 link_with : [libshared],
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootlibexecdir)
2258 exe = executable('systemd-mount',
2259 'src/mount/mount-tool.c',
2260 include_directories : includes,
2261 link_with : [libshared],
2262 install_rpath : rootlibexecdir,
2264 public_programs += [exe]
2266 meson.add_install_script(meson_make_symlink,
2267 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2269 exe = executable('systemd-run',
2271 include_directories : includes,
2272 link_with : [libshared],
2273 install_rpath : rootlibexecdir,
2275 public_programs += [exe]
2277 exe = executable('systemd-stdio-bridge',
2278 'src/stdio-bridge/stdio-bridge.c',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 install_rpath : rootlibexecdir,
2283 public_programs += [exe]
2285 exe = executable('busctl',
2286 'src/busctl/busctl.c',
2287 'src/busctl/busctl-introspect.c',
2288 'src/busctl/busctl-introspect.h',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 install_rpath : rootlibexecdir,
2293 public_programs += [exe]
2295 if conf.get('ENABLE_SYSUSERS') == 1
2296 exe = executable('systemd-sysusers',
2297 'src/sysusers/sysusers.c',
2298 include_directories : includes,
2299 link_with : [libshared],
2300 install_rpath : rootlibexecdir,
2302 install_dir : rootbindir)
2303 public_programs += [exe]
2306 if conf.get('ENABLE_TMPFILES') == 1
2307 exe = executable('systemd-tmpfiles',
2308 'src/tmpfiles/tmpfiles.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 dependencies : [libacl],
2312 install_rpath : rootlibexecdir,
2314 install_dir : rootbindir)
2315 public_programs += [exe]
2317 test('test-systemd-tmpfiles',
2318 test_systemd_tmpfiles_py,
2319 args : exe.full_path())
2320 # https://github.com/mesonbuild/meson/issues/2681
2323 if conf.get('ENABLE_HWDB') == 1
2324 exe = executable('systemd-hwdb',
2326 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2327 include_directories : includes,
2328 link_with : [libudev_static],
2329 install_rpath : udev_rpath,
2331 install_dir : rootbindir)
2332 public_programs += [exe]
2335 if conf.get('ENABLE_QUOTACHECK') == 1
2336 executable('systemd-quotacheck',
2337 'src/quotacheck/quotacheck.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2342 install_dir : rootlibexecdir)
2345 exe = executable('systemd-socket-proxyd',
2346 'src/socket-proxy/socket-proxyd.c',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 dependencies : [threads],
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2353 public_programs += [exe]
2355 exe = executable('systemd-udevd',
2356 systemd_udevd_sources,
2357 include_directories : includes,
2358 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2359 link_with : [libudev_core,
2362 dependencies : [threads,
2367 install_rpath : udev_rpath,
2369 install_dir : rootlibexecdir)
2370 public_programs += [exe]
2372 exe = executable('udevadm',
2374 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2375 include_directories : includes,
2376 link_with : [libudev_core,
2379 dependencies : [threads,
2384 install_rpath : udev_rpath,
2386 install_dir : rootbindir)
2387 public_programs += [exe]
2389 executable('systemd-shutdown',
2390 systemd_shutdown_sources,
2391 include_directories : includes,
2392 link_with : [libshared],
2393 dependencies : [libmount],
2394 install_rpath : rootlibexecdir,
2396 install_dir : rootlibexecdir)
2398 executable('systemd-update-done',
2399 'src/update-done/update-done.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootlibexecdir)
2406 executable('systemd-update-utmp',
2407 'src/update-utmp/update-utmp.c',
2408 include_directories : includes,
2409 link_with : [libshared],
2410 dependencies : [libaudit],
2411 install_rpath : rootlibexecdir,
2413 install_dir : rootlibexecdir)
2415 if conf.get('HAVE_KMOD') == 1
2416 executable('systemd-modules-load',
2417 'src/modules-load/modules-load.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 dependencies : [libkmod],
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootlibexecdir)
2425 meson.add_install_script('sh', '-c',
2426 mkdir_p.format(modulesloaddir))
2427 meson.add_install_script('sh', '-c',
2428 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2431 exe = executable('systemd-nspawn',
2432 systemd_nspawn_sources,
2433 'src/core/mount-setup.c', # FIXME: use a variable?
2434 'src/core/mount-setup.h',
2435 'src/core/loopback-setup.c',
2436 'src/core/loopback-setup.h',
2437 include_directories : [includes, include_directories('src/nspawn')],
2438 link_with : [libshared],
2439 dependencies : [libacl,
2443 install_rpath : rootlibexecdir,
2445 public_programs += [exe]
2447 if conf.get('ENABLE_NETWORKD') == 1
2448 executable('systemd-networkd',
2449 systemd_networkd_sources,
2450 include_directories : includes,
2451 link_with : [libnetworkd_core,
2455 dependencies : [threads],
2456 install_rpath : rootlibexecdir,
2458 install_dir : rootlibexecdir)
2460 executable('systemd-networkd-wait-online',
2461 systemd_networkd_wait_online_sources,
2462 include_directories : includes,
2463 link_with : [libnetworkd_core,
2465 install_rpath : rootlibexecdir,
2467 install_dir : rootlibexecdir)
2469 exe = executable('networkctl',
2471 include_directories : includes,
2472 link_with : [libsystemd_network,
2474 install_rpath : rootlibexecdir,
2476 install_dir : rootbindir)
2477 public_programs += [exe]
2480 executable('systemd-sulogin-shell',
2481 ['src/sulogin-shell/sulogin-shell.c'],
2482 include_directories : includes,
2483 link_with : [libshared],
2484 install_rpath : rootlibexecdir,
2486 install_dir : rootlibexecdir)
2488 ############################################################
2490 foreach tuple : tests
2492 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2493 dependencies = tuple[2]
2494 condition = tuple.length() >= 4 ? tuple[3] : ''
2495 type = tuple.length() >= 5 ? tuple[4] : ''
2496 defs = tuple.length() >= 6 ? tuple[5] : []
2497 incs = tuple.length() >= 7 ? tuple[6] : includes
2500 name = sources[0].split('/')[-1].split('.')[0]
2501 if type.startswith('timeout=')
2502 timeout = type.split('=')[1].to_int()
2505 if want_tests == 'false'
2506 message('Not compiling @0@ because tests is set to false'.format(name))
2507 elif condition == '' or conf.get(condition) == 1
2511 include_directories : incs,
2512 link_with : link_with,
2513 dependencies : dependencies,
2515 install_rpath : rootlibexecdir,
2516 install : install_tests,
2517 install_dir : join_paths(testsdir, type))
2520 message('@0@ is a manual test'.format(name))
2521 elif type == 'unsafe' and want_tests != 'unsafe'
2522 message('@0@ is an unsafe test'.format(name))
2529 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2534 'test-libsystemd-sym',
2535 test_libsystemd_sym_c,
2536 include_directories : includes,
2537 link_with : [libsystemd],
2538 install : install_tests,
2539 install_dir : testsdir)
2540 test('test-libsystemd-sym', exe)
2543 'test-libsystemd-static-sym',
2544 test_libsystemd_sym_c,
2545 include_directories : includes,
2546 link_with : [install_libsystemd_static],
2547 dependencies : [threads], # threads is already included in dependencies on the library,
2548 # but does not seem to get propagated. Add here as a work-around.
2549 build_by_default : static_libsystemd_pic,
2550 install : install_tests and static_libsystemd_pic,
2551 install_dir : testsdir)
2552 if static_libsystemd_pic
2553 test('test-libsystemd-static-sym', exe)
2559 include_directories : includes,
2560 c_args : ['-Wno-deprecated-declarations'],
2561 link_with : [libudev],
2562 install : install_tests,
2563 install_dir : testsdir)
2564 test('test-libudev-sym', exe)
2567 'test-libudev-static-sym',
2569 include_directories : includes,
2570 c_args : ['-Wno-deprecated-declarations'],
2571 link_with : [install_libudev_static],
2572 build_by_default : static_libudev_pic,
2573 install : install_tests and static_libudev_pic,
2574 install_dir : testsdir)
2575 if static_libudev_pic
2576 test('test-libudev-static-sym', exe)
2579 ############################################################
2583 foreach tuple : fuzzers
2585 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2586 dependencies = tuple[2]
2587 defs = tuple.length() >= 4 ? tuple[3] : []
2588 incs = tuple.length() >= 5 ? tuple[4] : includes
2591 dependencies += fuzzing_engine
2593 sources += 'src/fuzz/fuzz-main.c'
2596 name = sources[0].split('/')[-1].split('.')[0]
2598 fuzzer_exes += executable(
2601 include_directories : [incs, include_directories('src/fuzz')],
2602 link_with : link_with,
2603 dependencies : dependencies,
2608 run_target('fuzzers',
2609 depends : fuzzer_exes,
2612 ############################################################
2614 make_directive_index_py = find_program('tools/make-directive-index.py')
2615 make_man_index_py = find_program('tools/make-man-index.py')
2616 xml_helper_py = find_program('tools/xml_helper.py')
2617 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2621 subdir('sysusers.d')
2622 subdir('tmpfiles.d')
2627 subdir('shell-completion/bash')
2628 subdir('shell-completion/zsh')
2629 subdir('doc/sysvinit')
2630 subdir('doc/var-log')
2632 # FIXME: figure out if the warning is true:
2633 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2634 install_subdir('factory/etc',
2635 install_dir : factorydir)
2638 install_data('xorg/50-systemd-user.sh',
2639 install_dir : xinitrcdir)
2640 install_data('modprobe.d/systemd.conf',
2641 install_dir : modprobedir)
2642 install_data('LICENSE.GPL2',
2647 'doc/DISTRO_PORTING',
2648 'doc/ENVIRONMENT.md',
2650 'doc/TRANSIENT-SETTINGS.md',
2653 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2654 install_dir : docdir)
2656 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2657 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2659 ############################################################
2661 meson_check_help = find_program('tools/meson-check-help.sh')
2663 foreach exec : public_programs
2664 name = exec.full_path().split('/')[-1]
2665 test('check-help-' + name,
2667 args : [exec.full_path()])
2670 ############################################################
2672 # Enable tests for all supported sanitizers
2673 foreach tuple : sanitizers
2674 sanitizer = tuple[0]
2677 have = run_command(check_compilation_sh,
2678 cc.cmd_array(), '-x', 'c',
2679 '-fsanitize=@0@'.format(sanitizer),
2680 '-include', link_test_c).returncode() == 0
2681 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2685 foreach p : fuzz_regression_tests
2686 b = p.split('/')[-2]
2687 c = p.split('/')[-1]
2689 name = '@0@:@1@'.format(b, sanitizer)
2692 if want_tests == 'false'
2693 message('Not compiling @0@ because tests is set to false'.format(name))
2695 exe = custom_target(
2699 command : [env, 'ln', '-fs',
2700 join_paths(build.full_path(), b),
2702 build_by_default : true)
2704 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2709 if want_tests != 'false' and slow_tests
2710 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2712 args : [exe.full_path(),
2713 join_paths(meson.source_root(),
2714 'test/fuzz-regressions',
2722 ############################################################
2725 all_files = run_command(
2727 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2730 all_files = files(all_files.stdout().split())
2735 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2739 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2743 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2746 command : [meson_git_contrib_sh])
2750 git_head = run_command(
2752 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2753 'rev-parse', 'HEAD']).stdout().strip()
2754 git_head_short = run_command(
2756 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2757 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2761 command : ['git', 'archive',
2762 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2764 '--prefix', 'systemd-@0@/'.format(git_head),
2768 ############################################################
2770 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2773 depends : [man, libsystemd, libudev],
2774 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2776 ############################################################
2779 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2781 'split /usr: @0@'.format(split_usr),
2782 'split bin-sbin: @0@'.format(split_bin),
2783 'prefix directory: @0@'.format(prefixdir),
2784 'rootprefix directory: @0@'.format(rootprefixdir),
2785 'sysconf directory: @0@'.format(sysconfdir),
2786 'include directory: @0@'.format(includedir),
2787 'lib directory: @0@'.format(libdir),
2788 'rootlib directory: @0@'.format(rootlibdir),
2789 'SysV init scripts: @0@'.format(sysvinit_path),
2790 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2791 'PAM modules directory: @0@'.format(pamlibdir),
2792 'PAM configuration directory: @0@'.format(pamconfdir),
2793 'RPM macros directory: @0@'.format(rpmmacrosdir),
2794 'modprobe.d directory: @0@'.format(modprobedir),
2795 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2796 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2797 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2798 'bash completions directory: @0@'.format(bashcompletiondir),
2799 'zsh completions directory: @0@'.format(zshcompletiondir),
2800 'extra start script: @0@'.format(get_option('rc-local')),
2801 'extra stop script: @0@'.format(get_option('halt-local')),
2802 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2803 get_option('debug-tty')),
2804 'TTY GID: @0@'.format(tty_gid),
2805 'users GID: @0@'.format(users_gid),
2806 'maximum system UID: @0@'.format(system_uid_max),
2807 'maximum system GID: @0@'.format(system_gid_max),
2808 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2809 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2810 'minimum container UID base: @0@'.format(container_uid_base_min),
2811 'maximum container UID base: @0@'.format(container_uid_base_max),
2812 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2813 'render group access mode: @0@'.format(get_option('group-render-mode')),
2814 'certificate root directory: @0@'.format(get_option('certificate-root')),
2815 'support URL: @0@'.format(support_url),
2816 'nobody user name: @0@'.format(nobody_user),
2817 'nobody group name: @0@'.format(nobody_group),
2818 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2819 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2821 'default DNSSEC mode: @0@'.format(default_dnssec),
2822 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2823 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2825 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2826 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2828 'default DNS servers: @0@'.format(alt_dns_servers),
2829 'default NTP servers: @0@'.format(alt_ntp_servers)]
2831 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2832 '@@0@'.format(time_epoch)).stdout().strip()
2834 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2837 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2838 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2839 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2841 if conf.get('ENABLE_EFI') == 1
2843 'efi arch: @0@'.format(efi_arch)]
2847 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2848 'EFI CC @0@'.format(efi_cc),
2849 'EFI lib directory: @0@'.format(efi_libdir),
2850 'EFI lds directory: @0@'.format(efi_ldsdir),
2851 'EFI include directory: @0@'.format(efi_incdir)]
2904 ['legacy pkla', install_polkit_pkla],
2906 ['gnu-efi', have_gnu_efi],
2913 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2916 ['man pages', want_man],
2917 ['html pages', want_html],
2918 ['man page indices', want_man and have_lxml],
2923 ['adm group', get_option('adm-group')],
2924 ['wheel group', get_option('wheel-group')],
2927 ['debug mmap cache'],
2930 if tuple.length() >= 2
2933 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2934 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2935 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2940 missing += [tuple[0]]
2946 'enabled features: @0@'.format(', '.join(found)),
2948 'disabled features: @0@'.format(', '.join(missing)),
2950 message('\n '.join(status))
2952 if rootprefixdir != rootprefix_default
2954 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2955 'systemd used fixed names for unit file directories and other paths, so anything\n' +
2956 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))