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',
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 warning. 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',
1202 have = get_option(term)
1203 name = 'ENABLE_' + term.underscorify().to_upper()
1204 conf.set10(name, have)
1207 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1209 want_tests = get_option('tests')
1210 install_tests = get_option('install-tests')
1211 slow_tests = get_option('slow-tests')
1215 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1217 #####################################################################
1219 if get_option('efi')
1220 efi_arch = host_machine.cpu_family()
1222 if efi_arch == 'x86'
1223 EFI_MACHINE_TYPE_NAME = 'ia32'
1224 gnu_efi_arch = 'ia32'
1225 elif efi_arch == 'x86_64'
1226 EFI_MACHINE_TYPE_NAME = 'x64'
1227 gnu_efi_arch = 'x86_64'
1228 elif efi_arch == 'arm'
1229 EFI_MACHINE_TYPE_NAME = 'arm'
1230 gnu_efi_arch = 'arm'
1231 elif efi_arch == 'aarch64'
1232 EFI_MACHINE_TYPE_NAME = 'aa64'
1233 gnu_efi_arch = 'aarch64'
1235 EFI_MACHINE_TYPE_NAME = ''
1240 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1242 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1246 conf.set10('ENABLE_EFI', have)
1248 #####################################################################
1250 config_h = configure_file(
1251 output : 'config.h',
1252 configuration : conf)
1254 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1256 includes = include_directories('src/basic',
1260 'src/journal-remote',
1264 'src/time-wait-sync',
1269 'src/libsystemd/sd-bus',
1270 'src/libsystemd/sd-device',
1271 'src/libsystemd/sd-hwdb',
1272 'src/libsystemd/sd-id128',
1273 'src/libsystemd/sd-netlink',
1274 'src/libsystemd/sd-network',
1275 'src/libsystemd-network',
1278 add_project_arguments('-include', 'config.h', language : 'c')
1282 subdir('src/systemd')
1284 subdir('src/libsystemd')
1285 subdir('src/libsystemd-network')
1286 subdir('src/journal')
1289 libjournal_core = static_library(
1291 libjournal_core_sources,
1293 include_directories : includes,
1296 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1297 libsystemd = shared_library(
1299 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1300 version : libsystemd_version,
1301 include_directories : includes,
1302 link_args : ['-shared',
1303 '-Wl,--version-script=' + libsystemd_sym_path],
1304 link_with : [libbasic,
1306 link_whole : [libsystemd_static,
1308 dependencies : [threads,
1312 link_depends : libsystemd_sym,
1314 install_dir : rootlibdir)
1316 static_libsystemd = get_option('static-libsystemd')
1317 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1319 install_libsystemd_static = static_library(
1322 journal_client_sources,
1324 basic_gcrypt_sources,
1325 include_directories : includes,
1326 build_by_default : static_libsystemd != 'false',
1327 install : static_libsystemd != 'false',
1328 install_dir : rootlibdir,
1329 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1330 dependencies : [threads,
1339 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1341 ############################################################
1343 # binaries that have --help and are intended for use by humans,
1344 # usually, but not always, installed in /bin.
1345 public_programs = []
1347 subdir('src/libudev')
1348 subdir('src/shared')
1351 subdir('src/network')
1353 subdir('src/analyze')
1354 subdir('src/journal-remote')
1355 subdir('src/coredump')
1356 subdir('src/hostname')
1357 subdir('src/import')
1358 subdir('src/kernel-install')
1359 subdir('src/locale')
1360 subdir('src/machine')
1361 subdir('src/portable')
1362 subdir('src/nspawn')
1363 subdir('src/resolve')
1364 subdir('src/timedate')
1365 subdir('src/timesync')
1366 subdir('src/vconsole')
1367 subdir('src/boot/efi')
1374 ############################################################
1376 # only static linking apart from libdl, to make sure that the
1377 # module is linked to all libraries that it uses.
1378 test_dlopen = executable(
1381 include_directories : includes,
1382 link_with : [libbasic],
1383 dependencies : [libdl])
1385 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1386 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1387 ['mymachines', 'ENABLE_MACHINED'],
1388 ['resolve', 'ENABLE_RESOLVE']]
1390 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1394 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1395 version_script_arg = join_paths(meson.current_source_dir(), sym)
1397 nss = shared_library(
1399 'src/nss-@0@/nss-@0@.c'.format(module),
1401 include_directories : includes,
1402 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1403 link_args : ['-Wl,-z,nodelete',
1405 '-Wl,--version-script=' + version_script_arg,
1407 link_with : [libsystemd_static,
1409 dependencies : [threads,
1413 install_dir : rootlibdir)
1415 # We cannot use shared_module because it does not support version suffix.
1416 # Unfortunately shared_library insists on creating the symlink…
1417 meson.add_install_script('sh', '-c',
1418 'rm $DESTDIR@0@/libnss_@1@.so'
1419 .format(rootlibdir, module))
1421 test('dlopen-nss_' + module,
1423 args : [nss.full_path()]) # path to dlopen must include a slash
1427 ############################################################
1429 executable('systemd',
1431 include_directories : includes,
1432 link_with : [libcore,
1434 dependencies : [threads,
1440 install_rpath : rootlibexecdir,
1442 install_dir : rootlibexecdir)
1444 meson.add_install_script(meson_make_symlink,
1445 join_paths(rootlibexecdir, 'systemd'),
1446 join_paths(rootsbindir, 'init'))
1448 exe = executable('systemd-analyze',
1449 systemd_analyze_sources,
1450 include_directories : includes,
1451 link_with : [libcore,
1453 dependencies : [threads,
1459 install_rpath : rootlibexecdir,
1461 public_programs += [exe]
1463 executable('systemd-journald',
1464 systemd_journald_sources,
1465 include_directories : includes,
1466 link_with : [libjournal_core,
1468 dependencies : [threads,
1472 install_rpath : rootlibexecdir,
1474 install_dir : rootlibexecdir)
1476 exe = executable('systemd-cat',
1477 systemd_cat_sources,
1478 include_directories : includes,
1479 link_with : [libjournal_core,
1481 dependencies : [threads],
1482 install_rpath : rootlibexecdir,
1484 public_programs += [exe]
1486 exe = executable('journalctl',
1488 include_directories : includes,
1489 link_with : [libshared],
1490 dependencies : [threads,
1495 install_rpath : rootlibexecdir,
1497 install_dir : rootbindir)
1498 public_programs += [exe]
1500 executable('systemd-getty-generator',
1501 'src/getty-generator/getty-generator.c',
1502 include_directories : includes,
1503 link_with : [libshared],
1504 install_rpath : rootlibexecdir,
1506 install_dir : systemgeneratordir)
1508 executable('systemd-debug-generator',
1509 'src/debug-generator/debug-generator.c',
1510 include_directories : includes,
1511 link_with : [libshared],
1512 install_rpath : rootlibexecdir,
1514 install_dir : systemgeneratordir)
1516 executable('systemd-fstab-generator',
1517 'src/fstab-generator/fstab-generator.c',
1518 'src/core/mount-setup.c',
1519 include_directories : includes,
1520 link_with : [libshared],
1521 install_rpath : rootlibexecdir,
1523 install_dir : systemgeneratordir)
1525 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1526 executable('30-systemd-environment-d-generator',
1527 'src/environment-d-generator/environment-d-generator.c',
1528 include_directories : includes,
1529 link_with : [libshared],
1530 install_rpath : rootlibexecdir,
1532 install_dir : userenvgeneratordir)
1534 meson.add_install_script(meson_make_symlink,
1535 join_paths(sysconfdir, 'environment'),
1536 join_paths(environmentdir, '99-environment.conf'))
1539 if conf.get('ENABLE_HIBERNATE') == 1
1540 executable('systemd-hibernate-resume-generator',
1541 'src/hibernate-resume/hibernate-resume-generator.c',
1542 include_directories : includes,
1543 link_with : [libshared],
1544 install_rpath : rootlibexecdir,
1546 install_dir : systemgeneratordir)
1548 executable('systemd-hibernate-resume',
1549 'src/hibernate-resume/hibernate-resume.c',
1550 include_directories : includes,
1551 link_with : [libshared],
1552 install_rpath : rootlibexecdir,
1554 install_dir : rootlibexecdir)
1557 if conf.get('HAVE_BLKID') == 1
1558 executable('systemd-gpt-auto-generator',
1559 'src/gpt-auto-generator/gpt-auto-generator.c',
1560 'src/basic/blkid-util.h',
1561 include_directories : includes,
1562 link_with : [libshared],
1563 dependencies : libblkid,
1564 install_rpath : rootlibexecdir,
1566 install_dir : systemgeneratordir)
1568 exe = executable('systemd-dissect',
1569 'src/dissect/dissect.c',
1570 include_directories : includes,
1571 link_with : [libshared],
1572 install_rpath : rootlibexecdir,
1574 install_dir : rootlibexecdir)
1575 public_programs += [exe]
1578 if conf.get('ENABLE_RESOLVE') == 1
1579 executable('systemd-resolved',
1580 systemd_resolved_sources,
1581 include_directories : includes,
1582 link_with : [libshared,
1584 libsystemd_resolve_core],
1585 dependencies : [threads,
1589 install_rpath : rootlibexecdir,
1591 install_dir : rootlibexecdir)
1593 exe = executable('resolvectl',
1595 include_directories : includes,
1596 link_with : [libshared,
1598 libsystemd_resolve_core],
1599 dependencies : [threads,
1603 install_rpath : rootlibexecdir,
1605 public_programs += [exe]
1607 meson.add_install_script(meson_make_symlink,
1608 join_paths(bindir, 'resolvectl'),
1609 join_paths(rootsbindir, 'resolvconf'))
1611 meson.add_install_script(meson_make_symlink,
1612 join_paths(bindir, 'resolvectl'),
1613 join_paths(bindir, 'systemd-resolve'))
1616 if conf.get('ENABLE_LOGIND') == 1
1617 executable('systemd-logind',
1618 systemd_logind_sources,
1619 include_directories : includes,
1620 link_with : [liblogind_core,
1622 dependencies : [threads,
1624 install_rpath : rootlibexecdir,
1626 install_dir : rootlibexecdir)
1628 exe = executable('loginctl',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 dependencies : [threads,
1635 install_rpath : rootlibexecdir,
1637 install_dir : rootbindir)
1638 public_programs += [exe]
1640 exe = executable('systemd-inhibit',
1641 'src/login/inhibit.c',
1642 include_directories : includes,
1643 link_with : [libshared],
1644 install_rpath : rootlibexecdir,
1646 install_dir : rootbindir)
1647 public_programs += [exe]
1649 if conf.get('HAVE_PAM') == 1
1650 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1651 pam_systemd = shared_library(
1655 include_directories : includes,
1656 link_args : ['-shared',
1657 '-Wl,--version-script=' + version_script_arg],
1658 link_with : [libsystemd_static,
1660 dependencies : [threads,
1663 link_depends : pam_systemd_sym,
1665 install_dir : pamlibdir)
1667 test('dlopen-pam_systemd',
1669 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1673 executable('systemd-user-runtime-dir',
1674 user_runtime_dir_sources,
1675 include_directories : includes,
1676 link_with : [libshared, liblogind_core],
1677 install_rpath : rootlibexecdir,
1679 install_dir : rootlibexecdir)
1681 if conf.get('HAVE_PAM') == 1
1682 executable('systemd-user-sessions',
1683 'src/user-sessions/user-sessions.c',
1684 include_directories : includes,
1685 link_with : [libshared],
1686 install_rpath : rootlibexecdir,
1688 install_dir : rootlibexecdir)
1691 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1692 exe = executable('bootctl',
1693 'src/boot/bootctl.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 dependencies : [libblkid],
1697 install_rpath : rootlibexecdir,
1699 public_programs += [exe]
1702 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1703 include_directories : includes,
1704 link_with : [libshared],
1705 dependencies : [threads],
1706 install_rpath : rootlibexecdir,
1708 public_programs += [exe]
1711 if get_option('link-systemctl-shared')
1712 systemctl_link_with = [libshared]
1714 systemctl_link_with = [libsystemd_static,
1720 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1721 include_directories : includes,
1722 link_with : systemctl_link_with,
1723 dependencies : [threads,
1728 install_rpath : rootlibexecdir,
1730 install_dir : rootbindir)
1731 public_programs += [exe]
1733 if conf.get('ENABLE_PORTABLED') == 1
1734 executable('systemd-portabled',
1735 systemd_portabled_sources,
1736 include_directories : includes,
1737 link_with : [libshared],
1738 dependencies : [threads],
1739 install_rpath : rootlibexecdir,
1741 install_dir : rootlibexecdir)
1743 exe = executable('portablectl', 'src/portable/portablectl.c',
1744 include_directories : includes,
1745 link_with : [libshared],
1746 dependencies : [threads],
1747 install_rpath : rootlibexecdir,
1749 install_dir : rootlibexecdir)
1750 public_programs += [exe]
1753 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1754 meson.add_install_script(meson_make_symlink,
1755 join_paths(rootbindir, 'systemctl'),
1756 join_paths(rootsbindir, alias))
1759 if conf.get('ENABLE_BACKLIGHT') == 1
1760 executable('systemd-backlight',
1761 'src/backlight/backlight.c',
1762 include_directories : includes,
1763 link_with : [libshared],
1764 install_rpath : rootlibexecdir,
1766 install_dir : rootlibexecdir)
1769 if conf.get('ENABLE_RFKILL') == 1
1770 executable('systemd-rfkill',
1771 'src/rfkill/rfkill.c',
1772 include_directories : includes,
1773 link_with : [libshared],
1774 install_rpath : rootlibexecdir,
1776 install_dir : rootlibexecdir)
1779 executable('systemd-system-update-generator',
1780 'src/system-update-generator/system-update-generator.c',
1781 include_directories : includes,
1782 link_with : [libshared],
1783 install_rpath : rootlibexecdir,
1785 install_dir : systemgeneratordir)
1787 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1788 executable('systemd-cryptsetup',
1789 'src/cryptsetup/cryptsetup.c',
1790 include_directories : includes,
1791 link_with : [libshared],
1792 dependencies : [libcryptsetup],
1793 install_rpath : rootlibexecdir,
1795 install_dir : rootlibexecdir)
1797 executable('systemd-cryptsetup-generator',
1798 'src/cryptsetup/cryptsetup-generator.c',
1799 include_directories : includes,
1800 link_with : [libshared],
1801 dependencies : [libcryptsetup],
1802 install_rpath : rootlibexecdir,
1804 install_dir : systemgeneratordir)
1806 executable('systemd-veritysetup',
1807 'src/veritysetup/veritysetup.c',
1808 include_directories : includes,
1809 link_with : [libshared],
1810 dependencies : [libcryptsetup],
1811 install_rpath : rootlibexecdir,
1813 install_dir : rootlibexecdir)
1815 executable('systemd-veritysetup-generator',
1816 'src/veritysetup/veritysetup-generator.c',
1817 include_directories : includes,
1818 link_with : [libshared],
1819 dependencies : [libcryptsetup],
1820 install_rpath : rootlibexecdir,
1822 install_dir : systemgeneratordir)
1825 if conf.get('HAVE_SYSV_COMPAT') == 1
1826 executable('systemd-sysv-generator',
1827 'src/sysv-generator/sysv-generator.c',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 install_rpath : rootlibexecdir,
1832 install_dir : systemgeneratordir)
1834 executable('systemd-rc-local-generator',
1835 'src/rc-local-generator/rc-local-generator.c',
1836 include_directories : includes,
1837 link_with : [libshared],
1838 install_rpath : rootlibexecdir,
1840 install_dir : systemgeneratordir)
1843 if conf.get('ENABLE_HOSTNAMED') == 1
1844 executable('systemd-hostnamed',
1845 'src/hostname/hostnamed.c',
1846 include_directories : includes,
1847 link_with : [libshared],
1848 install_rpath : rootlibexecdir,
1850 install_dir : rootlibexecdir)
1852 exe = executable('hostnamectl',
1853 'src/hostname/hostnamectl.c',
1854 include_directories : includes,
1855 link_with : [libshared],
1856 install_rpath : rootlibexecdir,
1858 public_programs += [exe]
1861 if conf.get('ENABLE_LOCALED') == 1
1862 if conf.get('HAVE_XKBCOMMON') == 1
1863 # logind will load libxkbcommon.so dynamically on its own
1869 executable('systemd-localed',
1870 systemd_localed_sources,
1871 include_directories : includes,
1872 link_with : [libshared],
1873 dependencies : deps,
1874 install_rpath : rootlibexecdir,
1876 install_dir : rootlibexecdir)
1878 exe = executable('localectl',
1880 include_directories : includes,
1881 link_with : [libshared],
1882 install_rpath : rootlibexecdir,
1884 public_programs += [exe]
1887 if conf.get('ENABLE_TIMEDATED') == 1
1888 executable('systemd-timedated',
1889 'src/timedate/timedated.c',
1890 include_directories : includes,
1891 link_with : [libshared],
1892 install_rpath : rootlibexecdir,
1894 install_dir : rootlibexecdir)
1897 if conf.get('ENABLE_TIMEDATECTL') == 1
1898 exe = executable('timedatectl',
1899 'src/timedate/timedatectl.c',
1900 include_directories : includes,
1901 install_rpath : rootlibexecdir,
1902 link_with : [libshared],
1903 dependencies : [libm],
1905 public_programs += [exe]
1908 if conf.get('ENABLE_TIMESYNCD') == 1
1909 executable('systemd-timesyncd',
1910 systemd_timesyncd_sources,
1911 include_directories : includes,
1912 link_with : [libshared],
1913 dependencies : [threads,
1915 install_rpath : rootlibexecdir,
1917 install_dir : rootlibexecdir)
1919 executable('systemd-time-wait-sync',
1920 'src/time-wait-sync/time-wait-sync.c',
1921 include_directories : includes,
1922 link_with : [libshared],
1923 install_rpath : rootlibexecdir,
1925 install_dir : rootlibexecdir)
1928 if conf.get('ENABLE_MACHINED') == 1
1929 executable('systemd-machined',
1930 systemd_machined_sources,
1931 include_directories : includes,
1932 link_with : [libmachine_core,
1934 install_rpath : rootlibexecdir,
1936 install_dir : rootlibexecdir)
1938 exe = executable('machinectl',
1939 'src/machine/machinectl.c',
1940 include_directories : includes,
1941 link_with : [libshared],
1942 dependencies : [threads,
1945 install_rpath : rootlibexecdir,
1947 install_dir : rootbindir)
1948 public_programs += [exe]
1951 if conf.get('ENABLE_IMPORTD') == 1
1952 executable('systemd-importd',
1953 systemd_importd_sources,
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [threads],
1957 install_rpath : rootlibexecdir,
1959 install_dir : rootlibexecdir)
1961 systemd_pull = executable('systemd-pull',
1962 systemd_pull_sources,
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [libcurl,
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootlibexecdir)
1974 systemd_import = executable('systemd-import',
1975 systemd_import_sources,
1976 include_directories : includes,
1977 link_with : [libshared],
1978 dependencies : [libcurl,
1982 install_rpath : rootlibexecdir,
1984 install_dir : rootlibexecdir)
1986 systemd_export = executable('systemd-export',
1987 systemd_export_sources,
1988 include_directories : includes,
1989 link_with : [libshared],
1990 dependencies : [libcurl,
1994 install_rpath : rootlibexecdir,
1996 install_dir : rootlibexecdir)
1997 public_programs += [systemd_pull, systemd_import, systemd_export]
2000 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2001 exe = executable('systemd-journal-upload',
2002 systemd_journal_upload_sources,
2003 include_directories : includes,
2004 link_with : [libshared],
2005 dependencies : [threads,
2010 install_rpath : rootlibexecdir,
2012 install_dir : rootlibexecdir)
2013 public_programs += [exe]
2016 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2017 s_j_remote = executable('systemd-journal-remote',
2018 systemd_journal_remote_sources,
2019 include_directories : includes,
2020 link_with : [libshared,
2021 libsystemd_journal_remote],
2022 dependencies : [threads,
2027 install_rpath : rootlibexecdir,
2029 install_dir : rootlibexecdir)
2031 s_j_gatewayd = executable('systemd-journal-gatewayd',
2032 systemd_journal_gatewayd_sources,
2033 include_directories : includes,
2034 link_with : [libshared],
2035 dependencies : [threads,
2040 install_rpath : rootlibexecdir,
2042 install_dir : rootlibexecdir)
2043 public_programs += [s_j_remote, s_j_gatewayd]
2046 if conf.get('ENABLE_COREDUMP') == 1
2047 executable('systemd-coredump',
2048 systemd_coredump_sources,
2049 include_directories : includes,
2050 link_with : [libshared],
2051 dependencies : [threads,
2056 install_rpath : rootlibexecdir,
2058 install_dir : rootlibexecdir)
2060 exe = executable('coredumpctl',
2061 coredumpctl_sources,
2062 include_directories : includes,
2063 link_with : [libshared],
2064 dependencies : [threads,
2067 install_rpath : rootlibexecdir,
2069 public_programs += [exe]
2072 if conf.get('ENABLE_BINFMT') == 1
2073 exe = executable('systemd-binfmt',
2074 'src/binfmt/binfmt.c',
2075 include_directories : includes,
2076 link_with : [libshared],
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootlibexecdir)
2080 public_programs += [exe]
2082 meson.add_install_script('sh', '-c',
2083 mkdir_p.format(binfmtdir))
2084 meson.add_install_script('sh', '-c',
2085 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2088 if conf.get('ENABLE_VCONSOLE') == 1
2089 executable('systemd-vconsole-setup',
2090 'src/vconsole/vconsole-setup.c',
2091 include_directories : includes,
2092 link_with : [libshared],
2093 install_rpath : rootlibexecdir,
2095 install_dir : rootlibexecdir)
2098 if conf.get('ENABLE_RANDOMSEED') == 1
2099 executable('systemd-random-seed',
2100 'src/random-seed/random-seed.c',
2101 include_directories : includes,
2102 link_with : [libshared],
2103 install_rpath : rootlibexecdir,
2105 install_dir : rootlibexecdir)
2108 if conf.get('ENABLE_FIRSTBOOT') == 1
2109 executable('systemd-firstboot',
2110 'src/firstboot/firstboot.c',
2111 include_directories : includes,
2112 link_with : [libshared],
2113 dependencies : [libcrypt],
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootbindir)
2119 executable('systemd-remount-fs',
2120 'src/remount-fs/remount-fs.c',
2121 'src/core/mount-setup.c',
2122 'src/core/mount-setup.h',
2123 include_directories : includes,
2124 link_with : [libshared],
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootlibexecdir)
2129 executable('systemd-machine-id-setup',
2130 'src/machine-id-setup/machine-id-setup-main.c',
2131 'src/core/machine-id-setup.c',
2132 'src/core/machine-id-setup.h',
2133 include_directories : includes,
2134 link_with : [libshared],
2135 install_rpath : rootlibexecdir,
2137 install_dir : rootbindir)
2139 executable('systemd-fsck',
2141 include_directories : includes,
2142 link_with : [libshared],
2143 install_rpath : rootlibexecdir,
2145 install_dir : rootlibexecdir)
2147 executable('systemd-growfs',
2148 'src/partition/growfs.c',
2149 include_directories : includes,
2150 link_with : [libshared],
2151 dependencies : [libcryptsetup],
2152 install_rpath : rootlibexecdir,
2154 install_dir : rootlibexecdir)
2156 executable('systemd-makefs',
2157 'src/partition/makefs.c',
2158 include_directories : includes,
2159 link_with : [libshared],
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootlibexecdir)
2164 executable('systemd-sleep',
2165 'src/sleep/sleep.c',
2166 include_directories : includes,
2167 link_with : [libshared],
2168 install_rpath : rootlibexecdir,
2170 install_dir : rootlibexecdir)
2172 exe = executable('systemd-sysctl',
2173 'src/sysctl/sysctl.c',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2178 install_dir : rootlibexecdir)
2179 public_programs += [exe]
2181 executable('systemd-ac-power',
2182 'src/ac-power/ac-power.c',
2183 include_directories : includes,
2184 link_with : [libshared],
2185 install_rpath : rootlibexecdir,
2187 install_dir : rootlibexecdir)
2189 exe = executable('systemd-detect-virt',
2190 'src/detect-virt/detect-virt.c',
2191 include_directories : includes,
2192 link_with : [libshared],
2193 install_rpath : rootlibexecdir,
2195 public_programs += [exe]
2197 exe = executable('systemd-delta',
2198 'src/delta/delta.c',
2199 include_directories : includes,
2200 link_with : [libshared],
2201 install_rpath : rootlibexecdir,
2203 public_programs += [exe]
2205 exe = executable('systemd-escape',
2206 'src/escape/escape.c',
2207 include_directories : includes,
2208 link_with : [libshared],
2209 install_rpath : rootlibexecdir,
2211 install_dir : rootbindir)
2212 public_programs += [exe]
2214 exe = executable('systemd-notify',
2215 'src/notify/notify.c',
2216 include_directories : includes,
2217 link_with : [libshared],
2218 install_rpath : rootlibexecdir,
2220 install_dir : rootbindir)
2221 public_programs += [exe]
2223 executable('systemd-volatile-root',
2224 'src/volatile-root/volatile-root.c',
2225 include_directories : includes,
2226 link_with : [libshared],
2227 install_rpath : rootlibexecdir,
2229 install_dir : rootlibexecdir)
2231 executable('systemd-cgroups-agent',
2232 'src/cgroups-agent/cgroups-agent.c',
2233 include_directories : includes,
2234 link_with : [libshared],
2235 install_rpath : rootlibexecdir,
2237 install_dir : rootlibexecdir)
2239 exe = executable('systemd-path',
2241 include_directories : includes,
2242 link_with : [libshared],
2243 install_rpath : rootlibexecdir,
2245 public_programs += [exe]
2247 exe = executable('systemd-ask-password',
2248 'src/ask-password/ask-password.c',
2249 include_directories : includes,
2250 link_with : [libshared],
2251 install_rpath : rootlibexecdir,
2253 install_dir : rootbindir)
2254 public_programs += [exe]
2256 executable('systemd-reply-password',
2257 'src/reply-password/reply-password.c',
2258 include_directories : includes,
2259 link_with : [libshared],
2260 install_rpath : rootlibexecdir,
2262 install_dir : rootlibexecdir)
2264 exe = executable('systemd-tty-ask-password-agent',
2265 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2266 include_directories : includes,
2267 link_with : [libshared],
2268 install_rpath : rootlibexecdir,
2270 install_dir : rootbindir)
2271 public_programs += [exe]
2273 exe = executable('systemd-cgls',
2275 include_directories : includes,
2276 link_with : [libshared],
2277 install_rpath : rootlibexecdir,
2279 public_programs += [exe]
2281 exe = executable('systemd-cgtop',
2282 'src/cgtop/cgtop.c',
2283 include_directories : includes,
2284 link_with : [libshared],
2285 install_rpath : rootlibexecdir,
2287 public_programs += [exe]
2289 executable('systemd-initctl',
2290 'src/initctl/initctl.c',
2291 include_directories : includes,
2292 link_with : [libshared],
2293 install_rpath : rootlibexecdir,
2295 install_dir : rootlibexecdir)
2297 exe = executable('systemd-mount',
2298 'src/mount/mount-tool.c',
2299 include_directories : includes,
2300 link_with : [libshared],
2301 install_rpath : rootlibexecdir,
2303 public_programs += [exe]
2305 meson.add_install_script(meson_make_symlink,
2306 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2308 exe = executable('systemd-run',
2310 include_directories : includes,
2311 link_with : [libshared],
2312 install_rpath : rootlibexecdir,
2314 public_programs += [exe]
2316 exe = executable('systemd-stdio-bridge',
2317 'src/stdio-bridge/stdio-bridge.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 install_rpath : rootlibexecdir,
2322 public_programs += [exe]
2324 exe = executable('busctl',
2325 'src/busctl/busctl.c',
2326 'src/busctl/busctl-introspect.c',
2327 'src/busctl/busctl-introspect.h',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2332 public_programs += [exe]
2334 if conf.get('ENABLE_SYSUSERS') == 1
2335 exe = executable('systemd-sysusers',
2336 'src/sysusers/sysusers.c',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2341 install_dir : rootbindir)
2342 public_programs += [exe]
2345 if conf.get('ENABLE_TMPFILES') == 1
2346 exe = executable('systemd-tmpfiles',
2347 'src/tmpfiles/tmpfiles.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 dependencies : [libacl],
2351 install_rpath : rootlibexecdir,
2353 install_dir : rootbindir)
2354 public_programs += [exe]
2356 test('test-systemd-tmpfiles',
2357 test_systemd_tmpfiles_py,
2358 args : exe.full_path())
2359 # https://github.com/mesonbuild/meson/issues/2681
2362 if conf.get('ENABLE_HWDB') == 1
2363 exe = executable('systemd-hwdb',
2365 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2366 include_directories : includes,
2367 link_with : [libudev_static],
2368 install_rpath : udev_rpath,
2370 install_dir : rootbindir)
2371 public_programs += [exe]
2374 if conf.get('ENABLE_QUOTACHECK') == 1
2375 executable('systemd-quotacheck',
2376 'src/quotacheck/quotacheck.c',
2377 include_directories : includes,
2378 link_with : [libshared],
2379 install_rpath : rootlibexecdir,
2381 install_dir : rootlibexecdir)
2384 exe = executable('systemd-socket-proxyd',
2385 'src/socket-proxy/socket-proxyd.c',
2386 include_directories : includes,
2387 link_with : [libshared],
2388 dependencies : [threads],
2389 install_rpath : rootlibexecdir,
2391 install_dir : rootlibexecdir)
2392 public_programs += [exe]
2394 exe = executable('systemd-udevd',
2395 systemd_udevd_sources,
2396 include_directories : includes,
2397 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2398 link_with : [libudev_core,
2401 dependencies : [threads,
2406 install_rpath : udev_rpath,
2408 install_dir : rootlibexecdir)
2409 public_programs += [exe]
2411 exe = executable('udevadm',
2413 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2414 include_directories : includes,
2415 link_with : [libudev_core,
2418 dependencies : [threads,
2423 install_rpath : udev_rpath,
2425 install_dir : rootbindir)
2426 public_programs += [exe]
2428 executable('systemd-shutdown',
2429 systemd_shutdown_sources,
2430 include_directories : includes,
2431 link_with : [libshared],
2432 dependencies : [libmount],
2433 install_rpath : rootlibexecdir,
2435 install_dir : rootlibexecdir)
2437 executable('systemd-update-done',
2438 'src/update-done/update-done.c',
2439 include_directories : includes,
2440 link_with : [libshared],
2441 install_rpath : rootlibexecdir,
2443 install_dir : rootlibexecdir)
2445 executable('systemd-update-utmp',
2446 'src/update-utmp/update-utmp.c',
2447 include_directories : includes,
2448 link_with : [libshared],
2449 dependencies : [libaudit],
2450 install_rpath : rootlibexecdir,
2452 install_dir : rootlibexecdir)
2454 if conf.get('HAVE_KMOD') == 1
2455 executable('systemd-modules-load',
2456 'src/modules-load/modules-load.c',
2457 include_directories : includes,
2458 link_with : [libshared],
2459 dependencies : [libkmod],
2460 install_rpath : rootlibexecdir,
2462 install_dir : rootlibexecdir)
2464 meson.add_install_script('sh', '-c',
2465 mkdir_p.format(modulesloaddir))
2466 meson.add_install_script('sh', '-c',
2467 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2470 exe = executable('systemd-nspawn',
2471 systemd_nspawn_sources,
2472 'src/core/mount-setup.c', # FIXME: use a variable?
2473 'src/core/mount-setup.h',
2474 'src/core/loopback-setup.c',
2475 'src/core/loopback-setup.h',
2476 include_directories : includes,
2477 link_with : [libnspawn_core,
2479 dependencies : [libblkid],
2480 install_rpath : rootlibexecdir,
2482 public_programs += [exe]
2484 if conf.get('ENABLE_NETWORKD') == 1
2485 executable('systemd-networkd',
2486 systemd_networkd_sources,
2487 include_directories : includes,
2488 link_with : [libnetworkd_core,
2492 dependencies : [threads],
2493 install_rpath : rootlibexecdir,
2495 install_dir : rootlibexecdir)
2497 executable('systemd-networkd-wait-online',
2498 systemd_networkd_wait_online_sources,
2499 include_directories : includes,
2500 link_with : [libnetworkd_core,
2502 install_rpath : rootlibexecdir,
2504 install_dir : rootlibexecdir)
2506 exe = executable('networkctl',
2508 include_directories : includes,
2509 link_with : [libsystemd_network,
2511 install_rpath : rootlibexecdir,
2513 install_dir : rootbindir)
2514 public_programs += [exe]
2517 executable('systemd-sulogin-shell',
2518 ['src/sulogin-shell/sulogin-shell.c'],
2519 include_directories : includes,
2520 link_with : [libshared],
2521 install_rpath : rootlibexecdir,
2523 install_dir : rootlibexecdir)
2525 ############################################################
2527 foreach tuple : tests
2529 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2530 dependencies = tuple[2]
2531 condition = tuple.length() >= 4 ? tuple[3] : ''
2532 type = tuple.length() >= 5 ? tuple[4] : ''
2533 defs = tuple.length() >= 6 ? tuple[5] : []
2534 incs = tuple.length() >= 7 ? tuple[6] : includes
2537 name = sources[0].split('/')[-1].split('.')[0]
2538 if type.startswith('timeout=')
2539 timeout = type.split('=')[1].to_int()
2542 if want_tests == 'false'
2543 message('Not compiling @0@ because tests is set to false'.format(name))
2544 elif condition == '' or conf.get(condition) == 1
2548 include_directories : incs,
2549 link_with : link_with,
2550 dependencies : dependencies,
2552 install_rpath : rootlibexecdir,
2553 install : install_tests,
2554 install_dir : join_paths(testsdir, type))
2557 message('@0@ is a manual test'.format(name))
2558 elif type == 'unsafe' and want_tests != 'unsafe'
2559 message('@0@ is an unsafe test'.format(name))
2566 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2571 'test-libsystemd-sym',
2572 test_libsystemd_sym_c,
2573 include_directories : includes,
2574 link_with : [libsystemd],
2575 install : install_tests,
2576 install_dir : testsdir)
2577 test('test-libsystemd-sym', exe)
2580 'test-libsystemd-static-sym',
2581 test_libsystemd_sym_c,
2582 include_directories : includes,
2583 link_with : [install_libsystemd_static],
2584 dependencies : [threads], # threads is already included in dependencies on the library,
2585 # but does not seem to get propagated. Add here as a work-around.
2586 build_by_default : static_libsystemd_pic,
2587 install : install_tests and static_libsystemd_pic,
2588 install_dir : testsdir)
2589 if static_libsystemd_pic
2590 test('test-libsystemd-static-sym', exe)
2596 include_directories : includes,
2597 c_args : ['-Wno-deprecated-declarations'],
2598 link_with : [libudev],
2599 install : install_tests,
2600 install_dir : testsdir)
2601 test('test-libudev-sym', exe)
2604 'test-libudev-static-sym',
2606 include_directories : includes,
2607 c_args : ['-Wno-deprecated-declarations'],
2608 link_with : [install_libudev_static],
2609 build_by_default : static_libudev_pic,
2610 install : install_tests and static_libudev_pic,
2611 install_dir : testsdir)
2612 if static_libudev_pic
2613 test('test-libudev-static-sym', exe)
2616 ############################################################
2620 foreach tuple : fuzzers
2622 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2623 dependencies = tuple[2]
2624 defs = tuple.length() >= 4 ? tuple[3] : []
2625 incs = tuple.length() >= 5 ? tuple[4] : includes
2628 dependencies += fuzzing_engine
2630 sources += 'src/fuzz/fuzz-main.c'
2633 name = sources[0].split('/')[-1].split('.')[0]
2635 fuzzer_exes += executable(
2638 include_directories : [incs, include_directories('src/fuzz')],
2639 link_with : link_with,
2640 dependencies : dependencies,
2645 run_target('fuzzers',
2646 depends : fuzzer_exes,
2649 ############################################################
2651 make_directive_index_py = find_program('tools/make-directive-index.py')
2652 make_man_index_py = find_program('tools/make-man-index.py')
2653 xml_helper_py = find_program('tools/xml_helper.py')
2654 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2658 subdir('sysusers.d')
2659 subdir('tmpfiles.d')
2664 subdir('shell-completion/bash')
2665 subdir('shell-completion/zsh')
2666 subdir('doc/sysvinit')
2667 subdir('doc/var-log')
2669 # FIXME: figure out if the warning is true:
2670 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2671 install_subdir('factory/etc',
2672 install_dir : factorydir)
2675 install_data('xorg/50-systemd-user.sh',
2676 install_dir : xinitrcdir)
2677 install_data('modprobe.d/systemd.conf',
2678 install_dir : modprobedir)
2679 install_data('LICENSE.GPL2',
2684 'doc/DISTRO_PORTING',
2685 'doc/ENVIRONMENT.md',
2687 'doc/TRANSIENT-SETTINGS.md',
2690 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2691 install_dir : docdir)
2693 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2694 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2696 ############################################################
2698 meson_check_help = find_program('tools/meson-check-help.sh')
2700 foreach exec : public_programs
2701 name = exec.full_path().split('/')[-1]
2702 test('check-help-' + name,
2704 args : [exec.full_path()])
2707 ############################################################
2709 # Enable tests for all supported sanitizers
2710 foreach tuple : sanitizers
2711 sanitizer = tuple[0]
2714 have = run_command(check_compilation_sh,
2715 cc.cmd_array(), '-x', 'c',
2716 '-fsanitize=@0@'.format(sanitizer),
2717 '-include', link_test_c).returncode() == 0
2718 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2722 foreach p : fuzz_regression_tests
2723 b = p.split('/')[-2]
2724 c = p.split('/')[-1]
2726 name = '@0@:@1@'.format(b, sanitizer)
2729 if want_tests == 'false'
2730 message('Not compiling @0@ because tests is set to false'.format(name))
2732 exe = custom_target(
2736 command : [env, 'ln', '-fs',
2737 join_paths(build.full_path(), b),
2739 build_by_default : true)
2741 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2746 if want_tests != 'false' and slow_tests
2747 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2749 args : [exe.full_path(),
2750 join_paths(meson.source_root(),
2751 'test/fuzz-regressions',
2759 ############################################################
2762 all_files = run_command(
2764 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2767 all_files = files(all_files.stdout().split())
2772 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2775 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2779 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2782 command : [meson_git_contrib_sh])
2786 git_head = run_command(
2788 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2789 'rev-parse', 'HEAD']).stdout().strip()
2790 git_head_short = run_command(
2792 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2793 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2797 command : ['git', 'archive',
2798 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2800 '--prefix', 'systemd-@0@/'.format(git_head),
2804 ############################################################
2806 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2809 depends : [man, libsystemd, libudev],
2810 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2812 ############################################################
2815 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2817 'split /usr: @0@'.format(split_usr),
2818 'split bin-sbin: @0@'.format(split_bin),
2819 'prefix directory: @0@'.format(prefixdir),
2820 'rootprefix directory: @0@'.format(rootprefixdir),
2821 'sysconf directory: @0@'.format(sysconfdir),
2822 'include directory: @0@'.format(includedir),
2823 'lib directory: @0@'.format(libdir),
2824 'rootlib directory: @0@'.format(rootlibdir),
2825 'SysV init scripts: @0@'.format(sysvinit_path),
2826 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2827 'PAM modules directory: @0@'.format(pamlibdir),
2828 'PAM configuration directory: @0@'.format(pamconfdir),
2829 'RPM macros directory: @0@'.format(rpmmacrosdir),
2830 'modprobe.d directory: @0@'.format(modprobedir),
2831 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2832 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2833 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2834 'bash completions directory: @0@'.format(bashcompletiondir),
2835 'zsh completions directory: @0@'.format(zshcompletiondir),
2836 'extra start script: @0@'.format(get_option('rc-local')),
2837 'extra stop script: @0@'.format(get_option('halt-local')),
2838 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2839 get_option('debug-tty')),
2840 'TTY GID: @0@'.format(tty_gid),
2841 'users GID: @0@'.format(users_gid),
2842 'maximum system UID: @0@'.format(system_uid_max),
2843 'maximum system GID: @0@'.format(system_gid_max),
2844 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2845 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2846 'minimum container UID base: @0@'.format(container_uid_base_min),
2847 'maximum container UID base: @0@'.format(container_uid_base_max),
2848 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2849 'render group access mode: @0@'.format(get_option('group-render-mode')),
2850 'certificate root directory: @0@'.format(get_option('certificate-root')),
2851 'support URL: @0@'.format(support_url),
2852 'nobody user name: @0@'.format(nobody_user),
2853 'nobody group name: @0@'.format(nobody_group),
2854 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2855 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2857 'default DNSSEC mode: @0@'.format(default_dnssec),
2858 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2859 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2861 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2862 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2864 'default DNS servers: @0@'.format(alt_dns_servers),
2865 'default NTP servers: @0@'.format(alt_ntp_servers)]
2867 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2868 '@@0@'.format(time_epoch)).stdout().strip()
2870 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2873 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2874 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2875 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2877 if conf.get('ENABLE_EFI') == 1
2879 'efi arch: @0@'.format(efi_arch)]
2883 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2884 'EFI CC @0@'.format(efi_cc),
2885 'EFI lib directory: @0@'.format(efi_libdir),
2886 'EFI lds directory: @0@'.format(efi_ldsdir),
2887 'EFI include directory: @0@'.format(efi_incdir)]
2941 ['legacy pkla', install_polkit_pkla],
2943 ['gnu-efi', have_gnu_efi],
2950 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2953 ['man pages', want_man],
2954 ['html pages', want_html],
2955 ['man page indices', want_man and have_lxml],
2960 ['adm group', get_option('adm-group')],
2961 ['wheel group', get_option('wheel-group')],
2964 ['debug mmap cache'],
2965 ['valgrind', conf.get('VALGRIND') == 1],
2968 if tuple.length() >= 2
2971 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2972 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2973 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2978 missing += [tuple[0]]
2984 'enabled features: @0@'.format(', '.join(found)),
2986 'disabled features: @0@'.format(', '.join(missing)),
2988 message('\n '.join(status))
2990 if rootprefixdir != rootprefix_default
2992 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2993 'systemd used fixed names for unit file directories and other paths, so anything\n' +
2994 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))