1 # SPDX-License-Identifier: LGPL-2.1+
3 # Copyright 2017 Zbigniew Jędrzejewski-Szmek
5 # systemd is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU Lesser General Public License as published by
7 # the Free Software Foundation; either version 2.1 of the License, or
8 # (at your option) any later version.
10 # systemd is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public License
16 # along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 project('systemd', 'c',
27 meson_version : '>= 0.41',
30 libsystemd_version = '0.22.0'
31 libudev_version = '1.6.10'
33 # We need the same data in three different formats, ugh!
34 # Also, for hysterical reasons, we use different variable
35 # names, sometimes. Not all variables are included in every
37 conf = configuration_data()
38 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
39 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
41 substs = configuration_data()
42 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
43 substs.set('PACKAGE_VERSION', meson.project_version())
47 #####################################################################
49 # Try to install the git pre-commit hook
50 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
51 if git_hook.returncode() == 0
52 message(git_hook.stdout().strip())
55 #####################################################################
57 if get_option('split-usr') == 'auto'
58 split_usr = run_command('test', '-L', '/bin').returncode() != 0
60 split_usr = get_option('split-usr') == 'true'
62 conf.set10('HAVE_SPLIT_USR', split_usr,
63 description : '/usr/bin and /bin directories are separate')
65 if get_option('split-bin') == 'auto'
66 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
68 split_bin = get_option('split-bin') == 'true'
70 conf.set10('HAVE_SPLIT_BIN', split_bin,
71 description : 'bin and sbin directories are separate')
73 rootprefixdir = get_option('rootprefix')
74 # Unusual rootprefixdir values are used by some distros
75 # (see https://github.com/systemd/systemd/pull/7461).
76 rootprefix_default = split_usr ? '/' : '/usr'
77 if rootprefixdir == ''
78 rootprefixdir = rootprefix_default
81 sysvinit_path = get_option('sysvinit-path')
82 sysvrcnd_path = get_option('sysvrcnd-path')
83 have = sysvinit_path != '' and sysvrcnd_path != ''
84 conf.set10('HAVE_SYSV_COMPAT', have,
85 description : 'SysV init scripts and rcN.d links are supported')
86 m4_defines += have ? ['-DHAVE_SYSV_COMPAT'] : []
88 # join_paths ignore the preceding arguments if an absolute component is
89 # encountered, so this should canonicalize various paths when they are
90 # absolute or relative.
91 prefixdir = get_option('prefix')
92 if not prefixdir.startswith('/')
93 error('Prefix is not absolute: "@0@"'.format(prefixdir))
95 bindir = join_paths(prefixdir, get_option('bindir'))
96 libdir = join_paths(prefixdir, get_option('libdir'))
97 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
98 includedir = join_paths(prefixdir, get_option('includedir'))
99 datadir = join_paths(prefixdir, get_option('datadir'))
100 localstatedir = join_paths('/', get_option('localstatedir'))
102 rootbindir = join_paths(rootprefixdir, 'bin')
103 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
104 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
106 rootlibdir = get_option('rootlibdir')
108 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
111 # Dirs of external packages
112 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
113 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
114 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
115 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
116 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
117 varlogdir = join_paths(localstatedir, 'log')
118 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
119 rpmmacrosdir = get_option('rpmmacrosdir')
120 if rpmmacrosdir != 'no'
121 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
123 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
126 pkgdatadir = join_paths(datadir, 'systemd')
127 environmentdir = join_paths(prefixdir, 'lib/environment.d')
128 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
129 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
130 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
131 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
132 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
133 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
134 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
135 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
136 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
137 pkgincludedir = join_paths(includedir, 'systemd')
138 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
139 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
140 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
141 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
142 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
143 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
144 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
145 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
146 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
147 udevhomedir = udevlibexecdir
148 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
149 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
150 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
151 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
152 factorydir = join_paths(datadir, 'factory')
153 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
154 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
155 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
156 catalogstatedir = join_paths(systemdstatedir, 'catalog')
157 randomseeddir = join_paths(localstatedir, 'lib/systemd')
159 docdir = get_option('docdir')
161 docdir = join_paths(datadir, 'doc/systemd')
164 dbuspolicydir = get_option('dbuspolicydir')
165 if dbuspolicydir == ''
166 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
169 dbussessionservicedir = get_option('dbussessionservicedir')
170 if dbussessionservicedir == ''
171 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
174 dbussystemservicedir = get_option('dbussystemservicedir')
175 if dbussystemservicedir == ''
176 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
179 pamlibdir = get_option('pamlibdir')
181 pamlibdir = join_paths(rootlibdir, 'security')
184 pamconfdir = get_option('pamconfdir')
186 pamconfdir = join_paths(sysconfdir, 'pam.d')
189 memory_accounting_default = get_option('memory-accounting-default')
191 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
192 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
193 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
194 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
195 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
196 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
197 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
199 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
201 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
202 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
203 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
204 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
205 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
206 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
207 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
208 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
209 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
210 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
211 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
212 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
213 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
214 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
215 conf.set_quoted('ROOTPREFIX', rootprefixdir)
216 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
217 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
218 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
219 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
220 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
221 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
222 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
223 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
224 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
225 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
226 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
227 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
228 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
229 conf.set_quoted('LIBDIR', libdir)
230 conf.set_quoted('ROOTLIBDIR', rootlibdir)
231 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
232 conf.set_quoted('BOOTLIBDIR', bootlibdir)
233 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
234 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
235 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
236 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
237 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
238 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
239 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
240 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
242 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
243 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
245 substs.set('prefix', prefixdir)
246 substs.set('exec_prefix', prefixdir)
247 substs.set('libdir', libdir)
248 substs.set('rootlibdir', rootlibdir)
249 substs.set('includedir', includedir)
250 substs.set('pkgsysconfdir', pkgsysconfdir)
251 substs.set('bindir', bindir)
252 substs.set('rootbindir', rootbindir)
253 substs.set('rootlibexecdir', rootlibexecdir)
254 substs.set('systemunitdir', systemunitdir)
255 substs.set('userunitdir', userunitdir)
256 substs.set('systempresetdir', systempresetdir)
257 substs.set('userpresetdir', userpresetdir)
258 substs.set('udevhwdbdir', udevhwdbdir)
259 substs.set('udevrulesdir', udevrulesdir)
260 substs.set('udevlibexecdir', udevlibexecdir)
261 substs.set('catalogdir', catalogdir)
262 substs.set('tmpfilesdir', tmpfilesdir)
263 substs.set('sysusersdir', sysusersdir)
264 substs.set('sysctldir', sysctldir)
265 substs.set('binfmtdir', binfmtdir)
266 substs.set('modulesloaddir', modulesloaddir)
267 substs.set('systemgeneratordir', systemgeneratordir)
268 substs.set('usergeneratordir', usergeneratordir)
269 substs.set('systemenvgeneratordir', systemenvgeneratordir)
270 substs.set('userenvgeneratordir', userenvgeneratordir)
271 substs.set('systemshutdowndir', systemshutdowndir)
272 substs.set('systemsleepdir', systemsleepdir)
273 substs.set('VARLOGDIR', varlogdir)
274 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
275 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
276 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
277 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
278 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
279 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
280 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
281 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
283 #####################################################################
285 cc = meson.get_compiler('c')
286 pkgconfig = import('pkgconfig')
287 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
288 meson_build_sh = find_program('tools/meson-build.sh')
290 if get_option('tests') != 'false'
291 cxx = find_program('c++', required : false)
293 # Used only for tests
298 want_ossfuzz = get_option('oss-fuzz')
299 want_libfuzzer = get_option('llvm-fuzz')
300 fuzzer_build = want_ossfuzz or want_libfuzzer
301 if want_ossfuzz and want_libfuzzer
302 error('only one of oss-fuzz and llvm-fuzz can be specified')
305 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
308 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
311 foreach arg : ['-Wextra',
314 '-Wmissing-include-dirs',
315 '-Wold-style-definition',
318 '-Wdeclaration-after-statement',
320 '-Wsuggest-attribute=noreturn',
321 '-Werror=missing-prototypes',
322 '-Werror=implicit-function-declaration',
323 '-Werror=missing-declarations',
324 '-Werror=return-type',
325 '-Werror=incompatible-pointer-types',
327 '-Wstrict-prototypes',
329 '-Wmissing-noreturn',
330 '-Wimplicit-fallthrough=5',
333 '-Wstrict-aliasing=2',
340 '-fdiagnostics-show-option',
341 '-fno-strict-aliasing',
342 '-fvisibility=hidden',
344 '-fstack-protector-strong',
345 '--param=ssp-buffer-size=4',
347 if cc.has_argument(arg)
348 add_project_arguments(arg, language : 'c')
352 # the oss-fuzz fuzzers are not built with -fPIE, so don't
353 # enable it when we are linking against them
355 if cc.has_argument('-fPIE')
356 add_project_arguments('-fPIE', language : 'c')
360 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
361 # arguments, just emits a warnings. So test for the "positive" version instead.
362 foreach arg : ['unused-parameter',
363 'missing-field-initializers',
366 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
368 if cc.has_argument('-W' + arg)
369 add_project_arguments('-Wno-' + arg, language : 'c')
375 #include <inttypes.h>
376 typedef uint64_t usec_t;
377 usec_t now(clockid_t clock);
382 ''', name : '-Werror=shadow with local shadowing')
383 add_project_arguments('-Werror=shadow', language : 'c')
386 if cc.get_id() == 'clang'
387 foreach arg : ['-Wno-typedef-redefinition',
388 '-Wno-gnu-variable-sized-type-not-at-end',
390 if cc.has_argument(arg,
391 name : '@0@ is supported'.format(arg))
392 add_project_arguments(arg, language : 'c')
397 link_test_c = files('tools/meson-link-test.c')
399 # --as-needed and --no-undefined are provided by meson by default,
400 # run mesonconf to see what is enabled
401 foreach arg : ['-Wl,-z,relro',
406 have = run_command(check_compilation_sh,
407 cc.cmd_array(), '-x', 'c', arg,
408 '-include', link_test_c).returncode() == 0
409 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
410 if have and (arg != '-pie' or not fuzzer_build)
411 add_project_link_arguments(arg, language : 'c')
415 if get_option('buildtype') != 'debug'
416 foreach arg : ['-ffunction-sections',
418 if cc.has_argument(arg,
419 name : '@0@ is supported'.format(arg))
420 add_project_arguments(arg, language : 'c')
424 foreach arg : ['-Wl,--gc-sections']
425 have = run_command(check_compilation_sh,
426 cc.cmd_array(), '-x', 'c', arg,
427 '-include', link_test_c).returncode() == 0
428 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
430 add_project_link_arguments(arg, language : 'c')
435 cpp = ' '.join(cc.cmd_array()) + ' -E'
437 #####################################################################
438 # compilation result tests
440 conf.set('_GNU_SOURCE', true)
441 conf.set('__SANE_USERSPACE_TYPES__', true)
443 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
444 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
445 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
446 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
447 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
448 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
449 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
453 #include <linux/ethtool.h>
454 #include <linux/fib_rules.h>
455 #include <linux/stat.h>
456 #include <sys/stat.h>
458 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
460 foreach decl : ['char16_t',
463 'struct ethtool_link_settings',
464 'struct fib_rule_uid_range',
468 # We get -1 if the size cannot be determined
469 have = cc.sizeof(decl, prefix : decl_headers) > 0
470 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
473 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
474 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
475 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
476 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
477 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
478 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
479 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
480 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
481 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
482 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
483 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
484 # if_tunnel.h is buggy and cannot be included on its own
485 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
486 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
487 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
488 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
489 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
490 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
491 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
492 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
493 ['NDA_IFINDEX', 'linux/neighbour.h'],
494 ['IFA_FLAGS', 'linux/if_addr.h'],
495 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
496 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
497 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
499 prefix = decl.length() > 2 ? decl[2] : ''
500 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
501 conf.set10('HAVE_' + decl[0], have)
504 foreach ident : ['secure_getenv', '__secure_getenv']
505 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
509 ['memfd_create', '''#include <sys/mman.h>'''],
510 ['gettid', '''#include <sys/types.h>
511 #include <unistd.h>'''],
512 ['pivot_root', '''#include <stdlib.h>
513 #include <unistd.h>'''], # no known header declares pivot_root
514 ['name_to_handle_at', '''#include <sys/types.h>
515 #include <sys/stat.h>
516 #include <fcntl.h>'''],
517 ['setns', '''#include <sched.h>'''],
518 ['renameat2', '''#include <stdio.h>
519 #include <fcntl.h>'''],
520 ['kcmp', '''#include <linux/kcmp.h>'''],
521 ['keyctl', '''#include <sys/types.h>
522 #include <keyutils.h>'''],
523 ['copy_file_range', '''#include <sys/syscall.h>
524 #include <unistd.h>'''],
525 ['bpf', '''#include <sys/syscall.h>
526 #include <unistd.h>'''],
527 ['statx', '''#include <sys/types.h>
528 #include <sys/stat.h>
529 #include <unistd.h>'''],
530 ['explicit_bzero' , '''#include <string.h>'''],
531 ['reallocarray', '''#include <malloc.h>'''],
534 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
535 conf.set10('HAVE_' + ident[0].to_upper(), have)
538 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
539 conf.set10('USE_SYS_RANDOM_H', true)
540 conf.set10('HAVE_GETRANDOM', true)
542 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
543 conf.set10('USE_SYS_RANDOM_H', false)
544 conf.set10('HAVE_GETRANDOM', have)
547 #####################################################################
549 sed = find_program('sed')
550 awk = find_program('awk')
551 m4 = find_program('m4')
552 stat = find_program('stat')
553 git = find_program('git', required : false)
554 env = find_program('env')
556 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
557 mkdir_p = 'mkdir -p $DESTDIR/@0@'
558 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
559 splash_bmp = files('test/splash.bmp')
561 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
562 # /usr/sbin, /sbin, and fall back to the default from middle column.
563 progs = [['quotaon', '/usr/sbin/quotaon' ],
564 ['quotacheck', '/usr/sbin/quotacheck' ],
565 ['kill', '/usr/bin/kill' ],
566 ['kmod', '/usr/bin/kmod' ],
567 ['kexec', '/usr/sbin/kexec' ],
568 ['sulogin', '/usr/sbin/sulogin' ],
569 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
570 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
571 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
572 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
575 path = get_option(prog[0] + '-path')
577 message('Using @1@ for @0@'.format(prog[0], path))
579 exe = find_program(prog[0],
580 '/usr/sbin/' + prog[0],
583 path = exe.found() ? exe.path() : prog[1]
585 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
586 conf.set_quoted(name, path)
587 substs.set(name, path)
590 conf.set_quoted('TELINIT', get_option('telinit-path'))
592 if run_command('ln', '--relative', '--help').returncode() != 0
593 error('ln does not support --relative (added in coreutils 8.16)')
596 ############################################################
598 gperf = find_program('gperf')
600 gperf_test_format = '''
602 const char * in_word_set(const char *, @0@);
605 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
606 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
607 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
608 if cc.compiles(gperf_test)
609 gperf_len_type = 'size_t'
611 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
612 if cc.compiles(gperf_test)
613 gperf_len_type = 'unsigned'
615 error('unable to determine gperf len type')
618 message('gperf len type is @0@'.format(gperf_len_type))
619 conf.set('GPERF_LEN_TYPE', gperf_len_type,
620 description : 'The type of gperf "len" parameter')
622 ############################################################
624 if not cc.has_header('sys/capability.h')
625 error('POSIX caps headers not found')
627 foreach header : ['crypt.h',
630 'linux/vm_sockets.h',
632 'valgrind/memcheck.h',
633 'valgrind/valgrind.h',
636 conf.set10('HAVE_' + header.underscorify().to_upper(),
637 cc.has_header(header))
640 ############################################################
642 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
643 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
644 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
646 default_hierarchy = get_option('default-hierarchy')
647 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
648 description : 'default cgroup hierarchy as string')
649 if default_hierarchy == 'legacy'
650 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
651 elif default_hierarchy == 'hybrid'
652 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
654 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
657 time_epoch = get_option('time-epoch')
660 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
662 time_epoch = time_epoch.to_int()
663 conf.set('TIME_EPOCH', time_epoch)
665 system_uid_max = get_option('system-uid-max')
666 if system_uid_max == ''
667 system_uid_max = run_command(
669 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
670 '/etc/login.defs').stdout().strip()
671 if system_uid_max == ''
672 system_uid_max = '999'
675 system_uid_max = system_uid_max.to_int()
676 conf.set('SYSTEM_UID_MAX', system_uid_max)
677 substs.set('systemuidmax', system_uid_max)
678 message('maximum system UID is @0@'.format(system_uid_max))
680 system_gid_max = get_option('system-gid-max')
681 if system_gid_max == ''
682 system_gid_max = run_command(
684 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
685 '/etc/login.defs').stdout().strip()
686 if system_gid_max == ''
687 system_gid_max = '999'
690 system_gid_max = system_gid_max.to_int()
691 conf.set('SYSTEM_GID_MAX', system_gid_max)
692 substs.set('systemgidmax', system_gid_max)
693 message('maximum system GID is @0@'.format(system_gid_max))
695 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
696 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
697 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
698 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
699 substs.set('dynamicuidmin', dynamic_uid_min)
700 substs.set('dynamicuidmax', dynamic_uid_max)
702 container_uid_base_min = get_option('container-uid-base-min').to_int()
703 container_uid_base_max = get_option('container-uid-base-max').to_int()
704 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
705 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
706 substs.set('containeruidbasemin', container_uid_base_min)
707 substs.set('containeruidbasemax', container_uid_base_max)
709 nobody_user = get_option('nobody-user')
710 nobody_group = get_option('nobody-group')
712 getent_result = run_command('getent', 'passwd', '65534')
713 if getent_result.returncode() == 0
714 name = getent_result.stdout().split(':')[0]
715 if name != nobody_user
716 message('WARNING:\n' +
717 ' 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) +
718 ' Your build will result in an user table setup that is incompatible with the local system.')
721 id_result = run_command('id', '-u', nobody_user)
722 if id_result.returncode() == 0
723 id = id_result.stdout().to_int()
725 message('WARNING:\n' +
726 ' 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) +
727 ' Your build will result in an user table setup that is incompatible with the local system.')
731 getent_result = run_command('getent', 'group', '65534')
732 if getent_result.returncode() == 0
733 name = getent_result.stdout().split(':')[0]
734 if name != nobody_group
735 message('WARNING:\n' +
736 ' 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) +
737 ' Your build will result in an group table setup that is incompatible with the local system.')
740 id_result = run_command('id', '-g', nobody_group)
741 if id_result.returncode() == 0
742 id = id_result.stdout().to_int()
744 message('WARNING:\n' +
745 ' 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) +
746 ' Your build will result in an group table setup that is incompatible with the local system.')
749 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
750 message('WARNING:\n' +
751 ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
752 ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
755 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
756 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
757 substs.set('NOBODY_USER_NAME', nobody_user)
758 substs.set('NOBODY_GROUP_NAME', nobody_group)
760 tty_gid = get_option('tty-gid')
761 conf.set('TTY_GID', tty_gid)
762 substs.set('TTY_GID', tty_gid)
764 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
765 if get_option('users-gid') != ''
766 users_gid = get_option('users-gid').to_int()
770 substs.set('USERS_GID', users_gid)
772 if get_option('adm-group')
773 m4_defines += ['-DENABLE_ADM_GROUP']
776 if get_option('wheel-group')
777 m4_defines += ['-DENABLE_WHEEL_GROUP']
780 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
781 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
783 kill_user_processes = get_option('default-kill-user-processes')
784 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
785 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
786 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
788 dns_servers = get_option('dns-servers')
789 conf.set_quoted('DNS_SERVERS', dns_servers)
790 substs.set('DNS_SERVERS', dns_servers)
792 ntp_servers = get_option('ntp-servers')
793 conf.set_quoted('NTP_SERVERS', ntp_servers)
794 substs.set('NTP_SERVERS', ntp_servers)
796 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
798 substs.set('SUSHELL', get_option('debug-shell'))
799 substs.set('DEBUGTTY', get_option('debug-tty'))
801 debug = get_option('debug')
802 enable_debug_hashmap = false
803 enable_debug_mmap_cache = false
805 foreach name : debug.split(',')
807 enable_debug_hashmap = true
808 elif name == 'mmap-cache'
809 enable_debug_mmap_cache = true
811 message('unknown debug option "@0@", ignoring'.format(name))
815 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
816 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
818 #####################################################################
820 threads = dependency('threads')
821 librt = cc.find_library('rt')
822 libm = cc.find_library('m')
823 libdl = cc.find_library('dl')
824 libcrypt = cc.find_library('crypt')
826 libcap = dependency('libcap', required : false)
827 if not libcap.found()
828 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
829 libcap = cc.find_library('cap')
832 libmount = dependency('mount',
833 version : fuzzer_build ? '>= 0' : '>= 2.30')
835 want_seccomp = get_option('seccomp')
836 if want_seccomp != 'false' and not fuzzer_build
837 libseccomp = dependency('libseccomp',
838 version : '>= 2.3.1',
839 required : want_seccomp == 'true')
840 have = libseccomp.found()
845 conf.set10('HAVE_SECCOMP', have)
846 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
848 want_selinux = get_option('selinux')
849 if want_selinux != 'false' and not fuzzer_build
850 libselinux = dependency('libselinux',
851 version : '>= 2.1.9',
852 required : want_selinux == 'true')
853 have = libselinux.found()
858 conf.set10('HAVE_SELINUX', have)
859 m4_defines += have ? ['-DHAVE_SELINUX'] : []
861 want_apparmor = get_option('apparmor')
862 if want_apparmor != 'false' and not fuzzer_build
863 libapparmor = dependency('libapparmor',
864 required : want_apparmor == 'true')
865 have = libapparmor.found()
870 conf.set10('HAVE_APPARMOR', have)
871 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
873 smack_run_label = get_option('smack-run-label')
874 if smack_run_label != ''
875 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
876 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
879 want_polkit = get_option('polkit')
880 install_polkit = false
881 install_polkit_pkla = false
882 if want_polkit != 'false' and not fuzzer_build
883 install_polkit = true
885 libpolkit = dependency('polkit-gobject-1',
887 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
888 message('Old polkit detected, will install pkla files')
889 install_polkit_pkla = true
892 conf.set10('ENABLE_POLKIT', install_polkit)
894 want_acl = get_option('acl')
895 if want_acl != 'false' and not fuzzer_build
896 libacl = cc.find_library('acl', required : want_acl == 'true')
897 have = libacl.found()
902 conf.set10('HAVE_ACL', have)
903 m4_defines += have ? ['-DHAVE_ACL'] : []
905 want_audit = get_option('audit')
906 if want_audit != 'false' and not fuzzer_build
907 libaudit = dependency('audit', required : want_audit == 'true')
908 have = libaudit.found()
913 conf.set10('HAVE_AUDIT', have)
915 want_blkid = get_option('blkid')
916 if want_blkid != 'false' and not fuzzer_build
917 libblkid = dependency('blkid', required : want_blkid == 'true')
918 have = libblkid.found()
923 conf.set10('HAVE_BLKID', have)
925 want_kmod = get_option('kmod')
926 if want_kmod != 'false' and not fuzzer_build
927 libkmod = dependency('libkmod',
929 required : want_kmod == 'true')
930 have = libkmod.found()
935 conf.set10('HAVE_KMOD', have)
937 want_pam = get_option('pam')
938 if want_pam != 'false' and not fuzzer_build
939 libpam = cc.find_library('pam', required : want_pam == 'true')
940 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
941 have = libpam.found() and libpam_misc.found()
947 conf.set10('HAVE_PAM', have)
948 m4_defines += have ? ['-DHAVE_PAM'] : []
950 want_microhttpd = get_option('microhttpd')
951 if want_microhttpd != 'false' and not fuzzer_build
952 libmicrohttpd = dependency('libmicrohttpd',
953 version : '>= 0.9.33',
954 required : want_microhttpd == 'true')
955 have = libmicrohttpd.found()
960 conf.set10('HAVE_MICROHTTPD', have)
961 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
963 want_libcryptsetup = get_option('libcryptsetup')
964 if want_libcryptsetup != 'false' and not fuzzer_build
965 libcryptsetup = dependency('libcryptsetup',
966 version : '>= 1.6.0',
967 required : want_libcryptsetup == 'true')
968 have = libcryptsetup.found()
973 conf.set10('HAVE_LIBCRYPTSETUP', have)
975 want_libcurl = get_option('libcurl')
976 if want_libcurl != 'false' and not fuzzer_build
977 libcurl = dependency('libcurl',
978 version : '>= 7.32.0',
979 required : want_libcurl == 'true')
980 have = libcurl.found()
985 conf.set10('HAVE_LIBCURL', have)
986 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
988 want_libidn = get_option('libidn')
989 want_libidn2 = get_option('libidn2')
990 if want_libidn == 'true' and want_libidn2 == 'true'
991 error('libidn and libidn2 cannot be requested simultaneously')
994 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
995 libidn = dependency('libidn',
996 required : want_libidn == 'true')
997 have = libidn.found()
1002 conf.set10('HAVE_LIBIDN', have)
1003 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
1004 if not have and want_libidn2 != 'false' and not fuzzer_build
1005 # libidn is used for both libidn and libidn2 objects
1006 libidn = dependency('libidn2',
1007 required : want_libidn2 == 'true')
1008 have = libidn.found()
1012 conf.set10('HAVE_LIBIDN2', have)
1013 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
1015 want_libiptc = get_option('libiptc')
1016 if want_libiptc != 'false' and not fuzzer_build
1017 libiptc = dependency('libiptc',
1018 required : want_libiptc == 'true')
1019 have = libiptc.found()
1024 conf.set10('HAVE_LIBIPTC', have)
1025 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
1027 want_qrencode = get_option('qrencode')
1028 if want_qrencode != 'false' and not fuzzer_build
1029 libqrencode = dependency('libqrencode',
1030 required : want_qrencode == 'true')
1031 have = libqrencode.found()
1036 conf.set10('HAVE_QRENCODE', have)
1038 want_gcrypt = get_option('gcrypt')
1039 if want_gcrypt != 'false' and not fuzzer_build
1040 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1041 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1042 have = libgcrypt.found() and libgpg_error.found()
1047 # link to neither of the libs if one is not found
1051 conf.set10('HAVE_GCRYPT', have)
1053 want_gnutls = get_option('gnutls')
1054 if want_gnutls != 'false' and not fuzzer_build
1055 libgnutls = dependency('gnutls',
1056 version : '>= 3.1.4',
1057 required : want_gnutls == 'true')
1058 have = libgnutls.found()
1063 conf.set10('HAVE_GNUTLS', have)
1065 want_elfutils = get_option('elfutils')
1066 if want_elfutils != 'false' and not fuzzer_build
1067 libdw = dependency('libdw',
1068 required : want_elfutils == 'true')
1069 have = libdw.found()
1074 conf.set10('HAVE_ELFUTILS', have)
1076 want_zlib = get_option('zlib')
1077 if want_zlib != 'false' and not fuzzer_build
1078 libz = dependency('zlib',
1079 required : want_zlib == 'true')
1085 conf.set10('HAVE_ZLIB', have)
1087 want_bzip2 = get_option('bzip2')
1088 if want_bzip2 != 'false' and not fuzzer_build
1089 libbzip2 = cc.find_library('bz2',
1090 required : want_bzip2 == 'true')
1091 have = libbzip2.found()
1096 conf.set10('HAVE_BZIP2', have)
1098 want_xz = get_option('xz')
1099 if want_xz != 'false' and not fuzzer_build
1100 libxz = dependency('liblzma',
1101 required : want_xz == 'true')
1102 have = libxz.found()
1107 conf.set10('HAVE_XZ', have)
1109 want_lz4 = get_option('lz4')
1110 if want_lz4 != 'false' and not fuzzer_build
1111 liblz4 = dependency('liblz4',
1112 required : want_lz4 == 'true')
1113 have = liblz4.found()
1118 conf.set10('HAVE_LZ4', have)
1120 want_xkbcommon = get_option('xkbcommon')
1121 if want_xkbcommon != 'false' and not fuzzer_build
1122 libxkbcommon = dependency('xkbcommon',
1123 version : '>= 0.3.0',
1124 required : want_xkbcommon == 'true')
1125 have = libxkbcommon.found()
1130 conf.set10('HAVE_XKBCOMMON', have)
1132 want_pcre2 = get_option('pcre2')
1133 if want_pcre2 != 'false'
1134 libpcre2 = dependency('libpcre2-8',
1135 required : want_pcre2 == 'true')
1136 have = libpcre2.found()
1141 conf.set10('HAVE_PCRE2', have)
1143 want_glib = get_option('glib')
1144 if want_glib != 'false' and not fuzzer_build
1145 libglib = dependency('glib-2.0',
1146 version : '>= 2.22.0',
1147 required : want_glib == 'true')
1148 libgobject = dependency('gobject-2.0',
1149 version : '>= 2.22.0',
1150 required : want_glib == 'true')
1151 libgio = dependency('gio-2.0',
1152 required : want_glib == 'true')
1153 have = libglib.found() and libgobject.found() and libgio.found()
1160 conf.set10('HAVE_GLIB', have)
1162 want_dbus = get_option('dbus')
1163 if want_dbus != 'false' and not fuzzer_build
1164 libdbus = dependency('dbus-1',
1165 version : '>= 1.3.2',
1166 required : want_dbus == 'true')
1167 have = libdbus.found()
1172 conf.set10('HAVE_DBUS', have)
1174 default_dnssec = get_option('default-dnssec')
1176 default_dnssec = 'no'
1178 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1179 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1180 default_dnssec = 'no'
1182 conf.set('DEFAULT_DNSSEC_MODE',
1183 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1184 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1186 want_importd = get_option('importd')
1187 if want_importd != 'false'
1188 have = (conf.get('HAVE_LIBCURL') == 1 and
1189 conf.get('HAVE_ZLIB') == 1 and
1190 conf.get('HAVE_BZIP2') == 1 and
1191 conf.get('HAVE_XZ') == 1 and
1192 conf.get('HAVE_GCRYPT') == 1)
1193 if want_importd == 'true' and not have
1194 error('importd support was requested, but dependencies are not available')
1199 conf.set10('ENABLE_IMPORTD', have)
1201 want_remote = get_option('remote')
1202 if want_remote != 'false'
1203 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1204 conf.get('HAVE_LIBCURL') == 1]
1205 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1206 # it's possible to build one without the other. Complain only if
1207 # support was explictly requested. The auxiliary files like sysusers
1208 # config should be installed when any of the programs are built.
1209 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1210 error('remote support was requested, but dependencies are not available')
1212 have = have_deps[0] or have_deps[1]
1216 conf.set10('ENABLE_REMOTE', have)
1218 foreach term : ['utmp',
1249 have = get_option(term)
1250 name = 'ENABLE_' + term.underscorify().to_upper()
1251 conf.set10(name, have)
1252 m4_defines += have ? ['-D' + name] : []
1255 want_tests = get_option('tests')
1256 install_tests = get_option('install-tests')
1257 slow_tests = get_option('slow-tests')
1261 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1263 #####################################################################
1265 if get_option('efi')
1266 efi_arch = host_machine.cpu_family()
1268 if efi_arch == 'x86'
1269 EFI_MACHINE_TYPE_NAME = 'ia32'
1270 gnu_efi_arch = 'ia32'
1271 elif efi_arch == 'x86_64'
1272 EFI_MACHINE_TYPE_NAME = 'x64'
1273 gnu_efi_arch = 'x86_64'
1274 elif efi_arch == 'arm'
1275 EFI_MACHINE_TYPE_NAME = 'arm'
1276 gnu_efi_arch = 'arm'
1277 elif efi_arch == 'aarch64'
1278 EFI_MACHINE_TYPE_NAME = 'aa64'
1279 gnu_efi_arch = 'aarch64'
1281 EFI_MACHINE_TYPE_NAME = ''
1286 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1288 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1292 conf.set10('ENABLE_EFI', have)
1294 #####################################################################
1296 config_h = configure_file(
1297 output : 'config.h',
1298 configuration : conf)
1300 includes = include_directories('src/basic',
1310 'src/libsystemd/sd-bus',
1311 'src/libsystemd/sd-device',
1312 'src/libsystemd/sd-hwdb',
1313 'src/libsystemd/sd-id128',
1314 'src/libsystemd/sd-netlink',
1315 'src/libsystemd/sd-network',
1316 'src/libsystemd-network',
1319 add_project_arguments('-include', 'config.h', language : 'c')
1323 subdir('src/systemd')
1325 subdir('src/libsystemd')
1326 subdir('src/libsystemd-network')
1327 subdir('src/journal')
1330 libjournal_core = static_library(
1332 libjournal_core_sources,
1334 include_directories : includes,
1337 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1338 libsystemd = shared_library(
1340 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1341 version : libsystemd_version,
1342 include_directories : includes,
1343 link_args : ['-shared',
1344 '-Wl,--version-script=' + libsystemd_sym_path],
1345 link_with : [libbasic,
1347 link_whole : [libsystemd_static,
1349 dependencies : [threads,
1353 link_depends : libsystemd_sym,
1355 install_dir : rootlibdir)
1357 ############################################################
1359 # binaries that have --help and are intended for use by humans,
1360 # usually, but not always, installed in /bin.
1361 public_programs = []
1363 subdir('src/libudev')
1364 subdir('src/shared')
1367 subdir('src/network')
1369 subdir('src/analyze')
1370 subdir('src/journal-remote')
1371 subdir('src/coredump')
1372 subdir('src/hostname')
1373 subdir('src/import')
1374 subdir('src/kernel-install')
1375 subdir('src/locale')
1376 subdir('src/machine')
1377 subdir('src/nspawn')
1378 subdir('src/resolve')
1379 subdir('src/timedate')
1380 subdir('src/timesync')
1381 subdir('src/vconsole')
1382 subdir('src/boot/efi')
1389 ############################################################
1391 # only static linking apart from libdl, to make sure that the
1392 # module is linked to all libraries that it uses.
1393 test_dlopen = executable(
1396 include_directories : includes,
1397 link_with : [libbasic],
1398 dependencies : [libdl])
1400 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1401 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1402 ['mymachines', 'ENABLE_MACHINED'],
1403 ['resolve', 'ENABLE_RESOLVE']]
1405 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1409 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1410 version_script_arg = join_paths(meson.current_source_dir(), sym)
1412 nss = shared_library(
1414 'src/nss-@0@/nss-@0@.c'.format(module),
1416 include_directories : includes,
1417 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1418 link_args : ['-Wl,-z,nodelete',
1420 '-Wl,--version-script=' + version_script_arg,
1422 link_with : [libsystemd_static,
1424 dependencies : [threads,
1428 install_dir : rootlibdir)
1430 # We cannot use shared_module because it does not support version suffix.
1431 # Unfortunately shared_library insists on creating the symlink…
1432 meson.add_install_script('sh', '-c',
1433 'rm $DESTDIR@0@/libnss_@1@.so'
1434 .format(rootlibdir, module))
1436 test('dlopen-nss_' + module,
1438 args : [nss.full_path()]) # path to dlopen must include a slash
1442 ############################################################
1444 executable('systemd',
1446 include_directories : includes,
1447 link_with : [libcore,
1449 dependencies : [threads,
1455 install_rpath : rootlibexecdir,
1457 install_dir : rootlibexecdir)
1459 meson.add_install_script(meson_make_symlink,
1460 join_paths(rootlibexecdir, 'systemd'),
1461 join_paths(rootsbindir, 'init'))
1463 exe = executable('systemd-analyze',
1464 systemd_analyze_sources,
1465 include_directories : includes,
1466 link_with : [libcore,
1468 dependencies : [threads,
1474 install_rpath : rootlibexecdir,
1476 public_programs += [exe]
1478 executable('systemd-journald',
1479 systemd_journald_sources,
1480 include_directories : includes,
1481 link_with : [libjournal_core,
1483 dependencies : [threads,
1487 install_rpath : rootlibexecdir,
1489 install_dir : rootlibexecdir)
1491 exe = executable('systemd-cat',
1492 systemd_cat_sources,
1493 include_directories : includes,
1494 link_with : [libjournal_core,
1496 dependencies : [threads],
1497 install_rpath : rootlibexecdir,
1499 public_programs += [exe]
1501 exe = executable('journalctl',
1503 include_directories : includes,
1504 link_with : [libshared],
1505 dependencies : [threads,
1510 install_rpath : rootlibexecdir,
1512 install_dir : rootbindir)
1513 public_programs += [exe]
1515 executable('systemd-getty-generator',
1516 'src/getty-generator/getty-generator.c',
1517 include_directories : includes,
1518 link_with : [libshared],
1519 install_rpath : rootlibexecdir,
1521 install_dir : systemgeneratordir)
1523 executable('systemd-debug-generator',
1524 'src/debug-generator/debug-generator.c',
1525 include_directories : includes,
1526 link_with : [libshared],
1527 install_rpath : rootlibexecdir,
1529 install_dir : systemgeneratordir)
1531 executable('systemd-fstab-generator',
1532 'src/fstab-generator/fstab-generator.c',
1533 'src/core/mount-setup.c',
1534 include_directories : includes,
1535 link_with : [libshared],
1536 install_rpath : rootlibexecdir,
1538 install_dir : systemgeneratordir)
1540 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1541 executable('30-systemd-environment-d-generator',
1542 'src/environment-d-generator/environment-d-generator.c',
1543 include_directories : includes,
1544 link_with : [libshared],
1545 install_rpath : rootlibexecdir,
1547 install_dir : userenvgeneratordir)
1549 meson.add_install_script(meson_make_symlink,
1550 join_paths(sysconfdir, 'environment'),
1551 join_paths(environmentdir, '99-environment.conf'))
1554 if conf.get('ENABLE_HIBERNATE') == 1
1555 executable('systemd-hibernate-resume-generator',
1556 'src/hibernate-resume/hibernate-resume-generator.c',
1557 include_directories : includes,
1558 link_with : [libshared],
1559 install_rpath : rootlibexecdir,
1561 install_dir : systemgeneratordir)
1563 executable('systemd-hibernate-resume',
1564 'src/hibernate-resume/hibernate-resume.c',
1565 include_directories : includes,
1566 link_with : [libshared],
1567 install_rpath : rootlibexecdir,
1569 install_dir : rootlibexecdir)
1572 if conf.get('HAVE_BLKID') == 1
1573 executable('systemd-gpt-auto-generator',
1574 'src/gpt-auto-generator/gpt-auto-generator.c',
1575 'src/basic/blkid-util.h',
1576 include_directories : includes,
1577 link_with : [libshared],
1578 dependencies : libblkid,
1579 install_rpath : rootlibexecdir,
1581 install_dir : systemgeneratordir)
1583 exe = executable('systemd-dissect',
1584 'src/dissect/dissect.c',
1585 include_directories : includes,
1586 link_with : [libshared],
1587 install_rpath : rootlibexecdir,
1589 install_dir : rootlibexecdir)
1590 public_programs += [exe]
1593 if conf.get('ENABLE_RESOLVE') == 1
1594 executable('systemd-resolved',
1595 systemd_resolved_sources,
1596 include_directories : includes,
1597 link_with : [libshared,
1599 libsystemd_resolve_core],
1600 dependencies : [threads,
1604 install_rpath : rootlibexecdir,
1606 install_dir : rootlibexecdir)
1608 exe = executable('systemd-resolve',
1609 systemd_resolve_sources,
1610 include_directories : includes,
1611 link_with : [libshared,
1613 libsystemd_resolve_core],
1614 dependencies : [threads,
1618 install_rpath : rootlibexecdir,
1620 public_programs += [exe]
1622 meson.add_install_script(meson_make_symlink,
1623 join_paths(bindir, 'systemd-resolve'),
1624 join_paths(rootsbindir, 'resolvconf'))
1627 if conf.get('ENABLE_LOGIND') == 1
1628 executable('systemd-logind',
1629 systemd_logind_sources,
1630 include_directories : includes,
1631 link_with : [liblogind_core,
1633 dependencies : [threads,
1635 install_rpath : rootlibexecdir,
1637 install_dir : rootlibexecdir)
1639 exe = executable('loginctl',
1641 include_directories : includes,
1642 link_with : [libshared],
1643 dependencies : [threads,
1646 install_rpath : rootlibexecdir,
1648 install_dir : rootbindir)
1649 public_programs += [exe]
1651 exe = executable('systemd-inhibit',
1652 'src/login/inhibit.c',
1653 include_directories : includes,
1654 link_with : [libshared],
1655 install_rpath : rootlibexecdir,
1657 install_dir : rootbindir)
1658 public_programs += [exe]
1660 if conf.get('HAVE_PAM') == 1
1661 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1662 pam_systemd = shared_library(
1666 include_directories : includes,
1667 link_args : ['-shared',
1668 '-Wl,--version-script=' + version_script_arg],
1669 link_with : [libsystemd_static,
1671 dependencies : [threads,
1674 link_depends : pam_systemd_sym,
1676 install_dir : pamlibdir)
1678 test('dlopen-pam_systemd',
1680 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1684 if conf.get('HAVE_PAM') == 1
1685 executable('systemd-user-sessions',
1686 'src/user-sessions/user-sessions.c',
1687 include_directories : includes,
1688 link_with : [libshared],
1689 install_rpath : rootlibexecdir,
1691 install_dir : rootlibexecdir)
1694 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1695 exe = executable('bootctl',
1696 'src/boot/bootctl.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 dependencies : [libblkid],
1700 install_rpath : rootlibexecdir,
1702 public_programs += [exe]
1705 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1706 include_directories : includes,
1707 link_with : [libshared],
1708 dependencies : [threads],
1709 install_rpath : rootlibexecdir,
1711 public_programs += [exe]
1713 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1714 include_directories : includes,
1715 link_with : [libshared],
1716 dependencies : [threads,
1721 install_rpath : rootlibexecdir,
1723 install_dir : rootbindir)
1724 public_programs += [exe]
1726 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1727 meson.add_install_script(meson_make_symlink,
1728 join_paths(rootbindir, 'systemctl'),
1729 join_paths(rootsbindir, alias))
1732 if conf.get('ENABLE_BACKLIGHT') == 1
1733 executable('systemd-backlight',
1734 'src/backlight/backlight.c',
1735 include_directories : includes,
1736 link_with : [libshared],
1737 install_rpath : rootlibexecdir,
1739 install_dir : rootlibexecdir)
1742 if conf.get('ENABLE_RFKILL') == 1
1743 executable('systemd-rfkill',
1744 'src/rfkill/rfkill.c',
1745 include_directories : includes,
1746 link_with : [libshared],
1747 install_rpath : rootlibexecdir,
1749 install_dir : rootlibexecdir)
1752 executable('systemd-system-update-generator',
1753 'src/system-update-generator/system-update-generator.c',
1754 include_directories : includes,
1755 link_with : [libshared],
1756 install_rpath : rootlibexecdir,
1758 install_dir : systemgeneratordir)
1760 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1761 executable('systemd-cryptsetup',
1762 'src/cryptsetup/cryptsetup.c',
1763 include_directories : includes,
1764 link_with : [libshared],
1765 dependencies : [libcryptsetup],
1766 install_rpath : rootlibexecdir,
1768 install_dir : rootlibexecdir)
1770 executable('systemd-cryptsetup-generator',
1771 'src/cryptsetup/cryptsetup-generator.c',
1772 include_directories : includes,
1773 link_with : [libshared],
1774 dependencies : [libcryptsetup],
1775 install_rpath : rootlibexecdir,
1777 install_dir : systemgeneratordir)
1779 executable('systemd-veritysetup',
1780 'src/veritysetup/veritysetup.c',
1781 include_directories : includes,
1782 link_with : [libshared],
1783 dependencies : [libcryptsetup],
1784 install_rpath : rootlibexecdir,
1786 install_dir : rootlibexecdir)
1788 executable('systemd-veritysetup-generator',
1789 'src/veritysetup/veritysetup-generator.c',
1790 include_directories : includes,
1791 link_with : [libshared],
1792 dependencies : [libcryptsetup],
1793 install_rpath : rootlibexecdir,
1795 install_dir : systemgeneratordir)
1798 if conf.get('HAVE_SYSV_COMPAT') == 1
1799 executable('systemd-sysv-generator',
1800 'src/sysv-generator/sysv-generator.c',
1801 include_directories : includes,
1802 link_with : [libshared],
1803 install_rpath : rootlibexecdir,
1805 install_dir : systemgeneratordir)
1807 executable('systemd-rc-local-generator',
1808 'src/rc-local-generator/rc-local-generator.c',
1809 include_directories : includes,
1810 link_with : [libshared],
1811 install_rpath : rootlibexecdir,
1813 install_dir : systemgeneratordir)
1816 if conf.get('ENABLE_HOSTNAMED') == 1
1817 executable('systemd-hostnamed',
1818 'src/hostname/hostnamed.c',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 install_rpath : rootlibexecdir,
1823 install_dir : rootlibexecdir)
1825 exe = executable('hostnamectl',
1826 'src/hostname/hostnamectl.c',
1827 include_directories : includes,
1828 link_with : [libshared],
1829 install_rpath : rootlibexecdir,
1831 public_programs += [exe]
1834 if conf.get('ENABLE_LOCALED') == 1
1835 if conf.get('HAVE_XKBCOMMON') == 1
1836 # logind will load libxkbcommon.so dynamically on its own
1842 executable('systemd-localed',
1843 systemd_localed_sources,
1844 include_directories : includes,
1845 link_with : [libshared],
1846 dependencies : deps,
1847 install_rpath : rootlibexecdir,
1849 install_dir : rootlibexecdir)
1851 exe = executable('localectl',
1853 include_directories : includes,
1854 link_with : [libshared],
1855 install_rpath : rootlibexecdir,
1857 public_programs += [exe]
1860 if conf.get('ENABLE_TIMEDATED') == 1
1861 executable('systemd-timedated',
1862 'src/timedate/timedated.c',
1863 include_directories : includes,
1864 link_with : [libshared],
1865 install_rpath : rootlibexecdir,
1867 install_dir : rootlibexecdir)
1869 exe = executable('timedatectl',
1870 'src/timedate/timedatectl.c',
1871 include_directories : includes,
1872 install_rpath : rootlibexecdir,
1873 link_with : [libshared],
1875 public_programs += [exe]
1878 if conf.get('ENABLE_TIMESYNCD') == 1
1879 executable('systemd-timesyncd',
1880 systemd_timesyncd_sources,
1881 include_directories : includes,
1882 link_with : [libshared],
1883 dependencies : [threads,
1885 install_rpath : rootlibexecdir,
1887 install_dir : rootlibexecdir)
1890 if conf.get('ENABLE_MACHINED') == 1
1891 executable('systemd-machined',
1892 systemd_machined_sources,
1893 include_directories : includes,
1894 link_with : [libmachine_core,
1896 install_rpath : rootlibexecdir,
1898 install_dir : rootlibexecdir)
1900 exe = executable('machinectl',
1901 'src/machine/machinectl.c',
1902 include_directories : includes,
1903 link_with : [libshared],
1904 dependencies : [threads,
1907 install_rpath : rootlibexecdir,
1909 install_dir : rootbindir)
1910 public_programs += [exe]
1913 if conf.get('ENABLE_IMPORTD') == 1
1914 executable('systemd-importd',
1915 systemd_importd_sources,
1916 include_directories : includes,
1917 link_with : [libshared],
1918 dependencies : [threads],
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootlibexecdir)
1923 systemd_pull = executable('systemd-pull',
1924 systemd_pull_sources,
1925 include_directories : includes,
1926 link_with : [libshared],
1927 dependencies : [libcurl,
1932 install_rpath : rootlibexecdir,
1934 install_dir : rootlibexecdir)
1936 systemd_import = executable('systemd-import',
1937 systemd_import_sources,
1938 include_directories : includes,
1939 link_with : [libshared],
1940 dependencies : [libcurl,
1944 install_rpath : rootlibexecdir,
1946 install_dir : rootlibexecdir)
1948 systemd_export = executable('systemd-export',
1949 systemd_export_sources,
1950 include_directories : includes,
1951 link_with : [libshared],
1952 dependencies : [libcurl,
1956 install_rpath : rootlibexecdir,
1958 install_dir : rootlibexecdir)
1959 public_programs += [systemd_pull, systemd_import, systemd_export]
1962 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1963 exe = executable('systemd-journal-upload',
1964 systemd_journal_upload_sources,
1965 include_directories : includes,
1966 link_with : [libshared],
1967 dependencies : [threads,
1972 install_rpath : rootlibexecdir,
1974 install_dir : rootlibexecdir)
1975 public_programs += [exe]
1978 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1979 s_j_remote = executable('systemd-journal-remote',
1980 systemd_journal_remote_sources,
1981 include_directories : includes,
1982 link_with : [libshared],
1983 dependencies : [threads,
1988 install_rpath : rootlibexecdir,
1990 install_dir : rootlibexecdir)
1992 s_j_gatewayd = executable('systemd-journal-gatewayd',
1993 systemd_journal_gatewayd_sources,
1994 include_directories : includes,
1995 link_with : [libshared],
1996 dependencies : [threads,
2001 install_rpath : rootlibexecdir,
2003 install_dir : rootlibexecdir)
2004 public_programs += [s_j_remote, s_j_gatewayd]
2007 if conf.get('ENABLE_COREDUMP') == 1
2008 executable('systemd-coredump',
2009 systemd_coredump_sources,
2010 include_directories : includes,
2011 link_with : [libshared],
2012 dependencies : [threads,
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2021 exe = executable('coredumpctl',
2022 coredumpctl_sources,
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [threads,
2028 install_rpath : rootlibexecdir,
2030 public_programs += [exe]
2033 if conf.get('ENABLE_BINFMT') == 1
2034 exe = executable('systemd-binfmt',
2035 'src/binfmt/binfmt.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 install_rpath : rootlibexecdir,
2040 install_dir : rootlibexecdir)
2041 public_programs += [exe]
2043 meson.add_install_script('sh', '-c',
2044 mkdir_p.format(binfmtdir))
2045 meson.add_install_script('sh', '-c',
2046 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2049 if conf.get('ENABLE_VCONSOLE') == 1
2050 executable('systemd-vconsole-setup',
2051 'src/vconsole/vconsole-setup.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 install_rpath : rootlibexecdir,
2056 install_dir : rootlibexecdir)
2059 if conf.get('ENABLE_RANDOMSEED') == 1
2060 executable('systemd-random-seed',
2061 'src/random-seed/random-seed.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 install_rpath : rootlibexecdir,
2066 install_dir : rootlibexecdir)
2069 if conf.get('ENABLE_FIRSTBOOT') == 1
2070 executable('systemd-firstboot',
2071 'src/firstboot/firstboot.c',
2072 include_directories : includes,
2073 link_with : [libshared],
2074 dependencies : [libcrypt],
2075 install_rpath : rootlibexecdir,
2077 install_dir : rootbindir)
2080 executable('systemd-remount-fs',
2081 'src/remount-fs/remount-fs.c',
2082 'src/core/mount-setup.c',
2083 'src/core/mount-setup.h',
2084 include_directories : includes,
2085 link_with : [libshared],
2086 install_rpath : rootlibexecdir,
2088 install_dir : rootlibexecdir)
2090 executable('systemd-machine-id-setup',
2091 'src/machine-id-setup/machine-id-setup-main.c',
2092 'src/core/machine-id-setup.c',
2093 'src/core/machine-id-setup.h',
2094 include_directories : includes,
2095 link_with : [libshared],
2096 install_rpath : rootlibexecdir,
2098 install_dir : rootbindir)
2100 executable('systemd-fsck',
2102 include_directories : includes,
2103 link_with : [libshared],
2104 install_rpath : rootlibexecdir,
2106 install_dir : rootlibexecdir)
2108 executable('systemd-growfs',
2109 'src/partition/growfs.c',
2110 include_directories : includes,
2111 link_with : [libshared],
2112 dependencies : [libcryptsetup],
2113 install_rpath : rootlibexecdir,
2115 install_dir : rootlibexecdir)
2117 executable('systemd-makefs',
2118 'src/partition/makefs.c',
2119 include_directories : includes,
2120 link_with : [libshared],
2121 install_rpath : rootlibexecdir,
2123 install_dir : rootlibexecdir)
2125 executable('systemd-sleep',
2126 'src/sleep/sleep.c',
2127 include_directories : includes,
2128 link_with : [libshared],
2129 install_rpath : rootlibexecdir,
2131 install_dir : rootlibexecdir)
2133 exe = executable('systemd-sysctl',
2134 'src/sysctl/sysctl.c',
2135 include_directories : includes,
2136 link_with : [libshared],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2140 public_programs += [exe]
2142 executable('systemd-ac-power',
2143 'src/ac-power/ac-power.c',
2144 include_directories : includes,
2145 link_with : [libshared],
2146 install_rpath : rootlibexecdir,
2148 install_dir : rootlibexecdir)
2150 exe = executable('systemd-detect-virt',
2151 'src/detect-virt/detect-virt.c',
2152 include_directories : includes,
2153 link_with : [libshared],
2154 install_rpath : rootlibexecdir,
2156 public_programs += [exe]
2158 exe = executable('systemd-delta',
2159 'src/delta/delta.c',
2160 include_directories : includes,
2161 link_with : [libshared],
2162 install_rpath : rootlibexecdir,
2164 public_programs += [exe]
2166 exe = executable('systemd-escape',
2167 'src/escape/escape.c',
2168 include_directories : includes,
2169 link_with : [libshared],
2170 install_rpath : rootlibexecdir,
2172 install_dir : rootbindir)
2173 public_programs += [exe]
2175 exe = executable('systemd-notify',
2176 'src/notify/notify.c',
2177 include_directories : includes,
2178 link_with : [libshared],
2179 install_rpath : rootlibexecdir,
2181 install_dir : rootbindir)
2182 public_programs += [exe]
2184 executable('systemd-volatile-root',
2185 'src/volatile-root/volatile-root.c',
2186 include_directories : includes,
2187 link_with : [libshared],
2188 install_rpath : rootlibexecdir,
2190 install_dir : rootlibexecdir)
2192 executable('systemd-cgroups-agent',
2193 'src/cgroups-agent/cgroups-agent.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 install_rpath : rootlibexecdir,
2198 install_dir : rootlibexecdir)
2200 exe = executable('systemd-path',
2202 include_directories : includes,
2203 link_with : [libshared],
2204 install_rpath : rootlibexecdir,
2206 public_programs += [exe]
2208 exe = executable('systemd-ask-password',
2209 'src/ask-password/ask-password.c',
2210 include_directories : includes,
2211 link_with : [libshared],
2212 install_rpath : rootlibexecdir,
2214 install_dir : rootbindir)
2215 public_programs += [exe]
2217 executable('systemd-reply-password',
2218 'src/reply-password/reply-password.c',
2219 include_directories : includes,
2220 link_with : [libshared],
2221 install_rpath : rootlibexecdir,
2223 install_dir : rootlibexecdir)
2225 exe = executable('systemd-tty-ask-password-agent',
2226 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2227 include_directories : includes,
2228 link_with : [libshared],
2229 install_rpath : rootlibexecdir,
2231 install_dir : rootbindir)
2232 public_programs += [exe]
2234 exe = executable('systemd-cgls',
2236 include_directories : includes,
2237 link_with : [libshared],
2238 install_rpath : rootlibexecdir,
2240 public_programs += [exe]
2242 exe = executable('systemd-cgtop',
2243 'src/cgtop/cgtop.c',
2244 include_directories : includes,
2245 link_with : [libshared],
2246 install_rpath : rootlibexecdir,
2248 public_programs += [exe]
2250 executable('systemd-initctl',
2251 'src/initctl/initctl.c',
2252 include_directories : includes,
2253 link_with : [libshared],
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootlibexecdir)
2258 exe = executable('systemd-mount',
2259 'src/mount/mount-tool.c',
2260 include_directories : includes,
2261 link_with : [libshared],
2262 install_rpath : rootlibexecdir,
2264 public_programs += [exe]
2266 meson.add_install_script(meson_make_symlink,
2267 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2269 exe = executable('systemd-run',
2271 include_directories : includes,
2272 link_with : [libshared],
2273 install_rpath : rootlibexecdir,
2275 public_programs += [exe]
2277 exe = executable('systemd-stdio-bridge',
2278 'src/stdio-bridge/stdio-bridge.c',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 install_rpath : rootlibexecdir,
2283 public_programs += [exe]
2285 exe = executable('busctl',
2286 'src/busctl/busctl.c',
2287 'src/busctl/busctl-introspect.c',
2288 'src/busctl/busctl-introspect.h',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 install_rpath : rootlibexecdir,
2293 public_programs += [exe]
2295 if conf.get('ENABLE_SYSUSERS') == 1
2296 exe = executable('systemd-sysusers',
2297 'src/sysusers/sysusers.c',
2298 include_directories : includes,
2299 link_with : [libshared],
2300 install_rpath : rootlibexecdir,
2302 install_dir : rootbindir)
2303 public_programs += [exe]
2306 if conf.get('ENABLE_TMPFILES') == 1
2307 exe = executable('systemd-tmpfiles',
2308 'src/tmpfiles/tmpfiles.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 dependencies : [libacl],
2312 install_rpath : rootlibexecdir,
2314 install_dir : rootbindir)
2315 public_programs += [exe]
2317 test('test-systemd-tmpfiles',
2318 test_systemd_tmpfiles_py,
2319 args : exe.full_path())
2320 # https://github.com/mesonbuild/meson/issues/2681
2323 if conf.get('ENABLE_HWDB') == 1
2324 exe = executable('systemd-hwdb',
2326 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2327 include_directories : includes,
2328 link_with : [libudev_static],
2329 install_rpath : udev_rpath,
2331 install_dir : rootbindir)
2332 public_programs += [exe]
2335 if conf.get('ENABLE_QUOTACHECK') == 1
2336 executable('systemd-quotacheck',
2337 'src/quotacheck/quotacheck.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2342 install_dir : rootlibexecdir)
2345 exe = executable('systemd-socket-proxyd',
2346 'src/socket-proxy/socket-proxyd.c',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 dependencies : [threads],
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2353 public_programs += [exe]
2355 exe = executable('systemd-udevd',
2356 systemd_udevd_sources,
2357 include_directories : includes,
2358 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2359 link_with : [libudev_core,
2362 dependencies : [threads,
2367 install_rpath : udev_rpath,
2369 install_dir : rootlibexecdir)
2370 public_programs += [exe]
2372 exe = executable('udevadm',
2374 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2375 include_directories : includes,
2376 link_with : [libudev_core,
2379 dependencies : [threads,
2384 install_rpath : udev_rpath,
2386 install_dir : rootbindir)
2387 public_programs += [exe]
2389 executable('systemd-shutdown',
2390 systemd_shutdown_sources,
2391 include_directories : includes,
2392 link_with : [libshared],
2393 dependencies : [libmount],
2394 install_rpath : rootlibexecdir,
2396 install_dir : rootlibexecdir)
2398 executable('systemd-update-done',
2399 'src/update-done/update-done.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootlibexecdir)
2406 executable('systemd-update-utmp',
2407 'src/update-utmp/update-utmp.c',
2408 include_directories : includes,
2409 link_with : [libshared],
2410 dependencies : [libaudit],
2411 install_rpath : rootlibexecdir,
2413 install_dir : rootlibexecdir)
2415 if conf.get('HAVE_KMOD') == 1
2416 executable('systemd-modules-load',
2417 'src/modules-load/modules-load.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 dependencies : [libkmod],
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootlibexecdir)
2425 meson.add_install_script('sh', '-c',
2426 mkdir_p.format(modulesloaddir))
2427 meson.add_install_script('sh', '-c',
2428 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2431 exe = executable('systemd-nspawn',
2432 systemd_nspawn_sources,
2433 'src/core/mount-setup.c', # FIXME: use a variable?
2434 'src/core/mount-setup.h',
2435 'src/core/loopback-setup.c',
2436 'src/core/loopback-setup.h',
2437 include_directories : [includes, include_directories('src/nspawn')],
2438 link_with : [libshared],
2439 dependencies : [libacl,
2443 install_rpath : rootlibexecdir,
2445 public_programs += [exe]
2447 if conf.get('ENABLE_NETWORKD') == 1
2448 executable('systemd-networkd',
2449 systemd_networkd_sources,
2450 include_directories : includes,
2451 link_with : [libnetworkd_core,
2455 dependencies : [threads],
2456 install_rpath : rootlibexecdir,
2458 install_dir : rootlibexecdir)
2460 executable('systemd-networkd-wait-online',
2461 systemd_networkd_wait_online_sources,
2462 include_directories : includes,
2463 link_with : [libnetworkd_core,
2465 install_rpath : rootlibexecdir,
2467 install_dir : rootlibexecdir)
2469 exe = executable('networkctl',
2471 include_directories : includes,
2472 link_with : [libsystemd_network,
2474 install_rpath : rootlibexecdir,
2476 install_dir : rootbindir)
2477 public_programs += [exe]
2480 executable('systemd-sulogin-shell',
2481 ['src/sulogin-shell/sulogin-shell.c'],
2482 include_directories : includes,
2483 link_with : [libshared],
2484 install_rpath : rootlibexecdir,
2486 install_dir : rootlibexecdir)
2488 ############################################################
2490 foreach tuple : tests
2492 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2493 dependencies = tuple[2]
2494 condition = tuple.length() >= 4 ? tuple[3] : ''
2495 type = tuple.length() >= 5 ? tuple[4] : ''
2496 defs = tuple.length() >= 6 ? tuple[5] : []
2497 incs = tuple.length() >= 7 ? tuple[6] : includes
2500 name = sources[0].split('/')[-1].split('.')[0]
2501 if type.startswith('timeout=')
2502 timeout = type.split('=')[1].to_int()
2505 if want_tests == 'false'
2506 message('Not compiling @0@ because tests is set to false'.format(name))
2507 elif condition == '' or conf.get(condition) == 1
2511 include_directories : incs,
2512 link_with : link_with,
2513 dependencies : dependencies,
2515 install_rpath : rootlibexecdir,
2516 install : install_tests,
2517 install_dir : join_paths(testsdir, type))
2520 message('@0@ is a manual test'.format(name))
2521 elif type == 'unsafe' and want_tests != 'unsafe'
2522 message('@0@ is an unsafe test'.format(name))
2529 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2533 test_libsystemd_sym = executable(
2534 'test-libsystemd-sym',
2535 test_libsystemd_sym_c,
2536 include_directories : includes,
2537 link_with : [libsystemd],
2538 install : install_tests,
2539 install_dir : testsdir)
2540 test('test-libsystemd-sym',
2541 test_libsystemd_sym)
2543 test_libudev_sym = executable(
2546 include_directories : includes,
2547 c_args : ['-Wno-deprecated-declarations'],
2548 link_with : [libudev],
2549 install : install_tests,
2550 install_dir : testsdir)
2551 test('test-libudev-sym',
2554 ############################################################
2558 foreach tuple : fuzzers
2560 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2561 dependencies = tuple[2]
2562 defs = tuple.length() >= 4 ? tuple[3] : []
2563 incs = tuple.length() >= 5 ? tuple[4] : includes
2566 dependencies += fuzzing_engine
2568 sources += 'src/fuzz/fuzz-main.c'
2571 name = sources[0].split('/')[-1].split('.')[0]
2573 fuzzer_exes += executable(
2576 include_directories : [incs, include_directories('src/fuzz')],
2577 link_with : link_with,
2578 dependencies : dependencies,
2583 run_target('fuzzers',
2584 depends : fuzzer_exes,
2587 ############################################################
2589 make_directive_index_py = find_program('tools/make-directive-index.py')
2590 make_man_index_py = find_program('tools/make-man-index.py')
2591 xml_helper_py = find_program('tools/xml_helper.py')
2592 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2596 subdir('sysusers.d')
2597 subdir('tmpfiles.d')
2602 subdir('shell-completion/bash')
2603 subdir('shell-completion/zsh')
2604 subdir('docs/sysvinit')
2605 subdir('docs/var-log')
2607 # FIXME: figure out if the warning is true:
2608 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2609 install_subdir('factory/etc',
2610 install_dir : factorydir)
2613 install_data('xorg/50-systemd-user.sh',
2614 install_dir : xinitrcdir)
2615 install_data('modprobe.d/systemd.conf',
2616 install_dir : modprobedir)
2617 install_data('LICENSE.GPL2',
2622 'doc/DISTRO_PORTING',
2623 'doc/ENVIRONMENT.md',
2625 'doc/TRANSIENT-SETTINGS.md',
2628 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2629 install_dir : docdir)
2631 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2632 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2634 ############################################################
2636 meson_check_help = find_program('tools/meson-check-help.sh')
2638 foreach exec : public_programs
2639 name = exec.full_path().split('/')[-1]
2640 test('check-help-' + name,
2642 args : [exec.full_path()])
2645 ############################################################
2647 # Enable tests for all supported sanitizers
2648 foreach tuple : sanitizers
2649 sanitizer = tuple[0]
2652 have = run_command(check_compilation_sh,
2653 cc.cmd_array(), '-x', 'c',
2654 '-fsanitize=@0@'.format(sanitizer),
2655 '-include', link_test_c).returncode() == 0
2656 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2660 foreach p : fuzz_regression_tests
2661 b = p.split('/')[-2]
2662 c = p.split('/')[-1]
2664 name = '@0@:@1@'.format(b, sanitizer)
2667 if want_tests == 'false'
2668 message('Not compiling @0@ because tests is set to false'.format(name))
2670 exe = custom_target(
2674 command : [env, 'ln', '-fs',
2675 join_paths(build.full_path(), b),
2677 build_by_default : true)
2679 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2684 if want_tests != 'false' and slow_tests
2685 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2687 args : [exe.full_path(),
2688 join_paths(meson.source_root(),
2689 'test/fuzz-regressions',
2697 ############################################################
2700 all_files = run_command(
2702 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2705 all_files = files(all_files.stdout().split())
2710 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2714 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2718 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2721 command : [meson_git_contrib_sh])
2725 git_head = run_command(
2727 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2728 'rev-parse', 'HEAD']).stdout().strip()
2729 git_head_short = run_command(
2731 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2732 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2736 command : ['git', 'archive',
2737 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2739 '--prefix', 'systemd-@0@/'.format(git_head),
2743 ############################################################
2745 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2748 depends : [man, libsystemd, libudev],
2749 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2751 ############################################################
2754 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2756 'split /usr: @0@'.format(split_usr),
2757 'split bin-sbin: @0@'.format(split_bin),
2758 'prefix directory: @0@'.format(prefixdir),
2759 'rootprefix directory: @0@'.format(rootprefixdir),
2760 'sysconf directory: @0@'.format(sysconfdir),
2761 'include directory: @0@'.format(includedir),
2762 'lib directory: @0@'.format(libdir),
2763 'rootlib directory: @0@'.format(rootlibdir),
2764 'SysV init scripts: @0@'.format(sysvinit_path),
2765 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2766 'PAM modules directory: @0@'.format(pamlibdir),
2767 'PAM configuration directory: @0@'.format(pamconfdir),
2768 'RPM macros directory: @0@'.format(rpmmacrosdir),
2769 'modprobe.d directory: @0@'.format(modprobedir),
2770 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2771 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2772 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2773 'bash completions directory: @0@'.format(bashcompletiondir),
2774 'zsh completions directory: @0@'.format(zshcompletiondir),
2775 'extra start script: @0@'.format(get_option('rc-local')),
2776 'extra stop script: @0@'.format(get_option('halt-local')),
2777 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2778 get_option('debug-tty')),
2779 'TTY GID: @0@'.format(tty_gid),
2780 'users GID: @0@'.format(users_gid),
2781 'maximum system UID: @0@'.format(system_uid_max),
2782 'maximum system GID: @0@'.format(system_gid_max),
2783 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2784 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2785 'minimum container UID base: @0@'.format(container_uid_base_min),
2786 'maximum container UID base: @0@'.format(container_uid_base_max),
2787 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2788 'render group access mode: @0@'.format(get_option('group-render-mode')),
2789 'certificate root directory: @0@'.format(get_option('certificate-root')),
2790 'support URL: @0@'.format(support_url),
2791 'nobody user name: @0@'.format(nobody_user),
2792 'nobody group name: @0@'.format(nobody_group),
2793 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2794 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2796 'default DNSSEC mode: @0@'.format(default_dnssec),
2797 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2798 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2800 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2801 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2803 'default DNS servers: @0@'.format(alt_dns_servers),
2804 'default NTP servers: @0@'.format(alt_ntp_servers)]
2806 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2807 '@@0@'.format(time_epoch)).stdout().strip()
2809 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2812 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2813 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2814 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2816 if conf.get('ENABLE_EFI') == 1
2818 'efi arch: @0@'.format(efi_arch)]
2822 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2823 'EFI CC @0@'.format(efi_cc),
2824 'EFI lib directory: @0@'.format(efi_libdir),
2825 'EFI lds directory: @0@'.format(efi_ldsdir),
2826 'EFI include directory: @0@'.format(efi_incdir)]
2879 ['legacy pkla', install_polkit_pkla],
2881 ['gnu-efi', have_gnu_efi],
2888 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2891 ['man pages', want_man],
2892 ['html pages', want_html],
2893 ['man page indices', want_man and have_lxml],
2898 ['adm group', get_option('adm-group')],
2899 ['wheel group', get_option('wheel-group')],
2902 ['debug mmap cache'],
2905 if tuple.length() >= 2
2908 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2909 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2910 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2915 missing += [tuple[0]]
2921 'enabled features: @0@'.format(', '.join(found)),
2923 'disabled features: @0@'.format(', '.join(missing)),
2925 message('\n '.join(status))
2927 if rootprefixdir != rootprefix_default
2928 message('WARNING:\n' +
2929 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2930 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2931 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))