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')
141 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
143 docdir = get_option('docdir')
145 docdir = join_paths(datadir, 'doc/systemd')
148 dbuspolicydir = get_option('dbuspolicydir')
149 if dbuspolicydir == ''
150 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
153 dbussessionservicedir = get_option('dbussessionservicedir')
154 if dbussessionservicedir == ''
155 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
158 dbussystemservicedir = get_option('dbussystemservicedir')
159 if dbussystemservicedir == ''
160 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
163 pamlibdir = get_option('pamlibdir')
165 pamlibdir = join_paths(rootlibdir, 'security')
168 pamconfdir = get_option('pamconfdir')
170 pamconfdir = join_paths(sysconfdir, 'pam.d')
173 memory_accounting_default = get_option('memory-accounting-default')
175 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
176 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
177 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
178 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
179 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
180 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
181 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
183 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
185 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
186 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
187 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
188 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
189 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
190 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
191 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
192 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
193 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
194 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
195 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
196 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
197 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
198 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
199 conf.set_quoted('ROOTPREFIX', rootprefixdir)
200 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
201 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
202 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
203 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
204 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
205 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
206 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
207 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
208 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
209 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
210 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
211 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
212 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
213 conf.set_quoted('LIBDIR', libdir)
214 conf.set_quoted('ROOTLIBDIR', rootlibdir)
215 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
216 conf.set_quoted('BOOTLIBDIR', bootlibdir)
217 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
218 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
219 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
220 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
221 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
222 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
223 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
224 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
226 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
227 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
229 substs.set('prefix', prefixdir)
230 substs.set('exec_prefix', prefixdir)
231 substs.set('libdir', libdir)
232 substs.set('rootlibdir', rootlibdir)
233 substs.set('includedir', includedir)
234 substs.set('pkgsysconfdir', pkgsysconfdir)
235 substs.set('bindir', bindir)
236 substs.set('rootbindir', rootbindir)
237 substs.set('rootlibexecdir', rootlibexecdir)
238 substs.set('systemunitdir', systemunitdir)
239 substs.set('userunitdir', userunitdir)
240 substs.set('systempresetdir', systempresetdir)
241 substs.set('userpresetdir', userpresetdir)
242 substs.set('udevhwdbdir', udevhwdbdir)
243 substs.set('udevrulesdir', udevrulesdir)
244 substs.set('udevlibexecdir', udevlibexecdir)
245 substs.set('environmentdir', environmentdir)
246 substs.set('catalogdir', catalogdir)
247 substs.set('tmpfilesdir', tmpfilesdir)
248 substs.set('sysusersdir', sysusersdir)
249 substs.set('sysctldir', sysctldir)
250 substs.set('binfmtdir', binfmtdir)
251 substs.set('modulesloaddir', modulesloaddir)
252 substs.set('modprobedir', modprobedir)
253 substs.set('systemgeneratordir', systemgeneratordir)
254 substs.set('usergeneratordir', usergeneratordir)
255 substs.set('systemenvgeneratordir', systemenvgeneratordir)
256 substs.set('userenvgeneratordir', userenvgeneratordir)
257 substs.set('systemshutdowndir', systemshutdowndir)
258 substs.set('systemsleepdir', systemsleepdir)
259 substs.set('VARLOGDIR', varlogdir)
260 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
261 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
262 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
263 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
264 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
265 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
266 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
267 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
269 #####################################################################
271 cc = meson.get_compiler('c')
272 pkgconfig = import('pkgconfig')
273 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
274 meson_build_sh = find_program('tools/meson-build.sh')
276 if get_option('tests') != 'false'
277 cxx = find_program('c++', required : false)
279 # Used only for tests
284 want_ossfuzz = get_option('oss-fuzz')
285 want_libfuzzer = get_option('llvm-fuzz')
286 fuzzer_build = want_ossfuzz or want_libfuzzer
287 if want_ossfuzz and want_libfuzzer
288 error('only one of oss-fuzz and llvm-fuzz can be specified')
291 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
294 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
297 possible_cc_flags = [
301 '-Wmissing-include-dirs',
302 '-Wold-style-definition',
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',
322 '-Werror=shift-count-overflow',
323 '-Werror=shift-overflow=2',
328 '-fdiagnostics-show-option',
329 '-fno-strict-aliasing',
330 '-fvisibility=hidden',
332 '-fstack-protector-strong',
333 '--param=ssp-buffer-size=4',
336 # --as-needed and --no-undefined are provided by meson by default,
337 # run mesonconf to see what is enabled
338 possible_link_flags = [
343 # the oss-fuzz fuzzers are not built with -fPIE, so don't
344 # enable it when we are linking against them
346 possible_cc_flags += '-fPIE'
347 possible_link_flags += '-pie'
350 if cc.get_id() == 'clang'
351 possible_cc_flags += [
352 '-Wno-typedef-redefinition',
353 '-Wno-gnu-variable-sized-type-not-at-end',
357 if get_option('buildtype') != 'debug'
358 possible_cc_flags += [
359 '-ffunction-sections',
363 possible_link_flags += '-Wl,--gc-sections'
366 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
368 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
369 # arguments, just emits a warning. So test for the "positive" version instead.
370 foreach arg : ['unused-parameter',
371 'missing-field-initializers',
374 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
376 if cc.has_argument('-W' + arg)
377 add_project_arguments('-Wno-' + arg, language : 'c')
383 #include <inttypes.h>
384 typedef uint64_t usec_t;
385 usec_t now(clockid_t clock);
390 ''', name : '-Werror=shadow with local shadowing')
391 add_project_arguments('-Werror=shadow', language : 'c')
394 link_test_c = files('tools/meson-link-test.c')
396 foreach arg : possible_link_flags
397 have = run_command(check_compilation_sh,
398 cc.cmd_array(), '-x', 'c', arg,
399 '-include', link_test_c).returncode() == 0
400 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
402 add_project_link_arguments(arg, language : 'c')
406 cpp = ' '.join(cc.cmd_array()) + ' -E'
408 #####################################################################
409 # compilation result tests
411 conf.set('_GNU_SOURCE', true)
412 conf.set('__SANE_USERSPACE_TYPES__', true)
414 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
417 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
418 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
419 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
420 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
424 #include <linux/ethtool.h>
425 #include <linux/fib_rules.h>
426 #include <linux/stat.h>
427 #include <sys/stat.h>
429 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
431 foreach decl : ['char16_t',
434 'struct ethtool_link_settings',
435 'struct fib_rule_uid_range',
439 # We get -1 if the size cannot be determined
440 have = cc.sizeof(decl, prefix : decl_headers) > 0
441 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
444 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
445 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
446 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
447 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
448 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
449 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
450 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
451 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
452 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
453 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
454 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
455 # if_tunnel.h is buggy and cannot be included on its own
456 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
457 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
458 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
459 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
460 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
461 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
462 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
463 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
464 ['NDA_IFINDEX', 'linux/neighbour.h'],
465 ['IFA_FLAGS', 'linux/if_addr.h'],
466 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
467 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
468 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
470 prefix = decl.length() > 2 ? decl[2] : ''
471 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
472 conf.set10('HAVE_' + decl[0], have)
475 foreach ident : ['secure_getenv', '__secure_getenv']
476 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
480 ['memfd_create', '''#include <sys/mman.h>'''],
481 ['gettid', '''#include <sys/types.h>
482 #include <unistd.h>'''],
483 ['pivot_root', '''#include <stdlib.h>
484 #include <unistd.h>'''], # no known header declares pivot_root
485 ['name_to_handle_at', '''#include <sys/types.h>
486 #include <sys/stat.h>
487 #include <fcntl.h>'''],
488 ['setns', '''#include <sched.h>'''],
489 ['renameat2', '''#include <stdio.h>
490 #include <fcntl.h>'''],
491 ['kcmp', '''#include <linux/kcmp.h>'''],
492 ['keyctl', '''#include <sys/types.h>
493 #include <keyutils.h>'''],
494 ['copy_file_range', '''#include <sys/syscall.h>
495 #include <unistd.h>'''],
496 ['bpf', '''#include <sys/syscall.h>
497 #include <unistd.h>'''],
498 ['statx', '''#include <sys/types.h>
499 #include <sys/stat.h>
500 #include <unistd.h>'''],
501 ['explicit_bzero' , '''#include <string.h>'''],
502 ['reallocarray', '''#include <malloc.h>'''],
505 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
506 conf.set10('HAVE_' + ident[0].to_upper(), have)
509 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
510 conf.set10('USE_SYS_RANDOM_H', true)
511 conf.set10('HAVE_GETRANDOM', true)
513 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
514 conf.set10('USE_SYS_RANDOM_H', false)
515 conf.set10('HAVE_GETRANDOM', have)
518 #####################################################################
520 sed = find_program('sed')
521 awk = find_program('awk')
522 m4 = find_program('m4')
523 stat = find_program('stat')
524 git = find_program('git', required : false)
525 env = find_program('env')
526 perl = find_program('perl', required : false)
528 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
529 mkdir_p = 'mkdir -p $DESTDIR/@0@'
530 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
531 splash_bmp = files('test/splash.bmp')
533 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
534 # /usr/sbin, /sbin, and fall back to the default from middle column.
535 progs = [['quotaon', '/usr/sbin/quotaon' ],
536 ['quotacheck', '/usr/sbin/quotacheck' ],
537 ['kmod', '/usr/bin/kmod' ],
538 ['kexec', '/usr/sbin/kexec' ],
539 ['sulogin', '/usr/sbin/sulogin' ],
540 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
541 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
542 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
543 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
546 path = get_option(prog[0] + '-path')
548 message('Using @1@ for @0@'.format(prog[0], path))
550 exe = find_program(prog[0],
551 '/usr/sbin/' + prog[0],
554 path = exe.found() ? exe.path() : prog[1]
556 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
557 conf.set_quoted(name, path)
558 substs.set(name, path)
561 conf.set_quoted('TELINIT', get_option('telinit-path'))
563 if run_command('ln', '--relative', '--help').returncode() != 0
564 error('ln does not support --relative (added in coreutils 8.16)')
567 ############################################################
569 gperf = find_program('gperf')
571 gperf_test_format = '''
573 const char * in_word_set(const char *, @0@);
576 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
577 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
578 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
579 if cc.compiles(gperf_test)
580 gperf_len_type = 'size_t'
582 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
583 if cc.compiles(gperf_test)
584 gperf_len_type = 'unsigned'
586 error('unable to determine gperf len type')
589 message('gperf len type is @0@'.format(gperf_len_type))
590 conf.set('GPERF_LEN_TYPE', gperf_len_type,
591 description : 'The type of gperf "len" parameter')
593 ############################################################
595 if not cc.has_header('sys/capability.h')
596 error('POSIX caps headers not found')
598 foreach header : ['crypt.h',
601 'linux/vm_sockets.h',
603 'valgrind/memcheck.h',
604 'valgrind/valgrind.h',
607 conf.set10('HAVE_' + header.underscorify().to_upper(),
608 cc.has_header(header))
611 ############################################################
613 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
614 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
615 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
617 default_hierarchy = get_option('default-hierarchy')
618 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
619 description : 'default cgroup hierarchy as string')
620 if default_hierarchy == 'legacy'
621 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
622 elif default_hierarchy == 'hybrid'
623 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
625 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
628 time_epoch = get_option('time-epoch')
631 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
633 time_epoch = time_epoch.to_int()
634 conf.set('TIME_EPOCH', time_epoch)
636 system_uid_max = get_option('system-uid-max')
637 if system_uid_max == ''
638 system_uid_max = run_command(
640 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
641 '/etc/login.defs').stdout().strip()
642 if system_uid_max == ''
643 system_uid_max = '999'
646 system_uid_max = system_uid_max.to_int()
647 conf.set('SYSTEM_UID_MAX', system_uid_max)
648 substs.set('systemuidmax', system_uid_max)
649 message('maximum system UID is @0@'.format(system_uid_max))
651 system_gid_max = get_option('system-gid-max')
652 if system_gid_max == ''
653 system_gid_max = run_command(
655 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
656 '/etc/login.defs').stdout().strip()
657 if system_gid_max == ''
658 system_gid_max = '999'
661 system_gid_max = system_gid_max.to_int()
662 conf.set('SYSTEM_GID_MAX', system_gid_max)
663 substs.set('systemgidmax', system_gid_max)
664 message('maximum system GID is @0@'.format(system_gid_max))
666 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
667 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
668 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
669 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
670 substs.set('dynamicuidmin', dynamic_uid_min)
671 substs.set('dynamicuidmax', dynamic_uid_max)
673 container_uid_base_min = get_option('container-uid-base-min').to_int()
674 container_uid_base_max = get_option('container-uid-base-max').to_int()
675 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
676 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
677 substs.set('containeruidbasemin', container_uid_base_min)
678 substs.set('containeruidbasemax', container_uid_base_max)
680 nobody_user = get_option('nobody-user')
681 nobody_group = get_option('nobody-group')
683 getent_result = run_command('getent', 'passwd', '65534')
684 if getent_result.returncode() == 0
685 name = getent_result.stdout().split(':')[0]
686 if name != nobody_user
688 '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) +
689 'Your build will result in an user table setup that is incompatible with the local system.')
692 id_result = run_command('id', '-u', nobody_user)
693 if id_result.returncode() == 0
694 id = id_result.stdout().to_int()
697 '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) +
698 'Your build will result in an user table setup that is incompatible with the local system.')
702 getent_result = run_command('getent', 'group', '65534')
703 if getent_result.returncode() == 0
704 name = getent_result.stdout().split(':')[0]
705 if name != nobody_group
707 '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) +
708 'Your build will result in an group table setup that is incompatible with the local system.')
711 id_result = run_command('id', '-g', nobody_group)
712 if id_result.returncode() == 0
713 id = id_result.stdout().to_int()
716 '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) +
717 'Your build will result in an group table setup that is incompatible with the local system.')
720 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
722 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
723 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
726 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
727 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
728 substs.set('NOBODY_USER_NAME', nobody_user)
729 substs.set('NOBODY_GROUP_NAME', nobody_group)
731 tty_gid = get_option('tty-gid')
732 conf.set('TTY_GID', tty_gid)
733 substs.set('TTY_GID', tty_gid)
735 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
736 if get_option('users-gid') != ''
737 users_gid = get_option('users-gid').to_int()
741 substs.set('USERS_GID', users_gid)
743 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
744 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
746 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
747 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
749 kill_user_processes = get_option('default-kill-user-processes')
750 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
751 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
752 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
754 dns_servers = get_option('dns-servers')
755 conf.set_quoted('DNS_SERVERS', dns_servers)
756 substs.set('DNS_SERVERS', dns_servers)
758 ntp_servers = get_option('ntp-servers')
759 conf.set_quoted('NTP_SERVERS', ntp_servers)
760 substs.set('NTP_SERVERS', ntp_servers)
762 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
764 substs.set('SUSHELL', get_option('debug-shell'))
765 substs.set('DEBUGTTY', get_option('debug-tty'))
767 enable_debug_hashmap = false
768 enable_debug_mmap_cache = false
769 foreach name : get_option('debug')
771 enable_debug_hashmap = true
772 elif name == 'mmap-cache'
773 enable_debug_mmap_cache = true
775 message('unknown debug option "@0@", ignoring'.format(name))
778 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
779 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
781 conf.set10('VALGRIND', get_option('valgrind'))
783 #####################################################################
785 threads = dependency('threads')
786 librt = cc.find_library('rt')
787 libm = cc.find_library('m')
788 libdl = cc.find_library('dl')
789 libcrypt = cc.find_library('crypt')
791 libcap = dependency('libcap', required : false)
792 if not libcap.found()
793 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
794 libcap = cc.find_library('cap')
797 libmount = dependency('mount',
798 version : fuzzer_build ? '>= 0' : '>= 2.30')
800 want_seccomp = get_option('seccomp')
801 if want_seccomp != 'false' and not fuzzer_build
802 libseccomp = dependency('libseccomp',
803 version : '>= 2.3.1',
804 required : want_seccomp == 'true')
805 have = libseccomp.found()
810 conf.set10('HAVE_SECCOMP', have)
812 want_selinux = get_option('selinux')
813 if want_selinux != 'false' and not fuzzer_build
814 libselinux = dependency('libselinux',
815 version : '>= 2.1.9',
816 required : want_selinux == 'true')
817 have = libselinux.found()
822 conf.set10('HAVE_SELINUX', have)
824 want_apparmor = get_option('apparmor')
825 if want_apparmor != 'false' and not fuzzer_build
826 libapparmor = dependency('libapparmor',
827 required : want_apparmor == 'true')
828 have = libapparmor.found()
833 conf.set10('HAVE_APPARMOR', have)
835 smack_run_label = get_option('smack-run-label')
836 if smack_run_label != ''
837 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
840 want_polkit = get_option('polkit')
841 install_polkit = false
842 install_polkit_pkla = false
843 if want_polkit != 'false' and not fuzzer_build
844 install_polkit = true
846 libpolkit = dependency('polkit-gobject-1',
848 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
849 message('Old polkit detected, will install pkla files')
850 install_polkit_pkla = true
853 conf.set10('ENABLE_POLKIT', install_polkit)
855 want_acl = get_option('acl')
856 if want_acl != 'false' and not fuzzer_build
857 libacl = cc.find_library('acl', required : want_acl == 'true')
858 have = libacl.found()
863 conf.set10('HAVE_ACL', have)
865 want_audit = get_option('audit')
866 if want_audit != 'false' and not fuzzer_build
867 libaudit = dependency('audit', required : want_audit == 'true')
868 have = libaudit.found()
873 conf.set10('HAVE_AUDIT', have)
875 want_blkid = get_option('blkid')
876 if want_blkid != 'false' and not fuzzer_build
877 libblkid = dependency('blkid', required : want_blkid == 'true')
878 have = libblkid.found()
883 conf.set10('HAVE_BLKID', have)
885 want_kmod = get_option('kmod')
886 if want_kmod != 'false' and not fuzzer_build
887 libkmod = dependency('libkmod',
889 required : want_kmod == 'true')
890 have = libkmod.found()
895 conf.set10('HAVE_KMOD', have)
897 want_pam = get_option('pam')
898 if want_pam != 'false' and not fuzzer_build
899 libpam = cc.find_library('pam', required : want_pam == 'true')
900 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
901 have = libpam.found() and libpam_misc.found()
907 conf.set10('HAVE_PAM', have)
909 want_microhttpd = get_option('microhttpd')
910 if want_microhttpd != 'false' and not fuzzer_build
911 libmicrohttpd = dependency('libmicrohttpd',
912 version : '>= 0.9.33',
913 required : want_microhttpd == 'true')
914 have = libmicrohttpd.found()
919 conf.set10('HAVE_MICROHTTPD', have)
921 want_libcryptsetup = get_option('libcryptsetup')
922 if want_libcryptsetup != 'false' and not fuzzer_build
923 libcryptsetup = dependency('libcryptsetup',
924 version : '>= 1.6.0',
925 required : want_libcryptsetup == 'true')
926 have = libcryptsetup.found()
931 conf.set10('HAVE_LIBCRYPTSETUP', have)
933 want_libcurl = get_option('libcurl')
934 if want_libcurl != 'false' and not fuzzer_build
935 libcurl = dependency('libcurl',
936 version : '>= 7.32.0',
937 required : want_libcurl == 'true')
938 have = libcurl.found()
943 conf.set10('HAVE_LIBCURL', have)
945 want_libidn = get_option('libidn')
946 want_libidn2 = get_option('libidn2')
947 if want_libidn == 'true' and want_libidn2 == 'true'
948 error('libidn and libidn2 cannot be requested simultaneously')
951 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
952 libidn = dependency('libidn',
953 required : want_libidn == 'true')
954 have = libidn.found()
959 conf.set10('HAVE_LIBIDN', have)
960 if not have and want_libidn2 != 'false' and not fuzzer_build
961 # libidn is used for both libidn and libidn2 objects
962 libidn = dependency('libidn2',
963 required : want_libidn2 == 'true')
964 have = libidn.found()
968 conf.set10('HAVE_LIBIDN2', have)
970 want_libiptc = get_option('libiptc')
971 if want_libiptc != 'false' and not fuzzer_build
972 libiptc = dependency('libiptc',
973 required : want_libiptc == 'true')
974 have = libiptc.found()
979 conf.set10('HAVE_LIBIPTC', have)
981 want_qrencode = get_option('qrencode')
982 if want_qrencode != 'false' and not fuzzer_build
983 libqrencode = dependency('libqrencode',
984 required : want_qrencode == 'true')
985 have = libqrencode.found()
990 conf.set10('HAVE_QRENCODE', have)
992 want_gcrypt = get_option('gcrypt')
993 if want_gcrypt != 'false' and not fuzzer_build
994 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
995 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
996 have = libgcrypt.found() and libgpg_error.found()
1001 # link to neither of the libs if one is not found
1005 conf.set10('HAVE_GCRYPT', have)
1007 want_gnutls = get_option('gnutls')
1008 if want_gnutls != 'false' and not fuzzer_build
1009 libgnutls = dependency('gnutls',
1010 version : '>= 3.1.4',
1011 required : want_gnutls == 'true')
1012 have = libgnutls.found()
1017 conf.set10('HAVE_GNUTLS', have)
1019 want_elfutils = get_option('elfutils')
1020 if want_elfutils != 'false' and not fuzzer_build
1021 libdw = dependency('libdw',
1022 required : want_elfutils == 'true')
1023 have = libdw.found()
1028 conf.set10('HAVE_ELFUTILS', have)
1030 want_zlib = get_option('zlib')
1031 if want_zlib != 'false' and not fuzzer_build
1032 libz = dependency('zlib',
1033 required : want_zlib == 'true')
1039 conf.set10('HAVE_ZLIB', have)
1041 want_bzip2 = get_option('bzip2')
1042 if want_bzip2 != 'false' and not fuzzer_build
1043 libbzip2 = cc.find_library('bz2',
1044 required : want_bzip2 == 'true')
1045 have = libbzip2.found()
1050 conf.set10('HAVE_BZIP2', have)
1052 want_xz = get_option('xz')
1053 if want_xz != 'false' and not fuzzer_build
1054 libxz = dependency('liblzma',
1055 required : want_xz == 'true')
1056 have = libxz.found()
1061 conf.set10('HAVE_XZ', have)
1063 want_lz4 = get_option('lz4')
1064 if want_lz4 != 'false' and not fuzzer_build
1065 liblz4 = dependency('liblz4',
1066 required : want_lz4 == 'true')
1067 have = liblz4.found()
1072 conf.set10('HAVE_LZ4', have)
1074 want_xkbcommon = get_option('xkbcommon')
1075 if want_xkbcommon != 'false' and not fuzzer_build
1076 libxkbcommon = dependency('xkbcommon',
1077 version : '>= 0.3.0',
1078 required : want_xkbcommon == 'true')
1079 have = libxkbcommon.found()
1084 conf.set10('HAVE_XKBCOMMON', have)
1086 want_pcre2 = get_option('pcre2')
1087 if want_pcre2 != 'false'
1088 libpcre2 = dependency('libpcre2-8',
1089 required : want_pcre2 == 'true')
1090 have = libpcre2.found()
1095 conf.set10('HAVE_PCRE2', have)
1097 want_glib = get_option('glib')
1098 if want_glib != 'false' and not fuzzer_build
1099 libglib = dependency('glib-2.0',
1100 version : '>= 2.22.0',
1101 required : want_glib == 'true')
1102 libgobject = dependency('gobject-2.0',
1103 version : '>= 2.22.0',
1104 required : want_glib == 'true')
1105 libgio = dependency('gio-2.0',
1106 required : want_glib == 'true')
1107 have = libglib.found() and libgobject.found() and libgio.found()
1114 conf.set10('HAVE_GLIB', have)
1116 want_dbus = get_option('dbus')
1117 if want_dbus != 'false' and not fuzzer_build
1118 libdbus = dependency('dbus-1',
1119 version : '>= 1.3.2',
1120 required : want_dbus == 'true')
1121 have = libdbus.found()
1126 conf.set10('HAVE_DBUS', have)
1128 default_dnssec = get_option('default-dnssec')
1130 default_dnssec = 'no'
1132 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1133 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1134 default_dnssec = 'no'
1136 conf.set('DEFAULT_DNSSEC_MODE',
1137 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1138 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1140 want_importd = get_option('importd')
1141 if want_importd != 'false'
1142 have = (conf.get('HAVE_LIBCURL') == 1 and
1143 conf.get('HAVE_ZLIB') == 1 and
1144 conf.get('HAVE_BZIP2') == 1 and
1145 conf.get('HAVE_XZ') == 1 and
1146 conf.get('HAVE_GCRYPT') == 1)
1147 if want_importd == 'true' and not have
1148 error('importd support was requested, but dependencies are not available')
1153 conf.set10('ENABLE_IMPORTD', have)
1155 want_remote = get_option('remote')
1156 if want_remote != 'false'
1157 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1158 conf.get('HAVE_LIBCURL') == 1]
1159 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1160 # it's possible to build one without the other. Complain only if
1161 # support was explictly requested. The auxiliary files like sysusers
1162 # config should be installed when any of the programs are built.
1163 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1164 error('remote support was requested, but dependencies are not available')
1166 have = have_deps[0] or have_deps[1]
1170 conf.set10('ENABLE_REMOTE', have)
1172 foreach term : ['utmp',
1204 have = get_option(term)
1205 name = 'ENABLE_' + term.underscorify().to_upper()
1206 conf.set10(name, have)
1209 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1211 want_tests = get_option('tests')
1212 install_tests = get_option('install-tests')
1213 slow_tests = get_option('slow-tests')
1217 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1219 #####################################################################
1221 if get_option('efi')
1222 efi_arch = host_machine.cpu_family()
1224 if efi_arch == 'x86'
1225 EFI_MACHINE_TYPE_NAME = 'ia32'
1226 gnu_efi_arch = 'ia32'
1227 elif efi_arch == 'x86_64'
1228 EFI_MACHINE_TYPE_NAME = 'x64'
1229 gnu_efi_arch = 'x86_64'
1230 elif efi_arch == 'arm'
1231 EFI_MACHINE_TYPE_NAME = 'arm'
1232 gnu_efi_arch = 'arm'
1233 elif efi_arch == 'aarch64'
1234 EFI_MACHINE_TYPE_NAME = 'aa64'
1235 gnu_efi_arch = 'aarch64'
1237 EFI_MACHINE_TYPE_NAME = ''
1242 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1244 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1248 conf.set10('ENABLE_EFI', have)
1250 #####################################################################
1252 config_h = configure_file(
1253 output : 'config.h',
1254 configuration : conf)
1256 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1258 includes = include_directories('src/basic',
1262 'src/journal-remote',
1266 'src/time-wait-sync',
1271 'src/libsystemd/sd-bus',
1272 'src/libsystemd/sd-device',
1273 'src/libsystemd/sd-hwdb',
1274 'src/libsystemd/sd-id128',
1275 'src/libsystemd/sd-netlink',
1276 'src/libsystemd/sd-network',
1277 'src/libsystemd-network',
1280 add_project_arguments('-include', 'config.h', language : 'c')
1284 subdir('src/systemd')
1286 subdir('src/libsystemd')
1287 subdir('src/libsystemd-network')
1288 subdir('src/journal')
1291 libjournal_core = static_library(
1293 libjournal_core_sources,
1295 include_directories : includes,
1298 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1299 libsystemd = shared_library(
1301 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1302 version : libsystemd_version,
1303 include_directories : includes,
1304 link_args : ['-shared',
1305 '-Wl,--version-script=' + libsystemd_sym_path],
1306 link_with : [libbasic,
1308 link_whole : [libsystemd_static,
1310 dependencies : [threads,
1314 link_depends : libsystemd_sym,
1316 install_dir : rootlibdir)
1318 static_libsystemd = get_option('static-libsystemd')
1319 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1321 install_libsystemd_static = static_library(
1324 journal_client_sources,
1326 basic_gcrypt_sources,
1327 include_directories : includes,
1328 build_by_default : static_libsystemd != 'false',
1329 install : static_libsystemd != 'false',
1330 install_dir : rootlibdir,
1331 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1332 dependencies : [threads,
1341 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1343 ############################################################
1345 # binaries that have --help and are intended for use by humans,
1346 # usually, but not always, installed in /bin.
1347 public_programs = []
1349 subdir('src/libudev')
1350 subdir('src/shared')
1353 subdir('src/network')
1355 subdir('src/analyze')
1356 subdir('src/journal-remote')
1357 subdir('src/coredump')
1358 subdir('src/hostname')
1359 subdir('src/import')
1360 subdir('src/kernel-install')
1361 subdir('src/locale')
1362 subdir('src/machine')
1363 subdir('src/portable')
1364 subdir('src/nspawn')
1365 subdir('src/resolve')
1366 subdir('src/timedate')
1367 subdir('src/timesync')
1368 subdir('src/vconsole')
1369 subdir('src/boot/efi')
1376 ############################################################
1378 # only static linking apart from libdl, to make sure that the
1379 # module is linked to all libraries that it uses.
1380 test_dlopen = executable(
1383 include_directories : includes,
1384 link_with : [libbasic],
1385 dependencies : [libdl])
1387 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1388 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1389 ['mymachines', 'ENABLE_MACHINED'],
1390 ['resolve', 'ENABLE_RESOLVE']]
1392 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1396 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1397 version_script_arg = join_paths(meson.current_source_dir(), sym)
1399 nss = shared_library(
1401 'src/nss-@0@/nss-@0@.c'.format(module),
1403 include_directories : includes,
1404 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1405 link_args : ['-Wl,-z,nodelete',
1407 '-Wl,--version-script=' + version_script_arg,
1409 link_with : [libsystemd_static,
1411 dependencies : [threads,
1415 install_dir : rootlibdir)
1417 # We cannot use shared_module because it does not support version suffix.
1418 # Unfortunately shared_library insists on creating the symlink…
1419 meson.add_install_script('sh', '-c',
1420 'rm $DESTDIR@0@/libnss_@1@.so'
1421 .format(rootlibdir, module))
1423 test('dlopen-nss_' + module,
1425 args : [nss.full_path()]) # path to dlopen must include a slash
1429 ############################################################
1431 executable('systemd',
1433 include_directories : includes,
1434 link_with : [libcore,
1436 dependencies : [threads,
1442 install_rpath : rootlibexecdir,
1444 install_dir : rootlibexecdir)
1446 meson.add_install_script(meson_make_symlink,
1447 join_paths(rootlibexecdir, 'systemd'),
1448 join_paths(rootsbindir, 'init'))
1450 exe = executable('systemd-analyze',
1451 systemd_analyze_sources,
1452 include_directories : includes,
1453 link_with : [libcore,
1455 dependencies : [threads,
1461 install_rpath : rootlibexecdir,
1463 public_programs += [exe]
1465 executable('systemd-journald',
1466 systemd_journald_sources,
1467 include_directories : includes,
1468 link_with : [libjournal_core,
1470 dependencies : [threads,
1474 install_rpath : rootlibexecdir,
1476 install_dir : rootlibexecdir)
1478 exe = executable('systemd-cat',
1479 systemd_cat_sources,
1480 include_directories : includes,
1481 link_with : [libjournal_core,
1483 dependencies : [threads],
1484 install_rpath : rootlibexecdir,
1486 public_programs += [exe]
1488 exe = executable('journalctl',
1490 include_directories : includes,
1491 link_with : [libshared],
1492 dependencies : [threads,
1497 install_rpath : rootlibexecdir,
1499 install_dir : rootbindir)
1500 public_programs += [exe]
1502 executable('systemd-getty-generator',
1503 'src/getty-generator/getty-generator.c',
1504 include_directories : includes,
1505 link_with : [libshared],
1506 install_rpath : rootlibexecdir,
1508 install_dir : systemgeneratordir)
1510 executable('systemd-debug-generator',
1511 'src/debug-generator/debug-generator.c',
1512 include_directories : includes,
1513 link_with : [libshared],
1514 install_rpath : rootlibexecdir,
1516 install_dir : systemgeneratordir)
1518 executable('systemd-fstab-generator',
1519 'src/fstab-generator/fstab-generator.c',
1520 'src/core/mount-setup.c',
1521 include_directories : includes,
1522 link_with : [libshared],
1523 install_rpath : rootlibexecdir,
1525 install_dir : systemgeneratordir)
1527 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1528 executable('30-systemd-environment-d-generator',
1529 'src/environment-d-generator/environment-d-generator.c',
1530 include_directories : includes,
1531 link_with : [libshared],
1532 install_rpath : rootlibexecdir,
1534 install_dir : userenvgeneratordir)
1536 meson.add_install_script(meson_make_symlink,
1537 join_paths(sysconfdir, 'environment'),
1538 join_paths(environmentdir, '99-environment.conf'))
1541 if conf.get('ENABLE_HIBERNATE') == 1
1542 executable('systemd-hibernate-resume-generator',
1543 'src/hibernate-resume/hibernate-resume-generator.c',
1544 include_directories : includes,
1545 link_with : [libshared],
1546 install_rpath : rootlibexecdir,
1548 install_dir : systemgeneratordir)
1550 executable('systemd-hibernate-resume',
1551 'src/hibernate-resume/hibernate-resume.c',
1552 include_directories : includes,
1553 link_with : [libshared],
1554 install_rpath : rootlibexecdir,
1556 install_dir : rootlibexecdir)
1559 if conf.get('HAVE_BLKID') == 1
1560 executable('systemd-gpt-auto-generator',
1561 'src/gpt-auto-generator/gpt-auto-generator.c',
1562 'src/basic/blkid-util.h',
1563 include_directories : includes,
1564 link_with : [libshared],
1565 dependencies : libblkid,
1566 install_rpath : rootlibexecdir,
1568 install_dir : systemgeneratordir)
1570 exe = executable('systemd-dissect',
1571 'src/dissect/dissect.c',
1572 include_directories : includes,
1573 link_with : [libshared],
1574 install_rpath : rootlibexecdir,
1576 install_dir : rootlibexecdir)
1577 public_programs += [exe]
1580 if conf.get('ENABLE_RESOLVE') == 1
1581 executable('systemd-resolved',
1582 systemd_resolved_sources,
1583 include_directories : includes,
1584 link_with : [libshared,
1586 libsystemd_resolve_core],
1587 dependencies : [threads,
1591 install_rpath : rootlibexecdir,
1593 install_dir : rootlibexecdir)
1595 exe = executable('resolvectl',
1597 include_directories : includes,
1598 link_with : [libshared,
1600 libsystemd_resolve_core],
1601 dependencies : [threads,
1605 install_rpath : rootlibexecdir,
1607 public_programs += [exe]
1609 meson.add_install_script(meson_make_symlink,
1610 join_paths(bindir, 'resolvectl'),
1611 join_paths(rootsbindir, 'resolvconf'))
1613 meson.add_install_script(meson_make_symlink,
1614 join_paths(bindir, 'resolvectl'),
1615 join_paths(bindir, 'systemd-resolve'))
1618 if conf.get('ENABLE_LOGIND') == 1
1619 executable('systemd-logind',
1620 systemd_logind_sources,
1621 include_directories : includes,
1622 link_with : [liblogind_core,
1624 dependencies : [threads,
1626 install_rpath : rootlibexecdir,
1628 install_dir : rootlibexecdir)
1630 exe = executable('loginctl',
1632 include_directories : includes,
1633 link_with : [libshared],
1634 dependencies : [threads,
1637 install_rpath : rootlibexecdir,
1639 install_dir : rootbindir)
1640 public_programs += [exe]
1642 exe = executable('systemd-inhibit',
1643 'src/login/inhibit.c',
1644 include_directories : includes,
1645 link_with : [libshared],
1646 install_rpath : rootlibexecdir,
1648 install_dir : rootbindir)
1649 public_programs += [exe]
1651 if conf.get('HAVE_PAM') == 1
1652 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1653 pam_systemd = shared_library(
1657 include_directories : includes,
1658 link_args : ['-shared',
1659 '-Wl,--version-script=' + version_script_arg],
1660 link_with : [libsystemd_static,
1662 dependencies : [threads,
1665 link_depends : pam_systemd_sym,
1667 install_dir : pamlibdir)
1669 test('dlopen-pam_systemd',
1671 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1675 executable('systemd-user-runtime-dir',
1676 user_runtime_dir_sources,
1677 include_directories : includes,
1678 link_with : [libshared, liblogind_core],
1679 install_rpath : rootlibexecdir,
1681 install_dir : rootlibexecdir)
1683 if conf.get('HAVE_PAM') == 1
1684 executable('systemd-user-sessions',
1685 'src/user-sessions/user-sessions.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 install_rpath : rootlibexecdir,
1690 install_dir : rootlibexecdir)
1693 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1694 exe = executable('bootctl',
1695 'src/boot/bootctl.c',
1696 include_directories : includes,
1697 link_with : [libshared],
1698 dependencies : [libblkid],
1699 install_rpath : rootlibexecdir,
1701 public_programs += [exe]
1704 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 dependencies : [threads],
1708 install_rpath : rootlibexecdir,
1710 public_programs += [exe]
1713 if get_option('link-systemctl-shared')
1714 systemctl_link_with = [libshared]
1716 systemctl_link_with = [libsystemd_static,
1722 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1723 include_directories : includes,
1724 link_with : systemctl_link_with,
1725 dependencies : [threads,
1730 install_rpath : rootlibexecdir,
1732 install_dir : rootbindir)
1733 public_programs += [exe]
1735 if conf.get('ENABLE_PORTABLED') == 1
1736 executable('systemd-portabled',
1737 systemd_portabled_sources,
1738 include_directories : includes,
1739 link_with : [libshared],
1740 dependencies : [threads],
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootlibexecdir)
1745 exe = executable('portablectl', 'src/portable/portablectl.c',
1746 include_directories : includes,
1747 link_with : [libshared],
1748 dependencies : [threads],
1749 install_rpath : rootlibexecdir,
1751 install_dir : rootlibexecdir)
1752 public_programs += [exe]
1755 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1756 meson.add_install_script(meson_make_symlink,
1757 join_paths(rootbindir, 'systemctl'),
1758 join_paths(rootsbindir, alias))
1761 if conf.get('ENABLE_BACKLIGHT') == 1
1762 executable('systemd-backlight',
1763 'src/backlight/backlight.c',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 install_rpath : rootlibexecdir,
1768 install_dir : rootlibexecdir)
1771 if conf.get('ENABLE_RFKILL') == 1
1772 executable('systemd-rfkill',
1773 'src/rfkill/rfkill.c',
1774 include_directories : includes,
1775 link_with : [libshared],
1776 install_rpath : rootlibexecdir,
1778 install_dir : rootlibexecdir)
1781 executable('systemd-system-update-generator',
1782 'src/system-update-generator/system-update-generator.c',
1783 include_directories : includes,
1784 link_with : [libshared],
1785 install_rpath : rootlibexecdir,
1787 install_dir : systemgeneratordir)
1789 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1790 executable('systemd-cryptsetup',
1791 'src/cryptsetup/cryptsetup.c',
1792 include_directories : includes,
1793 link_with : [libshared],
1794 dependencies : [libcryptsetup],
1795 install_rpath : rootlibexecdir,
1797 install_dir : rootlibexecdir)
1799 executable('systemd-cryptsetup-generator',
1800 'src/cryptsetup/cryptsetup-generator.c',
1801 include_directories : includes,
1802 link_with : [libshared],
1803 dependencies : [libcryptsetup],
1804 install_rpath : rootlibexecdir,
1806 install_dir : systemgeneratordir)
1808 executable('systemd-veritysetup',
1809 'src/veritysetup/veritysetup.c',
1810 include_directories : includes,
1811 link_with : [libshared],
1812 dependencies : [libcryptsetup],
1813 install_rpath : rootlibexecdir,
1815 install_dir : rootlibexecdir)
1817 executable('systemd-veritysetup-generator',
1818 'src/veritysetup/veritysetup-generator.c',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 dependencies : [libcryptsetup],
1822 install_rpath : rootlibexecdir,
1824 install_dir : systemgeneratordir)
1827 if conf.get('HAVE_SYSV_COMPAT') == 1
1828 executable('systemd-sysv-generator',
1829 'src/sysv-generator/sysv-generator.c',
1830 include_directories : includes,
1831 link_with : [libshared],
1832 install_rpath : rootlibexecdir,
1834 install_dir : systemgeneratordir)
1836 executable('systemd-rc-local-generator',
1837 'src/rc-local-generator/rc-local-generator.c',
1838 include_directories : includes,
1839 link_with : [libshared],
1840 install_rpath : rootlibexecdir,
1842 install_dir : systemgeneratordir)
1845 if conf.get('ENABLE_HOSTNAMED') == 1
1846 executable('systemd-hostnamed',
1847 'src/hostname/hostnamed.c',
1848 include_directories : includes,
1849 link_with : [libshared],
1850 install_rpath : rootlibexecdir,
1852 install_dir : rootlibexecdir)
1854 exe = executable('hostnamectl',
1855 'src/hostname/hostnamectl.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1860 public_programs += [exe]
1863 if conf.get('ENABLE_LOCALED') == 1
1864 if conf.get('HAVE_XKBCOMMON') == 1
1865 # logind will load libxkbcommon.so dynamically on its own
1871 executable('systemd-localed',
1872 systemd_localed_sources,
1873 include_directories : includes,
1874 link_with : [libshared],
1875 dependencies : deps,
1876 install_rpath : rootlibexecdir,
1878 install_dir : rootlibexecdir)
1880 exe = executable('localectl',
1882 include_directories : includes,
1883 link_with : [libshared],
1884 install_rpath : rootlibexecdir,
1886 public_programs += [exe]
1889 if conf.get('ENABLE_TIMEDATED') == 1
1890 executable('systemd-timedated',
1891 'src/timedate/timedated.c',
1892 include_directories : includes,
1893 link_with : [libshared],
1894 install_rpath : rootlibexecdir,
1896 install_dir : rootlibexecdir)
1899 if conf.get('ENABLE_TIMEDATECTL') == 1
1900 exe = executable('timedatectl',
1901 'src/timedate/timedatectl.c',
1902 include_directories : includes,
1903 install_rpath : rootlibexecdir,
1904 link_with : [libshared],
1905 dependencies : [libm],
1907 public_programs += [exe]
1910 if conf.get('ENABLE_TIMESYNCD') == 1
1911 executable('systemd-timesyncd',
1912 systemd_timesyncd_sources,
1913 include_directories : includes,
1914 link_with : [libshared],
1915 dependencies : [threads,
1917 install_rpath : rootlibexecdir,
1919 install_dir : rootlibexecdir)
1921 executable('systemd-time-wait-sync',
1922 'src/time-wait-sync/time-wait-sync.c',
1923 include_directories : includes,
1924 link_with : [libshared],
1925 install_rpath : rootlibexecdir,
1927 install_dir : rootlibexecdir)
1930 if conf.get('ENABLE_MACHINED') == 1
1931 executable('systemd-machined',
1932 systemd_machined_sources,
1933 include_directories : includes,
1934 link_with : [libmachine_core,
1936 install_rpath : rootlibexecdir,
1938 install_dir : rootlibexecdir)
1940 exe = executable('machinectl',
1941 'src/machine/machinectl.c',
1942 include_directories : includes,
1943 link_with : [libshared],
1944 dependencies : [threads,
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootbindir)
1950 public_programs += [exe]
1953 if conf.get('ENABLE_IMPORTD') == 1
1954 executable('systemd-importd',
1955 systemd_importd_sources,
1956 include_directories : includes,
1957 link_with : [libshared],
1958 dependencies : [threads],
1959 install_rpath : rootlibexecdir,
1961 install_dir : rootlibexecdir)
1963 systemd_pull = executable('systemd-pull',
1964 systemd_pull_sources,
1965 include_directories : includes,
1966 link_with : [libshared],
1967 dependencies : [libcurl,
1972 install_rpath : rootlibexecdir,
1974 install_dir : rootlibexecdir)
1976 systemd_import = executable('systemd-import',
1977 systemd_import_sources,
1978 include_directories : includes,
1979 link_with : [libshared],
1980 dependencies : [libcurl,
1984 install_rpath : rootlibexecdir,
1986 install_dir : rootlibexecdir)
1988 systemd_export = executable('systemd-export',
1989 systemd_export_sources,
1990 include_directories : includes,
1991 link_with : [libshared],
1992 dependencies : [libcurl,
1996 install_rpath : rootlibexecdir,
1998 install_dir : rootlibexecdir)
1999 public_programs += [systemd_pull, systemd_import, systemd_export]
2002 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2003 exe = executable('systemd-journal-upload',
2004 systemd_journal_upload_sources,
2005 include_directories : includes,
2006 link_with : [libshared],
2007 dependencies : [threads,
2012 install_rpath : rootlibexecdir,
2014 install_dir : rootlibexecdir)
2015 public_programs += [exe]
2018 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2019 s_j_remote = executable('systemd-journal-remote',
2020 systemd_journal_remote_sources,
2021 include_directories : includes,
2022 link_with : [libshared,
2023 libsystemd_journal_remote],
2024 dependencies : [threads,
2029 install_rpath : rootlibexecdir,
2031 install_dir : rootlibexecdir)
2033 s_j_gatewayd = executable('systemd-journal-gatewayd',
2034 systemd_journal_gatewayd_sources,
2035 include_directories : includes,
2036 link_with : [libshared],
2037 dependencies : [threads,
2042 install_rpath : rootlibexecdir,
2044 install_dir : rootlibexecdir)
2045 public_programs += [s_j_remote, s_j_gatewayd]
2048 if conf.get('ENABLE_COREDUMP') == 1
2049 executable('systemd-coredump',
2050 systemd_coredump_sources,
2051 include_directories : includes,
2052 link_with : [libshared],
2053 dependencies : [threads,
2058 install_rpath : rootlibexecdir,
2060 install_dir : rootlibexecdir)
2062 exe = executable('coredumpctl',
2063 coredumpctl_sources,
2064 include_directories : includes,
2065 link_with : [libshared],
2066 dependencies : [threads,
2069 install_rpath : rootlibexecdir,
2071 public_programs += [exe]
2074 if conf.get('ENABLE_BINFMT') == 1
2075 exe = executable('systemd-binfmt',
2076 'src/binfmt/binfmt.c',
2077 include_directories : includes,
2078 link_with : [libshared],
2079 install_rpath : rootlibexecdir,
2081 install_dir : rootlibexecdir)
2082 public_programs += [exe]
2084 meson.add_install_script('sh', '-c',
2085 mkdir_p.format(binfmtdir))
2086 meson.add_install_script('sh', '-c',
2087 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2090 if conf.get('ENABLE_VCONSOLE') == 1
2091 executable('systemd-vconsole-setup',
2092 'src/vconsole/vconsole-setup.c',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 install_rpath : rootlibexecdir,
2097 install_dir : rootlibexecdir)
2100 if conf.get('ENABLE_RANDOMSEED') == 1
2101 executable('systemd-random-seed',
2102 'src/random-seed/random-seed.c',
2103 include_directories : includes,
2104 link_with : [libshared],
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootlibexecdir)
2110 if conf.get('ENABLE_FIRSTBOOT') == 1
2111 executable('systemd-firstboot',
2112 'src/firstboot/firstboot.c',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 dependencies : [libcrypt],
2116 install_rpath : rootlibexecdir,
2118 install_dir : rootbindir)
2121 executable('systemd-remount-fs',
2122 'src/remount-fs/remount-fs.c',
2123 'src/core/mount-setup.c',
2124 'src/core/mount-setup.h',
2125 include_directories : includes,
2126 link_with : [libshared],
2127 install_rpath : rootlibexecdir,
2129 install_dir : rootlibexecdir)
2131 executable('systemd-machine-id-setup',
2132 'src/machine-id-setup/machine-id-setup-main.c',
2133 'src/core/machine-id-setup.c',
2134 'src/core/machine-id-setup.h',
2135 include_directories : includes,
2136 link_with : [libshared],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootbindir)
2141 executable('systemd-fsck',
2143 include_directories : includes,
2144 link_with : [libshared],
2145 install_rpath : rootlibexecdir,
2147 install_dir : rootlibexecdir)
2149 executable('systemd-growfs',
2150 'src/partition/growfs.c',
2151 include_directories : includes,
2152 link_with : [libshared],
2153 dependencies : [libcryptsetup],
2154 install_rpath : rootlibexecdir,
2156 install_dir : rootlibexecdir)
2158 executable('systemd-makefs',
2159 'src/partition/makefs.c',
2160 include_directories : includes,
2161 link_with : [libshared],
2162 install_rpath : rootlibexecdir,
2164 install_dir : rootlibexecdir)
2166 executable('systemd-sleep',
2167 'src/sleep/sleep.c',
2168 include_directories : includes,
2169 link_with : [libshared],
2170 install_rpath : rootlibexecdir,
2172 install_dir : rootlibexecdir)
2174 exe = executable('systemd-sysctl',
2175 'src/sysctl/sysctl.c',
2176 include_directories : includes,
2177 link_with : [libshared],
2178 install_rpath : rootlibexecdir,
2180 install_dir : rootlibexecdir)
2181 public_programs += [exe]
2183 executable('systemd-ac-power',
2184 'src/ac-power/ac-power.c',
2185 include_directories : includes,
2186 link_with : [libshared],
2187 install_rpath : rootlibexecdir,
2189 install_dir : rootlibexecdir)
2191 exe = executable('systemd-detect-virt',
2192 'src/detect-virt/detect-virt.c',
2193 include_directories : includes,
2194 link_with : [libshared],
2195 install_rpath : rootlibexecdir,
2197 public_programs += [exe]
2199 exe = executable('systemd-delta',
2200 'src/delta/delta.c',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 install_rpath : rootlibexecdir,
2205 public_programs += [exe]
2207 exe = executable('systemd-escape',
2208 'src/escape/escape.c',
2209 include_directories : includes,
2210 link_with : [libshared],
2211 install_rpath : rootlibexecdir,
2213 install_dir : rootbindir)
2214 public_programs += [exe]
2216 exe = executable('systemd-notify',
2217 'src/notify/notify.c',
2218 include_directories : includes,
2219 link_with : [libshared],
2220 install_rpath : rootlibexecdir,
2222 install_dir : rootbindir)
2223 public_programs += [exe]
2225 executable('systemd-volatile-root',
2226 'src/volatile-root/volatile-root.c',
2227 include_directories : includes,
2228 link_with : [libshared],
2229 install_rpath : rootlibexecdir,
2231 install_dir : rootlibexecdir)
2233 executable('systemd-cgroups-agent',
2234 'src/cgroups-agent/cgroups-agent.c',
2235 include_directories : includes,
2236 link_with : [libshared],
2237 install_rpath : rootlibexecdir,
2239 install_dir : rootlibexecdir)
2241 exe = executable('systemd-path',
2243 include_directories : includes,
2244 link_with : [libshared],
2245 install_rpath : rootlibexecdir,
2247 public_programs += [exe]
2249 exe = executable('systemd-ask-password',
2250 'src/ask-password/ask-password.c',
2251 include_directories : includes,
2252 link_with : [libshared],
2253 install_rpath : rootlibexecdir,
2255 install_dir : rootbindir)
2256 public_programs += [exe]
2258 executable('systemd-reply-password',
2259 'src/reply-password/reply-password.c',
2260 include_directories : includes,
2261 link_with : [libshared],
2262 install_rpath : rootlibexecdir,
2264 install_dir : rootlibexecdir)
2266 exe = executable('systemd-tty-ask-password-agent',
2267 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2268 include_directories : includes,
2269 link_with : [libshared],
2270 install_rpath : rootlibexecdir,
2272 install_dir : rootbindir)
2273 public_programs += [exe]
2275 exe = executable('systemd-cgls',
2277 include_directories : includes,
2278 link_with : [libshared],
2279 install_rpath : rootlibexecdir,
2281 public_programs += [exe]
2283 exe = executable('systemd-cgtop',
2284 'src/cgtop/cgtop.c',
2285 include_directories : includes,
2286 link_with : [libshared],
2287 install_rpath : rootlibexecdir,
2289 public_programs += [exe]
2291 executable('systemd-initctl',
2292 'src/initctl/initctl.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2297 install_dir : rootlibexecdir)
2299 exe = executable('systemd-mount',
2300 'src/mount/mount-tool.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2305 public_programs += [exe]
2307 meson.add_install_script(meson_make_symlink,
2308 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2310 exe = executable('systemd-run',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2316 public_programs += [exe]
2318 exe = executable('systemd-stdio-bridge',
2319 'src/stdio-bridge/stdio-bridge.c',
2320 include_directories : includes,
2321 link_with : [libshared],
2322 install_rpath : rootlibexecdir,
2324 public_programs += [exe]
2326 exe = executable('busctl',
2327 'src/busctl/busctl.c',
2328 'src/busctl/busctl-introspect.c',
2329 'src/busctl/busctl-introspect.h',
2330 include_directories : includes,
2331 link_with : [libshared],
2332 install_rpath : rootlibexecdir,
2334 public_programs += [exe]
2336 if conf.get('ENABLE_SYSUSERS') == 1
2337 exe = executable('systemd-sysusers',
2338 'src/sysusers/sysusers.c',
2339 include_directories : includes,
2340 link_with : [libshared],
2341 install_rpath : rootlibexecdir,
2343 install_dir : rootbindir)
2344 public_programs += [exe]
2347 if conf.get('ENABLE_TMPFILES') == 1
2348 exe = executable('systemd-tmpfiles',
2349 'src/tmpfiles/tmpfiles.c',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 dependencies : [libacl],
2353 install_rpath : rootlibexecdir,
2355 install_dir : rootbindir)
2356 public_programs += [exe]
2358 test('test-systemd-tmpfiles',
2359 test_systemd_tmpfiles_py,
2360 args : exe.full_path())
2361 # https://github.com/mesonbuild/meson/issues/2681
2364 if conf.get('ENABLE_HWDB') == 1
2365 exe = executable('systemd-hwdb',
2367 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2368 include_directories : includes,
2369 link_with : [libudev_static],
2370 install_rpath : udev_rpath,
2372 install_dir : rootbindir)
2373 public_programs += [exe]
2376 if conf.get('ENABLE_QUOTACHECK') == 1
2377 executable('systemd-quotacheck',
2378 'src/quotacheck/quotacheck.c',
2379 include_directories : includes,
2380 link_with : [libshared],
2381 install_rpath : rootlibexecdir,
2383 install_dir : rootlibexecdir)
2386 exe = executable('systemd-socket-proxyd',
2387 'src/socket-proxy/socket-proxyd.c',
2388 include_directories : includes,
2389 link_with : [libshared],
2390 dependencies : [threads],
2391 install_rpath : rootlibexecdir,
2393 install_dir : rootlibexecdir)
2394 public_programs += [exe]
2396 exe = executable('systemd-udevd',
2397 systemd_udevd_sources,
2398 include_directories : includes,
2399 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2400 link_with : [libudev_core,
2403 dependencies : [threads,
2408 install_rpath : udev_rpath,
2410 install_dir : rootlibexecdir)
2411 public_programs += [exe]
2413 exe = executable('udevadm',
2415 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2416 include_directories : includes,
2417 link_with : [libudev_core,
2420 dependencies : [threads,
2425 install_rpath : udev_rpath,
2427 install_dir : rootbindir)
2428 public_programs += [exe]
2430 executable('systemd-shutdown',
2431 systemd_shutdown_sources,
2432 include_directories : includes,
2433 link_with : [libshared],
2434 dependencies : [libmount],
2435 install_rpath : rootlibexecdir,
2437 install_dir : rootlibexecdir)
2439 executable('systemd-update-done',
2440 'src/update-done/update-done.c',
2441 include_directories : includes,
2442 link_with : [libshared],
2443 install_rpath : rootlibexecdir,
2445 install_dir : rootlibexecdir)
2447 executable('systemd-update-utmp',
2448 'src/update-utmp/update-utmp.c',
2449 include_directories : includes,
2450 link_with : [libshared],
2451 dependencies : [libaudit],
2452 install_rpath : rootlibexecdir,
2454 install_dir : rootlibexecdir)
2456 if conf.get('HAVE_KMOD') == 1
2457 executable('systemd-modules-load',
2458 'src/modules-load/modules-load.c',
2459 include_directories : includes,
2460 link_with : [libshared],
2461 dependencies : [libkmod],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2466 meson.add_install_script('sh', '-c',
2467 mkdir_p.format(modulesloaddir))
2468 meson.add_install_script('sh', '-c',
2469 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2472 exe = executable('systemd-nspawn',
2473 systemd_nspawn_sources,
2474 'src/core/mount-setup.c', # FIXME: use a variable?
2475 'src/core/mount-setup.h',
2476 'src/core/loopback-setup.c',
2477 'src/core/loopback-setup.h',
2478 include_directories : includes,
2479 link_with : [libnspawn_core,
2481 dependencies : [libblkid],
2482 install_rpath : rootlibexecdir,
2484 public_programs += [exe]
2486 if conf.get('ENABLE_NETWORKD') == 1
2487 executable('systemd-networkd',
2488 systemd_networkd_sources,
2489 include_directories : includes,
2490 link_with : [libnetworkd_core,
2494 dependencies : [threads],
2495 install_rpath : rootlibexecdir,
2497 install_dir : rootlibexecdir)
2499 executable('systemd-networkd-wait-online',
2500 systemd_networkd_wait_online_sources,
2501 include_directories : includes,
2502 link_with : [libnetworkd_core,
2504 install_rpath : rootlibexecdir,
2506 install_dir : rootlibexecdir)
2508 exe = executable('networkctl',
2510 include_directories : includes,
2511 link_with : [libsystemd_network,
2513 install_rpath : rootlibexecdir,
2515 install_dir : rootbindir)
2516 public_programs += [exe]
2519 executable('systemd-sulogin-shell',
2520 ['src/sulogin-shell/sulogin-shell.c'],
2521 include_directories : includes,
2522 link_with : [libshared],
2523 install_rpath : rootlibexecdir,
2525 install_dir : rootlibexecdir)
2527 ############################################################
2529 foreach tuple : tests
2531 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2532 dependencies = tuple[2]
2533 condition = tuple.length() >= 4 ? tuple[3] : ''
2534 type = tuple.length() >= 5 ? tuple[4] : ''
2535 defs = tuple.length() >= 6 ? tuple[5] : []
2536 incs = tuple.length() >= 7 ? tuple[6] : includes
2539 name = sources[0].split('/')[-1].split('.')[0]
2540 if type.startswith('timeout=')
2541 timeout = type.split('=')[1].to_int()
2544 if want_tests == 'false'
2545 message('Not compiling @0@ because tests is set to false'.format(name))
2546 elif condition == '' or conf.get(condition) == 1
2550 include_directories : incs,
2551 link_with : link_with,
2552 dependencies : dependencies,
2554 install_rpath : rootlibexecdir,
2555 install : install_tests,
2556 install_dir : join_paths(testsdir, type))
2559 message('@0@ is a manual test'.format(name))
2560 elif type == 'unsafe' and want_tests != 'unsafe'
2561 message('@0@ is an unsafe test'.format(name))
2568 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2573 'test-libsystemd-sym',
2574 test_libsystemd_sym_c,
2575 include_directories : includes,
2576 link_with : [libsystemd],
2577 install : install_tests,
2578 install_dir : testsdir)
2579 test('test-libsystemd-sym', exe)
2582 'test-libsystemd-static-sym',
2583 test_libsystemd_sym_c,
2584 include_directories : includes,
2585 link_with : [install_libsystemd_static],
2586 dependencies : [threads], # threads is already included in dependencies on the library,
2587 # but does not seem to get propagated. Add here as a work-around.
2588 build_by_default : static_libsystemd_pic,
2589 install : install_tests and static_libsystemd_pic,
2590 install_dir : testsdir)
2591 if static_libsystemd_pic
2592 test('test-libsystemd-static-sym', exe)
2598 include_directories : includes,
2599 c_args : ['-Wno-deprecated-declarations'],
2600 link_with : [libudev],
2601 install : install_tests,
2602 install_dir : testsdir)
2603 test('test-libudev-sym', exe)
2606 'test-libudev-static-sym',
2608 include_directories : includes,
2609 c_args : ['-Wno-deprecated-declarations'],
2610 link_with : [install_libudev_static],
2611 build_by_default : static_libudev_pic,
2612 install : install_tests and static_libudev_pic,
2613 install_dir : testsdir)
2614 if static_libudev_pic
2615 test('test-libudev-static-sym', exe)
2618 ############################################################
2622 foreach tuple : fuzzers
2624 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2625 dependencies = tuple[2]
2626 defs = tuple.length() >= 4 ? tuple[3] : []
2627 incs = tuple.length() >= 5 ? tuple[4] : includes
2630 dependencies += fuzzing_engine
2632 sources += 'src/fuzz/fuzz-main.c'
2635 name = sources[0].split('/')[-1].split('.')[0]
2637 fuzzer_exes += executable(
2640 include_directories : [incs, include_directories('src/fuzz')],
2641 link_with : link_with,
2642 dependencies : dependencies,
2647 run_target('fuzzers',
2648 depends : fuzzer_exes,
2651 ############################################################
2653 make_directive_index_py = find_program('tools/make-directive-index.py')
2654 make_man_index_py = find_program('tools/make-man-index.py')
2655 xml_helper_py = find_program('tools/xml_helper.py')
2656 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2660 subdir('sysusers.d')
2661 subdir('tmpfiles.d')
2666 subdir('shell-completion/bash')
2667 subdir('shell-completion/zsh')
2668 subdir('doc/sysvinit')
2669 subdir('doc/var-log')
2671 # FIXME: figure out if the warning is true:
2672 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2673 install_subdir('factory/etc',
2674 install_dir : factorydir)
2677 install_data('xorg/50-systemd-user.sh',
2678 install_dir : xinitrcdir)
2679 install_data('modprobe.d/systemd.conf',
2680 install_dir : modprobedir)
2681 install_data('LICENSE.GPL2',
2686 'doc/DISTRO_PORTING',
2687 'doc/ENVIRONMENT.md',
2689 'doc/TRANSIENT-SETTINGS.md',
2692 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2693 install_dir : docdir)
2695 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2696 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2698 ############################################################
2700 meson_check_help = find_program('tools/meson-check-help.sh')
2702 foreach exec : public_programs
2703 name = exec.full_path().split('/')[-1]
2704 test('check-help-' + name,
2706 args : [exec.full_path()])
2709 ############################################################
2711 # Enable tests for all supported sanitizers
2712 foreach tuple : sanitizers
2713 sanitizer = tuple[0]
2716 have = run_command(check_compilation_sh,
2717 cc.cmd_array(), '-x', 'c',
2718 '-fsanitize=@0@'.format(sanitizer),
2719 '-include', link_test_c).returncode() == 0
2720 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2724 foreach p : fuzz_regression_tests
2725 b = p.split('/')[-2]
2726 c = p.split('/')[-1]
2728 name = '@0@:@1@'.format(b, sanitizer)
2731 if want_tests == 'false'
2732 message('Not compiling @0@ because tests is set to false'.format(name))
2734 exe = custom_target(
2738 command : [env, 'ln', '-fs',
2739 join_paths(build.full_path(), b),
2741 build_by_default : true)
2743 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2748 if want_tests != 'false' and slow_tests
2749 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2751 args : [exe.full_path(),
2752 join_paths(meson.source_root(),
2753 'test/fuzz-regressions',
2761 ############################################################
2764 all_files = run_command(
2766 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2769 all_files = files(all_files.stdout().split())
2774 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2777 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2781 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2784 command : [meson_git_contrib_sh])
2788 git_head = run_command(
2790 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2791 'rev-parse', 'HEAD']).stdout().strip()
2792 git_head_short = run_command(
2794 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2795 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2799 command : ['git', 'archive',
2800 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2802 '--prefix', 'systemd-@0@/'.format(git_head),
2806 ############################################################
2808 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2811 depends : [man, libsystemd, libudev],
2812 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2814 ############################################################
2817 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2819 'split /usr: @0@'.format(split_usr),
2820 'split bin-sbin: @0@'.format(split_bin),
2821 'prefix directory: @0@'.format(prefixdir),
2822 'rootprefix directory: @0@'.format(rootprefixdir),
2823 'sysconf directory: @0@'.format(sysconfdir),
2824 'include directory: @0@'.format(includedir),
2825 'lib directory: @0@'.format(libdir),
2826 'rootlib directory: @0@'.format(rootlibdir),
2827 'SysV init scripts: @0@'.format(sysvinit_path),
2828 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2829 'PAM modules directory: @0@'.format(pamlibdir),
2830 'PAM configuration directory: @0@'.format(pamconfdir),
2831 'RPM macros directory: @0@'.format(rpmmacrosdir),
2832 'modprobe.d directory: @0@'.format(modprobedir),
2833 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2834 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2835 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2836 'bash completions directory: @0@'.format(bashcompletiondir),
2837 'zsh completions directory: @0@'.format(zshcompletiondir),
2838 'extra start script: @0@'.format(get_option('rc-local')),
2839 'extra stop script: @0@'.format(get_option('halt-local')),
2840 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2841 get_option('debug-tty')),
2842 'TTY GID: @0@'.format(tty_gid),
2843 'users GID: @0@'.format(users_gid),
2844 'maximum system UID: @0@'.format(system_uid_max),
2845 'maximum system GID: @0@'.format(system_gid_max),
2846 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2847 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2848 'minimum container UID base: @0@'.format(container_uid_base_min),
2849 'maximum container UID base: @0@'.format(container_uid_base_max),
2850 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2851 'render group access mode: @0@'.format(get_option('group-render-mode')),
2852 'certificate root directory: @0@'.format(get_option('certificate-root')),
2853 'support URL: @0@'.format(support_url),
2854 'nobody user name: @0@'.format(nobody_user),
2855 'nobody group name: @0@'.format(nobody_group),
2856 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2857 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2859 'default DNSSEC mode: @0@'.format(default_dnssec),
2860 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2861 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2863 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2864 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2866 'default DNS servers: @0@'.format(alt_dns_servers),
2867 'default NTP servers: @0@'.format(alt_ntp_servers)]
2869 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2870 '@@0@'.format(time_epoch)).stdout().strip()
2872 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2875 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2876 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2877 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2879 if conf.get('ENABLE_EFI') == 1
2881 'efi arch: @0@'.format(efi_arch)]
2885 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2886 'EFI CC @0@'.format(efi_cc),
2887 'EFI lib directory: @0@'.format(efi_libdir),
2888 'EFI lds directory: @0@'.format(efi_ldsdir),
2889 'EFI include directory: @0@'.format(efi_incdir)]
2943 ['legacy pkla', install_polkit_pkla],
2945 ['gnu-efi', have_gnu_efi],
2952 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2955 ['man pages', want_man],
2956 ['html pages', want_html],
2957 ['man page indices', want_man and have_lxml],
2962 ['adm group', get_option('adm-group')],
2963 ['wheel group', get_option('wheel-group')],
2966 ['debug mmap cache'],
2967 ['valgrind', conf.get('VALGRIND') == 1],
2970 if tuple.length() >= 2
2973 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2974 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2975 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2980 missing += [tuple[0]]
2986 'enabled features: @0@'.format(', '.join(found)),
2988 'disabled features: @0@'.format(', '.join(missing)),
2990 message('\n '.join(status))
2992 if rootprefixdir != rootprefix_default
2994 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2995 'systemd used fixed names for unit file directories and other paths, so anything\n' +
2996 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))