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 debug = get_option('debug')
764 enable_debug_hashmap = false
765 enable_debug_mmap_cache = false
767 foreach name : debug.split(',')
769 enable_debug_hashmap = true
770 elif name == 'mmap-cache'
771 enable_debug_mmap_cache = true
773 message('unknown debug option "@0@", ignoring'.format(name))
777 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
778 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
780 #####################################################################
782 threads = dependency('threads')
783 librt = cc.find_library('rt')
784 libm = cc.find_library('m')
785 libdl = cc.find_library('dl')
786 libcrypt = cc.find_library('crypt')
788 libcap = dependency('libcap', required : false)
789 if not libcap.found()
790 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
791 libcap = cc.find_library('cap')
794 libmount = dependency('mount',
795 version : fuzzer_build ? '>= 0' : '>= 2.30')
797 want_seccomp = get_option('seccomp')
798 if want_seccomp != 'false' and not fuzzer_build
799 libseccomp = dependency('libseccomp',
800 version : '>= 2.3.1',
801 required : want_seccomp == 'true')
802 have = libseccomp.found()
807 conf.set10('HAVE_SECCOMP', have)
809 want_selinux = get_option('selinux')
810 if want_selinux != 'false' and not fuzzer_build
811 libselinux = dependency('libselinux',
812 version : '>= 2.1.9',
813 required : want_selinux == 'true')
814 have = libselinux.found()
819 conf.set10('HAVE_SELINUX', have)
821 want_apparmor = get_option('apparmor')
822 if want_apparmor != 'false' and not fuzzer_build
823 libapparmor = dependency('libapparmor',
824 required : want_apparmor == 'true')
825 have = libapparmor.found()
830 conf.set10('HAVE_APPARMOR', have)
832 smack_run_label = get_option('smack-run-label')
833 if smack_run_label != ''
834 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
837 want_polkit = get_option('polkit')
838 install_polkit = false
839 install_polkit_pkla = false
840 if want_polkit != 'false' and not fuzzer_build
841 install_polkit = true
843 libpolkit = dependency('polkit-gobject-1',
845 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
846 message('Old polkit detected, will install pkla files')
847 install_polkit_pkla = true
850 conf.set10('ENABLE_POLKIT', install_polkit)
852 want_acl = get_option('acl')
853 if want_acl != 'false' and not fuzzer_build
854 libacl = cc.find_library('acl', required : want_acl == 'true')
855 have = libacl.found()
860 conf.set10('HAVE_ACL', have)
862 want_audit = get_option('audit')
863 if want_audit != 'false' and not fuzzer_build
864 libaudit = dependency('audit', required : want_audit == 'true')
865 have = libaudit.found()
870 conf.set10('HAVE_AUDIT', have)
872 want_blkid = get_option('blkid')
873 if want_blkid != 'false' and not fuzzer_build
874 libblkid = dependency('blkid', required : want_blkid == 'true')
875 have = libblkid.found()
880 conf.set10('HAVE_BLKID', have)
882 want_kmod = get_option('kmod')
883 if want_kmod != 'false' and not fuzzer_build
884 libkmod = dependency('libkmod',
886 required : want_kmod == 'true')
887 have = libkmod.found()
892 conf.set10('HAVE_KMOD', have)
894 want_pam = get_option('pam')
895 if want_pam != 'false' and not fuzzer_build
896 libpam = cc.find_library('pam', required : want_pam == 'true')
897 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
898 have = libpam.found() and libpam_misc.found()
904 conf.set10('HAVE_PAM', have)
906 want_microhttpd = get_option('microhttpd')
907 if want_microhttpd != 'false' and not fuzzer_build
908 libmicrohttpd = dependency('libmicrohttpd',
909 version : '>= 0.9.33',
910 required : want_microhttpd == 'true')
911 have = libmicrohttpd.found()
916 conf.set10('HAVE_MICROHTTPD', have)
918 want_libcryptsetup = get_option('libcryptsetup')
919 if want_libcryptsetup != 'false' and not fuzzer_build
920 libcryptsetup = dependency('libcryptsetup',
921 version : '>= 1.6.0',
922 required : want_libcryptsetup == 'true')
923 have = libcryptsetup.found()
928 conf.set10('HAVE_LIBCRYPTSETUP', have)
930 want_libcurl = get_option('libcurl')
931 if want_libcurl != 'false' and not fuzzer_build
932 libcurl = dependency('libcurl',
933 version : '>= 7.32.0',
934 required : want_libcurl == 'true')
935 have = libcurl.found()
940 conf.set10('HAVE_LIBCURL', have)
942 want_libidn = get_option('libidn')
943 want_libidn2 = get_option('libidn2')
944 if want_libidn == 'true' and want_libidn2 == 'true'
945 error('libidn and libidn2 cannot be requested simultaneously')
948 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
949 libidn = dependency('libidn',
950 required : want_libidn == 'true')
951 have = libidn.found()
956 conf.set10('HAVE_LIBIDN', have)
957 if not have and want_libidn2 != 'false' and not fuzzer_build
958 # libidn is used for both libidn and libidn2 objects
959 libidn = dependency('libidn2',
960 required : want_libidn2 == 'true')
961 have = libidn.found()
965 conf.set10('HAVE_LIBIDN2', have)
967 want_libiptc = get_option('libiptc')
968 if want_libiptc != 'false' and not fuzzer_build
969 libiptc = dependency('libiptc',
970 required : want_libiptc == 'true')
971 have = libiptc.found()
976 conf.set10('HAVE_LIBIPTC', have)
978 want_qrencode = get_option('qrencode')
979 if want_qrencode != 'false' and not fuzzer_build
980 libqrencode = dependency('libqrencode',
981 required : want_qrencode == 'true')
982 have = libqrencode.found()
987 conf.set10('HAVE_QRENCODE', have)
989 want_gcrypt = get_option('gcrypt')
990 if want_gcrypt != 'false' and not fuzzer_build
991 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
992 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
993 have = libgcrypt.found() and libgpg_error.found()
998 # link to neither of the libs if one is not found
1002 conf.set10('HAVE_GCRYPT', have)
1004 want_gnutls = get_option('gnutls')
1005 if want_gnutls != 'false' and not fuzzer_build
1006 libgnutls = dependency('gnutls',
1007 version : '>= 3.1.4',
1008 required : want_gnutls == 'true')
1009 have = libgnutls.found()
1014 conf.set10('HAVE_GNUTLS', have)
1016 want_elfutils = get_option('elfutils')
1017 if want_elfutils != 'false' and not fuzzer_build
1018 libdw = dependency('libdw',
1019 required : want_elfutils == 'true')
1020 have = libdw.found()
1025 conf.set10('HAVE_ELFUTILS', have)
1027 want_zlib = get_option('zlib')
1028 if want_zlib != 'false' and not fuzzer_build
1029 libz = dependency('zlib',
1030 required : want_zlib == 'true')
1036 conf.set10('HAVE_ZLIB', have)
1038 want_bzip2 = get_option('bzip2')
1039 if want_bzip2 != 'false' and not fuzzer_build
1040 libbzip2 = cc.find_library('bz2',
1041 required : want_bzip2 == 'true')
1042 have = libbzip2.found()
1047 conf.set10('HAVE_BZIP2', have)
1049 want_xz = get_option('xz')
1050 if want_xz != 'false' and not fuzzer_build
1051 libxz = dependency('liblzma',
1052 required : want_xz == 'true')
1053 have = libxz.found()
1058 conf.set10('HAVE_XZ', have)
1060 want_lz4 = get_option('lz4')
1061 if want_lz4 != 'false' and not fuzzer_build
1062 liblz4 = dependency('liblz4',
1063 required : want_lz4 == 'true')
1064 have = liblz4.found()
1069 conf.set10('HAVE_LZ4', have)
1071 want_xkbcommon = get_option('xkbcommon')
1072 if want_xkbcommon != 'false' and not fuzzer_build
1073 libxkbcommon = dependency('xkbcommon',
1074 version : '>= 0.3.0',
1075 required : want_xkbcommon == 'true')
1076 have = libxkbcommon.found()
1081 conf.set10('HAVE_XKBCOMMON', have)
1083 want_pcre2 = get_option('pcre2')
1084 if want_pcre2 != 'false'
1085 libpcre2 = dependency('libpcre2-8',
1086 required : want_pcre2 == 'true')
1087 have = libpcre2.found()
1092 conf.set10('HAVE_PCRE2', have)
1094 want_glib = get_option('glib')
1095 if want_glib != 'false' and not fuzzer_build
1096 libglib = dependency('glib-2.0',
1097 version : '>= 2.22.0',
1098 required : want_glib == 'true')
1099 libgobject = dependency('gobject-2.0',
1100 version : '>= 2.22.0',
1101 required : want_glib == 'true')
1102 libgio = dependency('gio-2.0',
1103 required : want_glib == 'true')
1104 have = libglib.found() and libgobject.found() and libgio.found()
1111 conf.set10('HAVE_GLIB', have)
1113 want_dbus = get_option('dbus')
1114 if want_dbus != 'false' and not fuzzer_build
1115 libdbus = dependency('dbus-1',
1116 version : '>= 1.3.2',
1117 required : want_dbus == 'true')
1118 have = libdbus.found()
1123 conf.set10('HAVE_DBUS', have)
1125 default_dnssec = get_option('default-dnssec')
1127 default_dnssec = 'no'
1129 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1130 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1131 default_dnssec = 'no'
1133 conf.set('DEFAULT_DNSSEC_MODE',
1134 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1135 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1137 want_importd = get_option('importd')
1138 if want_importd != 'false'
1139 have = (conf.get('HAVE_LIBCURL') == 1 and
1140 conf.get('HAVE_ZLIB') == 1 and
1141 conf.get('HAVE_BZIP2') == 1 and
1142 conf.get('HAVE_XZ') == 1 and
1143 conf.get('HAVE_GCRYPT') == 1)
1144 if want_importd == 'true' and not have
1145 error('importd support was requested, but dependencies are not available')
1150 conf.set10('ENABLE_IMPORTD', have)
1152 want_remote = get_option('remote')
1153 if want_remote != 'false'
1154 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1155 conf.get('HAVE_LIBCURL') == 1]
1156 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1157 # it's possible to build one without the other. Complain only if
1158 # support was explictly requested. The auxiliary files like sysusers
1159 # config should be installed when any of the programs are built.
1160 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1161 error('remote support was requested, but dependencies are not available')
1163 have = have_deps[0] or have_deps[1]
1167 conf.set10('ENABLE_REMOTE', have)
1169 foreach term : ['utmp',
1200 have = get_option(term)
1201 name = 'ENABLE_' + term.underscorify().to_upper()
1202 conf.set10(name, have)
1205 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1207 want_tests = get_option('tests')
1208 install_tests = get_option('install-tests')
1209 slow_tests = get_option('slow-tests')
1213 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1215 #####################################################################
1217 if get_option('efi')
1218 efi_arch = host_machine.cpu_family()
1220 if efi_arch == 'x86'
1221 EFI_MACHINE_TYPE_NAME = 'ia32'
1222 gnu_efi_arch = 'ia32'
1223 elif efi_arch == 'x86_64'
1224 EFI_MACHINE_TYPE_NAME = 'x64'
1225 gnu_efi_arch = 'x86_64'
1226 elif efi_arch == 'arm'
1227 EFI_MACHINE_TYPE_NAME = 'arm'
1228 gnu_efi_arch = 'arm'
1229 elif efi_arch == 'aarch64'
1230 EFI_MACHINE_TYPE_NAME = 'aa64'
1231 gnu_efi_arch = 'aarch64'
1233 EFI_MACHINE_TYPE_NAME = ''
1238 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1240 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1244 conf.set10('ENABLE_EFI', have)
1246 #####################################################################
1248 config_h = configure_file(
1249 output : 'config.h',
1250 configuration : conf)
1252 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1254 includes = include_directories('src/basic',
1260 'src/time-wait-sync',
1265 'src/libsystemd/sd-bus',
1266 'src/libsystemd/sd-device',
1267 'src/libsystemd/sd-hwdb',
1268 'src/libsystemd/sd-id128',
1269 'src/libsystemd/sd-netlink',
1270 'src/libsystemd/sd-network',
1271 'src/libsystemd-network',
1274 add_project_arguments('-include', 'config.h', language : 'c')
1278 subdir('src/systemd')
1280 subdir('src/libsystemd')
1281 subdir('src/libsystemd-network')
1282 subdir('src/journal')
1285 libjournal_core = static_library(
1287 libjournal_core_sources,
1289 include_directories : includes,
1292 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1293 libsystemd = shared_library(
1295 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1296 version : libsystemd_version,
1297 include_directories : includes,
1298 link_args : ['-shared',
1299 '-Wl,--version-script=' + libsystemd_sym_path],
1300 link_with : [libbasic,
1302 link_whole : [libsystemd_static,
1304 dependencies : [threads,
1308 link_depends : libsystemd_sym,
1310 install_dir : rootlibdir)
1312 static_libsystemd = get_option('static-libsystemd')
1313 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1315 install_libsystemd_static = static_library(
1318 journal_client_sources,
1320 basic_gcrypt_sources,
1321 include_directories : includes,
1322 build_by_default : static_libsystemd != 'false',
1323 install : static_libsystemd != 'false',
1324 install_dir : rootlibdir,
1325 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1326 dependencies : [threads,
1335 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1337 ############################################################
1339 # binaries that have --help and are intended for use by humans,
1340 # usually, but not always, installed in /bin.
1341 public_programs = []
1343 subdir('src/libudev')
1344 subdir('src/shared')
1347 subdir('src/network')
1349 subdir('src/analyze')
1350 subdir('src/journal-remote')
1351 subdir('src/coredump')
1352 subdir('src/hostname')
1353 subdir('src/import')
1354 subdir('src/kernel-install')
1355 subdir('src/locale')
1356 subdir('src/machine')
1357 subdir('src/nspawn')
1358 subdir('src/resolve')
1359 subdir('src/timedate')
1360 subdir('src/timesync')
1361 subdir('src/vconsole')
1362 subdir('src/boot/efi')
1369 ############################################################
1371 # only static linking apart from libdl, to make sure that the
1372 # module is linked to all libraries that it uses.
1373 test_dlopen = executable(
1376 include_directories : includes,
1377 link_with : [libbasic],
1378 dependencies : [libdl])
1380 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1381 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1382 ['mymachines', 'ENABLE_MACHINED'],
1383 ['resolve', 'ENABLE_RESOLVE']]
1385 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1389 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1390 version_script_arg = join_paths(meson.current_source_dir(), sym)
1392 nss = shared_library(
1394 'src/nss-@0@/nss-@0@.c'.format(module),
1396 include_directories : includes,
1397 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1398 link_args : ['-Wl,-z,nodelete',
1400 '-Wl,--version-script=' + version_script_arg,
1402 link_with : [libsystemd_static,
1404 dependencies : [threads,
1408 install_dir : rootlibdir)
1410 # We cannot use shared_module because it does not support version suffix.
1411 # Unfortunately shared_library insists on creating the symlink…
1412 meson.add_install_script('sh', '-c',
1413 'rm $DESTDIR@0@/libnss_@1@.so'
1414 .format(rootlibdir, module))
1416 test('dlopen-nss_' + module,
1418 args : [nss.full_path()]) # path to dlopen must include a slash
1422 ############################################################
1424 executable('systemd',
1426 include_directories : includes,
1427 link_with : [libcore,
1429 dependencies : [threads,
1435 install_rpath : rootlibexecdir,
1437 install_dir : rootlibexecdir)
1439 meson.add_install_script(meson_make_symlink,
1440 join_paths(rootlibexecdir, 'systemd'),
1441 join_paths(rootsbindir, 'init'))
1443 exe = executable('systemd-analyze',
1444 systemd_analyze_sources,
1445 include_directories : includes,
1446 link_with : [libcore,
1448 dependencies : [threads,
1454 install_rpath : rootlibexecdir,
1456 public_programs += [exe]
1458 executable('systemd-journald',
1459 systemd_journald_sources,
1460 include_directories : includes,
1461 link_with : [libjournal_core,
1463 dependencies : [threads,
1467 install_rpath : rootlibexecdir,
1469 install_dir : rootlibexecdir)
1471 exe = executable('systemd-cat',
1472 systemd_cat_sources,
1473 include_directories : includes,
1474 link_with : [libjournal_core,
1476 dependencies : [threads],
1477 install_rpath : rootlibexecdir,
1479 public_programs += [exe]
1481 exe = executable('journalctl',
1483 include_directories : includes,
1484 link_with : [libshared],
1485 dependencies : [threads,
1490 install_rpath : rootlibexecdir,
1492 install_dir : rootbindir)
1493 public_programs += [exe]
1495 executable('systemd-getty-generator',
1496 'src/getty-generator/getty-generator.c',
1497 include_directories : includes,
1498 link_with : [libshared],
1499 install_rpath : rootlibexecdir,
1501 install_dir : systemgeneratordir)
1503 executable('systemd-debug-generator',
1504 'src/debug-generator/debug-generator.c',
1505 include_directories : includes,
1506 link_with : [libshared],
1507 install_rpath : rootlibexecdir,
1509 install_dir : systemgeneratordir)
1511 executable('systemd-fstab-generator',
1512 'src/fstab-generator/fstab-generator.c',
1513 'src/core/mount-setup.c',
1514 include_directories : includes,
1515 link_with : [libshared],
1516 install_rpath : rootlibexecdir,
1518 install_dir : systemgeneratordir)
1520 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1521 executable('30-systemd-environment-d-generator',
1522 'src/environment-d-generator/environment-d-generator.c',
1523 include_directories : includes,
1524 link_with : [libshared],
1525 install_rpath : rootlibexecdir,
1527 install_dir : userenvgeneratordir)
1529 meson.add_install_script(meson_make_symlink,
1530 join_paths(sysconfdir, 'environment'),
1531 join_paths(environmentdir, '99-environment.conf'))
1534 if conf.get('ENABLE_HIBERNATE') == 1
1535 executable('systemd-hibernate-resume-generator',
1536 'src/hibernate-resume/hibernate-resume-generator.c',
1537 include_directories : includes,
1538 link_with : [libshared],
1539 install_rpath : rootlibexecdir,
1541 install_dir : systemgeneratordir)
1543 executable('systemd-hibernate-resume',
1544 'src/hibernate-resume/hibernate-resume.c',
1545 include_directories : includes,
1546 link_with : [libshared],
1547 install_rpath : rootlibexecdir,
1549 install_dir : rootlibexecdir)
1552 if conf.get('HAVE_BLKID') == 1
1553 executable('systemd-gpt-auto-generator',
1554 'src/gpt-auto-generator/gpt-auto-generator.c',
1555 'src/basic/blkid-util.h',
1556 include_directories : includes,
1557 link_with : [libshared],
1558 dependencies : libblkid,
1559 install_rpath : rootlibexecdir,
1561 install_dir : systemgeneratordir)
1563 exe = executable('systemd-dissect',
1564 'src/dissect/dissect.c',
1565 include_directories : includes,
1566 link_with : [libshared],
1567 install_rpath : rootlibexecdir,
1569 install_dir : rootlibexecdir)
1570 public_programs += [exe]
1573 if conf.get('ENABLE_RESOLVE') == 1
1574 executable('systemd-resolved',
1575 systemd_resolved_sources,
1576 include_directories : includes,
1577 link_with : [libshared,
1579 libsystemd_resolve_core],
1580 dependencies : [threads,
1584 install_rpath : rootlibexecdir,
1586 install_dir : rootlibexecdir)
1588 exe = executable('resolvectl',
1590 include_directories : includes,
1591 link_with : [libshared,
1593 libsystemd_resolve_core],
1594 dependencies : [threads,
1598 install_rpath : rootlibexecdir,
1600 public_programs += [exe]
1602 meson.add_install_script(meson_make_symlink,
1603 join_paths(bindir, 'resolvectl'),
1604 join_paths(rootsbindir, 'resolvconf'))
1606 meson.add_install_script(meson_make_symlink,
1607 join_paths(bindir, 'resolvectl'),
1608 join_paths(bindir, 'systemd-resolve'))
1611 if conf.get('ENABLE_LOGIND') == 1
1612 executable('systemd-logind',
1613 systemd_logind_sources,
1614 include_directories : includes,
1615 link_with : [liblogind_core,
1617 dependencies : [threads,
1619 install_rpath : rootlibexecdir,
1621 install_dir : rootlibexecdir)
1623 exe = executable('loginctl',
1625 include_directories : includes,
1626 link_with : [libshared],
1627 dependencies : [threads,
1630 install_rpath : rootlibexecdir,
1632 install_dir : rootbindir)
1633 public_programs += [exe]
1635 exe = executable('systemd-inhibit',
1636 'src/login/inhibit.c',
1637 include_directories : includes,
1638 link_with : [libshared],
1639 install_rpath : rootlibexecdir,
1641 install_dir : rootbindir)
1642 public_programs += [exe]
1644 if conf.get('HAVE_PAM') == 1
1645 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1646 pam_systemd = shared_library(
1650 include_directories : includes,
1651 link_args : ['-shared',
1652 '-Wl,--version-script=' + version_script_arg],
1653 link_with : [libsystemd_static,
1655 dependencies : [threads,
1658 link_depends : pam_systemd_sym,
1660 install_dir : pamlibdir)
1662 test('dlopen-pam_systemd',
1664 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1668 executable('systemd-user-runtime-dir',
1669 user_runtime_dir_sources,
1670 include_directories : includes,
1671 link_with : [libshared, liblogind_core],
1672 install_rpath : rootlibexecdir,
1674 install_dir : rootlibexecdir)
1676 if conf.get('HAVE_PAM') == 1
1677 executable('systemd-user-sessions',
1678 'src/user-sessions/user-sessions.c',
1679 include_directories : includes,
1680 link_with : [libshared],
1681 install_rpath : rootlibexecdir,
1683 install_dir : rootlibexecdir)
1686 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1687 exe = executable('bootctl',
1688 'src/boot/bootctl.c',
1689 include_directories : includes,
1690 link_with : [libshared],
1691 dependencies : [libblkid],
1692 install_rpath : rootlibexecdir,
1694 public_programs += [exe]
1697 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1698 include_directories : includes,
1699 link_with : [libshared],
1700 dependencies : [threads],
1701 install_rpath : rootlibexecdir,
1703 public_programs += [exe]
1705 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1706 include_directories : includes,
1707 link_with : [libshared],
1708 dependencies : [threads,
1713 install_rpath : rootlibexecdir,
1715 install_dir : rootbindir)
1716 public_programs += [exe]
1718 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1719 meson.add_install_script(meson_make_symlink,
1720 join_paths(rootbindir, 'systemctl'),
1721 join_paths(rootsbindir, alias))
1724 if conf.get('ENABLE_BACKLIGHT') == 1
1725 executable('systemd-backlight',
1726 'src/backlight/backlight.c',
1727 include_directories : includes,
1728 link_with : [libshared],
1729 install_rpath : rootlibexecdir,
1731 install_dir : rootlibexecdir)
1734 if conf.get('ENABLE_RFKILL') == 1
1735 executable('systemd-rfkill',
1736 'src/rfkill/rfkill.c',
1737 include_directories : includes,
1738 link_with : [libshared],
1739 install_rpath : rootlibexecdir,
1741 install_dir : rootlibexecdir)
1744 executable('systemd-system-update-generator',
1745 'src/system-update-generator/system-update-generator.c',
1746 include_directories : includes,
1747 link_with : [libshared],
1748 install_rpath : rootlibexecdir,
1750 install_dir : systemgeneratordir)
1752 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1753 executable('systemd-cryptsetup',
1754 'src/cryptsetup/cryptsetup.c',
1755 include_directories : includes,
1756 link_with : [libshared],
1757 dependencies : [libcryptsetup],
1758 install_rpath : rootlibexecdir,
1760 install_dir : rootlibexecdir)
1762 executable('systemd-cryptsetup-generator',
1763 'src/cryptsetup/cryptsetup-generator.c',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 dependencies : [libcryptsetup],
1767 install_rpath : rootlibexecdir,
1769 install_dir : systemgeneratordir)
1771 executable('systemd-veritysetup',
1772 'src/veritysetup/veritysetup.c',
1773 include_directories : includes,
1774 link_with : [libshared],
1775 dependencies : [libcryptsetup],
1776 install_rpath : rootlibexecdir,
1778 install_dir : rootlibexecdir)
1780 executable('systemd-veritysetup-generator',
1781 'src/veritysetup/veritysetup-generator.c',
1782 include_directories : includes,
1783 link_with : [libshared],
1784 dependencies : [libcryptsetup],
1785 install_rpath : rootlibexecdir,
1787 install_dir : systemgeneratordir)
1790 if conf.get('HAVE_SYSV_COMPAT') == 1
1791 executable('systemd-sysv-generator',
1792 'src/sysv-generator/sysv-generator.c',
1793 include_directories : includes,
1794 link_with : [libshared],
1795 install_rpath : rootlibexecdir,
1797 install_dir : systemgeneratordir)
1799 executable('systemd-rc-local-generator',
1800 'src/rc-local-generator/rc-local-generator.c',
1801 include_directories : includes,
1802 link_with : [libshared],
1803 install_rpath : rootlibexecdir,
1805 install_dir : systemgeneratordir)
1808 if conf.get('ENABLE_HOSTNAMED') == 1
1809 executable('systemd-hostnamed',
1810 'src/hostname/hostnamed.c',
1811 include_directories : includes,
1812 link_with : [libshared],
1813 install_rpath : rootlibexecdir,
1815 install_dir : rootlibexecdir)
1817 exe = executable('hostnamectl',
1818 'src/hostname/hostnamectl.c',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 install_rpath : rootlibexecdir,
1823 public_programs += [exe]
1826 if conf.get('ENABLE_LOCALED') == 1
1827 if conf.get('HAVE_XKBCOMMON') == 1
1828 # logind will load libxkbcommon.so dynamically on its own
1834 executable('systemd-localed',
1835 systemd_localed_sources,
1836 include_directories : includes,
1837 link_with : [libshared],
1838 dependencies : deps,
1839 install_rpath : rootlibexecdir,
1841 install_dir : rootlibexecdir)
1843 exe = executable('localectl',
1845 include_directories : includes,
1846 link_with : [libshared],
1847 install_rpath : rootlibexecdir,
1849 public_programs += [exe]
1852 if conf.get('ENABLE_TIMEDATED') == 1
1853 executable('systemd-timedated',
1854 'src/timedate/timedated.c',
1855 include_directories : includes,
1856 link_with : [libshared],
1857 install_rpath : rootlibexecdir,
1859 install_dir : rootlibexecdir)
1862 if conf.get('ENABLE_TIMEDATECTL') == 1
1863 exe = executable('timedatectl',
1864 'src/timedate/timedatectl.c',
1865 include_directories : includes,
1866 install_rpath : rootlibexecdir,
1867 link_with : [libshared],
1868 dependencies : [libm],
1870 public_programs += [exe]
1873 if conf.get('ENABLE_TIMESYNCD') == 1
1874 executable('systemd-timesyncd',
1875 systemd_timesyncd_sources,
1876 include_directories : includes,
1877 link_with : [libshared],
1878 dependencies : [threads,
1880 install_rpath : rootlibexecdir,
1882 install_dir : rootlibexecdir)
1884 executable('systemd-time-wait-sync',
1885 'src/time-wait-sync/time-wait-sync.c',
1886 include_directories : includes,
1887 link_with : [libshared],
1888 install_rpath : rootlibexecdir,
1890 install_dir : rootlibexecdir)
1893 if conf.get('ENABLE_MACHINED') == 1
1894 executable('systemd-machined',
1895 systemd_machined_sources,
1896 include_directories : includes,
1897 link_with : [libmachine_core,
1899 install_rpath : rootlibexecdir,
1901 install_dir : rootlibexecdir)
1903 exe = executable('machinectl',
1904 'src/machine/machinectl.c',
1905 include_directories : includes,
1906 link_with : [libshared],
1907 dependencies : [threads,
1910 install_rpath : rootlibexecdir,
1912 install_dir : rootbindir)
1913 public_programs += [exe]
1916 if conf.get('ENABLE_IMPORTD') == 1
1917 executable('systemd-importd',
1918 systemd_importd_sources,
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [threads],
1922 install_rpath : rootlibexecdir,
1924 install_dir : rootlibexecdir)
1926 systemd_pull = executable('systemd-pull',
1927 systemd_pull_sources,
1928 include_directories : includes,
1929 link_with : [libshared],
1930 dependencies : [libcurl,
1935 install_rpath : rootlibexecdir,
1937 install_dir : rootlibexecdir)
1939 systemd_import = executable('systemd-import',
1940 systemd_import_sources,
1941 include_directories : includes,
1942 link_with : [libshared],
1943 dependencies : [libcurl,
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootlibexecdir)
1951 systemd_export = executable('systemd-export',
1952 systemd_export_sources,
1953 include_directories : includes,
1954 link_with : [libshared],
1955 dependencies : [libcurl,
1959 install_rpath : rootlibexecdir,
1961 install_dir : rootlibexecdir)
1962 public_programs += [systemd_pull, systemd_import, systemd_export]
1965 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1966 exe = executable('systemd-journal-upload',
1967 systemd_journal_upload_sources,
1968 include_directories : includes,
1969 link_with : [libshared],
1970 dependencies : [threads,
1975 install_rpath : rootlibexecdir,
1977 install_dir : rootlibexecdir)
1978 public_programs += [exe]
1981 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1982 s_j_remote = executable('systemd-journal-remote',
1983 systemd_journal_remote_sources,
1984 include_directories : includes,
1985 link_with : [libshared],
1986 dependencies : [threads,
1991 install_rpath : rootlibexecdir,
1993 install_dir : rootlibexecdir)
1995 s_j_gatewayd = executable('systemd-journal-gatewayd',
1996 systemd_journal_gatewayd_sources,
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : [threads,
2004 install_rpath : rootlibexecdir,
2006 install_dir : rootlibexecdir)
2007 public_programs += [s_j_remote, s_j_gatewayd]
2010 if conf.get('ENABLE_COREDUMP') == 1
2011 executable('systemd-coredump',
2012 systemd_coredump_sources,
2013 include_directories : includes,
2014 link_with : [libshared],
2015 dependencies : [threads,
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootlibexecdir)
2024 exe = executable('coredumpctl',
2025 coredumpctl_sources,
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [threads,
2031 install_rpath : rootlibexecdir,
2033 public_programs += [exe]
2036 if conf.get('ENABLE_BINFMT') == 1
2037 exe = executable('systemd-binfmt',
2038 'src/binfmt/binfmt.c',
2039 include_directories : includes,
2040 link_with : [libshared],
2041 install_rpath : rootlibexecdir,
2043 install_dir : rootlibexecdir)
2044 public_programs += [exe]
2046 meson.add_install_script('sh', '-c',
2047 mkdir_p.format(binfmtdir))
2048 meson.add_install_script('sh', '-c',
2049 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2052 if conf.get('ENABLE_VCONSOLE') == 1
2053 executable('systemd-vconsole-setup',
2054 'src/vconsole/vconsole-setup.c',
2055 include_directories : includes,
2056 link_with : [libshared],
2057 install_rpath : rootlibexecdir,
2059 install_dir : rootlibexecdir)
2062 if conf.get('ENABLE_RANDOMSEED') == 1
2063 executable('systemd-random-seed',
2064 'src/random-seed/random-seed.c',
2065 include_directories : includes,
2066 link_with : [libshared],
2067 install_rpath : rootlibexecdir,
2069 install_dir : rootlibexecdir)
2072 if conf.get('ENABLE_FIRSTBOOT') == 1
2073 executable('systemd-firstboot',
2074 'src/firstboot/firstboot.c',
2075 include_directories : includes,
2076 link_with : [libshared],
2077 dependencies : [libcrypt],
2078 install_rpath : rootlibexecdir,
2080 install_dir : rootbindir)
2083 executable('systemd-remount-fs',
2084 'src/remount-fs/remount-fs.c',
2085 'src/core/mount-setup.c',
2086 'src/core/mount-setup.h',
2087 include_directories : includes,
2088 link_with : [libshared],
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootlibexecdir)
2093 executable('systemd-machine-id-setup',
2094 'src/machine-id-setup/machine-id-setup-main.c',
2095 'src/core/machine-id-setup.c',
2096 'src/core/machine-id-setup.h',
2097 include_directories : includes,
2098 link_with : [libshared],
2099 install_rpath : rootlibexecdir,
2101 install_dir : rootbindir)
2103 executable('systemd-fsck',
2105 include_directories : includes,
2106 link_with : [libshared],
2107 install_rpath : rootlibexecdir,
2109 install_dir : rootlibexecdir)
2111 executable('systemd-growfs',
2112 'src/partition/growfs.c',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 dependencies : [libcryptsetup],
2116 install_rpath : rootlibexecdir,
2118 install_dir : rootlibexecdir)
2120 executable('systemd-makefs',
2121 'src/partition/makefs.c',
2122 include_directories : includes,
2123 link_with : [libshared],
2124 install_rpath : rootlibexecdir,
2126 install_dir : rootlibexecdir)
2128 executable('systemd-sleep',
2129 'src/sleep/sleep.c',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 install_rpath : rootlibexecdir,
2134 install_dir : rootlibexecdir)
2136 exe = executable('systemd-sysctl',
2137 'src/sysctl/sysctl.c',
2138 include_directories : includes,
2139 link_with : [libshared],
2140 install_rpath : rootlibexecdir,
2142 install_dir : rootlibexecdir)
2143 public_programs += [exe]
2145 executable('systemd-ac-power',
2146 'src/ac-power/ac-power.c',
2147 include_directories : includes,
2148 link_with : [libshared],
2149 install_rpath : rootlibexecdir,
2151 install_dir : rootlibexecdir)
2153 exe = executable('systemd-detect-virt',
2154 'src/detect-virt/detect-virt.c',
2155 include_directories : includes,
2156 link_with : [libshared],
2157 install_rpath : rootlibexecdir,
2159 public_programs += [exe]
2161 exe = executable('systemd-delta',
2162 'src/delta/delta.c',
2163 include_directories : includes,
2164 link_with : [libshared],
2165 install_rpath : rootlibexecdir,
2167 public_programs += [exe]
2169 exe = executable('systemd-escape',
2170 'src/escape/escape.c',
2171 include_directories : includes,
2172 link_with : [libshared],
2173 install_rpath : rootlibexecdir,
2175 install_dir : rootbindir)
2176 public_programs += [exe]
2178 exe = executable('systemd-notify',
2179 'src/notify/notify.c',
2180 include_directories : includes,
2181 link_with : [libshared],
2182 install_rpath : rootlibexecdir,
2184 install_dir : rootbindir)
2185 public_programs += [exe]
2187 executable('systemd-volatile-root',
2188 'src/volatile-root/volatile-root.c',
2189 include_directories : includes,
2190 link_with : [libshared],
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootlibexecdir)
2195 executable('systemd-cgroups-agent',
2196 'src/cgroups-agent/cgroups-agent.c',
2197 include_directories : includes,
2198 link_with : [libshared],
2199 install_rpath : rootlibexecdir,
2201 install_dir : rootlibexecdir)
2203 exe = executable('systemd-path',
2205 include_directories : includes,
2206 link_with : [libshared],
2207 install_rpath : rootlibexecdir,
2209 public_programs += [exe]
2211 exe = executable('systemd-ask-password',
2212 'src/ask-password/ask-password.c',
2213 include_directories : includes,
2214 link_with : [libshared],
2215 install_rpath : rootlibexecdir,
2217 install_dir : rootbindir)
2218 public_programs += [exe]
2220 executable('systemd-reply-password',
2221 'src/reply-password/reply-password.c',
2222 include_directories : includes,
2223 link_with : [libshared],
2224 install_rpath : rootlibexecdir,
2226 install_dir : rootlibexecdir)
2228 exe = executable('systemd-tty-ask-password-agent',
2229 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2230 include_directories : includes,
2231 link_with : [libshared],
2232 install_rpath : rootlibexecdir,
2234 install_dir : rootbindir)
2235 public_programs += [exe]
2237 exe = executable('systemd-cgls',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 install_rpath : rootlibexecdir,
2243 public_programs += [exe]
2245 exe = executable('systemd-cgtop',
2246 'src/cgtop/cgtop.c',
2247 include_directories : includes,
2248 link_with : [libshared],
2249 install_rpath : rootlibexecdir,
2251 public_programs += [exe]
2253 executable('systemd-initctl',
2254 'src/initctl/initctl.c',
2255 include_directories : includes,
2256 link_with : [libshared],
2257 install_rpath : rootlibexecdir,
2259 install_dir : rootlibexecdir)
2261 exe = executable('systemd-mount',
2262 'src/mount/mount-tool.c',
2263 include_directories : includes,
2264 link_with : [libshared],
2265 install_rpath : rootlibexecdir,
2267 public_programs += [exe]
2269 meson.add_install_script(meson_make_symlink,
2270 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2272 exe = executable('systemd-run',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2278 public_programs += [exe]
2280 exe = executable('systemd-stdio-bridge',
2281 'src/stdio-bridge/stdio-bridge.c',
2282 include_directories : includes,
2283 link_with : [libshared],
2284 install_rpath : rootlibexecdir,
2286 public_programs += [exe]
2288 exe = executable('busctl',
2289 'src/busctl/busctl.c',
2290 'src/busctl/busctl-introspect.c',
2291 'src/busctl/busctl-introspect.h',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 install_rpath : rootlibexecdir,
2296 public_programs += [exe]
2298 if conf.get('ENABLE_SYSUSERS') == 1
2299 exe = executable('systemd-sysusers',
2300 'src/sysusers/sysusers.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2305 install_dir : rootbindir)
2306 public_programs += [exe]
2309 if conf.get('ENABLE_TMPFILES') == 1
2310 exe = executable('systemd-tmpfiles',
2311 'src/tmpfiles/tmpfiles.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 dependencies : [libacl],
2315 install_rpath : rootlibexecdir,
2317 install_dir : rootbindir)
2318 public_programs += [exe]
2320 test('test-systemd-tmpfiles',
2321 test_systemd_tmpfiles_py,
2322 args : exe.full_path())
2323 # https://github.com/mesonbuild/meson/issues/2681
2326 if conf.get('ENABLE_HWDB') == 1
2327 exe = executable('systemd-hwdb',
2329 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2330 include_directories : includes,
2331 link_with : [libudev_static],
2332 install_rpath : udev_rpath,
2334 install_dir : rootbindir)
2335 public_programs += [exe]
2338 if conf.get('ENABLE_QUOTACHECK') == 1
2339 executable('systemd-quotacheck',
2340 'src/quotacheck/quotacheck.c',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2345 install_dir : rootlibexecdir)
2348 exe = executable('systemd-socket-proxyd',
2349 'src/socket-proxy/socket-proxyd.c',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 dependencies : [threads],
2353 install_rpath : rootlibexecdir,
2355 install_dir : rootlibexecdir)
2356 public_programs += [exe]
2358 exe = executable('systemd-udevd',
2359 systemd_udevd_sources,
2360 include_directories : includes,
2361 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2362 link_with : [libudev_core,
2365 dependencies : [threads,
2370 install_rpath : udev_rpath,
2372 install_dir : rootlibexecdir)
2373 public_programs += [exe]
2375 exe = executable('udevadm',
2377 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2378 include_directories : includes,
2379 link_with : [libudev_core,
2382 dependencies : [threads,
2387 install_rpath : udev_rpath,
2389 install_dir : rootbindir)
2390 public_programs += [exe]
2392 executable('systemd-shutdown',
2393 systemd_shutdown_sources,
2394 include_directories : includes,
2395 link_with : [libshared],
2396 dependencies : [libmount],
2397 install_rpath : rootlibexecdir,
2399 install_dir : rootlibexecdir)
2401 executable('systemd-update-done',
2402 'src/update-done/update-done.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 install_rpath : rootlibexecdir,
2407 install_dir : rootlibexecdir)
2409 executable('systemd-update-utmp',
2410 'src/update-utmp/update-utmp.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 dependencies : [libaudit],
2414 install_rpath : rootlibexecdir,
2416 install_dir : rootlibexecdir)
2418 if conf.get('HAVE_KMOD') == 1
2419 executable('systemd-modules-load',
2420 'src/modules-load/modules-load.c',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 dependencies : [libkmod],
2424 install_rpath : rootlibexecdir,
2426 install_dir : rootlibexecdir)
2428 meson.add_install_script('sh', '-c',
2429 mkdir_p.format(modulesloaddir))
2430 meson.add_install_script('sh', '-c',
2431 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2434 exe = executable('systemd-nspawn',
2435 systemd_nspawn_sources,
2436 'src/core/mount-setup.c', # FIXME: use a variable?
2437 'src/core/mount-setup.h',
2438 'src/core/loopback-setup.c',
2439 'src/core/loopback-setup.h',
2440 include_directories : [includes, include_directories('src/nspawn')],
2441 link_with : [libshared],
2442 dependencies : [libacl,
2446 install_rpath : rootlibexecdir,
2448 public_programs += [exe]
2450 if conf.get('ENABLE_NETWORKD') == 1
2451 executable('systemd-networkd',
2452 systemd_networkd_sources,
2453 include_directories : includes,
2454 link_with : [libnetworkd_core,
2458 dependencies : [threads],
2459 install_rpath : rootlibexecdir,
2461 install_dir : rootlibexecdir)
2463 executable('systemd-networkd-wait-online',
2464 systemd_networkd_wait_online_sources,
2465 include_directories : includes,
2466 link_with : [libnetworkd_core,
2468 install_rpath : rootlibexecdir,
2470 install_dir : rootlibexecdir)
2472 exe = executable('networkctl',
2474 include_directories : includes,
2475 link_with : [libsystemd_network,
2477 install_rpath : rootlibexecdir,
2479 install_dir : rootbindir)
2480 public_programs += [exe]
2483 executable('systemd-sulogin-shell',
2484 ['src/sulogin-shell/sulogin-shell.c'],
2485 include_directories : includes,
2486 link_with : [libshared],
2487 install_rpath : rootlibexecdir,
2489 install_dir : rootlibexecdir)
2491 ############################################################
2493 foreach tuple : tests
2495 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2496 dependencies = tuple[2]
2497 condition = tuple.length() >= 4 ? tuple[3] : ''
2498 type = tuple.length() >= 5 ? tuple[4] : ''
2499 defs = tuple.length() >= 6 ? tuple[5] : []
2500 incs = tuple.length() >= 7 ? tuple[6] : includes
2503 name = sources[0].split('/')[-1].split('.')[0]
2504 if type.startswith('timeout=')
2505 timeout = type.split('=')[1].to_int()
2508 if want_tests == 'false'
2509 message('Not compiling @0@ because tests is set to false'.format(name))
2510 elif condition == '' or conf.get(condition) == 1
2514 include_directories : incs,
2515 link_with : link_with,
2516 dependencies : dependencies,
2518 install_rpath : rootlibexecdir,
2519 install : install_tests,
2520 install_dir : join_paths(testsdir, type))
2523 message('@0@ is a manual test'.format(name))
2524 elif type == 'unsafe' and want_tests != 'unsafe'
2525 message('@0@ is an unsafe test'.format(name))
2532 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2537 'test-libsystemd-sym',
2538 test_libsystemd_sym_c,
2539 include_directories : includes,
2540 link_with : [libsystemd],
2541 install : install_tests,
2542 install_dir : testsdir)
2543 test('test-libsystemd-sym', exe)
2546 'test-libsystemd-static-sym',
2547 test_libsystemd_sym_c,
2548 include_directories : includes,
2549 link_with : [install_libsystemd_static],
2550 dependencies : [threads], # threads is already included in dependencies on the library,
2551 # but does not seem to get propagated. Add here as a work-around.
2552 build_by_default : static_libsystemd_pic,
2553 install : install_tests and static_libsystemd_pic,
2554 install_dir : testsdir)
2555 if static_libsystemd_pic
2556 test('test-libsystemd-static-sym', exe)
2562 include_directories : includes,
2563 c_args : ['-Wno-deprecated-declarations'],
2564 link_with : [libudev],
2565 install : install_tests,
2566 install_dir : testsdir)
2567 test('test-libudev-sym', exe)
2570 'test-libudev-static-sym',
2572 include_directories : includes,
2573 c_args : ['-Wno-deprecated-declarations'],
2574 link_with : [install_libudev_static],
2575 build_by_default : static_libudev_pic,
2576 install : install_tests and static_libudev_pic,
2577 install_dir : testsdir)
2578 if static_libudev_pic
2579 test('test-libudev-static-sym', exe)
2582 ############################################################
2586 foreach tuple : fuzzers
2588 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2589 dependencies = tuple[2]
2590 defs = tuple.length() >= 4 ? tuple[3] : []
2591 incs = tuple.length() >= 5 ? tuple[4] : includes
2594 dependencies += fuzzing_engine
2596 sources += 'src/fuzz/fuzz-main.c'
2599 name = sources[0].split('/')[-1].split('.')[0]
2601 fuzzer_exes += executable(
2604 include_directories : [incs, include_directories('src/fuzz')],
2605 link_with : link_with,
2606 dependencies : dependencies,
2611 run_target('fuzzers',
2612 depends : fuzzer_exes,
2615 ############################################################
2617 make_directive_index_py = find_program('tools/make-directive-index.py')
2618 make_man_index_py = find_program('tools/make-man-index.py')
2619 xml_helper_py = find_program('tools/xml_helper.py')
2620 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2624 subdir('sysusers.d')
2625 subdir('tmpfiles.d')
2630 subdir('shell-completion/bash')
2631 subdir('shell-completion/zsh')
2632 subdir('doc/sysvinit')
2633 subdir('doc/var-log')
2635 # FIXME: figure out if the warning is true:
2636 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2637 install_subdir('factory/etc',
2638 install_dir : factorydir)
2641 install_data('xorg/50-systemd-user.sh',
2642 install_dir : xinitrcdir)
2643 install_data('modprobe.d/systemd.conf',
2644 install_dir : modprobedir)
2645 install_data('LICENSE.GPL2',
2650 'doc/DISTRO_PORTING',
2651 'doc/ENVIRONMENT.md',
2653 'doc/TRANSIENT-SETTINGS.md',
2656 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2657 install_dir : docdir)
2659 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2660 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2662 ############################################################
2664 meson_check_help = find_program('tools/meson-check-help.sh')
2666 foreach exec : public_programs
2667 name = exec.full_path().split('/')[-1]
2668 test('check-help-' + name,
2670 args : [exec.full_path()])
2673 ############################################################
2675 # Enable tests for all supported sanitizers
2676 foreach tuple : sanitizers
2677 sanitizer = tuple[0]
2680 have = run_command(check_compilation_sh,
2681 cc.cmd_array(), '-x', 'c',
2682 '-fsanitize=@0@'.format(sanitizer),
2683 '-include', link_test_c).returncode() == 0
2684 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2688 foreach p : fuzz_regression_tests
2689 b = p.split('/')[-2]
2690 c = p.split('/')[-1]
2692 name = '@0@:@1@'.format(b, sanitizer)
2695 if want_tests == 'false'
2696 message('Not compiling @0@ because tests is set to false'.format(name))
2698 exe = custom_target(
2702 command : [env, 'ln', '-fs',
2703 join_paths(build.full_path(), b),
2705 build_by_default : true)
2707 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2712 if want_tests != 'false' and slow_tests
2713 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2715 args : [exe.full_path(),
2716 join_paths(meson.source_root(),
2717 'test/fuzz-regressions',
2725 ############################################################
2728 all_files = run_command(
2730 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2733 all_files = files(all_files.stdout().split())
2738 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2742 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2746 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2749 command : [meson_git_contrib_sh])
2753 git_head = run_command(
2755 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2756 'rev-parse', 'HEAD']).stdout().strip()
2757 git_head_short = run_command(
2759 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2760 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2764 command : ['git', 'archive',
2765 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2767 '--prefix', 'systemd-@0@/'.format(git_head),
2771 ############################################################
2773 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2776 depends : [man, libsystemd, libudev],
2777 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2779 ############################################################
2782 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2784 'split /usr: @0@'.format(split_usr),
2785 'split bin-sbin: @0@'.format(split_bin),
2786 'prefix directory: @0@'.format(prefixdir),
2787 'rootprefix directory: @0@'.format(rootprefixdir),
2788 'sysconf directory: @0@'.format(sysconfdir),
2789 'include directory: @0@'.format(includedir),
2790 'lib directory: @0@'.format(libdir),
2791 'rootlib directory: @0@'.format(rootlibdir),
2792 'SysV init scripts: @0@'.format(sysvinit_path),
2793 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2794 'PAM modules directory: @0@'.format(pamlibdir),
2795 'PAM configuration directory: @0@'.format(pamconfdir),
2796 'RPM macros directory: @0@'.format(rpmmacrosdir),
2797 'modprobe.d directory: @0@'.format(modprobedir),
2798 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2799 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2800 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2801 'bash completions directory: @0@'.format(bashcompletiondir),
2802 'zsh completions directory: @0@'.format(zshcompletiondir),
2803 'extra start script: @0@'.format(get_option('rc-local')),
2804 'extra stop script: @0@'.format(get_option('halt-local')),
2805 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2806 get_option('debug-tty')),
2807 'TTY GID: @0@'.format(tty_gid),
2808 'users GID: @0@'.format(users_gid),
2809 'maximum system UID: @0@'.format(system_uid_max),
2810 'maximum system GID: @0@'.format(system_gid_max),
2811 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2812 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2813 'minimum container UID base: @0@'.format(container_uid_base_min),
2814 'maximum container UID base: @0@'.format(container_uid_base_max),
2815 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2816 'render group access mode: @0@'.format(get_option('group-render-mode')),
2817 'certificate root directory: @0@'.format(get_option('certificate-root')),
2818 'support URL: @0@'.format(support_url),
2819 'nobody user name: @0@'.format(nobody_user),
2820 'nobody group name: @0@'.format(nobody_group),
2821 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2822 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2824 'default DNSSEC mode: @0@'.format(default_dnssec),
2825 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2826 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2828 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2829 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2831 'default DNS servers: @0@'.format(alt_dns_servers),
2832 'default NTP servers: @0@'.format(alt_ntp_servers)]
2834 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2835 '@@0@'.format(time_epoch)).stdout().strip()
2837 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2840 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2841 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2842 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2844 if conf.get('ENABLE_EFI') == 1
2846 'efi arch: @0@'.format(efi_arch)]
2850 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2851 'EFI CC @0@'.format(efi_cc),
2852 'EFI lib directory: @0@'.format(efi_libdir),
2853 'EFI lds directory: @0@'.format(efi_ldsdir),
2854 'EFI include directory: @0@'.format(efi_incdir)]
2907 ['legacy pkla', install_polkit_pkla],
2909 ['gnu-efi', have_gnu_efi],
2916 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2919 ['man pages', want_man],
2920 ['html pages', want_html],
2921 ['man page indices', want_man and have_lxml],
2926 ['adm group', get_option('adm-group')],
2927 ['wheel group', get_option('wheel-group')],
2930 ['debug mmap cache'],
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))