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('environmentdir', environmentdir)
245 substs.set('catalogdir', catalogdir)
246 substs.set('tmpfilesdir', tmpfilesdir)
247 substs.set('sysusersdir', sysusersdir)
248 substs.set('sysctldir', sysctldir)
249 substs.set('binfmtdir', binfmtdir)
250 substs.set('modulesloaddir', modulesloaddir)
251 substs.set('modprobedir', modprobedir)
252 substs.set('systemgeneratordir', systemgeneratordir)
253 substs.set('usergeneratordir', usergeneratordir)
254 substs.set('systemenvgeneratordir', systemenvgeneratordir)
255 substs.set('userenvgeneratordir', userenvgeneratordir)
256 substs.set('systemshutdowndir', systemshutdowndir)
257 substs.set('systemsleepdir', systemsleepdir)
258 substs.set('VARLOGDIR', varlogdir)
259 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
260 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
261 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
262 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
263 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
264 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
265 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
266 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
268 #####################################################################
270 cc = meson.get_compiler('c')
271 pkgconfig = import('pkgconfig')
272 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
273 meson_build_sh = find_program('tools/meson-build.sh')
275 if get_option('tests') != 'false'
276 cxx = find_program('c++', required : false)
278 # Used only for tests
283 want_ossfuzz = get_option('oss-fuzz')
284 want_libfuzzer = get_option('llvm-fuzz')
285 fuzzer_build = want_ossfuzz or want_libfuzzer
286 if want_ossfuzz and want_libfuzzer
287 error('only one of oss-fuzz and llvm-fuzz can be specified')
290 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
293 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
296 possible_cc_flags = [
300 '-Wmissing-include-dirs',
301 '-Wold-style-definition',
304 '-Wdeclaration-after-statement',
306 '-Wsuggest-attribute=noreturn',
307 '-Werror=missing-prototypes',
308 '-Werror=implicit-function-declaration',
309 '-Werror=missing-declarations',
310 '-Werror=return-type',
311 '-Werror=incompatible-pointer-types',
313 '-Wstrict-prototypes',
315 '-Wmissing-noreturn',
316 '-Wimplicit-fallthrough=5',
319 '-Wstrict-aliasing=2',
326 '-fdiagnostics-show-option',
327 '-fno-strict-aliasing',
328 '-fvisibility=hidden',
330 '-fstack-protector-strong',
331 '--param=ssp-buffer-size=4',
334 # --as-needed and --no-undefined are provided by meson by default,
335 # run mesonconf to see what is enabled
336 possible_link_flags = [
341 # the oss-fuzz fuzzers are not built with -fPIE, so don't
342 # enable it when we are linking against them
344 possible_cc_flags += '-fPIE'
345 possible_link_flags += '-pie'
348 if cc.get_id() == 'clang'
349 possible_cc_flags += [
350 '-Wno-typedef-redefinition',
351 '-Wno-gnu-variable-sized-type-not-at-end',
355 if get_option('buildtype') != 'debug'
356 possible_cc_flags += [
357 '-ffunction-sections',
361 possible_link_flags += '-Wl,--gc-sections'
364 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
366 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
367 # arguments, just emits a warnings. So test for the "positive" version instead.
368 foreach arg : ['unused-parameter',
369 'missing-field-initializers',
372 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
374 if cc.has_argument('-W' + arg)
375 add_project_arguments('-Wno-' + arg, language : 'c')
381 #include <inttypes.h>
382 typedef uint64_t usec_t;
383 usec_t now(clockid_t clock);
388 ''', name : '-Werror=shadow with local shadowing')
389 add_project_arguments('-Werror=shadow', language : 'c')
392 link_test_c = files('tools/meson-link-test.c')
394 foreach arg : possible_link_flags
395 have = run_command(check_compilation_sh,
396 cc.cmd_array(), '-x', 'c', arg,
397 '-include', link_test_c).returncode() == 0
398 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
400 add_project_link_arguments(arg, language : 'c')
404 cpp = ' '.join(cc.cmd_array()) + ' -E'
406 #####################################################################
407 # compilation result tests
409 conf.set('_GNU_SOURCE', true)
410 conf.set('__SANE_USERSPACE_TYPES__', true)
412 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
417 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
418 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
422 #include <linux/ethtool.h>
423 #include <linux/fib_rules.h>
424 #include <linux/stat.h>
425 #include <sys/stat.h>
427 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
429 foreach decl : ['char16_t',
432 'struct ethtool_link_settings',
433 'struct fib_rule_uid_range',
437 # We get -1 if the size cannot be determined
438 have = cc.sizeof(decl, prefix : decl_headers) > 0
439 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
442 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
443 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
444 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
445 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
446 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
447 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
448 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
449 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
450 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
451 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
452 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
453 # if_tunnel.h is buggy and cannot be included on its own
454 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
455 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
456 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
457 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
458 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
459 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
460 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
461 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
462 ['NDA_IFINDEX', 'linux/neighbour.h'],
463 ['IFA_FLAGS', 'linux/if_addr.h'],
464 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
465 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
466 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
468 prefix = decl.length() > 2 ? decl[2] : ''
469 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
470 conf.set10('HAVE_' + decl[0], have)
473 foreach ident : ['secure_getenv', '__secure_getenv']
474 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
478 ['memfd_create', '''#include <sys/mman.h>'''],
479 ['gettid', '''#include <sys/types.h>
480 #include <unistd.h>'''],
481 ['pivot_root', '''#include <stdlib.h>
482 #include <unistd.h>'''], # no known header declares pivot_root
483 ['name_to_handle_at', '''#include <sys/types.h>
484 #include <sys/stat.h>
485 #include <fcntl.h>'''],
486 ['setns', '''#include <sched.h>'''],
487 ['renameat2', '''#include <stdio.h>
488 #include <fcntl.h>'''],
489 ['kcmp', '''#include <linux/kcmp.h>'''],
490 ['keyctl', '''#include <sys/types.h>
491 #include <keyutils.h>'''],
492 ['copy_file_range', '''#include <sys/syscall.h>
493 #include <unistd.h>'''],
494 ['bpf', '''#include <sys/syscall.h>
495 #include <unistd.h>'''],
496 ['statx', '''#include <sys/types.h>
497 #include <sys/stat.h>
498 #include <unistd.h>'''],
499 ['explicit_bzero' , '''#include <string.h>'''],
500 ['reallocarray', '''#include <malloc.h>'''],
503 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
504 conf.set10('HAVE_' + ident[0].to_upper(), have)
507 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
508 conf.set10('USE_SYS_RANDOM_H', true)
509 conf.set10('HAVE_GETRANDOM', true)
511 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
512 conf.set10('USE_SYS_RANDOM_H', false)
513 conf.set10('HAVE_GETRANDOM', have)
516 #####################################################################
518 sed = find_program('sed')
519 awk = find_program('awk')
520 m4 = find_program('m4')
521 stat = find_program('stat')
522 git = find_program('git', required : false)
523 env = find_program('env')
524 perl = find_program('perl', required : false)
526 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
527 mkdir_p = 'mkdir -p $DESTDIR/@0@'
528 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
529 splash_bmp = files('test/splash.bmp')
531 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
532 # /usr/sbin, /sbin, and fall back to the default from middle column.
533 progs = [['quotaon', '/usr/sbin/quotaon' ],
534 ['quotacheck', '/usr/sbin/quotacheck' ],
535 ['kmod', '/usr/bin/kmod' ],
536 ['kexec', '/usr/sbin/kexec' ],
537 ['sulogin', '/usr/sbin/sulogin' ],
538 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
539 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
540 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
541 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
544 path = get_option(prog[0] + '-path')
546 message('Using @1@ for @0@'.format(prog[0], path))
548 exe = find_program(prog[0],
549 '/usr/sbin/' + prog[0],
552 path = exe.found() ? exe.path() : prog[1]
554 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
555 conf.set_quoted(name, path)
556 substs.set(name, path)
559 conf.set_quoted('TELINIT', get_option('telinit-path'))
561 if run_command('ln', '--relative', '--help').returncode() != 0
562 error('ln does not support --relative (added in coreutils 8.16)')
565 ############################################################
567 gperf = find_program('gperf')
569 gperf_test_format = '''
571 const char * in_word_set(const char *, @0@);
574 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
575 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
576 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
577 if cc.compiles(gperf_test)
578 gperf_len_type = 'size_t'
580 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
581 if cc.compiles(gperf_test)
582 gperf_len_type = 'unsigned'
584 error('unable to determine gperf len type')
587 message('gperf len type is @0@'.format(gperf_len_type))
588 conf.set('GPERF_LEN_TYPE', gperf_len_type,
589 description : 'The type of gperf "len" parameter')
591 ############################################################
593 if not cc.has_header('sys/capability.h')
594 error('POSIX caps headers not found')
596 foreach header : ['crypt.h',
599 'linux/vm_sockets.h',
601 'valgrind/memcheck.h',
602 'valgrind/valgrind.h',
605 conf.set10('HAVE_' + header.underscorify().to_upper(),
606 cc.has_header(header))
609 ############################################################
611 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
612 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
613 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
615 default_hierarchy = get_option('default-hierarchy')
616 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
617 description : 'default cgroup hierarchy as string')
618 if default_hierarchy == 'legacy'
619 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
620 elif default_hierarchy == 'hybrid'
621 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
623 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
626 time_epoch = get_option('time-epoch')
629 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
631 time_epoch = time_epoch.to_int()
632 conf.set('TIME_EPOCH', time_epoch)
634 system_uid_max = get_option('system-uid-max')
635 if system_uid_max == ''
636 system_uid_max = run_command(
638 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
639 '/etc/login.defs').stdout().strip()
640 if system_uid_max == ''
641 system_uid_max = '999'
644 system_uid_max = system_uid_max.to_int()
645 conf.set('SYSTEM_UID_MAX', system_uid_max)
646 substs.set('systemuidmax', system_uid_max)
647 message('maximum system UID is @0@'.format(system_uid_max))
649 system_gid_max = get_option('system-gid-max')
650 if system_gid_max == ''
651 system_gid_max = run_command(
653 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
654 '/etc/login.defs').stdout().strip()
655 if system_gid_max == ''
656 system_gid_max = '999'
659 system_gid_max = system_gid_max.to_int()
660 conf.set('SYSTEM_GID_MAX', system_gid_max)
661 substs.set('systemgidmax', system_gid_max)
662 message('maximum system GID is @0@'.format(system_gid_max))
664 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
665 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
666 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
667 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
668 substs.set('dynamicuidmin', dynamic_uid_min)
669 substs.set('dynamicuidmax', dynamic_uid_max)
671 container_uid_base_min = get_option('container-uid-base-min').to_int()
672 container_uid_base_max = get_option('container-uid-base-max').to_int()
673 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
674 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
675 substs.set('containeruidbasemin', container_uid_base_min)
676 substs.set('containeruidbasemax', container_uid_base_max)
678 nobody_user = get_option('nobody-user')
679 nobody_group = get_option('nobody-group')
681 getent_result = run_command('getent', 'passwd', '65534')
682 if getent_result.returncode() == 0
683 name = getent_result.stdout().split(':')[0]
684 if name != nobody_user
686 'The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
687 'Your build will result in an user table setup that is incompatible with the local system.')
690 id_result = run_command('id', '-u', nobody_user)
691 if id_result.returncode() == 0
692 id = id_result.stdout().to_int()
695 'The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
696 'Your build will result in an user table setup that is incompatible with the local system.')
700 getent_result = run_command('getent', 'group', '65534')
701 if getent_result.returncode() == 0
702 name = getent_result.stdout().split(':')[0]
703 if name != nobody_group
705 'The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
706 'Your build will result in an group table setup that is incompatible with the local system.')
709 id_result = run_command('id', '-g', nobody_group)
710 if id_result.returncode() == 0
711 id = id_result.stdout().to_int()
714 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
715 'Your build will result in an group table setup that is incompatible with the local system.')
718 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
720 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
721 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
724 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
725 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
726 substs.set('NOBODY_USER_NAME', nobody_user)
727 substs.set('NOBODY_GROUP_NAME', nobody_group)
729 tty_gid = get_option('tty-gid')
730 conf.set('TTY_GID', tty_gid)
731 substs.set('TTY_GID', tty_gid)
733 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
734 if get_option('users-gid') != ''
735 users_gid = get_option('users-gid').to_int()
739 substs.set('USERS_GID', users_gid)
741 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
742 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
744 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
745 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
747 kill_user_processes = get_option('default-kill-user-processes')
748 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
749 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
750 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
752 dns_servers = get_option('dns-servers')
753 conf.set_quoted('DNS_SERVERS', dns_servers)
754 substs.set('DNS_SERVERS', dns_servers)
756 ntp_servers = get_option('ntp-servers')
757 conf.set_quoted('NTP_SERVERS', ntp_servers)
758 substs.set('NTP_SERVERS', ntp_servers)
760 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
762 substs.set('SUSHELL', get_option('debug-shell'))
763 substs.set('DEBUGTTY', get_option('debug-tty'))
765 enable_debug_hashmap = false
766 enable_debug_mmap_cache = false
767 foreach name : get_option('debug')
769 enable_debug_hashmap = true
770 elif name == 'mmap-cache'
771 enable_debug_mmap_cache = true
773 message('unknown debug option "@0@", ignoring'.format(name))
776 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
777 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
779 conf.set10('VALGRIND', get_option('valgrind'))
781 #####################################################################
783 threads = dependency('threads')
784 librt = cc.find_library('rt')
785 libm = cc.find_library('m')
786 libdl = cc.find_library('dl')
787 libcrypt = cc.find_library('crypt')
789 libcap = dependency('libcap', required : false)
790 if not libcap.found()
791 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
792 libcap = cc.find_library('cap')
795 libmount = dependency('mount',
796 version : fuzzer_build ? '>= 0' : '>= 2.30')
798 want_seccomp = get_option('seccomp')
799 if want_seccomp != 'false' and not fuzzer_build
800 libseccomp = dependency('libseccomp',
801 version : '>= 2.3.1',
802 required : want_seccomp == 'true')
803 have = libseccomp.found()
808 conf.set10('HAVE_SECCOMP', have)
810 want_selinux = get_option('selinux')
811 if want_selinux != 'false' and not fuzzer_build
812 libselinux = dependency('libselinux',
813 version : '>= 2.1.9',
814 required : want_selinux == 'true')
815 have = libselinux.found()
820 conf.set10('HAVE_SELINUX', have)
822 want_apparmor = get_option('apparmor')
823 if want_apparmor != 'false' and not fuzzer_build
824 libapparmor = dependency('libapparmor',
825 required : want_apparmor == 'true')
826 have = libapparmor.found()
831 conf.set10('HAVE_APPARMOR', have)
833 smack_run_label = get_option('smack-run-label')
834 if smack_run_label != ''
835 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
838 want_polkit = get_option('polkit')
839 install_polkit = false
840 install_polkit_pkla = false
841 if want_polkit != 'false' and not fuzzer_build
842 install_polkit = true
844 libpolkit = dependency('polkit-gobject-1',
846 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
847 message('Old polkit detected, will install pkla files')
848 install_polkit_pkla = true
851 conf.set10('ENABLE_POLKIT', install_polkit)
853 want_acl = get_option('acl')
854 if want_acl != 'false' and not fuzzer_build
855 libacl = cc.find_library('acl', required : want_acl == 'true')
856 have = libacl.found()
861 conf.set10('HAVE_ACL', have)
863 want_audit = get_option('audit')
864 if want_audit != 'false' and not fuzzer_build
865 libaudit = dependency('audit', required : want_audit == 'true')
866 have = libaudit.found()
871 conf.set10('HAVE_AUDIT', have)
873 want_blkid = get_option('blkid')
874 if want_blkid != 'false' and not fuzzer_build
875 libblkid = dependency('blkid', required : want_blkid == 'true')
876 have = libblkid.found()
881 conf.set10('HAVE_BLKID', have)
883 want_kmod = get_option('kmod')
884 if want_kmod != 'false' and not fuzzer_build
885 libkmod = dependency('libkmod',
887 required : want_kmod == 'true')
888 have = libkmod.found()
893 conf.set10('HAVE_KMOD', have)
895 want_pam = get_option('pam')
896 if want_pam != 'false' and not fuzzer_build
897 libpam = cc.find_library('pam', required : want_pam == 'true')
898 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
899 have = libpam.found() and libpam_misc.found()
905 conf.set10('HAVE_PAM', have)
907 want_microhttpd = get_option('microhttpd')
908 if want_microhttpd != 'false' and not fuzzer_build
909 libmicrohttpd = dependency('libmicrohttpd',
910 version : '>= 0.9.33',
911 required : want_microhttpd == 'true')
912 have = libmicrohttpd.found()
917 conf.set10('HAVE_MICROHTTPD', have)
919 want_libcryptsetup = get_option('libcryptsetup')
920 if want_libcryptsetup != 'false' and not fuzzer_build
921 libcryptsetup = dependency('libcryptsetup',
922 version : '>= 1.6.0',
923 required : want_libcryptsetup == 'true')
924 have = libcryptsetup.found()
929 conf.set10('HAVE_LIBCRYPTSETUP', have)
931 want_libcurl = get_option('libcurl')
932 if want_libcurl != 'false' and not fuzzer_build
933 libcurl = dependency('libcurl',
934 version : '>= 7.32.0',
935 required : want_libcurl == 'true')
936 have = libcurl.found()
941 conf.set10('HAVE_LIBCURL', have)
943 want_libidn = get_option('libidn')
944 want_libidn2 = get_option('libidn2')
945 if want_libidn == 'true' and want_libidn2 == 'true'
946 error('libidn and libidn2 cannot be requested simultaneously')
949 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
950 libidn = dependency('libidn',
951 required : want_libidn == 'true')
952 have = libidn.found()
957 conf.set10('HAVE_LIBIDN', have)
958 if not have and want_libidn2 != 'false' and not fuzzer_build
959 # libidn is used for both libidn and libidn2 objects
960 libidn = dependency('libidn2',
961 required : want_libidn2 == 'true')
962 have = libidn.found()
966 conf.set10('HAVE_LIBIDN2', have)
968 want_libiptc = get_option('libiptc')
969 if want_libiptc != 'false' and not fuzzer_build
970 libiptc = dependency('libiptc',
971 required : want_libiptc == 'true')
972 have = libiptc.found()
977 conf.set10('HAVE_LIBIPTC', have)
979 want_qrencode = get_option('qrencode')
980 if want_qrencode != 'false' and not fuzzer_build
981 libqrencode = dependency('libqrencode',
982 required : want_qrencode == 'true')
983 have = libqrencode.found()
988 conf.set10('HAVE_QRENCODE', have)
990 want_gcrypt = get_option('gcrypt')
991 if want_gcrypt != 'false' and not fuzzer_build
992 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
993 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
994 have = libgcrypt.found() and libgpg_error.found()
999 # link to neither of the libs if one is not found
1003 conf.set10('HAVE_GCRYPT', have)
1005 want_gnutls = get_option('gnutls')
1006 if want_gnutls != 'false' and not fuzzer_build
1007 libgnutls = dependency('gnutls',
1008 version : '>= 3.1.4',
1009 required : want_gnutls == 'true')
1010 have = libgnutls.found()
1015 conf.set10('HAVE_GNUTLS', have)
1017 want_elfutils = get_option('elfutils')
1018 if want_elfutils != 'false' and not fuzzer_build
1019 libdw = dependency('libdw',
1020 required : want_elfutils == 'true')
1021 have = libdw.found()
1026 conf.set10('HAVE_ELFUTILS', have)
1028 want_zlib = get_option('zlib')
1029 if want_zlib != 'false' and not fuzzer_build
1030 libz = dependency('zlib',
1031 required : want_zlib == 'true')
1037 conf.set10('HAVE_ZLIB', have)
1039 want_bzip2 = get_option('bzip2')
1040 if want_bzip2 != 'false' and not fuzzer_build
1041 libbzip2 = cc.find_library('bz2',
1042 required : want_bzip2 == 'true')
1043 have = libbzip2.found()
1048 conf.set10('HAVE_BZIP2', have)
1050 want_xz = get_option('xz')
1051 if want_xz != 'false' and not fuzzer_build
1052 libxz = dependency('liblzma',
1053 required : want_xz == 'true')
1054 have = libxz.found()
1059 conf.set10('HAVE_XZ', have)
1061 want_lz4 = get_option('lz4')
1062 if want_lz4 != 'false' and not fuzzer_build
1063 liblz4 = dependency('liblz4',
1064 required : want_lz4 == 'true')
1065 have = liblz4.found()
1070 conf.set10('HAVE_LZ4', have)
1072 want_xkbcommon = get_option('xkbcommon')
1073 if want_xkbcommon != 'false' and not fuzzer_build
1074 libxkbcommon = dependency('xkbcommon',
1075 version : '>= 0.3.0',
1076 required : want_xkbcommon == 'true')
1077 have = libxkbcommon.found()
1082 conf.set10('HAVE_XKBCOMMON', have)
1084 want_pcre2 = get_option('pcre2')
1085 if want_pcre2 != 'false'
1086 libpcre2 = dependency('libpcre2-8',
1087 required : want_pcre2 == 'true')
1088 have = libpcre2.found()
1093 conf.set10('HAVE_PCRE2', have)
1095 want_glib = get_option('glib')
1096 if want_glib != 'false' and not fuzzer_build
1097 libglib = dependency('glib-2.0',
1098 version : '>= 2.22.0',
1099 required : want_glib == 'true')
1100 libgobject = dependency('gobject-2.0',
1101 version : '>= 2.22.0',
1102 required : want_glib == 'true')
1103 libgio = dependency('gio-2.0',
1104 required : want_glib == 'true')
1105 have = libglib.found() and libgobject.found() and libgio.found()
1112 conf.set10('HAVE_GLIB', have)
1114 want_dbus = get_option('dbus')
1115 if want_dbus != 'false' and not fuzzer_build
1116 libdbus = dependency('dbus-1',
1117 version : '>= 1.3.2',
1118 required : want_dbus == 'true')
1119 have = libdbus.found()
1124 conf.set10('HAVE_DBUS', have)
1126 default_dnssec = get_option('default-dnssec')
1128 default_dnssec = 'no'
1130 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1131 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1132 default_dnssec = 'no'
1134 conf.set('DEFAULT_DNSSEC_MODE',
1135 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1136 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1138 want_importd = get_option('importd')
1139 if want_importd != 'false'
1140 have = (conf.get('HAVE_LIBCURL') == 1 and
1141 conf.get('HAVE_ZLIB') == 1 and
1142 conf.get('HAVE_BZIP2') == 1 and
1143 conf.get('HAVE_XZ') == 1 and
1144 conf.get('HAVE_GCRYPT') == 1)
1145 if want_importd == 'true' and not have
1146 error('importd support was requested, but dependencies are not available')
1151 conf.set10('ENABLE_IMPORTD', have)
1153 want_remote = get_option('remote')
1154 if want_remote != 'false'
1155 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1156 conf.get('HAVE_LIBCURL') == 1]
1157 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1158 # it's possible to build one without the other. Complain only if
1159 # support was explictly requested. The auxiliary files like sysusers
1160 # config should be installed when any of the programs are built.
1161 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1162 error('remote support was requested, but dependencies are not available')
1164 have = have_deps[0] or have_deps[1]
1168 conf.set10('ENABLE_REMOTE', have)
1170 foreach term : ['utmp',
1201 have = get_option(term)
1202 name = 'ENABLE_' + term.underscorify().to_upper()
1203 conf.set10(name, have)
1206 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1208 want_tests = get_option('tests')
1209 install_tests = get_option('install-tests')
1210 slow_tests = get_option('slow-tests')
1214 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1216 #####################################################################
1218 if get_option('efi')
1219 efi_arch = host_machine.cpu_family()
1221 if efi_arch == 'x86'
1222 EFI_MACHINE_TYPE_NAME = 'ia32'
1223 gnu_efi_arch = 'ia32'
1224 elif efi_arch == 'x86_64'
1225 EFI_MACHINE_TYPE_NAME = 'x64'
1226 gnu_efi_arch = 'x86_64'
1227 elif efi_arch == 'arm'
1228 EFI_MACHINE_TYPE_NAME = 'arm'
1229 gnu_efi_arch = 'arm'
1230 elif efi_arch == 'aarch64'
1231 EFI_MACHINE_TYPE_NAME = 'aa64'
1232 gnu_efi_arch = 'aarch64'
1234 EFI_MACHINE_TYPE_NAME = ''
1239 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1241 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1245 conf.set10('ENABLE_EFI', have)
1247 #####################################################################
1249 config_h = configure_file(
1250 output : 'config.h',
1251 configuration : conf)
1253 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1255 includes = include_directories('src/basic',
1261 'src/time-wait-sync',
1266 'src/libsystemd/sd-bus',
1267 'src/libsystemd/sd-device',
1268 'src/libsystemd/sd-hwdb',
1269 'src/libsystemd/sd-id128',
1270 'src/libsystemd/sd-netlink',
1271 'src/libsystemd/sd-network',
1272 'src/libsystemd-network',
1275 add_project_arguments('-include', 'config.h', language : 'c')
1279 subdir('src/systemd')
1281 subdir('src/libsystemd')
1282 subdir('src/libsystemd-network')
1283 subdir('src/journal')
1286 libjournal_core = static_library(
1288 libjournal_core_sources,
1290 include_directories : includes,
1293 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1294 libsystemd = shared_library(
1296 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1297 version : libsystemd_version,
1298 include_directories : includes,
1299 link_args : ['-shared',
1300 '-Wl,--version-script=' + libsystemd_sym_path],
1301 link_with : [libbasic,
1303 link_whole : [libsystemd_static,
1305 dependencies : [threads,
1309 link_depends : libsystemd_sym,
1311 install_dir : rootlibdir)
1313 static_libsystemd = get_option('static-libsystemd')
1314 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1316 install_libsystemd_static = static_library(
1319 journal_client_sources,
1321 basic_gcrypt_sources,
1322 include_directories : includes,
1323 build_by_default : static_libsystemd != 'false',
1324 install : static_libsystemd != 'false',
1325 install_dir : rootlibdir,
1326 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1327 dependencies : [threads,
1336 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1338 ############################################################
1340 # binaries that have --help and are intended for use by humans,
1341 # usually, but not always, installed in /bin.
1342 public_programs = []
1344 subdir('src/libudev')
1345 subdir('src/shared')
1348 subdir('src/network')
1350 subdir('src/analyze')
1351 subdir('src/journal-remote')
1352 subdir('src/coredump')
1353 subdir('src/hostname')
1354 subdir('src/import')
1355 subdir('src/kernel-install')
1356 subdir('src/locale')
1357 subdir('src/machine')
1358 subdir('src/nspawn')
1359 subdir('src/resolve')
1360 subdir('src/timedate')
1361 subdir('src/timesync')
1362 subdir('src/vconsole')
1363 subdir('src/boot/efi')
1370 ############################################################
1372 # only static linking apart from libdl, to make sure that the
1373 # module is linked to all libraries that it uses.
1374 test_dlopen = executable(
1377 include_directories : includes,
1378 link_with : [libbasic],
1379 dependencies : [libdl])
1381 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1382 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1383 ['mymachines', 'ENABLE_MACHINED'],
1384 ['resolve', 'ENABLE_RESOLVE']]
1386 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1390 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1391 version_script_arg = join_paths(meson.current_source_dir(), sym)
1393 nss = shared_library(
1395 'src/nss-@0@/nss-@0@.c'.format(module),
1397 include_directories : includes,
1398 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1399 link_args : ['-Wl,-z,nodelete',
1401 '-Wl,--version-script=' + version_script_arg,
1403 link_with : [libsystemd_static,
1405 dependencies : [threads,
1409 install_dir : rootlibdir)
1411 # We cannot use shared_module because it does not support version suffix.
1412 # Unfortunately shared_library insists on creating the symlink…
1413 meson.add_install_script('sh', '-c',
1414 'rm $DESTDIR@0@/libnss_@1@.so'
1415 .format(rootlibdir, module))
1417 test('dlopen-nss_' + module,
1419 args : [nss.full_path()]) # path to dlopen must include a slash
1423 ############################################################
1425 executable('systemd',
1427 include_directories : includes,
1428 link_with : [libcore,
1430 dependencies : [threads,
1436 install_rpath : rootlibexecdir,
1438 install_dir : rootlibexecdir)
1440 meson.add_install_script(meson_make_symlink,
1441 join_paths(rootlibexecdir, 'systemd'),
1442 join_paths(rootsbindir, 'init'))
1444 exe = executable('systemd-analyze',
1445 systemd_analyze_sources,
1446 include_directories : includes,
1447 link_with : [libcore,
1449 dependencies : [threads,
1455 install_rpath : rootlibexecdir,
1457 public_programs += [exe]
1459 executable('systemd-journald',
1460 systemd_journald_sources,
1461 include_directories : includes,
1462 link_with : [libjournal_core,
1464 dependencies : [threads,
1468 install_rpath : rootlibexecdir,
1470 install_dir : rootlibexecdir)
1472 exe = executable('systemd-cat',
1473 systemd_cat_sources,
1474 include_directories : includes,
1475 link_with : [libjournal_core,
1477 dependencies : [threads],
1478 install_rpath : rootlibexecdir,
1480 public_programs += [exe]
1482 exe = executable('journalctl',
1484 include_directories : includes,
1485 link_with : [libshared],
1486 dependencies : [threads,
1491 install_rpath : rootlibexecdir,
1493 install_dir : rootbindir)
1494 public_programs += [exe]
1496 executable('systemd-getty-generator',
1497 'src/getty-generator/getty-generator.c',
1498 include_directories : includes,
1499 link_with : [libshared],
1500 install_rpath : rootlibexecdir,
1502 install_dir : systemgeneratordir)
1504 executable('systemd-debug-generator',
1505 'src/debug-generator/debug-generator.c',
1506 include_directories : includes,
1507 link_with : [libshared],
1508 install_rpath : rootlibexecdir,
1510 install_dir : systemgeneratordir)
1512 executable('systemd-fstab-generator',
1513 'src/fstab-generator/fstab-generator.c',
1514 'src/core/mount-setup.c',
1515 include_directories : includes,
1516 link_with : [libshared],
1517 install_rpath : rootlibexecdir,
1519 install_dir : systemgeneratordir)
1521 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1522 executable('30-systemd-environment-d-generator',
1523 'src/environment-d-generator/environment-d-generator.c',
1524 include_directories : includes,
1525 link_with : [libshared],
1526 install_rpath : rootlibexecdir,
1528 install_dir : userenvgeneratordir)
1530 meson.add_install_script(meson_make_symlink,
1531 join_paths(sysconfdir, 'environment'),
1532 join_paths(environmentdir, '99-environment.conf'))
1535 if conf.get('ENABLE_HIBERNATE') == 1
1536 executable('systemd-hibernate-resume-generator',
1537 'src/hibernate-resume/hibernate-resume-generator.c',
1538 include_directories : includes,
1539 link_with : [libshared],
1540 install_rpath : rootlibexecdir,
1542 install_dir : systemgeneratordir)
1544 executable('systemd-hibernate-resume',
1545 'src/hibernate-resume/hibernate-resume.c',
1546 include_directories : includes,
1547 link_with : [libshared],
1548 install_rpath : rootlibexecdir,
1550 install_dir : rootlibexecdir)
1553 if conf.get('HAVE_BLKID') == 1
1554 executable('systemd-gpt-auto-generator',
1555 'src/gpt-auto-generator/gpt-auto-generator.c',
1556 'src/basic/blkid-util.h',
1557 include_directories : includes,
1558 link_with : [libshared],
1559 dependencies : libblkid,
1560 install_rpath : rootlibexecdir,
1562 install_dir : systemgeneratordir)
1564 exe = executable('systemd-dissect',
1565 'src/dissect/dissect.c',
1566 include_directories : includes,
1567 link_with : [libshared],
1568 install_rpath : rootlibexecdir,
1570 install_dir : rootlibexecdir)
1571 public_programs += [exe]
1574 if conf.get('ENABLE_RESOLVE') == 1
1575 executable('systemd-resolved',
1576 systemd_resolved_sources,
1577 include_directories : includes,
1578 link_with : [libshared,
1580 libsystemd_resolve_core],
1581 dependencies : [threads,
1585 install_rpath : rootlibexecdir,
1587 install_dir : rootlibexecdir)
1589 exe = executable('resolvectl',
1591 include_directories : includes,
1592 link_with : [libshared,
1594 libsystemd_resolve_core],
1595 dependencies : [threads,
1599 install_rpath : rootlibexecdir,
1601 public_programs += [exe]
1603 meson.add_install_script(meson_make_symlink,
1604 join_paths(bindir, 'resolvectl'),
1605 join_paths(rootsbindir, 'resolvconf'))
1607 meson.add_install_script(meson_make_symlink,
1608 join_paths(bindir, 'resolvectl'),
1609 join_paths(bindir, 'systemd-resolve'))
1612 if conf.get('ENABLE_LOGIND') == 1
1613 executable('systemd-logind',
1614 systemd_logind_sources,
1615 include_directories : includes,
1616 link_with : [liblogind_core,
1618 dependencies : [threads,
1620 install_rpath : rootlibexecdir,
1622 install_dir : rootlibexecdir)
1624 exe = executable('loginctl',
1626 include_directories : includes,
1627 link_with : [libshared],
1628 dependencies : [threads,
1631 install_rpath : rootlibexecdir,
1633 install_dir : rootbindir)
1634 public_programs += [exe]
1636 exe = executable('systemd-inhibit',
1637 'src/login/inhibit.c',
1638 include_directories : includes,
1639 link_with : [libshared],
1640 install_rpath : rootlibexecdir,
1642 install_dir : rootbindir)
1643 public_programs += [exe]
1645 if conf.get('HAVE_PAM') == 1
1646 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1647 pam_systemd = shared_library(
1651 include_directories : includes,
1652 link_args : ['-shared',
1653 '-Wl,--version-script=' + version_script_arg],
1654 link_with : [libsystemd_static,
1656 dependencies : [threads,
1659 link_depends : pam_systemd_sym,
1661 install_dir : pamlibdir)
1663 test('dlopen-pam_systemd',
1665 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1669 executable('systemd-user-runtime-dir',
1670 user_runtime_dir_sources,
1671 include_directories : includes,
1672 link_with : [libshared, liblogind_core],
1673 install_rpath : rootlibexecdir,
1675 install_dir : rootlibexecdir)
1677 if conf.get('HAVE_PAM') == 1
1678 executable('systemd-user-sessions',
1679 'src/user-sessions/user-sessions.c',
1680 include_directories : includes,
1681 link_with : [libshared],
1682 install_rpath : rootlibexecdir,
1684 install_dir : rootlibexecdir)
1687 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1688 exe = executable('bootctl',
1689 'src/boot/bootctl.c',
1690 include_directories : includes,
1691 link_with : [libshared],
1692 dependencies : [libblkid],
1693 install_rpath : rootlibexecdir,
1695 public_programs += [exe]
1698 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1699 include_directories : includes,
1700 link_with : [libshared],
1701 dependencies : [threads],
1702 install_rpath : rootlibexecdir,
1704 public_programs += [exe]
1706 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 dependencies : [threads,
1714 install_rpath : rootlibexecdir,
1716 install_dir : rootbindir)
1717 public_programs += [exe]
1719 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1720 meson.add_install_script(meson_make_symlink,
1721 join_paths(rootbindir, 'systemctl'),
1722 join_paths(rootsbindir, alias))
1725 if conf.get('ENABLE_BACKLIGHT') == 1
1726 executable('systemd-backlight',
1727 'src/backlight/backlight.c',
1728 include_directories : includes,
1729 link_with : [libshared],
1730 install_rpath : rootlibexecdir,
1732 install_dir : rootlibexecdir)
1735 if conf.get('ENABLE_RFKILL') == 1
1736 executable('systemd-rfkill',
1737 'src/rfkill/rfkill.c',
1738 include_directories : includes,
1739 link_with : [libshared],
1740 install_rpath : rootlibexecdir,
1742 install_dir : rootlibexecdir)
1745 executable('systemd-system-update-generator',
1746 'src/system-update-generator/system-update-generator.c',
1747 include_directories : includes,
1748 link_with : [libshared],
1749 install_rpath : rootlibexecdir,
1751 install_dir : systemgeneratordir)
1753 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1754 executable('systemd-cryptsetup',
1755 'src/cryptsetup/cryptsetup.c',
1756 include_directories : includes,
1757 link_with : [libshared],
1758 dependencies : [libcryptsetup],
1759 install_rpath : rootlibexecdir,
1761 install_dir : rootlibexecdir)
1763 executable('systemd-cryptsetup-generator',
1764 'src/cryptsetup/cryptsetup-generator.c',
1765 include_directories : includes,
1766 link_with : [libshared],
1767 dependencies : [libcryptsetup],
1768 install_rpath : rootlibexecdir,
1770 install_dir : systemgeneratordir)
1772 executable('systemd-veritysetup',
1773 'src/veritysetup/veritysetup.c',
1774 include_directories : includes,
1775 link_with : [libshared],
1776 dependencies : [libcryptsetup],
1777 install_rpath : rootlibexecdir,
1779 install_dir : rootlibexecdir)
1781 executable('systemd-veritysetup-generator',
1782 'src/veritysetup/veritysetup-generator.c',
1783 include_directories : includes,
1784 link_with : [libshared],
1785 dependencies : [libcryptsetup],
1786 install_rpath : rootlibexecdir,
1788 install_dir : systemgeneratordir)
1791 if conf.get('HAVE_SYSV_COMPAT') == 1
1792 executable('systemd-sysv-generator',
1793 'src/sysv-generator/sysv-generator.c',
1794 include_directories : includes,
1795 link_with : [libshared],
1796 install_rpath : rootlibexecdir,
1798 install_dir : systemgeneratordir)
1800 executable('systemd-rc-local-generator',
1801 'src/rc-local-generator/rc-local-generator.c',
1802 include_directories : includes,
1803 link_with : [libshared],
1804 install_rpath : rootlibexecdir,
1806 install_dir : systemgeneratordir)
1809 if conf.get('ENABLE_HOSTNAMED') == 1
1810 executable('systemd-hostnamed',
1811 'src/hostname/hostnamed.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 install_rpath : rootlibexecdir,
1816 install_dir : rootlibexecdir)
1818 exe = executable('hostnamectl',
1819 'src/hostname/hostnamectl.c',
1820 include_directories : includes,
1821 link_with : [libshared],
1822 install_rpath : rootlibexecdir,
1824 public_programs += [exe]
1827 if conf.get('ENABLE_LOCALED') == 1
1828 if conf.get('HAVE_XKBCOMMON') == 1
1829 # logind will load libxkbcommon.so dynamically on its own
1835 executable('systemd-localed',
1836 systemd_localed_sources,
1837 include_directories : includes,
1838 link_with : [libshared],
1839 dependencies : deps,
1840 install_rpath : rootlibexecdir,
1842 install_dir : rootlibexecdir)
1844 exe = executable('localectl',
1846 include_directories : includes,
1847 link_with : [libshared],
1848 install_rpath : rootlibexecdir,
1850 public_programs += [exe]
1853 if conf.get('ENABLE_TIMEDATED') == 1
1854 executable('systemd-timedated',
1855 'src/timedate/timedated.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1860 install_dir : rootlibexecdir)
1863 if conf.get('ENABLE_TIMEDATECTL') == 1
1864 exe = executable('timedatectl',
1865 'src/timedate/timedatectl.c',
1866 include_directories : includes,
1867 install_rpath : rootlibexecdir,
1868 link_with : [libshared],
1869 dependencies : [libm],
1871 public_programs += [exe]
1874 if conf.get('ENABLE_TIMESYNCD') == 1
1875 executable('systemd-timesyncd',
1876 systemd_timesyncd_sources,
1877 include_directories : includes,
1878 link_with : [libshared],
1879 dependencies : [threads,
1881 install_rpath : rootlibexecdir,
1883 install_dir : rootlibexecdir)
1885 executable('systemd-time-wait-sync',
1886 'src/time-wait-sync/time-wait-sync.c',
1887 include_directories : includes,
1888 link_with : [libshared],
1889 install_rpath : rootlibexecdir,
1891 install_dir : rootlibexecdir)
1894 if conf.get('ENABLE_MACHINED') == 1
1895 executable('systemd-machined',
1896 systemd_machined_sources,
1897 include_directories : includes,
1898 link_with : [libmachine_core,
1900 install_rpath : rootlibexecdir,
1902 install_dir : rootlibexecdir)
1904 exe = executable('machinectl',
1905 'src/machine/machinectl.c',
1906 include_directories : includes,
1907 link_with : [libshared],
1908 dependencies : [threads,
1911 install_rpath : rootlibexecdir,
1913 install_dir : rootbindir)
1914 public_programs += [exe]
1917 if conf.get('ENABLE_IMPORTD') == 1
1918 executable('systemd-importd',
1919 systemd_importd_sources,
1920 include_directories : includes,
1921 link_with : [libshared],
1922 dependencies : [threads],
1923 install_rpath : rootlibexecdir,
1925 install_dir : rootlibexecdir)
1927 systemd_pull = executable('systemd-pull',
1928 systemd_pull_sources,
1929 include_directories : includes,
1930 link_with : [libshared],
1931 dependencies : [libcurl,
1936 install_rpath : rootlibexecdir,
1938 install_dir : rootlibexecdir)
1940 systemd_import = executable('systemd-import',
1941 systemd_import_sources,
1942 include_directories : includes,
1943 link_with : [libshared],
1944 dependencies : [libcurl,
1948 install_rpath : rootlibexecdir,
1950 install_dir : rootlibexecdir)
1952 systemd_export = executable('systemd-export',
1953 systemd_export_sources,
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [libcurl,
1960 install_rpath : rootlibexecdir,
1962 install_dir : rootlibexecdir)
1963 public_programs += [systemd_pull, systemd_import, systemd_export]
1966 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1967 exe = executable('systemd-journal-upload',
1968 systemd_journal_upload_sources,
1969 include_directories : includes,
1970 link_with : [libshared],
1971 dependencies : [threads,
1976 install_rpath : rootlibexecdir,
1978 install_dir : rootlibexecdir)
1979 public_programs += [exe]
1982 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1983 s_j_remote = executable('systemd-journal-remote',
1984 systemd_journal_remote_sources,
1985 include_directories : includes,
1986 link_with : [libshared],
1987 dependencies : [threads,
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootlibexecdir)
1996 s_j_gatewayd = executable('systemd-journal-gatewayd',
1997 systemd_journal_gatewayd_sources,
1998 include_directories : includes,
1999 link_with : [libshared],
2000 dependencies : [threads,
2005 install_rpath : rootlibexecdir,
2007 install_dir : rootlibexecdir)
2008 public_programs += [s_j_remote, s_j_gatewayd]
2011 if conf.get('ENABLE_COREDUMP') == 1
2012 executable('systemd-coredump',
2013 systemd_coredump_sources,
2014 include_directories : includes,
2015 link_with : [libshared],
2016 dependencies : [threads,
2021 install_rpath : rootlibexecdir,
2023 install_dir : rootlibexecdir)
2025 exe = executable('coredumpctl',
2026 coredumpctl_sources,
2027 include_directories : includes,
2028 link_with : [libshared],
2029 dependencies : [threads,
2032 install_rpath : rootlibexecdir,
2034 public_programs += [exe]
2037 if conf.get('ENABLE_BINFMT') == 1
2038 exe = executable('systemd-binfmt',
2039 'src/binfmt/binfmt.c',
2040 include_directories : includes,
2041 link_with : [libshared],
2042 install_rpath : rootlibexecdir,
2044 install_dir : rootlibexecdir)
2045 public_programs += [exe]
2047 meson.add_install_script('sh', '-c',
2048 mkdir_p.format(binfmtdir))
2049 meson.add_install_script('sh', '-c',
2050 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2053 if conf.get('ENABLE_VCONSOLE') == 1
2054 executable('systemd-vconsole-setup',
2055 'src/vconsole/vconsole-setup.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2060 install_dir : rootlibexecdir)
2063 if conf.get('ENABLE_RANDOMSEED') == 1
2064 executable('systemd-random-seed',
2065 'src/random-seed/random-seed.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 install_rpath : rootlibexecdir,
2070 install_dir : rootlibexecdir)
2073 if conf.get('ENABLE_FIRSTBOOT') == 1
2074 executable('systemd-firstboot',
2075 'src/firstboot/firstboot.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : [libcrypt],
2079 install_rpath : rootlibexecdir,
2081 install_dir : rootbindir)
2084 executable('systemd-remount-fs',
2085 'src/remount-fs/remount-fs.c',
2086 'src/core/mount-setup.c',
2087 'src/core/mount-setup.h',
2088 include_directories : includes,
2089 link_with : [libshared],
2090 install_rpath : rootlibexecdir,
2092 install_dir : rootlibexecdir)
2094 executable('systemd-machine-id-setup',
2095 'src/machine-id-setup/machine-id-setup-main.c',
2096 'src/core/machine-id-setup.c',
2097 'src/core/machine-id-setup.h',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2102 install_dir : rootbindir)
2104 executable('systemd-fsck',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 install_rpath : rootlibexecdir,
2110 install_dir : rootlibexecdir)
2112 executable('systemd-growfs',
2113 'src/partition/growfs.c',
2114 include_directories : includes,
2115 link_with : [libshared],
2116 dependencies : [libcryptsetup],
2117 install_rpath : rootlibexecdir,
2119 install_dir : rootlibexecdir)
2121 executable('systemd-makefs',
2122 'src/partition/makefs.c',
2123 include_directories : includes,
2124 link_with : [libshared],
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootlibexecdir)
2129 executable('systemd-sleep',
2130 'src/sleep/sleep.c',
2131 include_directories : includes,
2132 link_with : [libshared],
2133 install_rpath : rootlibexecdir,
2135 install_dir : rootlibexecdir)
2137 exe = executable('systemd-sysctl',
2138 'src/sysctl/sysctl.c',
2139 include_directories : includes,
2140 link_with : [libshared],
2141 install_rpath : rootlibexecdir,
2143 install_dir : rootlibexecdir)
2144 public_programs += [exe]
2146 executable('systemd-ac-power',
2147 'src/ac-power/ac-power.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2154 exe = executable('systemd-detect-virt',
2155 'src/detect-virt/detect-virt.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2160 public_programs += [exe]
2162 exe = executable('systemd-delta',
2163 'src/delta/delta.c',
2164 include_directories : includes,
2165 link_with : [libshared],
2166 install_rpath : rootlibexecdir,
2168 public_programs += [exe]
2170 exe = executable('systemd-escape',
2171 'src/escape/escape.c',
2172 include_directories : includes,
2173 link_with : [libshared],
2174 install_rpath : rootlibexecdir,
2176 install_dir : rootbindir)
2177 public_programs += [exe]
2179 exe = executable('systemd-notify',
2180 'src/notify/notify.c',
2181 include_directories : includes,
2182 link_with : [libshared],
2183 install_rpath : rootlibexecdir,
2185 install_dir : rootbindir)
2186 public_programs += [exe]
2188 executable('systemd-volatile-root',
2189 'src/volatile-root/volatile-root.c',
2190 include_directories : includes,
2191 link_with : [libshared],
2192 install_rpath : rootlibexecdir,
2194 install_dir : rootlibexecdir)
2196 executable('systemd-cgroups-agent',
2197 'src/cgroups-agent/cgroups-agent.c',
2198 include_directories : includes,
2199 link_with : [libshared],
2200 install_rpath : rootlibexecdir,
2202 install_dir : rootlibexecdir)
2204 exe = executable('systemd-path',
2206 include_directories : includes,
2207 link_with : [libshared],
2208 install_rpath : rootlibexecdir,
2210 public_programs += [exe]
2212 exe = executable('systemd-ask-password',
2213 'src/ask-password/ask-password.c',
2214 include_directories : includes,
2215 link_with : [libshared],
2216 install_rpath : rootlibexecdir,
2218 install_dir : rootbindir)
2219 public_programs += [exe]
2221 executable('systemd-reply-password',
2222 'src/reply-password/reply-password.c',
2223 include_directories : includes,
2224 link_with : [libshared],
2225 install_rpath : rootlibexecdir,
2227 install_dir : rootlibexecdir)
2229 exe = executable('systemd-tty-ask-password-agent',
2230 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2231 include_directories : includes,
2232 link_with : [libshared],
2233 install_rpath : rootlibexecdir,
2235 install_dir : rootbindir)
2236 public_programs += [exe]
2238 exe = executable('systemd-cgls',
2240 include_directories : includes,
2241 link_with : [libshared],
2242 install_rpath : rootlibexecdir,
2244 public_programs += [exe]
2246 exe = executable('systemd-cgtop',
2247 'src/cgtop/cgtop.c',
2248 include_directories : includes,
2249 link_with : [libshared],
2250 install_rpath : rootlibexecdir,
2252 public_programs += [exe]
2254 executable('systemd-initctl',
2255 'src/initctl/initctl.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 install_rpath : rootlibexecdir,
2260 install_dir : rootlibexecdir)
2262 exe = executable('systemd-mount',
2263 'src/mount/mount-tool.c',
2264 include_directories : includes,
2265 link_with : [libshared],
2266 install_rpath : rootlibexecdir,
2268 public_programs += [exe]
2270 meson.add_install_script(meson_make_symlink,
2271 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2273 exe = executable('systemd-run',
2275 include_directories : includes,
2276 link_with : [libshared],
2277 install_rpath : rootlibexecdir,
2279 public_programs += [exe]
2281 exe = executable('systemd-stdio-bridge',
2282 'src/stdio-bridge/stdio-bridge.c',
2283 include_directories : includes,
2284 link_with : [libshared],
2285 install_rpath : rootlibexecdir,
2287 public_programs += [exe]
2289 exe = executable('busctl',
2290 'src/busctl/busctl.c',
2291 'src/busctl/busctl-introspect.c',
2292 'src/busctl/busctl-introspect.h',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2297 public_programs += [exe]
2299 if conf.get('ENABLE_SYSUSERS') == 1
2300 exe = executable('systemd-sysusers',
2301 'src/sysusers/sysusers.c',
2302 include_directories : includes,
2303 link_with : [libshared],
2304 install_rpath : rootlibexecdir,
2306 install_dir : rootbindir)
2307 public_programs += [exe]
2310 if conf.get('ENABLE_TMPFILES') == 1
2311 exe = executable('systemd-tmpfiles',
2312 'src/tmpfiles/tmpfiles.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 dependencies : [libacl],
2316 install_rpath : rootlibexecdir,
2318 install_dir : rootbindir)
2319 public_programs += [exe]
2321 test('test-systemd-tmpfiles',
2322 test_systemd_tmpfiles_py,
2323 args : exe.full_path())
2324 # https://github.com/mesonbuild/meson/issues/2681
2327 if conf.get('ENABLE_HWDB') == 1
2328 exe = executable('systemd-hwdb',
2330 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2331 include_directories : includes,
2332 link_with : [libudev_static],
2333 install_rpath : udev_rpath,
2335 install_dir : rootbindir)
2336 public_programs += [exe]
2339 if conf.get('ENABLE_QUOTACHECK') == 1
2340 executable('systemd-quotacheck',
2341 'src/quotacheck/quotacheck.c',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2346 install_dir : rootlibexecdir)
2349 exe = executable('systemd-socket-proxyd',
2350 'src/socket-proxy/socket-proxyd.c',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 dependencies : [threads],
2354 install_rpath : rootlibexecdir,
2356 install_dir : rootlibexecdir)
2357 public_programs += [exe]
2359 exe = executable('systemd-udevd',
2360 systemd_udevd_sources,
2361 include_directories : includes,
2362 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2363 link_with : [libudev_core,
2366 dependencies : [threads,
2371 install_rpath : udev_rpath,
2373 install_dir : rootlibexecdir)
2374 public_programs += [exe]
2376 exe = executable('udevadm',
2378 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2379 include_directories : includes,
2380 link_with : [libudev_core,
2383 dependencies : [threads,
2388 install_rpath : udev_rpath,
2390 install_dir : rootbindir)
2391 public_programs += [exe]
2393 executable('systemd-shutdown',
2394 systemd_shutdown_sources,
2395 include_directories : includes,
2396 link_with : [libshared],
2397 dependencies : [libmount],
2398 install_rpath : rootlibexecdir,
2400 install_dir : rootlibexecdir)
2402 executable('systemd-update-done',
2403 'src/update-done/update-done.c',
2404 include_directories : includes,
2405 link_with : [libshared],
2406 install_rpath : rootlibexecdir,
2408 install_dir : rootlibexecdir)
2410 executable('systemd-update-utmp',
2411 'src/update-utmp/update-utmp.c',
2412 include_directories : includes,
2413 link_with : [libshared],
2414 dependencies : [libaudit],
2415 install_rpath : rootlibexecdir,
2417 install_dir : rootlibexecdir)
2419 if conf.get('HAVE_KMOD') == 1
2420 executable('systemd-modules-load',
2421 'src/modules-load/modules-load.c',
2422 include_directories : includes,
2423 link_with : [libshared],
2424 dependencies : [libkmod],
2425 install_rpath : rootlibexecdir,
2427 install_dir : rootlibexecdir)
2429 meson.add_install_script('sh', '-c',
2430 mkdir_p.format(modulesloaddir))
2431 meson.add_install_script('sh', '-c',
2432 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2435 exe = executable('systemd-nspawn',
2436 systemd_nspawn_sources,
2437 'src/core/mount-setup.c', # FIXME: use a variable?
2438 'src/core/mount-setup.h',
2439 'src/core/loopback-setup.c',
2440 'src/core/loopback-setup.h',
2441 include_directories : [includes, include_directories('src/nspawn')],
2442 link_with : [libshared],
2443 dependencies : [libacl,
2447 install_rpath : rootlibexecdir,
2449 public_programs += [exe]
2451 if conf.get('ENABLE_NETWORKD') == 1
2452 executable('systemd-networkd',
2453 systemd_networkd_sources,
2454 include_directories : includes,
2455 link_with : [libnetworkd_core,
2459 dependencies : [threads],
2460 install_rpath : rootlibexecdir,
2462 install_dir : rootlibexecdir)
2464 executable('systemd-networkd-wait-online',
2465 systemd_networkd_wait_online_sources,
2466 include_directories : includes,
2467 link_with : [libnetworkd_core,
2469 install_rpath : rootlibexecdir,
2471 install_dir : rootlibexecdir)
2473 exe = executable('networkctl',
2475 include_directories : includes,
2476 link_with : [libsystemd_network,
2478 install_rpath : rootlibexecdir,
2480 install_dir : rootbindir)
2481 public_programs += [exe]
2484 executable('systemd-sulogin-shell',
2485 ['src/sulogin-shell/sulogin-shell.c'],
2486 include_directories : includes,
2487 link_with : [libshared],
2488 install_rpath : rootlibexecdir,
2490 install_dir : rootlibexecdir)
2492 ############################################################
2494 foreach tuple : tests
2496 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2497 dependencies = tuple[2]
2498 condition = tuple.length() >= 4 ? tuple[3] : ''
2499 type = tuple.length() >= 5 ? tuple[4] : ''
2500 defs = tuple.length() >= 6 ? tuple[5] : []
2501 incs = tuple.length() >= 7 ? tuple[6] : includes
2504 name = sources[0].split('/')[-1].split('.')[0]
2505 if type.startswith('timeout=')
2506 timeout = type.split('=')[1].to_int()
2509 if want_tests == 'false'
2510 message('Not compiling @0@ because tests is set to false'.format(name))
2511 elif condition == '' or conf.get(condition) == 1
2515 include_directories : incs,
2516 link_with : link_with,
2517 dependencies : dependencies,
2519 install_rpath : rootlibexecdir,
2520 install : install_tests,
2521 install_dir : join_paths(testsdir, type))
2524 message('@0@ is a manual test'.format(name))
2525 elif type == 'unsafe' and want_tests != 'unsafe'
2526 message('@0@ is an unsafe test'.format(name))
2533 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2538 'test-libsystemd-sym',
2539 test_libsystemd_sym_c,
2540 include_directories : includes,
2541 link_with : [libsystemd],
2542 install : install_tests,
2543 install_dir : testsdir)
2544 test('test-libsystemd-sym', exe)
2547 'test-libsystemd-static-sym',
2548 test_libsystemd_sym_c,
2549 include_directories : includes,
2550 link_with : [install_libsystemd_static],
2551 dependencies : [threads], # threads is already included in dependencies on the library,
2552 # but does not seem to get propagated. Add here as a work-around.
2553 build_by_default : static_libsystemd_pic,
2554 install : install_tests and static_libsystemd_pic,
2555 install_dir : testsdir)
2556 if static_libsystemd_pic
2557 test('test-libsystemd-static-sym', exe)
2563 include_directories : includes,
2564 c_args : ['-Wno-deprecated-declarations'],
2565 link_with : [libudev],
2566 install : install_tests,
2567 install_dir : testsdir)
2568 test('test-libudev-sym', exe)
2571 'test-libudev-static-sym',
2573 include_directories : includes,
2574 c_args : ['-Wno-deprecated-declarations'],
2575 link_with : [install_libudev_static],
2576 build_by_default : static_libudev_pic,
2577 install : install_tests and static_libudev_pic,
2578 install_dir : testsdir)
2579 if static_libudev_pic
2580 test('test-libudev-static-sym', exe)
2583 ############################################################
2587 foreach tuple : fuzzers
2589 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2590 dependencies = tuple[2]
2591 defs = tuple.length() >= 4 ? tuple[3] : []
2592 incs = tuple.length() >= 5 ? tuple[4] : includes
2595 dependencies += fuzzing_engine
2597 sources += 'src/fuzz/fuzz-main.c'
2600 name = sources[0].split('/')[-1].split('.')[0]
2602 fuzzer_exes += executable(
2605 include_directories : [incs, include_directories('src/fuzz')],
2606 link_with : link_with,
2607 dependencies : dependencies,
2612 run_target('fuzzers',
2613 depends : fuzzer_exes,
2616 ############################################################
2618 make_directive_index_py = find_program('tools/make-directive-index.py')
2619 make_man_index_py = find_program('tools/make-man-index.py')
2620 xml_helper_py = find_program('tools/xml_helper.py')
2621 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2625 subdir('sysusers.d')
2626 subdir('tmpfiles.d')
2631 subdir('shell-completion/bash')
2632 subdir('shell-completion/zsh')
2633 subdir('doc/sysvinit')
2634 subdir('doc/var-log')
2636 # FIXME: figure out if the warning is true:
2637 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2638 install_subdir('factory/etc',
2639 install_dir : factorydir)
2642 install_data('xorg/50-systemd-user.sh',
2643 install_dir : xinitrcdir)
2644 install_data('modprobe.d/systemd.conf',
2645 install_dir : modprobedir)
2646 install_data('LICENSE.GPL2',
2651 'doc/DISTRO_PORTING',
2652 'doc/ENVIRONMENT.md',
2654 'doc/TRANSIENT-SETTINGS.md',
2657 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2658 install_dir : docdir)
2660 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2661 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2663 ############################################################
2665 meson_check_help = find_program('tools/meson-check-help.sh')
2667 foreach exec : public_programs
2668 name = exec.full_path().split('/')[-1]
2669 test('check-help-' + name,
2671 args : [exec.full_path()])
2674 ############################################################
2676 # Enable tests for all supported sanitizers
2677 foreach tuple : sanitizers
2678 sanitizer = tuple[0]
2681 have = run_command(check_compilation_sh,
2682 cc.cmd_array(), '-x', 'c',
2683 '-fsanitize=@0@'.format(sanitizer),
2684 '-include', link_test_c).returncode() == 0
2685 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2689 foreach p : fuzz_regression_tests
2690 b = p.split('/')[-2]
2691 c = p.split('/')[-1]
2693 name = '@0@:@1@'.format(b, sanitizer)
2696 if want_tests == 'false'
2697 message('Not compiling @0@ because tests is set to false'.format(name))
2699 exe = custom_target(
2703 command : [env, 'ln', '-fs',
2704 join_paths(build.full_path(), b),
2706 build_by_default : true)
2708 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2713 if want_tests != 'false' and slow_tests
2714 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2716 args : [exe.full_path(),
2717 join_paths(meson.source_root(),
2718 'test/fuzz-regressions',
2726 ############################################################
2729 all_files = run_command(
2731 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2734 all_files = files(all_files.stdout().split())
2739 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'],
2931 ['valgrind', conf.get('VALGRIND') == 1],
2934 if tuple.length() >= 2
2937 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2938 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2939 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2944 missing += [tuple[0]]
2950 'enabled features: @0@'.format(', '.join(found)),
2952 'disabled features: @0@'.format(', '.join(missing)),
2954 message('\n '.join(status))
2956 if rootprefixdir != rootprefix_default
2958 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2959 'systemd used fixed names for unit file directories and other paths, so anything\n' +
2960 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))