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.21.0'
31 libudev_version = '1.6.9'
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 split_usr = get_option('split-usr')
58 conf.set10('HAVE_SPLIT_USR', split_usr)
60 rootprefixdir = get_option('rootprefix')
61 # Unusual rootprefixdir values are used by some distros
62 # (see https://github.com/systemd/systemd/pull/7461).
63 rootprefix_default = get_option('split-usr') ? '/' : '/usr'
64 if rootprefixdir == ''
65 rootprefixdir = rootprefix_default
68 sysvinit_path = get_option('sysvinit-path')
69 sysvrcnd_path = get_option('sysvrcnd-path')
70 have = sysvinit_path != '' and sysvrcnd_path != ''
71 conf.set10('HAVE_SYSV_COMPAT', have,
72 description : 'SysV init scripts and rcN.d links are supported')
73 m4_defines += have ? ['-DHAVE_SYSV_COMPAT'] : []
75 # join_paths ignore the preceding arguments if an absolute component is
76 # encountered, so this should canonicalize various paths when they are
77 # absolute or relative.
78 prefixdir = get_option('prefix')
79 if not prefixdir.startswith('/')
80 error('Prefix is not absolute: "@0@"'.format(prefixdir))
82 bindir = join_paths(prefixdir, get_option('bindir'))
83 libdir = join_paths(prefixdir, get_option('libdir'))
84 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
85 includedir = join_paths(prefixdir, get_option('includedir'))
86 datadir = join_paths(prefixdir, get_option('datadir'))
87 localstatedir = join_paths('/', get_option('localstatedir'))
89 rootbindir = join_paths(rootprefixdir, 'bin')
90 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
92 rootlibdir = get_option('rootlibdir')
94 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
97 # Dirs of external packages
98 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
99 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
100 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
101 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
102 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
103 varlogdir = join_paths(localstatedir, 'log')
104 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
105 rpmmacrosdir = get_option('rpmmacrosdir')
106 if rpmmacrosdir != 'no'
107 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
109 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
112 pkgdatadir = join_paths(datadir, 'systemd')
113 environmentdir = join_paths(prefixdir, 'lib/environment.d')
114 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
115 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
116 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
117 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
118 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
119 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
120 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
121 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
122 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
123 pkgincludedir = join_paths(includedir, 'systemd')
124 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
125 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
126 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
127 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
128 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
129 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
130 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
131 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
132 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
133 udevhomedir = udevlibexecdir
134 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
135 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
136 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
137 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
138 factorydir = join_paths(datadir, 'factory')
139 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
140 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
141 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
142 catalogstatedir = join_paths(systemdstatedir, 'catalog')
143 randomseeddir = join_paths(localstatedir, 'lib/systemd')
145 docdir = get_option('docdir')
147 docdir = join_paths(datadir, 'doc/systemd')
150 dbuspolicydir = get_option('dbuspolicydir')
151 if dbuspolicydir == ''
152 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
155 dbussessionservicedir = get_option('dbussessionservicedir')
156 if dbussessionservicedir == ''
157 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
160 dbussystemservicedir = get_option('dbussystemservicedir')
161 if dbussystemservicedir == ''
162 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
165 pamlibdir = get_option('pamlibdir')
167 pamlibdir = join_paths(rootlibdir, 'security')
170 pamconfdir = get_option('pamconfdir')
172 pamconfdir = join_paths(sysconfdir, 'pam.d')
175 memory_accounting_default = get_option('memory-accounting-default')
177 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
178 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
179 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
180 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
181 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
182 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
183 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
184 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
185 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
186 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
187 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
188 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
189 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
190 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
191 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
192 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
193 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
194 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
195 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
196 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
197 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
198 conf.set_quoted('ROOTPREFIX', rootprefixdir)
199 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
200 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
201 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
202 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
203 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
204 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
205 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
206 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
207 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
208 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
209 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
210 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
211 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
212 conf.set_quoted('LIBDIR', libdir)
213 conf.set_quoted('ROOTLIBDIR', rootlibdir)
214 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
215 conf.set_quoted('BOOTLIBDIR', bootlibdir)
216 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
217 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
218 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
219 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
220 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
221 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
222 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
223 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_ON_OFF', memory_accounting_default ? 'on' : 'off')
225 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
226 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
228 substs.set('prefix', prefixdir)
229 substs.set('exec_prefix', prefixdir)
230 substs.set('libdir', libdir)
231 substs.set('rootlibdir', rootlibdir)
232 substs.set('includedir', includedir)
233 substs.set('pkgsysconfdir', pkgsysconfdir)
234 substs.set('bindir', bindir)
235 substs.set('rootbindir', rootbindir)
236 substs.set('rootlibexecdir', rootlibexecdir)
237 substs.set('systemunitdir', systemunitdir)
238 substs.set('userunitdir', userunitdir)
239 substs.set('systempresetdir', systempresetdir)
240 substs.set('userpresetdir', userpresetdir)
241 substs.set('udevhwdbdir', udevhwdbdir)
242 substs.set('udevrulesdir', udevrulesdir)
243 substs.set('udevlibexecdir', udevlibexecdir)
244 substs.set('catalogdir', catalogdir)
245 substs.set('tmpfilesdir', tmpfilesdir)
246 substs.set('sysusersdir', sysusersdir)
247 substs.set('sysctldir', sysctldir)
248 substs.set('binfmtdir', binfmtdir)
249 substs.set('modulesloaddir', modulesloaddir)
250 substs.set('systemgeneratordir', systemgeneratordir)
251 substs.set('usergeneratordir', usergeneratordir)
252 substs.set('systemenvgeneratordir', systemenvgeneratordir)
253 substs.set('userenvgeneratordir', userenvgeneratordir)
254 substs.set('systemshutdowndir', systemshutdowndir)
255 substs.set('systemsleepdir', systemsleepdir)
256 substs.set('VARLOGDIR', varlogdir)
257 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
258 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
259 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
260 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
261 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
262 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
263 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
264 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
266 #####################################################################
268 cc = meson.get_compiler('c')
269 pkgconfig = import('pkgconfig')
270 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
271 meson_build_sh = find_program('tools/meson-build.sh')
273 if get_option('tests') != 'false'
274 cxx = find_program('c++', required : false)
276 # Used only for tests
281 want_ossfuzz = get_option('oss-fuzz')
282 want_libfuzzer = get_option('llvm-fuzz')
283 fuzzer_build = want_ossfuzz or want_libfuzzer
284 if want_ossfuzz and want_libfuzzer
285 error('only one of oss-fuzz and llvm-fuzz can be specified')
288 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
291 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
294 foreach arg : ['-Wextra',
297 '-Wmissing-include-dirs',
298 '-Wold-style-definition',
301 '-Wdeclaration-after-statement',
303 '-Wsuggest-attribute=noreturn',
304 '-Werror=missing-prototypes',
305 '-Werror=implicit-function-declaration',
306 '-Werror=missing-declarations',
307 '-Werror=return-type',
308 '-Werror=incompatible-pointer-types',
310 '-Wstrict-prototypes',
312 '-Wmissing-noreturn',
313 '-Wimplicit-fallthrough=5',
316 '-Wstrict-aliasing=2',
323 '-fdiagnostics-show-option',
324 '-fno-strict-aliasing',
325 '-fvisibility=hidden',
327 '-fstack-protector-strong',
328 '--param=ssp-buffer-size=4',
330 if cc.has_argument(arg)
331 add_project_arguments(arg, language : 'c')
335 # the oss-fuzz fuzzers are not built with -fPIE, so don't
336 # enable it when we are linking against them
338 if cc.has_argument('-fPIE')
339 add_project_arguments('-fPIE', language : 'c')
343 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
344 # arguments, just emits a warnings. So test for the "positive" version instead.
345 foreach arg : ['unused-parameter',
346 'missing-field-initializers',
349 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
351 if cc.has_argument('-W' + arg)
352 add_project_arguments('-Wno-' + arg, language : 'c')
358 #include <inttypes.h>
359 typedef uint64_t usec_t;
360 usec_t now(clockid_t clock);
365 ''', name : '-Werror=shadow with local shadowing')
366 add_project_arguments('-Werror=shadow', language : 'c')
369 if cc.get_id() == 'clang'
370 foreach arg : ['-Wno-typedef-redefinition',
371 '-Wno-gnu-variable-sized-type-not-at-end',
373 if cc.has_argument(arg,
374 name : '@0@ is supported'.format(arg))
375 add_project_arguments(arg, language : 'c')
380 link_test_c = files('tools/meson-link-test.c')
382 # --as-needed and --no-undefined are provided by meson by default,
383 # run mesonconf to see what is enabled
384 foreach arg : ['-Wl,-z,relro',
389 have = run_command(check_compilation_sh,
390 cc.cmd_array(), '-x', 'c', arg,
391 '-include', link_test_c).returncode() == 0
392 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
393 if have and (arg != '-pie' or not fuzzer_build)
394 add_project_link_arguments(arg, language : 'c')
398 # Check if various sanitizers are supported
400 foreach arg : ['address']
402 have = run_command(check_compilation_sh,
403 cc.cmd_array(), '-x', 'c',
404 '-fsanitize=@0@'.format(arg),
405 '-include', link_test_c).returncode() == 0
406 message('@0@ sanitizer supported: @1@'.format(arg, have ? 'yes' : 'no'))
412 if get_option('buildtype') != 'debug'
413 foreach arg : ['-ffunction-sections',
415 if cc.has_argument(arg,
416 name : '@0@ is supported'.format(arg))
417 add_project_arguments(arg, language : 'c')
421 foreach arg : ['-Wl,--gc-sections']
422 have = run_command(check_compilation_sh,
423 cc.cmd_array(), '-x', 'c', arg,
424 '-include', link_test_c).returncode() == 0
425 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
427 add_project_link_arguments(arg, language : 'c')
432 cpp = ' '.join(cc.cmd_array()) + ' -E'
434 #####################################################################
435 # compilation result tests
437 conf.set('_GNU_SOURCE', true)
438 conf.set('__SANE_USERSPACE_TYPES__', true)
440 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
441 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
442 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
443 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
444 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
445 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
446 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
450 #include <linux/ethtool.h>
451 #include <linux/fib_rules.h>
452 #include <linux/stat.h>
453 #include <sys/stat.h>
455 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
457 foreach decl : ['char16_t',
460 'struct ethtool_link_settings',
461 'struct fib_rule_uid_range',
465 # We get -1 if the size cannot be determined
466 have = cc.sizeof(decl, prefix : decl_headers) > 0
467 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
470 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
471 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
472 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
473 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
474 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
475 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
476 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
477 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
478 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
479 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
480 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
481 # if_tunnel.h is buggy and cannot be included on its own
482 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
483 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
484 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
485 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
486 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
487 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
488 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
489 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
490 ['NDA_IFINDEX', 'linux/neighbour.h'],
491 ['IFA_FLAGS', 'linux/if_addr.h'],
492 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
493 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
494 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
496 prefix = decl.length() > 2 ? decl[2] : ''
497 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
498 conf.set10('HAVE_' + decl[0], have)
501 foreach ident : ['secure_getenv', '__secure_getenv']
502 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
506 ['memfd_create', '''#include <sys/mman.h>'''],
507 ['gettid', '''#include <sys/types.h>
508 #include <unistd.h>'''],
509 ['pivot_root', '''#include <stdlib.h>
510 #include <unistd.h>'''], # no known header declares pivot_root
511 ['name_to_handle_at', '''#include <sys/types.h>
512 #include <sys/stat.h>
513 #include <fcntl.h>'''],
514 ['setns', '''#include <sched.h>'''],
515 ['renameat2', '''#include <stdio.h>
516 #include <fcntl.h>'''],
517 ['kcmp', '''#include <linux/kcmp.h>'''],
518 ['keyctl', '''#include <sys/types.h>
519 #include <keyutils.h>'''],
520 ['copy_file_range', '''#include <sys/syscall.h>
521 #include <unistd.h>'''],
522 ['bpf', '''#include <sys/syscall.h>
523 #include <unistd.h>'''],
524 ['explicit_bzero' , '''#include <string.h>'''],
525 ['statx', '''#include <sys/types.h>
526 #include <sys/stat.h>
527 #include <unistd.h>'''],
530 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
531 conf.set10('HAVE_' + ident[0].to_upper(), have)
534 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
535 conf.set10('USE_SYS_RANDOM_H', true)
536 conf.set10('HAVE_GETRANDOM', true)
538 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
539 conf.set10('USE_SYS_RANDOM_H', false)
540 conf.set10('HAVE_GETRANDOM', have)
543 #####################################################################
545 sed = find_program('sed')
546 awk = find_program('awk')
547 m4 = find_program('m4')
548 stat = find_program('stat')
549 git = find_program('git', required : false)
550 env = find_program('env')
552 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
553 mkdir_p = 'mkdir -p $DESTDIR/@0@'
554 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
555 splash_bmp = files('test/splash.bmp')
557 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
558 # /usr/sbin, /sbin, and fall back to the default from middle column.
559 progs = [['quotaon', '/usr/sbin/quotaon' ],
560 ['quotacheck', '/usr/sbin/quotacheck' ],
561 ['kill', '/usr/bin/kill' ],
562 ['kmod', '/usr/bin/kmod' ],
563 ['kexec', '/usr/sbin/kexec' ],
564 ['sulogin', '/usr/sbin/sulogin' ],
565 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
566 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
567 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
568 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
571 path = get_option(prog[0] + '-path')
573 message('Using @1@ for @0@'.format(prog[0], path))
575 exe = find_program(prog[0],
576 '/usr/sbin/' + prog[0],
579 path = exe.found() ? exe.path() : prog[1]
581 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
582 conf.set_quoted(name, path)
583 substs.set(name, path)
586 conf.set_quoted('TELINIT', get_option('telinit-path'))
588 if run_command('ln', '--relative', '--help').returncode() != 0
589 error('ln does not support --relative')
592 ############################################################
594 gperf = find_program('gperf')
596 gperf_test_format = '''
598 const char * in_word_set(const char *, @0@);
601 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
602 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
603 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
604 if cc.compiles(gperf_test)
605 gperf_len_type = 'size_t'
607 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
608 if cc.compiles(gperf_test)
609 gperf_len_type = 'unsigned'
611 error('unable to determine gperf len type')
614 message('gperf len type is @0@'.format(gperf_len_type))
615 conf.set('GPERF_LEN_TYPE', gperf_len_type,
616 description : 'The type of gperf "len" parameter')
618 ############################################################
620 if not cc.has_header('sys/capability.h')
621 error('POSIX caps headers not found')
623 foreach header : ['crypt.h',
626 'linux/vm_sockets.h',
628 'valgrind/memcheck.h',
629 'valgrind/valgrind.h',
632 conf.set10('HAVE_' + header.underscorify().to_upper(),
633 cc.has_header(header))
636 ############################################################
638 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
639 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
640 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
642 default_hierarchy = get_option('default-hierarchy')
643 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
644 description : 'default cgroup hierarchy as string')
645 if default_hierarchy == 'legacy'
646 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
647 elif default_hierarchy == 'hybrid'
648 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
650 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
653 time_epoch = get_option('time-epoch')
656 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
658 time_epoch = time_epoch.to_int()
659 conf.set('TIME_EPOCH', time_epoch)
661 system_uid_max = get_option('system-uid-max')
662 if system_uid_max == ''
663 system_uid_max = run_command(
665 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
666 '/etc/login.defs').stdout().strip()
667 if system_uid_max == ''
668 system_uid_max = '999'
671 system_uid_max = system_uid_max.to_int()
672 conf.set('SYSTEM_UID_MAX', system_uid_max)
673 substs.set('systemuidmax', system_uid_max)
674 message('maximum system UID is @0@'.format(system_uid_max))
676 system_gid_max = get_option('system-gid-max')
677 if system_gid_max == ''
678 system_gid_max = run_command(
680 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
681 '/etc/login.defs').stdout().strip()
682 if system_gid_max == ''
683 system_gid_max = '999'
686 system_gid_max = system_gid_max.to_int()
687 conf.set('SYSTEM_GID_MAX', system_gid_max)
688 substs.set('systemgidmax', system_gid_max)
689 message('maximum system GID is @0@'.format(system_gid_max))
691 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
692 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
693 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
694 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
695 substs.set('dynamicuidmin', dynamic_uid_min)
696 substs.set('dynamicuidmax', dynamic_uid_max)
698 container_uid_base_min = get_option('container-uid-base-min').to_int()
699 container_uid_base_max = get_option('container-uid-base-max').to_int()
700 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
701 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
702 substs.set('containeruidbasemin', container_uid_base_min)
703 substs.set('containeruidbasemax', container_uid_base_max)
705 nobody_user = get_option('nobody-user')
706 nobody_group = get_option('nobody-group')
708 getent_result = run_command('getent', 'passwd', '65534')
709 if getent_result.returncode() == 0
710 name = getent_result.stdout().split(':')[0]
711 if name != nobody_user
712 message('WARNING:\n' +
713 ' 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) +
714 ' Your build will result in an user table setup that is incompatible with the local system.')
717 id_result = run_command('id', '-u', nobody_user)
718 if id_result.returncode() == 0
719 id = id_result.stdout().to_int()
721 message('WARNING:\n' +
722 ' 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) +
723 ' Your build will result in an user table setup that is incompatible with the local system.')
727 getent_result = run_command('getent', 'group', '65534')
728 if getent_result.returncode() == 0
729 name = getent_result.stdout().split(':')[0]
730 if name != nobody_group
731 message('WARNING:\n' +
732 ' 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) +
733 ' Your build will result in an group table setup that is incompatible with the local system.')
736 id_result = run_command('id', '-g', nobody_group)
737 if id_result.returncode() == 0
738 id = id_result.stdout().to_int()
740 message('WARNING:\n' +
741 ' 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) +
742 ' Your build will result in an group table setup that is incompatible with the local system.')
745 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
746 message('WARNING:\n' +
747 ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
748 ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
751 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
752 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
753 substs.set('NOBODY_USER_NAME', nobody_user)
754 substs.set('NOBODY_GROUP_NAME', nobody_group)
756 tty_gid = get_option('tty-gid')
757 conf.set('TTY_GID', tty_gid)
758 substs.set('TTY_GID', tty_gid)
760 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
761 if get_option('users-gid') != ''
762 users_gid = get_option('users-gid').to_int()
766 substs.set('USERS_GID', users_gid)
768 if get_option('adm-group')
769 m4_defines += ['-DENABLE_ADM_GROUP']
772 if get_option('wheel-group')
773 m4_defines += ['-DENABLE_WHEEL_GROUP']
776 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
777 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
779 kill_user_processes = get_option('default-kill-user-processes')
780 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
781 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
783 dns_servers = get_option('dns-servers')
784 conf.set_quoted('DNS_SERVERS', dns_servers)
785 substs.set('DNS_SERVERS', dns_servers)
787 ntp_servers = get_option('ntp-servers')
788 conf.set_quoted('NTP_SERVERS', ntp_servers)
789 substs.set('NTP_SERVERS', ntp_servers)
791 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
793 substs.set('SUSHELL', get_option('debug-shell'))
794 substs.set('DEBUGTTY', get_option('debug-tty'))
796 debug = get_option('debug')
797 enable_debug_hashmap = false
798 enable_debug_mmap_cache = false
800 foreach name : debug.split(',')
802 enable_debug_hashmap = true
803 elif name == 'mmap-cache'
804 enable_debug_mmap_cache = true
806 message('unknown debug option "@0@", ignoring'.format(name))
810 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
811 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
813 #####################################################################
815 threads = dependency('threads')
816 librt = cc.find_library('rt')
817 libm = cc.find_library('m')
818 libdl = cc.find_library('dl')
819 libcrypt = cc.find_library('crypt')
821 libcap = dependency('libcap', required : false)
822 if not libcap.found()
823 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
824 libcap = cc.find_library('cap')
827 libmount = dependency('mount',
829 required : not fuzzer_build)
831 want_seccomp = get_option('seccomp')
832 if want_seccomp != 'false' and not fuzzer_build
833 libseccomp = dependency('libseccomp',
834 version : '>= 2.3.1',
835 required : want_seccomp == 'true')
836 have = libseccomp.found()
841 conf.set10('HAVE_SECCOMP', have)
842 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
844 want_selinux = get_option('selinux')
845 if want_selinux != 'false' and not fuzzer_build
846 libselinux = dependency('libselinux',
847 version : '>= 2.1.9',
848 required : want_selinux == 'true')
849 have = libselinux.found()
854 conf.set10('HAVE_SELINUX', have)
855 m4_defines += have ? ['-DHAVE_SELINUX'] : []
857 want_apparmor = get_option('apparmor')
858 if want_apparmor != 'false' and not fuzzer_build
859 libapparmor = dependency('libapparmor',
860 required : want_apparmor == 'true')
861 have = libapparmor.found()
866 conf.set10('HAVE_APPARMOR', have)
867 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
869 smack_run_label = get_option('smack-run-label')
870 if smack_run_label != ''
871 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
872 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
875 want_polkit = get_option('polkit')
876 install_polkit = false
877 install_polkit_pkla = false
878 if want_polkit != 'false' and not fuzzer_build
879 install_polkit = true
881 libpolkit = dependency('polkit-gobject-1',
883 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
884 message('Old polkit detected, will install pkla files')
885 install_polkit_pkla = true
888 conf.set10('ENABLE_POLKIT', install_polkit)
890 want_acl = get_option('acl')
891 if want_acl != 'false' and not fuzzer_build
892 libacl = cc.find_library('acl', required : want_acl == 'true')
893 have = libacl.found()
898 conf.set10('HAVE_ACL', have)
899 m4_defines += have ? ['-DHAVE_ACL'] : []
901 want_audit = get_option('audit')
902 if want_audit != 'false' and not fuzzer_build
903 libaudit = dependency('audit', required : want_audit == 'true')
904 have = libaudit.found()
909 conf.set10('HAVE_AUDIT', have)
911 want_blkid = get_option('blkid')
912 if want_blkid != 'false' and not fuzzer_build
913 libblkid = dependency('blkid', required : want_blkid == 'true')
914 have = libblkid.found()
919 conf.set10('HAVE_BLKID', have)
921 want_kmod = get_option('kmod')
922 if want_kmod != 'false' and not fuzzer_build
923 libkmod = dependency('libkmod',
925 required : want_kmod == 'true')
926 have = libkmod.found()
931 conf.set10('HAVE_KMOD', have)
933 want_pam = get_option('pam')
934 if want_pam != 'false' and not fuzzer_build
935 libpam = cc.find_library('pam', required : want_pam == 'true')
936 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
937 have = libpam.found() and libpam_misc.found()
943 conf.set10('HAVE_PAM', have)
944 m4_defines += have ? ['-DHAVE_PAM'] : []
946 want_microhttpd = get_option('microhttpd')
947 if want_microhttpd != 'false' and not fuzzer_build
948 libmicrohttpd = dependency('libmicrohttpd',
949 version : '>= 0.9.33',
950 required : want_microhttpd == 'true')
951 have = libmicrohttpd.found()
956 conf.set10('HAVE_MICROHTTPD', have)
957 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
959 want_libcryptsetup = get_option('libcryptsetup')
960 if want_libcryptsetup != 'false' and not fuzzer_build
961 libcryptsetup = dependency('libcryptsetup',
962 version : '>= 1.6.0',
963 required : want_libcryptsetup == 'true')
964 have = libcryptsetup.found()
969 conf.set10('HAVE_LIBCRYPTSETUP', have)
971 want_libcurl = get_option('libcurl')
972 if want_libcurl != 'false' and not fuzzer_build
973 libcurl = dependency('libcurl',
974 version : '>= 7.32.0',
975 required : want_libcurl == 'true')
976 have = libcurl.found()
981 conf.set10('HAVE_LIBCURL', have)
982 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
984 want_libidn = get_option('libidn')
985 want_libidn2 = get_option('libidn2')
986 if want_libidn == 'true' and want_libidn2 == 'true'
987 error('libidn and libidn2 cannot be requested simultaneously')
990 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
991 libidn = dependency('libidn',
992 required : want_libidn == 'true')
993 have = libidn.found()
998 conf.set10('HAVE_LIBIDN', have)
999 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
1000 if not have and want_libidn2 != 'false' and not fuzzer_build
1001 # libidn is used for both libidn and libidn2 objects
1002 libidn = dependency('libidn2',
1003 required : want_libidn2 == 'true')
1004 have = libidn.found()
1008 conf.set10('HAVE_LIBIDN2', have)
1009 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
1011 want_libiptc = get_option('libiptc')
1012 if want_libiptc != 'false' and not fuzzer_build
1013 libiptc = dependency('libiptc',
1014 required : want_libiptc == 'true')
1015 have = libiptc.found()
1020 conf.set10('HAVE_LIBIPTC', have)
1021 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
1023 want_qrencode = get_option('qrencode')
1024 if want_qrencode != 'false' and not fuzzer_build
1025 libqrencode = dependency('libqrencode',
1026 required : want_qrencode == 'true')
1027 have = libqrencode.found()
1032 conf.set10('HAVE_QRENCODE', have)
1034 want_gcrypt = get_option('gcrypt')
1035 if want_gcrypt != 'false' and not fuzzer_build
1036 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1037 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1038 have = libgcrypt.found() and libgpg_error.found()
1043 # link to neither of the libs if one is not found
1047 conf.set10('HAVE_GCRYPT', have)
1049 want_gnutls = get_option('gnutls')
1050 if want_gnutls != 'false' and not fuzzer_build
1051 libgnutls = dependency('gnutls',
1052 version : '>= 3.1.4',
1053 required : want_gnutls == 'true')
1054 have = libgnutls.found()
1059 conf.set10('HAVE_GNUTLS', have)
1061 want_elfutils = get_option('elfutils')
1062 if want_elfutils != 'false' and not fuzzer_build
1063 libdw = dependency('libdw',
1064 required : want_elfutils == 'true')
1065 have = libdw.found()
1070 conf.set10('HAVE_ELFUTILS', have)
1072 want_zlib = get_option('zlib')
1073 if want_zlib != 'false' and not fuzzer_build
1074 libz = dependency('zlib',
1075 required : want_zlib == 'true')
1081 conf.set10('HAVE_ZLIB', have)
1083 want_bzip2 = get_option('bzip2')
1084 if want_bzip2 != 'false' and not fuzzer_build
1085 libbzip2 = cc.find_library('bz2',
1086 required : want_bzip2 == 'true')
1087 have = libbzip2.found()
1092 conf.set10('HAVE_BZIP2', have)
1094 want_xz = get_option('xz')
1095 if want_xz != 'false' and not fuzzer_build
1096 libxz = dependency('liblzma',
1097 required : want_xz == 'true')
1098 have = libxz.found()
1103 conf.set10('HAVE_XZ', have)
1105 want_lz4 = get_option('lz4')
1106 if want_lz4 != 'false' and not fuzzer_build
1107 liblz4 = dependency('liblz4',
1108 required : want_lz4 == 'true')
1109 have = liblz4.found()
1114 conf.set10('HAVE_LZ4', have)
1116 want_xkbcommon = get_option('xkbcommon')
1117 if want_xkbcommon != 'false' and not fuzzer_build
1118 libxkbcommon = dependency('xkbcommon',
1119 version : '>= 0.3.0',
1120 required : want_xkbcommon == 'true')
1121 have = libxkbcommon.found()
1126 conf.set10('HAVE_XKBCOMMON', have)
1128 want_pcre2 = get_option('pcre2')
1129 if want_pcre2 != 'false'
1130 libpcre2 = dependency('libpcre2-8',
1131 required : want_pcre2 == 'true')
1132 have = libpcre2.found()
1137 conf.set10('HAVE_PCRE2', have)
1139 want_glib = get_option('glib')
1140 if want_glib != 'false' and not fuzzer_build
1141 libglib = dependency('glib-2.0',
1142 version : '>= 2.22.0',
1143 required : want_glib == 'true')
1144 libgobject = dependency('gobject-2.0',
1145 version : '>= 2.22.0',
1146 required : want_glib == 'true')
1147 libgio = dependency('gio-2.0',
1148 required : want_glib == 'true')
1149 have = libglib.found() and libgobject.found() and libgio.found()
1156 conf.set10('HAVE_GLIB', have)
1158 want_dbus = get_option('dbus')
1159 if want_dbus != 'false' and not fuzzer_build
1160 libdbus = dependency('dbus-1',
1161 version : '>= 1.3.2',
1162 required : want_dbus == 'true')
1163 have = libdbus.found()
1168 conf.set10('HAVE_DBUS', have)
1170 default_dnssec = get_option('default-dnssec')
1172 default_dnssec = 'no'
1174 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1175 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1176 default_dnssec = 'no'
1178 conf.set('DEFAULT_DNSSEC_MODE',
1179 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1180 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1182 want_importd = get_option('importd')
1183 if want_importd != 'false'
1184 have = (conf.get('HAVE_LIBCURL') == 1 and
1185 conf.get('HAVE_ZLIB') == 1 and
1186 conf.get('HAVE_BZIP2') == 1 and
1187 conf.get('HAVE_XZ') == 1 and
1188 conf.get('HAVE_GCRYPT') == 1)
1189 if want_importd == 'true' and not have
1190 error('importd support was requested, but dependencies are not available')
1195 conf.set10('ENABLE_IMPORTD', have)
1197 want_remote = get_option('remote')
1198 if want_remote != 'false'
1199 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1200 conf.get('HAVE_LIBCURL') == 1]
1201 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1202 # it's possible to build one without the other. Complain only if
1203 # support was explictly requested. The auxiliary files like sysusers
1204 # config should be installed when any of the programs are built.
1205 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1206 error('remote support was requested, but dependencies are not available')
1208 have = have_deps[0] or have_deps[1]
1212 conf.set10('ENABLE_REMOTE', have)
1214 foreach term : ['utmp',
1245 have = get_option(term)
1246 name = 'ENABLE_' + term.underscorify().to_upper()
1247 conf.set10(name, have)
1248 m4_defines += have ? ['-D' + name] : []
1251 want_tests = get_option('tests')
1252 install_tests = get_option('install-tests')
1253 slow_tests = get_option('slow-tests')
1257 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1259 #####################################################################
1261 if get_option('efi')
1262 efi_arch = host_machine.cpu_family()
1264 if efi_arch == 'x86'
1265 EFI_MACHINE_TYPE_NAME = 'ia32'
1266 gnu_efi_arch = 'ia32'
1267 elif efi_arch == 'x86_64'
1268 EFI_MACHINE_TYPE_NAME = 'x64'
1269 gnu_efi_arch = 'x86_64'
1270 elif efi_arch == 'arm'
1271 EFI_MACHINE_TYPE_NAME = 'arm'
1272 gnu_efi_arch = 'arm'
1273 elif efi_arch == 'aarch64'
1274 EFI_MACHINE_TYPE_NAME = 'aa64'
1275 gnu_efi_arch = 'aarch64'
1277 EFI_MACHINE_TYPE_NAME = ''
1282 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1284 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1288 conf.set10('ENABLE_EFI', have)
1290 #####################################################################
1292 config_h = configure_file(
1293 output : 'config.h',
1294 configuration : conf)
1296 includes = include_directories('src/basic',
1306 'src/libsystemd/sd-bus',
1307 'src/libsystemd/sd-device',
1308 'src/libsystemd/sd-hwdb',
1309 'src/libsystemd/sd-id128',
1310 'src/libsystemd/sd-netlink',
1311 'src/libsystemd/sd-network',
1312 'src/libsystemd-network',
1315 add_project_arguments('-include', 'config.h', language : 'c')
1319 subdir('src/systemd')
1321 subdir('src/libsystemd')
1322 subdir('src/libsystemd-network')
1323 subdir('src/journal')
1326 libjournal_core = static_library(
1328 libjournal_core_sources,
1330 include_directories : includes,
1333 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1334 libsystemd = shared_library(
1336 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1337 version : libsystemd_version,
1338 include_directories : includes,
1339 link_args : ['-shared',
1340 '-Wl,--version-script=' + libsystemd_sym_path],
1341 link_with : [libbasic,
1343 link_whole : [libsystemd_static,
1345 dependencies : [threads,
1349 link_depends : libsystemd_sym,
1351 install_dir : rootlibdir)
1353 ############################################################
1355 # binaries that have --help and are intended for use by humans,
1356 # usually, but not always, installed in /bin.
1357 public_programs = []
1359 subdir('src/libudev')
1360 subdir('src/shared')
1363 subdir('src/network')
1365 subdir('src/analyze')
1366 subdir('src/journal-remote')
1367 subdir('src/coredump')
1368 subdir('src/hostname')
1369 subdir('src/import')
1370 subdir('src/kernel-install')
1371 subdir('src/locale')
1372 subdir('src/machine')
1373 subdir('src/nspawn')
1374 subdir('src/resolve')
1375 subdir('src/timedate')
1376 subdir('src/timesync')
1377 subdir('src/vconsole')
1378 subdir('src/boot/efi')
1385 ############################################################
1387 # only static linking apart from libdl, to make sure that the
1388 # module is linked to all libraries that it uses.
1389 test_dlopen = executable(
1392 include_directories : includes,
1393 link_with : [libbasic],
1394 dependencies : [libdl])
1396 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1397 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1398 ['mymachines', 'ENABLE_MACHINED'],
1399 ['resolve', 'ENABLE_RESOLVE']]
1401 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1405 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1406 version_script_arg = join_paths(meson.current_source_dir(), sym)
1408 nss = shared_library(
1410 'src/nss-@0@/nss-@0@.c'.format(module),
1412 include_directories : includes,
1413 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1414 link_args : ['-Wl,-z,nodelete',
1416 '-Wl,--version-script=' + version_script_arg,
1418 link_with : [libsystemd_static,
1420 dependencies : [threads,
1424 install_dir : rootlibdir)
1426 # We cannot use shared_module because it does not support version suffix.
1427 # Unfortunately shared_library insists on creating the symlink…
1428 meson.add_install_script('sh', '-c',
1429 'rm $DESTDIR@0@/libnss_@1@.so'
1430 .format(rootlibdir, module))
1432 test('dlopen-nss_' + module,
1434 args : [nss.full_path()]) # path to dlopen must include a slash
1438 ############################################################
1440 executable('systemd',
1442 include_directories : includes,
1443 link_with : [libcore,
1445 dependencies : [threads,
1451 install_rpath : rootlibexecdir,
1453 install_dir : rootlibexecdir)
1455 exe = executable('systemd-analyze',
1456 systemd_analyze_sources,
1457 include_directories : includes,
1458 link_with : [libcore,
1460 dependencies : [threads,
1466 install_rpath : rootlibexecdir,
1468 public_programs += [exe]
1470 executable('systemd-journald',
1471 systemd_journald_sources,
1472 include_directories : includes,
1473 link_with : [libjournal_core,
1475 dependencies : [threads,
1479 install_rpath : rootlibexecdir,
1481 install_dir : rootlibexecdir)
1483 exe = executable('systemd-cat',
1484 systemd_cat_sources,
1485 include_directories : includes,
1486 link_with : [libjournal_core,
1488 dependencies : [threads],
1489 install_rpath : rootlibexecdir,
1491 public_programs += [exe]
1493 exe = executable('journalctl',
1495 include_directories : includes,
1496 link_with : [libshared],
1497 dependencies : [threads,
1502 install_rpath : rootlibexecdir,
1504 install_dir : rootbindir)
1505 public_programs += [exe]
1507 executable('systemd-getty-generator',
1508 'src/getty-generator/getty-generator.c',
1509 include_directories : includes,
1510 link_with : [libshared],
1511 install_rpath : rootlibexecdir,
1513 install_dir : systemgeneratordir)
1515 executable('systemd-debug-generator',
1516 'src/debug-generator/debug-generator.c',
1517 include_directories : includes,
1518 link_with : [libshared],
1519 install_rpath : rootlibexecdir,
1521 install_dir : systemgeneratordir)
1523 executable('systemd-fstab-generator',
1524 'src/fstab-generator/fstab-generator.c',
1525 'src/core/mount-setup.c',
1526 include_directories : includes,
1527 link_with : [libshared],
1528 install_rpath : rootlibexecdir,
1530 install_dir : systemgeneratordir)
1532 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1533 executable('30-systemd-environment-d-generator',
1534 'src/environment-d-generator/environment-d-generator.c',
1535 include_directories : includes,
1536 link_with : [libshared],
1537 install_rpath : rootlibexecdir,
1539 install_dir : userenvgeneratordir)
1541 meson.add_install_script(meson_make_symlink,
1542 join_paths(sysconfdir, 'environment'),
1543 join_paths(environmentdir, '99-environment.conf'))
1546 if conf.get('ENABLE_HIBERNATE') == 1
1547 executable('systemd-hibernate-resume-generator',
1548 'src/hibernate-resume/hibernate-resume-generator.c',
1549 include_directories : includes,
1550 link_with : [libshared],
1551 install_rpath : rootlibexecdir,
1553 install_dir : systemgeneratordir)
1555 executable('systemd-hibernate-resume',
1556 'src/hibernate-resume/hibernate-resume.c',
1557 include_directories : includes,
1558 link_with : [libshared],
1559 install_rpath : rootlibexecdir,
1561 install_dir : rootlibexecdir)
1564 if conf.get('HAVE_BLKID') == 1
1565 executable('systemd-gpt-auto-generator',
1566 'src/gpt-auto-generator/gpt-auto-generator.c',
1567 'src/basic/blkid-util.h',
1568 include_directories : includes,
1569 link_with : [libshared],
1570 dependencies : libblkid,
1571 install_rpath : rootlibexecdir,
1573 install_dir : systemgeneratordir)
1575 exe = executable('systemd-dissect',
1576 'src/dissect/dissect.c',
1577 include_directories : includes,
1578 link_with : [libshared],
1579 install_rpath : rootlibexecdir,
1581 install_dir : rootlibexecdir)
1582 public_programs += [exe]
1585 if conf.get('ENABLE_RESOLVE') == 1
1586 executable('systemd-resolved',
1587 systemd_resolved_sources,
1588 include_directories : includes,
1589 link_with : [libshared,
1591 libsystemd_resolve_core],
1592 dependencies : [threads,
1596 install_rpath : rootlibexecdir,
1598 install_dir : rootlibexecdir)
1600 exe = executable('systemd-resolve',
1601 systemd_resolve_sources,
1602 include_directories : includes,
1603 link_with : [libshared,
1605 libsystemd_resolve_core],
1606 dependencies : [threads,
1610 install_rpath : rootlibexecdir,
1612 public_programs += [exe]
1615 if conf.get('ENABLE_LOGIND') == 1
1616 executable('systemd-logind',
1617 systemd_logind_sources,
1618 include_directories : includes,
1619 link_with : [liblogind_core,
1621 dependencies : [threads,
1623 install_rpath : rootlibexecdir,
1625 install_dir : rootlibexecdir)
1627 exe = executable('loginctl',
1629 include_directories : includes,
1630 link_with : [libshared],
1631 dependencies : [threads,
1634 install_rpath : rootlibexecdir,
1636 install_dir : rootbindir)
1637 public_programs += [exe]
1639 exe = executable('systemd-inhibit',
1640 'src/login/inhibit.c',
1641 include_directories : includes,
1642 link_with : [libshared],
1643 install_rpath : rootlibexecdir,
1645 install_dir : rootbindir)
1646 public_programs += [exe]
1648 if conf.get('HAVE_PAM') == 1
1649 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1650 pam_systemd = shared_library(
1654 include_directories : includes,
1655 link_args : ['-shared',
1656 '-Wl,--version-script=' + version_script_arg],
1657 link_with : [libsystemd_static,
1659 dependencies : [threads,
1662 link_depends : pam_systemd_sym,
1664 install_dir : pamlibdir)
1666 test('dlopen-pam_systemd',
1668 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1672 if conf.get('HAVE_PAM') == 1
1673 executable('systemd-user-sessions',
1674 'src/user-sessions/user-sessions.c',
1675 include_directories : includes,
1676 link_with : [libshared],
1677 install_rpath : rootlibexecdir,
1679 install_dir : rootlibexecdir)
1682 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1683 exe = executable('bootctl',
1684 'src/boot/bootctl.c',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 dependencies : [libblkid],
1688 install_rpath : rootlibexecdir,
1690 public_programs += [exe]
1693 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 dependencies : [threads],
1697 install_rpath : rootlibexecdir,
1699 public_programs += [exe]
1701 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1702 include_directories : includes,
1703 link_with : [libshared],
1704 dependencies : [threads,
1709 install_rpath : rootlibexecdir,
1711 install_dir : rootbindir)
1712 public_programs += [exe]
1714 if conf.get('ENABLE_BACKLIGHT') == 1
1715 executable('systemd-backlight',
1716 'src/backlight/backlight.c',
1717 include_directories : includes,
1718 link_with : [libshared],
1719 install_rpath : rootlibexecdir,
1721 install_dir : rootlibexecdir)
1724 if conf.get('ENABLE_RFKILL') == 1
1725 executable('systemd-rfkill',
1726 'src/rfkill/rfkill.c',
1727 include_directories : includes,
1728 link_with : [libshared],
1729 install_rpath : rootlibexecdir,
1731 install_dir : rootlibexecdir)
1734 executable('systemd-system-update-generator',
1735 'src/system-update-generator/system-update-generator.c',
1736 include_directories : includes,
1737 link_with : [libshared],
1738 install_rpath : rootlibexecdir,
1740 install_dir : systemgeneratordir)
1742 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1743 executable('systemd-cryptsetup',
1744 'src/cryptsetup/cryptsetup.c',
1745 include_directories : includes,
1746 link_with : [libshared],
1747 dependencies : [libcryptsetup],
1748 install_rpath : rootlibexecdir,
1750 install_dir : rootlibexecdir)
1752 executable('systemd-cryptsetup-generator',
1753 'src/cryptsetup/cryptsetup-generator.c',
1754 include_directories : includes,
1755 link_with : [libshared],
1756 dependencies : [libcryptsetup],
1757 install_rpath : rootlibexecdir,
1759 install_dir : systemgeneratordir)
1761 executable('systemd-veritysetup',
1762 'src/veritysetup/veritysetup.c',
1763 include_directories : includes,
1764 link_with : [libshared],
1765 dependencies : [libcryptsetup],
1766 install_rpath : rootlibexecdir,
1768 install_dir : rootlibexecdir)
1770 executable('systemd-veritysetup-generator',
1771 'src/veritysetup/veritysetup-generator.c',
1772 include_directories : includes,
1773 link_with : [libshared],
1774 dependencies : [libcryptsetup],
1775 install_rpath : rootlibexecdir,
1777 install_dir : systemgeneratordir)
1780 if conf.get('HAVE_SYSV_COMPAT') == 1
1781 executable('systemd-sysv-generator',
1782 'src/sysv-generator/sysv-generator.c',
1783 include_directories : includes,
1784 link_with : [libshared],
1785 install_rpath : rootlibexecdir,
1787 install_dir : systemgeneratordir)
1789 executable('systemd-rc-local-generator',
1790 'src/rc-local-generator/rc-local-generator.c',
1791 include_directories : includes,
1792 link_with : [libshared],
1793 install_rpath : rootlibexecdir,
1795 install_dir : systemgeneratordir)
1798 if conf.get('ENABLE_HOSTNAMED') == 1
1799 executable('systemd-hostnamed',
1800 'src/hostname/hostnamed.c',
1801 include_directories : includes,
1802 link_with : [libshared],
1803 install_rpath : rootlibexecdir,
1805 install_dir : rootlibexecdir)
1807 exe = executable('hostnamectl',
1808 'src/hostname/hostnamectl.c',
1809 include_directories : includes,
1810 link_with : [libshared],
1811 install_rpath : rootlibexecdir,
1813 public_programs += [exe]
1816 if conf.get('ENABLE_LOCALED') == 1
1817 if conf.get('HAVE_XKBCOMMON') == 1
1818 # logind will load libxkbcommon.so dynamically on its own
1824 executable('systemd-localed',
1825 systemd_localed_sources,
1826 include_directories : includes,
1827 link_with : [libshared],
1828 dependencies : deps,
1829 install_rpath : rootlibexecdir,
1831 install_dir : rootlibexecdir)
1833 exe = executable('localectl',
1835 include_directories : includes,
1836 link_with : [libshared],
1837 install_rpath : rootlibexecdir,
1839 public_programs += [exe]
1842 if conf.get('ENABLE_TIMEDATED') == 1
1843 executable('systemd-timedated',
1844 'src/timedate/timedated.c',
1845 include_directories : includes,
1846 link_with : [libshared],
1847 install_rpath : rootlibexecdir,
1849 install_dir : rootlibexecdir)
1851 exe = executable('timedatectl',
1852 'src/timedate/timedatectl.c',
1853 include_directories : includes,
1854 install_rpath : rootlibexecdir,
1855 link_with : [libshared],
1857 public_programs += [exe]
1860 if conf.get('ENABLE_TIMESYNCD') == 1
1861 executable('systemd-timesyncd',
1862 systemd_timesyncd_sources,
1863 include_directories : includes,
1864 link_with : [libshared],
1865 dependencies : [threads,
1867 install_rpath : rootlibexecdir,
1869 install_dir : rootlibexecdir)
1872 if conf.get('ENABLE_MACHINED') == 1
1873 executable('systemd-machined',
1874 systemd_machined_sources,
1875 include_directories : includes,
1876 link_with : [libmachine_core,
1878 install_rpath : rootlibexecdir,
1880 install_dir : rootlibexecdir)
1882 exe = executable('machinectl',
1883 'src/machine/machinectl.c',
1884 include_directories : includes,
1885 link_with : [libshared],
1886 dependencies : [threads,
1889 install_rpath : rootlibexecdir,
1891 install_dir : rootbindir)
1892 public_programs += [exe]
1895 if conf.get('ENABLE_IMPORTD') == 1
1896 executable('systemd-importd',
1897 systemd_importd_sources,
1898 include_directories : includes,
1899 link_with : [libshared],
1900 dependencies : [threads],
1901 install_rpath : rootlibexecdir,
1903 install_dir : rootlibexecdir)
1905 systemd_pull = executable('systemd-pull',
1906 systemd_pull_sources,
1907 include_directories : includes,
1908 link_with : [libshared],
1909 dependencies : [libcurl,
1914 install_rpath : rootlibexecdir,
1916 install_dir : rootlibexecdir)
1918 systemd_import = executable('systemd-import',
1919 systemd_import_sources,
1920 include_directories : includes,
1921 link_with : [libshared],
1922 dependencies : [libcurl,
1926 install_rpath : rootlibexecdir,
1928 install_dir : rootlibexecdir)
1930 systemd_export = executable('systemd-export',
1931 systemd_export_sources,
1932 include_directories : includes,
1933 link_with : [libshared],
1934 dependencies : [libcurl,
1938 install_rpath : rootlibexecdir,
1940 install_dir : rootlibexecdir)
1941 public_programs += [systemd_pull, systemd_import, systemd_export]
1944 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1945 exe = executable('systemd-journal-upload',
1946 systemd_journal_upload_sources,
1947 include_directories : includes,
1948 link_with : [libshared],
1949 dependencies : [threads,
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootlibexecdir)
1957 public_programs += [exe]
1960 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1961 s_j_remote = executable('systemd-journal-remote',
1962 systemd_journal_remote_sources,
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [threads,
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootlibexecdir)
1974 s_j_gatewayd = executable('systemd-journal-gatewayd',
1975 systemd_journal_gatewayd_sources,
1976 include_directories : includes,
1977 link_with : [libshared],
1978 dependencies : [threads,
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootlibexecdir)
1986 public_programs += [s_j_remote, s_j_gatewayd]
1989 if conf.get('ENABLE_COREDUMP') == 1
1990 executable('systemd-coredump',
1991 systemd_coredump_sources,
1992 include_directories : includes,
1993 link_with : [libshared],
1994 dependencies : [threads,
1999 install_rpath : rootlibexecdir,
2001 install_dir : rootlibexecdir)
2003 exe = executable('coredumpctl',
2004 coredumpctl_sources,
2005 include_directories : includes,
2006 link_with : [libshared],
2007 dependencies : [threads,
2010 install_rpath : rootlibexecdir,
2012 public_programs += [exe]
2015 if conf.get('ENABLE_BINFMT') == 1
2016 exe = executable('systemd-binfmt',
2017 'src/binfmt/binfmt.c',
2018 include_directories : includes,
2019 link_with : [libshared],
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootlibexecdir)
2023 public_programs += [exe]
2025 meson.add_install_script('sh', '-c',
2026 mkdir_p.format(binfmtdir))
2027 meson.add_install_script('sh', '-c',
2028 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2031 if conf.get('ENABLE_VCONSOLE') == 1
2032 executable('systemd-vconsole-setup',
2033 'src/vconsole/vconsole-setup.c',
2034 include_directories : includes,
2035 link_with : [libshared],
2036 install_rpath : rootlibexecdir,
2038 install_dir : rootlibexecdir)
2041 if conf.get('ENABLE_RANDOMSEED') == 1
2042 executable('systemd-random-seed',
2043 'src/random-seed/random-seed.c',
2044 include_directories : includes,
2045 link_with : [libshared],
2046 install_rpath : rootlibexecdir,
2048 install_dir : rootlibexecdir)
2051 if conf.get('ENABLE_FIRSTBOOT') == 1
2052 executable('systemd-firstboot',
2053 'src/firstboot/firstboot.c',
2054 include_directories : includes,
2055 link_with : [libshared],
2056 dependencies : [libcrypt],
2057 install_rpath : rootlibexecdir,
2059 install_dir : rootbindir)
2062 executable('systemd-remount-fs',
2063 'src/remount-fs/remount-fs.c',
2064 'src/core/mount-setup.c',
2065 'src/core/mount-setup.h',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 install_rpath : rootlibexecdir,
2070 install_dir : rootlibexecdir)
2072 executable('systemd-machine-id-setup',
2073 'src/machine-id-setup/machine-id-setup-main.c',
2074 'src/core/machine-id-setup.c',
2075 'src/core/machine-id-setup.h',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 install_rpath : rootlibexecdir,
2080 install_dir : rootbindir)
2082 executable('systemd-fsck',
2084 include_directories : includes,
2085 link_with : [libshared],
2086 install_rpath : rootlibexecdir,
2088 install_dir : rootlibexecdir)
2090 executable('systemd-growfs',
2091 'src/partition/growfs.c',
2092 include_directories : includes,
2093 link_with : [libshared],
2094 dependencies : [libcryptsetup],
2095 install_rpath : rootlibexecdir,
2097 install_dir : rootlibexecdir)
2099 executable('systemd-makefs',
2100 'src/partition/makefs.c',
2101 include_directories : includes,
2102 link_with : [libshared],
2103 install_rpath : rootlibexecdir,
2105 install_dir : rootlibexecdir)
2107 executable('systemd-sleep',
2108 'src/sleep/sleep.c',
2109 include_directories : includes,
2110 link_with : [libshared],
2111 install_rpath : rootlibexecdir,
2113 install_dir : rootlibexecdir)
2115 exe = executable('systemd-sysctl',
2116 'src/sysctl/sysctl.c',
2117 include_directories : includes,
2118 link_with : [libshared],
2119 install_rpath : rootlibexecdir,
2121 install_dir : rootlibexecdir)
2122 public_programs += [exe]
2124 executable('systemd-ac-power',
2125 'src/ac-power/ac-power.c',
2126 include_directories : includes,
2127 link_with : [libshared],
2128 install_rpath : rootlibexecdir,
2130 install_dir : rootlibexecdir)
2132 exe = executable('systemd-detect-virt',
2133 'src/detect-virt/detect-virt.c',
2134 include_directories : includes,
2135 link_with : [libshared],
2136 install_rpath : rootlibexecdir,
2138 public_programs += [exe]
2140 exe = executable('systemd-delta',
2141 'src/delta/delta.c',
2142 include_directories : includes,
2143 link_with : [libshared],
2144 install_rpath : rootlibexecdir,
2146 public_programs += [exe]
2148 exe = executable('systemd-escape',
2149 'src/escape/escape.c',
2150 include_directories : includes,
2151 link_with : [libshared],
2152 install_rpath : rootlibexecdir,
2154 install_dir : rootbindir)
2155 public_programs += [exe]
2157 exe = executable('systemd-notify',
2158 'src/notify/notify.c',
2159 include_directories : includes,
2160 link_with : [libshared],
2161 install_rpath : rootlibexecdir,
2163 install_dir : rootbindir)
2164 public_programs += [exe]
2166 executable('systemd-volatile-root',
2167 'src/volatile-root/volatile-root.c',
2168 include_directories : includes,
2169 link_with : [libshared],
2170 install_rpath : rootlibexecdir,
2172 install_dir : rootlibexecdir)
2174 executable('systemd-cgroups-agent',
2175 'src/cgroups-agent/cgroups-agent.c',
2176 include_directories : includes,
2177 link_with : [libshared],
2178 install_rpath : rootlibexecdir,
2180 install_dir : rootlibexecdir)
2182 exe = executable('systemd-path',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 install_rpath : rootlibexecdir,
2188 public_programs += [exe]
2190 exe = executable('systemd-ask-password',
2191 'src/ask-password/ask-password.c',
2192 include_directories : includes,
2193 link_with : [libshared],
2194 install_rpath : rootlibexecdir,
2196 install_dir : rootbindir)
2197 public_programs += [exe]
2199 executable('systemd-reply-password',
2200 'src/reply-password/reply-password.c',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 install_rpath : rootlibexecdir,
2205 install_dir : rootlibexecdir)
2207 exe = executable('systemd-tty-ask-password-agent',
2208 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2209 include_directories : includes,
2210 link_with : [libshared],
2211 install_rpath : rootlibexecdir,
2213 install_dir : rootbindir)
2214 public_programs += [exe]
2216 exe = executable('systemd-cgls',
2218 include_directories : includes,
2219 link_with : [libshared],
2220 install_rpath : rootlibexecdir,
2222 public_programs += [exe]
2224 exe = executable('systemd-cgtop',
2225 'src/cgtop/cgtop.c',
2226 include_directories : includes,
2227 link_with : [libshared],
2228 install_rpath : rootlibexecdir,
2230 public_programs += [exe]
2232 executable('systemd-initctl',
2233 'src/initctl/initctl.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 install_rpath : rootlibexecdir,
2238 install_dir : rootlibexecdir)
2240 exe = executable('systemd-mount',
2241 'src/mount/mount-tool.c',
2242 include_directories : includes,
2243 link_with : [libshared],
2244 install_rpath : rootlibexecdir,
2246 public_programs += [exe]
2248 meson.add_install_script(meson_make_symlink,
2249 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2251 exe = executable('systemd-run',
2253 include_directories : includes,
2254 link_with : [libshared],
2255 install_rpath : rootlibexecdir,
2257 public_programs += [exe]
2259 exe = executable('systemd-stdio-bridge',
2260 'src/stdio-bridge/stdio-bridge.c',
2261 include_directories : includes,
2262 link_with : [libshared],
2263 install_rpath : rootlibexecdir,
2265 public_programs += [exe]
2267 exe = executable('busctl',
2268 'src/busctl/busctl.c',
2269 'src/busctl/busctl-introspect.c',
2270 'src/busctl/busctl-introspect.h',
2271 include_directories : includes,
2272 link_with : [libshared],
2273 install_rpath : rootlibexecdir,
2275 public_programs += [exe]
2277 if conf.get('ENABLE_SYSUSERS') == 1
2278 exe = executable('systemd-sysusers',
2279 'src/sysusers/sysusers.c',
2280 include_directories : includes,
2281 link_with : [libshared],
2282 install_rpath : rootlibexecdir,
2284 install_dir : rootbindir)
2285 public_programs += [exe]
2288 if conf.get('ENABLE_TMPFILES') == 1
2289 exe = executable('systemd-tmpfiles',
2290 'src/tmpfiles/tmpfiles.c',
2291 include_directories : includes,
2292 link_with : [libshared],
2293 dependencies : [libacl],
2294 install_rpath : rootlibexecdir,
2296 install_dir : rootbindir)
2297 public_programs += [exe]
2299 test('test-systemd-tmpfiles',
2300 test_systemd_tmpfiles_py,
2301 args : exe.full_path())
2302 # https://github.com/mesonbuild/meson/issues/2681
2305 if conf.get('ENABLE_HWDB') == 1
2306 exe = executable('systemd-hwdb',
2308 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2309 include_directories : includes,
2310 link_with : [libudev_static],
2311 install_rpath : udev_rpath,
2313 install_dir : rootbindir)
2314 public_programs += [exe]
2317 if conf.get('ENABLE_QUOTACHECK') == 1
2318 executable('systemd-quotacheck',
2319 'src/quotacheck/quotacheck.c',
2320 include_directories : includes,
2321 link_with : [libshared],
2322 install_rpath : rootlibexecdir,
2324 install_dir : rootlibexecdir)
2327 exe = executable('systemd-socket-proxyd',
2328 'src/socket-proxy/socket-proxyd.c',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 dependencies : [threads],
2332 install_rpath : rootlibexecdir,
2334 install_dir : rootlibexecdir)
2335 public_programs += [exe]
2337 exe = executable('systemd-udevd',
2338 systemd_udevd_sources,
2339 include_directories : includes,
2340 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2341 link_with : [libudev_core,
2344 dependencies : [threads,
2349 install_rpath : udev_rpath,
2351 install_dir : rootlibexecdir)
2352 public_programs += [exe]
2354 exe = executable('udevadm',
2356 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2357 include_directories : includes,
2358 link_with : [libudev_core,
2361 dependencies : [threads,
2366 install_rpath : udev_rpath,
2368 install_dir : rootbindir)
2369 public_programs += [exe]
2371 executable('systemd-shutdown',
2372 systemd_shutdown_sources,
2373 include_directories : includes,
2374 link_with : [libshared],
2375 install_rpath : rootlibexecdir,
2377 install_dir : rootlibexecdir)
2379 executable('systemd-update-done',
2380 'src/update-done/update-done.c',
2381 include_directories : includes,
2382 link_with : [libshared],
2383 install_rpath : rootlibexecdir,
2385 install_dir : rootlibexecdir)
2387 executable('systemd-update-utmp',
2388 'src/update-utmp/update-utmp.c',
2389 include_directories : includes,
2390 link_with : [libshared],
2391 dependencies : [libaudit],
2392 install_rpath : rootlibexecdir,
2394 install_dir : rootlibexecdir)
2396 if conf.get('HAVE_KMOD') == 1
2397 executable('systemd-modules-load',
2398 'src/modules-load/modules-load.c',
2399 include_directories : includes,
2400 link_with : [libshared],
2401 dependencies : [libkmod],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootlibexecdir)
2406 meson.add_install_script('sh', '-c',
2407 mkdir_p.format(modulesloaddir))
2408 meson.add_install_script('sh', '-c',
2409 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2412 exe = executable('systemd-nspawn',
2413 systemd_nspawn_sources,
2414 'src/core/mount-setup.c', # FIXME: use a variable?
2415 'src/core/mount-setup.h',
2416 'src/core/loopback-setup.c',
2417 'src/core/loopback-setup.h',
2418 include_directories : [includes, include_directories('src/nspawn')],
2419 link_with : [libshared],
2420 dependencies : [libacl,
2424 install_rpath : rootlibexecdir,
2426 public_programs += [exe]
2428 if conf.get('ENABLE_NETWORKD') == 1
2429 executable('systemd-networkd',
2430 systemd_networkd_sources,
2431 include_directories : includes,
2432 link_with : [libnetworkd_core,
2436 dependencies : [threads],
2437 install_rpath : rootlibexecdir,
2439 install_dir : rootlibexecdir)
2441 executable('systemd-networkd-wait-online',
2442 systemd_networkd_wait_online_sources,
2443 include_directories : includes,
2444 link_with : [libnetworkd_core,
2446 install_rpath : rootlibexecdir,
2448 install_dir : rootlibexecdir)
2450 exe = executable('networkctl',
2452 include_directories : includes,
2453 link_with : [libsystemd_network,
2455 install_rpath : rootlibexecdir,
2457 install_dir : rootbindir)
2458 public_programs += [exe]
2461 executable('systemd-sulogin-shell',
2462 ['src/sulogin-shell/sulogin-shell.c'],
2463 include_directories : includes,
2464 link_with : [libshared],
2465 install_rpath : rootlibexecdir,
2467 install_dir : rootlibexecdir)
2469 ############################################################
2471 foreach tuple : tests
2473 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2474 dependencies = tuple[2]
2475 condition = tuple.length() >= 4 ? tuple[3] : ''
2476 type = tuple.length() >= 5 ? tuple[4] : ''
2477 defs = tuple.length() >= 6 ? tuple[5] : []
2478 incs = tuple.length() >= 7 ? tuple[6] : includes
2481 name = sources[0].split('/')[-1].split('.')[0]
2482 if type.startswith('timeout=')
2483 timeout = type.split('=')[1].to_int()
2486 if want_tests == 'false'
2487 message('Not compiling @0@ because tests is set to false'.format(name))
2488 elif condition == '' or conf.get(condition) == 1
2492 include_directories : incs,
2493 link_with : link_with,
2494 dependencies : dependencies,
2496 install_rpath : rootlibexecdir,
2497 install : install_tests,
2498 install_dir : join_paths(testsdir, type))
2501 message('@0@ is a manual test'.format(name))
2502 elif type == 'unsafe' and want_tests != 'unsafe'
2503 message('@0@ is an unsafe test'.format(name))
2510 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2514 test_libsystemd_sym = executable(
2515 'test-libsystemd-sym',
2516 test_libsystemd_sym_c,
2517 include_directories : includes,
2518 link_with : [libsystemd],
2519 install : install_tests,
2520 install_dir : testsdir)
2521 test('test-libsystemd-sym',
2522 test_libsystemd_sym)
2524 test_libudev_sym = executable(
2527 include_directories : includes,
2528 c_args : ['-Wno-deprecated-declarations'],
2529 link_with : [libudev],
2530 install : install_tests,
2531 install_dir : testsdir)
2532 test('test-libudev-sym',
2535 ############################################################
2539 foreach tuple : fuzzers
2541 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2542 dependencies = tuple[2]
2543 defs = tuple.length() >= 4 ? tuple[3] : []
2544 incs = tuple.length() >= 5 ? tuple[4] : includes
2547 dependencies += fuzzing_engine
2549 sources += 'src/fuzz/fuzz-main.c'
2552 name = sources[0].split('/')[-1].split('.')[0]
2554 fuzzer_exes += executable(
2557 include_directories : [incs, include_directories('src/fuzz')],
2558 link_with : link_with,
2559 dependencies : dependencies,
2564 run_target('fuzzers',
2565 depends : fuzzer_exes,
2568 ############################################################
2570 make_directive_index_py = find_program('tools/make-directive-index.py')
2571 make_man_index_py = find_program('tools/make-man-index.py')
2572 xml_helper_py = find_program('tools/xml_helper.py')
2573 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2577 subdir('sysusers.d')
2578 subdir('tmpfiles.d')
2583 subdir('shell-completion/bash')
2584 subdir('shell-completion/zsh')
2585 subdir('docs/sysvinit')
2586 subdir('docs/var-log')
2588 # FIXME: figure out if the warning is true:
2589 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2590 install_subdir('factory/etc',
2591 install_dir : factorydir)
2594 install_data('xorg/50-systemd-user.sh',
2595 install_dir : xinitrcdir)
2596 install_data('modprobe.d/systemd.conf',
2597 install_dir : modprobedir)
2598 install_data('README',
2605 'TRANSIENT-SETTINGS.md',
2607 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2608 install_dir : docdir)
2610 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2611 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2613 ############################################################
2615 meson_check_help = find_program('tools/meson-check-help.sh')
2617 foreach exec : public_programs
2618 name = exec.full_path().split('/')[-1]
2619 test('check-help-' + name,
2621 args : [exec.full_path()])
2624 ############################################################
2627 foreach p : fuzz_regression_tests
2628 a = p.split('/')[-3]
2629 b = p.split('/')[-2]
2630 c = p.split('/')[-1]
2633 build = sanitize_address
2635 error('unknown sanitizer @0@'.format(a))
2638 name = '@1@:@0@'.format(a, b)
2641 if want_tests == 'false'
2642 message('Not compiling @0@ because tests is set to false'.format(name))
2643 elif not sanitizers.contains(a)
2644 message('Not compiling @0@ because @1@ sanitizer is not available'.format(name, a))
2646 exe = custom_target(
2650 command : [env, 'ln', '-fs',
2651 join_paths(build.full_path(), b),
2653 build_by_default : true)
2655 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2660 if want_tests != 'false' and slow_tests
2661 test(c, env, args : [exe.full_path(),
2662 join_paths(meson.source_root(),
2663 'test/fuzz-regressions',
2668 ############################################################
2671 all_files = run_command(
2673 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2676 all_files = files(all_files.stdout().split())
2681 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2685 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2689 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2692 command : [meson_git_contrib_sh])
2696 git_head = run_command(
2698 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2699 'rev-parse', 'HEAD']).stdout().strip()
2700 git_head_short = run_command(
2702 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2703 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2707 command : ['git', 'archive',
2708 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2710 '--prefix', 'systemd-@0@/'.format(git_head),
2714 ############################################################
2716 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2719 depends : [man, libsystemd, libudev],
2720 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2722 ############################################################
2725 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2727 'prefix directory: @0@'.format(prefixdir),
2728 'rootprefix directory: @0@'.format(rootprefixdir),
2729 'sysconf directory: @0@'.format(sysconfdir),
2730 'include directory: @0@'.format(includedir),
2731 'lib directory: @0@'.format(libdir),
2732 'rootlib directory: @0@'.format(rootlibdir),
2733 'SysV init scripts: @0@'.format(sysvinit_path),
2734 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2735 'PAM modules directory: @0@'.format(pamlibdir),
2736 'PAM configuration directory: @0@'.format(pamconfdir),
2737 'RPM macros directory: @0@'.format(rpmmacrosdir),
2738 'modprobe.d directory: @0@'.format(modprobedir),
2739 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2740 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2741 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2742 'bash completions directory: @0@'.format(bashcompletiondir),
2743 'zsh completions directory: @0@'.format(zshcompletiondir),
2744 'extra start script: @0@'.format(get_option('rc-local')),
2745 'extra stop script: @0@'.format(get_option('halt-local')),
2746 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2747 get_option('debug-tty')),
2748 'TTY GID: @0@'.format(tty_gid),
2749 'users GID: @0@'.format(users_gid),
2750 'maximum system UID: @0@'.format(system_uid_max),
2751 'maximum system GID: @0@'.format(system_gid_max),
2752 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2753 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2754 'minimum container UID base: @0@'.format(container_uid_base_min),
2755 'maximum container UID base: @0@'.format(container_uid_base_max),
2756 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2757 'render group access mode: @0@'.format(get_option('group-render-mode')),
2758 'certificate root directory: @0@'.format(get_option('certificate-root')),
2759 'support URL: @0@'.format(support_url),
2760 'nobody user name: @0@'.format(nobody_user),
2761 'nobody group name: @0@'.format(nobody_group),
2762 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2763 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2765 'default DNSSEC mode: @0@'.format(default_dnssec),
2766 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2767 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2769 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2770 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2772 'default DNS servers: @0@'.format(alt_dns_servers),
2773 'default NTP servers: @0@'.format(alt_ntp_servers)]
2775 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2776 '@@0@'.format(time_epoch)).stdout().strip()
2778 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2781 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2782 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2783 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2785 if conf.get('ENABLE_EFI') == 1
2787 'efi arch: @0@'.format(efi_arch)]
2791 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2792 'EFI CC @0@'.format(efi_cc),
2793 'EFI lib directory: @0@'.format(efi_libdir),
2794 'EFI lds directory: @0@'.format(efi_ldsdir),
2795 'EFI include directory: @0@'.format(efi_incdir)]
2848 ['legacy pkla', install_polkit_pkla],
2850 ['gnu-efi', have_gnu_efi],
2857 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2860 ['man pages', want_man],
2861 ['html pages', want_html],
2862 ['man page indices', want_man and have_lxml],
2863 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2868 ['adm group', get_option('adm-group')],
2869 ['wheel group', get_option('wheel-group')],
2872 ['debug mmap cache'],
2875 cond = tuple.get(1, '')
2877 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2878 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2879 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2884 missing += [tuple[0]]
2890 'enabled features: @0@'.format(', '.join(found)),
2892 'disabled features: @0@'.format(', '.join(missing)),
2894 message('\n '.join(status))
2896 if rootprefixdir != rootprefix_default
2897 message('WARNING:\n' +
2898 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2899 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2900 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))