1 # SPDX-License-Identifier: LGPL-2.1+
3 # Copyright 2017 Zbigniew Jędrzejewski-Szmek
5 project('systemd', 'c',
14 meson_version : '>= 0.44',
17 libsystemd_version = '0.22.0'
18 libudev_version = '1.6.10'
20 # We need the same data in two different formats, ugh!
21 # Also, for hysterical reasons, we use different variable
22 # names, sometimes. Not all variables are included in every
24 conf = configuration_data()
25 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
26 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
28 substs = configuration_data()
29 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
30 substs.set('PACKAGE_VERSION', meson.project_version())
32 #####################################################################
34 # Try to install the git pre-commit hook
35 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
36 if git_hook.returncode() == 0
37 message(git_hook.stdout().strip())
40 #####################################################################
42 if get_option('split-usr') == 'auto'
43 split_usr = run_command('test', '-L', '/bin').returncode() != 0
45 split_usr = get_option('split-usr') == 'true'
47 conf.set10('HAVE_SPLIT_USR', split_usr,
48 description : '/usr/bin and /bin directories are separate')
50 if get_option('split-bin') == 'auto'
51 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
53 split_bin = get_option('split-bin') == 'true'
55 conf.set10('HAVE_SPLIT_BIN', split_bin,
56 description : 'bin and sbin directories are separate')
58 rootprefixdir = get_option('rootprefix')
59 # Unusual rootprefixdir values are used by some distros
60 # (see https://github.com/systemd/systemd/pull/7461).
61 rootprefix_default = split_usr ? '/' : '/usr'
62 if rootprefixdir == ''
63 rootprefixdir = rootprefix_default
66 sysvinit_path = get_option('sysvinit-path')
67 sysvrcnd_path = get_option('sysvrcnd-path')
68 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
69 description : 'SysV init scripts and rcN.d links are supported')
71 # join_paths ignore the preceding arguments if an absolute component is
72 # encountered, so this should canonicalize various paths when they are
73 # absolute or relative.
74 prefixdir = get_option('prefix')
75 if not prefixdir.startswith('/')
76 error('Prefix is not absolute: "@0@"'.format(prefixdir))
78 bindir = join_paths(prefixdir, get_option('bindir'))
79 libdir = join_paths(prefixdir, get_option('libdir'))
80 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
81 includedir = join_paths(prefixdir, get_option('includedir'))
82 datadir = join_paths(prefixdir, get_option('datadir'))
83 localstatedir = join_paths('/', get_option('localstatedir'))
85 rootbindir = join_paths(rootprefixdir, 'bin')
86 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
87 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
89 rootlibdir = get_option('rootlibdir')
91 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
94 # Dirs of external packages
95 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
96 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
97 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
98 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
99 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
100 varlogdir = join_paths(localstatedir, 'log')
101 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
102 rpmmacrosdir = get_option('rpmmacrosdir')
103 if rpmmacrosdir != 'no'
104 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
106 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
109 pkgdatadir = join_paths(datadir, 'systemd')
110 environmentdir = join_paths(prefixdir, 'lib/environment.d')
111 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
112 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
113 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
114 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
115 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
116 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
117 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
118 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
119 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
120 pkgincludedir = join_paths(includedir, 'systemd')
121 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
122 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
123 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
124 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
125 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
126 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
127 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
128 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
129 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
130 udevhomedir = udevlibexecdir
131 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
132 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
133 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
134 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
135 factorydir = join_paths(datadir, 'factory')
136 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
137 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
138 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
139 catalogstatedir = join_paths(systemdstatedir, 'catalog')
140 randomseeddir = join_paths(localstatedir, 'lib/systemd')
141 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
143 docdir = get_option('docdir')
145 docdir = join_paths(datadir, 'doc/systemd')
148 dbuspolicydir = get_option('dbuspolicydir')
149 if dbuspolicydir == ''
150 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
153 dbussessionservicedir = get_option('dbussessionservicedir')
154 if dbussessionservicedir == ''
155 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
158 dbussystemservicedir = get_option('dbussystemservicedir')
159 if dbussystemservicedir == ''
160 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
163 pamlibdir = get_option('pamlibdir')
165 pamlibdir = join_paths(rootlibdir, 'security')
168 pamconfdir = get_option('pamconfdir')
170 pamconfdir = join_paths(sysconfdir, 'pam.d')
173 memory_accounting_default = get_option('memory-accounting-default')
175 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
176 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
177 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
178 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
179 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
180 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
181 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
183 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
185 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
186 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
187 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
188 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
189 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
190 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
191 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
192 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
193 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
194 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
195 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
196 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
197 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
198 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
199 conf.set_quoted('ROOTPREFIX', rootprefixdir)
200 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
201 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
202 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
203 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
204 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
205 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
206 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
207 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
208 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
209 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
210 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
211 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
212 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
213 conf.set_quoted('LIBDIR', libdir)
214 conf.set_quoted('ROOTLIBDIR', rootlibdir)
215 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
216 conf.set_quoted('BOOTLIBDIR', bootlibdir)
217 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
218 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
219 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
220 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
221 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
222 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
223 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
224 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
226 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
227 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
229 substs.set('prefix', prefixdir)
230 substs.set('exec_prefix', prefixdir)
231 substs.set('libdir', libdir)
232 substs.set('rootlibdir', rootlibdir)
233 substs.set('includedir', includedir)
234 substs.set('pkgsysconfdir', pkgsysconfdir)
235 substs.set('bindir', bindir)
236 substs.set('rootbindir', rootbindir)
237 substs.set('rootlibexecdir', rootlibexecdir)
238 substs.set('systemunitdir', systemunitdir)
239 substs.set('userunitdir', userunitdir)
240 substs.set('systempresetdir', systempresetdir)
241 substs.set('userpresetdir', userpresetdir)
242 substs.set('udevhwdbdir', udevhwdbdir)
243 substs.set('udevrulesdir', udevrulesdir)
244 substs.set('udevlibexecdir', udevlibexecdir)
245 substs.set('environmentdir', environmentdir)
246 substs.set('catalogdir', catalogdir)
247 substs.set('tmpfilesdir', tmpfilesdir)
248 substs.set('sysusersdir', sysusersdir)
249 substs.set('sysctldir', sysctldir)
250 substs.set('binfmtdir', binfmtdir)
251 substs.set('modulesloaddir', modulesloaddir)
252 substs.set('modprobedir', modprobedir)
253 substs.set('systemgeneratordir', systemgeneratordir)
254 substs.set('usergeneratordir', usergeneratordir)
255 substs.set('systemenvgeneratordir', systemenvgeneratordir)
256 substs.set('userenvgeneratordir', userenvgeneratordir)
257 substs.set('systemshutdowndir', systemshutdowndir)
258 substs.set('systemsleepdir', systemsleepdir)
259 substs.set('VARLOGDIR', varlogdir)
260 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
261 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
262 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
263 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
264 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
265 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
266 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
267 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
269 #####################################################################
271 cc = meson.get_compiler('c')
272 pkgconfig = import('pkgconfig')
273 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
274 meson_build_sh = find_program('tools/meson-build.sh')
276 if get_option('tests') != 'false'
277 cxx = find_program('c++', required : false)
279 # Used only for tests
284 want_ossfuzz = get_option('oss-fuzz')
285 want_libfuzzer = get_option('llvm-fuzz')
286 fuzzer_build = want_ossfuzz or want_libfuzzer
287 if want_ossfuzz and want_libfuzzer
288 error('only one of oss-fuzz and llvm-fuzz can be specified')
291 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
294 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
297 possible_cc_flags = [
301 '-Wmissing-include-dirs',
302 '-Wold-style-definition',
305 '-Wdeclaration-after-statement',
307 '-Wsuggest-attribute=noreturn',
308 '-Werror=missing-prototypes',
309 '-Werror=implicit-function-declaration',
310 '-Werror=missing-declarations',
311 '-Werror=return-type',
312 '-Werror=incompatible-pointer-types',
314 '-Wstrict-prototypes',
316 '-Wmissing-noreturn',
317 '-Wimplicit-fallthrough=5',
320 '-Wstrict-aliasing=2',
327 '-fdiagnostics-show-option',
328 '-fno-strict-aliasing',
329 '-fvisibility=hidden',
331 '-fstack-protector-strong',
332 '--param=ssp-buffer-size=4',
335 # --as-needed and --no-undefined are provided by meson by default,
336 # run mesonconf to see what is enabled
337 possible_link_flags = [
342 # the oss-fuzz fuzzers are not built with -fPIE, so don't
343 # enable it when we are linking against them
345 possible_cc_flags += '-fPIE'
346 possible_link_flags += '-pie'
349 if cc.get_id() == 'clang'
350 possible_cc_flags += [
351 '-Wno-typedef-redefinition',
352 '-Wno-gnu-variable-sized-type-not-at-end',
356 if get_option('buildtype') != 'debug'
357 possible_cc_flags += [
358 '-ffunction-sections',
362 possible_link_flags += '-Wl,--gc-sections'
365 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
367 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
368 # arguments, just emits a warnings. So test for the "positive" version instead.
369 foreach arg : ['unused-parameter',
370 'missing-field-initializers',
373 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
375 if cc.has_argument('-W' + arg)
376 add_project_arguments('-Wno-' + arg, language : 'c')
382 #include <inttypes.h>
383 typedef uint64_t usec_t;
384 usec_t now(clockid_t clock);
389 ''', name : '-Werror=shadow with local shadowing')
390 add_project_arguments('-Werror=shadow', language : 'c')
393 link_test_c = files('tools/meson-link-test.c')
395 foreach arg : possible_link_flags
396 have = run_command(check_compilation_sh,
397 cc.cmd_array(), '-x', 'c', arg,
398 '-include', link_test_c).returncode() == 0
399 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
401 add_project_link_arguments(arg, language : 'c')
405 cpp = ' '.join(cc.cmd_array()) + ' -E'
407 #####################################################################
408 # compilation result tests
410 conf.set('_GNU_SOURCE', true)
411 conf.set('__SANE_USERSPACE_TYPES__', true)
413 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
417 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
418 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
419 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
423 #include <linux/ethtool.h>
424 #include <linux/fib_rules.h>
425 #include <linux/stat.h>
426 #include <sys/stat.h>
428 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
430 foreach decl : ['char16_t',
433 'struct ethtool_link_settings',
434 'struct fib_rule_uid_range',
438 # We get -1 if the size cannot be determined
439 have = cc.sizeof(decl, prefix : decl_headers) > 0
440 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
443 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
444 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
445 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
446 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
447 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
448 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
449 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
450 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
451 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
452 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
453 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
454 # if_tunnel.h is buggy and cannot be included on its own
455 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
456 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
457 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
458 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
459 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
460 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
461 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
462 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
463 ['NDA_IFINDEX', 'linux/neighbour.h'],
464 ['IFA_FLAGS', 'linux/if_addr.h'],
465 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
466 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
467 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
469 prefix = decl.length() > 2 ? decl[2] : ''
470 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
471 conf.set10('HAVE_' + decl[0], have)
474 foreach ident : ['secure_getenv', '__secure_getenv']
475 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
479 ['memfd_create', '''#include <sys/mman.h>'''],
480 ['gettid', '''#include <sys/types.h>
481 #include <unistd.h>'''],
482 ['pivot_root', '''#include <stdlib.h>
483 #include <unistd.h>'''], # no known header declares pivot_root
484 ['name_to_handle_at', '''#include <sys/types.h>
485 #include <sys/stat.h>
486 #include <fcntl.h>'''],
487 ['setns', '''#include <sched.h>'''],
488 ['renameat2', '''#include <stdio.h>
489 #include <fcntl.h>'''],
490 ['kcmp', '''#include <linux/kcmp.h>'''],
491 ['keyctl', '''#include <sys/types.h>
492 #include <keyutils.h>'''],
493 ['copy_file_range', '''#include <sys/syscall.h>
494 #include <unistd.h>'''],
495 ['bpf', '''#include <sys/syscall.h>
496 #include <unistd.h>'''],
497 ['statx', '''#include <sys/types.h>
498 #include <sys/stat.h>
499 #include <unistd.h>'''],
500 ['explicit_bzero' , '''#include <string.h>'''],
501 ['reallocarray', '''#include <malloc.h>'''],
504 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
505 conf.set10('HAVE_' + ident[0].to_upper(), have)
508 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
509 conf.set10('USE_SYS_RANDOM_H', true)
510 conf.set10('HAVE_GETRANDOM', true)
512 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
513 conf.set10('USE_SYS_RANDOM_H', false)
514 conf.set10('HAVE_GETRANDOM', have)
517 #####################################################################
519 sed = find_program('sed')
520 awk = find_program('awk')
521 m4 = find_program('m4')
522 stat = find_program('stat')
523 git = find_program('git', required : false)
524 env = find_program('env')
525 perl = find_program('perl', required : false)
527 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
528 mkdir_p = 'mkdir -p $DESTDIR/@0@'
529 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
530 splash_bmp = files('test/splash.bmp')
532 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
533 # /usr/sbin, /sbin, and fall back to the default from middle column.
534 progs = [['quotaon', '/usr/sbin/quotaon' ],
535 ['quotacheck', '/usr/sbin/quotacheck' ],
536 ['kmod', '/usr/bin/kmod' ],
537 ['kexec', '/usr/sbin/kexec' ],
538 ['sulogin', '/usr/sbin/sulogin' ],
539 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
540 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
541 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
542 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
545 path = get_option(prog[0] + '-path')
547 message('Using @1@ for @0@'.format(prog[0], path))
549 exe = find_program(prog[0],
550 '/usr/sbin/' + prog[0],
553 path = exe.found() ? exe.path() : prog[1]
555 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
556 conf.set_quoted(name, path)
557 substs.set(name, path)
560 conf.set_quoted('TELINIT', get_option('telinit-path'))
562 if run_command('ln', '--relative', '--help').returncode() != 0
563 error('ln does not support --relative (added in coreutils 8.16)')
566 ############################################################
568 gperf = find_program('gperf')
570 gperf_test_format = '''
572 const char * in_word_set(const char *, @0@);
575 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
576 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
577 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
578 if cc.compiles(gperf_test)
579 gperf_len_type = 'size_t'
581 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
582 if cc.compiles(gperf_test)
583 gperf_len_type = 'unsigned'
585 error('unable to determine gperf len type')
588 message('gperf len type is @0@'.format(gperf_len_type))
589 conf.set('GPERF_LEN_TYPE', gperf_len_type,
590 description : 'The type of gperf "len" parameter')
592 ############################################################
594 if not cc.has_header('sys/capability.h')
595 error('POSIX caps headers not found')
597 foreach header : ['crypt.h',
600 'linux/vm_sockets.h',
602 'valgrind/memcheck.h',
603 'valgrind/valgrind.h',
606 conf.set10('HAVE_' + header.underscorify().to_upper(),
607 cc.has_header(header))
610 ############################################################
612 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
613 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
614 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
616 default_hierarchy = get_option('default-hierarchy')
617 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
618 description : 'default cgroup hierarchy as string')
619 if default_hierarchy == 'legacy'
620 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
621 elif default_hierarchy == 'hybrid'
622 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
624 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
627 time_epoch = get_option('time-epoch')
630 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
632 time_epoch = time_epoch.to_int()
633 conf.set('TIME_EPOCH', time_epoch)
635 system_uid_max = get_option('system-uid-max')
636 if system_uid_max == ''
637 system_uid_max = run_command(
639 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
640 '/etc/login.defs').stdout().strip()
641 if system_uid_max == ''
642 system_uid_max = '999'
645 system_uid_max = system_uid_max.to_int()
646 conf.set('SYSTEM_UID_MAX', system_uid_max)
647 substs.set('systemuidmax', system_uid_max)
648 message('maximum system UID is @0@'.format(system_uid_max))
650 system_gid_max = get_option('system-gid-max')
651 if system_gid_max == ''
652 system_gid_max = run_command(
654 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
655 '/etc/login.defs').stdout().strip()
656 if system_gid_max == ''
657 system_gid_max = '999'
660 system_gid_max = system_gid_max.to_int()
661 conf.set('SYSTEM_GID_MAX', system_gid_max)
662 substs.set('systemgidmax', system_gid_max)
663 message('maximum system GID is @0@'.format(system_gid_max))
665 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
666 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
667 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
668 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
669 substs.set('dynamicuidmin', dynamic_uid_min)
670 substs.set('dynamicuidmax', dynamic_uid_max)
672 container_uid_base_min = get_option('container-uid-base-min').to_int()
673 container_uid_base_max = get_option('container-uid-base-max').to_int()
674 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
675 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
676 substs.set('containeruidbasemin', container_uid_base_min)
677 substs.set('containeruidbasemax', container_uid_base_max)
679 nobody_user = get_option('nobody-user')
680 nobody_group = get_option('nobody-group')
682 getent_result = run_command('getent', 'passwd', '65534')
683 if getent_result.returncode() == 0
684 name = getent_result.stdout().split(':')[0]
685 if name != nobody_user
687 '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) +
688 'Your build will result in an user table setup that is incompatible with the local system.')
691 id_result = run_command('id', '-u', nobody_user)
692 if id_result.returncode() == 0
693 id = id_result.stdout().to_int()
696 '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) +
697 'Your build will result in an user table setup that is incompatible with the local system.')
701 getent_result = run_command('getent', 'group', '65534')
702 if getent_result.returncode() == 0
703 name = getent_result.stdout().split(':')[0]
704 if name != nobody_group
706 '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) +
707 'Your build will result in an group table setup that is incompatible with the local system.')
710 id_result = run_command('id', '-g', nobody_group)
711 if id_result.returncode() == 0
712 id = id_result.stdout().to_int()
715 '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) +
716 'Your build will result in an group table setup that is incompatible with the local system.')
719 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
721 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
722 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
725 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
726 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
727 substs.set('NOBODY_USER_NAME', nobody_user)
728 substs.set('NOBODY_GROUP_NAME', nobody_group)
730 tty_gid = get_option('tty-gid')
731 conf.set('TTY_GID', tty_gid)
732 substs.set('TTY_GID', tty_gid)
734 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
735 if get_option('users-gid') != ''
736 users_gid = get_option('users-gid').to_int()
740 substs.set('USERS_GID', users_gid)
742 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
743 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
745 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
746 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
748 kill_user_processes = get_option('default-kill-user-processes')
749 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
750 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
751 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
753 dns_servers = get_option('dns-servers')
754 conf.set_quoted('DNS_SERVERS', dns_servers)
755 substs.set('DNS_SERVERS', dns_servers)
757 ntp_servers = get_option('ntp-servers')
758 conf.set_quoted('NTP_SERVERS', ntp_servers)
759 substs.set('NTP_SERVERS', ntp_servers)
761 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
763 substs.set('SUSHELL', get_option('debug-shell'))
764 substs.set('DEBUGTTY', get_option('debug-tty'))
766 enable_debug_hashmap = false
767 enable_debug_mmap_cache = false
768 foreach name : get_option('debug')
770 enable_debug_hashmap = true
771 elif name == 'mmap-cache'
772 enable_debug_mmap_cache = true
774 message('unknown debug option "@0@", ignoring'.format(name))
777 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
778 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
780 conf.set10('VALGRIND', get_option('valgrind'))
782 #####################################################################
784 threads = dependency('threads')
785 librt = cc.find_library('rt')
786 libm = cc.find_library('m')
787 libdl = cc.find_library('dl')
788 libcrypt = cc.find_library('crypt')
790 libcap = dependency('libcap', required : false)
791 if not libcap.found()
792 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
793 libcap = cc.find_library('cap')
796 libmount = dependency('mount',
797 version : fuzzer_build ? '>= 0' : '>= 2.30')
799 want_seccomp = get_option('seccomp')
800 if want_seccomp != 'false' and not fuzzer_build
801 libseccomp = dependency('libseccomp',
802 version : '>= 2.3.1',
803 required : want_seccomp == 'true')
804 have = libseccomp.found()
809 conf.set10('HAVE_SECCOMP', have)
811 want_selinux = get_option('selinux')
812 if want_selinux != 'false' and not fuzzer_build
813 libselinux = dependency('libselinux',
814 version : '>= 2.1.9',
815 required : want_selinux == 'true')
816 have = libselinux.found()
821 conf.set10('HAVE_SELINUX', have)
823 want_apparmor = get_option('apparmor')
824 if want_apparmor != 'false' and not fuzzer_build
825 libapparmor = dependency('libapparmor',
826 required : want_apparmor == 'true')
827 have = libapparmor.found()
832 conf.set10('HAVE_APPARMOR', have)
834 smack_run_label = get_option('smack-run-label')
835 if smack_run_label != ''
836 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
839 want_polkit = get_option('polkit')
840 install_polkit = false
841 install_polkit_pkla = false
842 if want_polkit != 'false' and not fuzzer_build
843 install_polkit = true
845 libpolkit = dependency('polkit-gobject-1',
847 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
848 message('Old polkit detected, will install pkla files')
849 install_polkit_pkla = true
852 conf.set10('ENABLE_POLKIT', install_polkit)
854 want_acl = get_option('acl')
855 if want_acl != 'false' and not fuzzer_build
856 libacl = cc.find_library('acl', required : want_acl == 'true')
857 have = libacl.found()
862 conf.set10('HAVE_ACL', have)
864 want_audit = get_option('audit')
865 if want_audit != 'false' and not fuzzer_build
866 libaudit = dependency('audit', required : want_audit == 'true')
867 have = libaudit.found()
872 conf.set10('HAVE_AUDIT', have)
874 want_blkid = get_option('blkid')
875 if want_blkid != 'false' and not fuzzer_build
876 libblkid = dependency('blkid', required : want_blkid == 'true')
877 have = libblkid.found()
882 conf.set10('HAVE_BLKID', have)
884 want_kmod = get_option('kmod')
885 if want_kmod != 'false' and not fuzzer_build
886 libkmod = dependency('libkmod',
888 required : want_kmod == 'true')
889 have = libkmod.found()
894 conf.set10('HAVE_KMOD', have)
896 want_pam = get_option('pam')
897 if want_pam != 'false' and not fuzzer_build
898 libpam = cc.find_library('pam', required : want_pam == 'true')
899 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
900 have = libpam.found() and libpam_misc.found()
906 conf.set10('HAVE_PAM', have)
908 want_microhttpd = get_option('microhttpd')
909 if want_microhttpd != 'false' and not fuzzer_build
910 libmicrohttpd = dependency('libmicrohttpd',
911 version : '>= 0.9.33',
912 required : want_microhttpd == 'true')
913 have = libmicrohttpd.found()
918 conf.set10('HAVE_MICROHTTPD', have)
920 want_libcryptsetup = get_option('libcryptsetup')
921 if want_libcryptsetup != 'false' and not fuzzer_build
922 libcryptsetup = dependency('libcryptsetup',
923 version : '>= 1.6.0',
924 required : want_libcryptsetup == 'true')
925 have = libcryptsetup.found()
930 conf.set10('HAVE_LIBCRYPTSETUP', have)
932 want_libcurl = get_option('libcurl')
933 if want_libcurl != 'false' and not fuzzer_build
934 libcurl = dependency('libcurl',
935 version : '>= 7.32.0',
936 required : want_libcurl == 'true')
937 have = libcurl.found()
942 conf.set10('HAVE_LIBCURL', have)
944 want_libidn = get_option('libidn')
945 want_libidn2 = get_option('libidn2')
946 if want_libidn == 'true' and want_libidn2 == 'true'
947 error('libidn and libidn2 cannot be requested simultaneously')
950 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
951 libidn = dependency('libidn',
952 required : want_libidn == 'true')
953 have = libidn.found()
958 conf.set10('HAVE_LIBIDN', have)
959 if not have and want_libidn2 != 'false' and not fuzzer_build
960 # libidn is used for both libidn and libidn2 objects
961 libidn = dependency('libidn2',
962 required : want_libidn2 == 'true')
963 have = libidn.found()
967 conf.set10('HAVE_LIBIDN2', have)
969 want_libiptc = get_option('libiptc')
970 if want_libiptc != 'false' and not fuzzer_build
971 libiptc = dependency('libiptc',
972 required : want_libiptc == 'true')
973 have = libiptc.found()
978 conf.set10('HAVE_LIBIPTC', have)
980 want_qrencode = get_option('qrencode')
981 if want_qrencode != 'false' and not fuzzer_build
982 libqrencode = dependency('libqrencode',
983 required : want_qrencode == 'true')
984 have = libqrencode.found()
989 conf.set10('HAVE_QRENCODE', have)
991 want_gcrypt = get_option('gcrypt')
992 if want_gcrypt != 'false' and not fuzzer_build
993 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
994 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
995 have = libgcrypt.found() and libgpg_error.found()
1000 # link to neither of the libs if one is not found
1004 conf.set10('HAVE_GCRYPT', have)
1006 want_gnutls = get_option('gnutls')
1007 if want_gnutls != 'false' and not fuzzer_build
1008 libgnutls = dependency('gnutls',
1009 version : '>= 3.1.4',
1010 required : want_gnutls == 'true')
1011 have = libgnutls.found()
1016 conf.set10('HAVE_GNUTLS', have)
1018 want_elfutils = get_option('elfutils')
1019 if want_elfutils != 'false' and not fuzzer_build
1020 libdw = dependency('libdw',
1021 required : want_elfutils == 'true')
1022 have = libdw.found()
1027 conf.set10('HAVE_ELFUTILS', have)
1029 want_zlib = get_option('zlib')
1030 if want_zlib != 'false' and not fuzzer_build
1031 libz = dependency('zlib',
1032 required : want_zlib == 'true')
1038 conf.set10('HAVE_ZLIB', have)
1040 want_bzip2 = get_option('bzip2')
1041 if want_bzip2 != 'false' and not fuzzer_build
1042 libbzip2 = cc.find_library('bz2',
1043 required : want_bzip2 == 'true')
1044 have = libbzip2.found()
1049 conf.set10('HAVE_BZIP2', have)
1051 want_xz = get_option('xz')
1052 if want_xz != 'false' and not fuzzer_build
1053 libxz = dependency('liblzma',
1054 required : want_xz == 'true')
1055 have = libxz.found()
1060 conf.set10('HAVE_XZ', have)
1062 want_lz4 = get_option('lz4')
1063 if want_lz4 != 'false' and not fuzzer_build
1064 liblz4 = dependency('liblz4',
1065 required : want_lz4 == 'true')
1066 have = liblz4.found()
1071 conf.set10('HAVE_LZ4', have)
1073 want_xkbcommon = get_option('xkbcommon')
1074 if want_xkbcommon != 'false' and not fuzzer_build
1075 libxkbcommon = dependency('xkbcommon',
1076 version : '>= 0.3.0',
1077 required : want_xkbcommon == 'true')
1078 have = libxkbcommon.found()
1083 conf.set10('HAVE_XKBCOMMON', have)
1085 want_pcre2 = get_option('pcre2')
1086 if want_pcre2 != 'false'
1087 libpcre2 = dependency('libpcre2-8',
1088 required : want_pcre2 == 'true')
1089 have = libpcre2.found()
1094 conf.set10('HAVE_PCRE2', have)
1096 want_glib = get_option('glib')
1097 if want_glib != 'false' and not fuzzer_build
1098 libglib = dependency('glib-2.0',
1099 version : '>= 2.22.0',
1100 required : want_glib == 'true')
1101 libgobject = dependency('gobject-2.0',
1102 version : '>= 2.22.0',
1103 required : want_glib == 'true')
1104 libgio = dependency('gio-2.0',
1105 required : want_glib == 'true')
1106 have = libglib.found() and libgobject.found() and libgio.found()
1113 conf.set10('HAVE_GLIB', have)
1115 want_dbus = get_option('dbus')
1116 if want_dbus != 'false' and not fuzzer_build
1117 libdbus = dependency('dbus-1',
1118 version : '>= 1.3.2',
1119 required : want_dbus == 'true')
1120 have = libdbus.found()
1125 conf.set10('HAVE_DBUS', have)
1127 default_dnssec = get_option('default-dnssec')
1129 default_dnssec = 'no'
1131 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1132 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1133 default_dnssec = 'no'
1135 conf.set('DEFAULT_DNSSEC_MODE',
1136 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1137 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1139 want_importd = get_option('importd')
1140 if want_importd != 'false'
1141 have = (conf.get('HAVE_LIBCURL') == 1 and
1142 conf.get('HAVE_ZLIB') == 1 and
1143 conf.get('HAVE_BZIP2') == 1 and
1144 conf.get('HAVE_XZ') == 1 and
1145 conf.get('HAVE_GCRYPT') == 1)
1146 if want_importd == 'true' and not have
1147 error('importd support was requested, but dependencies are not available')
1152 conf.set10('ENABLE_IMPORTD', have)
1154 want_remote = get_option('remote')
1155 if want_remote != 'false'
1156 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1157 conf.get('HAVE_LIBCURL') == 1]
1158 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1159 # it's possible to build one without the other. Complain only if
1160 # support was explictly requested. The auxiliary files like sysusers
1161 # config should be installed when any of the programs are built.
1162 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1163 error('remote support was requested, but dependencies are not available')
1165 have = have_deps[0] or have_deps[1]
1169 conf.set10('ENABLE_REMOTE', have)
1171 foreach term : ['utmp',
1203 have = get_option(term)
1204 name = 'ENABLE_' + term.underscorify().to_upper()
1205 conf.set10(name, have)
1208 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1210 want_tests = get_option('tests')
1211 install_tests = get_option('install-tests')
1212 slow_tests = get_option('slow-tests')
1216 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1218 #####################################################################
1220 if get_option('efi')
1221 efi_arch = host_machine.cpu_family()
1223 if efi_arch == 'x86'
1224 EFI_MACHINE_TYPE_NAME = 'ia32'
1225 gnu_efi_arch = 'ia32'
1226 elif efi_arch == 'x86_64'
1227 EFI_MACHINE_TYPE_NAME = 'x64'
1228 gnu_efi_arch = 'x86_64'
1229 elif efi_arch == 'arm'
1230 EFI_MACHINE_TYPE_NAME = 'arm'
1231 gnu_efi_arch = 'arm'
1232 elif efi_arch == 'aarch64'
1233 EFI_MACHINE_TYPE_NAME = 'aa64'
1234 gnu_efi_arch = 'aarch64'
1236 EFI_MACHINE_TYPE_NAME = ''
1241 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1243 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1247 conf.set10('ENABLE_EFI', have)
1249 #####################################################################
1251 config_h = configure_file(
1252 output : 'config.h',
1253 configuration : conf)
1255 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1257 includes = include_directories('src/basic',
1261 'src/journal-remote',
1265 'src/time-wait-sync',
1270 'src/libsystemd/sd-bus',
1271 'src/libsystemd/sd-device',
1272 'src/libsystemd/sd-hwdb',
1273 'src/libsystemd/sd-id128',
1274 'src/libsystemd/sd-netlink',
1275 'src/libsystemd/sd-network',
1276 'src/libsystemd-network',
1279 add_project_arguments('-include', 'config.h', language : 'c')
1283 subdir('src/systemd')
1285 subdir('src/libsystemd')
1286 subdir('src/libsystemd-network')
1287 subdir('src/journal')
1290 libjournal_core = static_library(
1292 libjournal_core_sources,
1294 include_directories : includes,
1297 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1298 libsystemd = shared_library(
1300 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1301 version : libsystemd_version,
1302 include_directories : includes,
1303 link_args : ['-shared',
1304 '-Wl,--version-script=' + libsystemd_sym_path],
1305 link_with : [libbasic,
1307 link_whole : [libsystemd_static,
1309 dependencies : [threads,
1313 link_depends : libsystemd_sym,
1315 install_dir : rootlibdir)
1317 static_libsystemd = get_option('static-libsystemd')
1318 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1320 install_libsystemd_static = static_library(
1323 journal_client_sources,
1325 basic_gcrypt_sources,
1326 include_directories : includes,
1327 build_by_default : static_libsystemd != 'false',
1328 install : static_libsystemd != 'false',
1329 install_dir : rootlibdir,
1330 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1331 dependencies : [threads,
1340 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1342 ############################################################
1344 # binaries that have --help and are intended for use by humans,
1345 # usually, but not always, installed in /bin.
1346 public_programs = []
1348 subdir('src/libudev')
1349 subdir('src/shared')
1352 subdir('src/network')
1354 subdir('src/analyze')
1355 subdir('src/journal-remote')
1356 subdir('src/coredump')
1357 subdir('src/hostname')
1358 subdir('src/import')
1359 subdir('src/kernel-install')
1360 subdir('src/locale')
1361 subdir('src/machine')
1362 subdir('src/portable')
1363 subdir('src/nspawn')
1364 subdir('src/resolve')
1365 subdir('src/timedate')
1366 subdir('src/timesync')
1367 subdir('src/vconsole')
1368 subdir('src/boot/efi')
1375 ############################################################
1377 # only static linking apart from libdl, to make sure that the
1378 # module is linked to all libraries that it uses.
1379 test_dlopen = executable(
1382 include_directories : includes,
1383 link_with : [libbasic],
1384 dependencies : [libdl])
1386 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1387 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1388 ['mymachines', 'ENABLE_MACHINED'],
1389 ['resolve', 'ENABLE_RESOLVE']]
1391 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1395 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1396 version_script_arg = join_paths(meson.current_source_dir(), sym)
1398 nss = shared_library(
1400 'src/nss-@0@/nss-@0@.c'.format(module),
1402 include_directories : includes,
1403 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1404 link_args : ['-Wl,-z,nodelete',
1406 '-Wl,--version-script=' + version_script_arg,
1408 link_with : [libsystemd_static,
1410 dependencies : [threads,
1414 install_dir : rootlibdir)
1416 # We cannot use shared_module because it does not support version suffix.
1417 # Unfortunately shared_library insists on creating the symlink…
1418 meson.add_install_script('sh', '-c',
1419 'rm $DESTDIR@0@/libnss_@1@.so'
1420 .format(rootlibdir, module))
1422 test('dlopen-nss_' + module,
1424 args : [nss.full_path()]) # path to dlopen must include a slash
1428 ############################################################
1430 executable('systemd',
1432 include_directories : includes,
1433 link_with : [libcore,
1435 dependencies : [threads,
1441 install_rpath : rootlibexecdir,
1443 install_dir : rootlibexecdir)
1445 meson.add_install_script(meson_make_symlink,
1446 join_paths(rootlibexecdir, 'systemd'),
1447 join_paths(rootsbindir, 'init'))
1449 exe = executable('systemd-analyze',
1450 systemd_analyze_sources,
1451 include_directories : includes,
1452 link_with : [libcore,
1454 dependencies : [threads,
1460 install_rpath : rootlibexecdir,
1462 public_programs += [exe]
1464 executable('systemd-journald',
1465 systemd_journald_sources,
1466 include_directories : includes,
1467 link_with : [libjournal_core,
1469 dependencies : [threads,
1473 install_rpath : rootlibexecdir,
1475 install_dir : rootlibexecdir)
1477 exe = executable('systemd-cat',
1478 systemd_cat_sources,
1479 include_directories : includes,
1480 link_with : [libjournal_core,
1482 dependencies : [threads],
1483 install_rpath : rootlibexecdir,
1485 public_programs += [exe]
1487 exe = executable('journalctl',
1489 include_directories : includes,
1490 link_with : [libshared],
1491 dependencies : [threads,
1496 install_rpath : rootlibexecdir,
1498 install_dir : rootbindir)
1499 public_programs += [exe]
1501 executable('systemd-getty-generator',
1502 'src/getty-generator/getty-generator.c',
1503 include_directories : includes,
1504 link_with : [libshared],
1505 install_rpath : rootlibexecdir,
1507 install_dir : systemgeneratordir)
1509 executable('systemd-debug-generator',
1510 'src/debug-generator/debug-generator.c',
1511 include_directories : includes,
1512 link_with : [libshared],
1513 install_rpath : rootlibexecdir,
1515 install_dir : systemgeneratordir)
1517 executable('systemd-fstab-generator',
1518 'src/fstab-generator/fstab-generator.c',
1519 'src/core/mount-setup.c',
1520 include_directories : includes,
1521 link_with : [libshared],
1522 install_rpath : rootlibexecdir,
1524 install_dir : systemgeneratordir)
1526 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1527 executable('30-systemd-environment-d-generator',
1528 'src/environment-d-generator/environment-d-generator.c',
1529 include_directories : includes,
1530 link_with : [libshared],
1531 install_rpath : rootlibexecdir,
1533 install_dir : userenvgeneratordir)
1535 meson.add_install_script(meson_make_symlink,
1536 join_paths(sysconfdir, 'environment'),
1537 join_paths(environmentdir, '99-environment.conf'))
1540 if conf.get('ENABLE_HIBERNATE') == 1
1541 executable('systemd-hibernate-resume-generator',
1542 'src/hibernate-resume/hibernate-resume-generator.c',
1543 include_directories : includes,
1544 link_with : [libshared],
1545 install_rpath : rootlibexecdir,
1547 install_dir : systemgeneratordir)
1549 executable('systemd-hibernate-resume',
1550 'src/hibernate-resume/hibernate-resume.c',
1551 include_directories : includes,
1552 link_with : [libshared],
1553 install_rpath : rootlibexecdir,
1555 install_dir : rootlibexecdir)
1558 if conf.get('HAVE_BLKID') == 1
1559 executable('systemd-gpt-auto-generator',
1560 'src/gpt-auto-generator/gpt-auto-generator.c',
1561 'src/basic/blkid-util.h',
1562 include_directories : includes,
1563 link_with : [libshared],
1564 dependencies : libblkid,
1565 install_rpath : rootlibexecdir,
1567 install_dir : systemgeneratordir)
1569 exe = executable('systemd-dissect',
1570 'src/dissect/dissect.c',
1571 include_directories : includes,
1572 link_with : [libshared],
1573 install_rpath : rootlibexecdir,
1575 install_dir : rootlibexecdir)
1576 public_programs += [exe]
1579 if conf.get('ENABLE_RESOLVE') == 1
1580 executable('systemd-resolved',
1581 systemd_resolved_sources,
1582 include_directories : includes,
1583 link_with : [libshared,
1585 libsystemd_resolve_core],
1586 dependencies : [threads,
1590 install_rpath : rootlibexecdir,
1592 install_dir : rootlibexecdir)
1594 exe = executable('resolvectl',
1596 include_directories : includes,
1597 link_with : [libshared,
1599 libsystemd_resolve_core],
1600 dependencies : [threads,
1604 install_rpath : rootlibexecdir,
1606 public_programs += [exe]
1608 meson.add_install_script(meson_make_symlink,
1609 join_paths(bindir, 'resolvectl'),
1610 join_paths(rootsbindir, 'resolvconf'))
1612 meson.add_install_script(meson_make_symlink,
1613 join_paths(bindir, 'resolvectl'),
1614 join_paths(bindir, 'systemd-resolve'))
1617 if conf.get('ENABLE_LOGIND') == 1
1618 executable('systemd-logind',
1619 systemd_logind_sources,
1620 include_directories : includes,
1621 link_with : [liblogind_core,
1623 dependencies : [threads,
1625 install_rpath : rootlibexecdir,
1627 install_dir : rootlibexecdir)
1629 exe = executable('loginctl',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 dependencies : [threads,
1636 install_rpath : rootlibexecdir,
1638 install_dir : rootbindir)
1639 public_programs += [exe]
1641 exe = executable('systemd-inhibit',
1642 'src/login/inhibit.c',
1643 include_directories : includes,
1644 link_with : [libshared],
1645 install_rpath : rootlibexecdir,
1647 install_dir : rootbindir)
1648 public_programs += [exe]
1650 if conf.get('HAVE_PAM') == 1
1651 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1652 pam_systemd = shared_library(
1656 include_directories : includes,
1657 link_args : ['-shared',
1658 '-Wl,--version-script=' + version_script_arg],
1659 link_with : [libsystemd_static,
1661 dependencies : [threads,
1664 link_depends : pam_systemd_sym,
1666 install_dir : pamlibdir)
1668 test('dlopen-pam_systemd',
1670 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1674 executable('systemd-user-runtime-dir',
1675 user_runtime_dir_sources,
1676 include_directories : includes,
1677 link_with : [libshared, liblogind_core],
1678 install_rpath : rootlibexecdir,
1680 install_dir : rootlibexecdir)
1682 if conf.get('HAVE_PAM') == 1
1683 executable('systemd-user-sessions',
1684 'src/user-sessions/user-sessions.c',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 install_rpath : rootlibexecdir,
1689 install_dir : rootlibexecdir)
1692 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1693 exe = executable('bootctl',
1694 'src/boot/bootctl.c',
1695 include_directories : includes,
1696 link_with : [libshared],
1697 dependencies : [libblkid],
1698 install_rpath : rootlibexecdir,
1700 public_programs += [exe]
1703 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1704 include_directories : includes,
1705 link_with : [libshared],
1706 dependencies : [threads],
1707 install_rpath : rootlibexecdir,
1709 public_programs += [exe]
1711 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1712 include_directories : includes,
1713 link_with : [libshared],
1714 dependencies : [threads,
1719 install_rpath : rootlibexecdir,
1721 install_dir : rootbindir)
1722 public_programs += [exe]
1724 if conf.get('ENABLE_PORTABLED') == 1
1725 executable('systemd-portabled',
1726 systemd_portabled_sources,
1727 include_directories : includes,
1728 link_with : [libshared],
1729 dependencies : [threads],
1730 install_rpath : rootlibexecdir,
1732 install_dir : rootlibexecdir)
1734 exe = executable('portablectl', 'src/portable/portablectl.c',
1735 include_directories : includes,
1736 link_with : [libshared],
1737 dependencies : [threads],
1738 install_rpath : rootlibexecdir,
1740 install_dir : rootlibexecdir)
1741 public_programs += [exe]
1744 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1745 meson.add_install_script(meson_make_symlink,
1746 join_paths(rootbindir, 'systemctl'),
1747 join_paths(rootsbindir, alias))
1750 if conf.get('ENABLE_BACKLIGHT') == 1
1751 executable('systemd-backlight',
1752 'src/backlight/backlight.c',
1753 include_directories : includes,
1754 link_with : [libshared],
1755 install_rpath : rootlibexecdir,
1757 install_dir : rootlibexecdir)
1760 if conf.get('ENABLE_RFKILL') == 1
1761 executable('systemd-rfkill',
1762 'src/rfkill/rfkill.c',
1763 include_directories : includes,
1764 link_with : [libshared],
1765 install_rpath : rootlibexecdir,
1767 install_dir : rootlibexecdir)
1770 executable('systemd-system-update-generator',
1771 'src/system-update-generator/system-update-generator.c',
1772 include_directories : includes,
1773 link_with : [libshared],
1774 install_rpath : rootlibexecdir,
1776 install_dir : systemgeneratordir)
1778 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1779 executable('systemd-cryptsetup',
1780 'src/cryptsetup/cryptsetup.c',
1781 include_directories : includes,
1782 link_with : [libshared],
1783 dependencies : [libcryptsetup],
1784 install_rpath : rootlibexecdir,
1786 install_dir : rootlibexecdir)
1788 executable('systemd-cryptsetup-generator',
1789 'src/cryptsetup/cryptsetup-generator.c',
1790 include_directories : includes,
1791 link_with : [libshared],
1792 dependencies : [libcryptsetup],
1793 install_rpath : rootlibexecdir,
1795 install_dir : systemgeneratordir)
1797 executable('systemd-veritysetup',
1798 'src/veritysetup/veritysetup.c',
1799 include_directories : includes,
1800 link_with : [libshared],
1801 dependencies : [libcryptsetup],
1802 install_rpath : rootlibexecdir,
1804 install_dir : rootlibexecdir)
1806 executable('systemd-veritysetup-generator',
1807 'src/veritysetup/veritysetup-generator.c',
1808 include_directories : includes,
1809 link_with : [libshared],
1810 dependencies : [libcryptsetup],
1811 install_rpath : rootlibexecdir,
1813 install_dir : systemgeneratordir)
1816 if conf.get('HAVE_SYSV_COMPAT') == 1
1817 executable('systemd-sysv-generator',
1818 'src/sysv-generator/sysv-generator.c',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 install_rpath : rootlibexecdir,
1823 install_dir : systemgeneratordir)
1825 executable('systemd-rc-local-generator',
1826 'src/rc-local-generator/rc-local-generator.c',
1827 include_directories : includes,
1828 link_with : [libshared],
1829 install_rpath : rootlibexecdir,
1831 install_dir : systemgeneratordir)
1834 if conf.get('ENABLE_HOSTNAMED') == 1
1835 executable('systemd-hostnamed',
1836 'src/hostname/hostnamed.c',
1837 include_directories : includes,
1838 link_with : [libshared],
1839 install_rpath : rootlibexecdir,
1841 install_dir : rootlibexecdir)
1843 exe = executable('hostnamectl',
1844 'src/hostname/hostnamectl.c',
1845 include_directories : includes,
1846 link_with : [libshared],
1847 install_rpath : rootlibexecdir,
1849 public_programs += [exe]
1852 if conf.get('ENABLE_LOCALED') == 1
1853 if conf.get('HAVE_XKBCOMMON') == 1
1854 # logind will load libxkbcommon.so dynamically on its own
1860 executable('systemd-localed',
1861 systemd_localed_sources,
1862 include_directories : includes,
1863 link_with : [libshared],
1864 dependencies : deps,
1865 install_rpath : rootlibexecdir,
1867 install_dir : rootlibexecdir)
1869 exe = executable('localectl',
1871 include_directories : includes,
1872 link_with : [libshared],
1873 install_rpath : rootlibexecdir,
1875 public_programs += [exe]
1878 if conf.get('ENABLE_TIMEDATED') == 1
1879 executable('systemd-timedated',
1880 'src/timedate/timedated.c',
1881 include_directories : includes,
1882 link_with : [libshared],
1883 install_rpath : rootlibexecdir,
1885 install_dir : rootlibexecdir)
1888 if conf.get('ENABLE_TIMEDATECTL') == 1
1889 exe = executable('timedatectl',
1890 'src/timedate/timedatectl.c',
1891 include_directories : includes,
1892 install_rpath : rootlibexecdir,
1893 link_with : [libshared],
1894 dependencies : [libm],
1896 public_programs += [exe]
1899 if conf.get('ENABLE_TIMESYNCD') == 1
1900 executable('systemd-timesyncd',
1901 systemd_timesyncd_sources,
1902 include_directories : includes,
1903 link_with : [libshared],
1904 dependencies : [threads,
1906 install_rpath : rootlibexecdir,
1908 install_dir : rootlibexecdir)
1910 executable('systemd-time-wait-sync',
1911 'src/time-wait-sync/time-wait-sync.c',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 install_rpath : rootlibexecdir,
1916 install_dir : rootlibexecdir)
1919 if conf.get('ENABLE_MACHINED') == 1
1920 executable('systemd-machined',
1921 systemd_machined_sources,
1922 include_directories : includes,
1923 link_with : [libmachine_core,
1925 install_rpath : rootlibexecdir,
1927 install_dir : rootlibexecdir)
1929 exe = executable('machinectl',
1930 'src/machine/machinectl.c',
1931 include_directories : includes,
1932 link_with : [libshared],
1933 dependencies : [threads,
1936 install_rpath : rootlibexecdir,
1938 install_dir : rootbindir)
1939 public_programs += [exe]
1942 if conf.get('ENABLE_IMPORTD') == 1
1943 executable('systemd-importd',
1944 systemd_importd_sources,
1945 include_directories : includes,
1946 link_with : [libshared],
1947 dependencies : [threads],
1948 install_rpath : rootlibexecdir,
1950 install_dir : rootlibexecdir)
1952 systemd_pull = executable('systemd-pull',
1953 systemd_pull_sources,
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [libcurl,
1961 install_rpath : rootlibexecdir,
1963 install_dir : rootlibexecdir)
1965 systemd_import = executable('systemd-import',
1966 systemd_import_sources,
1967 include_directories : includes,
1968 link_with : [libshared],
1969 dependencies : [libcurl,
1973 install_rpath : rootlibexecdir,
1975 install_dir : rootlibexecdir)
1977 systemd_export = executable('systemd-export',
1978 systemd_export_sources,
1979 include_directories : includes,
1980 link_with : [libshared],
1981 dependencies : [libcurl,
1985 install_rpath : rootlibexecdir,
1987 install_dir : rootlibexecdir)
1988 public_programs += [systemd_pull, systemd_import, systemd_export]
1991 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1992 exe = executable('systemd-journal-upload',
1993 systemd_journal_upload_sources,
1994 include_directories : includes,
1995 link_with : [libshared],
1996 dependencies : [threads,
2001 install_rpath : rootlibexecdir,
2003 install_dir : rootlibexecdir)
2004 public_programs += [exe]
2007 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2008 s_j_remote = executable('systemd-journal-remote',
2009 systemd_journal_remote_sources,
2010 include_directories : includes,
2011 link_with : [libshared,
2012 libsystemd_journal_remote],
2013 dependencies : [threads,
2018 install_rpath : rootlibexecdir,
2020 install_dir : rootlibexecdir)
2022 s_j_gatewayd = executable('systemd-journal-gatewayd',
2023 systemd_journal_gatewayd_sources,
2024 include_directories : includes,
2025 link_with : [libshared],
2026 dependencies : [threads,
2031 install_rpath : rootlibexecdir,
2033 install_dir : rootlibexecdir)
2034 public_programs += [s_j_remote, s_j_gatewayd]
2037 if conf.get('ENABLE_COREDUMP') == 1
2038 executable('systemd-coredump',
2039 systemd_coredump_sources,
2040 include_directories : includes,
2041 link_with : [libshared],
2042 dependencies : [threads,
2047 install_rpath : rootlibexecdir,
2049 install_dir : rootlibexecdir)
2051 exe = executable('coredumpctl',
2052 coredumpctl_sources,
2053 include_directories : includes,
2054 link_with : [libshared],
2055 dependencies : [threads,
2058 install_rpath : rootlibexecdir,
2060 public_programs += [exe]
2063 if conf.get('ENABLE_BINFMT') == 1
2064 exe = executable('systemd-binfmt',
2065 'src/binfmt/binfmt.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 install_rpath : rootlibexecdir,
2070 install_dir : rootlibexecdir)
2071 public_programs += [exe]
2073 meson.add_install_script('sh', '-c',
2074 mkdir_p.format(binfmtdir))
2075 meson.add_install_script('sh', '-c',
2076 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2079 if conf.get('ENABLE_VCONSOLE') == 1
2080 executable('systemd-vconsole-setup',
2081 'src/vconsole/vconsole-setup.c',
2082 include_directories : includes,
2083 link_with : [libshared],
2084 install_rpath : rootlibexecdir,
2086 install_dir : rootlibexecdir)
2089 if conf.get('ENABLE_RANDOMSEED') == 1
2090 executable('systemd-random-seed',
2091 'src/random-seed/random-seed.c',
2092 include_directories : includes,
2093 link_with : [libshared],
2094 install_rpath : rootlibexecdir,
2096 install_dir : rootlibexecdir)
2099 if conf.get('ENABLE_FIRSTBOOT') == 1
2100 executable('systemd-firstboot',
2101 'src/firstboot/firstboot.c',
2102 include_directories : includes,
2103 link_with : [libshared],
2104 dependencies : [libcrypt],
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootbindir)
2110 executable('systemd-remount-fs',
2111 'src/remount-fs/remount-fs.c',
2112 'src/core/mount-setup.c',
2113 'src/core/mount-setup.h',
2114 include_directories : includes,
2115 link_with : [libshared],
2116 install_rpath : rootlibexecdir,
2118 install_dir : rootlibexecdir)
2120 executable('systemd-machine-id-setup',
2121 'src/machine-id-setup/machine-id-setup-main.c',
2122 'src/core/machine-id-setup.c',
2123 'src/core/machine-id-setup.h',
2124 include_directories : includes,
2125 link_with : [libshared],
2126 install_rpath : rootlibexecdir,
2128 install_dir : rootbindir)
2130 executable('systemd-fsck',
2132 include_directories : includes,
2133 link_with : [libshared],
2134 install_rpath : rootlibexecdir,
2136 install_dir : rootlibexecdir)
2138 executable('systemd-growfs',
2139 'src/partition/growfs.c',
2140 include_directories : includes,
2141 link_with : [libshared],
2142 dependencies : [libcryptsetup],
2143 install_rpath : rootlibexecdir,
2145 install_dir : rootlibexecdir)
2147 executable('systemd-makefs',
2148 'src/partition/makefs.c',
2149 include_directories : includes,
2150 link_with : [libshared],
2151 install_rpath : rootlibexecdir,
2153 install_dir : rootlibexecdir)
2155 executable('systemd-sleep',
2156 'src/sleep/sleep.c',
2157 include_directories : includes,
2158 link_with : [libshared],
2159 install_rpath : rootlibexecdir,
2161 install_dir : rootlibexecdir)
2163 exe = executable('systemd-sysctl',
2164 'src/sysctl/sysctl.c',
2165 include_directories : includes,
2166 link_with : [libshared],
2167 install_rpath : rootlibexecdir,
2169 install_dir : rootlibexecdir)
2170 public_programs += [exe]
2172 executable('systemd-ac-power',
2173 'src/ac-power/ac-power.c',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2178 install_dir : rootlibexecdir)
2180 exe = executable('systemd-detect-virt',
2181 'src/detect-virt/detect-virt.c',
2182 include_directories : includes,
2183 link_with : [libshared],
2184 install_rpath : rootlibexecdir,
2186 public_programs += [exe]
2188 exe = executable('systemd-delta',
2189 'src/delta/delta.c',
2190 include_directories : includes,
2191 link_with : [libshared],
2192 install_rpath : rootlibexecdir,
2194 public_programs += [exe]
2196 exe = executable('systemd-escape',
2197 'src/escape/escape.c',
2198 include_directories : includes,
2199 link_with : [libshared],
2200 install_rpath : rootlibexecdir,
2202 install_dir : rootbindir)
2203 public_programs += [exe]
2205 exe = executable('systemd-notify',
2206 'src/notify/notify.c',
2207 include_directories : includes,
2208 link_with : [libshared],
2209 install_rpath : rootlibexecdir,
2211 install_dir : rootbindir)
2212 public_programs += [exe]
2214 executable('systemd-volatile-root',
2215 'src/volatile-root/volatile-root.c',
2216 include_directories : includes,
2217 link_with : [libshared],
2218 install_rpath : rootlibexecdir,
2220 install_dir : rootlibexecdir)
2222 executable('systemd-cgroups-agent',
2223 'src/cgroups-agent/cgroups-agent.c',
2224 include_directories : includes,
2225 link_with : [libshared],
2226 install_rpath : rootlibexecdir,
2228 install_dir : rootlibexecdir)
2230 exe = executable('systemd-path',
2232 include_directories : includes,
2233 link_with : [libshared],
2234 install_rpath : rootlibexecdir,
2236 public_programs += [exe]
2238 exe = executable('systemd-ask-password',
2239 'src/ask-password/ask-password.c',
2240 include_directories : includes,
2241 link_with : [libshared],
2242 install_rpath : rootlibexecdir,
2244 install_dir : rootbindir)
2245 public_programs += [exe]
2247 executable('systemd-reply-password',
2248 'src/reply-password/reply-password.c',
2249 include_directories : includes,
2250 link_with : [libshared],
2251 install_rpath : rootlibexecdir,
2253 install_dir : rootlibexecdir)
2255 exe = executable('systemd-tty-ask-password-agent',
2256 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2257 include_directories : includes,
2258 link_with : [libshared],
2259 install_rpath : rootlibexecdir,
2261 install_dir : rootbindir)
2262 public_programs += [exe]
2264 exe = executable('systemd-cgls',
2266 include_directories : includes,
2267 link_with : [libshared],
2268 install_rpath : rootlibexecdir,
2270 public_programs += [exe]
2272 exe = executable('systemd-cgtop',
2273 'src/cgtop/cgtop.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2278 public_programs += [exe]
2280 executable('systemd-initctl',
2281 'src/initctl/initctl.c',
2282 include_directories : includes,
2283 link_with : [libshared],
2284 install_rpath : rootlibexecdir,
2286 install_dir : rootlibexecdir)
2288 exe = executable('systemd-mount',
2289 'src/mount/mount-tool.c',
2290 include_directories : includes,
2291 link_with : [libshared],
2292 install_rpath : rootlibexecdir,
2294 public_programs += [exe]
2296 meson.add_install_script(meson_make_symlink,
2297 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2299 exe = executable('systemd-run',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2305 public_programs += [exe]
2307 exe = executable('systemd-stdio-bridge',
2308 'src/stdio-bridge/stdio-bridge.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2313 public_programs += [exe]
2315 exe = executable('busctl',
2316 'src/busctl/busctl.c',
2317 'src/busctl/busctl-introspect.c',
2318 'src/busctl/busctl-introspect.h',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 install_rpath : rootlibexecdir,
2323 public_programs += [exe]
2325 if conf.get('ENABLE_SYSUSERS') == 1
2326 exe = executable('systemd-sysusers',
2327 'src/sysusers/sysusers.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2332 install_dir : rootbindir)
2333 public_programs += [exe]
2336 if conf.get('ENABLE_TMPFILES') == 1
2337 exe = executable('systemd-tmpfiles',
2338 'src/tmpfiles/tmpfiles.c',
2339 include_directories : includes,
2340 link_with : [libshared],
2341 dependencies : [libacl],
2342 install_rpath : rootlibexecdir,
2344 install_dir : rootbindir)
2345 public_programs += [exe]
2347 test('test-systemd-tmpfiles',
2348 test_systemd_tmpfiles_py,
2349 args : exe.full_path())
2350 # https://github.com/mesonbuild/meson/issues/2681
2353 if conf.get('ENABLE_HWDB') == 1
2354 exe = executable('systemd-hwdb',
2356 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2357 include_directories : includes,
2358 link_with : [libudev_static],
2359 install_rpath : udev_rpath,
2361 install_dir : rootbindir)
2362 public_programs += [exe]
2365 if conf.get('ENABLE_QUOTACHECK') == 1
2366 executable('systemd-quotacheck',
2367 'src/quotacheck/quotacheck.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2372 install_dir : rootlibexecdir)
2375 exe = executable('systemd-socket-proxyd',
2376 'src/socket-proxy/socket-proxyd.c',
2377 include_directories : includes,
2378 link_with : [libshared],
2379 dependencies : [threads],
2380 install_rpath : rootlibexecdir,
2382 install_dir : rootlibexecdir)
2383 public_programs += [exe]
2385 exe = executable('systemd-udevd',
2386 systemd_udevd_sources,
2387 include_directories : includes,
2388 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2389 link_with : [libudev_core,
2392 dependencies : [threads,
2397 install_rpath : udev_rpath,
2399 install_dir : rootlibexecdir)
2400 public_programs += [exe]
2402 exe = executable('udevadm',
2404 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2405 include_directories : includes,
2406 link_with : [libudev_core,
2409 dependencies : [threads,
2414 install_rpath : udev_rpath,
2416 install_dir : rootbindir)
2417 public_programs += [exe]
2419 executable('systemd-shutdown',
2420 systemd_shutdown_sources,
2421 include_directories : includes,
2422 link_with : [libshared],
2423 dependencies : [libmount],
2424 install_rpath : rootlibexecdir,
2426 install_dir : rootlibexecdir)
2428 executable('systemd-update-done',
2429 'src/update-done/update-done.c',
2430 include_directories : includes,
2431 link_with : [libshared],
2432 install_rpath : rootlibexecdir,
2434 install_dir : rootlibexecdir)
2436 executable('systemd-update-utmp',
2437 'src/update-utmp/update-utmp.c',
2438 include_directories : includes,
2439 link_with : [libshared],
2440 dependencies : [libaudit],
2441 install_rpath : rootlibexecdir,
2443 install_dir : rootlibexecdir)
2445 if conf.get('HAVE_KMOD') == 1
2446 executable('systemd-modules-load',
2447 'src/modules-load/modules-load.c',
2448 include_directories : includes,
2449 link_with : [libshared],
2450 dependencies : [libkmod],
2451 install_rpath : rootlibexecdir,
2453 install_dir : rootlibexecdir)
2455 meson.add_install_script('sh', '-c',
2456 mkdir_p.format(modulesloaddir))
2457 meson.add_install_script('sh', '-c',
2458 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2461 exe = executable('systemd-nspawn',
2462 systemd_nspawn_sources,
2463 'src/core/mount-setup.c', # FIXME: use a variable?
2464 'src/core/mount-setup.h',
2465 'src/core/loopback-setup.c',
2466 'src/core/loopback-setup.h',
2467 include_directories : includes,
2468 link_with : [libnspawn_core,
2470 dependencies : [libblkid],
2471 install_rpath : rootlibexecdir,
2473 public_programs += [exe]
2475 if conf.get('ENABLE_NETWORKD') == 1
2476 executable('systemd-networkd',
2477 systemd_networkd_sources,
2478 include_directories : includes,
2479 link_with : [libnetworkd_core,
2483 dependencies : [threads],
2484 install_rpath : rootlibexecdir,
2486 install_dir : rootlibexecdir)
2488 executable('systemd-networkd-wait-online',
2489 systemd_networkd_wait_online_sources,
2490 include_directories : includes,
2491 link_with : [libnetworkd_core,
2493 install_rpath : rootlibexecdir,
2495 install_dir : rootlibexecdir)
2497 exe = executable('networkctl',
2499 include_directories : includes,
2500 link_with : [libsystemd_network,
2502 install_rpath : rootlibexecdir,
2504 install_dir : rootbindir)
2505 public_programs += [exe]
2508 executable('systemd-sulogin-shell',
2509 ['src/sulogin-shell/sulogin-shell.c'],
2510 include_directories : includes,
2511 link_with : [libshared],
2512 install_rpath : rootlibexecdir,
2514 install_dir : rootlibexecdir)
2516 ############################################################
2518 foreach tuple : tests
2520 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2521 dependencies = tuple[2]
2522 condition = tuple.length() >= 4 ? tuple[3] : ''
2523 type = tuple.length() >= 5 ? tuple[4] : ''
2524 defs = tuple.length() >= 6 ? tuple[5] : []
2525 incs = tuple.length() >= 7 ? tuple[6] : includes
2528 name = sources[0].split('/')[-1].split('.')[0]
2529 if type.startswith('timeout=')
2530 timeout = type.split('=')[1].to_int()
2533 if want_tests == 'false'
2534 message('Not compiling @0@ because tests is set to false'.format(name))
2535 elif condition == '' or conf.get(condition) == 1
2539 include_directories : incs,
2540 link_with : link_with,
2541 dependencies : dependencies,
2543 install_rpath : rootlibexecdir,
2544 install : install_tests,
2545 install_dir : join_paths(testsdir, type))
2548 message('@0@ is a manual test'.format(name))
2549 elif type == 'unsafe' and want_tests != 'unsafe'
2550 message('@0@ is an unsafe test'.format(name))
2557 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2562 'test-libsystemd-sym',
2563 test_libsystemd_sym_c,
2564 include_directories : includes,
2565 link_with : [libsystemd],
2566 install : install_tests,
2567 install_dir : testsdir)
2568 test('test-libsystemd-sym', exe)
2571 'test-libsystemd-static-sym',
2572 test_libsystemd_sym_c,
2573 include_directories : includes,
2574 link_with : [install_libsystemd_static],
2575 dependencies : [threads], # threads is already included in dependencies on the library,
2576 # but does not seem to get propagated. Add here as a work-around.
2577 build_by_default : static_libsystemd_pic,
2578 install : install_tests and static_libsystemd_pic,
2579 install_dir : testsdir)
2580 if static_libsystemd_pic
2581 test('test-libsystemd-static-sym', exe)
2587 include_directories : includes,
2588 c_args : ['-Wno-deprecated-declarations'],
2589 link_with : [libudev],
2590 install : install_tests,
2591 install_dir : testsdir)
2592 test('test-libudev-sym', exe)
2595 'test-libudev-static-sym',
2597 include_directories : includes,
2598 c_args : ['-Wno-deprecated-declarations'],
2599 link_with : [install_libudev_static],
2600 build_by_default : static_libudev_pic,
2601 install : install_tests and static_libudev_pic,
2602 install_dir : testsdir)
2603 if static_libudev_pic
2604 test('test-libudev-static-sym', exe)
2607 ############################################################
2611 foreach tuple : fuzzers
2613 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2614 dependencies = tuple[2]
2615 defs = tuple.length() >= 4 ? tuple[3] : []
2616 incs = tuple.length() >= 5 ? tuple[4] : includes
2619 dependencies += fuzzing_engine
2621 sources += 'src/fuzz/fuzz-main.c'
2624 name = sources[0].split('/')[-1].split('.')[0]
2626 fuzzer_exes += executable(
2629 include_directories : [incs, include_directories('src/fuzz')],
2630 link_with : link_with,
2631 dependencies : dependencies,
2636 run_target('fuzzers',
2637 depends : fuzzer_exes,
2640 ############################################################
2642 make_directive_index_py = find_program('tools/make-directive-index.py')
2643 make_man_index_py = find_program('tools/make-man-index.py')
2644 xml_helper_py = find_program('tools/xml_helper.py')
2645 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2649 subdir('sysusers.d')
2650 subdir('tmpfiles.d')
2655 subdir('shell-completion/bash')
2656 subdir('shell-completion/zsh')
2657 subdir('doc/sysvinit')
2658 subdir('doc/var-log')
2660 # FIXME: figure out if the warning is true:
2661 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2662 install_subdir('factory/etc',
2663 install_dir : factorydir)
2666 install_data('xorg/50-systemd-user.sh',
2667 install_dir : xinitrcdir)
2668 install_data('modprobe.d/systemd.conf',
2669 install_dir : modprobedir)
2670 install_data('LICENSE.GPL2',
2675 'doc/DISTRO_PORTING',
2676 'doc/ENVIRONMENT.md',
2678 'doc/TRANSIENT-SETTINGS.md',
2681 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2682 install_dir : docdir)
2684 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2685 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2687 ############################################################
2689 meson_check_help = find_program('tools/meson-check-help.sh')
2691 foreach exec : public_programs
2692 name = exec.full_path().split('/')[-1]
2693 test('check-help-' + name,
2695 args : [exec.full_path()])
2698 ############################################################
2700 # Enable tests for all supported sanitizers
2701 foreach tuple : sanitizers
2702 sanitizer = tuple[0]
2705 have = run_command(check_compilation_sh,
2706 cc.cmd_array(), '-x', 'c',
2707 '-fsanitize=@0@'.format(sanitizer),
2708 '-include', link_test_c).returncode() == 0
2709 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2713 foreach p : fuzz_regression_tests
2714 b = p.split('/')[-2]
2715 c = p.split('/')[-1]
2717 name = '@0@:@1@'.format(b, sanitizer)
2720 if want_tests == 'false'
2721 message('Not compiling @0@ because tests is set to false'.format(name))
2723 exe = custom_target(
2727 command : [env, 'ln', '-fs',
2728 join_paths(build.full_path(), b),
2730 build_by_default : true)
2732 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2737 if want_tests != 'false' and slow_tests
2738 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2740 args : [exe.full_path(),
2741 join_paths(meson.source_root(),
2742 'test/fuzz-regressions',
2750 ############################################################
2753 all_files = run_command(
2755 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2758 all_files = files(all_files.stdout().split())
2763 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2766 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2770 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2773 command : [meson_git_contrib_sh])
2777 git_head = run_command(
2779 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2780 'rev-parse', 'HEAD']).stdout().strip()
2781 git_head_short = run_command(
2783 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2784 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2788 command : ['git', 'archive',
2789 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2791 '--prefix', 'systemd-@0@/'.format(git_head),
2795 ############################################################
2797 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2800 depends : [man, libsystemd, libudev],
2801 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2803 ############################################################
2806 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2808 'split /usr: @0@'.format(split_usr),
2809 'split bin-sbin: @0@'.format(split_bin),
2810 'prefix directory: @0@'.format(prefixdir),
2811 'rootprefix directory: @0@'.format(rootprefixdir),
2812 'sysconf directory: @0@'.format(sysconfdir),
2813 'include directory: @0@'.format(includedir),
2814 'lib directory: @0@'.format(libdir),
2815 'rootlib directory: @0@'.format(rootlibdir),
2816 'SysV init scripts: @0@'.format(sysvinit_path),
2817 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2818 'PAM modules directory: @0@'.format(pamlibdir),
2819 'PAM configuration directory: @0@'.format(pamconfdir),
2820 'RPM macros directory: @0@'.format(rpmmacrosdir),
2821 'modprobe.d directory: @0@'.format(modprobedir),
2822 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2823 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2824 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2825 'bash completions directory: @0@'.format(bashcompletiondir),
2826 'zsh completions directory: @0@'.format(zshcompletiondir),
2827 'extra start script: @0@'.format(get_option('rc-local')),
2828 'extra stop script: @0@'.format(get_option('halt-local')),
2829 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2830 get_option('debug-tty')),
2831 'TTY GID: @0@'.format(tty_gid),
2832 'users GID: @0@'.format(users_gid),
2833 'maximum system UID: @0@'.format(system_uid_max),
2834 'maximum system GID: @0@'.format(system_gid_max),
2835 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2836 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2837 'minimum container UID base: @0@'.format(container_uid_base_min),
2838 'maximum container UID base: @0@'.format(container_uid_base_max),
2839 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2840 'render group access mode: @0@'.format(get_option('group-render-mode')),
2841 'certificate root directory: @0@'.format(get_option('certificate-root')),
2842 'support URL: @0@'.format(support_url),
2843 'nobody user name: @0@'.format(nobody_user),
2844 'nobody group name: @0@'.format(nobody_group),
2845 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2846 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2848 'default DNSSEC mode: @0@'.format(default_dnssec),
2849 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2850 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2852 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2853 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2855 'default DNS servers: @0@'.format(alt_dns_servers),
2856 'default NTP servers: @0@'.format(alt_ntp_servers)]
2858 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2859 '@@0@'.format(time_epoch)).stdout().strip()
2861 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2864 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2865 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2866 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2868 if conf.get('ENABLE_EFI') == 1
2870 'efi arch: @0@'.format(efi_arch)]
2874 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2875 'EFI CC @0@'.format(efi_cc),
2876 'EFI lib directory: @0@'.format(efi_libdir),
2877 'EFI lds directory: @0@'.format(efi_ldsdir),
2878 'EFI include directory: @0@'.format(efi_incdir)]
2932 ['legacy pkla', install_polkit_pkla],
2934 ['gnu-efi', have_gnu_efi],
2941 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2944 ['man pages', want_man],
2945 ['html pages', want_html],
2946 ['man page indices', want_man and have_lxml],
2951 ['adm group', get_option('adm-group')],
2952 ['wheel group', get_option('wheel-group')],
2955 ['debug mmap cache'],
2956 ['valgrind', conf.get('VALGRIND') == 1],
2959 if tuple.length() >= 2
2962 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2963 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2964 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2969 missing += [tuple[0]]
2975 'enabled features: @0@'.format(', '.join(found)),
2977 'disabled features: @0@'.format(', '.join(missing)),
2979 message('\n '.join(status))
2981 if rootprefixdir != rootprefix_default
2983 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2984 'systemd used fixed names for unit file directories and other paths, so anything\n' +
2985 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))