1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.44',
15 libsystemd_version = '0.23.0'
16 libudev_version = '1.6.11'
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 dev_kvm_mode = get_option('dev-kvm-mode')
745 substs.set('DEV_KVM_MODE', dev_kvm_mode)
746 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
747 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
749 kill_user_processes = get_option('default-kill-user-processes')
750 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
751 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
752 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
754 dns_servers = get_option('dns-servers')
755 conf.set_quoted('DNS_SERVERS', dns_servers)
756 substs.set('DNS_SERVERS', dns_servers)
758 ntp_servers = get_option('ntp-servers')
759 conf.set_quoted('NTP_SERVERS', ntp_servers)
760 substs.set('NTP_SERVERS', ntp_servers)
762 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
764 substs.set('SUSHELL', get_option('debug-shell'))
765 substs.set('DEBUGTTY', get_option('debug-tty'))
767 enable_debug_hashmap = false
768 enable_debug_mmap_cache = false
769 foreach name : get_option('debug')
771 enable_debug_hashmap = true
772 elif name == 'mmap-cache'
773 enable_debug_mmap_cache = true
775 message('unknown debug option "@0@", ignoring'.format(name))
778 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
779 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
781 conf.set10('VALGRIND', get_option('valgrind'))
783 #####################################################################
785 threads = dependency('threads')
786 librt = cc.find_library('rt')
787 libm = cc.find_library('m')
788 libdl = cc.find_library('dl')
789 libcrypt = cc.find_library('crypt')
791 libcap = dependency('libcap', required : false)
792 if not libcap.found()
793 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
794 libcap = cc.find_library('cap')
797 libmount = dependency('mount',
798 version : fuzzer_build ? '>= 0' : '>= 2.30')
800 want_seccomp = get_option('seccomp')
801 if want_seccomp != 'false' and not fuzzer_build
802 libseccomp = dependency('libseccomp',
803 version : '>= 2.3.1',
804 required : want_seccomp == 'true')
805 have = libseccomp.found()
810 conf.set10('HAVE_SECCOMP', have)
812 want_selinux = get_option('selinux')
813 if want_selinux != 'false' and not fuzzer_build
814 libselinux = dependency('libselinux',
815 version : '>= 2.1.9',
816 required : want_selinux == 'true')
817 have = libselinux.found()
822 conf.set10('HAVE_SELINUX', have)
824 want_apparmor = get_option('apparmor')
825 if want_apparmor != 'false' and not fuzzer_build
826 libapparmor = dependency('libapparmor',
827 required : want_apparmor == 'true')
828 have = libapparmor.found()
833 conf.set10('HAVE_APPARMOR', have)
835 smack_run_label = get_option('smack-run-label')
836 if smack_run_label != ''
837 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
840 want_polkit = get_option('polkit')
841 install_polkit = false
842 install_polkit_pkla = false
843 if want_polkit != 'false' and not fuzzer_build
844 install_polkit = true
846 libpolkit = dependency('polkit-gobject-1',
848 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
849 message('Old polkit detected, will install pkla files')
850 install_polkit_pkla = true
853 conf.set10('ENABLE_POLKIT', install_polkit)
855 want_acl = get_option('acl')
856 if want_acl != 'false' and not fuzzer_build
857 libacl = cc.find_library('acl', required : want_acl == 'true')
858 have = libacl.found()
863 conf.set10('HAVE_ACL', have)
865 want_audit = get_option('audit')
866 if want_audit != 'false' and not fuzzer_build
867 libaudit = dependency('audit', required : want_audit == 'true')
868 have = libaudit.found()
873 conf.set10('HAVE_AUDIT', have)
875 want_blkid = get_option('blkid')
876 if want_blkid != 'false' and not fuzzer_build
877 libblkid = dependency('blkid', required : want_blkid == 'true')
878 have = libblkid.found()
883 conf.set10('HAVE_BLKID', have)
885 want_kmod = get_option('kmod')
886 if want_kmod != 'false' and not fuzzer_build
887 libkmod = dependency('libkmod',
889 required : want_kmod == 'true')
890 have = libkmod.found()
895 conf.set10('HAVE_KMOD', have)
897 want_pam = get_option('pam')
898 if want_pam != 'false' and not fuzzer_build
899 libpam = cc.find_library('pam', required : want_pam == 'true')
900 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
901 have = libpam.found() and libpam_misc.found()
907 conf.set10('HAVE_PAM', have)
909 want_microhttpd = get_option('microhttpd')
910 if want_microhttpd != 'false' and not fuzzer_build
911 libmicrohttpd = dependency('libmicrohttpd',
912 version : '>= 0.9.33',
913 required : want_microhttpd == 'true')
914 have = libmicrohttpd.found()
919 conf.set10('HAVE_MICROHTTPD', have)
921 want_libcryptsetup = get_option('libcryptsetup')
922 if want_libcryptsetup != 'false' and not fuzzer_build
923 libcryptsetup = dependency('libcryptsetup',
924 version : '>= 1.6.0',
925 required : want_libcryptsetup == 'true')
926 have = libcryptsetup.found()
931 conf.set10('HAVE_LIBCRYPTSETUP', have)
933 want_libcurl = get_option('libcurl')
934 if want_libcurl != 'false' and not fuzzer_build
935 libcurl = dependency('libcurl',
936 version : '>= 7.32.0',
937 required : want_libcurl == 'true')
938 have = libcurl.found()
943 conf.set10('HAVE_LIBCURL', have)
945 want_libidn = get_option('libidn')
946 want_libidn2 = get_option('libidn2')
947 if want_libidn == 'true' and want_libidn2 == 'true'
948 error('libidn and libidn2 cannot be requested simultaneously')
951 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
952 libidn = dependency('libidn',
953 required : want_libidn == 'true')
954 have = libidn.found()
959 conf.set10('HAVE_LIBIDN', have)
960 if not have and want_libidn2 != 'false' and not fuzzer_build
961 # libidn is used for both libidn and libidn2 objects
962 libidn = dependency('libidn2',
963 required : want_libidn2 == 'true')
964 have = libidn.found()
968 conf.set10('HAVE_LIBIDN2', have)
970 want_libiptc = get_option('libiptc')
971 if want_libiptc != 'false' and not fuzzer_build
972 libiptc = dependency('libiptc',
973 required : want_libiptc == 'true')
974 have = libiptc.found()
979 conf.set10('HAVE_LIBIPTC', have)
981 want_qrencode = get_option('qrencode')
982 if want_qrencode != 'false' and not fuzzer_build
983 libqrencode = dependency('libqrencode',
984 required : want_qrencode == 'true')
985 have = libqrencode.found()
990 conf.set10('HAVE_QRENCODE', have)
992 want_gcrypt = get_option('gcrypt')
993 if want_gcrypt != 'false' and not fuzzer_build
994 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
995 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
996 have = libgcrypt.found() and libgpg_error.found()
1001 # link to neither of the libs if one is not found
1005 conf.set10('HAVE_GCRYPT', have)
1007 want_gnutls = get_option('gnutls')
1008 if want_gnutls != 'false' and not fuzzer_build
1009 libgnutls = dependency('gnutls',
1010 version : '>= 3.1.4',
1011 required : want_gnutls == 'true')
1012 have = libgnutls.found()
1017 conf.set10('HAVE_GNUTLS', have)
1019 want_elfutils = get_option('elfutils')
1020 if want_elfutils != 'false' and not fuzzer_build
1021 libdw = dependency('libdw',
1022 required : want_elfutils == 'true')
1023 have = libdw.found()
1028 conf.set10('HAVE_ELFUTILS', have)
1030 want_zlib = get_option('zlib')
1031 if want_zlib != 'false' and not fuzzer_build
1032 libz = dependency('zlib',
1033 required : want_zlib == 'true')
1039 conf.set10('HAVE_ZLIB', have)
1041 want_bzip2 = get_option('bzip2')
1042 if want_bzip2 != 'false' and not fuzzer_build
1043 libbzip2 = cc.find_library('bz2',
1044 required : want_bzip2 == 'true')
1045 have = libbzip2.found()
1050 conf.set10('HAVE_BZIP2', have)
1052 want_xz = get_option('xz')
1053 if want_xz != 'false' and not fuzzer_build
1054 libxz = dependency('liblzma',
1055 required : want_xz == 'true')
1056 have = libxz.found()
1061 conf.set10('HAVE_XZ', have)
1063 want_lz4 = get_option('lz4')
1064 if want_lz4 != 'false' and not fuzzer_build
1065 liblz4 = dependency('liblz4',
1066 required : want_lz4 == 'true')
1067 have = liblz4.found()
1072 conf.set10('HAVE_LZ4', have)
1074 want_xkbcommon = get_option('xkbcommon')
1075 if want_xkbcommon != 'false' and not fuzzer_build
1076 libxkbcommon = dependency('xkbcommon',
1077 version : '>= 0.3.0',
1078 required : want_xkbcommon == 'true')
1079 have = libxkbcommon.found()
1084 conf.set10('HAVE_XKBCOMMON', have)
1086 want_pcre2 = get_option('pcre2')
1087 if want_pcre2 != 'false'
1088 libpcre2 = dependency('libpcre2-8',
1089 required : want_pcre2 == 'true')
1090 have = libpcre2.found()
1095 conf.set10('HAVE_PCRE2', have)
1097 want_glib = get_option('glib')
1098 if want_glib != 'false' and not fuzzer_build
1099 libglib = dependency('glib-2.0',
1100 version : '>= 2.22.0',
1101 required : want_glib == 'true')
1102 libgobject = dependency('gobject-2.0',
1103 version : '>= 2.22.0',
1104 required : want_glib == 'true')
1105 libgio = dependency('gio-2.0',
1106 required : want_glib == 'true')
1107 have = libglib.found() and libgobject.found() and libgio.found()
1114 conf.set10('HAVE_GLIB', have)
1116 want_dbus = get_option('dbus')
1117 if want_dbus != 'false' and not fuzzer_build
1118 libdbus = dependency('dbus-1',
1119 version : '>= 1.3.2',
1120 required : want_dbus == 'true')
1121 have = libdbus.found()
1126 conf.set10('HAVE_DBUS', have)
1128 default_dnssec = get_option('default-dnssec')
1130 default_dnssec = 'no'
1132 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1133 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1134 default_dnssec = 'no'
1136 conf.set('DEFAULT_DNSSEC_MODE',
1137 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1138 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1140 dns_over_tls = get_option('dns-over-tls')
1141 if dns_over_tls != 'false'
1142 have = (conf.get('HAVE_GNUTLS') == 1 and
1143 libgnutls.version().version_compare('>=3.5.3'))
1144 if dns_over_tls == 'true' and not have
1145 error('DNS-over-TLS support was requested, but dependencies are not available')
1150 conf.set10('ENABLE_DNS_OVER_TLS', have)
1152 default_dns_over_tls = get_option('default-dns-over-tls')
1154 default_dns_over_tls = 'no'
1156 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1157 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1158 default_dns_over_tls = 'no'
1160 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1161 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1162 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1164 want_importd = get_option('importd')
1165 if want_importd != 'false'
1166 have = (conf.get('HAVE_LIBCURL') == 1 and
1167 conf.get('HAVE_ZLIB') == 1 and
1168 conf.get('HAVE_BZIP2') == 1 and
1169 conf.get('HAVE_XZ') == 1 and
1170 conf.get('HAVE_GCRYPT') == 1)
1171 if want_importd == 'true' and not have
1172 error('importd support was requested, but dependencies are not available')
1177 conf.set10('ENABLE_IMPORTD', have)
1179 want_remote = get_option('remote')
1180 if want_remote != 'false'
1181 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1182 conf.get('HAVE_LIBCURL') == 1]
1183 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1184 # it's possible to build one without the other. Complain only if
1185 # support was explictly requested. The auxiliary files like sysusers
1186 # config should be installed when any of the programs are built.
1187 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1188 error('remote support was requested, but dependencies are not available')
1190 have = have_deps[0] or have_deps[1]
1194 conf.set10('ENABLE_REMOTE', have)
1196 foreach term : ['utmp',
1228 have = get_option(term)
1229 name = 'ENABLE_' + term.underscorify().to_upper()
1230 conf.set10(name, have)
1233 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1235 want_tests = get_option('tests')
1236 install_tests = get_option('install-tests')
1237 slow_tests = get_option('slow-tests')
1241 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1243 #####################################################################
1245 if get_option('efi')
1246 efi_arch = host_machine.cpu_family()
1248 if efi_arch == 'x86'
1249 EFI_MACHINE_TYPE_NAME = 'ia32'
1250 gnu_efi_arch = 'ia32'
1251 elif efi_arch == 'x86_64'
1252 EFI_MACHINE_TYPE_NAME = 'x64'
1253 gnu_efi_arch = 'x86_64'
1254 elif efi_arch == 'arm'
1255 EFI_MACHINE_TYPE_NAME = 'arm'
1256 gnu_efi_arch = 'arm'
1257 elif efi_arch == 'aarch64'
1258 EFI_MACHINE_TYPE_NAME = 'aa64'
1259 gnu_efi_arch = 'aarch64'
1261 EFI_MACHINE_TYPE_NAME = ''
1266 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1268 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1272 conf.set10('ENABLE_EFI', have)
1274 #####################################################################
1276 config_h = configure_file(
1277 output : 'config.h',
1278 configuration : conf)
1280 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1282 includes = include_directories('src/basic',
1286 'src/journal-remote',
1290 'src/time-wait-sync',
1295 'src/libsystemd/sd-bus',
1296 'src/libsystemd/sd-device',
1297 'src/libsystemd/sd-hwdb',
1298 'src/libsystemd/sd-id128',
1299 'src/libsystemd/sd-netlink',
1300 'src/libsystemd/sd-network',
1301 'src/libsystemd-network',
1304 add_project_arguments('-include', 'config.h', language : 'c')
1308 subdir('src/systemd')
1310 subdir('src/libsystemd')
1311 subdir('src/libsystemd-network')
1312 subdir('src/journal')
1315 libjournal_core = static_library(
1317 libjournal_core_sources,
1319 include_directories : includes,
1322 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1323 libsystemd = shared_library(
1325 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1326 version : libsystemd_version,
1327 include_directories : includes,
1328 link_args : ['-shared',
1329 '-Wl,--version-script=' + libsystemd_sym_path],
1330 link_with : [libbasic,
1332 link_whole : [libsystemd_static,
1334 dependencies : [threads,
1338 link_depends : libsystemd_sym,
1340 install_dir : rootlibdir)
1342 static_libsystemd = get_option('static-libsystemd')
1343 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1345 install_libsystemd_static = static_library(
1348 journal_client_sources,
1350 basic_gcrypt_sources,
1351 include_directories : includes,
1352 build_by_default : static_libsystemd != 'false',
1353 install : static_libsystemd != 'false',
1354 install_dir : rootlibdir,
1355 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1356 dependencies : [threads,
1365 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1367 ############################################################
1369 # binaries that have --help and are intended for use by humans,
1370 # usually, but not always, installed in /bin.
1371 public_programs = []
1373 subdir('src/libudev')
1374 subdir('src/shared')
1377 subdir('src/network')
1379 subdir('src/analyze')
1380 subdir('src/journal-remote')
1381 subdir('src/coredump')
1382 subdir('src/hostname')
1383 subdir('src/import')
1384 subdir('src/kernel-install')
1385 subdir('src/locale')
1386 subdir('src/machine')
1387 subdir('src/portable')
1388 subdir('src/nspawn')
1389 subdir('src/resolve')
1390 subdir('src/timedate')
1391 subdir('src/timesync')
1392 subdir('src/vconsole')
1393 subdir('src/boot/efi')
1400 ############################################################
1402 # only static linking apart from libdl, to make sure that the
1403 # module is linked to all libraries that it uses.
1404 test_dlopen = executable(
1407 include_directories : includes,
1408 link_with : [libbasic],
1409 dependencies : [libdl])
1411 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1412 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1413 ['mymachines', 'ENABLE_MACHINED'],
1414 ['resolve', 'ENABLE_RESOLVE']]
1416 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1420 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1421 version_script_arg = join_paths(meson.current_source_dir(), sym)
1423 nss = shared_library(
1425 'src/nss-@0@/nss-@0@.c'.format(module),
1427 include_directories : includes,
1428 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1429 link_args : ['-Wl,-z,nodelete',
1431 '-Wl,--version-script=' + version_script_arg,
1433 link_with : [libsystemd_static,
1435 dependencies : [threads,
1439 install_dir : rootlibdir)
1441 # We cannot use shared_module because it does not support version suffix.
1442 # Unfortunately shared_library insists on creating the symlink…
1443 meson.add_install_script('sh', '-c',
1444 'rm $DESTDIR@0@/libnss_@1@.so'
1445 .format(rootlibdir, module))
1447 test('dlopen-nss_' + module,
1449 args : [nss.full_path()]) # path to dlopen must include a slash
1453 ############################################################
1455 executable('systemd',
1457 include_directories : includes,
1458 link_with : [libcore,
1460 dependencies : [threads,
1466 install_rpath : rootlibexecdir,
1468 install_dir : rootlibexecdir)
1470 meson.add_install_script(meson_make_symlink,
1471 join_paths(rootlibexecdir, 'systemd'),
1472 join_paths(rootsbindir, 'init'))
1474 exe = executable('systemd-analyze',
1475 systemd_analyze_sources,
1476 include_directories : includes,
1477 link_with : [libcore,
1479 dependencies : [threads,
1485 install_rpath : rootlibexecdir,
1487 public_programs += [exe]
1489 executable('systemd-journald',
1490 systemd_journald_sources,
1491 include_directories : includes,
1492 link_with : [libjournal_core,
1494 dependencies : [threads,
1498 install_rpath : rootlibexecdir,
1500 install_dir : rootlibexecdir)
1502 exe = executable('systemd-cat',
1503 systemd_cat_sources,
1504 include_directories : includes,
1505 link_with : [libjournal_core,
1507 dependencies : [threads],
1508 install_rpath : rootlibexecdir,
1510 public_programs += [exe]
1512 exe = executable('journalctl',
1514 include_directories : includes,
1515 link_with : [libshared],
1516 dependencies : [threads,
1521 install_rpath : rootlibexecdir,
1523 install_dir : rootbindir)
1524 public_programs += [exe]
1526 executable('systemd-getty-generator',
1527 'src/getty-generator/getty-generator.c',
1528 include_directories : includes,
1529 link_with : [libshared],
1530 install_rpath : rootlibexecdir,
1532 install_dir : systemgeneratordir)
1534 executable('systemd-debug-generator',
1535 'src/debug-generator/debug-generator.c',
1536 include_directories : includes,
1537 link_with : [libshared],
1538 install_rpath : rootlibexecdir,
1540 install_dir : systemgeneratordir)
1542 executable('systemd-fstab-generator',
1543 'src/fstab-generator/fstab-generator.c',
1544 'src/core/mount-setup.c',
1545 include_directories : includes,
1546 link_with : [libshared],
1547 install_rpath : rootlibexecdir,
1549 install_dir : systemgeneratordir)
1551 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1552 executable('30-systemd-environment-d-generator',
1553 'src/environment-d-generator/environment-d-generator.c',
1554 include_directories : includes,
1555 link_with : [libshared],
1556 install_rpath : rootlibexecdir,
1558 install_dir : userenvgeneratordir)
1560 meson.add_install_script(meson_make_symlink,
1561 join_paths(sysconfdir, 'environment'),
1562 join_paths(environmentdir, '99-environment.conf'))
1565 if conf.get('ENABLE_HIBERNATE') == 1
1566 executable('systemd-hibernate-resume-generator',
1567 'src/hibernate-resume/hibernate-resume-generator.c',
1568 include_directories : includes,
1569 link_with : [libshared],
1570 install_rpath : rootlibexecdir,
1572 install_dir : systemgeneratordir)
1574 executable('systemd-hibernate-resume',
1575 'src/hibernate-resume/hibernate-resume.c',
1576 include_directories : includes,
1577 link_with : [libshared],
1578 install_rpath : rootlibexecdir,
1580 install_dir : rootlibexecdir)
1583 if conf.get('HAVE_BLKID') == 1
1584 executable('systemd-gpt-auto-generator',
1585 'src/gpt-auto-generator/gpt-auto-generator.c',
1586 'src/basic/blkid-util.h',
1587 include_directories : includes,
1588 link_with : [libshared],
1589 dependencies : libblkid,
1590 install_rpath : rootlibexecdir,
1592 install_dir : systemgeneratordir)
1594 exe = executable('systemd-dissect',
1595 'src/dissect/dissect.c',
1596 include_directories : includes,
1597 link_with : [libshared],
1598 install_rpath : rootlibexecdir,
1600 install_dir : rootlibexecdir)
1601 public_programs += [exe]
1604 if conf.get('ENABLE_RESOLVE') == 1
1605 executable('systemd-resolved',
1606 systemd_resolved_sources,
1607 include_directories : includes,
1608 link_with : [libshared,
1610 libsystemd_resolve_core],
1611 dependencies : systemd_resolved_dependencies,
1612 install_rpath : rootlibexecdir,
1614 install_dir : rootlibexecdir)
1616 exe = executable('resolvectl',
1618 include_directories : includes,
1619 link_with : [libshared,
1621 libsystemd_resolve_core],
1622 dependencies : [threads,
1626 install_rpath : rootlibexecdir,
1628 public_programs += [exe]
1630 meson.add_install_script(meson_make_symlink,
1631 join_paths(bindir, 'resolvectl'),
1632 join_paths(rootsbindir, 'resolvconf'))
1634 meson.add_install_script(meson_make_symlink,
1635 join_paths(bindir, 'resolvectl'),
1636 join_paths(bindir, 'systemd-resolve'))
1639 if conf.get('ENABLE_LOGIND') == 1
1640 executable('systemd-logind',
1641 systemd_logind_sources,
1642 include_directories : includes,
1643 link_with : [liblogind_core,
1645 dependencies : [threads,
1647 install_rpath : rootlibexecdir,
1649 install_dir : rootlibexecdir)
1651 exe = executable('loginctl',
1653 include_directories : includes,
1654 link_with : [libshared],
1655 dependencies : [threads,
1658 install_rpath : rootlibexecdir,
1660 install_dir : rootbindir)
1661 public_programs += [exe]
1663 exe = executable('systemd-inhibit',
1664 'src/login/inhibit.c',
1665 include_directories : includes,
1666 link_with : [libshared],
1667 install_rpath : rootlibexecdir,
1669 install_dir : rootbindir)
1670 public_programs += [exe]
1672 if conf.get('HAVE_PAM') == 1
1673 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1674 pam_systemd = shared_library(
1678 include_directories : includes,
1679 link_args : ['-shared',
1680 '-Wl,--version-script=' + version_script_arg],
1681 link_with : [libsystemd_static,
1683 dependencies : [threads,
1686 link_depends : pam_systemd_sym,
1688 install_dir : pamlibdir)
1690 test('dlopen-pam_systemd',
1692 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1696 executable('systemd-user-runtime-dir',
1697 user_runtime_dir_sources,
1698 include_directories : includes,
1699 link_with : [libshared, liblogind_core],
1700 install_rpath : rootlibexecdir,
1702 install_dir : rootlibexecdir)
1704 if conf.get('HAVE_PAM') == 1
1705 executable('systemd-user-sessions',
1706 'src/user-sessions/user-sessions.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 install_rpath : rootlibexecdir,
1711 install_dir : rootlibexecdir)
1714 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1715 exe = executable('bootctl',
1716 'src/boot/bootctl.c',
1717 include_directories : includes,
1718 link_with : [libshared],
1719 dependencies : [libblkid],
1720 install_rpath : rootlibexecdir,
1722 public_programs += [exe]
1725 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1726 include_directories : includes,
1727 link_with : [libshared],
1728 dependencies : [threads],
1729 install_rpath : rootlibexecdir,
1731 public_programs += [exe]
1734 if get_option('link-systemctl-shared')
1735 systemctl_link_with = [libshared]
1737 systemctl_link_with = [libsystemd_static,
1743 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1744 include_directories : includes,
1745 link_with : systemctl_link_with,
1746 dependencies : [threads,
1751 install_rpath : rootlibexecdir,
1753 install_dir : rootbindir)
1754 public_programs += [exe]
1756 if conf.get('ENABLE_PORTABLED') == 1
1757 executable('systemd-portabled',
1758 systemd_portabled_sources,
1759 include_directories : includes,
1760 link_with : [libshared],
1761 dependencies : [threads],
1762 install_rpath : rootlibexecdir,
1764 install_dir : rootlibexecdir)
1766 exe = executable('portablectl', 'src/portable/portablectl.c',
1767 include_directories : includes,
1768 link_with : [libshared],
1769 dependencies : [threads],
1770 install_rpath : rootlibexecdir,
1772 install_dir : rootlibexecdir)
1773 public_programs += [exe]
1776 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1777 meson.add_install_script(meson_make_symlink,
1778 join_paths(rootbindir, 'systemctl'),
1779 join_paths(rootsbindir, alias))
1782 if conf.get('ENABLE_BACKLIGHT') == 1
1783 executable('systemd-backlight',
1784 'src/backlight/backlight.c',
1785 include_directories : includes,
1786 link_with : [libshared],
1787 install_rpath : rootlibexecdir,
1789 install_dir : rootlibexecdir)
1792 if conf.get('ENABLE_RFKILL') == 1
1793 executable('systemd-rfkill',
1794 'src/rfkill/rfkill.c',
1795 include_directories : includes,
1796 link_with : [libshared],
1797 install_rpath : rootlibexecdir,
1799 install_dir : rootlibexecdir)
1802 executable('systemd-system-update-generator',
1803 'src/system-update-generator/system-update-generator.c',
1804 include_directories : includes,
1805 link_with : [libshared],
1806 install_rpath : rootlibexecdir,
1808 install_dir : systemgeneratordir)
1810 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1811 executable('systemd-cryptsetup',
1812 'src/cryptsetup/cryptsetup.c',
1813 include_directories : includes,
1814 link_with : [libshared],
1815 dependencies : [libcryptsetup],
1816 install_rpath : rootlibexecdir,
1818 install_dir : rootlibexecdir)
1820 executable('systemd-cryptsetup-generator',
1821 'src/cryptsetup/cryptsetup-generator.c',
1822 include_directories : includes,
1823 link_with : [libshared],
1824 dependencies : [libcryptsetup],
1825 install_rpath : rootlibexecdir,
1827 install_dir : systemgeneratordir)
1829 executable('systemd-veritysetup',
1830 'src/veritysetup/veritysetup.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 dependencies : [libcryptsetup],
1834 install_rpath : rootlibexecdir,
1836 install_dir : rootlibexecdir)
1838 executable('systemd-veritysetup-generator',
1839 'src/veritysetup/veritysetup-generator.c',
1840 include_directories : includes,
1841 link_with : [libshared],
1842 dependencies : [libcryptsetup],
1843 install_rpath : rootlibexecdir,
1845 install_dir : systemgeneratordir)
1848 if conf.get('HAVE_SYSV_COMPAT') == 1
1849 executable('systemd-sysv-generator',
1850 'src/sysv-generator/sysv-generator.c',
1851 include_directories : includes,
1852 link_with : [libshared],
1853 install_rpath : rootlibexecdir,
1855 install_dir : systemgeneratordir)
1857 executable('systemd-rc-local-generator',
1858 'src/rc-local-generator/rc-local-generator.c',
1859 include_directories : includes,
1860 link_with : [libshared],
1861 install_rpath : rootlibexecdir,
1863 install_dir : systemgeneratordir)
1866 if conf.get('ENABLE_HOSTNAMED') == 1
1867 executable('systemd-hostnamed',
1868 'src/hostname/hostnamed.c',
1869 include_directories : includes,
1870 link_with : [libshared],
1871 install_rpath : rootlibexecdir,
1873 install_dir : rootlibexecdir)
1875 exe = executable('hostnamectl',
1876 'src/hostname/hostnamectl.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 install_rpath : rootlibexecdir,
1881 public_programs += [exe]
1884 if conf.get('ENABLE_LOCALED') == 1
1885 if conf.get('HAVE_XKBCOMMON') == 1
1886 # logind will load libxkbcommon.so dynamically on its own
1892 executable('systemd-localed',
1893 systemd_localed_sources,
1894 include_directories : includes,
1895 link_with : [libshared],
1896 dependencies : deps,
1897 install_rpath : rootlibexecdir,
1899 install_dir : rootlibexecdir)
1901 exe = executable('localectl',
1903 include_directories : includes,
1904 link_with : [libshared],
1905 install_rpath : rootlibexecdir,
1907 public_programs += [exe]
1910 if conf.get('ENABLE_TIMEDATED') == 1
1911 executable('systemd-timedated',
1912 'src/timedate/timedated.c',
1913 include_directories : includes,
1914 link_with : [libshared],
1915 install_rpath : rootlibexecdir,
1917 install_dir : rootlibexecdir)
1920 if conf.get('ENABLE_TIMEDATECTL') == 1
1921 exe = executable('timedatectl',
1922 'src/timedate/timedatectl.c',
1923 include_directories : includes,
1924 install_rpath : rootlibexecdir,
1925 link_with : [libshared],
1926 dependencies : [libm],
1928 public_programs += [exe]
1931 if conf.get('ENABLE_TIMESYNCD') == 1
1932 executable('systemd-timesyncd',
1933 systemd_timesyncd_sources,
1934 include_directories : includes,
1935 link_with : [libshared],
1936 dependencies : [threads,
1938 install_rpath : rootlibexecdir,
1940 install_dir : rootlibexecdir)
1942 executable('systemd-time-wait-sync',
1943 'src/time-wait-sync/time-wait-sync.c',
1944 include_directories : includes,
1945 link_with : [libshared],
1946 install_rpath : rootlibexecdir,
1948 install_dir : rootlibexecdir)
1951 if conf.get('ENABLE_MACHINED') == 1
1952 executable('systemd-machined',
1953 systemd_machined_sources,
1954 include_directories : includes,
1955 link_with : [libmachine_core,
1957 install_rpath : rootlibexecdir,
1959 install_dir : rootlibexecdir)
1961 exe = executable('machinectl',
1962 'src/machine/machinectl.c',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [threads,
1968 install_rpath : rootlibexecdir,
1970 install_dir : rootbindir)
1971 public_programs += [exe]
1974 if conf.get('ENABLE_IMPORTD') == 1
1975 executable('systemd-importd',
1976 systemd_importd_sources,
1977 include_directories : includes,
1978 link_with : [libshared],
1979 dependencies : [threads],
1980 install_rpath : rootlibexecdir,
1982 install_dir : rootlibexecdir)
1984 systemd_pull = executable('systemd-pull',
1985 systemd_pull_sources,
1986 include_directories : includes,
1987 link_with : [libshared],
1988 dependencies : [libcurl,
1993 install_rpath : rootlibexecdir,
1995 install_dir : rootlibexecdir)
1997 systemd_import = executable('systemd-import',
1998 systemd_import_sources,
1999 include_directories : includes,
2000 link_with : [libshared],
2001 dependencies : [libcurl,
2005 install_rpath : rootlibexecdir,
2007 install_dir : rootlibexecdir)
2009 systemd_export = executable('systemd-export',
2010 systemd_export_sources,
2011 include_directories : includes,
2012 link_with : [libshared],
2013 dependencies : [libcurl,
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2020 public_programs += [systemd_pull, systemd_import, systemd_export]
2023 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2024 exe = executable('systemd-journal-upload',
2025 systemd_journal_upload_sources,
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [threads,
2033 install_rpath : rootlibexecdir,
2035 install_dir : rootlibexecdir)
2036 public_programs += [exe]
2039 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2040 s_j_remote = executable('systemd-journal-remote',
2041 systemd_journal_remote_sources,
2042 include_directories : includes,
2043 link_with : [libshared,
2044 libsystemd_journal_remote],
2045 dependencies : [threads,
2050 install_rpath : rootlibexecdir,
2052 install_dir : rootlibexecdir)
2054 s_j_gatewayd = executable('systemd-journal-gatewayd',
2055 systemd_journal_gatewayd_sources,
2056 include_directories : includes,
2057 link_with : [libshared],
2058 dependencies : [threads,
2063 install_rpath : rootlibexecdir,
2065 install_dir : rootlibexecdir)
2066 public_programs += [s_j_remote, s_j_gatewayd]
2069 if conf.get('ENABLE_COREDUMP') == 1
2070 executable('systemd-coredump',
2071 systemd_coredump_sources,
2072 include_directories : includes,
2073 link_with : [libshared],
2074 dependencies : [threads,
2079 install_rpath : rootlibexecdir,
2081 install_dir : rootlibexecdir)
2083 exe = executable('coredumpctl',
2084 coredumpctl_sources,
2085 include_directories : includes,
2086 link_with : [libshared],
2087 dependencies : [threads,
2090 install_rpath : rootlibexecdir,
2092 public_programs += [exe]
2095 if conf.get('ENABLE_BINFMT') == 1
2096 exe = executable('systemd-binfmt',
2097 'src/binfmt/binfmt.c',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2102 install_dir : rootlibexecdir)
2103 public_programs += [exe]
2105 meson.add_install_script('sh', '-c',
2106 mkdir_p.format(binfmtdir))
2107 meson.add_install_script('sh', '-c',
2108 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2111 if conf.get('ENABLE_VCONSOLE') == 1
2112 executable('systemd-vconsole-setup',
2113 'src/vconsole/vconsole-setup.c',
2114 include_directories : includes,
2115 link_with : [libshared],
2116 install_rpath : rootlibexecdir,
2118 install_dir : rootlibexecdir)
2121 if conf.get('ENABLE_RANDOMSEED') == 1
2122 executable('systemd-random-seed',
2123 'src/random-seed/random-seed.c',
2124 include_directories : includes,
2125 link_with : [libshared],
2126 install_rpath : rootlibexecdir,
2128 install_dir : rootlibexecdir)
2131 if conf.get('ENABLE_FIRSTBOOT') == 1
2132 executable('systemd-firstboot',
2133 'src/firstboot/firstboot.c',
2134 include_directories : includes,
2135 link_with : [libshared],
2136 dependencies : [libcrypt],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootbindir)
2142 executable('systemd-remount-fs',
2143 'src/remount-fs/remount-fs.c',
2144 'src/core/mount-setup.c',
2145 'src/core/mount-setup.h',
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootlibexecdir)
2152 executable('systemd-machine-id-setup',
2153 'src/machine-id-setup/machine-id-setup-main.c',
2154 'src/core/machine-id-setup.c',
2155 'src/core/machine-id-setup.h',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2160 install_dir : rootbindir)
2162 executable('systemd-fsck',
2164 include_directories : includes,
2165 link_with : [libshared],
2166 install_rpath : rootlibexecdir,
2168 install_dir : rootlibexecdir)
2170 executable('systemd-growfs',
2171 'src/partition/growfs.c',
2172 include_directories : includes,
2173 link_with : [libshared],
2174 dependencies : [libcryptsetup],
2175 install_rpath : rootlibexecdir,
2177 install_dir : rootlibexecdir)
2179 executable('systemd-makefs',
2180 'src/partition/makefs.c',
2181 include_directories : includes,
2182 link_with : [libshared],
2183 install_rpath : rootlibexecdir,
2185 install_dir : rootlibexecdir)
2187 executable('systemd-sleep',
2188 'src/sleep/sleep.c',
2189 include_directories : includes,
2190 link_with : [libshared],
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootlibexecdir)
2195 exe = executable('systemd-sysctl',
2196 'src/sysctl/sysctl.c',
2197 include_directories : includes,
2198 link_with : [libshared],
2199 install_rpath : rootlibexecdir,
2201 install_dir : rootlibexecdir)
2202 public_programs += [exe]
2204 executable('systemd-ac-power',
2205 'src/ac-power/ac-power.c',
2206 include_directories : includes,
2207 link_with : [libshared],
2208 install_rpath : rootlibexecdir,
2210 install_dir : rootlibexecdir)
2212 exe = executable('systemd-detect-virt',
2213 'src/detect-virt/detect-virt.c',
2214 include_directories : includes,
2215 link_with : [libshared],
2216 install_rpath : rootlibexecdir,
2218 public_programs += [exe]
2220 exe = executable('systemd-delta',
2221 'src/delta/delta.c',
2222 include_directories : includes,
2223 link_with : [libshared],
2224 install_rpath : rootlibexecdir,
2226 public_programs += [exe]
2228 exe = executable('systemd-escape',
2229 'src/escape/escape.c',
2230 include_directories : includes,
2231 link_with : [libshared],
2232 install_rpath : rootlibexecdir,
2234 install_dir : rootbindir)
2235 public_programs += [exe]
2237 exe = executable('systemd-notify',
2238 'src/notify/notify.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 install_rpath : rootlibexecdir,
2243 install_dir : rootbindir)
2244 public_programs += [exe]
2246 executable('systemd-volatile-root',
2247 'src/volatile-root/volatile-root.c',
2248 include_directories : includes,
2249 link_with : [libshared],
2250 install_rpath : rootlibexecdir,
2252 install_dir : rootlibexecdir)
2254 executable('systemd-cgroups-agent',
2255 'src/cgroups-agent/cgroups-agent.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 install_rpath : rootlibexecdir,
2260 install_dir : rootlibexecdir)
2262 exe = executable('systemd-path',
2264 include_directories : includes,
2265 link_with : [libshared],
2266 install_rpath : rootlibexecdir,
2268 public_programs += [exe]
2270 exe = executable('systemd-ask-password',
2271 'src/ask-password/ask-password.c',
2272 include_directories : includes,
2273 link_with : [libshared],
2274 install_rpath : rootlibexecdir,
2276 install_dir : rootbindir)
2277 public_programs += [exe]
2279 executable('systemd-reply-password',
2280 'src/reply-password/reply-password.c',
2281 include_directories : includes,
2282 link_with : [libshared],
2283 install_rpath : rootlibexecdir,
2285 install_dir : rootlibexecdir)
2287 exe = executable('systemd-tty-ask-password-agent',
2288 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 install_rpath : rootlibexecdir,
2293 install_dir : rootbindir)
2294 public_programs += [exe]
2296 exe = executable('systemd-cgls',
2298 include_directories : includes,
2299 link_with : [libshared],
2300 install_rpath : rootlibexecdir,
2302 public_programs += [exe]
2304 exe = executable('systemd-cgtop',
2305 'src/cgtop/cgtop.c',
2306 include_directories : includes,
2307 link_with : [libshared],
2308 install_rpath : rootlibexecdir,
2310 public_programs += [exe]
2312 executable('systemd-initctl',
2313 'src/initctl/initctl.c',
2314 include_directories : includes,
2315 link_with : [libshared],
2316 install_rpath : rootlibexecdir,
2318 install_dir : rootlibexecdir)
2320 exe = executable('systemd-mount',
2321 'src/mount/mount-tool.c',
2322 include_directories : includes,
2323 link_with : [libshared],
2324 install_rpath : rootlibexecdir,
2326 public_programs += [exe]
2328 meson.add_install_script(meson_make_symlink,
2329 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2331 exe = executable('systemd-run',
2333 include_directories : includes,
2334 link_with : [libshared],
2335 install_rpath : rootlibexecdir,
2337 public_programs += [exe]
2339 exe = executable('systemd-stdio-bridge',
2340 'src/stdio-bridge/stdio-bridge.c',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2345 public_programs += [exe]
2347 exe = executable('busctl',
2348 'src/busctl/busctl.c',
2349 'src/busctl/busctl-introspect.c',
2350 'src/busctl/busctl-introspect.h',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 install_rpath : rootlibexecdir,
2355 public_programs += [exe]
2357 if conf.get('ENABLE_SYSUSERS') == 1
2358 exe = executable('systemd-sysusers',
2359 'src/sysusers/sysusers.c',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootbindir)
2365 public_programs += [exe]
2368 if conf.get('ENABLE_TMPFILES') == 1
2369 exe = executable('systemd-tmpfiles',
2370 'src/tmpfiles/tmpfiles.c',
2371 include_directories : includes,
2372 link_with : [libshared],
2373 dependencies : [libacl],
2374 install_rpath : rootlibexecdir,
2376 install_dir : rootbindir)
2377 public_programs += [exe]
2379 test('test-systemd-tmpfiles',
2380 test_systemd_tmpfiles_py,
2381 args : exe.full_path())
2382 # https://github.com/mesonbuild/meson/issues/2681
2385 if conf.get('ENABLE_HWDB') == 1
2386 exe = executable('systemd-hwdb',
2388 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2389 include_directories : includes,
2390 link_with : [libudev_static],
2391 install_rpath : udev_rpath,
2393 install_dir : rootbindir)
2394 public_programs += [exe]
2397 if conf.get('ENABLE_QUOTACHECK') == 1
2398 executable('systemd-quotacheck',
2399 'src/quotacheck/quotacheck.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootlibexecdir)
2407 exe = executable('systemd-socket-proxyd',
2408 'src/socket-proxy/socket-proxyd.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 dependencies : [threads],
2412 install_rpath : rootlibexecdir,
2414 install_dir : rootlibexecdir)
2415 public_programs += [exe]
2417 exe = executable('systemd-udevd',
2418 systemd_udevd_sources,
2419 include_directories : includes,
2420 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2421 link_with : [libudev_core,
2424 dependencies : [threads,
2429 install_rpath : udev_rpath,
2431 install_dir : rootlibexecdir)
2432 public_programs += [exe]
2434 exe = executable('udevadm',
2436 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2437 include_directories : includes,
2438 link_with : [libudev_core,
2441 dependencies : [threads,
2446 install_rpath : udev_rpath,
2448 install_dir : rootbindir)
2449 public_programs += [exe]
2451 executable('systemd-shutdown',
2452 systemd_shutdown_sources,
2453 include_directories : includes,
2454 link_with : [libshared],
2455 dependencies : [libmount],
2456 install_rpath : rootlibexecdir,
2458 install_dir : rootlibexecdir)
2460 executable('systemd-update-done',
2461 'src/update-done/update-done.c',
2462 include_directories : includes,
2463 link_with : [libshared],
2464 install_rpath : rootlibexecdir,
2466 install_dir : rootlibexecdir)
2468 executable('systemd-update-utmp',
2469 'src/update-utmp/update-utmp.c',
2470 include_directories : includes,
2471 link_with : [libshared],
2472 dependencies : [libaudit],
2473 install_rpath : rootlibexecdir,
2475 install_dir : rootlibexecdir)
2477 if conf.get('HAVE_KMOD') == 1
2478 executable('systemd-modules-load',
2479 'src/modules-load/modules-load.c',
2480 include_directories : includes,
2481 link_with : [libshared],
2482 dependencies : [libkmod],
2483 install_rpath : rootlibexecdir,
2485 install_dir : rootlibexecdir)
2487 meson.add_install_script('sh', '-c',
2488 mkdir_p.format(modulesloaddir))
2489 meson.add_install_script('sh', '-c',
2490 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2493 exe = executable('systemd-nspawn',
2494 systemd_nspawn_sources,
2495 'src/core/mount-setup.c', # FIXME: use a variable?
2496 'src/core/mount-setup.h',
2497 'src/core/loopback-setup.c',
2498 'src/core/loopback-setup.h',
2499 include_directories : includes,
2500 link_with : [libnspawn_core,
2502 dependencies : [libblkid],
2503 install_rpath : rootlibexecdir,
2505 public_programs += [exe]
2507 if conf.get('ENABLE_NETWORKD') == 1
2508 executable('systemd-networkd',
2509 systemd_networkd_sources,
2510 include_directories : includes,
2511 link_with : [libnetworkd_core,
2515 dependencies : [threads],
2516 install_rpath : rootlibexecdir,
2518 install_dir : rootlibexecdir)
2520 executable('systemd-networkd-wait-online',
2521 systemd_networkd_wait_online_sources,
2522 include_directories : includes,
2523 link_with : [libnetworkd_core,
2525 install_rpath : rootlibexecdir,
2527 install_dir : rootlibexecdir)
2529 exe = executable('networkctl',
2531 include_directories : includes,
2532 link_with : [libsystemd_network,
2534 install_rpath : rootlibexecdir,
2536 install_dir : rootbindir)
2537 public_programs += [exe]
2540 executable('systemd-sulogin-shell',
2541 ['src/sulogin-shell/sulogin-shell.c'],
2542 include_directories : includes,
2543 link_with : [libshared],
2544 install_rpath : rootlibexecdir,
2546 install_dir : rootlibexecdir)
2548 ############################################################
2550 foreach tuple : tests
2552 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2553 dependencies = tuple[2]
2554 condition = tuple.length() >= 4 ? tuple[3] : ''
2555 type = tuple.length() >= 5 ? tuple[4] : ''
2556 defs = tuple.length() >= 6 ? tuple[5] : []
2557 incs = tuple.length() >= 7 ? tuple[6] : includes
2560 name = sources[0].split('/')[-1].split('.')[0]
2561 if type.startswith('timeout=')
2562 timeout = type.split('=')[1].to_int()
2565 if want_tests == 'false'
2566 message('Not compiling @0@ because tests is set to false'.format(name))
2567 elif condition == '' or conf.get(condition) == 1
2571 include_directories : incs,
2572 link_with : link_with,
2573 dependencies : dependencies,
2575 install_rpath : rootlibexecdir,
2576 install : install_tests,
2577 install_dir : join_paths(testsdir, type))
2580 message('@0@ is a manual test'.format(name))
2581 elif type == 'unsafe' and want_tests != 'unsafe'
2582 message('@0@ is an unsafe test'.format(name))
2589 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2594 'test-libsystemd-sym',
2595 test_libsystemd_sym_c,
2596 include_directories : includes,
2597 link_with : [libsystemd],
2598 install : install_tests,
2599 install_dir : testsdir)
2600 test('test-libsystemd-sym', exe)
2603 'test-libsystemd-static-sym',
2604 test_libsystemd_sym_c,
2605 include_directories : includes,
2606 link_with : [install_libsystemd_static],
2607 dependencies : [threads], # threads is already included in dependencies on the library,
2608 # but does not seem to get propagated. Add here as a work-around.
2609 build_by_default : static_libsystemd_pic,
2610 install : install_tests and static_libsystemd_pic,
2611 install_dir : testsdir)
2612 if static_libsystemd_pic
2613 test('test-libsystemd-static-sym', exe)
2619 include_directories : includes,
2620 c_args : ['-Wno-deprecated-declarations'],
2621 link_with : [libudev],
2622 install : install_tests,
2623 install_dir : testsdir)
2624 test('test-libudev-sym', exe)
2627 'test-libudev-static-sym',
2629 include_directories : includes,
2630 c_args : ['-Wno-deprecated-declarations'],
2631 link_with : [install_libudev_static],
2632 build_by_default : static_libudev_pic,
2633 install : install_tests and static_libudev_pic,
2634 install_dir : testsdir)
2635 if static_libudev_pic
2636 test('test-libudev-static-sym', exe)
2639 ############################################################
2643 foreach tuple : fuzzers
2645 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2646 dependencies = tuple[2]
2647 defs = tuple.length() >= 4 ? tuple[3] : []
2648 incs = tuple.length() >= 5 ? tuple[4] : includes
2651 dependencies += fuzzing_engine
2653 sources += 'src/fuzz/fuzz-main.c'
2656 name = sources[0].split('/')[-1].split('.')[0]
2658 fuzzer_exes += executable(
2661 include_directories : [incs, include_directories('src/fuzz')],
2662 link_with : link_with,
2663 dependencies : dependencies,
2668 run_target('fuzzers',
2669 depends : fuzzer_exes,
2672 ############################################################
2674 make_directive_index_py = find_program('tools/make-directive-index.py')
2675 make_man_index_py = find_program('tools/make-man-index.py')
2676 xml_helper_py = find_program('tools/xml_helper.py')
2677 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2681 subdir('sysusers.d')
2682 subdir('tmpfiles.d')
2687 subdir('shell-completion/bash')
2688 subdir('shell-completion/zsh')
2689 subdir('doc/sysvinit')
2690 subdir('doc/var-log')
2692 # FIXME: figure out if the warning is true:
2693 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2694 install_subdir('factory/etc',
2695 install_dir : factorydir)
2698 install_data('xorg/50-systemd-user.sh',
2699 install_dir : xinitrcdir)
2700 install_data('modprobe.d/systemd.conf',
2701 install_dir : modprobedir)
2702 install_data('LICENSE.GPL2',
2707 'doc/DISTRO_PORTING',
2708 'doc/ENVIRONMENT.md',
2710 'doc/TRANSIENT-SETTINGS.md',
2713 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2714 install_dir : docdir)
2716 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2717 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2719 ############################################################
2721 meson_check_help = find_program('tools/meson-check-help.sh')
2723 foreach exec : public_programs
2724 name = exec.full_path().split('/')[-1]
2725 test('check-help-' + name,
2727 args : [exec.full_path()])
2730 ############################################################
2732 # Enable tests for all supported sanitizers
2733 foreach tuple : sanitizers
2734 sanitizer = tuple[0]
2737 have = run_command(check_compilation_sh,
2738 cc.cmd_array(), '-x', 'c',
2739 '-fsanitize=@0@'.format(sanitizer),
2740 '-include', link_test_c).returncode() == 0
2741 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2745 foreach p : fuzz_regression_tests
2746 b = p.split('/')[-2]
2747 c = p.split('/')[-1]
2749 name = '@0@:@1@'.format(b, sanitizer)
2752 if want_tests == 'false'
2753 message('Not compiling @0@ because tests is set to false'.format(name))
2755 exe = custom_target(
2759 command : [env, 'ln', '-fs',
2760 join_paths(build.full_path(), b),
2762 build_by_default : true)
2764 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2769 if want_tests != 'false' and slow_tests
2770 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2772 args : [exe.full_path(),
2773 join_paths(meson.source_root(),
2774 'test/fuzz-regressions',
2782 ############################################################
2785 all_files = run_command(
2787 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2790 all_files = files(all_files.stdout().split())
2795 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2798 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2802 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2805 command : [meson_git_contrib_sh])
2809 git_head = run_command(
2811 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2812 'rev-parse', 'HEAD']).stdout().strip()
2813 git_head_short = run_command(
2815 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2816 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2820 command : ['git', 'archive',
2821 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2823 '--prefix', 'systemd-@0@/'.format(git_head),
2827 ############################################################
2829 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2832 depends : [man, libsystemd, libudev],
2833 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2835 ############################################################
2838 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2840 'split /usr: @0@'.format(split_usr),
2841 'split bin-sbin: @0@'.format(split_bin),
2842 'prefix directory: @0@'.format(prefixdir),
2843 'rootprefix directory: @0@'.format(rootprefixdir),
2844 'sysconf directory: @0@'.format(sysconfdir),
2845 'include directory: @0@'.format(includedir),
2846 'lib directory: @0@'.format(libdir),
2847 'rootlib directory: @0@'.format(rootlibdir),
2848 'SysV init scripts: @0@'.format(sysvinit_path),
2849 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2850 'PAM modules directory: @0@'.format(pamlibdir),
2851 'PAM configuration directory: @0@'.format(pamconfdir),
2852 'RPM macros directory: @0@'.format(rpmmacrosdir),
2853 'modprobe.d directory: @0@'.format(modprobedir),
2854 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2855 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2856 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2857 'bash completions directory: @0@'.format(bashcompletiondir),
2858 'zsh completions directory: @0@'.format(zshcompletiondir),
2859 'extra start script: @0@'.format(get_option('rc-local')),
2860 'extra stop script: @0@'.format(get_option('halt-local')),
2861 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2862 get_option('debug-tty')),
2863 'TTY GID: @0@'.format(tty_gid),
2864 'users GID: @0@'.format(users_gid),
2865 'maximum system UID: @0@'.format(system_uid_max),
2866 'maximum system GID: @0@'.format(system_gid_max),
2867 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2868 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2869 'minimum container UID base: @0@'.format(container_uid_base_min),
2870 'maximum container UID base: @0@'.format(container_uid_base_max),
2871 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2872 'render group access mode: @0@'.format(get_option('group-render-mode')),
2873 'certificate root directory: @0@'.format(get_option('certificate-root')),
2874 'support URL: @0@'.format(support_url),
2875 'nobody user name: @0@'.format(nobody_user),
2876 'nobody group name: @0@'.format(nobody_group),
2877 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2878 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2880 'default DNSSEC mode: @0@'.format(default_dnssec),
2881 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2882 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2883 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2885 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2886 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2888 'default DNS servers: @0@'.format(alt_dns_servers),
2889 'default NTP servers: @0@'.format(alt_ntp_servers)]
2891 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2892 '@@0@'.format(time_epoch)).stdout().strip()
2894 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2897 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2898 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2899 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2901 if conf.get('ENABLE_EFI') == 1
2903 'efi arch: @0@'.format(efi_arch)]
2907 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2908 'EFI CC @0@'.format(efi_cc),
2909 'EFI lib directory: @0@'.format(efi_libdir),
2910 'EFI lds directory: @0@'.format(efi_ldsdir),
2911 'EFI include directory: @0@'.format(efi_incdir)]
2966 ['legacy pkla', install_polkit_pkla],
2968 ['gnu-efi', have_gnu_efi],
2975 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2978 ['man pages', want_man],
2979 ['html pages', want_html],
2980 ['man page indices', want_man and have_lxml],
2985 ['adm group', get_option('adm-group')],
2986 ['wheel group', get_option('wheel-group')],
2989 ['debug mmap cache'],
2990 ['valgrind', conf.get('VALGRIND') == 1],
2993 if tuple.length() >= 2
2996 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2997 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2998 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3003 missing += [tuple[0]]
3009 'enabled features: @0@'.format(', '.join(found)),
3011 'disabled features: @0@'.format(', '.join(missing)),
3013 message('\n '.join(status))
3015 if rootprefixdir != rootprefix_default
3017 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3018 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3019 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))