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 <sys/stat.h>
427 foreach decl : ['char16_t',
429 'struct ethtool_link_settings',
430 'struct fib_rule_uid_range',
434 # We get -1 if the size cannot be determined
435 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
437 if decl == 'struct statx'
439 want_linux_stat_h = false
441 have = cc.sizeof(decl,
442 prefix : decl_headers + '#include <linux/stat.h>',
443 args : '-D_GNU_SOURCE') > 0
444 want_linux_stat_h = have
448 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
451 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
453 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
454 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
455 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
456 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
457 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
458 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
459 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
460 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
461 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
462 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
463 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
464 # if_tunnel.h is buggy and cannot be included on its own
465 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
466 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
467 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
468 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
469 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
470 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
471 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
472 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
473 ['NDA_IFINDEX', 'linux/neighbour.h'],
474 ['IFA_FLAGS', 'linux/if_addr.h'],
475 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
476 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
477 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
479 prefix = decl.length() > 2 ? decl[2] : ''
480 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
481 conf.set10('HAVE_' + decl[0], have)
484 foreach ident : ['secure_getenv', '__secure_getenv']
485 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
489 ['memfd_create', '''#include <sys/mman.h>'''],
490 ['gettid', '''#include <sys/types.h>
491 #include <unistd.h>'''],
492 ['pivot_root', '''#include <stdlib.h>
493 #include <unistd.h>'''], # no known header declares pivot_root
494 ['name_to_handle_at', '''#include <sys/types.h>
495 #include <sys/stat.h>
496 #include <fcntl.h>'''],
497 ['setns', '''#include <sched.h>'''],
498 ['renameat2', '''#include <stdio.h>
499 #include <fcntl.h>'''],
500 ['kcmp', '''#include <linux/kcmp.h>'''],
501 ['keyctl', '''#include <sys/types.h>
502 #include <keyutils.h>'''],
503 ['copy_file_range', '''#include <sys/syscall.h>
504 #include <unistd.h>'''],
505 ['bpf', '''#include <sys/syscall.h>
506 #include <unistd.h>'''],
507 ['statx', '''#include <sys/types.h>
508 #include <sys/stat.h>
509 #include <unistd.h>'''],
510 ['explicit_bzero' , '''#include <string.h>'''],
511 ['reallocarray', '''#include <malloc.h>'''],
514 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
515 conf.set10('HAVE_' + ident[0].to_upper(), have)
518 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
519 conf.set10('USE_SYS_RANDOM_H', true)
520 conf.set10('HAVE_GETRANDOM', true)
522 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
523 conf.set10('USE_SYS_RANDOM_H', false)
524 conf.set10('HAVE_GETRANDOM', have)
527 #####################################################################
529 sed = find_program('sed')
530 awk = find_program('awk')
531 m4 = find_program('m4')
532 stat = find_program('stat')
533 git = find_program('git', required : false)
534 env = find_program('env')
535 perl = find_program('perl', required : false)
537 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
538 mkdir_p = 'mkdir -p $DESTDIR/@0@'
539 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
540 splash_bmp = files('test/splash.bmp')
542 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
543 # /usr/sbin, /sbin, and fall back to the default from middle column.
544 progs = [['quotaon', '/usr/sbin/quotaon' ],
545 ['quotacheck', '/usr/sbin/quotacheck' ],
546 ['kmod', '/usr/bin/kmod' ],
547 ['kexec', '/usr/sbin/kexec' ],
548 ['sulogin', '/usr/sbin/sulogin' ],
549 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
550 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
551 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
552 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
555 path = get_option(prog[0] + '-path')
557 message('Using @1@ for @0@'.format(prog[0], path))
559 exe = find_program(prog[0],
560 '/usr/sbin/' + prog[0],
563 path = exe.found() ? exe.path() : prog[1]
565 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
566 conf.set_quoted(name, path)
567 substs.set(name, path)
570 conf.set_quoted('TELINIT', get_option('telinit-path'))
572 if run_command('ln', '--relative', '--help').returncode() != 0
573 error('ln does not support --relative (added in coreutils 8.16)')
576 ############################################################
578 gperf = find_program('gperf')
580 gperf_test_format = '''
582 const char * in_word_set(const char *, @0@);
585 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
586 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
587 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
588 if cc.compiles(gperf_test)
589 gperf_len_type = 'size_t'
591 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
592 if cc.compiles(gperf_test)
593 gperf_len_type = 'unsigned'
595 error('unable to determine gperf len type')
598 message('gperf len type is @0@'.format(gperf_len_type))
599 conf.set('GPERF_LEN_TYPE', gperf_len_type,
600 description : 'The type of gperf "len" parameter')
602 ############################################################
604 if not cc.has_header('sys/capability.h')
605 error('POSIX caps headers not found')
607 foreach header : ['crypt.h',
610 'linux/vm_sockets.h',
612 'valgrind/memcheck.h',
613 'valgrind/valgrind.h',
616 conf.set10('HAVE_' + header.underscorify().to_upper(),
617 cc.has_header(header))
620 ############################################################
622 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
623 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
624 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
626 default_hierarchy = get_option('default-hierarchy')
627 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
628 description : 'default cgroup hierarchy as string')
629 if default_hierarchy == 'legacy'
630 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
631 elif default_hierarchy == 'hybrid'
632 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
634 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
637 time_epoch = get_option('time-epoch')
640 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
642 time_epoch = time_epoch.to_int()
643 conf.set('TIME_EPOCH', time_epoch)
645 system_uid_max = get_option('system-uid-max')
646 if system_uid_max == ''
647 system_uid_max = run_command(
649 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
650 '/etc/login.defs').stdout().strip()
651 if system_uid_max == ''
652 system_uid_max = '999'
655 system_uid_max = system_uid_max.to_int()
656 conf.set('SYSTEM_UID_MAX', system_uid_max)
657 substs.set('systemuidmax', system_uid_max)
658 message('maximum system UID is @0@'.format(system_uid_max))
660 system_gid_max = get_option('system-gid-max')
661 if system_gid_max == ''
662 system_gid_max = run_command(
664 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
665 '/etc/login.defs').stdout().strip()
666 if system_gid_max == ''
667 system_gid_max = '999'
670 system_gid_max = system_gid_max.to_int()
671 conf.set('SYSTEM_GID_MAX', system_gid_max)
672 substs.set('systemgidmax', system_gid_max)
673 message('maximum system GID is @0@'.format(system_gid_max))
675 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
676 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
677 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
678 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
679 substs.set('dynamicuidmin', dynamic_uid_min)
680 substs.set('dynamicuidmax', dynamic_uid_max)
682 container_uid_base_min = get_option('container-uid-base-min').to_int()
683 container_uid_base_max = get_option('container-uid-base-max').to_int()
684 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
685 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
686 substs.set('containeruidbasemin', container_uid_base_min)
687 substs.set('containeruidbasemax', container_uid_base_max)
689 nobody_user = get_option('nobody-user')
690 nobody_group = get_option('nobody-group')
692 getent_result = run_command('getent', 'passwd', '65534')
693 if getent_result.returncode() == 0
694 name = getent_result.stdout().split(':')[0]
695 if name != nobody_user
697 '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) +
698 'Your build will result in an user table setup that is incompatible with the local system.')
701 id_result = run_command('id', '-u', nobody_user)
702 if id_result.returncode() == 0
703 id = id_result.stdout().to_int()
706 '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) +
707 'Your build will result in an user table setup that is incompatible with the local system.')
711 getent_result = run_command('getent', 'group', '65534')
712 if getent_result.returncode() == 0
713 name = getent_result.stdout().split(':')[0]
714 if name != nobody_group
716 '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) +
717 'Your build will result in an group table setup that is incompatible with the local system.')
720 id_result = run_command('id', '-g', nobody_group)
721 if id_result.returncode() == 0
722 id = id_result.stdout().to_int()
725 '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) +
726 'Your build will result in an group table setup that is incompatible with the local system.')
729 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
731 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
732 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
735 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
736 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
737 substs.set('NOBODY_USER_NAME', nobody_user)
738 substs.set('NOBODY_GROUP_NAME', nobody_group)
740 tty_gid = get_option('tty-gid')
741 conf.set('TTY_GID', tty_gid)
742 substs.set('TTY_GID', tty_gid)
744 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
745 if get_option('users-gid') != ''
746 users_gid = get_option('users-gid').to_int()
750 substs.set('USERS_GID', users_gid)
752 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
753 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
755 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
756 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
758 kill_user_processes = get_option('default-kill-user-processes')
759 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
760 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
761 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
763 dns_servers = get_option('dns-servers')
764 conf.set_quoted('DNS_SERVERS', dns_servers)
765 substs.set('DNS_SERVERS', dns_servers)
767 ntp_servers = get_option('ntp-servers')
768 conf.set_quoted('NTP_SERVERS', ntp_servers)
769 substs.set('NTP_SERVERS', ntp_servers)
771 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
773 substs.set('SUSHELL', get_option('debug-shell'))
774 substs.set('DEBUGTTY', get_option('debug-tty'))
776 enable_debug_hashmap = false
777 enable_debug_mmap_cache = false
778 foreach name : get_option('debug')
780 enable_debug_hashmap = true
781 elif name == 'mmap-cache'
782 enable_debug_mmap_cache = true
784 message('unknown debug option "@0@", ignoring'.format(name))
787 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
788 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
790 conf.set10('VALGRIND', get_option('valgrind'))
792 #####################################################################
794 threads = dependency('threads')
795 librt = cc.find_library('rt')
796 libm = cc.find_library('m')
797 libdl = cc.find_library('dl')
798 libcrypt = cc.find_library('crypt')
800 libcap = dependency('libcap', required : false)
801 if not libcap.found()
802 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
803 libcap = cc.find_library('cap')
806 libmount = dependency('mount',
807 version : fuzzer_build ? '>= 0' : '>= 2.30')
809 want_seccomp = get_option('seccomp')
810 if want_seccomp != 'false' and not fuzzer_build
811 libseccomp = dependency('libseccomp',
812 version : '>= 2.3.1',
813 required : want_seccomp == 'true')
814 have = libseccomp.found()
819 conf.set10('HAVE_SECCOMP', have)
821 want_selinux = get_option('selinux')
822 if want_selinux != 'false' and not fuzzer_build
823 libselinux = dependency('libselinux',
824 version : '>= 2.1.9',
825 required : want_selinux == 'true')
826 have = libselinux.found()
831 conf.set10('HAVE_SELINUX', have)
833 want_apparmor = get_option('apparmor')
834 if want_apparmor != 'false' and not fuzzer_build
835 libapparmor = dependency('libapparmor',
836 required : want_apparmor == 'true')
837 have = libapparmor.found()
842 conf.set10('HAVE_APPARMOR', have)
844 smack_run_label = get_option('smack-run-label')
845 if smack_run_label != ''
846 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
849 want_polkit = get_option('polkit')
850 install_polkit = false
851 install_polkit_pkla = false
852 if want_polkit != 'false' and not fuzzer_build
853 install_polkit = true
855 libpolkit = dependency('polkit-gobject-1',
857 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
858 message('Old polkit detected, will install pkla files')
859 install_polkit_pkla = true
862 conf.set10('ENABLE_POLKIT', install_polkit)
864 want_acl = get_option('acl')
865 if want_acl != 'false' and not fuzzer_build
866 libacl = cc.find_library('acl', required : want_acl == 'true')
867 have = libacl.found()
872 conf.set10('HAVE_ACL', have)
874 want_audit = get_option('audit')
875 if want_audit != 'false' and not fuzzer_build
876 libaudit = dependency('audit', required : want_audit == 'true')
877 have = libaudit.found()
882 conf.set10('HAVE_AUDIT', have)
884 want_blkid = get_option('blkid')
885 if want_blkid != 'false' and not fuzzer_build
886 libblkid = dependency('blkid', required : want_blkid == 'true')
887 have = libblkid.found()
892 conf.set10('HAVE_BLKID', have)
894 want_kmod = get_option('kmod')
895 if want_kmod != 'false' and not fuzzer_build
896 libkmod = dependency('libkmod',
898 required : want_kmod == 'true')
899 have = libkmod.found()
904 conf.set10('HAVE_KMOD', have)
906 want_pam = get_option('pam')
907 if want_pam != 'false' and not fuzzer_build
908 libpam = cc.find_library('pam', required : want_pam == 'true')
909 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
910 have = libpam.found() and libpam_misc.found()
916 conf.set10('HAVE_PAM', have)
918 want_microhttpd = get_option('microhttpd')
919 if want_microhttpd != 'false' and not fuzzer_build
920 libmicrohttpd = dependency('libmicrohttpd',
921 version : '>= 0.9.33',
922 required : want_microhttpd == 'true')
923 have = libmicrohttpd.found()
928 conf.set10('HAVE_MICROHTTPD', have)
930 want_libcryptsetup = get_option('libcryptsetup')
931 if want_libcryptsetup != 'false' and not fuzzer_build
932 libcryptsetup = dependency('libcryptsetup',
933 version : '>= 1.6.0',
934 required : want_libcryptsetup == 'true')
935 have = libcryptsetup.found()
940 conf.set10('HAVE_LIBCRYPTSETUP', have)
942 want_libcurl = get_option('libcurl')
943 if want_libcurl != 'false' and not fuzzer_build
944 libcurl = dependency('libcurl',
945 version : '>= 7.32.0',
946 required : want_libcurl == 'true')
947 have = libcurl.found()
952 conf.set10('HAVE_LIBCURL', have)
954 want_libidn = get_option('libidn')
955 want_libidn2 = get_option('libidn2')
956 if want_libidn == 'true' and want_libidn2 == 'true'
957 error('libidn and libidn2 cannot be requested simultaneously')
960 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
961 libidn = dependency('libidn',
962 required : want_libidn == 'true')
963 have = libidn.found()
968 conf.set10('HAVE_LIBIDN', have)
969 if not have and want_libidn2 != 'false' and not fuzzer_build
970 # libidn is used for both libidn and libidn2 objects
971 libidn = dependency('libidn2',
972 required : want_libidn2 == 'true')
973 have = libidn.found()
977 conf.set10('HAVE_LIBIDN2', have)
979 want_libiptc = get_option('libiptc')
980 if want_libiptc != 'false' and not fuzzer_build
981 libiptc = dependency('libiptc',
982 required : want_libiptc == 'true')
983 have = libiptc.found()
988 conf.set10('HAVE_LIBIPTC', have)
990 want_qrencode = get_option('qrencode')
991 if want_qrencode != 'false' and not fuzzer_build
992 libqrencode = dependency('libqrencode',
993 required : want_qrencode == 'true')
994 have = libqrencode.found()
999 conf.set10('HAVE_QRENCODE', have)
1001 want_gcrypt = get_option('gcrypt')
1002 if want_gcrypt != 'false' and not fuzzer_build
1003 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1004 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1005 have = libgcrypt.found() and libgpg_error.found()
1010 # link to neither of the libs if one is not found
1014 conf.set10('HAVE_GCRYPT', have)
1016 want_gnutls = get_option('gnutls')
1017 if want_gnutls != 'false' and not fuzzer_build
1018 libgnutls = dependency('gnutls',
1019 version : '>= 3.1.4',
1020 required : want_gnutls == 'true')
1021 have = libgnutls.found()
1026 conf.set10('HAVE_GNUTLS', have)
1028 want_elfutils = get_option('elfutils')
1029 if want_elfutils != 'false' and not fuzzer_build
1030 libdw = dependency('libdw',
1031 required : want_elfutils == 'true')
1032 have = libdw.found()
1037 conf.set10('HAVE_ELFUTILS', have)
1039 want_zlib = get_option('zlib')
1040 if want_zlib != 'false' and not fuzzer_build
1041 libz = dependency('zlib',
1042 required : want_zlib == 'true')
1048 conf.set10('HAVE_ZLIB', have)
1050 want_bzip2 = get_option('bzip2')
1051 if want_bzip2 != 'false' and not fuzzer_build
1052 libbzip2 = cc.find_library('bz2',
1053 required : want_bzip2 == 'true')
1054 have = libbzip2.found()
1059 conf.set10('HAVE_BZIP2', have)
1061 want_xz = get_option('xz')
1062 if want_xz != 'false' and not fuzzer_build
1063 libxz = dependency('liblzma',
1064 required : want_xz == 'true')
1065 have = libxz.found()
1070 conf.set10('HAVE_XZ', have)
1072 want_lz4 = get_option('lz4')
1073 if want_lz4 != 'false' and not fuzzer_build
1074 liblz4 = dependency('liblz4',
1075 required : want_lz4 == 'true')
1076 have = liblz4.found()
1081 conf.set10('HAVE_LZ4', have)
1083 want_xkbcommon = get_option('xkbcommon')
1084 if want_xkbcommon != 'false' and not fuzzer_build
1085 libxkbcommon = dependency('xkbcommon',
1086 version : '>= 0.3.0',
1087 required : want_xkbcommon == 'true')
1088 have = libxkbcommon.found()
1093 conf.set10('HAVE_XKBCOMMON', have)
1095 want_pcre2 = get_option('pcre2')
1096 if want_pcre2 != 'false'
1097 libpcre2 = dependency('libpcre2-8',
1098 required : want_pcre2 == 'true')
1099 have = libpcre2.found()
1104 conf.set10('HAVE_PCRE2', have)
1106 want_glib = get_option('glib')
1107 if want_glib != 'false' and not fuzzer_build
1108 libglib = dependency('glib-2.0',
1109 version : '>= 2.22.0',
1110 required : want_glib == 'true')
1111 libgobject = dependency('gobject-2.0',
1112 version : '>= 2.22.0',
1113 required : want_glib == 'true')
1114 libgio = dependency('gio-2.0',
1115 required : want_glib == 'true')
1116 have = libglib.found() and libgobject.found() and libgio.found()
1123 conf.set10('HAVE_GLIB', have)
1125 want_dbus = get_option('dbus')
1126 if want_dbus != 'false' and not fuzzer_build
1127 libdbus = dependency('dbus-1',
1128 version : '>= 1.3.2',
1129 required : want_dbus == 'true')
1130 have = libdbus.found()
1135 conf.set10('HAVE_DBUS', have)
1137 default_dnssec = get_option('default-dnssec')
1139 default_dnssec = 'no'
1141 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1142 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1143 default_dnssec = 'no'
1145 conf.set('DEFAULT_DNSSEC_MODE',
1146 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1147 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1149 dns_over_tls = get_option('dns-over-tls')
1150 if dns_over_tls != 'false'
1151 have = (conf.get('HAVE_GNUTLS') == 1 and
1152 libgnutls.version().version_compare('>=3.5.3'))
1153 if dns_over_tls == 'true' and not have
1154 error('DNS-over-TLS support was requested, but dependencies are not available')
1159 conf.set10('ENABLE_DNS_OVER_TLS', have)
1161 default_dns_over_tls = get_option('default-dns-over-tls')
1163 default_dns_over_tls = 'no'
1165 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1166 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1167 default_dns_over_tls = 'no'
1169 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1170 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1171 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1173 want_importd = get_option('importd')
1174 if want_importd != 'false'
1175 have = (conf.get('HAVE_LIBCURL') == 1 and
1176 conf.get('HAVE_ZLIB') == 1 and
1177 conf.get('HAVE_BZIP2') == 1 and
1178 conf.get('HAVE_XZ') == 1 and
1179 conf.get('HAVE_GCRYPT') == 1)
1180 if want_importd == 'true' and not have
1181 error('importd support was requested, but dependencies are not available')
1186 conf.set10('ENABLE_IMPORTD', have)
1188 want_remote = get_option('remote')
1189 if want_remote != 'false'
1190 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1191 conf.get('HAVE_LIBCURL') == 1]
1192 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1193 # it's possible to build one without the other. Complain only if
1194 # support was explictly requested. The auxiliary files like sysusers
1195 # config should be installed when any of the programs are built.
1196 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1197 error('remote support was requested, but dependencies are not available')
1199 have = have_deps[0] or have_deps[1]
1203 conf.set10('ENABLE_REMOTE', have)
1205 foreach term : ['utmp',
1237 have = get_option(term)
1238 name = 'ENABLE_' + term.underscorify().to_upper()
1239 conf.set10(name, have)
1242 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1244 want_tests = get_option('tests')
1245 install_tests = get_option('install-tests')
1246 slow_tests = get_option('slow-tests')
1250 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1252 #####################################################################
1254 if get_option('efi')
1255 efi_arch = host_machine.cpu_family()
1257 if efi_arch == 'x86'
1258 EFI_MACHINE_TYPE_NAME = 'ia32'
1259 gnu_efi_arch = 'ia32'
1260 elif efi_arch == 'x86_64'
1261 EFI_MACHINE_TYPE_NAME = 'x64'
1262 gnu_efi_arch = 'x86_64'
1263 elif efi_arch == 'arm'
1264 EFI_MACHINE_TYPE_NAME = 'arm'
1265 gnu_efi_arch = 'arm'
1266 elif efi_arch == 'aarch64'
1267 EFI_MACHINE_TYPE_NAME = 'aa64'
1268 gnu_efi_arch = 'aarch64'
1270 EFI_MACHINE_TYPE_NAME = ''
1275 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1277 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1281 conf.set10('ENABLE_EFI', have)
1283 #####################################################################
1285 config_h = configure_file(
1286 output : 'config.h',
1287 configuration : conf)
1289 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1291 includes = include_directories('src/basic',
1295 'src/journal-remote',
1299 'src/time-wait-sync',
1304 'src/libsystemd/sd-bus',
1305 'src/libsystemd/sd-device',
1306 'src/libsystemd/sd-hwdb',
1307 'src/libsystemd/sd-id128',
1308 'src/libsystemd/sd-netlink',
1309 'src/libsystemd/sd-network',
1310 'src/libsystemd-network',
1313 add_project_arguments('-include', 'config.h', language : 'c')
1317 subdir('src/systemd')
1319 subdir('src/libsystemd')
1320 subdir('src/libsystemd-network')
1321 subdir('src/journal')
1324 libjournal_core = static_library(
1326 libjournal_core_sources,
1328 include_directories : includes,
1331 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1332 libsystemd = shared_library(
1334 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1335 version : libsystemd_version,
1336 include_directories : includes,
1337 link_args : ['-shared',
1338 '-Wl,--version-script=' + libsystemd_sym_path],
1339 link_with : [libbasic,
1341 link_whole : [libsystemd_static,
1343 dependencies : [threads,
1347 link_depends : libsystemd_sym,
1349 install_dir : rootlibdir)
1351 static_libsystemd = get_option('static-libsystemd')
1352 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1354 install_libsystemd_static = static_library(
1357 journal_client_sources,
1359 basic_gcrypt_sources,
1360 include_directories : includes,
1361 build_by_default : static_libsystemd != 'false',
1362 install : static_libsystemd != 'false',
1363 install_dir : rootlibdir,
1364 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1365 dependencies : [threads,
1374 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1376 ############################################################
1378 # binaries that have --help and are intended for use by humans,
1379 # usually, but not always, installed in /bin.
1380 public_programs = []
1382 subdir('src/libudev')
1383 subdir('src/shared')
1386 subdir('src/network')
1388 subdir('src/analyze')
1389 subdir('src/journal-remote')
1390 subdir('src/coredump')
1391 subdir('src/hostname')
1392 subdir('src/import')
1393 subdir('src/kernel-install')
1394 subdir('src/locale')
1395 subdir('src/machine')
1396 subdir('src/portable')
1397 subdir('src/nspawn')
1398 subdir('src/resolve')
1399 subdir('src/timedate')
1400 subdir('src/timesync')
1401 subdir('src/vconsole')
1402 subdir('src/boot/efi')
1409 ############################################################
1411 # only static linking apart from libdl, to make sure that the
1412 # module is linked to all libraries that it uses.
1413 test_dlopen = executable(
1416 include_directories : includes,
1417 link_with : [libbasic],
1418 dependencies : [libdl])
1420 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1421 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1422 ['mymachines', 'ENABLE_MACHINED'],
1423 ['resolve', 'ENABLE_RESOLVE']]
1425 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1429 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1430 version_script_arg = join_paths(meson.current_source_dir(), sym)
1432 nss = shared_library(
1434 'src/nss-@0@/nss-@0@.c'.format(module),
1436 include_directories : includes,
1437 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1438 link_args : ['-Wl,-z,nodelete',
1440 '-Wl,--version-script=' + version_script_arg,
1442 link_with : [libsystemd_static,
1444 dependencies : [threads,
1448 install_dir : rootlibdir)
1450 # We cannot use shared_module because it does not support version suffix.
1451 # Unfortunately shared_library insists on creating the symlink…
1452 meson.add_install_script('sh', '-c',
1453 'rm $DESTDIR@0@/libnss_@1@.so'
1454 .format(rootlibdir, module))
1456 test('dlopen-nss_' + module,
1458 args : [nss.full_path()]) # path to dlopen must include a slash
1462 ############################################################
1464 executable('systemd',
1466 include_directories : includes,
1467 link_with : [libcore,
1469 dependencies : [threads,
1475 install_rpath : rootlibexecdir,
1477 install_dir : rootlibexecdir)
1479 meson.add_install_script(meson_make_symlink,
1480 join_paths(rootlibexecdir, 'systemd'),
1481 join_paths(rootsbindir, 'init'))
1483 exe = executable('systemd-analyze',
1484 systemd_analyze_sources,
1485 include_directories : includes,
1486 link_with : [libcore,
1488 dependencies : [threads,
1494 install_rpath : rootlibexecdir,
1496 public_programs += [exe]
1498 executable('systemd-journald',
1499 systemd_journald_sources,
1500 include_directories : includes,
1501 link_with : [libjournal_core,
1503 dependencies : [threads,
1507 install_rpath : rootlibexecdir,
1509 install_dir : rootlibexecdir)
1511 exe = executable('systemd-cat',
1512 systemd_cat_sources,
1513 include_directories : includes,
1514 link_with : [libjournal_core,
1516 dependencies : [threads],
1517 install_rpath : rootlibexecdir,
1519 public_programs += [exe]
1521 exe = executable('journalctl',
1523 include_directories : includes,
1524 link_with : [libshared],
1525 dependencies : [threads,
1530 install_rpath : rootlibexecdir,
1532 install_dir : rootbindir)
1533 public_programs += [exe]
1535 executable('systemd-getty-generator',
1536 'src/getty-generator/getty-generator.c',
1537 include_directories : includes,
1538 link_with : [libshared],
1539 install_rpath : rootlibexecdir,
1541 install_dir : systemgeneratordir)
1543 executable('systemd-debug-generator',
1544 'src/debug-generator/debug-generator.c',
1545 include_directories : includes,
1546 link_with : [libshared],
1547 install_rpath : rootlibexecdir,
1549 install_dir : systemgeneratordir)
1551 executable('systemd-fstab-generator',
1552 'src/fstab-generator/fstab-generator.c',
1553 'src/core/mount-setup.c',
1554 include_directories : includes,
1555 link_with : [libshared],
1556 install_rpath : rootlibexecdir,
1558 install_dir : systemgeneratordir)
1560 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1561 executable('30-systemd-environment-d-generator',
1562 'src/environment-d-generator/environment-d-generator.c',
1563 include_directories : includes,
1564 link_with : [libshared],
1565 install_rpath : rootlibexecdir,
1567 install_dir : userenvgeneratordir)
1569 meson.add_install_script(meson_make_symlink,
1570 join_paths(sysconfdir, 'environment'),
1571 join_paths(environmentdir, '99-environment.conf'))
1574 if conf.get('ENABLE_HIBERNATE') == 1
1575 executable('systemd-hibernate-resume-generator',
1576 'src/hibernate-resume/hibernate-resume-generator.c',
1577 include_directories : includes,
1578 link_with : [libshared],
1579 install_rpath : rootlibexecdir,
1581 install_dir : systemgeneratordir)
1583 executable('systemd-hibernate-resume',
1584 'src/hibernate-resume/hibernate-resume.c',
1585 include_directories : includes,
1586 link_with : [libshared],
1587 install_rpath : rootlibexecdir,
1589 install_dir : rootlibexecdir)
1592 if conf.get('HAVE_BLKID') == 1
1593 executable('systemd-gpt-auto-generator',
1594 'src/gpt-auto-generator/gpt-auto-generator.c',
1595 'src/basic/blkid-util.h',
1596 include_directories : includes,
1597 link_with : [libshared],
1598 dependencies : libblkid,
1599 install_rpath : rootlibexecdir,
1601 install_dir : systemgeneratordir)
1603 exe = executable('systemd-dissect',
1604 'src/dissect/dissect.c',
1605 include_directories : includes,
1606 link_with : [libshared],
1607 install_rpath : rootlibexecdir,
1609 install_dir : rootlibexecdir)
1610 public_programs += [exe]
1613 if conf.get('ENABLE_RESOLVE') == 1
1614 executable('systemd-resolved',
1615 systemd_resolved_sources,
1616 include_directories : includes,
1617 link_with : [libshared,
1619 libsystemd_resolve_core],
1620 dependencies : systemd_resolved_dependencies,
1621 install_rpath : rootlibexecdir,
1623 install_dir : rootlibexecdir)
1625 exe = executable('resolvectl',
1627 include_directories : includes,
1628 link_with : [libshared,
1630 libsystemd_resolve_core],
1631 dependencies : [threads,
1635 install_rpath : rootlibexecdir,
1637 public_programs += [exe]
1639 meson.add_install_script(meson_make_symlink,
1640 join_paths(bindir, 'resolvectl'),
1641 join_paths(rootsbindir, 'resolvconf'))
1643 meson.add_install_script(meson_make_symlink,
1644 join_paths(bindir, 'resolvectl'),
1645 join_paths(bindir, 'systemd-resolve'))
1648 if conf.get('ENABLE_LOGIND') == 1
1649 executable('systemd-logind',
1650 systemd_logind_sources,
1651 include_directories : includes,
1652 link_with : [liblogind_core,
1654 dependencies : [threads,
1656 install_rpath : rootlibexecdir,
1658 install_dir : rootlibexecdir)
1660 exe = executable('loginctl',
1662 include_directories : includes,
1663 link_with : [libshared],
1664 dependencies : [threads,
1667 install_rpath : rootlibexecdir,
1669 install_dir : rootbindir)
1670 public_programs += [exe]
1672 exe = executable('systemd-inhibit',
1673 'src/login/inhibit.c',
1674 include_directories : includes,
1675 link_with : [libshared],
1676 install_rpath : rootlibexecdir,
1678 install_dir : rootbindir)
1679 public_programs += [exe]
1681 if conf.get('HAVE_PAM') == 1
1682 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1683 pam_systemd = shared_library(
1687 include_directories : includes,
1688 link_args : ['-shared',
1689 '-Wl,--version-script=' + version_script_arg],
1690 link_with : [libsystemd_static,
1692 dependencies : [threads,
1695 link_depends : pam_systemd_sym,
1697 install_dir : pamlibdir)
1699 test('dlopen-pam_systemd',
1701 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1705 executable('systemd-user-runtime-dir',
1706 user_runtime_dir_sources,
1707 include_directories : includes,
1708 link_with : [libshared, liblogind_core],
1709 install_rpath : rootlibexecdir,
1711 install_dir : rootlibexecdir)
1713 if conf.get('HAVE_PAM') == 1
1714 executable('systemd-user-sessions',
1715 'src/user-sessions/user-sessions.c',
1716 include_directories : includes,
1717 link_with : [libshared],
1718 install_rpath : rootlibexecdir,
1720 install_dir : rootlibexecdir)
1723 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1724 exe = executable('bootctl',
1725 'src/boot/bootctl.c',
1726 include_directories : includes,
1727 link_with : [libshared],
1728 dependencies : [libblkid],
1729 install_rpath : rootlibexecdir,
1731 public_programs += [exe]
1734 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1735 include_directories : includes,
1736 link_with : [libshared],
1737 dependencies : [threads],
1738 install_rpath : rootlibexecdir,
1740 public_programs += [exe]
1743 if get_option('link-systemctl-shared')
1744 systemctl_link_with = [libshared]
1746 systemctl_link_with = [libsystemd_static,
1752 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1753 include_directories : includes,
1754 link_with : systemctl_link_with,
1755 dependencies : [threads,
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootbindir)
1763 public_programs += [exe]
1765 if conf.get('ENABLE_PORTABLED') == 1
1766 executable('systemd-portabled',
1767 systemd_portabled_sources,
1768 include_directories : includes,
1769 link_with : [libshared],
1770 dependencies : [threads],
1771 install_rpath : rootlibexecdir,
1773 install_dir : rootlibexecdir)
1775 exe = executable('portablectl', 'src/portable/portablectl.c',
1776 include_directories : includes,
1777 link_with : [libshared],
1778 dependencies : [threads],
1779 install_rpath : rootlibexecdir,
1781 install_dir : rootlibexecdir)
1782 public_programs += [exe]
1785 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1786 meson.add_install_script(meson_make_symlink,
1787 join_paths(rootbindir, 'systemctl'),
1788 join_paths(rootsbindir, alias))
1791 if conf.get('ENABLE_BACKLIGHT') == 1
1792 executable('systemd-backlight',
1793 'src/backlight/backlight.c',
1794 include_directories : includes,
1795 link_with : [libshared],
1796 install_rpath : rootlibexecdir,
1798 install_dir : rootlibexecdir)
1801 if conf.get('ENABLE_RFKILL') == 1
1802 executable('systemd-rfkill',
1803 'src/rfkill/rfkill.c',
1804 include_directories : includes,
1805 link_with : [libshared],
1806 install_rpath : rootlibexecdir,
1808 install_dir : rootlibexecdir)
1811 executable('systemd-system-update-generator',
1812 'src/system-update-generator/system-update-generator.c',
1813 include_directories : includes,
1814 link_with : [libshared],
1815 install_rpath : rootlibexecdir,
1817 install_dir : systemgeneratordir)
1819 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1820 executable('systemd-cryptsetup',
1821 'src/cryptsetup/cryptsetup.c',
1822 include_directories : includes,
1823 link_with : [libshared],
1824 dependencies : [libcryptsetup],
1825 install_rpath : rootlibexecdir,
1827 install_dir : rootlibexecdir)
1829 executable('systemd-cryptsetup-generator',
1830 'src/cryptsetup/cryptsetup-generator.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 dependencies : [libcryptsetup],
1834 install_rpath : rootlibexecdir,
1836 install_dir : systemgeneratordir)
1838 executable('systemd-veritysetup',
1839 'src/veritysetup/veritysetup.c',
1840 include_directories : includes,
1841 link_with : [libshared],
1842 dependencies : [libcryptsetup],
1843 install_rpath : rootlibexecdir,
1845 install_dir : rootlibexecdir)
1847 executable('systemd-veritysetup-generator',
1848 'src/veritysetup/veritysetup-generator.c',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 dependencies : [libcryptsetup],
1852 install_rpath : rootlibexecdir,
1854 install_dir : systemgeneratordir)
1857 if conf.get('HAVE_SYSV_COMPAT') == 1
1858 executable('systemd-sysv-generator',
1859 'src/sysv-generator/sysv-generator.c',
1860 include_directories : includes,
1861 link_with : [libshared],
1862 install_rpath : rootlibexecdir,
1864 install_dir : systemgeneratordir)
1866 executable('systemd-rc-local-generator',
1867 'src/rc-local-generator/rc-local-generator.c',
1868 include_directories : includes,
1869 link_with : [libshared],
1870 install_rpath : rootlibexecdir,
1872 install_dir : systemgeneratordir)
1875 if conf.get('ENABLE_HOSTNAMED') == 1
1876 executable('systemd-hostnamed',
1877 'src/hostname/hostnamed.c',
1878 include_directories : includes,
1879 link_with : [libshared],
1880 install_rpath : rootlibexecdir,
1882 install_dir : rootlibexecdir)
1884 exe = executable('hostnamectl',
1885 'src/hostname/hostnamectl.c',
1886 include_directories : includes,
1887 link_with : [libshared],
1888 install_rpath : rootlibexecdir,
1890 public_programs += [exe]
1893 if conf.get('ENABLE_LOCALED') == 1
1894 if conf.get('HAVE_XKBCOMMON') == 1
1895 # logind will load libxkbcommon.so dynamically on its own
1901 executable('systemd-localed',
1902 systemd_localed_sources,
1903 include_directories : includes,
1904 link_with : [libshared],
1905 dependencies : deps,
1906 install_rpath : rootlibexecdir,
1908 install_dir : rootlibexecdir)
1910 exe = executable('localectl',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 install_rpath : rootlibexecdir,
1916 public_programs += [exe]
1919 if conf.get('ENABLE_TIMEDATED') == 1
1920 executable('systemd-timedated',
1921 'src/timedate/timedated.c',
1922 include_directories : includes,
1923 link_with : [libshared],
1924 install_rpath : rootlibexecdir,
1926 install_dir : rootlibexecdir)
1929 if conf.get('ENABLE_TIMEDATECTL') == 1
1930 exe = executable('timedatectl',
1931 'src/timedate/timedatectl.c',
1932 include_directories : includes,
1933 install_rpath : rootlibexecdir,
1934 link_with : [libshared],
1935 dependencies : [libm],
1937 public_programs += [exe]
1940 if conf.get('ENABLE_TIMESYNCD') == 1
1941 executable('systemd-timesyncd',
1942 systemd_timesyncd_sources,
1943 include_directories : includes,
1944 link_with : [libshared],
1945 dependencies : [threads,
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootlibexecdir)
1951 executable('systemd-time-wait-sync',
1952 'src/time-wait-sync/time-wait-sync.c',
1953 include_directories : includes,
1954 link_with : [libshared],
1955 install_rpath : rootlibexecdir,
1957 install_dir : rootlibexecdir)
1960 if conf.get('ENABLE_MACHINED') == 1
1961 executable('systemd-machined',
1962 systemd_machined_sources,
1963 include_directories : includes,
1964 link_with : [libmachine_core,
1966 install_rpath : rootlibexecdir,
1968 install_dir : rootlibexecdir)
1970 exe = executable('machinectl',
1971 'src/machine/machinectl.c',
1972 include_directories : includes,
1973 link_with : [libshared],
1974 dependencies : [threads,
1977 install_rpath : rootlibexecdir,
1979 install_dir : rootbindir)
1980 public_programs += [exe]
1983 if conf.get('ENABLE_IMPORTD') == 1
1984 executable('systemd-importd',
1985 systemd_importd_sources,
1986 include_directories : includes,
1987 link_with : [libshared],
1988 dependencies : [threads],
1989 install_rpath : rootlibexecdir,
1991 install_dir : rootlibexecdir)
1993 systemd_pull = executable('systemd-pull',
1994 systemd_pull_sources,
1995 include_directories : includes,
1996 link_with : [libshared],
1997 dependencies : [libcurl,
2002 install_rpath : rootlibexecdir,
2004 install_dir : rootlibexecdir)
2006 systemd_import = executable('systemd-import',
2007 systemd_import_sources,
2008 include_directories : includes,
2009 link_with : [libshared],
2010 dependencies : [libcurl,
2014 install_rpath : rootlibexecdir,
2016 install_dir : rootlibexecdir)
2018 systemd_export = executable('systemd-export',
2019 systemd_export_sources,
2020 include_directories : includes,
2021 link_with : [libshared],
2022 dependencies : [libcurl,
2026 install_rpath : rootlibexecdir,
2028 install_dir : rootlibexecdir)
2029 public_programs += [systemd_pull, systemd_import, systemd_export]
2032 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2033 exe = executable('systemd-journal-upload',
2034 systemd_journal_upload_sources,
2035 include_directories : includes,
2036 link_with : [libshared],
2037 dependencies : [threads,
2042 install_rpath : rootlibexecdir,
2044 install_dir : rootlibexecdir)
2045 public_programs += [exe]
2048 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2049 s_j_remote = executable('systemd-journal-remote',
2050 systemd_journal_remote_sources,
2051 include_directories : includes,
2052 link_with : [libshared,
2053 libsystemd_journal_remote],
2054 dependencies : [threads,
2059 install_rpath : rootlibexecdir,
2061 install_dir : rootlibexecdir)
2063 s_j_gatewayd = executable('systemd-journal-gatewayd',
2064 systemd_journal_gatewayd_sources,
2065 include_directories : includes,
2066 link_with : [libshared],
2067 dependencies : [threads,
2072 install_rpath : rootlibexecdir,
2074 install_dir : rootlibexecdir)
2075 public_programs += [s_j_remote, s_j_gatewayd]
2078 if conf.get('ENABLE_COREDUMP') == 1
2079 executable('systemd-coredump',
2080 systemd_coredump_sources,
2081 include_directories : includes,
2082 link_with : [libshared],
2083 dependencies : [threads,
2088 install_rpath : rootlibexecdir,
2090 install_dir : rootlibexecdir)
2092 exe = executable('coredumpctl',
2093 coredumpctl_sources,
2094 include_directories : includes,
2095 link_with : [libshared],
2096 dependencies : [threads,
2099 install_rpath : rootlibexecdir,
2101 public_programs += [exe]
2104 if conf.get('ENABLE_BINFMT') == 1
2105 exe = executable('systemd-binfmt',
2106 'src/binfmt/binfmt.c',
2107 include_directories : includes,
2108 link_with : [libshared],
2109 install_rpath : rootlibexecdir,
2111 install_dir : rootlibexecdir)
2112 public_programs += [exe]
2114 meson.add_install_script('sh', '-c',
2115 mkdir_p.format(binfmtdir))
2116 meson.add_install_script('sh', '-c',
2117 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2120 if conf.get('ENABLE_VCONSOLE') == 1
2121 executable('systemd-vconsole-setup',
2122 'src/vconsole/vconsole-setup.c',
2123 include_directories : includes,
2124 link_with : [libshared],
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootlibexecdir)
2130 if conf.get('ENABLE_RANDOMSEED') == 1
2131 executable('systemd-random-seed',
2132 'src/random-seed/random-seed.c',
2133 include_directories : includes,
2134 link_with : [libshared],
2135 install_rpath : rootlibexecdir,
2137 install_dir : rootlibexecdir)
2140 if conf.get('ENABLE_FIRSTBOOT') == 1
2141 executable('systemd-firstboot',
2142 'src/firstboot/firstboot.c',
2143 include_directories : includes,
2144 link_with : [libshared],
2145 dependencies : [libcrypt],
2146 install_rpath : rootlibexecdir,
2148 install_dir : rootbindir)
2151 executable('systemd-remount-fs',
2152 'src/remount-fs/remount-fs.c',
2153 'src/core/mount-setup.c',
2154 'src/core/mount-setup.h',
2155 include_directories : includes,
2156 link_with : [libshared],
2157 install_rpath : rootlibexecdir,
2159 install_dir : rootlibexecdir)
2161 executable('systemd-machine-id-setup',
2162 'src/machine-id-setup/machine-id-setup-main.c',
2163 'src/core/machine-id-setup.c',
2164 'src/core/machine-id-setup.h',
2165 include_directories : includes,
2166 link_with : [libshared],
2167 install_rpath : rootlibexecdir,
2169 install_dir : rootbindir)
2171 executable('systemd-fsck',
2173 include_directories : includes,
2174 link_with : [libshared],
2175 install_rpath : rootlibexecdir,
2177 install_dir : rootlibexecdir)
2179 executable('systemd-growfs',
2180 'src/partition/growfs.c',
2181 include_directories : includes,
2182 link_with : [libshared],
2183 dependencies : [libcryptsetup],
2184 install_rpath : rootlibexecdir,
2186 install_dir : rootlibexecdir)
2188 executable('systemd-makefs',
2189 'src/partition/makefs.c',
2190 include_directories : includes,
2191 link_with : [libshared],
2192 install_rpath : rootlibexecdir,
2194 install_dir : rootlibexecdir)
2196 executable('systemd-sleep',
2197 'src/sleep/sleep.c',
2198 include_directories : includes,
2199 link_with : [libshared],
2200 install_rpath : rootlibexecdir,
2202 install_dir : rootlibexecdir)
2204 exe = executable('systemd-sysctl',
2205 'src/sysctl/sysctl.c',
2206 include_directories : includes,
2207 link_with : [libshared],
2208 install_rpath : rootlibexecdir,
2210 install_dir : rootlibexecdir)
2211 public_programs += [exe]
2213 executable('systemd-ac-power',
2214 'src/ac-power/ac-power.c',
2215 include_directories : includes,
2216 link_with : [libshared],
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootlibexecdir)
2221 exe = executable('systemd-detect-virt',
2222 'src/detect-virt/detect-virt.c',
2223 include_directories : includes,
2224 link_with : [libshared],
2225 install_rpath : rootlibexecdir,
2227 public_programs += [exe]
2229 exe = executable('systemd-delta',
2230 'src/delta/delta.c',
2231 include_directories : includes,
2232 link_with : [libshared],
2233 install_rpath : rootlibexecdir,
2235 public_programs += [exe]
2237 exe = executable('systemd-escape',
2238 'src/escape/escape.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 install_rpath : rootlibexecdir,
2243 install_dir : rootbindir)
2244 public_programs += [exe]
2246 exe = executable('systemd-notify',
2247 'src/notify/notify.c',
2248 include_directories : includes,
2249 link_with : [libshared],
2250 install_rpath : rootlibexecdir,
2252 install_dir : rootbindir)
2253 public_programs += [exe]
2255 executable('systemd-volatile-root',
2256 'src/volatile-root/volatile-root.c',
2257 include_directories : includes,
2258 link_with : [libshared],
2259 install_rpath : rootlibexecdir,
2261 install_dir : rootlibexecdir)
2263 executable('systemd-cgroups-agent',
2264 'src/cgroups-agent/cgroups-agent.c',
2265 include_directories : includes,
2266 link_with : [libshared],
2267 install_rpath : rootlibexecdir,
2269 install_dir : rootlibexecdir)
2271 exe = executable('systemd-path',
2273 include_directories : includes,
2274 link_with : [libshared],
2275 install_rpath : rootlibexecdir,
2277 public_programs += [exe]
2279 exe = executable('systemd-ask-password',
2280 'src/ask-password/ask-password.c',
2281 include_directories : includes,
2282 link_with : [libshared],
2283 install_rpath : rootlibexecdir,
2285 install_dir : rootbindir)
2286 public_programs += [exe]
2288 executable('systemd-reply-password',
2289 'src/reply-password/reply-password.c',
2290 include_directories : includes,
2291 link_with : [libshared],
2292 install_rpath : rootlibexecdir,
2294 install_dir : rootlibexecdir)
2296 exe = executable('systemd-tty-ask-password-agent',
2297 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2298 include_directories : includes,
2299 link_with : [libshared],
2300 install_rpath : rootlibexecdir,
2302 install_dir : rootbindir)
2303 public_programs += [exe]
2305 exe = executable('systemd-cgls',
2307 include_directories : includes,
2308 link_with : [libshared],
2309 install_rpath : rootlibexecdir,
2311 public_programs += [exe]
2313 exe = executable('systemd-cgtop',
2314 'src/cgtop/cgtop.c',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 install_rpath : rootlibexecdir,
2319 public_programs += [exe]
2321 executable('systemd-initctl',
2322 'src/initctl/initctl.c',
2323 include_directories : includes,
2324 link_with : [libshared],
2325 install_rpath : rootlibexecdir,
2327 install_dir : rootlibexecdir)
2329 exe = executable('systemd-mount',
2330 'src/mount/mount-tool.c',
2331 include_directories : includes,
2332 link_with : [libshared],
2333 install_rpath : rootlibexecdir,
2335 public_programs += [exe]
2337 meson.add_install_script(meson_make_symlink,
2338 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2340 exe = executable('systemd-run',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2346 public_programs += [exe]
2348 exe = executable('systemd-stdio-bridge',
2349 'src/stdio-bridge/stdio-bridge.c',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 install_rpath : rootlibexecdir,
2354 public_programs += [exe]
2356 exe = executable('busctl',
2357 'src/busctl/busctl.c',
2358 'src/busctl/busctl-introspect.c',
2359 'src/busctl/busctl-introspect.h',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 public_programs += [exe]
2366 if conf.get('ENABLE_SYSUSERS') == 1
2367 exe = executable('systemd-sysusers',
2368 'src/sysusers/sysusers.c',
2369 include_directories : includes,
2370 link_with : [libshared],
2371 install_rpath : rootlibexecdir,
2373 install_dir : rootbindir)
2374 public_programs += [exe]
2377 if conf.get('ENABLE_TMPFILES') == 1
2378 exe = executable('systemd-tmpfiles',
2379 'src/tmpfiles/tmpfiles.c',
2380 include_directories : includes,
2381 link_with : [libshared],
2382 dependencies : [libacl],
2383 install_rpath : rootlibexecdir,
2385 install_dir : rootbindir)
2386 public_programs += [exe]
2388 test('test-systemd-tmpfiles',
2389 test_systemd_tmpfiles_py,
2390 args : exe.full_path())
2391 # https://github.com/mesonbuild/meson/issues/2681
2394 if conf.get('ENABLE_HWDB') == 1
2395 exe = executable('systemd-hwdb',
2397 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2398 include_directories : includes,
2399 link_with : [libudev_static],
2400 install_rpath : udev_rpath,
2402 install_dir : rootbindir)
2403 public_programs += [exe]
2406 if conf.get('ENABLE_QUOTACHECK') == 1
2407 executable('systemd-quotacheck',
2408 'src/quotacheck/quotacheck.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2413 install_dir : rootlibexecdir)
2416 exe = executable('systemd-socket-proxyd',
2417 'src/socket-proxy/socket-proxyd.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 dependencies : [threads],
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootlibexecdir)
2424 public_programs += [exe]
2426 exe = executable('systemd-udevd',
2427 systemd_udevd_sources,
2428 include_directories : includes,
2429 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2430 link_with : [libudev_core,
2433 dependencies : [threads,
2438 install_rpath : udev_rpath,
2440 install_dir : rootlibexecdir)
2441 public_programs += [exe]
2443 exe = executable('udevadm',
2445 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2446 include_directories : includes,
2447 link_with : [libudev_core,
2450 dependencies : [threads,
2455 install_rpath : udev_rpath,
2457 install_dir : rootbindir)
2458 public_programs += [exe]
2460 executable('systemd-shutdown',
2461 systemd_shutdown_sources,
2462 include_directories : includes,
2463 link_with : [libshared],
2464 dependencies : [libmount],
2465 install_rpath : rootlibexecdir,
2467 install_dir : rootlibexecdir)
2469 executable('systemd-update-done',
2470 'src/update-done/update-done.c',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2475 install_dir : rootlibexecdir)
2477 executable('systemd-update-utmp',
2478 'src/update-utmp/update-utmp.c',
2479 include_directories : includes,
2480 link_with : [libshared],
2481 dependencies : [libaudit],
2482 install_rpath : rootlibexecdir,
2484 install_dir : rootlibexecdir)
2486 if conf.get('HAVE_KMOD') == 1
2487 executable('systemd-modules-load',
2488 'src/modules-load/modules-load.c',
2489 include_directories : includes,
2490 link_with : [libshared],
2491 dependencies : [libkmod],
2492 install_rpath : rootlibexecdir,
2494 install_dir : rootlibexecdir)
2496 meson.add_install_script('sh', '-c',
2497 mkdir_p.format(modulesloaddir))
2498 meson.add_install_script('sh', '-c',
2499 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2502 exe = executable('systemd-nspawn',
2503 systemd_nspawn_sources,
2504 'src/core/mount-setup.c', # FIXME: use a variable?
2505 'src/core/mount-setup.h',
2506 'src/core/loopback-setup.c',
2507 'src/core/loopback-setup.h',
2508 include_directories : includes,
2509 link_with : [libnspawn_core,
2511 dependencies : [libblkid],
2512 install_rpath : rootlibexecdir,
2514 public_programs += [exe]
2516 if conf.get('ENABLE_NETWORKD') == 1
2517 executable('systemd-networkd',
2518 systemd_networkd_sources,
2519 include_directories : includes,
2520 link_with : [libnetworkd_core,
2524 dependencies : [threads],
2525 install_rpath : rootlibexecdir,
2527 install_dir : rootlibexecdir)
2529 executable('systemd-networkd-wait-online',
2530 systemd_networkd_wait_online_sources,
2531 include_directories : includes,
2532 link_with : [libnetworkd_core,
2534 install_rpath : rootlibexecdir,
2536 install_dir : rootlibexecdir)
2538 exe = executable('networkctl',
2540 include_directories : includes,
2541 link_with : [libsystemd_network,
2543 install_rpath : rootlibexecdir,
2545 install_dir : rootbindir)
2546 public_programs += [exe]
2549 executable('systemd-sulogin-shell',
2550 ['src/sulogin-shell/sulogin-shell.c'],
2551 include_directories : includes,
2552 link_with : [libshared],
2553 install_rpath : rootlibexecdir,
2555 install_dir : rootlibexecdir)
2557 ############################################################
2559 foreach tuple : tests
2561 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2562 dependencies = tuple[2]
2563 condition = tuple.length() >= 4 ? tuple[3] : ''
2564 type = tuple.length() >= 5 ? tuple[4] : ''
2565 defs = tuple.length() >= 6 ? tuple[5] : []
2566 incs = tuple.length() >= 7 ? tuple[6] : includes
2569 name = sources[0].split('/')[-1].split('.')[0]
2570 if type.startswith('timeout=')
2571 timeout = type.split('=')[1].to_int()
2574 if want_tests == 'false'
2575 message('Not compiling @0@ because tests is set to false'.format(name))
2576 elif condition == '' or conf.get(condition) == 1
2580 include_directories : incs,
2581 link_with : link_with,
2582 dependencies : dependencies,
2584 install_rpath : rootlibexecdir,
2585 install : install_tests,
2586 install_dir : join_paths(testsdir, type))
2589 message('@0@ is a manual test'.format(name))
2590 elif type == 'unsafe' and want_tests != 'unsafe'
2591 message('@0@ is an unsafe test'.format(name))
2598 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2603 'test-libsystemd-sym',
2604 test_libsystemd_sym_c,
2605 include_directories : includes,
2606 link_with : [libsystemd],
2607 install : install_tests,
2608 install_dir : testsdir)
2609 test('test-libsystemd-sym', exe)
2612 'test-libsystemd-static-sym',
2613 test_libsystemd_sym_c,
2614 include_directories : includes,
2615 link_with : [install_libsystemd_static],
2616 dependencies : [threads], # threads is already included in dependencies on the library,
2617 # but does not seem to get propagated. Add here as a work-around.
2618 build_by_default : static_libsystemd_pic,
2619 install : install_tests and static_libsystemd_pic,
2620 install_dir : testsdir)
2621 if static_libsystemd_pic
2622 test('test-libsystemd-static-sym', exe)
2628 include_directories : includes,
2629 c_args : ['-Wno-deprecated-declarations'],
2630 link_with : [libudev],
2631 install : install_tests,
2632 install_dir : testsdir)
2633 test('test-libudev-sym', exe)
2636 'test-libudev-static-sym',
2638 include_directories : includes,
2639 c_args : ['-Wno-deprecated-declarations'],
2640 link_with : [install_libudev_static],
2641 build_by_default : static_libudev_pic,
2642 install : install_tests and static_libudev_pic,
2643 install_dir : testsdir)
2644 if static_libudev_pic
2645 test('test-libudev-static-sym', exe)
2648 ############################################################
2652 foreach tuple : fuzzers
2654 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2655 dependencies = tuple[2]
2656 defs = tuple.length() >= 4 ? tuple[3] : []
2657 incs = tuple.length() >= 5 ? tuple[4] : includes
2660 dependencies += fuzzing_engine
2662 sources += 'src/fuzz/fuzz-main.c'
2665 name = sources[0].split('/')[-1].split('.')[0]
2667 fuzzer_exes += executable(
2670 include_directories : [incs, include_directories('src/fuzz')],
2671 link_with : link_with,
2672 dependencies : dependencies,
2677 run_target('fuzzers',
2678 depends : fuzzer_exes,
2681 ############################################################
2683 make_directive_index_py = find_program('tools/make-directive-index.py')
2684 make_man_index_py = find_program('tools/make-man-index.py')
2685 xml_helper_py = find_program('tools/xml_helper.py')
2686 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2690 subdir('sysusers.d')
2691 subdir('tmpfiles.d')
2696 subdir('shell-completion/bash')
2697 subdir('shell-completion/zsh')
2698 subdir('doc/sysvinit')
2699 subdir('doc/var-log')
2701 # FIXME: figure out if the warning is true:
2702 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2703 install_subdir('factory/etc',
2704 install_dir : factorydir)
2707 install_data('xorg/50-systemd-user.sh',
2708 install_dir : xinitrcdir)
2709 install_data('modprobe.d/systemd.conf',
2710 install_dir : modprobedir)
2711 install_data('LICENSE.GPL2',
2716 'doc/DISTRO_PORTING',
2717 'doc/ENVIRONMENT.md',
2719 'doc/TRANSIENT-SETTINGS.md',
2722 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2723 install_dir : docdir)
2725 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2726 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2728 ############################################################
2730 meson_check_help = find_program('tools/meson-check-help.sh')
2732 foreach exec : public_programs
2733 name = exec.full_path().split('/')[-1]
2734 test('check-help-' + name,
2736 args : [exec.full_path()])
2739 ############################################################
2741 # Enable tests for all supported sanitizers
2742 foreach tuple : sanitizers
2743 sanitizer = tuple[0]
2746 have = run_command(check_compilation_sh,
2747 cc.cmd_array(), '-x', 'c',
2748 '-fsanitize=@0@'.format(sanitizer),
2749 '-include', link_test_c).returncode() == 0
2750 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2754 foreach p : fuzz_regression_tests
2755 b = p.split('/')[-2]
2756 c = p.split('/')[-1]
2758 name = '@0@:@1@'.format(b, sanitizer)
2761 if want_tests == 'false'
2762 message('Not compiling @0@ because tests is set to false'.format(name))
2764 exe = custom_target(
2768 command : [env, 'ln', '-fs',
2769 join_paths(build.full_path(), b),
2771 build_by_default : true)
2773 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2778 if want_tests != 'false' and slow_tests
2779 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2781 args : [exe.full_path(),
2782 join_paths(meson.source_root(),
2783 'test/fuzz-regressions',
2791 ############################################################
2794 all_files = run_command(
2796 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2799 all_files = files(all_files.stdout().split())
2804 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2807 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2811 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2814 command : [meson_git_contrib_sh])
2818 git_head = run_command(
2820 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2821 'rev-parse', 'HEAD']).stdout().strip()
2822 git_head_short = run_command(
2824 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2825 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2829 command : ['git', 'archive',
2830 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2832 '--prefix', 'systemd-@0@/'.format(git_head),
2836 ############################################################
2838 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2841 depends : [man, libsystemd, libudev],
2842 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2844 ############################################################
2847 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2849 'split /usr: @0@'.format(split_usr),
2850 'split bin-sbin: @0@'.format(split_bin),
2851 'prefix directory: @0@'.format(prefixdir),
2852 'rootprefix directory: @0@'.format(rootprefixdir),
2853 'sysconf directory: @0@'.format(sysconfdir),
2854 'include directory: @0@'.format(includedir),
2855 'lib directory: @0@'.format(libdir),
2856 'rootlib directory: @0@'.format(rootlibdir),
2857 'SysV init scripts: @0@'.format(sysvinit_path),
2858 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2859 'PAM modules directory: @0@'.format(pamlibdir),
2860 'PAM configuration directory: @0@'.format(pamconfdir),
2861 'RPM macros directory: @0@'.format(rpmmacrosdir),
2862 'modprobe.d directory: @0@'.format(modprobedir),
2863 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2864 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2865 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2866 'bash completions directory: @0@'.format(bashcompletiondir),
2867 'zsh completions directory: @0@'.format(zshcompletiondir),
2868 'extra start script: @0@'.format(get_option('rc-local')),
2869 'extra stop script: @0@'.format(get_option('halt-local')),
2870 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2871 get_option('debug-tty')),
2872 'TTY GID: @0@'.format(tty_gid),
2873 'users GID: @0@'.format(users_gid),
2874 'maximum system UID: @0@'.format(system_uid_max),
2875 'maximum system GID: @0@'.format(system_gid_max),
2876 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2877 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2878 'minimum container UID base: @0@'.format(container_uid_base_min),
2879 'maximum container UID base: @0@'.format(container_uid_base_max),
2880 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2881 'render group access mode: @0@'.format(get_option('group-render-mode')),
2882 'certificate root directory: @0@'.format(get_option('certificate-root')),
2883 'support URL: @0@'.format(support_url),
2884 'nobody user name: @0@'.format(nobody_user),
2885 'nobody group name: @0@'.format(nobody_group),
2886 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2887 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2889 'default DNSSEC mode: @0@'.format(default_dnssec),
2890 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2891 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2892 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2894 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2895 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2897 'default DNS servers: @0@'.format(alt_dns_servers),
2898 'default NTP servers: @0@'.format(alt_ntp_servers)]
2900 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2901 '@@0@'.format(time_epoch)).stdout().strip()
2903 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2906 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2907 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2908 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2910 if conf.get('ENABLE_EFI') == 1
2912 'efi arch: @0@'.format(efi_arch)]
2916 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2917 'EFI CC @0@'.format(efi_cc),
2918 'EFI lib directory: @0@'.format(efi_libdir),
2919 'EFI lds directory: @0@'.format(efi_ldsdir),
2920 'EFI include directory: @0@'.format(efi_incdir)]
2975 ['legacy pkla', install_polkit_pkla],
2977 ['gnu-efi', have_gnu_efi],
2984 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2987 ['man pages', want_man],
2988 ['html pages', want_html],
2989 ['man page indices', want_man and have_lxml],
2994 ['adm group', get_option('adm-group')],
2995 ['wheel group', get_option('wheel-group')],
2998 ['debug mmap cache'],
2999 ['valgrind', conf.get('VALGRIND') == 1],
3002 if tuple.length() >= 2
3005 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3006 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3007 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3012 missing += [tuple[0]]
3018 'enabled features: @0@'.format(', '.join(found)),
3020 'disabled features: @0@'.format(', '.join(missing)),
3022 message('\n '.join(status))
3024 if rootprefixdir != rootprefix_default
3026 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3027 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3028 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))