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',
1306 'src/time-wait-sync',
1311 'src/libsystemd/sd-bus',
1312 'src/libsystemd/sd-device',
1313 'src/libsystemd/sd-hwdb',
1314 'src/libsystemd/sd-id128',
1315 'src/libsystemd/sd-netlink',
1316 'src/libsystemd/sd-network',
1317 'src/libsystemd-network',
1320 add_project_arguments('-include', 'config.h', language : 'c')
1324 subdir('src/systemd')
1326 subdir('src/libsystemd')
1327 subdir('src/libsystemd-network')
1328 subdir('src/journal')
1331 libjournal_core = static_library(
1333 libjournal_core_sources,
1335 include_directories : includes,
1338 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1339 libsystemd = shared_library(
1341 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1342 version : libsystemd_version,
1343 include_directories : includes,
1344 link_args : ['-shared',
1345 '-Wl,--version-script=' + libsystemd_sym_path],
1346 link_with : [libbasic,
1348 link_whole : [libsystemd_static,
1350 dependencies : [threads,
1354 link_depends : libsystemd_sym,
1356 install_dir : rootlibdir)
1358 ############################################################
1360 # binaries that have --help and are intended for use by humans,
1361 # usually, but not always, installed in /bin.
1362 public_programs = []
1364 subdir('src/libudev')
1365 subdir('src/shared')
1368 subdir('src/network')
1370 subdir('src/analyze')
1371 subdir('src/journal-remote')
1372 subdir('src/coredump')
1373 subdir('src/hostname')
1374 subdir('src/import')
1375 subdir('src/kernel-install')
1376 subdir('src/locale')
1377 subdir('src/machine')
1378 subdir('src/nspawn')
1379 subdir('src/resolve')
1380 subdir('src/timedate')
1381 subdir('src/timesync')
1382 subdir('src/vconsole')
1383 subdir('src/boot/efi')
1390 ############################################################
1392 # only static linking apart from libdl, to make sure that the
1393 # module is linked to all libraries that it uses.
1394 test_dlopen = executable(
1397 include_directories : includes,
1398 link_with : [libbasic],
1399 dependencies : [libdl])
1401 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1402 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1403 ['mymachines', 'ENABLE_MACHINED'],
1404 ['resolve', 'ENABLE_RESOLVE']]
1406 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1410 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1411 version_script_arg = join_paths(meson.current_source_dir(), sym)
1413 nss = shared_library(
1415 'src/nss-@0@/nss-@0@.c'.format(module),
1417 include_directories : includes,
1418 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1419 link_args : ['-Wl,-z,nodelete',
1421 '-Wl,--version-script=' + version_script_arg,
1423 link_with : [libsystemd_static,
1425 dependencies : [threads,
1429 install_dir : rootlibdir)
1431 # We cannot use shared_module because it does not support version suffix.
1432 # Unfortunately shared_library insists on creating the symlink…
1433 meson.add_install_script('sh', '-c',
1434 'rm $DESTDIR@0@/libnss_@1@.so'
1435 .format(rootlibdir, module))
1437 test('dlopen-nss_' + module,
1439 args : [nss.full_path()]) # path to dlopen must include a slash
1443 ############################################################
1445 executable('systemd',
1447 include_directories : includes,
1448 link_with : [libcore,
1450 dependencies : [threads,
1456 install_rpath : rootlibexecdir,
1458 install_dir : rootlibexecdir)
1460 meson.add_install_script(meson_make_symlink,
1461 join_paths(rootlibexecdir, 'systemd'),
1462 join_paths(rootsbindir, 'init'))
1464 exe = executable('systemd-analyze',
1465 systemd_analyze_sources,
1466 include_directories : includes,
1467 link_with : [libcore,
1469 dependencies : [threads,
1475 install_rpath : rootlibexecdir,
1477 public_programs += [exe]
1479 executable('systemd-journald',
1480 systemd_journald_sources,
1481 include_directories : includes,
1482 link_with : [libjournal_core,
1484 dependencies : [threads,
1488 install_rpath : rootlibexecdir,
1490 install_dir : rootlibexecdir)
1492 exe = executable('systemd-cat',
1493 systemd_cat_sources,
1494 include_directories : includes,
1495 link_with : [libjournal_core,
1497 dependencies : [threads],
1498 install_rpath : rootlibexecdir,
1500 public_programs += [exe]
1502 exe = executable('journalctl',
1504 include_directories : includes,
1505 link_with : [libshared],
1506 dependencies : [threads,
1511 install_rpath : rootlibexecdir,
1513 install_dir : rootbindir)
1514 public_programs += [exe]
1516 executable('systemd-getty-generator',
1517 'src/getty-generator/getty-generator.c',
1518 include_directories : includes,
1519 link_with : [libshared],
1520 install_rpath : rootlibexecdir,
1522 install_dir : systemgeneratordir)
1524 executable('systemd-debug-generator',
1525 'src/debug-generator/debug-generator.c',
1526 include_directories : includes,
1527 link_with : [libshared],
1528 install_rpath : rootlibexecdir,
1530 install_dir : systemgeneratordir)
1532 executable('systemd-fstab-generator',
1533 'src/fstab-generator/fstab-generator.c',
1534 'src/core/mount-setup.c',
1535 include_directories : includes,
1536 link_with : [libshared],
1537 install_rpath : rootlibexecdir,
1539 install_dir : systemgeneratordir)
1541 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1542 executable('30-systemd-environment-d-generator',
1543 'src/environment-d-generator/environment-d-generator.c',
1544 include_directories : includes,
1545 link_with : [libshared],
1546 install_rpath : rootlibexecdir,
1548 install_dir : userenvgeneratordir)
1550 meson.add_install_script(meson_make_symlink,
1551 join_paths(sysconfdir, 'environment'),
1552 join_paths(environmentdir, '99-environment.conf'))
1555 if conf.get('ENABLE_HIBERNATE') == 1
1556 executable('systemd-hibernate-resume-generator',
1557 'src/hibernate-resume/hibernate-resume-generator.c',
1558 include_directories : includes,
1559 link_with : [libshared],
1560 install_rpath : rootlibexecdir,
1562 install_dir : systemgeneratordir)
1564 executable('systemd-hibernate-resume',
1565 'src/hibernate-resume/hibernate-resume.c',
1566 include_directories : includes,
1567 link_with : [libshared],
1568 install_rpath : rootlibexecdir,
1570 install_dir : rootlibexecdir)
1573 if conf.get('HAVE_BLKID') == 1
1574 executable('systemd-gpt-auto-generator',
1575 'src/gpt-auto-generator/gpt-auto-generator.c',
1576 'src/basic/blkid-util.h',
1577 include_directories : includes,
1578 link_with : [libshared],
1579 dependencies : libblkid,
1580 install_rpath : rootlibexecdir,
1582 install_dir : systemgeneratordir)
1584 exe = executable('systemd-dissect',
1585 'src/dissect/dissect.c',
1586 include_directories : includes,
1587 link_with : [libshared],
1588 install_rpath : rootlibexecdir,
1590 install_dir : rootlibexecdir)
1591 public_programs += [exe]
1594 if conf.get('ENABLE_RESOLVE') == 1
1595 executable('systemd-resolved',
1596 systemd_resolved_sources,
1597 include_directories : includes,
1598 link_with : [libshared,
1600 libsystemd_resolve_core],
1601 dependencies : [threads,
1605 install_rpath : rootlibexecdir,
1607 install_dir : rootlibexecdir)
1609 exe = executable('systemd-resolve',
1610 systemd_resolve_sources,
1611 include_directories : includes,
1612 link_with : [libshared,
1614 libsystemd_resolve_core],
1615 dependencies : [threads,
1619 install_rpath : rootlibexecdir,
1621 public_programs += [exe]
1623 meson.add_install_script(meson_make_symlink,
1624 join_paths(bindir, 'systemd-resolve'),
1625 join_paths(rootsbindir, 'resolvconf'))
1628 if conf.get('ENABLE_LOGIND') == 1
1629 executable('systemd-logind',
1630 systemd_logind_sources,
1631 include_directories : includes,
1632 link_with : [liblogind_core,
1634 dependencies : [threads,
1636 install_rpath : rootlibexecdir,
1638 install_dir : rootlibexecdir)
1640 exe = executable('loginctl',
1642 include_directories : includes,
1643 link_with : [libshared],
1644 dependencies : [threads,
1647 install_rpath : rootlibexecdir,
1649 install_dir : rootbindir)
1650 public_programs += [exe]
1652 exe = executable('systemd-inhibit',
1653 'src/login/inhibit.c',
1654 include_directories : includes,
1655 link_with : [libshared],
1656 install_rpath : rootlibexecdir,
1658 install_dir : rootbindir)
1659 public_programs += [exe]
1661 if conf.get('HAVE_PAM') == 1
1662 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1663 pam_systemd = shared_library(
1667 include_directories : includes,
1668 link_args : ['-shared',
1669 '-Wl,--version-script=' + version_script_arg],
1670 link_with : [libsystemd_static,
1672 dependencies : [threads,
1675 link_depends : pam_systemd_sym,
1677 install_dir : pamlibdir)
1679 test('dlopen-pam_systemd',
1681 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1685 if conf.get('HAVE_PAM') == 1
1686 executable('systemd-user-sessions',
1687 'src/user-sessions/user-sessions.c',
1688 include_directories : includes,
1689 link_with : [libshared],
1690 install_rpath : rootlibexecdir,
1692 install_dir : rootlibexecdir)
1695 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1696 exe = executable('bootctl',
1697 'src/boot/bootctl.c',
1698 include_directories : includes,
1699 link_with : [libshared],
1700 dependencies : [libblkid],
1701 install_rpath : rootlibexecdir,
1703 public_programs += [exe]
1706 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 dependencies : [threads],
1710 install_rpath : rootlibexecdir,
1712 public_programs += [exe]
1714 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1715 include_directories : includes,
1716 link_with : [libshared],
1717 dependencies : [threads,
1722 install_rpath : rootlibexecdir,
1724 install_dir : rootbindir)
1725 public_programs += [exe]
1727 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1728 meson.add_install_script(meson_make_symlink,
1729 join_paths(rootbindir, 'systemctl'),
1730 join_paths(rootsbindir, alias))
1733 if conf.get('ENABLE_BACKLIGHT') == 1
1734 executable('systemd-backlight',
1735 'src/backlight/backlight.c',
1736 include_directories : includes,
1737 link_with : [libshared],
1738 install_rpath : rootlibexecdir,
1740 install_dir : rootlibexecdir)
1743 if conf.get('ENABLE_RFKILL') == 1
1744 executable('systemd-rfkill',
1745 'src/rfkill/rfkill.c',
1746 include_directories : includes,
1747 link_with : [libshared],
1748 install_rpath : rootlibexecdir,
1750 install_dir : rootlibexecdir)
1753 executable('systemd-system-update-generator',
1754 'src/system-update-generator/system-update-generator.c',
1755 include_directories : includes,
1756 link_with : [libshared],
1757 install_rpath : rootlibexecdir,
1759 install_dir : systemgeneratordir)
1761 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1762 executable('systemd-cryptsetup',
1763 'src/cryptsetup/cryptsetup.c',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 dependencies : [libcryptsetup],
1767 install_rpath : rootlibexecdir,
1769 install_dir : rootlibexecdir)
1771 executable('systemd-cryptsetup-generator',
1772 'src/cryptsetup/cryptsetup-generator.c',
1773 include_directories : includes,
1774 link_with : [libshared],
1775 dependencies : [libcryptsetup],
1776 install_rpath : rootlibexecdir,
1778 install_dir : systemgeneratordir)
1780 executable('systemd-veritysetup',
1781 'src/veritysetup/veritysetup.c',
1782 include_directories : includes,
1783 link_with : [libshared],
1784 dependencies : [libcryptsetup],
1785 install_rpath : rootlibexecdir,
1787 install_dir : rootlibexecdir)
1789 executable('systemd-veritysetup-generator',
1790 'src/veritysetup/veritysetup-generator.c',
1791 include_directories : includes,
1792 link_with : [libshared],
1793 dependencies : [libcryptsetup],
1794 install_rpath : rootlibexecdir,
1796 install_dir : systemgeneratordir)
1799 if conf.get('HAVE_SYSV_COMPAT') == 1
1800 executable('systemd-sysv-generator',
1801 'src/sysv-generator/sysv-generator.c',
1802 include_directories : includes,
1803 link_with : [libshared],
1804 install_rpath : rootlibexecdir,
1806 install_dir : systemgeneratordir)
1808 executable('systemd-rc-local-generator',
1809 'src/rc-local-generator/rc-local-generator.c',
1810 include_directories : includes,
1811 link_with : [libshared],
1812 install_rpath : rootlibexecdir,
1814 install_dir : systemgeneratordir)
1817 if conf.get('ENABLE_HOSTNAMED') == 1
1818 executable('systemd-hostnamed',
1819 'src/hostname/hostnamed.c',
1820 include_directories : includes,
1821 link_with : [libshared],
1822 install_rpath : rootlibexecdir,
1824 install_dir : rootlibexecdir)
1826 exe = executable('hostnamectl',
1827 'src/hostname/hostnamectl.c',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 install_rpath : rootlibexecdir,
1832 public_programs += [exe]
1835 if conf.get('ENABLE_LOCALED') == 1
1836 if conf.get('HAVE_XKBCOMMON') == 1
1837 # logind will load libxkbcommon.so dynamically on its own
1843 executable('systemd-localed',
1844 systemd_localed_sources,
1845 include_directories : includes,
1846 link_with : [libshared],
1847 dependencies : deps,
1848 install_rpath : rootlibexecdir,
1850 install_dir : rootlibexecdir)
1852 exe = executable('localectl',
1854 include_directories : includes,
1855 link_with : [libshared],
1856 install_rpath : rootlibexecdir,
1858 public_programs += [exe]
1861 if conf.get('ENABLE_TIMEDATED') == 1
1862 executable('systemd-timedated',
1863 'src/timedate/timedated.c',
1864 include_directories : includes,
1865 link_with : [libshared],
1866 install_rpath : rootlibexecdir,
1868 install_dir : rootlibexecdir)
1870 exe = executable('timedatectl',
1871 'src/timedate/timedatectl.c',
1872 include_directories : includes,
1873 install_rpath : rootlibexecdir,
1874 link_with : [libshared],
1876 public_programs += [exe]
1879 if conf.get('ENABLE_TIMESYNCD') == 1
1880 executable('systemd-timesyncd',
1881 systemd_timesyncd_sources,
1882 include_directories : includes,
1883 link_with : [libshared],
1884 dependencies : [threads,
1886 install_rpath : rootlibexecdir,
1888 install_dir : rootlibexecdir)
1890 executable('systemd-time-wait-sync',
1891 'src/time-wait-sync/time-wait-sync.c',
1892 include_directories : includes,
1893 link_with : [libshared],
1894 install_rpath : rootlibexecdir,
1896 install_dir : rootlibexecdir)
1899 if conf.get('ENABLE_MACHINED') == 1
1900 executable('systemd-machined',
1901 systemd_machined_sources,
1902 include_directories : includes,
1903 link_with : [libmachine_core,
1905 install_rpath : rootlibexecdir,
1907 install_dir : rootlibexecdir)
1909 exe = executable('machinectl',
1910 'src/machine/machinectl.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 dependencies : [threads,
1916 install_rpath : rootlibexecdir,
1918 install_dir : rootbindir)
1919 public_programs += [exe]
1922 if conf.get('ENABLE_IMPORTD') == 1
1923 executable('systemd-importd',
1924 systemd_importd_sources,
1925 include_directories : includes,
1926 link_with : [libshared],
1927 dependencies : [threads],
1928 install_rpath : rootlibexecdir,
1930 install_dir : rootlibexecdir)
1932 systemd_pull = executable('systemd-pull',
1933 systemd_pull_sources,
1934 include_directories : includes,
1935 link_with : [libshared],
1936 dependencies : [libcurl,
1941 install_rpath : rootlibexecdir,
1943 install_dir : rootlibexecdir)
1945 systemd_import = executable('systemd-import',
1946 systemd_import_sources,
1947 include_directories : includes,
1948 link_with : [libshared],
1949 dependencies : [libcurl,
1953 install_rpath : rootlibexecdir,
1955 install_dir : rootlibexecdir)
1957 systemd_export = executable('systemd-export',
1958 systemd_export_sources,
1959 include_directories : includes,
1960 link_with : [libshared],
1961 dependencies : [libcurl,
1965 install_rpath : rootlibexecdir,
1967 install_dir : rootlibexecdir)
1968 public_programs += [systemd_pull, systemd_import, systemd_export]
1971 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1972 exe = executable('systemd-journal-upload',
1973 systemd_journal_upload_sources,
1974 include_directories : includes,
1975 link_with : [libshared],
1976 dependencies : [threads,
1981 install_rpath : rootlibexecdir,
1983 install_dir : rootlibexecdir)
1984 public_programs += [exe]
1987 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1988 s_j_remote = executable('systemd-journal-remote',
1989 systemd_journal_remote_sources,
1990 include_directories : includes,
1991 link_with : [libshared],
1992 dependencies : [threads,
1997 install_rpath : rootlibexecdir,
1999 install_dir : rootlibexecdir)
2001 s_j_gatewayd = executable('systemd-journal-gatewayd',
2002 systemd_journal_gatewayd_sources,
2003 include_directories : includes,
2004 link_with : [libshared],
2005 dependencies : [threads,
2010 install_rpath : rootlibexecdir,
2012 install_dir : rootlibexecdir)
2013 public_programs += [s_j_remote, s_j_gatewayd]
2016 if conf.get('ENABLE_COREDUMP') == 1
2017 executable('systemd-coredump',
2018 systemd_coredump_sources,
2019 include_directories : includes,
2020 link_with : [libshared],
2021 dependencies : [threads,
2026 install_rpath : rootlibexecdir,
2028 install_dir : rootlibexecdir)
2030 exe = executable('coredumpctl',
2031 coredumpctl_sources,
2032 include_directories : includes,
2033 link_with : [libshared],
2034 dependencies : [threads,
2037 install_rpath : rootlibexecdir,
2039 public_programs += [exe]
2042 if conf.get('ENABLE_BINFMT') == 1
2043 exe = executable('systemd-binfmt',
2044 'src/binfmt/binfmt.c',
2045 include_directories : includes,
2046 link_with : [libshared],
2047 install_rpath : rootlibexecdir,
2049 install_dir : rootlibexecdir)
2050 public_programs += [exe]
2052 meson.add_install_script('sh', '-c',
2053 mkdir_p.format(binfmtdir))
2054 meson.add_install_script('sh', '-c',
2055 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2058 if conf.get('ENABLE_VCONSOLE') == 1
2059 executable('systemd-vconsole-setup',
2060 'src/vconsole/vconsole-setup.c',
2061 include_directories : includes,
2062 link_with : [libshared],
2063 install_rpath : rootlibexecdir,
2065 install_dir : rootlibexecdir)
2068 if conf.get('ENABLE_RANDOMSEED') == 1
2069 executable('systemd-random-seed',
2070 'src/random-seed/random-seed.c',
2071 include_directories : includes,
2072 link_with : [libshared],
2073 install_rpath : rootlibexecdir,
2075 install_dir : rootlibexecdir)
2078 if conf.get('ENABLE_FIRSTBOOT') == 1
2079 executable('systemd-firstboot',
2080 'src/firstboot/firstboot.c',
2081 include_directories : includes,
2082 link_with : [libshared],
2083 dependencies : [libcrypt],
2084 install_rpath : rootlibexecdir,
2086 install_dir : rootbindir)
2089 executable('systemd-remount-fs',
2090 'src/remount-fs/remount-fs.c',
2091 'src/core/mount-setup.c',
2092 'src/core/mount-setup.h',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 install_rpath : rootlibexecdir,
2097 install_dir : rootlibexecdir)
2099 executable('systemd-machine-id-setup',
2100 'src/machine-id-setup/machine-id-setup-main.c',
2101 'src/core/machine-id-setup.c',
2102 'src/core/machine-id-setup.h',
2103 include_directories : includes,
2104 link_with : [libshared],
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootbindir)
2109 executable('systemd-fsck',
2111 include_directories : includes,
2112 link_with : [libshared],
2113 install_rpath : rootlibexecdir,
2115 install_dir : rootlibexecdir)
2117 executable('systemd-growfs',
2118 'src/partition/growfs.c',
2119 include_directories : includes,
2120 link_with : [libshared],
2121 dependencies : [libcryptsetup],
2122 install_rpath : rootlibexecdir,
2124 install_dir : rootlibexecdir)
2126 executable('systemd-makefs',
2127 'src/partition/makefs.c',
2128 include_directories : includes,
2129 link_with : [libshared],
2130 install_rpath : rootlibexecdir,
2132 install_dir : rootlibexecdir)
2134 executable('systemd-sleep',
2135 'src/sleep/sleep.c',
2136 include_directories : includes,
2137 link_with : [libshared],
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootlibexecdir)
2142 exe = executable('systemd-sysctl',
2143 'src/sysctl/sysctl.c',
2144 include_directories : includes,
2145 link_with : [libshared],
2146 install_rpath : rootlibexecdir,
2148 install_dir : rootlibexecdir)
2149 public_programs += [exe]
2151 executable('systemd-ac-power',
2152 'src/ac-power/ac-power.c',
2153 include_directories : includes,
2154 link_with : [libshared],
2155 install_rpath : rootlibexecdir,
2157 install_dir : rootlibexecdir)
2159 exe = executable('systemd-detect-virt',
2160 'src/detect-virt/detect-virt.c',
2161 include_directories : includes,
2162 link_with : [libshared],
2163 install_rpath : rootlibexecdir,
2165 public_programs += [exe]
2167 exe = executable('systemd-delta',
2168 'src/delta/delta.c',
2169 include_directories : includes,
2170 link_with : [libshared],
2171 install_rpath : rootlibexecdir,
2173 public_programs += [exe]
2175 exe = executable('systemd-escape',
2176 'src/escape/escape.c',
2177 include_directories : includes,
2178 link_with : [libshared],
2179 install_rpath : rootlibexecdir,
2181 install_dir : rootbindir)
2182 public_programs += [exe]
2184 exe = executable('systemd-notify',
2185 'src/notify/notify.c',
2186 include_directories : includes,
2187 link_with : [libshared],
2188 install_rpath : rootlibexecdir,
2190 install_dir : rootbindir)
2191 public_programs += [exe]
2193 executable('systemd-volatile-root',
2194 'src/volatile-root/volatile-root.c',
2195 include_directories : includes,
2196 link_with : [libshared],
2197 install_rpath : rootlibexecdir,
2199 install_dir : rootlibexecdir)
2201 executable('systemd-cgroups-agent',
2202 'src/cgroups-agent/cgroups-agent.c',
2203 include_directories : includes,
2204 link_with : [libshared],
2205 install_rpath : rootlibexecdir,
2207 install_dir : rootlibexecdir)
2209 exe = executable('systemd-path',
2211 include_directories : includes,
2212 link_with : [libshared],
2213 install_rpath : rootlibexecdir,
2215 public_programs += [exe]
2217 exe = executable('systemd-ask-password',
2218 'src/ask-password/ask-password.c',
2219 include_directories : includes,
2220 link_with : [libshared],
2221 install_rpath : rootlibexecdir,
2223 install_dir : rootbindir)
2224 public_programs += [exe]
2226 executable('systemd-reply-password',
2227 'src/reply-password/reply-password.c',
2228 include_directories : includes,
2229 link_with : [libshared],
2230 install_rpath : rootlibexecdir,
2232 install_dir : rootlibexecdir)
2234 exe = executable('systemd-tty-ask-password-agent',
2235 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2236 include_directories : includes,
2237 link_with : [libshared],
2238 install_rpath : rootlibexecdir,
2240 install_dir : rootbindir)
2241 public_programs += [exe]
2243 exe = executable('systemd-cgls',
2245 include_directories : includes,
2246 link_with : [libshared],
2247 install_rpath : rootlibexecdir,
2249 public_programs += [exe]
2251 exe = executable('systemd-cgtop',
2252 'src/cgtop/cgtop.c',
2253 include_directories : includes,
2254 link_with : [libshared],
2255 install_rpath : rootlibexecdir,
2257 public_programs += [exe]
2259 executable('systemd-initctl',
2260 'src/initctl/initctl.c',
2261 include_directories : includes,
2262 link_with : [libshared],
2263 install_rpath : rootlibexecdir,
2265 install_dir : rootlibexecdir)
2267 exe = executable('systemd-mount',
2268 'src/mount/mount-tool.c',
2269 include_directories : includes,
2270 link_with : [libshared],
2271 install_rpath : rootlibexecdir,
2273 public_programs += [exe]
2275 meson.add_install_script(meson_make_symlink,
2276 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2278 exe = executable('systemd-run',
2280 include_directories : includes,
2281 link_with : [libshared],
2282 install_rpath : rootlibexecdir,
2284 public_programs += [exe]
2286 exe = executable('systemd-stdio-bridge',
2287 'src/stdio-bridge/stdio-bridge.c',
2288 include_directories : includes,
2289 link_with : [libshared],
2290 install_rpath : rootlibexecdir,
2292 public_programs += [exe]
2294 exe = executable('busctl',
2295 'src/busctl/busctl.c',
2296 'src/busctl/busctl-introspect.c',
2297 'src/busctl/busctl-introspect.h',
2298 include_directories : includes,
2299 link_with : [libshared],
2300 install_rpath : rootlibexecdir,
2302 public_programs += [exe]
2304 if conf.get('ENABLE_SYSUSERS') == 1
2305 exe = executable('systemd-sysusers',
2306 'src/sysusers/sysusers.c',
2307 include_directories : includes,
2308 link_with : [libshared],
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootbindir)
2312 public_programs += [exe]
2315 if conf.get('ENABLE_TMPFILES') == 1
2316 exe = executable('systemd-tmpfiles',
2317 'src/tmpfiles/tmpfiles.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 dependencies : [libacl],
2321 install_rpath : rootlibexecdir,
2323 install_dir : rootbindir)
2324 public_programs += [exe]
2326 test('test-systemd-tmpfiles',
2327 test_systemd_tmpfiles_py,
2328 args : exe.full_path())
2329 # https://github.com/mesonbuild/meson/issues/2681
2332 if conf.get('ENABLE_HWDB') == 1
2333 exe = executable('systemd-hwdb',
2335 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2336 include_directories : includes,
2337 link_with : [libudev_static],
2338 install_rpath : udev_rpath,
2340 install_dir : rootbindir)
2341 public_programs += [exe]
2344 if conf.get('ENABLE_QUOTACHECK') == 1
2345 executable('systemd-quotacheck',
2346 'src/quotacheck/quotacheck.c',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 install_rpath : rootlibexecdir,
2351 install_dir : rootlibexecdir)
2354 exe = executable('systemd-socket-proxyd',
2355 'src/socket-proxy/socket-proxyd.c',
2356 include_directories : includes,
2357 link_with : [libshared],
2358 dependencies : [threads],
2359 install_rpath : rootlibexecdir,
2361 install_dir : rootlibexecdir)
2362 public_programs += [exe]
2364 exe = executable('systemd-udevd',
2365 systemd_udevd_sources,
2366 include_directories : includes,
2367 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2368 link_with : [libudev_core,
2371 dependencies : [threads,
2376 install_rpath : udev_rpath,
2378 install_dir : rootlibexecdir)
2379 public_programs += [exe]
2381 exe = executable('udevadm',
2383 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2384 include_directories : includes,
2385 link_with : [libudev_core,
2388 dependencies : [threads,
2393 install_rpath : udev_rpath,
2395 install_dir : rootbindir)
2396 public_programs += [exe]
2398 executable('systemd-shutdown',
2399 systemd_shutdown_sources,
2400 include_directories : includes,
2401 link_with : [libshared],
2402 dependencies : [libmount],
2403 install_rpath : rootlibexecdir,
2405 install_dir : rootlibexecdir)
2407 executable('systemd-update-done',
2408 'src/update-done/update-done.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2413 install_dir : rootlibexecdir)
2415 executable('systemd-update-utmp',
2416 'src/update-utmp/update-utmp.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 dependencies : [libaudit],
2420 install_rpath : rootlibexecdir,
2422 install_dir : rootlibexecdir)
2424 if conf.get('HAVE_KMOD') == 1
2425 executable('systemd-modules-load',
2426 'src/modules-load/modules-load.c',
2427 include_directories : includes,
2428 link_with : [libshared],
2429 dependencies : [libkmod],
2430 install_rpath : rootlibexecdir,
2432 install_dir : rootlibexecdir)
2434 meson.add_install_script('sh', '-c',
2435 mkdir_p.format(modulesloaddir))
2436 meson.add_install_script('sh', '-c',
2437 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2440 exe = executable('systemd-nspawn',
2441 systemd_nspawn_sources,
2442 'src/core/mount-setup.c', # FIXME: use a variable?
2443 'src/core/mount-setup.h',
2444 'src/core/loopback-setup.c',
2445 'src/core/loopback-setup.h',
2446 include_directories : [includes, include_directories('src/nspawn')],
2447 link_with : [libshared],
2448 dependencies : [libacl,
2452 install_rpath : rootlibexecdir,
2454 public_programs += [exe]
2456 if conf.get('ENABLE_NETWORKD') == 1
2457 executable('systemd-networkd',
2458 systemd_networkd_sources,
2459 include_directories : includes,
2460 link_with : [libnetworkd_core,
2464 dependencies : [threads],
2465 install_rpath : rootlibexecdir,
2467 install_dir : rootlibexecdir)
2469 executable('systemd-networkd-wait-online',
2470 systemd_networkd_wait_online_sources,
2471 include_directories : includes,
2472 link_with : [libnetworkd_core,
2474 install_rpath : rootlibexecdir,
2476 install_dir : rootlibexecdir)
2478 exe = executable('networkctl',
2480 include_directories : includes,
2481 link_with : [libsystemd_network,
2483 install_rpath : rootlibexecdir,
2485 install_dir : rootbindir)
2486 public_programs += [exe]
2489 executable('systemd-sulogin-shell',
2490 ['src/sulogin-shell/sulogin-shell.c'],
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2495 install_dir : rootlibexecdir)
2497 ############################################################
2499 foreach tuple : tests
2501 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2502 dependencies = tuple[2]
2503 condition = tuple.length() >= 4 ? tuple[3] : ''
2504 type = tuple.length() >= 5 ? tuple[4] : ''
2505 defs = tuple.length() >= 6 ? tuple[5] : []
2506 incs = tuple.length() >= 7 ? tuple[6] : includes
2509 name = sources[0].split('/')[-1].split('.')[0]
2510 if type.startswith('timeout=')
2511 timeout = type.split('=')[1].to_int()
2514 if want_tests == 'false'
2515 message('Not compiling @0@ because tests is set to false'.format(name))
2516 elif condition == '' or conf.get(condition) == 1
2520 include_directories : incs,
2521 link_with : link_with,
2522 dependencies : dependencies,
2524 install_rpath : rootlibexecdir,
2525 install : install_tests,
2526 install_dir : join_paths(testsdir, type))
2529 message('@0@ is a manual test'.format(name))
2530 elif type == 'unsafe' and want_tests != 'unsafe'
2531 message('@0@ is an unsafe test'.format(name))
2538 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2542 test_libsystemd_sym = executable(
2543 'test-libsystemd-sym',
2544 test_libsystemd_sym_c,
2545 include_directories : includes,
2546 link_with : [libsystemd],
2547 install : install_tests,
2548 install_dir : testsdir)
2549 test('test-libsystemd-sym',
2550 test_libsystemd_sym)
2552 test_libudev_sym = executable(
2555 include_directories : includes,
2556 c_args : ['-Wno-deprecated-declarations'],
2557 link_with : [libudev],
2558 install : install_tests,
2559 install_dir : testsdir)
2560 test('test-libudev-sym',
2563 ############################################################
2567 foreach tuple : fuzzers
2569 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2570 dependencies = tuple[2]
2571 defs = tuple.length() >= 4 ? tuple[3] : []
2572 incs = tuple.length() >= 5 ? tuple[4] : includes
2575 dependencies += fuzzing_engine
2577 sources += 'src/fuzz/fuzz-main.c'
2580 name = sources[0].split('/')[-1].split('.')[0]
2582 fuzzer_exes += executable(
2585 include_directories : [incs, include_directories('src/fuzz')],
2586 link_with : link_with,
2587 dependencies : dependencies,
2592 run_target('fuzzers',
2593 depends : fuzzer_exes,
2596 ############################################################
2598 make_directive_index_py = find_program('tools/make-directive-index.py')
2599 make_man_index_py = find_program('tools/make-man-index.py')
2600 xml_helper_py = find_program('tools/xml_helper.py')
2601 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2605 subdir('sysusers.d')
2606 subdir('tmpfiles.d')
2611 subdir('shell-completion/bash')
2612 subdir('shell-completion/zsh')
2613 subdir('docs/sysvinit')
2614 subdir('docs/var-log')
2616 # FIXME: figure out if the warning is true:
2617 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2618 install_subdir('factory/etc',
2619 install_dir : factorydir)
2622 install_data('xorg/50-systemd-user.sh',
2623 install_dir : xinitrcdir)
2624 install_data('modprobe.d/systemd.conf',
2625 install_dir : modprobedir)
2626 install_data('LICENSE.GPL2',
2631 'doc/DISTRO_PORTING',
2632 'doc/ENVIRONMENT.md',
2634 'doc/TRANSIENT-SETTINGS.md',
2637 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2638 install_dir : docdir)
2640 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2641 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2643 ############################################################
2645 meson_check_help = find_program('tools/meson-check-help.sh')
2647 foreach exec : public_programs
2648 name = exec.full_path().split('/')[-1]
2649 test('check-help-' + name,
2651 args : [exec.full_path()])
2654 ############################################################
2656 # Enable tests for all supported sanitizers
2657 foreach tuple : sanitizers
2658 sanitizer = tuple[0]
2661 have = run_command(check_compilation_sh,
2662 cc.cmd_array(), '-x', 'c',
2663 '-fsanitize=@0@'.format(sanitizer),
2664 '-include', link_test_c).returncode() == 0
2665 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2669 foreach p : fuzz_regression_tests
2670 b = p.split('/')[-2]
2671 c = p.split('/')[-1]
2673 name = '@0@:@1@'.format(b, sanitizer)
2676 if want_tests == 'false'
2677 message('Not compiling @0@ because tests is set to false'.format(name))
2679 exe = custom_target(
2683 command : [env, 'ln', '-fs',
2684 join_paths(build.full_path(), b),
2686 build_by_default : true)
2688 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2693 if want_tests != 'false' and slow_tests
2694 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2696 args : [exe.full_path(),
2697 join_paths(meson.source_root(),
2698 'test/fuzz-regressions',
2706 ############################################################
2709 all_files = run_command(
2711 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2714 all_files = files(all_files.stdout().split())
2719 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2723 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2727 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2730 command : [meson_git_contrib_sh])
2734 git_head = run_command(
2736 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2737 'rev-parse', 'HEAD']).stdout().strip()
2738 git_head_short = run_command(
2740 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2741 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2745 command : ['git', 'archive',
2746 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2748 '--prefix', 'systemd-@0@/'.format(git_head),
2752 ############################################################
2754 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2757 depends : [man, libsystemd, libudev],
2758 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2760 ############################################################
2763 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2765 'split /usr: @0@'.format(split_usr),
2766 'split bin-sbin: @0@'.format(split_bin),
2767 'prefix directory: @0@'.format(prefixdir),
2768 'rootprefix directory: @0@'.format(rootprefixdir),
2769 'sysconf directory: @0@'.format(sysconfdir),
2770 'include directory: @0@'.format(includedir),
2771 'lib directory: @0@'.format(libdir),
2772 'rootlib directory: @0@'.format(rootlibdir),
2773 'SysV init scripts: @0@'.format(sysvinit_path),
2774 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2775 'PAM modules directory: @0@'.format(pamlibdir),
2776 'PAM configuration directory: @0@'.format(pamconfdir),
2777 'RPM macros directory: @0@'.format(rpmmacrosdir),
2778 'modprobe.d directory: @0@'.format(modprobedir),
2779 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2780 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2781 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2782 'bash completions directory: @0@'.format(bashcompletiondir),
2783 'zsh completions directory: @0@'.format(zshcompletiondir),
2784 'extra start script: @0@'.format(get_option('rc-local')),
2785 'extra stop script: @0@'.format(get_option('halt-local')),
2786 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2787 get_option('debug-tty')),
2788 'TTY GID: @0@'.format(tty_gid),
2789 'users GID: @0@'.format(users_gid),
2790 'maximum system UID: @0@'.format(system_uid_max),
2791 'maximum system GID: @0@'.format(system_gid_max),
2792 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2793 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2794 'minimum container UID base: @0@'.format(container_uid_base_min),
2795 'maximum container UID base: @0@'.format(container_uid_base_max),
2796 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2797 'render group access mode: @0@'.format(get_option('group-render-mode')),
2798 'certificate root directory: @0@'.format(get_option('certificate-root')),
2799 'support URL: @0@'.format(support_url),
2800 'nobody user name: @0@'.format(nobody_user),
2801 'nobody group name: @0@'.format(nobody_group),
2802 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2803 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2805 'default DNSSEC mode: @0@'.format(default_dnssec),
2806 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2807 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2809 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2810 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2812 'default DNS servers: @0@'.format(alt_dns_servers),
2813 'default NTP servers: @0@'.format(alt_ntp_servers)]
2815 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2816 '@@0@'.format(time_epoch)).stdout().strip()
2818 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2821 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2822 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2823 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2825 if conf.get('ENABLE_EFI') == 1
2827 'efi arch: @0@'.format(efi_arch)]
2831 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2832 'EFI CC @0@'.format(efi_cc),
2833 'EFI lib directory: @0@'.format(efi_libdir),
2834 'EFI lds directory: @0@'.format(efi_ldsdir),
2835 'EFI include directory: @0@'.format(efi_incdir)]
2888 ['legacy pkla', install_polkit_pkla],
2890 ['gnu-efi', have_gnu_efi],
2897 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2900 ['man pages', want_man],
2901 ['html pages', want_html],
2902 ['man page indices', want_man and have_lxml],
2907 ['adm group', get_option('adm-group')],
2908 ['wheel group', get_option('wheel-group')],
2911 ['debug mmap cache'],
2914 if tuple.length() >= 2
2917 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2918 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2919 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2924 missing += [tuple[0]]
2930 'enabled features: @0@'.format(', '.join(found)),
2932 'disabled features: @0@'.format(', '.join(missing)),
2934 message('\n '.join(status))
2936 if rootprefixdir != rootprefix_default
2937 message('WARNING:\n' +
2938 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2939 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2940 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))