1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.44',
15 libsystemd_version = '0.22.0'
16 libudev_version = '1.6.10'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
26 substs = configuration_data()
27 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PACKAGE_VERSION', meson.project_version())
30 #####################################################################
32 # Try to install the git pre-commit hook
33 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
34 if git_hook.returncode() == 0
35 message(git_hook.stdout().strip())
38 #####################################################################
40 if get_option('split-usr') == 'auto'
41 split_usr = run_command('test', '-L', '/bin').returncode() != 0
43 split_usr = get_option('split-usr') == 'true'
45 conf.set10('HAVE_SPLIT_USR', split_usr,
46 description : '/usr/bin and /bin directories are separate')
48 if get_option('split-bin') == 'auto'
49 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
51 split_bin = get_option('split-bin') == 'true'
53 conf.set10('HAVE_SPLIT_BIN', split_bin,
54 description : 'bin and sbin directories are separate')
56 rootprefixdir = get_option('rootprefix')
57 # Unusual rootprefixdir values are used by some distros
58 # (see https://github.com/systemd/systemd/pull/7461).
59 rootprefix_default = split_usr ? '/' : '/usr'
60 if rootprefixdir == ''
61 rootprefixdir = rootprefix_default
64 sysvinit_path = get_option('sysvinit-path')
65 sysvrcnd_path = get_option('sysvrcnd-path')
66 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
67 description : 'SysV init scripts and rcN.d links are supported')
69 # join_paths ignore the preceding arguments if an absolute component is
70 # encountered, so this should canonicalize various paths when they are
71 # absolute or relative.
72 prefixdir = get_option('prefix')
73 if not prefixdir.startswith('/')
74 error('Prefix is not absolute: "@0@"'.format(prefixdir))
76 bindir = join_paths(prefixdir, get_option('bindir'))
77 libdir = join_paths(prefixdir, get_option('libdir'))
78 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
79 includedir = join_paths(prefixdir, get_option('includedir'))
80 datadir = join_paths(prefixdir, get_option('datadir'))
81 localstatedir = join_paths('/', get_option('localstatedir'))
83 rootbindir = join_paths(rootprefixdir, 'bin')
84 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
85 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
87 rootlibdir = get_option('rootlibdir')
89 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
92 # Dirs of external packages
93 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
94 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
95 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
96 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
97 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
98 varlogdir = join_paths(localstatedir, 'log')
99 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
100 rpmmacrosdir = get_option('rpmmacrosdir')
101 if rpmmacrosdir != 'no'
102 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
104 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
107 pkgdatadir = join_paths(datadir, 'systemd')
108 environmentdir = join_paths(prefixdir, 'lib/environment.d')
109 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
110 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
111 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
112 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
113 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
114 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
115 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
116 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
117 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
118 pkgincludedir = join_paths(includedir, 'systemd')
119 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
120 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
121 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
122 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
123 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
124 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
125 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
126 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
127 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
128 udevhomedir = udevlibexecdir
129 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
130 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
131 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
132 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
133 factorydir = join_paths(datadir, 'factory')
134 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
135 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
136 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
137 catalogstatedir = join_paths(systemdstatedir, 'catalog')
138 randomseeddir = join_paths(localstatedir, 'lib/systemd')
139 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
141 docdir = get_option('docdir')
143 docdir = join_paths(datadir, 'doc/systemd')
146 dbuspolicydir = get_option('dbuspolicydir')
147 if dbuspolicydir == ''
148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
151 dbussessionservicedir = get_option('dbussessionservicedir')
152 if dbussessionservicedir == ''
153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
156 dbussystemservicedir = get_option('dbussystemservicedir')
157 if dbussystemservicedir == ''
158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
161 pamlibdir = get_option('pamlibdir')
163 pamlibdir = join_paths(rootlibdir, 'security')
166 pamconfdir = get_option('pamconfdir')
168 pamconfdir = join_paths(sysconfdir, 'pam.d')
171 memory_accounting_default = get_option('memory-accounting-default')
173 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
174 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
175 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
176 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
177 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
178 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
179 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
181 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
183 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
184 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
185 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
186 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
187 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
188 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
189 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
190 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
191 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
192 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
193 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
194 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
195 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
196 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
197 conf.set_quoted('ROOTPREFIX', rootprefixdir)
198 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
199 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
200 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
201 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
202 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
203 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
204 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
205 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
206 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
207 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
208 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
209 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
210 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
211 conf.set_quoted('LIBDIR', libdir)
212 conf.set_quoted('ROOTLIBDIR', rootlibdir)
213 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
214 conf.set_quoted('BOOTLIBDIR', bootlibdir)
215 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
216 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
217 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
218 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
219 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
220 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
221 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
222 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
224 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
225 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
227 substs.set('prefix', prefixdir)
228 substs.set('exec_prefix', prefixdir)
229 substs.set('libdir', libdir)
230 substs.set('rootlibdir', rootlibdir)
231 substs.set('includedir', includedir)
232 substs.set('pkgsysconfdir', pkgsysconfdir)
233 substs.set('bindir', bindir)
234 substs.set('rootbindir', rootbindir)
235 substs.set('rootlibexecdir', rootlibexecdir)
236 substs.set('systemunitdir', systemunitdir)
237 substs.set('userunitdir', userunitdir)
238 substs.set('systempresetdir', systempresetdir)
239 substs.set('userpresetdir', userpresetdir)
240 substs.set('udevhwdbdir', udevhwdbdir)
241 substs.set('udevrulesdir', udevrulesdir)
242 substs.set('udevlibexecdir', udevlibexecdir)
243 substs.set('environmentdir', environmentdir)
244 substs.set('catalogdir', catalogdir)
245 substs.set('tmpfilesdir', tmpfilesdir)
246 substs.set('sysusersdir', sysusersdir)
247 substs.set('sysctldir', sysctldir)
248 substs.set('binfmtdir', binfmtdir)
249 substs.set('modulesloaddir', modulesloaddir)
250 substs.set('modprobedir', modprobedir)
251 substs.set('systemgeneratordir', systemgeneratordir)
252 substs.set('usergeneratordir', usergeneratordir)
253 substs.set('systemenvgeneratordir', systemenvgeneratordir)
254 substs.set('userenvgeneratordir', userenvgeneratordir)
255 substs.set('systemshutdowndir', systemshutdowndir)
256 substs.set('systemsleepdir', systemsleepdir)
257 substs.set('VARLOGDIR', varlogdir)
258 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
259 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
260 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
261 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
262 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
263 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
264 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
265 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
267 #####################################################################
269 cc = meson.get_compiler('c')
270 pkgconfig = import('pkgconfig')
271 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
272 meson_build_sh = find_program('tools/meson-build.sh')
274 if get_option('tests') != 'false'
275 cxx = find_program('c++', required : false)
277 # Used only for tests
282 want_ossfuzz = get_option('oss-fuzz')
283 want_libfuzzer = get_option('llvm-fuzz')
284 fuzzer_build = want_ossfuzz or want_libfuzzer
285 if want_ossfuzz and want_libfuzzer
286 error('only one of oss-fuzz and llvm-fuzz can be specified')
289 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
292 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
295 possible_cc_flags = [
299 '-Wmissing-include-dirs',
300 '-Wold-style-definition',
304 '-Wsuggest-attribute=noreturn',
305 '-Werror=missing-prototypes',
306 '-Werror=implicit-function-declaration',
307 '-Werror=missing-declarations',
308 '-Werror=return-type',
309 '-Werror=incompatible-pointer-types',
311 '-Wstrict-prototypes',
313 '-Wmissing-noreturn',
314 '-Wimplicit-fallthrough=5',
317 '-Wstrict-aliasing=2',
320 '-Werror=shift-count-overflow',
321 '-Werror=shift-overflow=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 default_dns_over_tls = get_option('default-dns-over-tls')
1140 default_dns_over_tls = 'no'
1142 if default_dns_over_tls != 'no' and conf.get('HAVE_GNUTLS') == 0
1143 message('default-dns-over-tls cannot be set to strict or opportunistic when gnutls is disabled. Setting default-dns-over-tls to no.')
1144 default_dns_over_tls = 'no'
1146 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1147 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1148 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1150 want_importd = get_option('importd')
1151 if want_importd != 'false'
1152 have = (conf.get('HAVE_LIBCURL') == 1 and
1153 conf.get('HAVE_ZLIB') == 1 and
1154 conf.get('HAVE_BZIP2') == 1 and
1155 conf.get('HAVE_XZ') == 1 and
1156 conf.get('HAVE_GCRYPT') == 1)
1157 if want_importd == 'true' and not have
1158 error('importd support was requested, but dependencies are not available')
1163 conf.set10('ENABLE_IMPORTD', have)
1165 want_remote = get_option('remote')
1166 if want_remote != 'false'
1167 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1168 conf.get('HAVE_LIBCURL') == 1]
1169 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1170 # it's possible to build one without the other. Complain only if
1171 # support was explictly requested. The auxiliary files like sysusers
1172 # config should be installed when any of the programs are built.
1173 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1174 error('remote support was requested, but dependencies are not available')
1176 have = have_deps[0] or have_deps[1]
1180 conf.set10('ENABLE_REMOTE', have)
1182 foreach term : ['utmp',
1214 have = get_option(term)
1215 name = 'ENABLE_' + term.underscorify().to_upper()
1216 conf.set10(name, have)
1219 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1221 want_tests = get_option('tests')
1222 install_tests = get_option('install-tests')
1223 slow_tests = get_option('slow-tests')
1227 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1229 #####################################################################
1231 if get_option('efi')
1232 efi_arch = host_machine.cpu_family()
1234 if efi_arch == 'x86'
1235 EFI_MACHINE_TYPE_NAME = 'ia32'
1236 gnu_efi_arch = 'ia32'
1237 elif efi_arch == 'x86_64'
1238 EFI_MACHINE_TYPE_NAME = 'x64'
1239 gnu_efi_arch = 'x86_64'
1240 elif efi_arch == 'arm'
1241 EFI_MACHINE_TYPE_NAME = 'arm'
1242 gnu_efi_arch = 'arm'
1243 elif efi_arch == 'aarch64'
1244 EFI_MACHINE_TYPE_NAME = 'aa64'
1245 gnu_efi_arch = 'aarch64'
1247 EFI_MACHINE_TYPE_NAME = ''
1252 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1254 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1258 conf.set10('ENABLE_EFI', have)
1260 #####################################################################
1262 config_h = configure_file(
1263 output : 'config.h',
1264 configuration : conf)
1266 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1268 includes = include_directories('src/basic',
1272 'src/journal-remote',
1276 'src/time-wait-sync',
1281 'src/libsystemd/sd-bus',
1282 'src/libsystemd/sd-device',
1283 'src/libsystemd/sd-hwdb',
1284 'src/libsystemd/sd-id128',
1285 'src/libsystemd/sd-netlink',
1286 'src/libsystemd/sd-network',
1287 'src/libsystemd-network',
1290 add_project_arguments('-include', 'config.h', language : 'c')
1294 subdir('src/systemd')
1296 subdir('src/libsystemd')
1297 subdir('src/libsystemd-network')
1298 subdir('src/journal')
1301 libjournal_core = static_library(
1303 libjournal_core_sources,
1305 include_directories : includes,
1308 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1309 libsystemd = shared_library(
1311 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1312 version : libsystemd_version,
1313 include_directories : includes,
1314 link_args : ['-shared',
1315 '-Wl,--version-script=' + libsystemd_sym_path],
1316 link_with : [libbasic,
1318 link_whole : [libsystemd_static,
1320 dependencies : [threads,
1324 link_depends : libsystemd_sym,
1326 install_dir : rootlibdir)
1328 static_libsystemd = get_option('static-libsystemd')
1329 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1331 install_libsystemd_static = static_library(
1334 journal_client_sources,
1336 basic_gcrypt_sources,
1337 include_directories : includes,
1338 build_by_default : static_libsystemd != 'false',
1339 install : static_libsystemd != 'false',
1340 install_dir : rootlibdir,
1341 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1342 dependencies : [threads,
1351 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1353 ############################################################
1355 # binaries that have --help and are intended for use by humans,
1356 # usually, but not always, installed in /bin.
1357 public_programs = []
1359 subdir('src/libudev')
1360 subdir('src/shared')
1363 subdir('src/network')
1365 subdir('src/analyze')
1366 subdir('src/journal-remote')
1367 subdir('src/coredump')
1368 subdir('src/hostname')
1369 subdir('src/import')
1370 subdir('src/kernel-install')
1371 subdir('src/locale')
1372 subdir('src/machine')
1373 subdir('src/portable')
1374 subdir('src/nspawn')
1375 subdir('src/resolve')
1376 subdir('src/timedate')
1377 subdir('src/timesync')
1378 subdir('src/vconsole')
1379 subdir('src/boot/efi')
1386 ############################################################
1388 # only static linking apart from libdl, to make sure that the
1389 # module is linked to all libraries that it uses.
1390 test_dlopen = executable(
1393 include_directories : includes,
1394 link_with : [libbasic],
1395 dependencies : [libdl])
1397 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1398 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1399 ['mymachines', 'ENABLE_MACHINED'],
1400 ['resolve', 'ENABLE_RESOLVE']]
1402 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1406 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1407 version_script_arg = join_paths(meson.current_source_dir(), sym)
1409 nss = shared_library(
1411 'src/nss-@0@/nss-@0@.c'.format(module),
1413 include_directories : includes,
1414 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1415 link_args : ['-Wl,-z,nodelete',
1417 '-Wl,--version-script=' + version_script_arg,
1419 link_with : [libsystemd_static,
1421 dependencies : [threads,
1425 install_dir : rootlibdir)
1427 # We cannot use shared_module because it does not support version suffix.
1428 # Unfortunately shared_library insists on creating the symlink…
1429 meson.add_install_script('sh', '-c',
1430 'rm $DESTDIR@0@/libnss_@1@.so'
1431 .format(rootlibdir, module))
1433 test('dlopen-nss_' + module,
1435 args : [nss.full_path()]) # path to dlopen must include a slash
1439 ############################################################
1441 executable('systemd',
1443 include_directories : includes,
1444 link_with : [libcore,
1446 dependencies : [threads,
1452 install_rpath : rootlibexecdir,
1454 install_dir : rootlibexecdir)
1456 meson.add_install_script(meson_make_symlink,
1457 join_paths(rootlibexecdir, 'systemd'),
1458 join_paths(rootsbindir, 'init'))
1460 exe = executable('systemd-analyze',
1461 systemd_analyze_sources,
1462 include_directories : includes,
1463 link_with : [libcore,
1465 dependencies : [threads,
1471 install_rpath : rootlibexecdir,
1473 public_programs += [exe]
1475 executable('systemd-journald',
1476 systemd_journald_sources,
1477 include_directories : includes,
1478 link_with : [libjournal_core,
1480 dependencies : [threads,
1484 install_rpath : rootlibexecdir,
1486 install_dir : rootlibexecdir)
1488 exe = executable('systemd-cat',
1489 systemd_cat_sources,
1490 include_directories : includes,
1491 link_with : [libjournal_core,
1493 dependencies : [threads],
1494 install_rpath : rootlibexecdir,
1496 public_programs += [exe]
1498 exe = executable('journalctl',
1500 include_directories : includes,
1501 link_with : [libshared],
1502 dependencies : [threads,
1507 install_rpath : rootlibexecdir,
1509 install_dir : rootbindir)
1510 public_programs += [exe]
1512 executable('systemd-getty-generator',
1513 'src/getty-generator/getty-generator.c',
1514 include_directories : includes,
1515 link_with : [libshared],
1516 install_rpath : rootlibexecdir,
1518 install_dir : systemgeneratordir)
1520 executable('systemd-debug-generator',
1521 'src/debug-generator/debug-generator.c',
1522 include_directories : includes,
1523 link_with : [libshared],
1524 install_rpath : rootlibexecdir,
1526 install_dir : systemgeneratordir)
1528 executable('systemd-fstab-generator',
1529 'src/fstab-generator/fstab-generator.c',
1530 'src/core/mount-setup.c',
1531 include_directories : includes,
1532 link_with : [libshared],
1533 install_rpath : rootlibexecdir,
1535 install_dir : systemgeneratordir)
1537 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1538 executable('30-systemd-environment-d-generator',
1539 'src/environment-d-generator/environment-d-generator.c',
1540 include_directories : includes,
1541 link_with : [libshared],
1542 install_rpath : rootlibexecdir,
1544 install_dir : userenvgeneratordir)
1546 meson.add_install_script(meson_make_symlink,
1547 join_paths(sysconfdir, 'environment'),
1548 join_paths(environmentdir, '99-environment.conf'))
1551 if conf.get('ENABLE_HIBERNATE') == 1
1552 executable('systemd-hibernate-resume-generator',
1553 'src/hibernate-resume/hibernate-resume-generator.c',
1554 include_directories : includes,
1555 link_with : [libshared],
1556 install_rpath : rootlibexecdir,
1558 install_dir : systemgeneratordir)
1560 executable('systemd-hibernate-resume',
1561 'src/hibernate-resume/hibernate-resume.c',
1562 include_directories : includes,
1563 link_with : [libshared],
1564 install_rpath : rootlibexecdir,
1566 install_dir : rootlibexecdir)
1569 if conf.get('HAVE_BLKID') == 1
1570 executable('systemd-gpt-auto-generator',
1571 'src/gpt-auto-generator/gpt-auto-generator.c',
1572 'src/basic/blkid-util.h',
1573 include_directories : includes,
1574 link_with : [libshared],
1575 dependencies : libblkid,
1576 install_rpath : rootlibexecdir,
1578 install_dir : systemgeneratordir)
1580 exe = executable('systemd-dissect',
1581 'src/dissect/dissect.c',
1582 include_directories : includes,
1583 link_with : [libshared],
1584 install_rpath : rootlibexecdir,
1586 install_dir : rootlibexecdir)
1587 public_programs += [exe]
1590 if conf.get('ENABLE_RESOLVE') == 1
1591 executable('systemd-resolved',
1592 systemd_resolved_sources,
1593 include_directories : includes,
1594 link_with : [libshared,
1596 libsystemd_resolve_core],
1597 dependencies : [threads,
1602 install_rpath : rootlibexecdir,
1604 install_dir : rootlibexecdir)
1606 exe = executable('resolvectl',
1608 include_directories : includes,
1609 link_with : [libshared,
1611 libsystemd_resolve_core],
1612 dependencies : [threads,
1616 install_rpath : rootlibexecdir,
1618 public_programs += [exe]
1620 meson.add_install_script(meson_make_symlink,
1621 join_paths(bindir, 'resolvectl'),
1622 join_paths(rootsbindir, 'resolvconf'))
1624 meson.add_install_script(meson_make_symlink,
1625 join_paths(bindir, 'resolvectl'),
1626 join_paths(bindir, 'systemd-resolve'))
1629 if conf.get('ENABLE_LOGIND') == 1
1630 executable('systemd-logind',
1631 systemd_logind_sources,
1632 include_directories : includes,
1633 link_with : [liblogind_core,
1635 dependencies : [threads,
1637 install_rpath : rootlibexecdir,
1639 install_dir : rootlibexecdir)
1641 exe = executable('loginctl',
1643 include_directories : includes,
1644 link_with : [libshared],
1645 dependencies : [threads,
1648 install_rpath : rootlibexecdir,
1650 install_dir : rootbindir)
1651 public_programs += [exe]
1653 exe = executable('systemd-inhibit',
1654 'src/login/inhibit.c',
1655 include_directories : includes,
1656 link_with : [libshared],
1657 install_rpath : rootlibexecdir,
1659 install_dir : rootbindir)
1660 public_programs += [exe]
1662 if conf.get('HAVE_PAM') == 1
1663 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1664 pam_systemd = shared_library(
1668 include_directories : includes,
1669 link_args : ['-shared',
1670 '-Wl,--version-script=' + version_script_arg],
1671 link_with : [libsystemd_static,
1673 dependencies : [threads,
1676 link_depends : pam_systemd_sym,
1678 install_dir : pamlibdir)
1680 test('dlopen-pam_systemd',
1682 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1686 executable('systemd-user-runtime-dir',
1687 user_runtime_dir_sources,
1688 include_directories : includes,
1689 link_with : [libshared, liblogind_core],
1690 install_rpath : rootlibexecdir,
1692 install_dir : rootlibexecdir)
1694 if conf.get('HAVE_PAM') == 1
1695 executable('systemd-user-sessions',
1696 'src/user-sessions/user-sessions.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 install_rpath : rootlibexecdir,
1701 install_dir : rootlibexecdir)
1704 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1705 exe = executable('bootctl',
1706 'src/boot/bootctl.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 dependencies : [libblkid],
1710 install_rpath : rootlibexecdir,
1712 public_programs += [exe]
1715 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1716 include_directories : includes,
1717 link_with : [libshared],
1718 dependencies : [threads],
1719 install_rpath : rootlibexecdir,
1721 public_programs += [exe]
1724 if get_option('link-systemctl-shared')
1725 systemctl_link_with = [libshared]
1727 systemctl_link_with = [libsystemd_static,
1733 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1734 include_directories : includes,
1735 link_with : systemctl_link_with,
1736 dependencies : [threads,
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootbindir)
1744 public_programs += [exe]
1746 if conf.get('ENABLE_PORTABLED') == 1
1747 executable('systemd-portabled',
1748 systemd_portabled_sources,
1749 include_directories : includes,
1750 link_with : [libshared],
1751 dependencies : [threads],
1752 install_rpath : rootlibexecdir,
1754 install_dir : rootlibexecdir)
1756 exe = executable('portablectl', 'src/portable/portablectl.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 dependencies : [threads],
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootlibexecdir)
1763 public_programs += [exe]
1766 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1767 meson.add_install_script(meson_make_symlink,
1768 join_paths(rootbindir, 'systemctl'),
1769 join_paths(rootsbindir, alias))
1772 if conf.get('ENABLE_BACKLIGHT') == 1
1773 executable('systemd-backlight',
1774 'src/backlight/backlight.c',
1775 include_directories : includes,
1776 link_with : [libshared],
1777 install_rpath : rootlibexecdir,
1779 install_dir : rootlibexecdir)
1782 if conf.get('ENABLE_RFKILL') == 1
1783 executable('systemd-rfkill',
1784 'src/rfkill/rfkill.c',
1785 include_directories : includes,
1786 link_with : [libshared],
1787 install_rpath : rootlibexecdir,
1789 install_dir : rootlibexecdir)
1792 executable('systemd-system-update-generator',
1793 'src/system-update-generator/system-update-generator.c',
1794 include_directories : includes,
1795 link_with : [libshared],
1796 install_rpath : rootlibexecdir,
1798 install_dir : systemgeneratordir)
1800 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1801 executable('systemd-cryptsetup',
1802 'src/cryptsetup/cryptsetup.c',
1803 include_directories : includes,
1804 link_with : [libshared],
1805 dependencies : [libcryptsetup],
1806 install_rpath : rootlibexecdir,
1808 install_dir : rootlibexecdir)
1810 executable('systemd-cryptsetup-generator',
1811 'src/cryptsetup/cryptsetup-generator.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 dependencies : [libcryptsetup],
1815 install_rpath : rootlibexecdir,
1817 install_dir : systemgeneratordir)
1819 executable('systemd-veritysetup',
1820 'src/veritysetup/veritysetup.c',
1821 include_directories : includes,
1822 link_with : [libshared],
1823 dependencies : [libcryptsetup],
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootlibexecdir)
1828 executable('systemd-veritysetup-generator',
1829 'src/veritysetup/veritysetup-generator.c',
1830 include_directories : includes,
1831 link_with : [libshared],
1832 dependencies : [libcryptsetup],
1833 install_rpath : rootlibexecdir,
1835 install_dir : systemgeneratordir)
1838 if conf.get('HAVE_SYSV_COMPAT') == 1
1839 executable('systemd-sysv-generator',
1840 'src/sysv-generator/sysv-generator.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 install_rpath : rootlibexecdir,
1845 install_dir : systemgeneratordir)
1847 executable('systemd-rc-local-generator',
1848 'src/rc-local-generator/rc-local-generator.c',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 install_rpath : rootlibexecdir,
1853 install_dir : systemgeneratordir)
1856 if conf.get('ENABLE_HOSTNAMED') == 1
1857 executable('systemd-hostnamed',
1858 'src/hostname/hostnamed.c',
1859 include_directories : includes,
1860 link_with : [libshared],
1861 install_rpath : rootlibexecdir,
1863 install_dir : rootlibexecdir)
1865 exe = executable('hostnamectl',
1866 'src/hostname/hostnamectl.c',
1867 include_directories : includes,
1868 link_with : [libshared],
1869 install_rpath : rootlibexecdir,
1871 public_programs += [exe]
1874 if conf.get('ENABLE_LOCALED') == 1
1875 if conf.get('HAVE_XKBCOMMON') == 1
1876 # logind will load libxkbcommon.so dynamically on its own
1882 executable('systemd-localed',
1883 systemd_localed_sources,
1884 include_directories : includes,
1885 link_with : [libshared],
1886 dependencies : deps,
1887 install_rpath : rootlibexecdir,
1889 install_dir : rootlibexecdir)
1891 exe = executable('localectl',
1893 include_directories : includes,
1894 link_with : [libshared],
1895 install_rpath : rootlibexecdir,
1897 public_programs += [exe]
1900 if conf.get('ENABLE_TIMEDATED') == 1
1901 executable('systemd-timedated',
1902 'src/timedate/timedated.c',
1903 include_directories : includes,
1904 link_with : [libshared],
1905 install_rpath : rootlibexecdir,
1907 install_dir : rootlibexecdir)
1910 if conf.get('ENABLE_TIMEDATECTL') == 1
1911 exe = executable('timedatectl',
1912 'src/timedate/timedatectl.c',
1913 include_directories : includes,
1914 install_rpath : rootlibexecdir,
1915 link_with : [libshared],
1916 dependencies : [libm],
1918 public_programs += [exe]
1921 if conf.get('ENABLE_TIMESYNCD') == 1
1922 executable('systemd-timesyncd',
1923 systemd_timesyncd_sources,
1924 include_directories : includes,
1925 link_with : [libshared],
1926 dependencies : [threads,
1928 install_rpath : rootlibexecdir,
1930 install_dir : rootlibexecdir)
1932 executable('systemd-time-wait-sync',
1933 'src/time-wait-sync/time-wait-sync.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 install_rpath : rootlibexecdir,
1938 install_dir : rootlibexecdir)
1941 if conf.get('ENABLE_MACHINED') == 1
1942 executable('systemd-machined',
1943 systemd_machined_sources,
1944 include_directories : includes,
1945 link_with : [libmachine_core,
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootlibexecdir)
1951 exe = executable('machinectl',
1952 'src/machine/machinectl.c',
1953 include_directories : includes,
1954 link_with : [libshared],
1955 dependencies : [threads,
1958 install_rpath : rootlibexecdir,
1960 install_dir : rootbindir)
1961 public_programs += [exe]
1964 if conf.get('ENABLE_IMPORTD') == 1
1965 executable('systemd-importd',
1966 systemd_importd_sources,
1967 include_directories : includes,
1968 link_with : [libshared],
1969 dependencies : [threads],
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootlibexecdir)
1974 systemd_pull = executable('systemd-pull',
1975 systemd_pull_sources,
1976 include_directories : includes,
1977 link_with : [libshared],
1978 dependencies : [libcurl,
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootlibexecdir)
1987 systemd_import = executable('systemd-import',
1988 systemd_import_sources,
1989 include_directories : includes,
1990 link_with : [libshared],
1991 dependencies : [libcurl,
1995 install_rpath : rootlibexecdir,
1997 install_dir : rootlibexecdir)
1999 systemd_export = executable('systemd-export',
2000 systemd_export_sources,
2001 include_directories : includes,
2002 link_with : [libshared],
2003 dependencies : [libcurl,
2007 install_rpath : rootlibexecdir,
2009 install_dir : rootlibexecdir)
2010 public_programs += [systemd_pull, systemd_import, systemd_export]
2013 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2014 exe = executable('systemd-journal-upload',
2015 systemd_journal_upload_sources,
2016 include_directories : includes,
2017 link_with : [libshared],
2018 dependencies : [threads,
2023 install_rpath : rootlibexecdir,
2025 install_dir : rootlibexecdir)
2026 public_programs += [exe]
2029 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2030 s_j_remote = executable('systemd-journal-remote',
2031 systemd_journal_remote_sources,
2032 include_directories : includes,
2033 link_with : [libshared,
2034 libsystemd_journal_remote],
2035 dependencies : [threads,
2040 install_rpath : rootlibexecdir,
2042 install_dir : rootlibexecdir)
2044 s_j_gatewayd = executable('systemd-journal-gatewayd',
2045 systemd_journal_gatewayd_sources,
2046 include_directories : includes,
2047 link_with : [libshared],
2048 dependencies : [threads,
2053 install_rpath : rootlibexecdir,
2055 install_dir : rootlibexecdir)
2056 public_programs += [s_j_remote, s_j_gatewayd]
2059 if conf.get('ENABLE_COREDUMP') == 1
2060 executable('systemd-coredump',
2061 systemd_coredump_sources,
2062 include_directories : includes,
2063 link_with : [libshared],
2064 dependencies : [threads,
2069 install_rpath : rootlibexecdir,
2071 install_dir : rootlibexecdir)
2073 exe = executable('coredumpctl',
2074 coredumpctl_sources,
2075 include_directories : includes,
2076 link_with : [libshared],
2077 dependencies : [threads,
2080 install_rpath : rootlibexecdir,
2082 public_programs += [exe]
2085 if conf.get('ENABLE_BINFMT') == 1
2086 exe = executable('systemd-binfmt',
2087 'src/binfmt/binfmt.c',
2088 include_directories : includes,
2089 link_with : [libshared],
2090 install_rpath : rootlibexecdir,
2092 install_dir : rootlibexecdir)
2093 public_programs += [exe]
2095 meson.add_install_script('sh', '-c',
2096 mkdir_p.format(binfmtdir))
2097 meson.add_install_script('sh', '-c',
2098 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2101 if conf.get('ENABLE_VCONSOLE') == 1
2102 executable('systemd-vconsole-setup',
2103 'src/vconsole/vconsole-setup.c',
2104 include_directories : includes,
2105 link_with : [libshared],
2106 install_rpath : rootlibexecdir,
2108 install_dir : rootlibexecdir)
2111 if conf.get('ENABLE_RANDOMSEED') == 1
2112 executable('systemd-random-seed',
2113 'src/random-seed/random-seed.c',
2114 include_directories : includes,
2115 link_with : [libshared],
2116 install_rpath : rootlibexecdir,
2118 install_dir : rootlibexecdir)
2121 if conf.get('ENABLE_FIRSTBOOT') == 1
2122 executable('systemd-firstboot',
2123 'src/firstboot/firstboot.c',
2124 include_directories : includes,
2125 link_with : [libshared],
2126 dependencies : [libcrypt],
2127 install_rpath : rootlibexecdir,
2129 install_dir : rootbindir)
2132 executable('systemd-remount-fs',
2133 'src/remount-fs/remount-fs.c',
2134 'src/core/mount-setup.c',
2135 'src/core/mount-setup.h',
2136 include_directories : includes,
2137 link_with : [libshared],
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootlibexecdir)
2142 executable('systemd-machine-id-setup',
2143 'src/machine-id-setup/machine-id-setup-main.c',
2144 'src/core/machine-id-setup.c',
2145 'src/core/machine-id-setup.h',
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootbindir)
2152 executable('systemd-fsck',
2154 include_directories : includes,
2155 link_with : [libshared],
2156 install_rpath : rootlibexecdir,
2158 install_dir : rootlibexecdir)
2160 executable('systemd-growfs',
2161 'src/partition/growfs.c',
2162 include_directories : includes,
2163 link_with : [libshared],
2164 dependencies : [libcryptsetup],
2165 install_rpath : rootlibexecdir,
2167 install_dir : rootlibexecdir)
2169 executable('systemd-makefs',
2170 'src/partition/makefs.c',
2171 include_directories : includes,
2172 link_with : [libshared],
2173 install_rpath : rootlibexecdir,
2175 install_dir : rootlibexecdir)
2177 executable('systemd-sleep',
2178 'src/sleep/sleep.c',
2179 include_directories : includes,
2180 link_with : [libshared],
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootlibexecdir)
2185 exe = executable('systemd-sysctl',
2186 'src/sysctl/sysctl.c',
2187 include_directories : includes,
2188 link_with : [libshared],
2189 install_rpath : rootlibexecdir,
2191 install_dir : rootlibexecdir)
2192 public_programs += [exe]
2194 executable('systemd-ac-power',
2195 'src/ac-power/ac-power.c',
2196 include_directories : includes,
2197 link_with : [libshared],
2198 install_rpath : rootlibexecdir,
2200 install_dir : rootlibexecdir)
2202 exe = executable('systemd-detect-virt',
2203 'src/detect-virt/detect-virt.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2208 public_programs += [exe]
2210 exe = executable('systemd-delta',
2211 'src/delta/delta.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2216 public_programs += [exe]
2218 exe = executable('systemd-escape',
2219 'src/escape/escape.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2224 install_dir : rootbindir)
2225 public_programs += [exe]
2227 exe = executable('systemd-notify',
2228 'src/notify/notify.c',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2233 install_dir : rootbindir)
2234 public_programs += [exe]
2236 executable('systemd-volatile-root',
2237 'src/volatile-root/volatile-root.c',
2238 include_directories : includes,
2239 link_with : [libshared],
2240 install_rpath : rootlibexecdir,
2242 install_dir : rootlibexecdir)
2244 executable('systemd-cgroups-agent',
2245 'src/cgroups-agent/cgroups-agent.c',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 install_rpath : rootlibexecdir,
2250 install_dir : rootlibexecdir)
2252 exe = executable('systemd-path',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 install_rpath : rootlibexecdir,
2258 public_programs += [exe]
2260 exe = executable('systemd-ask-password',
2261 'src/ask-password/ask-password.c',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 install_rpath : rootlibexecdir,
2266 install_dir : rootbindir)
2267 public_programs += [exe]
2269 executable('systemd-reply-password',
2270 'src/reply-password/reply-password.c',
2271 include_directories : includes,
2272 link_with : [libshared],
2273 install_rpath : rootlibexecdir,
2275 install_dir : rootlibexecdir)
2277 exe = executable('systemd-tty-ask-password-agent',
2278 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 install_rpath : rootlibexecdir,
2283 install_dir : rootbindir)
2284 public_programs += [exe]
2286 exe = executable('systemd-cgls',
2288 include_directories : includes,
2289 link_with : [libshared],
2290 install_rpath : rootlibexecdir,
2292 public_programs += [exe]
2294 exe = executable('systemd-cgtop',
2295 'src/cgtop/cgtop.c',
2296 include_directories : includes,
2297 link_with : [libshared],
2298 install_rpath : rootlibexecdir,
2300 public_programs += [exe]
2302 executable('systemd-initctl',
2303 'src/initctl/initctl.c',
2304 include_directories : includes,
2305 link_with : [libshared],
2306 install_rpath : rootlibexecdir,
2308 install_dir : rootlibexecdir)
2310 exe = executable('systemd-mount',
2311 'src/mount/mount-tool.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2316 public_programs += [exe]
2318 meson.add_install_script(meson_make_symlink,
2319 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2321 exe = executable('systemd-run',
2323 include_directories : includes,
2324 link_with : [libshared],
2325 install_rpath : rootlibexecdir,
2327 public_programs += [exe]
2329 exe = executable('systemd-stdio-bridge',
2330 'src/stdio-bridge/stdio-bridge.c',
2331 include_directories : includes,
2332 link_with : [libshared],
2333 install_rpath : rootlibexecdir,
2335 public_programs += [exe]
2337 exe = executable('busctl',
2338 'src/busctl/busctl.c',
2339 'src/busctl/busctl-introspect.c',
2340 'src/busctl/busctl-introspect.h',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2345 public_programs += [exe]
2347 if conf.get('ENABLE_SYSUSERS') == 1
2348 exe = executable('systemd-sysusers',
2349 'src/sysusers/sysusers.c',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 install_rpath : rootlibexecdir,
2354 install_dir : rootbindir)
2355 public_programs += [exe]
2358 if conf.get('ENABLE_TMPFILES') == 1
2359 exe = executable('systemd-tmpfiles',
2360 'src/tmpfiles/tmpfiles.c',
2361 include_directories : includes,
2362 link_with : [libshared],
2363 dependencies : [libacl],
2364 install_rpath : rootlibexecdir,
2366 install_dir : rootbindir)
2367 public_programs += [exe]
2369 test('test-systemd-tmpfiles',
2370 test_systemd_tmpfiles_py,
2371 args : exe.full_path())
2372 # https://github.com/mesonbuild/meson/issues/2681
2375 if conf.get('ENABLE_HWDB') == 1
2376 exe = executable('systemd-hwdb',
2378 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2379 include_directories : includes,
2380 link_with : [libudev_static],
2381 install_rpath : udev_rpath,
2383 install_dir : rootbindir)
2384 public_programs += [exe]
2387 if conf.get('ENABLE_QUOTACHECK') == 1
2388 executable('systemd-quotacheck',
2389 'src/quotacheck/quotacheck.c',
2390 include_directories : includes,
2391 link_with : [libshared],
2392 install_rpath : rootlibexecdir,
2394 install_dir : rootlibexecdir)
2397 exe = executable('systemd-socket-proxyd',
2398 'src/socket-proxy/socket-proxyd.c',
2399 include_directories : includes,
2400 link_with : [libshared],
2401 dependencies : [threads],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootlibexecdir)
2405 public_programs += [exe]
2407 exe = executable('systemd-udevd',
2408 systemd_udevd_sources,
2409 include_directories : includes,
2410 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2411 link_with : [libudev_core,
2414 dependencies : [threads,
2419 install_rpath : udev_rpath,
2421 install_dir : rootlibexecdir)
2422 public_programs += [exe]
2424 exe = executable('udevadm',
2426 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2427 include_directories : includes,
2428 link_with : [libudev_core,
2431 dependencies : [threads,
2436 install_rpath : udev_rpath,
2438 install_dir : rootbindir)
2439 public_programs += [exe]
2441 executable('systemd-shutdown',
2442 systemd_shutdown_sources,
2443 include_directories : includes,
2444 link_with : [libshared],
2445 dependencies : [libmount],
2446 install_rpath : rootlibexecdir,
2448 install_dir : rootlibexecdir)
2450 executable('systemd-update-done',
2451 'src/update-done/update-done.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootlibexecdir)
2458 executable('systemd-update-utmp',
2459 'src/update-utmp/update-utmp.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 dependencies : [libaudit],
2463 install_rpath : rootlibexecdir,
2465 install_dir : rootlibexecdir)
2467 if conf.get('HAVE_KMOD') == 1
2468 executable('systemd-modules-load',
2469 'src/modules-load/modules-load.c',
2470 include_directories : includes,
2471 link_with : [libshared],
2472 dependencies : [libkmod],
2473 install_rpath : rootlibexecdir,
2475 install_dir : rootlibexecdir)
2477 meson.add_install_script('sh', '-c',
2478 mkdir_p.format(modulesloaddir))
2479 meson.add_install_script('sh', '-c',
2480 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2483 exe = executable('systemd-nspawn',
2484 systemd_nspawn_sources,
2485 'src/core/mount-setup.c', # FIXME: use a variable?
2486 'src/core/mount-setup.h',
2487 'src/core/loopback-setup.c',
2488 'src/core/loopback-setup.h',
2489 include_directories : includes,
2490 link_with : [libnspawn_core,
2492 dependencies : [libblkid],
2493 install_rpath : rootlibexecdir,
2495 public_programs += [exe]
2497 if conf.get('ENABLE_NETWORKD') == 1
2498 executable('systemd-networkd',
2499 systemd_networkd_sources,
2500 include_directories : includes,
2501 link_with : [libnetworkd_core,
2505 dependencies : [threads],
2506 install_rpath : rootlibexecdir,
2508 install_dir : rootlibexecdir)
2510 executable('systemd-networkd-wait-online',
2511 systemd_networkd_wait_online_sources,
2512 include_directories : includes,
2513 link_with : [libnetworkd_core,
2515 install_rpath : rootlibexecdir,
2517 install_dir : rootlibexecdir)
2519 exe = executable('networkctl',
2521 include_directories : includes,
2522 link_with : [libsystemd_network,
2524 install_rpath : rootlibexecdir,
2526 install_dir : rootbindir)
2527 public_programs += [exe]
2530 executable('systemd-sulogin-shell',
2531 ['src/sulogin-shell/sulogin-shell.c'],
2532 include_directories : includes,
2533 link_with : [libshared],
2534 install_rpath : rootlibexecdir,
2536 install_dir : rootlibexecdir)
2538 ############################################################
2540 foreach tuple : tests
2542 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2543 dependencies = tuple[2]
2544 condition = tuple.length() >= 4 ? tuple[3] : ''
2545 type = tuple.length() >= 5 ? tuple[4] : ''
2546 defs = tuple.length() >= 6 ? tuple[5] : []
2547 incs = tuple.length() >= 7 ? tuple[6] : includes
2550 name = sources[0].split('/')[-1].split('.')[0]
2551 if type.startswith('timeout=')
2552 timeout = type.split('=')[1].to_int()
2555 if want_tests == 'false'
2556 message('Not compiling @0@ because tests is set to false'.format(name))
2557 elif condition == '' or conf.get(condition) == 1
2561 include_directories : incs,
2562 link_with : link_with,
2563 dependencies : dependencies,
2565 install_rpath : rootlibexecdir,
2566 install : install_tests,
2567 install_dir : join_paths(testsdir, type))
2570 message('@0@ is a manual test'.format(name))
2571 elif type == 'unsafe' and want_tests != 'unsafe'
2572 message('@0@ is an unsafe test'.format(name))
2579 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2584 'test-libsystemd-sym',
2585 test_libsystemd_sym_c,
2586 include_directories : includes,
2587 link_with : [libsystemd],
2588 install : install_tests,
2589 install_dir : testsdir)
2590 test('test-libsystemd-sym', exe)
2593 'test-libsystemd-static-sym',
2594 test_libsystemd_sym_c,
2595 include_directories : includes,
2596 link_with : [install_libsystemd_static],
2597 dependencies : [threads], # threads is already included in dependencies on the library,
2598 # but does not seem to get propagated. Add here as a work-around.
2599 build_by_default : static_libsystemd_pic,
2600 install : install_tests and static_libsystemd_pic,
2601 install_dir : testsdir)
2602 if static_libsystemd_pic
2603 test('test-libsystemd-static-sym', exe)
2609 include_directories : includes,
2610 c_args : ['-Wno-deprecated-declarations'],
2611 link_with : [libudev],
2612 install : install_tests,
2613 install_dir : testsdir)
2614 test('test-libudev-sym', exe)
2617 'test-libudev-static-sym',
2619 include_directories : includes,
2620 c_args : ['-Wno-deprecated-declarations'],
2621 link_with : [install_libudev_static],
2622 build_by_default : static_libudev_pic,
2623 install : install_tests and static_libudev_pic,
2624 install_dir : testsdir)
2625 if static_libudev_pic
2626 test('test-libudev-static-sym', exe)
2629 ############################################################
2633 foreach tuple : fuzzers
2635 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2636 dependencies = tuple[2]
2637 defs = tuple.length() >= 4 ? tuple[3] : []
2638 incs = tuple.length() >= 5 ? tuple[4] : includes
2641 dependencies += fuzzing_engine
2643 sources += 'src/fuzz/fuzz-main.c'
2646 name = sources[0].split('/')[-1].split('.')[0]
2648 fuzzer_exes += executable(
2651 include_directories : [incs, include_directories('src/fuzz')],
2652 link_with : link_with,
2653 dependencies : dependencies,
2658 run_target('fuzzers',
2659 depends : fuzzer_exes,
2662 ############################################################
2664 make_directive_index_py = find_program('tools/make-directive-index.py')
2665 make_man_index_py = find_program('tools/make-man-index.py')
2666 xml_helper_py = find_program('tools/xml_helper.py')
2667 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2671 subdir('sysusers.d')
2672 subdir('tmpfiles.d')
2677 subdir('shell-completion/bash')
2678 subdir('shell-completion/zsh')
2679 subdir('doc/sysvinit')
2680 subdir('doc/var-log')
2682 # FIXME: figure out if the warning is true:
2683 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2684 install_subdir('factory/etc',
2685 install_dir : factorydir)
2688 install_data('xorg/50-systemd-user.sh',
2689 install_dir : xinitrcdir)
2690 install_data('modprobe.d/systemd.conf',
2691 install_dir : modprobedir)
2692 install_data('LICENSE.GPL2',
2697 'doc/DISTRO_PORTING',
2698 'doc/ENVIRONMENT.md',
2700 'doc/TRANSIENT-SETTINGS.md',
2703 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2704 install_dir : docdir)
2706 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2707 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2709 ############################################################
2711 meson_check_help = find_program('tools/meson-check-help.sh')
2713 foreach exec : public_programs
2714 name = exec.full_path().split('/')[-1]
2715 test('check-help-' + name,
2717 args : [exec.full_path()])
2720 ############################################################
2722 # Enable tests for all supported sanitizers
2723 foreach tuple : sanitizers
2724 sanitizer = tuple[0]
2727 have = run_command(check_compilation_sh,
2728 cc.cmd_array(), '-x', 'c',
2729 '-fsanitize=@0@'.format(sanitizer),
2730 '-include', link_test_c).returncode() == 0
2731 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2735 foreach p : fuzz_regression_tests
2736 b = p.split('/')[-2]
2737 c = p.split('/')[-1]
2739 name = '@0@:@1@'.format(b, sanitizer)
2742 if want_tests == 'false'
2743 message('Not compiling @0@ because tests is set to false'.format(name))
2745 exe = custom_target(
2749 command : [env, 'ln', '-fs',
2750 join_paths(build.full_path(), b),
2752 build_by_default : true)
2754 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2759 if want_tests != 'false' and slow_tests
2760 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2762 args : [exe.full_path(),
2763 join_paths(meson.source_root(),
2764 'test/fuzz-regressions',
2772 ############################################################
2775 all_files = run_command(
2777 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2780 all_files = files(all_files.stdout().split())
2785 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2788 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2792 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2795 command : [meson_git_contrib_sh])
2799 git_head = run_command(
2801 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2802 'rev-parse', 'HEAD']).stdout().strip()
2803 git_head_short = run_command(
2805 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2806 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2810 command : ['git', 'archive',
2811 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2813 '--prefix', 'systemd-@0@/'.format(git_head),
2817 ############################################################
2819 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2822 depends : [man, libsystemd, libudev],
2823 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2825 ############################################################
2828 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2830 'split /usr: @0@'.format(split_usr),
2831 'split bin-sbin: @0@'.format(split_bin),
2832 'prefix directory: @0@'.format(prefixdir),
2833 'rootprefix directory: @0@'.format(rootprefixdir),
2834 'sysconf directory: @0@'.format(sysconfdir),
2835 'include directory: @0@'.format(includedir),
2836 'lib directory: @0@'.format(libdir),
2837 'rootlib directory: @0@'.format(rootlibdir),
2838 'SysV init scripts: @0@'.format(sysvinit_path),
2839 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2840 'PAM modules directory: @0@'.format(pamlibdir),
2841 'PAM configuration directory: @0@'.format(pamconfdir),
2842 'RPM macros directory: @0@'.format(rpmmacrosdir),
2843 'modprobe.d directory: @0@'.format(modprobedir),
2844 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2845 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2846 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2847 'bash completions directory: @0@'.format(bashcompletiondir),
2848 'zsh completions directory: @0@'.format(zshcompletiondir),
2849 'extra start script: @0@'.format(get_option('rc-local')),
2850 'extra stop script: @0@'.format(get_option('halt-local')),
2851 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2852 get_option('debug-tty')),
2853 'TTY GID: @0@'.format(tty_gid),
2854 'users GID: @0@'.format(users_gid),
2855 'maximum system UID: @0@'.format(system_uid_max),
2856 'maximum system GID: @0@'.format(system_gid_max),
2857 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2858 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2859 'minimum container UID base: @0@'.format(container_uid_base_min),
2860 'maximum container UID base: @0@'.format(container_uid_base_max),
2861 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2862 'render group access mode: @0@'.format(get_option('group-render-mode')),
2863 'certificate root directory: @0@'.format(get_option('certificate-root')),
2864 'support URL: @0@'.format(support_url),
2865 'nobody user name: @0@'.format(nobody_user),
2866 'nobody group name: @0@'.format(nobody_group),
2867 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2868 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2870 'default DNSSEC mode: @0@'.format(default_dnssec),
2871 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2872 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2873 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2875 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2876 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2878 'default DNS servers: @0@'.format(alt_dns_servers),
2879 'default NTP servers: @0@'.format(alt_ntp_servers)]
2881 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2882 '@@0@'.format(time_epoch)).stdout().strip()
2884 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2887 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2888 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2889 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2891 if conf.get('ENABLE_EFI') == 1
2893 'efi arch: @0@'.format(efi_arch)]
2897 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2898 'EFI CC @0@'.format(efi_cc),
2899 'EFI lib directory: @0@'.format(efi_libdir),
2900 'EFI lds directory: @0@'.format(efi_ldsdir),
2901 'EFI include directory: @0@'.format(efi_incdir)]
2955 ['legacy pkla', install_polkit_pkla],
2957 ['gnu-efi', have_gnu_efi],
2964 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2967 ['man pages', want_man],
2968 ['html pages', want_html],
2969 ['man page indices', want_man and have_lxml],
2974 ['adm group', get_option('adm-group')],
2975 ['wheel group', get_option('wheel-group')],
2978 ['debug mmap cache'],
2979 ['valgrind', conf.get('VALGRIND') == 1],
2982 if tuple.length() >= 2
2985 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2986 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2987 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2992 missing += [tuple[0]]
2998 'enabled features: @0@'.format(', '.join(found)),
3000 'disabled features: @0@'.format(', '.join(missing)),
3002 message('\n '.join(status))
3004 if rootprefixdir != rootprefix_default
3006 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3007 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3008 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))