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',
1264 'src/time-wait-sync',
1269 'src/libsystemd/sd-bus',
1270 'src/libsystemd/sd-device',
1271 'src/libsystemd/sd-hwdb',
1272 'src/libsystemd/sd-id128',
1273 'src/libsystemd/sd-netlink',
1274 'src/libsystemd/sd-network',
1275 'src/libsystemd-network',
1278 add_project_arguments('-include', 'config.h', language : 'c')
1282 subdir('src/systemd')
1284 subdir('src/libsystemd')
1285 subdir('src/libsystemd-network')
1286 subdir('src/journal')
1289 libjournal_core = static_library(
1291 libjournal_core_sources,
1293 include_directories : includes,
1296 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1297 libsystemd = shared_library(
1299 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1300 version : libsystemd_version,
1301 include_directories : includes,
1302 link_args : ['-shared',
1303 '-Wl,--version-script=' + libsystemd_sym_path],
1304 link_with : [libbasic,
1306 link_whole : [libsystemd_static,
1308 dependencies : [threads,
1312 link_depends : libsystemd_sym,
1314 install_dir : rootlibdir)
1316 static_libsystemd = get_option('static-libsystemd')
1317 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1319 install_libsystemd_static = static_library(
1322 journal_client_sources,
1324 basic_gcrypt_sources,
1325 include_directories : includes,
1326 build_by_default : static_libsystemd != 'false',
1327 install : static_libsystemd != 'false',
1328 install_dir : rootlibdir,
1329 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1330 dependencies : [threads,
1339 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1341 ############################################################
1343 # binaries that have --help and are intended for use by humans,
1344 # usually, but not always, installed in /bin.
1345 public_programs = []
1347 subdir('src/libudev')
1348 subdir('src/shared')
1351 subdir('src/network')
1353 subdir('src/analyze')
1354 subdir('src/journal-remote')
1355 subdir('src/coredump')
1356 subdir('src/hostname')
1357 subdir('src/import')
1358 subdir('src/kernel-install')
1359 subdir('src/locale')
1360 subdir('src/machine')
1361 subdir('src/portable')
1362 subdir('src/nspawn')
1363 subdir('src/resolve')
1364 subdir('src/timedate')
1365 subdir('src/timesync')
1366 subdir('src/vconsole')
1367 subdir('src/boot/efi')
1374 ############################################################
1376 # only static linking apart from libdl, to make sure that the
1377 # module is linked to all libraries that it uses.
1378 test_dlopen = executable(
1381 include_directories : includes,
1382 link_with : [libbasic],
1383 dependencies : [libdl])
1385 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1386 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1387 ['mymachines', 'ENABLE_MACHINED'],
1388 ['resolve', 'ENABLE_RESOLVE']]
1390 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1394 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1395 version_script_arg = join_paths(meson.current_source_dir(), sym)
1397 nss = shared_library(
1399 'src/nss-@0@/nss-@0@.c'.format(module),
1401 include_directories : includes,
1402 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1403 link_args : ['-Wl,-z,nodelete',
1405 '-Wl,--version-script=' + version_script_arg,
1407 link_with : [libsystemd_static,
1409 dependencies : [threads,
1413 install_dir : rootlibdir)
1415 # We cannot use shared_module because it does not support version suffix.
1416 # Unfortunately shared_library insists on creating the symlink…
1417 meson.add_install_script('sh', '-c',
1418 'rm $DESTDIR@0@/libnss_@1@.so'
1419 .format(rootlibdir, module))
1421 test('dlopen-nss_' + module,
1423 args : [nss.full_path()]) # path to dlopen must include a slash
1427 ############################################################
1429 executable('systemd',
1431 include_directories : includes,
1432 link_with : [libcore,
1434 dependencies : [threads,
1440 install_rpath : rootlibexecdir,
1442 install_dir : rootlibexecdir)
1444 meson.add_install_script(meson_make_symlink,
1445 join_paths(rootlibexecdir, 'systemd'),
1446 join_paths(rootsbindir, 'init'))
1448 exe = executable('systemd-analyze',
1449 systemd_analyze_sources,
1450 include_directories : includes,
1451 link_with : [libcore,
1453 dependencies : [threads,
1459 install_rpath : rootlibexecdir,
1461 public_programs += [exe]
1463 executable('systemd-journald',
1464 systemd_journald_sources,
1465 include_directories : includes,
1466 link_with : [libjournal_core,
1468 dependencies : [threads,
1472 install_rpath : rootlibexecdir,
1474 install_dir : rootlibexecdir)
1476 exe = executable('systemd-cat',
1477 systemd_cat_sources,
1478 include_directories : includes,
1479 link_with : [libjournal_core,
1481 dependencies : [threads],
1482 install_rpath : rootlibexecdir,
1484 public_programs += [exe]
1486 exe = executable('journalctl',
1488 include_directories : includes,
1489 link_with : [libshared],
1490 dependencies : [threads,
1495 install_rpath : rootlibexecdir,
1497 install_dir : rootbindir)
1498 public_programs += [exe]
1500 executable('systemd-getty-generator',
1501 'src/getty-generator/getty-generator.c',
1502 include_directories : includes,
1503 link_with : [libshared],
1504 install_rpath : rootlibexecdir,
1506 install_dir : systemgeneratordir)
1508 executable('systemd-debug-generator',
1509 'src/debug-generator/debug-generator.c',
1510 include_directories : includes,
1511 link_with : [libshared],
1512 install_rpath : rootlibexecdir,
1514 install_dir : systemgeneratordir)
1516 executable('systemd-fstab-generator',
1517 'src/fstab-generator/fstab-generator.c',
1518 'src/core/mount-setup.c',
1519 include_directories : includes,
1520 link_with : [libshared],
1521 install_rpath : rootlibexecdir,
1523 install_dir : systemgeneratordir)
1525 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1526 executable('30-systemd-environment-d-generator',
1527 'src/environment-d-generator/environment-d-generator.c',
1528 include_directories : includes,
1529 link_with : [libshared],
1530 install_rpath : rootlibexecdir,
1532 install_dir : userenvgeneratordir)
1534 meson.add_install_script(meson_make_symlink,
1535 join_paths(sysconfdir, 'environment'),
1536 join_paths(environmentdir, '99-environment.conf'))
1539 if conf.get('ENABLE_HIBERNATE') == 1
1540 executable('systemd-hibernate-resume-generator',
1541 'src/hibernate-resume/hibernate-resume-generator.c',
1542 include_directories : includes,
1543 link_with : [libshared],
1544 install_rpath : rootlibexecdir,
1546 install_dir : systemgeneratordir)
1548 executable('systemd-hibernate-resume',
1549 'src/hibernate-resume/hibernate-resume.c',
1550 include_directories : includes,
1551 link_with : [libshared],
1552 install_rpath : rootlibexecdir,
1554 install_dir : rootlibexecdir)
1557 if conf.get('HAVE_BLKID') == 1
1558 executable('systemd-gpt-auto-generator',
1559 'src/gpt-auto-generator/gpt-auto-generator.c',
1560 'src/basic/blkid-util.h',
1561 include_directories : includes,
1562 link_with : [libshared],
1563 dependencies : libblkid,
1564 install_rpath : rootlibexecdir,
1566 install_dir : systemgeneratordir)
1568 exe = executable('systemd-dissect',
1569 'src/dissect/dissect.c',
1570 include_directories : includes,
1571 link_with : [libshared],
1572 install_rpath : rootlibexecdir,
1574 install_dir : rootlibexecdir)
1575 public_programs += [exe]
1578 if conf.get('ENABLE_RESOLVE') == 1
1579 executable('systemd-resolved',
1580 systemd_resolved_sources,
1581 include_directories : includes,
1582 link_with : [libshared,
1584 libsystemd_resolve_core],
1585 dependencies : [threads,
1589 install_rpath : rootlibexecdir,
1591 install_dir : rootlibexecdir)
1593 exe = executable('resolvectl',
1595 include_directories : includes,
1596 link_with : [libshared,
1598 libsystemd_resolve_core],
1599 dependencies : [threads,
1603 install_rpath : rootlibexecdir,
1605 public_programs += [exe]
1607 meson.add_install_script(meson_make_symlink,
1608 join_paths(bindir, 'resolvectl'),
1609 join_paths(rootsbindir, 'resolvconf'))
1611 meson.add_install_script(meson_make_symlink,
1612 join_paths(bindir, 'resolvectl'),
1613 join_paths(bindir, 'systemd-resolve'))
1616 if conf.get('ENABLE_LOGIND') == 1
1617 executable('systemd-logind',
1618 systemd_logind_sources,
1619 include_directories : includes,
1620 link_with : [liblogind_core,
1622 dependencies : [threads,
1624 install_rpath : rootlibexecdir,
1626 install_dir : rootlibexecdir)
1628 exe = executable('loginctl',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 dependencies : [threads,
1635 install_rpath : rootlibexecdir,
1637 install_dir : rootbindir)
1638 public_programs += [exe]
1640 exe = executable('systemd-inhibit',
1641 'src/login/inhibit.c',
1642 include_directories : includes,
1643 link_with : [libshared],
1644 install_rpath : rootlibexecdir,
1646 install_dir : rootbindir)
1647 public_programs += [exe]
1649 if conf.get('HAVE_PAM') == 1
1650 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1651 pam_systemd = shared_library(
1655 include_directories : includes,
1656 link_args : ['-shared',
1657 '-Wl,--version-script=' + version_script_arg],
1658 link_with : [libsystemd_static,
1660 dependencies : [threads,
1663 link_depends : pam_systemd_sym,
1665 install_dir : pamlibdir)
1667 test('dlopen-pam_systemd',
1669 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1673 executable('systemd-user-runtime-dir',
1674 user_runtime_dir_sources,
1675 include_directories : includes,
1676 link_with : [libshared, liblogind_core],
1677 install_rpath : rootlibexecdir,
1679 install_dir : rootlibexecdir)
1681 if conf.get('HAVE_PAM') == 1
1682 executable('systemd-user-sessions',
1683 'src/user-sessions/user-sessions.c',
1684 include_directories : includes,
1685 link_with : [libshared],
1686 install_rpath : rootlibexecdir,
1688 install_dir : rootlibexecdir)
1691 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1692 exe = executable('bootctl',
1693 'src/boot/bootctl.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 dependencies : [libblkid],
1697 install_rpath : rootlibexecdir,
1699 public_programs += [exe]
1702 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1703 include_directories : includes,
1704 link_with : [libshared],
1705 dependencies : [threads],
1706 install_rpath : rootlibexecdir,
1708 public_programs += [exe]
1710 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 dependencies : [threads,
1718 install_rpath : rootlibexecdir,
1720 install_dir : rootbindir)
1721 public_programs += [exe]
1723 if conf.get('ENABLE_PORTABLED') == 1
1724 executable('systemd-portabled',
1725 systemd_portabled_sources,
1726 include_directories : includes,
1727 link_with : [libshared],
1728 dependencies : [threads],
1729 install_rpath : rootlibexecdir,
1731 install_dir : rootlibexecdir)
1733 exe = executable('portablectl', 'src/portable/portablectl.c',
1734 include_directories : includes,
1735 link_with : [libshared],
1736 dependencies : [threads],
1737 install_rpath : rootlibexecdir,
1739 install_dir : rootlibexecdir)
1740 public_programs += [exe]
1743 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1744 meson.add_install_script(meson_make_symlink,
1745 join_paths(rootbindir, 'systemctl'),
1746 join_paths(rootsbindir, alias))
1749 if conf.get('ENABLE_BACKLIGHT') == 1
1750 executable('systemd-backlight',
1751 'src/backlight/backlight.c',
1752 include_directories : includes,
1753 link_with : [libshared],
1754 install_rpath : rootlibexecdir,
1756 install_dir : rootlibexecdir)
1759 if conf.get('ENABLE_RFKILL') == 1
1760 executable('systemd-rfkill',
1761 'src/rfkill/rfkill.c',
1762 include_directories : includes,
1763 link_with : [libshared],
1764 install_rpath : rootlibexecdir,
1766 install_dir : rootlibexecdir)
1769 executable('systemd-system-update-generator',
1770 'src/system-update-generator/system-update-generator.c',
1771 include_directories : includes,
1772 link_with : [libshared],
1773 install_rpath : rootlibexecdir,
1775 install_dir : systemgeneratordir)
1777 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1778 executable('systemd-cryptsetup',
1779 'src/cryptsetup/cryptsetup.c',
1780 include_directories : includes,
1781 link_with : [libshared],
1782 dependencies : [libcryptsetup],
1783 install_rpath : rootlibexecdir,
1785 install_dir : rootlibexecdir)
1787 executable('systemd-cryptsetup-generator',
1788 'src/cryptsetup/cryptsetup-generator.c',
1789 include_directories : includes,
1790 link_with : [libshared],
1791 dependencies : [libcryptsetup],
1792 install_rpath : rootlibexecdir,
1794 install_dir : systemgeneratordir)
1796 executable('systemd-veritysetup',
1797 'src/veritysetup/veritysetup.c',
1798 include_directories : includes,
1799 link_with : [libshared],
1800 dependencies : [libcryptsetup],
1801 install_rpath : rootlibexecdir,
1803 install_dir : rootlibexecdir)
1805 executable('systemd-veritysetup-generator',
1806 'src/veritysetup/veritysetup-generator.c',
1807 include_directories : includes,
1808 link_with : [libshared],
1809 dependencies : [libcryptsetup],
1810 install_rpath : rootlibexecdir,
1812 install_dir : systemgeneratordir)
1815 if conf.get('HAVE_SYSV_COMPAT') == 1
1816 executable('systemd-sysv-generator',
1817 'src/sysv-generator/sysv-generator.c',
1818 include_directories : includes,
1819 link_with : [libshared],
1820 install_rpath : rootlibexecdir,
1822 install_dir : systemgeneratordir)
1824 executable('systemd-rc-local-generator',
1825 'src/rc-local-generator/rc-local-generator.c',
1826 include_directories : includes,
1827 link_with : [libshared],
1828 install_rpath : rootlibexecdir,
1830 install_dir : systemgeneratordir)
1833 if conf.get('ENABLE_HOSTNAMED') == 1
1834 executable('systemd-hostnamed',
1835 'src/hostname/hostnamed.c',
1836 include_directories : includes,
1837 link_with : [libshared],
1838 install_rpath : rootlibexecdir,
1840 install_dir : rootlibexecdir)
1842 exe = executable('hostnamectl',
1843 'src/hostname/hostnamectl.c',
1844 include_directories : includes,
1845 link_with : [libshared],
1846 install_rpath : rootlibexecdir,
1848 public_programs += [exe]
1851 if conf.get('ENABLE_LOCALED') == 1
1852 if conf.get('HAVE_XKBCOMMON') == 1
1853 # logind will load libxkbcommon.so dynamically on its own
1859 executable('systemd-localed',
1860 systemd_localed_sources,
1861 include_directories : includes,
1862 link_with : [libshared],
1863 dependencies : deps,
1864 install_rpath : rootlibexecdir,
1866 install_dir : rootlibexecdir)
1868 exe = executable('localectl',
1870 include_directories : includes,
1871 link_with : [libshared],
1872 install_rpath : rootlibexecdir,
1874 public_programs += [exe]
1877 if conf.get('ENABLE_TIMEDATED') == 1
1878 executable('systemd-timedated',
1879 'src/timedate/timedated.c',
1880 include_directories : includes,
1881 link_with : [libshared],
1882 install_rpath : rootlibexecdir,
1884 install_dir : rootlibexecdir)
1887 if conf.get('ENABLE_TIMEDATECTL') == 1
1888 exe = executable('timedatectl',
1889 'src/timedate/timedatectl.c',
1890 include_directories : includes,
1891 install_rpath : rootlibexecdir,
1892 link_with : [libshared],
1893 dependencies : [libm],
1895 public_programs += [exe]
1898 if conf.get('ENABLE_TIMESYNCD') == 1
1899 executable('systemd-timesyncd',
1900 systemd_timesyncd_sources,
1901 include_directories : includes,
1902 link_with : [libshared],
1903 dependencies : [threads,
1905 install_rpath : rootlibexecdir,
1907 install_dir : rootlibexecdir)
1909 executable('systemd-time-wait-sync',
1910 'src/time-wait-sync/time-wait-sync.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 install_rpath : rootlibexecdir,
1915 install_dir : rootlibexecdir)
1918 if conf.get('ENABLE_MACHINED') == 1
1919 executable('systemd-machined',
1920 systemd_machined_sources,
1921 include_directories : includes,
1922 link_with : [libmachine_core,
1924 install_rpath : rootlibexecdir,
1926 install_dir : rootlibexecdir)
1928 exe = executable('machinectl',
1929 'src/machine/machinectl.c',
1930 include_directories : includes,
1931 link_with : [libshared],
1932 dependencies : [threads,
1935 install_rpath : rootlibexecdir,
1937 install_dir : rootbindir)
1938 public_programs += [exe]
1941 if conf.get('ENABLE_IMPORTD') == 1
1942 executable('systemd-importd',
1943 systemd_importd_sources,
1944 include_directories : includes,
1945 link_with : [libshared],
1946 dependencies : [threads],
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootlibexecdir)
1951 systemd_pull = executable('systemd-pull',
1952 systemd_pull_sources,
1953 include_directories : includes,
1954 link_with : [libshared],
1955 dependencies : [libcurl,
1960 install_rpath : rootlibexecdir,
1962 install_dir : rootlibexecdir)
1964 systemd_import = executable('systemd-import',
1965 systemd_import_sources,
1966 include_directories : includes,
1967 link_with : [libshared],
1968 dependencies : [libcurl,
1972 install_rpath : rootlibexecdir,
1974 install_dir : rootlibexecdir)
1976 systemd_export = executable('systemd-export',
1977 systemd_export_sources,
1978 include_directories : includes,
1979 link_with : [libshared],
1980 dependencies : [libcurl,
1984 install_rpath : rootlibexecdir,
1986 install_dir : rootlibexecdir)
1987 public_programs += [systemd_pull, systemd_import, systemd_export]
1990 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1991 exe = executable('systemd-journal-upload',
1992 systemd_journal_upload_sources,
1993 include_directories : includes,
1994 link_with : [libshared],
1995 dependencies : [threads,
2000 install_rpath : rootlibexecdir,
2002 install_dir : rootlibexecdir)
2003 public_programs += [exe]
2006 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2007 s_j_remote = executable('systemd-journal-remote',
2008 systemd_journal_remote_sources,
2009 include_directories : includes,
2010 link_with : [libshared,
2011 libsystemd_journal_remote],
2012 dependencies : [threads,
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2021 s_j_gatewayd = executable('systemd-journal-gatewayd',
2022 systemd_journal_gatewayd_sources,
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [threads,
2030 install_rpath : rootlibexecdir,
2032 install_dir : rootlibexecdir)
2033 public_programs += [s_j_remote, s_j_gatewayd]
2036 if conf.get('ENABLE_COREDUMP') == 1
2037 executable('systemd-coredump',
2038 systemd_coredump_sources,
2039 include_directories : includes,
2040 link_with : [libshared],
2041 dependencies : [threads,
2046 install_rpath : rootlibexecdir,
2048 install_dir : rootlibexecdir)
2050 exe = executable('coredumpctl',
2051 coredumpctl_sources,
2052 include_directories : includes,
2053 link_with : [libshared],
2054 dependencies : [threads,
2057 install_rpath : rootlibexecdir,
2059 public_programs += [exe]
2062 if conf.get('ENABLE_BINFMT') == 1
2063 exe = executable('systemd-binfmt',
2064 'src/binfmt/binfmt.c',
2065 include_directories : includes,
2066 link_with : [libshared],
2067 install_rpath : rootlibexecdir,
2069 install_dir : rootlibexecdir)
2070 public_programs += [exe]
2072 meson.add_install_script('sh', '-c',
2073 mkdir_p.format(binfmtdir))
2074 meson.add_install_script('sh', '-c',
2075 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2078 if conf.get('ENABLE_VCONSOLE') == 1
2079 executable('systemd-vconsole-setup',
2080 'src/vconsole/vconsole-setup.c',
2081 include_directories : includes,
2082 link_with : [libshared],
2083 install_rpath : rootlibexecdir,
2085 install_dir : rootlibexecdir)
2088 if conf.get('ENABLE_RANDOMSEED') == 1
2089 executable('systemd-random-seed',
2090 'src/random-seed/random-seed.c',
2091 include_directories : includes,
2092 link_with : [libshared],
2093 install_rpath : rootlibexecdir,
2095 install_dir : rootlibexecdir)
2098 if conf.get('ENABLE_FIRSTBOOT') == 1
2099 executable('systemd-firstboot',
2100 'src/firstboot/firstboot.c',
2101 include_directories : includes,
2102 link_with : [libshared],
2103 dependencies : [libcrypt],
2104 install_rpath : rootlibexecdir,
2106 install_dir : rootbindir)
2109 executable('systemd-remount-fs',
2110 'src/remount-fs/remount-fs.c',
2111 'src/core/mount-setup.c',
2112 'src/core/mount-setup.h',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 install_rpath : rootlibexecdir,
2117 install_dir : rootlibexecdir)
2119 executable('systemd-machine-id-setup',
2120 'src/machine-id-setup/machine-id-setup-main.c',
2121 'src/core/machine-id-setup.c',
2122 'src/core/machine-id-setup.h',
2123 include_directories : includes,
2124 link_with : [libshared],
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootbindir)
2129 executable('systemd-fsck',
2131 include_directories : includes,
2132 link_with : [libshared],
2133 install_rpath : rootlibexecdir,
2135 install_dir : rootlibexecdir)
2137 executable('systemd-growfs',
2138 'src/partition/growfs.c',
2139 include_directories : includes,
2140 link_with : [libshared],
2141 dependencies : [libcryptsetup],
2142 install_rpath : rootlibexecdir,
2144 install_dir : rootlibexecdir)
2146 executable('systemd-makefs',
2147 'src/partition/makefs.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2154 executable('systemd-sleep',
2155 'src/sleep/sleep.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2160 install_dir : rootlibexecdir)
2162 exe = executable('systemd-sysctl',
2163 'src/sysctl/sysctl.c',
2164 include_directories : includes,
2165 link_with : [libshared],
2166 install_rpath : rootlibexecdir,
2168 install_dir : rootlibexecdir)
2169 public_programs += [exe]
2171 executable('systemd-ac-power',
2172 'src/ac-power/ac-power.c',
2173 include_directories : includes,
2174 link_with : [libshared],
2175 install_rpath : rootlibexecdir,
2177 install_dir : rootlibexecdir)
2179 exe = executable('systemd-detect-virt',
2180 'src/detect-virt/detect-virt.c',
2181 include_directories : includes,
2182 link_with : [libshared],
2183 install_rpath : rootlibexecdir,
2185 public_programs += [exe]
2187 exe = executable('systemd-delta',
2188 'src/delta/delta.c',
2189 include_directories : includes,
2190 link_with : [libshared],
2191 install_rpath : rootlibexecdir,
2193 public_programs += [exe]
2195 exe = executable('systemd-escape',
2196 'src/escape/escape.c',
2197 include_directories : includes,
2198 link_with : [libshared],
2199 install_rpath : rootlibexecdir,
2201 install_dir : rootbindir)
2202 public_programs += [exe]
2204 exe = executable('systemd-notify',
2205 'src/notify/notify.c',
2206 include_directories : includes,
2207 link_with : [libshared],
2208 install_rpath : rootlibexecdir,
2210 install_dir : rootbindir)
2211 public_programs += [exe]
2213 executable('systemd-volatile-root',
2214 'src/volatile-root/volatile-root.c',
2215 include_directories : includes,
2216 link_with : [libshared],
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootlibexecdir)
2221 executable('systemd-cgroups-agent',
2222 'src/cgroups-agent/cgroups-agent.c',
2223 include_directories : includes,
2224 link_with : [libshared],
2225 install_rpath : rootlibexecdir,
2227 install_dir : rootlibexecdir)
2229 exe = executable('systemd-path',
2231 include_directories : includes,
2232 link_with : [libshared],
2233 install_rpath : rootlibexecdir,
2235 public_programs += [exe]
2237 exe = executable('systemd-ask-password',
2238 'src/ask-password/ask-password.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 install_rpath : rootlibexecdir,
2243 install_dir : rootbindir)
2244 public_programs += [exe]
2246 executable('systemd-reply-password',
2247 'src/reply-password/reply-password.c',
2248 include_directories : includes,
2249 link_with : [libshared],
2250 install_rpath : rootlibexecdir,
2252 install_dir : rootlibexecdir)
2254 exe = executable('systemd-tty-ask-password-agent',
2255 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 install_rpath : rootlibexecdir,
2260 install_dir : rootbindir)
2261 public_programs += [exe]
2263 exe = executable('systemd-cgls',
2265 include_directories : includes,
2266 link_with : [libshared],
2267 install_rpath : rootlibexecdir,
2269 public_programs += [exe]
2271 exe = executable('systemd-cgtop',
2272 'src/cgtop/cgtop.c',
2273 include_directories : includes,
2274 link_with : [libshared],
2275 install_rpath : rootlibexecdir,
2277 public_programs += [exe]
2279 executable('systemd-initctl',
2280 'src/initctl/initctl.c',
2281 include_directories : includes,
2282 link_with : [libshared],
2283 install_rpath : rootlibexecdir,
2285 install_dir : rootlibexecdir)
2287 exe = executable('systemd-mount',
2288 'src/mount/mount-tool.c',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 install_rpath : rootlibexecdir,
2293 public_programs += [exe]
2295 meson.add_install_script(meson_make_symlink,
2296 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2298 exe = executable('systemd-run',
2300 include_directories : includes,
2301 link_with : [libshared],
2302 install_rpath : rootlibexecdir,
2304 public_programs += [exe]
2306 exe = executable('systemd-stdio-bridge',
2307 'src/stdio-bridge/stdio-bridge.c',
2308 include_directories : includes,
2309 link_with : [libshared],
2310 install_rpath : rootlibexecdir,
2312 public_programs += [exe]
2314 exe = executable('busctl',
2315 'src/busctl/busctl.c',
2316 'src/busctl/busctl-introspect.c',
2317 'src/busctl/busctl-introspect.h',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 install_rpath : rootlibexecdir,
2322 public_programs += [exe]
2324 if conf.get('ENABLE_SYSUSERS') == 1
2325 exe = executable('systemd-sysusers',
2326 'src/sysusers/sysusers.c',
2327 include_directories : includes,
2328 link_with : [libshared],
2329 install_rpath : rootlibexecdir,
2331 install_dir : rootbindir)
2332 public_programs += [exe]
2335 if conf.get('ENABLE_TMPFILES') == 1
2336 exe = executable('systemd-tmpfiles',
2337 'src/tmpfiles/tmpfiles.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 dependencies : [libacl],
2341 install_rpath : rootlibexecdir,
2343 install_dir : rootbindir)
2344 public_programs += [exe]
2346 test('test-systemd-tmpfiles',
2347 test_systemd_tmpfiles_py,
2348 args : exe.full_path())
2349 # https://github.com/mesonbuild/meson/issues/2681
2352 if conf.get('ENABLE_HWDB') == 1
2353 exe = executable('systemd-hwdb',
2355 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2356 include_directories : includes,
2357 link_with : [libudev_static],
2358 install_rpath : udev_rpath,
2360 install_dir : rootbindir)
2361 public_programs += [exe]
2364 if conf.get('ENABLE_QUOTACHECK') == 1
2365 executable('systemd-quotacheck',
2366 'src/quotacheck/quotacheck.c',
2367 include_directories : includes,
2368 link_with : [libshared],
2369 install_rpath : rootlibexecdir,
2371 install_dir : rootlibexecdir)
2374 exe = executable('systemd-socket-proxyd',
2375 'src/socket-proxy/socket-proxyd.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 dependencies : [threads],
2379 install_rpath : rootlibexecdir,
2381 install_dir : rootlibexecdir)
2382 public_programs += [exe]
2384 exe = executable('systemd-udevd',
2385 systemd_udevd_sources,
2386 include_directories : includes,
2387 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2388 link_with : [libudev_core,
2391 dependencies : [threads,
2396 install_rpath : udev_rpath,
2398 install_dir : rootlibexecdir)
2399 public_programs += [exe]
2401 exe = executable('udevadm',
2403 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2404 include_directories : includes,
2405 link_with : [libudev_core,
2408 dependencies : [threads,
2413 install_rpath : udev_rpath,
2415 install_dir : rootbindir)
2416 public_programs += [exe]
2418 executable('systemd-shutdown',
2419 systemd_shutdown_sources,
2420 include_directories : includes,
2421 link_with : [libshared],
2422 dependencies : [libmount],
2423 install_rpath : rootlibexecdir,
2425 install_dir : rootlibexecdir)
2427 executable('systemd-update-done',
2428 'src/update-done/update-done.c',
2429 include_directories : includes,
2430 link_with : [libshared],
2431 install_rpath : rootlibexecdir,
2433 install_dir : rootlibexecdir)
2435 executable('systemd-update-utmp',
2436 'src/update-utmp/update-utmp.c',
2437 include_directories : includes,
2438 link_with : [libshared],
2439 dependencies : [libaudit],
2440 install_rpath : rootlibexecdir,
2442 install_dir : rootlibexecdir)
2444 if conf.get('HAVE_KMOD') == 1
2445 executable('systemd-modules-load',
2446 'src/modules-load/modules-load.c',
2447 include_directories : includes,
2448 link_with : [libshared],
2449 dependencies : [libkmod],
2450 install_rpath : rootlibexecdir,
2452 install_dir : rootlibexecdir)
2454 meson.add_install_script('sh', '-c',
2455 mkdir_p.format(modulesloaddir))
2456 meson.add_install_script('sh', '-c',
2457 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2460 exe = executable('systemd-nspawn',
2461 systemd_nspawn_sources,
2462 'src/core/mount-setup.c', # FIXME: use a variable?
2463 'src/core/mount-setup.h',
2464 'src/core/loopback-setup.c',
2465 'src/core/loopback-setup.h',
2466 include_directories : includes,
2467 link_with : [libnspawn_core,
2469 dependencies : [libblkid],
2470 install_rpath : rootlibexecdir,
2472 public_programs += [exe]
2474 if conf.get('ENABLE_NETWORKD') == 1
2475 executable('systemd-networkd',
2476 systemd_networkd_sources,
2477 include_directories : includes,
2478 link_with : [libnetworkd_core,
2482 dependencies : [threads],
2483 install_rpath : rootlibexecdir,
2485 install_dir : rootlibexecdir)
2487 executable('systemd-networkd-wait-online',
2488 systemd_networkd_wait_online_sources,
2489 include_directories : includes,
2490 link_with : [libnetworkd_core,
2492 install_rpath : rootlibexecdir,
2494 install_dir : rootlibexecdir)
2496 exe = executable('networkctl',
2498 include_directories : includes,
2499 link_with : [libsystemd_network,
2501 install_rpath : rootlibexecdir,
2503 install_dir : rootbindir)
2504 public_programs += [exe]
2507 executable('systemd-sulogin-shell',
2508 ['src/sulogin-shell/sulogin-shell.c'],
2509 include_directories : includes,
2510 link_with : [libshared],
2511 install_rpath : rootlibexecdir,
2513 install_dir : rootlibexecdir)
2515 ############################################################
2517 foreach tuple : tests
2519 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2520 dependencies = tuple[2]
2521 condition = tuple.length() >= 4 ? tuple[3] : ''
2522 type = tuple.length() >= 5 ? tuple[4] : ''
2523 defs = tuple.length() >= 6 ? tuple[5] : []
2524 incs = tuple.length() >= 7 ? tuple[6] : includes
2527 name = sources[0].split('/')[-1].split('.')[0]
2528 if type.startswith('timeout=')
2529 timeout = type.split('=')[1].to_int()
2532 if want_tests == 'false'
2533 message('Not compiling @0@ because tests is set to false'.format(name))
2534 elif condition == '' or conf.get(condition) == 1
2538 include_directories : incs,
2539 link_with : link_with,
2540 dependencies : dependencies,
2542 install_rpath : rootlibexecdir,
2543 install : install_tests,
2544 install_dir : join_paths(testsdir, type))
2547 message('@0@ is a manual test'.format(name))
2548 elif type == 'unsafe' and want_tests != 'unsafe'
2549 message('@0@ is an unsafe test'.format(name))
2556 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2561 'test-libsystemd-sym',
2562 test_libsystemd_sym_c,
2563 include_directories : includes,
2564 link_with : [libsystemd],
2565 install : install_tests,
2566 install_dir : testsdir)
2567 test('test-libsystemd-sym', exe)
2570 'test-libsystemd-static-sym',
2571 test_libsystemd_sym_c,
2572 include_directories : includes,
2573 link_with : [install_libsystemd_static],
2574 dependencies : [threads], # threads is already included in dependencies on the library,
2575 # but does not seem to get propagated. Add here as a work-around.
2576 build_by_default : static_libsystemd_pic,
2577 install : install_tests and static_libsystemd_pic,
2578 install_dir : testsdir)
2579 if static_libsystemd_pic
2580 test('test-libsystemd-static-sym', exe)
2586 include_directories : includes,
2587 c_args : ['-Wno-deprecated-declarations'],
2588 link_with : [libudev],
2589 install : install_tests,
2590 install_dir : testsdir)
2591 test('test-libudev-sym', exe)
2594 'test-libudev-static-sym',
2596 include_directories : includes,
2597 c_args : ['-Wno-deprecated-declarations'],
2598 link_with : [install_libudev_static],
2599 build_by_default : static_libudev_pic,
2600 install : install_tests and static_libudev_pic,
2601 install_dir : testsdir)
2602 if static_libudev_pic
2603 test('test-libudev-static-sym', exe)
2606 ############################################################
2610 foreach tuple : fuzzers
2612 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2613 dependencies = tuple[2]
2614 defs = tuple.length() >= 4 ? tuple[3] : []
2615 incs = tuple.length() >= 5 ? tuple[4] : includes
2618 dependencies += fuzzing_engine
2620 sources += 'src/fuzz/fuzz-main.c'
2623 name = sources[0].split('/')[-1].split('.')[0]
2625 fuzzer_exes += executable(
2628 include_directories : [incs, include_directories('src/fuzz')],
2629 link_with : link_with,
2630 dependencies : dependencies,
2635 run_target('fuzzers',
2636 depends : fuzzer_exes,
2639 ############################################################
2641 make_directive_index_py = find_program('tools/make-directive-index.py')
2642 make_man_index_py = find_program('tools/make-man-index.py')
2643 xml_helper_py = find_program('tools/xml_helper.py')
2644 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2648 subdir('sysusers.d')
2649 subdir('tmpfiles.d')
2654 subdir('shell-completion/bash')
2655 subdir('shell-completion/zsh')
2656 subdir('doc/sysvinit')
2657 subdir('doc/var-log')
2659 # FIXME: figure out if the warning is true:
2660 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2661 install_subdir('factory/etc',
2662 install_dir : factorydir)
2665 install_data('xorg/50-systemd-user.sh',
2666 install_dir : xinitrcdir)
2667 install_data('modprobe.d/systemd.conf',
2668 install_dir : modprobedir)
2669 install_data('LICENSE.GPL2',
2674 'doc/DISTRO_PORTING',
2675 'doc/ENVIRONMENT.md',
2677 'doc/TRANSIENT-SETTINGS.md',
2680 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2681 install_dir : docdir)
2683 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2684 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2686 ############################################################
2688 meson_check_help = find_program('tools/meson-check-help.sh')
2690 foreach exec : public_programs
2691 name = exec.full_path().split('/')[-1]
2692 test('check-help-' + name,
2694 args : [exec.full_path()])
2697 ############################################################
2699 # Enable tests for all supported sanitizers
2700 foreach tuple : sanitizers
2701 sanitizer = tuple[0]
2704 have = run_command(check_compilation_sh,
2705 cc.cmd_array(), '-x', 'c',
2706 '-fsanitize=@0@'.format(sanitizer),
2707 '-include', link_test_c).returncode() == 0
2708 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2712 foreach p : fuzz_regression_tests
2713 b = p.split('/')[-2]
2714 c = p.split('/')[-1]
2716 name = '@0@:@1@'.format(b, sanitizer)
2719 if want_tests == 'false'
2720 message('Not compiling @0@ because tests is set to false'.format(name))
2722 exe = custom_target(
2726 command : [env, 'ln', '-fs',
2727 join_paths(build.full_path(), b),
2729 build_by_default : true)
2731 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2736 if want_tests != 'false' and slow_tests
2737 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2739 args : [exe.full_path(),
2740 join_paths(meson.source_root(),
2741 'test/fuzz-regressions',
2749 ############################################################
2752 all_files = run_command(
2754 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2757 all_files = files(all_files.stdout().split())
2762 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2765 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2769 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2772 command : [meson_git_contrib_sh])
2776 git_head = run_command(
2778 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2779 'rev-parse', 'HEAD']).stdout().strip()
2780 git_head_short = run_command(
2782 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2783 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2787 command : ['git', 'archive',
2788 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2790 '--prefix', 'systemd-@0@/'.format(git_head),
2794 ############################################################
2796 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2799 depends : [man, libsystemd, libudev],
2800 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2802 ############################################################
2805 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2807 'split /usr: @0@'.format(split_usr),
2808 'split bin-sbin: @0@'.format(split_bin),
2809 'prefix directory: @0@'.format(prefixdir),
2810 'rootprefix directory: @0@'.format(rootprefixdir),
2811 'sysconf directory: @0@'.format(sysconfdir),
2812 'include directory: @0@'.format(includedir),
2813 'lib directory: @0@'.format(libdir),
2814 'rootlib directory: @0@'.format(rootlibdir),
2815 'SysV init scripts: @0@'.format(sysvinit_path),
2816 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2817 'PAM modules directory: @0@'.format(pamlibdir),
2818 'PAM configuration directory: @0@'.format(pamconfdir),
2819 'RPM macros directory: @0@'.format(rpmmacrosdir),
2820 'modprobe.d directory: @0@'.format(modprobedir),
2821 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2822 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2823 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2824 'bash completions directory: @0@'.format(bashcompletiondir),
2825 'zsh completions directory: @0@'.format(zshcompletiondir),
2826 'extra start script: @0@'.format(get_option('rc-local')),
2827 'extra stop script: @0@'.format(get_option('halt-local')),
2828 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2829 get_option('debug-tty')),
2830 'TTY GID: @0@'.format(tty_gid),
2831 'users GID: @0@'.format(users_gid),
2832 'maximum system UID: @0@'.format(system_uid_max),
2833 'maximum system GID: @0@'.format(system_gid_max),
2834 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2835 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2836 'minimum container UID base: @0@'.format(container_uid_base_min),
2837 'maximum container UID base: @0@'.format(container_uid_base_max),
2838 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2839 'render group access mode: @0@'.format(get_option('group-render-mode')),
2840 'certificate root directory: @0@'.format(get_option('certificate-root')),
2841 'support URL: @0@'.format(support_url),
2842 'nobody user name: @0@'.format(nobody_user),
2843 'nobody group name: @0@'.format(nobody_group),
2844 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2845 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2847 'default DNSSEC mode: @0@'.format(default_dnssec),
2848 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2849 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2851 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2852 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2854 'default DNS servers: @0@'.format(alt_dns_servers),
2855 'default NTP servers: @0@'.format(alt_ntp_servers)]
2857 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2858 '@@0@'.format(time_epoch)).stdout().strip()
2860 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2863 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2864 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2865 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2867 if conf.get('ENABLE_EFI') == 1
2869 'efi arch: @0@'.format(efi_arch)]
2873 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2874 'EFI CC @0@'.format(efi_cc),
2875 'EFI lib directory: @0@'.format(efi_libdir),
2876 'EFI lds directory: @0@'.format(efi_ldsdir),
2877 'EFI include directory: @0@'.format(efi_incdir)]
2931 ['legacy pkla', install_polkit_pkla],
2933 ['gnu-efi', have_gnu_efi],
2940 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2943 ['man pages', want_man],
2944 ['html pages', want_html],
2945 ['man page indices', want_man and have_lxml],
2950 ['adm group', get_option('adm-group')],
2951 ['wheel group', get_option('wheel-group')],
2954 ['debug mmap cache'],
2955 ['valgrind', conf.get('VALGRIND') == 1],
2958 if tuple.length() >= 2
2961 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2962 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2963 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2968 missing += [tuple[0]]
2974 'enabled features: @0@'.format(', '.join(found)),
2976 'disabled features: @0@'.format(', '.join(missing)),
2978 message('\n '.join(status))
2980 if rootprefixdir != rootprefix_default
2982 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2983 'systemd used fixed names for unit file directories and other paths, so anything\n' +
2984 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))