1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.45',
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().to_int()
642 conf.set('TIME_EPOCH', time_epoch)
644 system_uid_max = get_option('system-uid-max')
645 if system_uid_max == -1
646 system_uid_max = run_command(
648 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
649 '/etc/login.defs').stdout().strip()
650 if system_uid_max == ''
653 system_uid_max = system_uid_max.to_int()
656 conf.set('SYSTEM_UID_MAX', system_uid_max)
657 substs.set('systemuidmax', system_uid_max)
659 system_gid_max = get_option('system-gid-max')
660 if system_gid_max == -1
661 system_gid_max = run_command(
663 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
664 '/etc/login.defs').stdout().strip()
665 if system_gid_max == ''
668 system_gid_max = system_gid_max.to_int()
671 conf.set('SYSTEM_GID_MAX', system_gid_max)
672 substs.set('systemgidmax', system_gid_max)
674 dynamic_uid_min = get_option('dynamic-uid-min')
675 dynamic_uid_max = get_option('dynamic-uid-max')
676 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
677 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
678 substs.set('dynamicuidmin', dynamic_uid_min)
679 substs.set('dynamicuidmax', dynamic_uid_max)
681 container_uid_base_min = get_option('container-uid-base-min')
682 container_uid_base_max = get_option('container-uid-base-max')
683 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
684 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
685 substs.set('containeruidbasemin', container_uid_base_min)
686 substs.set('containeruidbasemax', container_uid_base_max)
688 nobody_user = get_option('nobody-user')
689 nobody_group = get_option('nobody-group')
691 if not meson.is_cross_build()
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.')
730 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
732 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
733 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
736 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
737 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
738 substs.set('NOBODY_USER_NAME', nobody_user)
739 substs.set('NOBODY_GROUP_NAME', nobody_group)
741 tty_gid = get_option('tty-gid')
742 conf.set('TTY_GID', tty_gid)
743 substs.set('TTY_GID', tty_gid)
745 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
746 users_gid = get_option('users-gid')
747 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
749 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
750 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
752 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
753 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
755 kill_user_processes = get_option('default-kill-user-processes')
756 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
757 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
758 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
760 dns_servers = get_option('dns-servers')
761 conf.set_quoted('DNS_SERVERS', dns_servers)
762 substs.set('DNS_SERVERS', dns_servers)
764 ntp_servers = get_option('ntp-servers')
765 conf.set_quoted('NTP_SERVERS', ntp_servers)
766 substs.set('NTP_SERVERS', ntp_servers)
768 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
770 substs.set('SUSHELL', get_option('debug-shell'))
771 substs.set('DEBUGTTY', get_option('debug-tty'))
773 enable_debug_hashmap = false
774 enable_debug_mmap_cache = false
775 foreach name : get_option('debug')
777 enable_debug_hashmap = true
778 elif name == 'mmap-cache'
779 enable_debug_mmap_cache = true
781 message('unknown debug option "@0@", ignoring'.format(name))
784 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
785 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
787 conf.set10('VALGRIND', get_option('valgrind'))
789 #####################################################################
791 threads = dependency('threads')
792 librt = cc.find_library('rt')
793 libm = cc.find_library('m')
794 libdl = cc.find_library('dl')
795 libcrypt = cc.find_library('crypt')
797 libcap = dependency('libcap', required : false)
798 if not libcap.found()
799 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
800 libcap = cc.find_library('cap')
803 libmount = dependency('mount',
804 version : fuzzer_build ? '>= 0' : '>= 2.30')
806 want_seccomp = get_option('seccomp')
807 if want_seccomp != 'false' and not fuzzer_build
808 libseccomp = dependency('libseccomp',
809 version : '>= 2.3.1',
810 required : want_seccomp == 'true')
811 have = libseccomp.found()
816 conf.set10('HAVE_SECCOMP', have)
818 want_selinux = get_option('selinux')
819 if want_selinux != 'false' and not fuzzer_build
820 libselinux = dependency('libselinux',
821 version : '>= 2.1.9',
822 required : want_selinux == 'true')
823 have = libselinux.found()
828 conf.set10('HAVE_SELINUX', have)
830 want_apparmor = get_option('apparmor')
831 if want_apparmor != 'false' and not fuzzer_build
832 libapparmor = dependency('libapparmor',
833 required : want_apparmor == 'true')
834 have = libapparmor.found()
839 conf.set10('HAVE_APPARMOR', have)
841 smack_run_label = get_option('smack-run-label')
842 if smack_run_label != ''
843 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
846 want_polkit = get_option('polkit')
847 install_polkit = false
848 install_polkit_pkla = false
849 if want_polkit != 'false' and not fuzzer_build
850 install_polkit = true
852 libpolkit = dependency('polkit-gobject-1',
854 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
855 message('Old polkit detected, will install pkla files')
856 install_polkit_pkla = true
859 conf.set10('ENABLE_POLKIT', install_polkit)
861 want_acl = get_option('acl')
862 if want_acl != 'false' and not fuzzer_build
863 libacl = cc.find_library('acl', required : want_acl == 'true')
864 have = libacl.found()
869 conf.set10('HAVE_ACL', have)
871 want_audit = get_option('audit')
872 if want_audit != 'false' and not fuzzer_build
873 libaudit = dependency('audit', required : want_audit == 'true')
874 have = libaudit.found()
879 conf.set10('HAVE_AUDIT', have)
881 want_blkid = get_option('blkid')
882 if want_blkid != 'false' and not fuzzer_build
883 libblkid = dependency('blkid', required : want_blkid == 'true')
884 have = libblkid.found()
889 conf.set10('HAVE_BLKID', have)
891 want_kmod = get_option('kmod')
892 if want_kmod != 'false' and not fuzzer_build
893 libkmod = dependency('libkmod',
895 required : want_kmod == 'true')
896 have = libkmod.found()
901 conf.set10('HAVE_KMOD', have)
903 want_pam = get_option('pam')
904 if want_pam != 'false' and not fuzzer_build
905 libpam = cc.find_library('pam', required : want_pam == 'true')
906 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
907 have = libpam.found() and libpam_misc.found()
913 conf.set10('HAVE_PAM', have)
915 want_microhttpd = get_option('microhttpd')
916 if want_microhttpd != 'false' and not fuzzer_build
917 libmicrohttpd = dependency('libmicrohttpd',
918 version : '>= 0.9.33',
919 required : want_microhttpd == 'true')
920 have = libmicrohttpd.found()
925 conf.set10('HAVE_MICROHTTPD', have)
927 want_libcryptsetup = get_option('libcryptsetup')
928 if want_libcryptsetup != 'false' and not fuzzer_build
929 libcryptsetup = dependency('libcryptsetup',
930 version : '>= 1.6.0',
931 required : want_libcryptsetup == 'true')
932 have = libcryptsetup.found()
937 conf.set10('HAVE_LIBCRYPTSETUP', have)
939 want_libcurl = get_option('libcurl')
940 if want_libcurl != 'false' and not fuzzer_build
941 libcurl = dependency('libcurl',
942 version : '>= 7.32.0',
943 required : want_libcurl == 'true')
944 have = libcurl.found()
949 conf.set10('HAVE_LIBCURL', have)
951 want_libidn = get_option('libidn')
952 want_libidn2 = get_option('libidn2')
953 if want_libidn == 'true' and want_libidn2 == 'true'
954 error('libidn and libidn2 cannot be requested simultaneously')
957 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
958 libidn = dependency('libidn',
959 required : want_libidn == 'true')
960 have = libidn.found()
965 conf.set10('HAVE_LIBIDN', have)
966 if not have and want_libidn2 != 'false' and not fuzzer_build
967 # libidn is used for both libidn and libidn2 objects
968 libidn = dependency('libidn2',
969 required : want_libidn2 == 'true')
970 have = libidn.found()
974 conf.set10('HAVE_LIBIDN2', have)
976 want_libiptc = get_option('libiptc')
977 if want_libiptc != 'false' and not fuzzer_build
978 libiptc = dependency('libiptc',
979 required : want_libiptc == 'true')
980 have = libiptc.found()
985 conf.set10('HAVE_LIBIPTC', have)
987 want_qrencode = get_option('qrencode')
988 if want_qrencode != 'false' and not fuzzer_build
989 libqrencode = dependency('libqrencode',
990 required : want_qrencode == 'true')
991 have = libqrencode.found()
996 conf.set10('HAVE_QRENCODE', have)
998 want_gcrypt = get_option('gcrypt')
999 if want_gcrypt != 'false' and not fuzzer_build
1000 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1001 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1002 have = libgcrypt.found() and libgpg_error.found()
1007 # link to neither of the libs if one is not found
1011 conf.set10('HAVE_GCRYPT', have)
1013 want_gnutls = get_option('gnutls')
1014 if want_gnutls != 'false' and not fuzzer_build
1015 libgnutls = dependency('gnutls',
1016 version : '>= 3.1.4',
1017 required : want_gnutls == 'true')
1018 have = libgnutls.found()
1023 conf.set10('HAVE_GNUTLS', have)
1025 want_elfutils = get_option('elfutils')
1026 if want_elfutils != 'false' and not fuzzer_build
1027 libdw = dependency('libdw',
1028 required : want_elfutils == 'true')
1029 have = libdw.found()
1034 conf.set10('HAVE_ELFUTILS', have)
1036 want_zlib = get_option('zlib')
1037 if want_zlib != 'false' and not fuzzer_build
1038 libz = dependency('zlib',
1039 required : want_zlib == 'true')
1045 conf.set10('HAVE_ZLIB', have)
1047 want_bzip2 = get_option('bzip2')
1048 if want_bzip2 != 'false' and not fuzzer_build
1049 libbzip2 = cc.find_library('bz2',
1050 required : want_bzip2 == 'true')
1051 have = libbzip2.found()
1056 conf.set10('HAVE_BZIP2', have)
1058 want_xz = get_option('xz')
1059 if want_xz != 'false' and not fuzzer_build
1060 libxz = dependency('liblzma',
1061 required : want_xz == 'true')
1062 have = libxz.found()
1067 conf.set10('HAVE_XZ', have)
1069 want_lz4 = get_option('lz4')
1070 if want_lz4 != 'false' and not fuzzer_build
1071 liblz4 = dependency('liblz4',
1072 required : want_lz4 == 'true')
1073 have = liblz4.found()
1078 conf.set10('HAVE_LZ4', have)
1080 want_xkbcommon = get_option('xkbcommon')
1081 if want_xkbcommon != 'false' and not fuzzer_build
1082 libxkbcommon = dependency('xkbcommon',
1083 version : '>= 0.3.0',
1084 required : want_xkbcommon == 'true')
1085 have = libxkbcommon.found()
1090 conf.set10('HAVE_XKBCOMMON', have)
1092 want_pcre2 = get_option('pcre2')
1093 if want_pcre2 != 'false'
1094 libpcre2 = dependency('libpcre2-8',
1095 required : want_pcre2 == 'true')
1096 have = libpcre2.found()
1101 conf.set10('HAVE_PCRE2', have)
1103 want_glib = get_option('glib')
1104 if want_glib != 'false' and not fuzzer_build
1105 libglib = dependency('glib-2.0',
1106 version : '>= 2.22.0',
1107 required : want_glib == 'true')
1108 libgobject = dependency('gobject-2.0',
1109 version : '>= 2.22.0',
1110 required : want_glib == 'true')
1111 libgio = dependency('gio-2.0',
1112 required : want_glib == 'true')
1113 have = libglib.found() and libgobject.found() and libgio.found()
1120 conf.set10('HAVE_GLIB', have)
1122 want_dbus = get_option('dbus')
1123 if want_dbus != 'false' and not fuzzer_build
1124 libdbus = dependency('dbus-1',
1125 version : '>= 1.3.2',
1126 required : want_dbus == 'true')
1127 have = libdbus.found()
1132 conf.set10('HAVE_DBUS', have)
1134 default_dnssec = get_option('default-dnssec')
1136 default_dnssec = 'no'
1138 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1139 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1140 default_dnssec = 'no'
1142 conf.set('DEFAULT_DNSSEC_MODE',
1143 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1144 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1146 dns_over_tls = get_option('dns-over-tls')
1147 if dns_over_tls != 'false'
1148 have = (conf.get('HAVE_GNUTLS') == 1 and
1149 libgnutls.version().version_compare('>=3.5.3'))
1150 if dns_over_tls == 'true' and not have
1151 error('DNS-over-TLS support was requested, but dependencies are not available')
1156 conf.set10('ENABLE_DNS_OVER_TLS', have)
1158 default_dns_over_tls = get_option('default-dns-over-tls')
1160 default_dns_over_tls = 'no'
1162 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1163 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1164 default_dns_over_tls = 'no'
1166 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1167 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1168 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1170 want_importd = get_option('importd')
1171 if want_importd != 'false'
1172 have = (conf.get('HAVE_LIBCURL') == 1 and
1173 conf.get('HAVE_ZLIB') == 1 and
1174 conf.get('HAVE_BZIP2') == 1 and
1175 conf.get('HAVE_XZ') == 1 and
1176 conf.get('HAVE_GCRYPT') == 1)
1177 if want_importd == 'true' and not have
1178 error('importd support was requested, but dependencies are not available')
1183 conf.set10('ENABLE_IMPORTD', have)
1185 want_remote = get_option('remote')
1186 if want_remote != 'false'
1187 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1188 conf.get('HAVE_LIBCURL') == 1]
1189 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1190 # it's possible to build one without the other. Complain only if
1191 # support was explictly requested. The auxiliary files like sysusers
1192 # config should be installed when any of the programs are built.
1193 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1194 error('remote support was requested, but dependencies are not available')
1196 have = have_deps[0] or have_deps[1]
1200 conf.set10('ENABLE_REMOTE', have)
1202 foreach term : ['utmp',
1234 have = get_option(term)
1235 name = 'ENABLE_' + term.underscorify().to_upper()
1236 conf.set10(name, have)
1239 foreach tuple : [['nss-mymachines', 'machined'],
1240 ['nss-resolve', 'resolve']]
1241 want = get_option(tuple[0])
1243 have = get_option(tuple[1])
1244 if want == 'true' and not have
1245 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1250 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1251 conf.set10(name, have)
1255 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1256 'ENABLE_NSS_MYMACHINES',
1257 'ENABLE_NSS_RESOLVE',
1258 'ENABLE_NSS_SYSTEMD']
1259 if conf.get(term) == 1
1263 conf.set10('ENABLE_NSS', enable_nss)
1265 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1267 want_tests = get_option('tests')
1268 install_tests = get_option('install-tests')
1269 slow_tests = get_option('slow-tests')
1273 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1275 #####################################################################
1277 if get_option('efi')
1278 efi_arch = host_machine.cpu_family()
1280 if efi_arch == 'x86'
1281 EFI_MACHINE_TYPE_NAME = 'ia32'
1282 gnu_efi_arch = 'ia32'
1283 elif efi_arch == 'x86_64'
1284 EFI_MACHINE_TYPE_NAME = 'x64'
1285 gnu_efi_arch = 'x86_64'
1286 elif efi_arch == 'arm'
1287 EFI_MACHINE_TYPE_NAME = 'arm'
1288 gnu_efi_arch = 'arm'
1289 elif efi_arch == 'aarch64'
1290 EFI_MACHINE_TYPE_NAME = 'aa64'
1291 gnu_efi_arch = 'aarch64'
1293 EFI_MACHINE_TYPE_NAME = ''
1298 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1300 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1304 conf.set10('ENABLE_EFI', have)
1306 #####################################################################
1308 config_h = configure_file(
1309 output : 'config.h',
1310 configuration : conf)
1312 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1314 includes = include_directories('src/basic',
1318 'src/journal-remote',
1322 'src/time-wait-sync',
1327 'src/libsystemd/sd-bus',
1328 'src/libsystemd/sd-device',
1329 'src/libsystemd/sd-hwdb',
1330 'src/libsystemd/sd-id128',
1331 'src/libsystemd/sd-netlink',
1332 'src/libsystemd/sd-network',
1333 'src/libsystemd-network',
1336 add_project_arguments('-include', 'config.h', language : 'c')
1340 subdir('src/systemd')
1342 subdir('src/libsystemd')
1343 subdir('src/libsystemd-network')
1344 subdir('src/journal')
1347 libjournal_core = static_library(
1349 libjournal_core_sources,
1351 include_directories : includes,
1354 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1355 libsystemd = shared_library(
1357 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1358 version : libsystemd_version,
1359 include_directories : includes,
1360 link_args : ['-shared',
1361 '-Wl,--version-script=' + libsystemd_sym_path],
1362 link_with : [libbasic,
1364 link_whole : [libsystemd_static,
1366 dependencies : [threads,
1370 link_depends : libsystemd_sym,
1372 install_dir : rootlibdir)
1374 static_libsystemd = get_option('static-libsystemd')
1375 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1377 install_libsystemd_static = static_library(
1380 journal_client_sources,
1382 basic_gcrypt_sources,
1383 include_directories : includes,
1384 build_by_default : static_libsystemd != 'false',
1385 install : static_libsystemd != 'false',
1386 install_dir : rootlibdir,
1387 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1388 dependencies : [threads,
1397 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1399 ############################################################
1401 # binaries that have --help and are intended for use by humans,
1402 # usually, but not always, installed in /bin.
1403 public_programs = []
1405 subdir('src/libudev')
1406 subdir('src/shared')
1409 subdir('src/network')
1411 subdir('src/analyze')
1412 subdir('src/journal-remote')
1413 subdir('src/coredump')
1414 subdir('src/hostname')
1415 subdir('src/import')
1416 subdir('src/kernel-install')
1417 subdir('src/locale')
1418 subdir('src/machine')
1419 subdir('src/portable')
1420 subdir('src/nspawn')
1421 subdir('src/resolve')
1422 subdir('src/timedate')
1423 subdir('src/timesync')
1424 subdir('src/vconsole')
1425 subdir('src/boot/efi')
1432 ############################################################
1434 # only static linking apart from libdl, to make sure that the
1435 # module is linked to all libraries that it uses.
1436 test_dlopen = executable(
1439 include_directories : includes,
1440 link_with : [libbasic],
1441 dependencies : [libdl])
1443 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1444 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1445 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1446 ['resolve', 'ENABLE_NSS_RESOLVE']]
1448 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1452 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1453 version_script_arg = join_paths(meson.current_source_dir(), sym)
1455 nss = shared_library(
1457 'src/nss-@0@/nss-@0@.c'.format(module),
1459 include_directories : includes,
1460 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1461 link_args : ['-Wl,-z,nodelete',
1463 '-Wl,--version-script=' + version_script_arg,
1465 link_with : [libsystemd_static,
1467 dependencies : [threads,
1471 install_dir : rootlibdir)
1473 # We cannot use shared_module because it does not support version suffix.
1474 # Unfortunately shared_library insists on creating the symlink…
1475 meson.add_install_script('sh', '-c',
1476 'rm $DESTDIR@0@/libnss_@1@.so'
1477 .format(rootlibdir, module))
1479 test('dlopen-nss_' + module,
1481 args : [nss.full_path()]) # path to dlopen must include a slash
1485 ############################################################
1487 executable('systemd',
1489 include_directories : includes,
1490 link_with : [libcore,
1492 dependencies : [threads,
1498 install_rpath : rootlibexecdir,
1500 install_dir : rootlibexecdir)
1502 meson.add_install_script(meson_make_symlink,
1503 join_paths(rootlibexecdir, 'systemd'),
1504 join_paths(rootsbindir, 'init'))
1506 exe = executable('systemd-analyze',
1507 systemd_analyze_sources,
1508 include_directories : includes,
1509 link_with : [libcore,
1511 dependencies : [threads,
1517 install_rpath : rootlibexecdir,
1519 public_programs += [exe]
1521 executable('systemd-journald',
1522 systemd_journald_sources,
1523 include_directories : includes,
1524 link_with : [libjournal_core,
1526 dependencies : [threads,
1530 install_rpath : rootlibexecdir,
1532 install_dir : rootlibexecdir)
1534 exe = executable('systemd-cat',
1535 systemd_cat_sources,
1536 include_directories : includes,
1537 link_with : [libjournal_core,
1539 dependencies : [threads],
1540 install_rpath : rootlibexecdir,
1542 public_programs += [exe]
1544 exe = executable('journalctl',
1546 include_directories : includes,
1547 link_with : [libshared],
1548 dependencies : [threads,
1553 install_rpath : rootlibexecdir,
1555 install_dir : rootbindir)
1556 public_programs += [exe]
1558 executable('systemd-getty-generator',
1559 'src/getty-generator/getty-generator.c',
1560 include_directories : includes,
1561 link_with : [libshared],
1562 install_rpath : rootlibexecdir,
1564 install_dir : systemgeneratordir)
1566 executable('systemd-debug-generator',
1567 'src/debug-generator/debug-generator.c',
1568 include_directories : includes,
1569 link_with : [libshared],
1570 install_rpath : rootlibexecdir,
1572 install_dir : systemgeneratordir)
1574 executable('systemd-fstab-generator',
1575 'src/fstab-generator/fstab-generator.c',
1576 'src/core/mount-setup.c',
1577 include_directories : includes,
1578 link_with : [libshared],
1579 install_rpath : rootlibexecdir,
1581 install_dir : systemgeneratordir)
1583 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1584 executable('30-systemd-environment-d-generator',
1585 'src/environment-d-generator/environment-d-generator.c',
1586 include_directories : includes,
1587 link_with : [libshared],
1588 install_rpath : rootlibexecdir,
1590 install_dir : userenvgeneratordir)
1592 meson.add_install_script(meson_make_symlink,
1593 join_paths(sysconfdir, 'environment'),
1594 join_paths(environmentdir, '99-environment.conf'))
1597 if conf.get('ENABLE_HIBERNATE') == 1
1598 executable('systemd-hibernate-resume-generator',
1599 'src/hibernate-resume/hibernate-resume-generator.c',
1600 include_directories : includes,
1601 link_with : [libshared],
1602 install_rpath : rootlibexecdir,
1604 install_dir : systemgeneratordir)
1606 executable('systemd-hibernate-resume',
1607 'src/hibernate-resume/hibernate-resume.c',
1608 include_directories : includes,
1609 link_with : [libshared],
1610 install_rpath : rootlibexecdir,
1612 install_dir : rootlibexecdir)
1615 if conf.get('HAVE_BLKID') == 1
1616 executable('systemd-gpt-auto-generator',
1617 'src/gpt-auto-generator/gpt-auto-generator.c',
1618 'src/basic/blkid-util.h',
1619 include_directories : includes,
1620 link_with : [libshared],
1621 dependencies : libblkid,
1622 install_rpath : rootlibexecdir,
1624 install_dir : systemgeneratordir)
1626 exe = executable('systemd-dissect',
1627 'src/dissect/dissect.c',
1628 include_directories : includes,
1629 link_with : [libshared],
1630 install_rpath : rootlibexecdir,
1632 install_dir : rootlibexecdir)
1633 public_programs += [exe]
1636 if conf.get('ENABLE_RESOLVE') == 1
1637 executable('systemd-resolved',
1638 systemd_resolved_sources,
1639 include_directories : includes,
1640 link_with : [libshared,
1642 libsystemd_resolve_core],
1643 dependencies : systemd_resolved_dependencies,
1644 install_rpath : rootlibexecdir,
1646 install_dir : rootlibexecdir)
1648 exe = executable('resolvectl',
1650 include_directories : includes,
1651 link_with : [libshared,
1653 libsystemd_resolve_core],
1654 dependencies : [threads,
1658 install_rpath : rootlibexecdir,
1660 public_programs += [exe]
1662 meson.add_install_script(meson_make_symlink,
1663 join_paths(bindir, 'resolvectl'),
1664 join_paths(rootsbindir, 'resolvconf'))
1666 meson.add_install_script(meson_make_symlink,
1667 join_paths(bindir, 'resolvectl'),
1668 join_paths(bindir, 'systemd-resolve'))
1671 if conf.get('ENABLE_LOGIND') == 1
1672 executable('systemd-logind',
1673 systemd_logind_sources,
1674 include_directories : includes,
1675 link_with : [liblogind_core,
1677 dependencies : [threads,
1679 install_rpath : rootlibexecdir,
1681 install_dir : rootlibexecdir)
1683 exe = executable('loginctl',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 dependencies : [threads,
1690 install_rpath : rootlibexecdir,
1692 install_dir : rootbindir)
1693 public_programs += [exe]
1695 exe = executable('systemd-inhibit',
1696 'src/login/inhibit.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 install_rpath : rootlibexecdir,
1701 install_dir : rootbindir)
1702 public_programs += [exe]
1704 if conf.get('HAVE_PAM') == 1
1705 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1706 pam_systemd = shared_library(
1710 include_directories : includes,
1711 link_args : ['-shared',
1712 '-Wl,--version-script=' + version_script_arg],
1713 link_with : [libsystemd_static,
1715 dependencies : [threads,
1718 link_depends : pam_systemd_sym,
1720 install_dir : pamlibdir)
1722 test('dlopen-pam_systemd',
1724 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1728 executable('systemd-user-runtime-dir',
1729 user_runtime_dir_sources,
1730 include_directories : includes,
1731 link_with : [libshared, liblogind_core],
1732 install_rpath : rootlibexecdir,
1734 install_dir : rootlibexecdir)
1736 if conf.get('HAVE_PAM') == 1
1737 executable('systemd-user-sessions',
1738 'src/user-sessions/user-sessions.c',
1739 include_directories : includes,
1740 link_with : [libshared],
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootlibexecdir)
1746 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1747 exe = executable('bootctl',
1748 'src/boot/bootctl.c',
1749 include_directories : includes,
1750 link_with : [libshared],
1751 dependencies : [libblkid],
1752 install_rpath : rootlibexecdir,
1754 public_programs += [exe]
1757 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1758 include_directories : includes,
1759 link_with : [libshared],
1760 dependencies : [threads],
1761 install_rpath : rootlibexecdir,
1763 public_programs += [exe]
1766 if get_option('link-systemctl-shared')
1767 systemctl_link_with = [libshared]
1769 systemctl_link_with = [libsystemd_static,
1775 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1776 include_directories : includes,
1777 link_with : systemctl_link_with,
1778 dependencies : [threads,
1783 install_rpath : rootlibexecdir,
1785 install_dir : rootbindir)
1786 public_programs += [exe]
1788 if conf.get('ENABLE_PORTABLED') == 1
1789 executable('systemd-portabled',
1790 systemd_portabled_sources,
1791 include_directories : includes,
1792 link_with : [libshared],
1793 dependencies : [threads],
1794 install_rpath : rootlibexecdir,
1796 install_dir : rootlibexecdir)
1798 exe = executable('portablectl', 'src/portable/portablectl.c',
1799 include_directories : includes,
1800 link_with : [libshared],
1801 dependencies : [threads],
1802 install_rpath : rootlibexecdir,
1804 install_dir : rootlibexecdir)
1805 public_programs += [exe]
1808 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1809 meson.add_install_script(meson_make_symlink,
1810 join_paths(rootbindir, 'systemctl'),
1811 join_paths(rootsbindir, alias))
1814 if conf.get('ENABLE_BACKLIGHT') == 1
1815 executable('systemd-backlight',
1816 'src/backlight/backlight.c',
1817 include_directories : includes,
1818 link_with : [libshared],
1819 install_rpath : rootlibexecdir,
1821 install_dir : rootlibexecdir)
1824 if conf.get('ENABLE_RFKILL') == 1
1825 executable('systemd-rfkill',
1826 'src/rfkill/rfkill.c',
1827 include_directories : includes,
1828 link_with : [libshared],
1829 install_rpath : rootlibexecdir,
1831 install_dir : rootlibexecdir)
1834 executable('systemd-system-update-generator',
1835 'src/system-update-generator/system-update-generator.c',
1836 include_directories : includes,
1837 link_with : [libshared],
1838 install_rpath : rootlibexecdir,
1840 install_dir : systemgeneratordir)
1842 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1843 executable('systemd-cryptsetup',
1844 'src/cryptsetup/cryptsetup.c',
1845 include_directories : includes,
1846 link_with : [libshared],
1847 dependencies : [libcryptsetup],
1848 install_rpath : rootlibexecdir,
1850 install_dir : rootlibexecdir)
1852 executable('systemd-cryptsetup-generator',
1853 'src/cryptsetup/cryptsetup-generator.c',
1854 include_directories : includes,
1855 link_with : [libshared],
1856 dependencies : [libcryptsetup],
1857 install_rpath : rootlibexecdir,
1859 install_dir : systemgeneratordir)
1861 executable('systemd-veritysetup',
1862 'src/veritysetup/veritysetup.c',
1863 include_directories : includes,
1864 link_with : [libshared],
1865 dependencies : [libcryptsetup],
1866 install_rpath : rootlibexecdir,
1868 install_dir : rootlibexecdir)
1870 executable('systemd-veritysetup-generator',
1871 'src/veritysetup/veritysetup-generator.c',
1872 include_directories : includes,
1873 link_with : [libshared],
1874 dependencies : [libcryptsetup],
1875 install_rpath : rootlibexecdir,
1877 install_dir : systemgeneratordir)
1880 if conf.get('HAVE_SYSV_COMPAT') == 1
1881 executable('systemd-sysv-generator',
1882 'src/sysv-generator/sysv-generator.c',
1883 include_directories : includes,
1884 link_with : [libshared],
1885 install_rpath : rootlibexecdir,
1887 install_dir : systemgeneratordir)
1889 executable('systemd-rc-local-generator',
1890 'src/rc-local-generator/rc-local-generator.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 install_rpath : rootlibexecdir,
1895 install_dir : systemgeneratordir)
1898 if conf.get('ENABLE_HOSTNAMED') == 1
1899 executable('systemd-hostnamed',
1900 'src/hostname/hostnamed.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 install_rpath : rootlibexecdir,
1905 install_dir : rootlibexecdir)
1907 exe = executable('hostnamectl',
1908 'src/hostname/hostnamectl.c',
1909 include_directories : includes,
1910 link_with : [libshared],
1911 install_rpath : rootlibexecdir,
1913 public_programs += [exe]
1916 if conf.get('ENABLE_LOCALED') == 1
1917 if conf.get('HAVE_XKBCOMMON') == 1
1918 # logind will load libxkbcommon.so dynamically on its own
1924 executable('systemd-localed',
1925 systemd_localed_sources,
1926 include_directories : includes,
1927 link_with : [libshared],
1928 dependencies : deps,
1929 install_rpath : rootlibexecdir,
1931 install_dir : rootlibexecdir)
1933 exe = executable('localectl',
1935 include_directories : includes,
1936 link_with : [libshared],
1937 install_rpath : rootlibexecdir,
1939 public_programs += [exe]
1942 if conf.get('ENABLE_TIMEDATED') == 1
1943 executable('systemd-timedated',
1944 'src/timedate/timedated.c',
1945 include_directories : includes,
1946 link_with : [libshared],
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootlibexecdir)
1952 if conf.get('ENABLE_TIMEDATECTL') == 1
1953 exe = executable('timedatectl',
1954 'src/timedate/timedatectl.c',
1955 include_directories : includes,
1956 install_rpath : rootlibexecdir,
1957 link_with : [libshared],
1958 dependencies : [libm],
1960 public_programs += [exe]
1963 if conf.get('ENABLE_TIMESYNCD') == 1
1964 executable('systemd-timesyncd',
1965 systemd_timesyncd_sources,
1966 include_directories : includes,
1967 link_with : [libshared],
1968 dependencies : [threads,
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootlibexecdir)
1974 executable('systemd-time-wait-sync',
1975 'src/time-wait-sync/time-wait-sync.c',
1976 include_directories : includes,
1977 link_with : [libshared],
1978 install_rpath : rootlibexecdir,
1980 install_dir : rootlibexecdir)
1983 if conf.get('ENABLE_MACHINED') == 1
1984 executable('systemd-machined',
1985 systemd_machined_sources,
1986 include_directories : includes,
1987 link_with : [libmachine_core,
1989 install_rpath : rootlibexecdir,
1991 install_dir : rootlibexecdir)
1993 exe = executable('machinectl',
1994 'src/machine/machinectl.c',
1995 include_directories : includes,
1996 link_with : [libshared],
1997 dependencies : [threads,
2000 install_rpath : rootlibexecdir,
2002 install_dir : rootbindir)
2003 public_programs += [exe]
2006 if conf.get('ENABLE_IMPORTD') == 1
2007 executable('systemd-importd',
2008 systemd_importd_sources,
2009 include_directories : includes,
2010 link_with : [libshared],
2011 dependencies : [threads],
2012 install_rpath : rootlibexecdir,
2014 install_dir : rootlibexecdir)
2016 systemd_pull = executable('systemd-pull',
2017 systemd_pull_sources,
2018 include_directories : includes,
2019 link_with : [libshared],
2020 dependencies : [libcurl,
2025 install_rpath : rootlibexecdir,
2027 install_dir : rootlibexecdir)
2029 systemd_import = executable('systemd-import',
2030 systemd_import_sources,
2031 include_directories : includes,
2032 link_with : [libshared],
2033 dependencies : [libcurl,
2037 install_rpath : rootlibexecdir,
2039 install_dir : rootlibexecdir)
2041 systemd_export = executable('systemd-export',
2042 systemd_export_sources,
2043 include_directories : includes,
2044 link_with : [libshared],
2045 dependencies : [libcurl,
2049 install_rpath : rootlibexecdir,
2051 install_dir : rootlibexecdir)
2052 public_programs += [systemd_pull, systemd_import, systemd_export]
2055 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2056 exe = executable('systemd-journal-upload',
2057 systemd_journal_upload_sources,
2058 include_directories : includes,
2059 link_with : [libshared],
2060 dependencies : [threads,
2065 install_rpath : rootlibexecdir,
2067 install_dir : rootlibexecdir)
2068 public_programs += [exe]
2071 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2072 s_j_remote = executable('systemd-journal-remote',
2073 systemd_journal_remote_sources,
2074 include_directories : includes,
2075 link_with : [libshared,
2076 libsystemd_journal_remote],
2077 dependencies : [threads,
2082 install_rpath : rootlibexecdir,
2084 install_dir : rootlibexecdir)
2086 s_j_gatewayd = executable('systemd-journal-gatewayd',
2087 systemd_journal_gatewayd_sources,
2088 include_directories : includes,
2089 link_with : [libshared],
2090 dependencies : [threads,
2095 install_rpath : rootlibexecdir,
2097 install_dir : rootlibexecdir)
2098 public_programs += [s_j_remote, s_j_gatewayd]
2101 if conf.get('ENABLE_COREDUMP') == 1
2102 executable('systemd-coredump',
2103 systemd_coredump_sources,
2104 include_directories : includes,
2105 link_with : [libshared],
2106 dependencies : [threads,
2111 install_rpath : rootlibexecdir,
2113 install_dir : rootlibexecdir)
2115 exe = executable('coredumpctl',
2116 coredumpctl_sources,
2117 include_directories : includes,
2118 link_with : [libshared],
2119 dependencies : [threads,
2122 install_rpath : rootlibexecdir,
2124 public_programs += [exe]
2127 if conf.get('ENABLE_BINFMT') == 1
2128 exe = executable('systemd-binfmt',
2129 'src/binfmt/binfmt.c',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 install_rpath : rootlibexecdir,
2134 install_dir : rootlibexecdir)
2135 public_programs += [exe]
2137 meson.add_install_script('sh', '-c',
2138 mkdir_p.format(binfmtdir))
2139 meson.add_install_script('sh', '-c',
2140 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2143 if conf.get('ENABLE_VCONSOLE') == 1
2144 executable('systemd-vconsole-setup',
2145 'src/vconsole/vconsole-setup.c',
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootlibexecdir)
2153 if conf.get('ENABLE_RANDOMSEED') == 1
2154 executable('systemd-random-seed',
2155 'src/random-seed/random-seed.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2160 install_dir : rootlibexecdir)
2163 if conf.get('ENABLE_FIRSTBOOT') == 1
2164 executable('systemd-firstboot',
2165 'src/firstboot/firstboot.c',
2166 include_directories : includes,
2167 link_with : [libshared],
2168 dependencies : [libcrypt],
2169 install_rpath : rootlibexecdir,
2171 install_dir : rootbindir)
2174 executable('systemd-remount-fs',
2175 'src/remount-fs/remount-fs.c',
2176 'src/core/mount-setup.c',
2177 'src/core/mount-setup.h',
2178 include_directories : includes,
2179 link_with : [libshared],
2180 install_rpath : rootlibexecdir,
2182 install_dir : rootlibexecdir)
2184 executable('systemd-machine-id-setup',
2185 'src/machine-id-setup/machine-id-setup-main.c',
2186 'src/core/machine-id-setup.c',
2187 'src/core/machine-id-setup.h',
2188 include_directories : includes,
2189 link_with : [libshared],
2190 install_rpath : rootlibexecdir,
2192 install_dir : rootbindir)
2194 executable('systemd-fsck',
2196 include_directories : includes,
2197 link_with : [libshared],
2198 install_rpath : rootlibexecdir,
2200 install_dir : rootlibexecdir)
2202 executable('systemd-growfs',
2203 'src/partition/growfs.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 dependencies : [libcryptsetup],
2207 install_rpath : rootlibexecdir,
2209 install_dir : rootlibexecdir)
2211 executable('systemd-makefs',
2212 'src/partition/makefs.c',
2213 include_directories : includes,
2214 link_with : [libshared],
2215 install_rpath : rootlibexecdir,
2217 install_dir : rootlibexecdir)
2219 executable('systemd-sleep',
2220 'src/sleep/sleep.c',
2221 include_directories : includes,
2222 link_with : [libshared],
2223 install_rpath : rootlibexecdir,
2225 install_dir : rootlibexecdir)
2227 exe = executable('systemd-sysctl',
2228 'src/sysctl/sysctl.c',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2233 install_dir : rootlibexecdir)
2234 public_programs += [exe]
2236 executable('systemd-ac-power',
2237 'src/ac-power/ac-power.c',
2238 include_directories : includes,
2239 link_with : [libshared],
2240 install_rpath : rootlibexecdir,
2242 install_dir : rootlibexecdir)
2244 exe = executable('systemd-detect-virt',
2245 'src/detect-virt/detect-virt.c',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 install_rpath : rootlibexecdir,
2250 public_programs += [exe]
2252 exe = executable('systemd-delta',
2253 'src/delta/delta.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 install_rpath : rootlibexecdir,
2258 public_programs += [exe]
2260 exe = executable('systemd-escape',
2261 'src/escape/escape.c',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 install_rpath : rootlibexecdir,
2266 install_dir : rootbindir)
2267 public_programs += [exe]
2269 exe = executable('systemd-notify',
2270 'src/notify/notify.c',
2271 include_directories : includes,
2272 link_with : [libshared],
2273 install_rpath : rootlibexecdir,
2275 install_dir : rootbindir)
2276 public_programs += [exe]
2278 executable('systemd-volatile-root',
2279 'src/volatile-root/volatile-root.c',
2280 include_directories : includes,
2281 link_with : [libshared],
2282 install_rpath : rootlibexecdir,
2284 install_dir : rootlibexecdir)
2286 executable('systemd-cgroups-agent',
2287 'src/cgroups-agent/cgroups-agent.c',
2288 include_directories : includes,
2289 link_with : [libshared],
2290 install_rpath : rootlibexecdir,
2292 install_dir : rootlibexecdir)
2294 exe = executable('systemd-path',
2296 include_directories : includes,
2297 link_with : [libshared],
2298 install_rpath : rootlibexecdir,
2300 public_programs += [exe]
2302 exe = executable('systemd-ask-password',
2303 'src/ask-password/ask-password.c',
2304 include_directories : includes,
2305 link_with : [libshared],
2306 install_rpath : rootlibexecdir,
2308 install_dir : rootbindir)
2309 public_programs += [exe]
2311 executable('systemd-reply-password',
2312 'src/reply-password/reply-password.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 install_rpath : rootlibexecdir,
2317 install_dir : rootlibexecdir)
2319 exe = executable('systemd-tty-ask-password-agent',
2320 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2321 include_directories : includes,
2322 link_with : [libshared],
2323 install_rpath : rootlibexecdir,
2325 install_dir : rootbindir)
2326 public_programs += [exe]
2328 exe = executable('systemd-cgls',
2330 include_directories : includes,
2331 link_with : [libshared],
2332 install_rpath : rootlibexecdir,
2334 public_programs += [exe]
2336 exe = executable('systemd-cgtop',
2337 'src/cgtop/cgtop.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2342 public_programs += [exe]
2344 executable('systemd-initctl',
2345 'src/initctl/initctl.c',
2346 include_directories : includes,
2347 link_with : [libshared],
2348 install_rpath : rootlibexecdir,
2350 install_dir : rootlibexecdir)
2352 exe = executable('systemd-mount',
2353 'src/mount/mount-tool.c',
2354 include_directories : includes,
2355 link_with : [libshared],
2356 install_rpath : rootlibexecdir,
2358 public_programs += [exe]
2360 meson.add_install_script(meson_make_symlink,
2361 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2363 exe = executable('systemd-run',
2365 include_directories : includes,
2366 link_with : [libshared],
2367 install_rpath : rootlibexecdir,
2369 public_programs += [exe]
2371 exe = executable('systemd-stdio-bridge',
2372 'src/stdio-bridge/stdio-bridge.c',
2373 include_directories : includes,
2374 link_with : [libshared],
2375 install_rpath : rootlibexecdir,
2377 public_programs += [exe]
2379 exe = executable('busctl',
2380 'src/busctl/busctl.c',
2381 'src/busctl/busctl-introspect.c',
2382 'src/busctl/busctl-introspect.h',
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2387 public_programs += [exe]
2389 if conf.get('ENABLE_SYSUSERS') == 1
2390 exe = executable('systemd-sysusers',
2391 'src/sysusers/sysusers.c',
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2396 install_dir : rootbindir)
2397 public_programs += [exe]
2400 if conf.get('ENABLE_TMPFILES') == 1
2401 exe = executable('systemd-tmpfiles',
2402 'src/tmpfiles/tmpfiles.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 dependencies : [libacl],
2406 install_rpath : rootlibexecdir,
2408 install_dir : rootbindir)
2409 public_programs += [exe]
2411 test('test-systemd-tmpfiles',
2412 test_systemd_tmpfiles_py,
2413 args : exe.full_path())
2414 # https://github.com/mesonbuild/meson/issues/2681
2417 if conf.get('ENABLE_HWDB') == 1
2418 exe = executable('systemd-hwdb',
2420 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2421 include_directories : includes,
2422 link_with : [libudev_static],
2423 install_rpath : udev_rpath,
2425 install_dir : rootbindir)
2426 public_programs += [exe]
2429 if conf.get('ENABLE_QUOTACHECK') == 1
2430 executable('systemd-quotacheck',
2431 'src/quotacheck/quotacheck.c',
2432 include_directories : includes,
2433 link_with : [libshared],
2434 install_rpath : rootlibexecdir,
2436 install_dir : rootlibexecdir)
2439 exe = executable('systemd-socket-proxyd',
2440 'src/socket-proxy/socket-proxyd.c',
2441 include_directories : includes,
2442 link_with : [libshared],
2443 dependencies : [threads],
2444 install_rpath : rootlibexecdir,
2446 install_dir : rootlibexecdir)
2447 public_programs += [exe]
2449 exe = executable('systemd-udevd',
2450 systemd_udevd_sources,
2451 include_directories : includes,
2452 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2453 link_with : [libudev_core,
2456 dependencies : [threads,
2461 install_rpath : udev_rpath,
2463 install_dir : rootlibexecdir)
2464 public_programs += [exe]
2466 exe = executable('udevadm',
2468 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2469 include_directories : includes,
2470 link_with : [libudev_core,
2473 dependencies : [threads,
2478 install_rpath : udev_rpath,
2480 install_dir : rootbindir)
2481 public_programs += [exe]
2483 executable('systemd-shutdown',
2484 systemd_shutdown_sources,
2485 include_directories : includes,
2486 link_with : [libshared],
2487 dependencies : [libmount],
2488 install_rpath : rootlibexecdir,
2490 install_dir : rootlibexecdir)
2492 executable('systemd-update-done',
2493 'src/update-done/update-done.c',
2494 include_directories : includes,
2495 link_with : [libshared],
2496 install_rpath : rootlibexecdir,
2498 install_dir : rootlibexecdir)
2500 executable('systemd-update-utmp',
2501 'src/update-utmp/update-utmp.c',
2502 include_directories : includes,
2503 link_with : [libshared],
2504 dependencies : [libaudit],
2505 install_rpath : rootlibexecdir,
2507 install_dir : rootlibexecdir)
2509 if conf.get('HAVE_KMOD') == 1
2510 executable('systemd-modules-load',
2511 'src/modules-load/modules-load.c',
2512 include_directories : includes,
2513 link_with : [libshared],
2514 dependencies : [libkmod],
2515 install_rpath : rootlibexecdir,
2517 install_dir : rootlibexecdir)
2519 meson.add_install_script('sh', '-c',
2520 mkdir_p.format(modulesloaddir))
2521 meson.add_install_script('sh', '-c',
2522 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2525 exe = executable('systemd-nspawn',
2526 systemd_nspawn_sources,
2527 'src/core/mount-setup.c', # FIXME: use a variable?
2528 'src/core/mount-setup.h',
2529 'src/core/loopback-setup.c',
2530 'src/core/loopback-setup.h',
2531 include_directories : includes,
2532 link_with : [libnspawn_core,
2534 dependencies : [libblkid],
2535 install_rpath : rootlibexecdir,
2537 public_programs += [exe]
2539 if conf.get('ENABLE_NETWORKD') == 1
2540 executable('systemd-networkd',
2541 systemd_networkd_sources,
2542 include_directories : includes,
2543 link_with : [libnetworkd_core,
2547 dependencies : [threads],
2548 install_rpath : rootlibexecdir,
2550 install_dir : rootlibexecdir)
2552 executable('systemd-networkd-wait-online',
2553 systemd_networkd_wait_online_sources,
2554 include_directories : includes,
2555 link_with : [libnetworkd_core,
2557 install_rpath : rootlibexecdir,
2559 install_dir : rootlibexecdir)
2561 exe = executable('networkctl',
2563 include_directories : includes,
2564 link_with : [libsystemd_network,
2566 install_rpath : rootlibexecdir,
2568 install_dir : rootbindir)
2569 public_programs += [exe]
2572 executable('systemd-sulogin-shell',
2573 ['src/sulogin-shell/sulogin-shell.c'],
2574 include_directories : includes,
2575 link_with : [libshared],
2576 install_rpath : rootlibexecdir,
2578 install_dir : rootlibexecdir)
2580 ############################################################
2582 foreach tuple : tests
2584 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2585 dependencies = tuple[2]
2586 condition = tuple.length() >= 4 ? tuple[3] : ''
2587 type = tuple.length() >= 5 ? tuple[4] : ''
2588 defs = tuple.length() >= 6 ? tuple[5] : []
2589 incs = tuple.length() >= 7 ? tuple[6] : includes
2592 name = sources[0].split('/')[-1].split('.')[0]
2593 if type.startswith('timeout=')
2594 timeout = type.split('=')[1].to_int()
2597 if want_tests == 'false'
2598 message('Not compiling @0@ because tests is set to false'.format(name))
2599 elif condition == '' or conf.get(condition) == 1
2603 include_directories : incs,
2604 link_with : link_with,
2605 dependencies : dependencies,
2607 install_rpath : rootlibexecdir,
2608 install : install_tests,
2609 install_dir : join_paths(testsdir, type))
2612 message('@0@ is a manual test'.format(name))
2613 elif type == 'unsafe' and want_tests != 'unsafe'
2614 message('@0@ is an unsafe test'.format(name))
2621 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2626 'test-libsystemd-sym',
2627 test_libsystemd_sym_c,
2628 include_directories : includes,
2629 link_with : [libsystemd],
2630 install : install_tests,
2631 install_dir : testsdir)
2632 test('test-libsystemd-sym', exe)
2635 'test-libsystemd-static-sym',
2636 test_libsystemd_sym_c,
2637 include_directories : includes,
2638 link_with : [install_libsystemd_static],
2639 dependencies : [threads], # threads is already included in dependencies on the library,
2640 # but does not seem to get propagated. Add here as a work-around.
2641 build_by_default : static_libsystemd_pic,
2642 install : install_tests and static_libsystemd_pic,
2643 install_dir : testsdir)
2644 if static_libsystemd_pic
2645 test('test-libsystemd-static-sym', exe)
2651 include_directories : includes,
2652 c_args : ['-Wno-deprecated-declarations'],
2653 link_with : [libudev],
2654 install : install_tests,
2655 install_dir : testsdir)
2656 test('test-libudev-sym', exe)
2659 'test-libudev-static-sym',
2661 include_directories : includes,
2662 c_args : ['-Wno-deprecated-declarations'],
2663 link_with : [install_libudev_static],
2664 build_by_default : static_libudev_pic,
2665 install : install_tests and static_libudev_pic,
2666 install_dir : testsdir)
2667 if static_libudev_pic
2668 test('test-libudev-static-sym', exe)
2671 ############################################################
2675 foreach tuple : fuzzers
2677 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2678 dependencies = tuple[2]
2679 defs = tuple.length() >= 4 ? tuple[3] : []
2680 incs = tuple.length() >= 5 ? tuple[4] : includes
2683 dependencies += fuzzing_engine
2685 sources += 'src/fuzz/fuzz-main.c'
2688 name = sources[0].split('/')[-1].split('.')[0]
2690 fuzzer_exes += executable(
2693 include_directories : [incs, include_directories('src/fuzz')],
2694 link_with : link_with,
2695 dependencies : dependencies,
2700 run_target('fuzzers',
2701 depends : fuzzer_exes,
2704 ############################################################
2706 make_directive_index_py = find_program('tools/make-directive-index.py')
2707 make_man_index_py = find_program('tools/make-man-index.py')
2708 xml_helper_py = find_program('tools/xml_helper.py')
2709 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2713 subdir('sysusers.d')
2714 subdir('tmpfiles.d')
2719 subdir('shell-completion/bash')
2720 subdir('shell-completion/zsh')
2721 subdir('doc/sysvinit')
2722 subdir('doc/var-log')
2724 # FIXME: figure out if the warning is true:
2725 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2726 install_subdir('factory/etc',
2727 install_dir : factorydir)
2730 install_data('xorg/50-systemd-user.sh',
2731 install_dir : xinitrcdir)
2732 install_data('modprobe.d/systemd.conf',
2733 install_dir : modprobedir)
2734 install_data('LICENSE.GPL2',
2739 'doc/DISTRO_PORTING',
2740 'doc/ENVIRONMENT.md',
2742 'doc/TRANSIENT-SETTINGS.md',
2745 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2746 install_dir : docdir)
2748 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2749 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2751 ############################################################
2753 meson_check_help = find_program('tools/meson-check-help.sh')
2755 foreach exec : public_programs
2756 name = exec.full_path().split('/')[-1]
2757 test('check-help-' + name,
2759 args : [exec.full_path()])
2762 ############################################################
2764 # Enable tests for all supported sanitizers
2765 foreach tuple : sanitizers
2766 sanitizer = tuple[0]
2769 have = run_command(check_compilation_sh,
2770 cc.cmd_array(), '-x', 'c',
2771 '-fsanitize=@0@'.format(sanitizer),
2772 '-include', link_test_c).returncode() == 0
2773 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2777 foreach p : fuzz_regression_tests
2778 b = p.split('/')[-2]
2779 c = p.split('/')[-1]
2781 name = '@0@:@1@'.format(b, sanitizer)
2784 if want_tests == 'false'
2785 message('Not compiling @0@ because tests is set to false'.format(name))
2787 exe = custom_target(
2791 command : [env, 'ln', '-fs',
2792 join_paths(build.full_path(), b),
2794 build_by_default : true)
2796 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2801 if want_tests != 'false' and slow_tests
2802 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2804 args : [exe.full_path(),
2805 join_paths(meson.source_root(),
2806 'test/fuzz-regressions',
2814 ############################################################
2817 all_files = run_command(
2819 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2822 all_files = files(all_files.stdout().split())
2827 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2830 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2834 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2837 command : [meson_git_contrib_sh])
2841 git_head = run_command(
2843 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2844 'rev-parse', 'HEAD']).stdout().strip()
2845 git_head_short = run_command(
2847 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2848 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2852 command : ['git', 'archive',
2853 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2855 '--prefix', 'systemd-@0@/'.format(git_head),
2859 ############################################################
2861 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2864 depends : [man, libsystemd, libudev],
2865 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2867 ############################################################
2870 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2872 'split /usr: @0@'.format(split_usr),
2873 'split bin-sbin: @0@'.format(split_bin),
2874 'prefix directory: @0@'.format(prefixdir),
2875 'rootprefix directory: @0@'.format(rootprefixdir),
2876 'sysconf directory: @0@'.format(sysconfdir),
2877 'include directory: @0@'.format(includedir),
2878 'lib directory: @0@'.format(libdir),
2879 'rootlib directory: @0@'.format(rootlibdir),
2880 'SysV init scripts: @0@'.format(sysvinit_path),
2881 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2882 'PAM modules directory: @0@'.format(pamlibdir),
2883 'PAM configuration directory: @0@'.format(pamconfdir),
2884 'RPM macros directory: @0@'.format(rpmmacrosdir),
2885 'modprobe.d directory: @0@'.format(modprobedir),
2886 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2887 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2888 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2889 'bash completions directory: @0@'.format(bashcompletiondir),
2890 'zsh completions directory: @0@'.format(zshcompletiondir),
2891 'extra start script: @0@'.format(get_option('rc-local')),
2892 'extra stop script: @0@'.format(get_option('halt-local')),
2893 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2894 get_option('debug-tty')),
2895 'TTY GID: @0@'.format(tty_gid),
2896 'users GID: @0@'.format(substs.get('USERS_GID')),
2897 'maximum system UID: @0@'.format(system_uid_max),
2898 'maximum system GID: @0@'.format(system_gid_max),
2899 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2900 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2901 'minimum container UID base: @0@'.format(container_uid_base_min),
2902 'maximum container UID base: @0@'.format(container_uid_base_max),
2903 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2904 'render group access mode: @0@'.format(get_option('group-render-mode')),
2905 'certificate root directory: @0@'.format(get_option('certificate-root')),
2906 'support URL: @0@'.format(support_url),
2907 'nobody user name: @0@'.format(nobody_user),
2908 'nobody group name: @0@'.format(nobody_group),
2909 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2910 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2912 'default DNSSEC mode: @0@'.format(default_dnssec),
2913 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2914 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2915 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2917 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2918 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2920 'default DNS servers: @0@'.format(alt_dns_servers),
2921 'default NTP servers: @0@'.format(alt_ntp_servers)]
2923 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2924 '@@0@'.format(time_epoch)).stdout().strip()
2926 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2929 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2930 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2931 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2933 if conf.get('ENABLE_EFI') == 1
2935 'efi arch: @0@'.format(efi_arch)]
2939 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2940 'EFI CC @0@'.format(efi_cc),
2941 'EFI lib directory: @0@'.format(efi_libdir),
2942 'EFI lds directory: @0@'.format(efi_ldsdir),
2943 'EFI include directory: @0@'.format(efi_incdir)]
2997 ['legacy pkla', install_polkit_pkla],
2999 ['gnu-efi', have_gnu_efi],
3006 ['nss-myhostname', conf.get('ENABLE_NSS_MYHOSTNAME') == 1],
3007 ['nss-mymachines', conf.get('ENABLE_NSS_MYMACHINES') == 1],
3008 ['nss-resolve', conf.get('ENABLE_NSS_RESOLVE') == 1],
3009 ['nss-systemd', conf.get('ENABLE_NSS_SYSTEMD') == 1],
3012 ['man pages', want_man],
3013 ['html pages', want_html],
3014 ['man page indices', want_man and have_lxml],
3019 ['adm group', get_option('adm-group')],
3020 ['wheel group', get_option('wheel-group')],
3023 ['debug mmap cache'],
3024 ['valgrind', conf.get('VALGRIND') == 1],
3027 if tuple.length() >= 2
3030 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3031 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3032 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3037 missing += [tuple[0]]
3043 'enabled features: @0@'.format(', '.join(found)),
3045 'disabled features: @0@'.format(', '.join(missing)),
3047 message('\n '.join(status))
3049 if rootprefixdir != rootprefix_default
3051 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3052 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3053 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))