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 = 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 rootsbindir = join_paths(rootprefixdir, 'sbin')
91 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
93 rootlibdir = get_option('rootlibdir')
95 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
98 # Dirs of external packages
99 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
100 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
101 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
102 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
103 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
104 varlogdir = join_paths(localstatedir, 'log')
105 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
106 rpmmacrosdir = get_option('rpmmacrosdir')
107 if rpmmacrosdir != 'no'
108 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
110 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
113 pkgdatadir = join_paths(datadir, 'systemd')
114 environmentdir = join_paths(prefixdir, 'lib/environment.d')
115 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
116 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
117 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
118 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
119 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
120 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
121 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
122 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
123 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
124 pkgincludedir = join_paths(includedir, 'systemd')
125 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
126 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
127 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
128 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
129 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
130 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
131 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
132 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
133 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
134 udevhomedir = udevlibexecdir
135 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
136 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
137 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
138 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
139 factorydir = join_paths(datadir, 'factory')
140 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
141 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
142 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
143 catalogstatedir = join_paths(systemdstatedir, 'catalog')
144 randomseeddir = join_paths(localstatedir, 'lib/systemd')
146 docdir = get_option('docdir')
148 docdir = join_paths(datadir, 'doc/systemd')
151 dbuspolicydir = get_option('dbuspolicydir')
152 if dbuspolicydir == ''
153 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
156 dbussessionservicedir = get_option('dbussessionservicedir')
157 if dbussessionservicedir == ''
158 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
161 dbussystemservicedir = get_option('dbussystemservicedir')
162 if dbussystemservicedir == ''
163 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
166 pamlibdir = get_option('pamlibdir')
168 pamlibdir = join_paths(rootlibdir, 'security')
171 pamconfdir = get_option('pamconfdir')
173 pamconfdir = join_paths(sysconfdir, 'pam.d')
176 memory_accounting_default = get_option('memory-accounting-default')
178 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
179 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
180 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
181 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
182 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
183 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
184 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
185 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
186 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
187 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
188 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
189 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
190 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
191 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
192 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
193 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
194 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
195 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
196 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
197 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
198 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
199 conf.set_quoted('ROOTPREFIX', rootprefixdir)
200 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
201 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
202 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
203 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
204 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
205 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
206 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
207 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
208 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
209 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
210 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
211 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
212 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
213 conf.set_quoted('LIBDIR', libdir)
214 conf.set_quoted('ROOTLIBDIR', rootlibdir)
215 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
216 conf.set_quoted('BOOTLIBDIR', bootlibdir)
217 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
218 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
219 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
220 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
221 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
222 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
223 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
224 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_ON_OFF', memory_accounting_default ? 'on' : 'off')
226 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
227 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
229 substs.set('prefix', prefixdir)
230 substs.set('exec_prefix', prefixdir)
231 substs.set('libdir', libdir)
232 substs.set('rootlibdir', rootlibdir)
233 substs.set('includedir', includedir)
234 substs.set('pkgsysconfdir', pkgsysconfdir)
235 substs.set('bindir', bindir)
236 substs.set('rootbindir', rootbindir)
237 substs.set('rootlibexecdir', rootlibexecdir)
238 substs.set('systemunitdir', systemunitdir)
239 substs.set('userunitdir', userunitdir)
240 substs.set('systempresetdir', systempresetdir)
241 substs.set('userpresetdir', userpresetdir)
242 substs.set('udevhwdbdir', udevhwdbdir)
243 substs.set('udevrulesdir', udevrulesdir)
244 substs.set('udevlibexecdir', udevlibexecdir)
245 substs.set('catalogdir', catalogdir)
246 substs.set('tmpfilesdir', tmpfilesdir)
247 substs.set('sysusersdir', sysusersdir)
248 substs.set('sysctldir', sysctldir)
249 substs.set('binfmtdir', binfmtdir)
250 substs.set('modulesloaddir', modulesloaddir)
251 substs.set('systemgeneratordir', systemgeneratordir)
252 substs.set('usergeneratordir', usergeneratordir)
253 substs.set('systemenvgeneratordir', systemenvgeneratordir)
254 substs.set('userenvgeneratordir', userenvgeneratordir)
255 substs.set('systemshutdowndir', systemshutdowndir)
256 substs.set('systemsleepdir', systemsleepdir)
257 substs.set('VARLOGDIR', varlogdir)
258 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
259 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
260 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
261 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
262 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
263 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
264 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
265 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
267 #####################################################################
269 cc = meson.get_compiler('c')
270 pkgconfig = import('pkgconfig')
271 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
272 meson_build_sh = find_program('tools/meson-build.sh')
274 if get_option('tests') != 'false'
275 cxx = find_program('c++', required : false)
277 # Used only for tests
282 want_ossfuzz = get_option('oss-fuzz')
283 want_libfuzzer = get_option('llvm-fuzz')
284 fuzzer_build = want_ossfuzz or want_libfuzzer
285 if want_ossfuzz and want_libfuzzer
286 error('only one of oss-fuzz and llvm-fuzz can be specified')
289 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
292 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
295 foreach arg : ['-Wextra',
298 '-Wmissing-include-dirs',
299 '-Wold-style-definition',
302 '-Wdeclaration-after-statement',
304 '-Wsuggest-attribute=noreturn',
305 '-Werror=missing-prototypes',
306 '-Werror=implicit-function-declaration',
307 '-Werror=missing-declarations',
308 '-Werror=return-type',
309 '-Werror=incompatible-pointer-types',
311 '-Wstrict-prototypes',
313 '-Wmissing-noreturn',
314 '-Wimplicit-fallthrough=5',
317 '-Wstrict-aliasing=2',
324 '-fdiagnostics-show-option',
325 '-fno-strict-aliasing',
326 '-fvisibility=hidden',
328 '-fstack-protector-strong',
329 '--param=ssp-buffer-size=4',
331 if cc.has_argument(arg)
332 add_project_arguments(arg, language : 'c')
336 # the oss-fuzz fuzzers are not built with -fPIE, so don't
337 # enable it when we are linking against them
339 if cc.has_argument('-fPIE')
340 add_project_arguments('-fPIE', language : 'c')
344 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
345 # arguments, just emits a warnings. So test for the "positive" version instead.
346 foreach arg : ['unused-parameter',
347 'missing-field-initializers',
350 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
352 if cc.has_argument('-W' + arg)
353 add_project_arguments('-Wno-' + arg, language : 'c')
359 #include <inttypes.h>
360 typedef uint64_t usec_t;
361 usec_t now(clockid_t clock);
366 ''', name : '-Werror=shadow with local shadowing')
367 add_project_arguments('-Werror=shadow', language : 'c')
370 if cc.get_id() == 'clang'
371 foreach arg : ['-Wno-typedef-redefinition',
372 '-Wno-gnu-variable-sized-type-not-at-end',
374 if cc.has_argument(arg,
375 name : '@0@ is supported'.format(arg))
376 add_project_arguments(arg, language : 'c')
381 link_test_c = files('tools/meson-link-test.c')
383 # --as-needed and --no-undefined are provided by meson by default,
384 # run mesonconf to see what is enabled
385 foreach arg : ['-Wl,-z,relro',
390 have = run_command(check_compilation_sh,
391 cc.cmd_array(), '-x', 'c', arg,
392 '-include', link_test_c).returncode() == 0
393 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
394 if have and (arg != '-pie' or not fuzzer_build)
395 add_project_link_arguments(arg, language : 'c')
399 # Check if various sanitizers are supported
401 foreach arg : ['address']
403 have = run_command(check_compilation_sh,
404 cc.cmd_array(), '-x', 'c',
405 '-fsanitize=@0@'.format(arg),
406 '-include', link_test_c).returncode() == 0
407 message('@0@ sanitizer supported: @1@'.format(arg, have ? 'yes' : 'no'))
413 if get_option('buildtype') != 'debug'
414 foreach arg : ['-ffunction-sections',
416 if cc.has_argument(arg,
417 name : '@0@ is supported'.format(arg))
418 add_project_arguments(arg, language : 'c')
422 foreach arg : ['-Wl,--gc-sections']
423 have = run_command(check_compilation_sh,
424 cc.cmd_array(), '-x', 'c', arg,
425 '-include', link_test_c).returncode() == 0
426 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
428 add_project_link_arguments(arg, language : 'c')
433 cpp = ' '.join(cc.cmd_array()) + ' -E'
435 #####################################################################
436 # compilation result tests
438 conf.set('_GNU_SOURCE', true)
439 conf.set('__SANE_USERSPACE_TYPES__', true)
441 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
442 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
443 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
444 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
445 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
446 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
447 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
451 #include <linux/ethtool.h>
452 #include <linux/fib_rules.h>
453 #include <linux/stat.h>
454 #include <sys/stat.h>
456 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
458 foreach decl : ['char16_t',
461 'struct ethtool_link_settings',
462 'struct fib_rule_uid_range',
466 # We get -1 if the size cannot be determined
467 have = cc.sizeof(decl, prefix : decl_headers) > 0
468 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
471 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
472 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
473 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
474 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
475 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
476 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
477 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
478 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
479 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
480 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
481 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
482 # if_tunnel.h is buggy and cannot be included on its own
483 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
484 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
485 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
486 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
487 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
488 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
489 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
490 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
491 ['NDA_IFINDEX', 'linux/neighbour.h'],
492 ['IFA_FLAGS', 'linux/if_addr.h'],
493 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
494 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
495 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
497 prefix = decl.length() > 2 ? decl[2] : ''
498 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
499 conf.set10('HAVE_' + decl[0], have)
502 foreach ident : ['secure_getenv', '__secure_getenv']
503 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
507 ['memfd_create', '''#include <sys/mman.h>'''],
508 ['gettid', '''#include <sys/types.h>
509 #include <unistd.h>'''],
510 ['pivot_root', '''#include <stdlib.h>
511 #include <unistd.h>'''], # no known header declares pivot_root
512 ['name_to_handle_at', '''#include <sys/types.h>
513 #include <sys/stat.h>
514 #include <fcntl.h>'''],
515 ['setns', '''#include <sched.h>'''],
516 ['renameat2', '''#include <stdio.h>
517 #include <fcntl.h>'''],
518 ['kcmp', '''#include <linux/kcmp.h>'''],
519 ['keyctl', '''#include <sys/types.h>
520 #include <keyutils.h>'''],
521 ['copy_file_range', '''#include <sys/syscall.h>
522 #include <unistd.h>'''],
523 ['bpf', '''#include <sys/syscall.h>
524 #include <unistd.h>'''],
525 ['statx', '''#include <sys/types.h>
526 #include <sys/stat.h>
527 #include <unistd.h>'''],
528 ['explicit_bzero' , '''#include <string.h>'''],
529 ['reallocarray', '''#include <malloc.h>'''],
532 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
533 conf.set10('HAVE_' + ident[0].to_upper(), have)
536 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
537 conf.set10('USE_SYS_RANDOM_H', true)
538 conf.set10('HAVE_GETRANDOM', true)
540 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
541 conf.set10('USE_SYS_RANDOM_H', false)
542 conf.set10('HAVE_GETRANDOM', have)
545 #####################################################################
547 sed = find_program('sed')
548 awk = find_program('awk')
549 m4 = find_program('m4')
550 stat = find_program('stat')
551 git = find_program('git', required : false)
552 env = find_program('env')
554 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
555 mkdir_p = 'mkdir -p $DESTDIR/@0@'
556 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
557 splash_bmp = files('test/splash.bmp')
559 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
560 # /usr/sbin, /sbin, and fall back to the default from middle column.
561 progs = [['quotaon', '/usr/sbin/quotaon' ],
562 ['quotacheck', '/usr/sbin/quotacheck' ],
563 ['kill', '/usr/bin/kill' ],
564 ['kmod', '/usr/bin/kmod' ],
565 ['kexec', '/usr/sbin/kexec' ],
566 ['sulogin', '/usr/sbin/sulogin' ],
567 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
568 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
569 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
570 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
573 path = get_option(prog[0] + '-path')
575 message('Using @1@ for @0@'.format(prog[0], path))
577 exe = find_program(prog[0],
578 '/usr/sbin/' + prog[0],
581 path = exe.found() ? exe.path() : prog[1]
583 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
584 conf.set_quoted(name, path)
585 substs.set(name, path)
588 conf.set_quoted('TELINIT', get_option('telinit-path'))
590 if run_command('ln', '--relative', '--help').returncode() != 0
591 error('ln does not support --relative')
594 ############################################################
596 gperf = find_program('gperf')
598 gperf_test_format = '''
600 const char * in_word_set(const char *, @0@);
603 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
604 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
605 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
606 if cc.compiles(gperf_test)
607 gperf_len_type = 'size_t'
609 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
610 if cc.compiles(gperf_test)
611 gperf_len_type = 'unsigned'
613 error('unable to determine gperf len type')
616 message('gperf len type is @0@'.format(gperf_len_type))
617 conf.set('GPERF_LEN_TYPE', gperf_len_type,
618 description : 'The type of gperf "len" parameter')
620 ############################################################
622 if not cc.has_header('sys/capability.h')
623 error('POSIX caps headers not found')
625 foreach header : ['crypt.h',
628 'linux/vm_sockets.h',
630 'valgrind/memcheck.h',
631 'valgrind/valgrind.h',
634 conf.set10('HAVE_' + header.underscorify().to_upper(),
635 cc.has_header(header))
638 ############################################################
640 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
641 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
642 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
644 default_hierarchy = get_option('default-hierarchy')
645 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
646 description : 'default cgroup hierarchy as string')
647 if default_hierarchy == 'legacy'
648 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
649 elif default_hierarchy == 'hybrid'
650 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
652 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
655 time_epoch = get_option('time-epoch')
658 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
660 time_epoch = time_epoch.to_int()
661 conf.set('TIME_EPOCH', time_epoch)
663 system_uid_max = get_option('system-uid-max')
664 if system_uid_max == ''
665 system_uid_max = run_command(
667 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
668 '/etc/login.defs').stdout().strip()
669 if system_uid_max == ''
670 system_uid_max = '999'
673 system_uid_max = system_uid_max.to_int()
674 conf.set('SYSTEM_UID_MAX', system_uid_max)
675 substs.set('systemuidmax', system_uid_max)
676 message('maximum system UID is @0@'.format(system_uid_max))
678 system_gid_max = get_option('system-gid-max')
679 if system_gid_max == ''
680 system_gid_max = run_command(
682 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
683 '/etc/login.defs').stdout().strip()
684 if system_gid_max == ''
685 system_gid_max = '999'
688 system_gid_max = system_gid_max.to_int()
689 conf.set('SYSTEM_GID_MAX', system_gid_max)
690 substs.set('systemgidmax', system_gid_max)
691 message('maximum system GID is @0@'.format(system_gid_max))
693 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
694 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
695 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
696 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
697 substs.set('dynamicuidmin', dynamic_uid_min)
698 substs.set('dynamicuidmax', dynamic_uid_max)
700 container_uid_base_min = get_option('container-uid-base-min').to_int()
701 container_uid_base_max = get_option('container-uid-base-max').to_int()
702 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
703 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
704 substs.set('containeruidbasemin', container_uid_base_min)
705 substs.set('containeruidbasemax', container_uid_base_max)
707 nobody_user = get_option('nobody-user')
708 nobody_group = get_option('nobody-group')
710 getent_result = run_command('getent', 'passwd', '65534')
711 if getent_result.returncode() == 0
712 name = getent_result.stdout().split(':')[0]
713 if name != nobody_user
714 message('WARNING:\n' +
715 ' 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) +
716 ' Your build will result in an user table setup that is incompatible with the local system.')
719 id_result = run_command('id', '-u', nobody_user)
720 if id_result.returncode() == 0
721 id = id_result.stdout().to_int()
723 message('WARNING:\n' +
724 ' 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) +
725 ' Your build will result in an user table setup that is incompatible with the local system.')
729 getent_result = run_command('getent', 'group', '65534')
730 if getent_result.returncode() == 0
731 name = getent_result.stdout().split(':')[0]
732 if name != nobody_group
733 message('WARNING:\n' +
734 ' 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) +
735 ' Your build will result in an group table setup that is incompatible with the local system.')
738 id_result = run_command('id', '-g', nobody_group)
739 if id_result.returncode() == 0
740 id = id_result.stdout().to_int()
742 message('WARNING:\n' +
743 ' 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) +
744 ' Your build will result in an group table setup that is incompatible with the local system.')
747 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
748 message('WARNING:\n' +
749 ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
750 ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
753 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
754 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
755 substs.set('NOBODY_USER_NAME', nobody_user)
756 substs.set('NOBODY_GROUP_NAME', nobody_group)
758 tty_gid = get_option('tty-gid')
759 conf.set('TTY_GID', tty_gid)
760 substs.set('TTY_GID', tty_gid)
762 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
763 if get_option('users-gid') != ''
764 users_gid = get_option('users-gid').to_int()
768 substs.set('USERS_GID', users_gid)
770 if get_option('adm-group')
771 m4_defines += ['-DENABLE_ADM_GROUP']
774 if get_option('wheel-group')
775 m4_defines += ['-DENABLE_WHEEL_GROUP']
778 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
779 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
781 kill_user_processes = get_option('default-kill-user-processes')
782 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
783 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
785 dns_servers = get_option('dns-servers')
786 conf.set_quoted('DNS_SERVERS', dns_servers)
787 substs.set('DNS_SERVERS', dns_servers)
789 ntp_servers = get_option('ntp-servers')
790 conf.set_quoted('NTP_SERVERS', ntp_servers)
791 substs.set('NTP_SERVERS', ntp_servers)
793 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
795 substs.set('SUSHELL', get_option('debug-shell'))
796 substs.set('DEBUGTTY', get_option('debug-tty'))
798 debug = get_option('debug')
799 enable_debug_hashmap = false
800 enable_debug_mmap_cache = false
802 foreach name : debug.split(',')
804 enable_debug_hashmap = true
805 elif name == 'mmap-cache'
806 enable_debug_mmap_cache = true
808 message('unknown debug option "@0@", ignoring'.format(name))
812 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
813 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
815 #####################################################################
817 threads = dependency('threads')
818 librt = cc.find_library('rt')
819 libm = cc.find_library('m')
820 libdl = cc.find_library('dl')
821 libcrypt = cc.find_library('crypt')
823 libcap = dependency('libcap', required : false)
824 if not libcap.found()
825 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
826 libcap = cc.find_library('cap')
829 libmount = dependency('mount',
831 required : not fuzzer_build)
833 want_seccomp = get_option('seccomp')
834 if want_seccomp != 'false' and not fuzzer_build
835 libseccomp = dependency('libseccomp',
836 version : '>= 2.3.1',
837 required : want_seccomp == 'true')
838 have = libseccomp.found()
843 conf.set10('HAVE_SECCOMP', have)
844 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
846 want_selinux = get_option('selinux')
847 if want_selinux != 'false' and not fuzzer_build
848 libselinux = dependency('libselinux',
849 version : '>= 2.1.9',
850 required : want_selinux == 'true')
851 have = libselinux.found()
856 conf.set10('HAVE_SELINUX', have)
857 m4_defines += have ? ['-DHAVE_SELINUX'] : []
859 want_apparmor = get_option('apparmor')
860 if want_apparmor != 'false' and not fuzzer_build
861 libapparmor = dependency('libapparmor',
862 required : want_apparmor == 'true')
863 have = libapparmor.found()
868 conf.set10('HAVE_APPARMOR', have)
869 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
871 smack_run_label = get_option('smack-run-label')
872 if smack_run_label != ''
873 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
874 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
877 want_polkit = get_option('polkit')
878 install_polkit = false
879 install_polkit_pkla = false
880 if want_polkit != 'false' and not fuzzer_build
881 install_polkit = true
883 libpolkit = dependency('polkit-gobject-1',
885 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
886 message('Old polkit detected, will install pkla files')
887 install_polkit_pkla = true
890 conf.set10('ENABLE_POLKIT', install_polkit)
892 want_acl = get_option('acl')
893 if want_acl != 'false' and not fuzzer_build
894 libacl = cc.find_library('acl', required : want_acl == 'true')
895 have = libacl.found()
900 conf.set10('HAVE_ACL', have)
901 m4_defines += have ? ['-DHAVE_ACL'] : []
903 want_audit = get_option('audit')
904 if want_audit != 'false' and not fuzzer_build
905 libaudit = dependency('audit', required : want_audit == 'true')
906 have = libaudit.found()
911 conf.set10('HAVE_AUDIT', have)
913 want_blkid = get_option('blkid')
914 if want_blkid != 'false' and not fuzzer_build
915 libblkid = dependency('blkid', required : want_blkid == 'true')
916 have = libblkid.found()
921 conf.set10('HAVE_BLKID', have)
923 want_kmod = get_option('kmod')
924 if want_kmod != 'false' and not fuzzer_build
925 libkmod = dependency('libkmod',
927 required : want_kmod == 'true')
928 have = libkmod.found()
933 conf.set10('HAVE_KMOD', have)
935 want_pam = get_option('pam')
936 if want_pam != 'false' and not fuzzer_build
937 libpam = cc.find_library('pam', required : want_pam == 'true')
938 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
939 have = libpam.found() and libpam_misc.found()
945 conf.set10('HAVE_PAM', have)
946 m4_defines += have ? ['-DHAVE_PAM'] : []
948 want_microhttpd = get_option('microhttpd')
949 if want_microhttpd != 'false' and not fuzzer_build
950 libmicrohttpd = dependency('libmicrohttpd',
951 version : '>= 0.9.33',
952 required : want_microhttpd == 'true')
953 have = libmicrohttpd.found()
958 conf.set10('HAVE_MICROHTTPD', have)
959 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
961 want_libcryptsetup = get_option('libcryptsetup')
962 if want_libcryptsetup != 'false' and not fuzzer_build
963 libcryptsetup = dependency('libcryptsetup',
964 version : '>= 1.6.0',
965 required : want_libcryptsetup == 'true')
966 have = libcryptsetup.found()
971 conf.set10('HAVE_LIBCRYPTSETUP', have)
973 want_libcurl = get_option('libcurl')
974 if want_libcurl != 'false' and not fuzzer_build
975 libcurl = dependency('libcurl',
976 version : '>= 7.32.0',
977 required : want_libcurl == 'true')
978 have = libcurl.found()
983 conf.set10('HAVE_LIBCURL', have)
984 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
986 want_libidn = get_option('libidn')
987 want_libidn2 = get_option('libidn2')
988 if want_libidn == 'true' and want_libidn2 == 'true'
989 error('libidn and libidn2 cannot be requested simultaneously')
992 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
993 libidn = dependency('libidn',
994 required : want_libidn == 'true')
995 have = libidn.found()
1000 conf.set10('HAVE_LIBIDN', have)
1001 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
1002 if not have and want_libidn2 != 'false' and not fuzzer_build
1003 # libidn is used for both libidn and libidn2 objects
1004 libidn = dependency('libidn2',
1005 required : want_libidn2 == 'true')
1006 have = libidn.found()
1010 conf.set10('HAVE_LIBIDN2', have)
1011 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
1013 want_libiptc = get_option('libiptc')
1014 if want_libiptc != 'false' and not fuzzer_build
1015 libiptc = dependency('libiptc',
1016 required : want_libiptc == 'true')
1017 have = libiptc.found()
1022 conf.set10('HAVE_LIBIPTC', have)
1023 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
1025 want_qrencode = get_option('qrencode')
1026 if want_qrencode != 'false' and not fuzzer_build
1027 libqrencode = dependency('libqrencode',
1028 required : want_qrencode == 'true')
1029 have = libqrencode.found()
1034 conf.set10('HAVE_QRENCODE', have)
1036 want_gcrypt = get_option('gcrypt')
1037 if want_gcrypt != 'false' and not fuzzer_build
1038 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1039 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1040 have = libgcrypt.found() and libgpg_error.found()
1045 # link to neither of the libs if one is not found
1049 conf.set10('HAVE_GCRYPT', have)
1051 want_gnutls = get_option('gnutls')
1052 if want_gnutls != 'false' and not fuzzer_build
1053 libgnutls = dependency('gnutls',
1054 version : '>= 3.1.4',
1055 required : want_gnutls == 'true')
1056 have = libgnutls.found()
1061 conf.set10('HAVE_GNUTLS', have)
1063 want_elfutils = get_option('elfutils')
1064 if want_elfutils != 'false' and not fuzzer_build
1065 libdw = dependency('libdw',
1066 required : want_elfutils == 'true')
1067 have = libdw.found()
1072 conf.set10('HAVE_ELFUTILS', have)
1074 want_zlib = get_option('zlib')
1075 if want_zlib != 'false' and not fuzzer_build
1076 libz = dependency('zlib',
1077 required : want_zlib == 'true')
1083 conf.set10('HAVE_ZLIB', have)
1085 want_bzip2 = get_option('bzip2')
1086 if want_bzip2 != 'false' and not fuzzer_build
1087 libbzip2 = cc.find_library('bz2',
1088 required : want_bzip2 == 'true')
1089 have = libbzip2.found()
1094 conf.set10('HAVE_BZIP2', have)
1096 want_xz = get_option('xz')
1097 if want_xz != 'false' and not fuzzer_build
1098 libxz = dependency('liblzma',
1099 required : want_xz == 'true')
1100 have = libxz.found()
1105 conf.set10('HAVE_XZ', have)
1107 want_lz4 = get_option('lz4')
1108 if want_lz4 != 'false' and not fuzzer_build
1109 liblz4 = dependency('liblz4',
1110 required : want_lz4 == 'true')
1111 have = liblz4.found()
1116 conf.set10('HAVE_LZ4', have)
1118 want_xkbcommon = get_option('xkbcommon')
1119 if want_xkbcommon != 'false' and not fuzzer_build
1120 libxkbcommon = dependency('xkbcommon',
1121 version : '>= 0.3.0',
1122 required : want_xkbcommon == 'true')
1123 have = libxkbcommon.found()
1128 conf.set10('HAVE_XKBCOMMON', have)
1130 want_pcre2 = get_option('pcre2')
1131 if want_pcre2 != 'false'
1132 libpcre2 = dependency('libpcre2-8',
1133 required : want_pcre2 == 'true')
1134 have = libpcre2.found()
1139 conf.set10('HAVE_PCRE2', have)
1141 want_glib = get_option('glib')
1142 if want_glib != 'false' and not fuzzer_build
1143 libglib = dependency('glib-2.0',
1144 version : '>= 2.22.0',
1145 required : want_glib == 'true')
1146 libgobject = dependency('gobject-2.0',
1147 version : '>= 2.22.0',
1148 required : want_glib == 'true')
1149 libgio = dependency('gio-2.0',
1150 required : want_glib == 'true')
1151 have = libglib.found() and libgobject.found() and libgio.found()
1158 conf.set10('HAVE_GLIB', have)
1160 want_dbus = get_option('dbus')
1161 if want_dbus != 'false' and not fuzzer_build
1162 libdbus = dependency('dbus-1',
1163 version : '>= 1.3.2',
1164 required : want_dbus == 'true')
1165 have = libdbus.found()
1170 conf.set10('HAVE_DBUS', have)
1172 default_dnssec = get_option('default-dnssec')
1174 default_dnssec = 'no'
1176 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1177 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1178 default_dnssec = 'no'
1180 conf.set('DEFAULT_DNSSEC_MODE',
1181 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1182 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1184 want_importd = get_option('importd')
1185 if want_importd != 'false'
1186 have = (conf.get('HAVE_LIBCURL') == 1 and
1187 conf.get('HAVE_ZLIB') == 1 and
1188 conf.get('HAVE_BZIP2') == 1 and
1189 conf.get('HAVE_XZ') == 1 and
1190 conf.get('HAVE_GCRYPT') == 1)
1191 if want_importd == 'true' and not have
1192 error('importd support was requested, but dependencies are not available')
1197 conf.set10('ENABLE_IMPORTD', have)
1199 want_remote = get_option('remote')
1200 if want_remote != 'false'
1201 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1202 conf.get('HAVE_LIBCURL') == 1]
1203 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1204 # it's possible to build one without the other. Complain only if
1205 # support was explictly requested. The auxiliary files like sysusers
1206 # config should be installed when any of the programs are built.
1207 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1208 error('remote support was requested, but dependencies are not available')
1210 have = have_deps[0] or have_deps[1]
1214 conf.set10('ENABLE_REMOTE', have)
1216 foreach term : ['utmp',
1247 have = get_option(term)
1248 name = 'ENABLE_' + term.underscorify().to_upper()
1249 conf.set10(name, have)
1250 m4_defines += have ? ['-D' + name] : []
1253 want_tests = get_option('tests')
1254 install_tests = get_option('install-tests')
1255 slow_tests = get_option('slow-tests')
1259 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1261 #####################################################################
1263 if get_option('efi')
1264 efi_arch = host_machine.cpu_family()
1266 if efi_arch == 'x86'
1267 EFI_MACHINE_TYPE_NAME = 'ia32'
1268 gnu_efi_arch = 'ia32'
1269 elif efi_arch == 'x86_64'
1270 EFI_MACHINE_TYPE_NAME = 'x64'
1271 gnu_efi_arch = 'x86_64'
1272 elif efi_arch == 'arm'
1273 EFI_MACHINE_TYPE_NAME = 'arm'
1274 gnu_efi_arch = 'arm'
1275 elif efi_arch == 'aarch64'
1276 EFI_MACHINE_TYPE_NAME = 'aa64'
1277 gnu_efi_arch = 'aarch64'
1279 EFI_MACHINE_TYPE_NAME = ''
1284 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1286 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1290 conf.set10('ENABLE_EFI', have)
1292 #####################################################################
1294 config_h = configure_file(
1295 output : 'config.h',
1296 configuration : conf)
1298 includes = include_directories('src/basic',
1308 'src/libsystemd/sd-bus',
1309 'src/libsystemd/sd-device',
1310 'src/libsystemd/sd-hwdb',
1311 'src/libsystemd/sd-id128',
1312 'src/libsystemd/sd-netlink',
1313 'src/libsystemd/sd-network',
1314 'src/libsystemd-network',
1317 add_project_arguments('-include', 'config.h', language : 'c')
1321 subdir('src/systemd')
1323 subdir('src/libsystemd')
1324 subdir('src/libsystemd-network')
1325 subdir('src/journal')
1328 libjournal_core = static_library(
1330 libjournal_core_sources,
1332 include_directories : includes,
1335 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1336 libsystemd = shared_library(
1338 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1339 version : libsystemd_version,
1340 include_directories : includes,
1341 link_args : ['-shared',
1342 '-Wl,--version-script=' + libsystemd_sym_path],
1343 link_with : [libbasic,
1345 link_whole : [libsystemd_static,
1347 dependencies : [threads,
1351 link_depends : libsystemd_sym,
1353 install_dir : rootlibdir)
1355 ############################################################
1357 # binaries that have --help and are intended for use by humans,
1358 # usually, but not always, installed in /bin.
1359 public_programs = []
1361 subdir('src/libudev')
1362 subdir('src/shared')
1365 subdir('src/network')
1367 subdir('src/analyze')
1368 subdir('src/journal-remote')
1369 subdir('src/coredump')
1370 subdir('src/hostname')
1371 subdir('src/import')
1372 subdir('src/kernel-install')
1373 subdir('src/locale')
1374 subdir('src/machine')
1375 subdir('src/nspawn')
1376 subdir('src/resolve')
1377 subdir('src/timedate')
1378 subdir('src/timesync')
1379 subdir('src/vconsole')
1380 subdir('src/boot/efi')
1387 ############################################################
1389 # only static linking apart from libdl, to make sure that the
1390 # module is linked to all libraries that it uses.
1391 test_dlopen = executable(
1394 include_directories : includes,
1395 link_with : [libbasic],
1396 dependencies : [libdl])
1398 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1399 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1400 ['mymachines', 'ENABLE_MACHINED'],
1401 ['resolve', 'ENABLE_RESOLVE']]
1403 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1407 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1408 version_script_arg = join_paths(meson.current_source_dir(), sym)
1410 nss = shared_library(
1412 'src/nss-@0@/nss-@0@.c'.format(module),
1414 include_directories : includes,
1415 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1416 link_args : ['-Wl,-z,nodelete',
1418 '-Wl,--version-script=' + version_script_arg,
1420 link_with : [libsystemd_static,
1422 dependencies : [threads,
1426 install_dir : rootlibdir)
1428 # We cannot use shared_module because it does not support version suffix.
1429 # Unfortunately shared_library insists on creating the symlink…
1430 meson.add_install_script('sh', '-c',
1431 'rm $DESTDIR@0@/libnss_@1@.so'
1432 .format(rootlibdir, module))
1434 test('dlopen-nss_' + module,
1436 args : [nss.full_path()]) # path to dlopen must include a slash
1440 ############################################################
1442 executable('systemd',
1444 include_directories : includes,
1445 link_with : [libcore,
1447 dependencies : [threads,
1453 install_rpath : rootlibexecdir,
1455 install_dir : rootlibexecdir)
1457 meson.add_install_script(meson_make_symlink,
1458 join_paths(rootlibexecdir, 'systemd'),
1459 join_paths(rootsbindir, 'init'))
1461 exe = executable('systemd-analyze',
1462 systemd_analyze_sources,
1463 include_directories : includes,
1464 link_with : [libcore,
1466 dependencies : [threads,
1472 install_rpath : rootlibexecdir,
1474 public_programs += [exe]
1476 executable('systemd-journald',
1477 systemd_journald_sources,
1478 include_directories : includes,
1479 link_with : [libjournal_core,
1481 dependencies : [threads,
1485 install_rpath : rootlibexecdir,
1487 install_dir : rootlibexecdir)
1489 exe = executable('systemd-cat',
1490 systemd_cat_sources,
1491 include_directories : includes,
1492 link_with : [libjournal_core,
1494 dependencies : [threads],
1495 install_rpath : rootlibexecdir,
1497 public_programs += [exe]
1499 exe = executable('journalctl',
1501 include_directories : includes,
1502 link_with : [libshared],
1503 dependencies : [threads,
1508 install_rpath : rootlibexecdir,
1510 install_dir : rootbindir)
1511 public_programs += [exe]
1513 executable('systemd-getty-generator',
1514 'src/getty-generator/getty-generator.c',
1515 include_directories : includes,
1516 link_with : [libshared],
1517 install_rpath : rootlibexecdir,
1519 install_dir : systemgeneratordir)
1521 executable('systemd-debug-generator',
1522 'src/debug-generator/debug-generator.c',
1523 include_directories : includes,
1524 link_with : [libshared],
1525 install_rpath : rootlibexecdir,
1527 install_dir : systemgeneratordir)
1529 executable('systemd-fstab-generator',
1530 'src/fstab-generator/fstab-generator.c',
1531 'src/core/mount-setup.c',
1532 include_directories : includes,
1533 link_with : [libshared],
1534 install_rpath : rootlibexecdir,
1536 install_dir : systemgeneratordir)
1538 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1539 executable('30-systemd-environment-d-generator',
1540 'src/environment-d-generator/environment-d-generator.c',
1541 include_directories : includes,
1542 link_with : [libshared],
1543 install_rpath : rootlibexecdir,
1545 install_dir : userenvgeneratordir)
1547 meson.add_install_script(meson_make_symlink,
1548 join_paths(sysconfdir, 'environment'),
1549 join_paths(environmentdir, '99-environment.conf'))
1552 if conf.get('ENABLE_HIBERNATE') == 1
1553 executable('systemd-hibernate-resume-generator',
1554 'src/hibernate-resume/hibernate-resume-generator.c',
1555 include_directories : includes,
1556 link_with : [libshared],
1557 install_rpath : rootlibexecdir,
1559 install_dir : systemgeneratordir)
1561 executable('systemd-hibernate-resume',
1562 'src/hibernate-resume/hibernate-resume.c',
1563 include_directories : includes,
1564 link_with : [libshared],
1565 install_rpath : rootlibexecdir,
1567 install_dir : rootlibexecdir)
1570 if conf.get('HAVE_BLKID') == 1
1571 executable('systemd-gpt-auto-generator',
1572 'src/gpt-auto-generator/gpt-auto-generator.c',
1573 'src/basic/blkid-util.h',
1574 include_directories : includes,
1575 link_with : [libshared],
1576 dependencies : libblkid,
1577 install_rpath : rootlibexecdir,
1579 install_dir : systemgeneratordir)
1581 exe = executable('systemd-dissect',
1582 'src/dissect/dissect.c',
1583 include_directories : includes,
1584 link_with : [libshared],
1585 install_rpath : rootlibexecdir,
1587 install_dir : rootlibexecdir)
1588 public_programs += [exe]
1591 if conf.get('ENABLE_RESOLVE') == 1
1592 executable('systemd-resolved',
1593 systemd_resolved_sources,
1594 include_directories : includes,
1595 link_with : [libshared,
1597 libsystemd_resolve_core],
1598 dependencies : [threads,
1602 install_rpath : rootlibexecdir,
1604 install_dir : rootlibexecdir)
1606 exe = executable('systemd-resolve',
1607 systemd_resolve_sources,
1608 include_directories : includes,
1609 link_with : [libshared,
1611 libsystemd_resolve_core],
1612 dependencies : [threads,
1616 install_rpath : rootlibexecdir,
1618 public_programs += [exe]
1621 if conf.get('ENABLE_LOGIND') == 1
1622 executable('systemd-logind',
1623 systemd_logind_sources,
1624 include_directories : includes,
1625 link_with : [liblogind_core,
1627 dependencies : [threads,
1629 install_rpath : rootlibexecdir,
1631 install_dir : rootlibexecdir)
1633 exe = executable('loginctl',
1635 include_directories : includes,
1636 link_with : [libshared],
1637 dependencies : [threads,
1640 install_rpath : rootlibexecdir,
1642 install_dir : rootbindir)
1643 public_programs += [exe]
1645 exe = executable('systemd-inhibit',
1646 'src/login/inhibit.c',
1647 include_directories : includes,
1648 link_with : [libshared],
1649 install_rpath : rootlibexecdir,
1651 install_dir : rootbindir)
1652 public_programs += [exe]
1654 if conf.get('HAVE_PAM') == 1
1655 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1656 pam_systemd = shared_library(
1660 include_directories : includes,
1661 link_args : ['-shared',
1662 '-Wl,--version-script=' + version_script_arg],
1663 link_with : [libsystemd_static,
1665 dependencies : [threads,
1668 link_depends : pam_systemd_sym,
1670 install_dir : pamlibdir)
1672 test('dlopen-pam_systemd',
1674 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1678 if conf.get('HAVE_PAM') == 1
1679 executable('systemd-user-sessions',
1680 'src/user-sessions/user-sessions.c',
1681 include_directories : includes,
1682 link_with : [libshared],
1683 install_rpath : rootlibexecdir,
1685 install_dir : rootlibexecdir)
1688 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1689 exe = executable('bootctl',
1690 'src/boot/bootctl.c',
1691 include_directories : includes,
1692 link_with : [libshared],
1693 dependencies : [libblkid],
1694 install_rpath : rootlibexecdir,
1696 public_programs += [exe]
1699 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1700 include_directories : includes,
1701 link_with : [libshared],
1702 dependencies : [threads],
1703 install_rpath : rootlibexecdir,
1705 public_programs += [exe]
1707 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1708 include_directories : includes,
1709 link_with : [libshared],
1710 dependencies : [threads,
1715 install_rpath : rootlibexecdir,
1717 install_dir : rootbindir)
1718 public_programs += [exe]
1720 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1721 meson.add_install_script(meson_make_symlink,
1722 join_paths(rootbindir, 'systemctl'),
1723 join_paths(rootsbindir, alias))
1726 if conf.get('ENABLE_BACKLIGHT') == 1
1727 executable('systemd-backlight',
1728 'src/backlight/backlight.c',
1729 include_directories : includes,
1730 link_with : [libshared],
1731 install_rpath : rootlibexecdir,
1733 install_dir : rootlibexecdir)
1736 if conf.get('ENABLE_RFKILL') == 1
1737 executable('systemd-rfkill',
1738 'src/rfkill/rfkill.c',
1739 include_directories : includes,
1740 link_with : [libshared],
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootlibexecdir)
1746 executable('systemd-system-update-generator',
1747 'src/system-update-generator/system-update-generator.c',
1748 include_directories : includes,
1749 link_with : [libshared],
1750 install_rpath : rootlibexecdir,
1752 install_dir : systemgeneratordir)
1754 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1755 executable('systemd-cryptsetup',
1756 'src/cryptsetup/cryptsetup.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 dependencies : [libcryptsetup],
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootlibexecdir)
1764 executable('systemd-cryptsetup-generator',
1765 'src/cryptsetup/cryptsetup-generator.c',
1766 include_directories : includes,
1767 link_with : [libshared],
1768 dependencies : [libcryptsetup],
1769 install_rpath : rootlibexecdir,
1771 install_dir : systemgeneratordir)
1773 executable('systemd-veritysetup',
1774 'src/veritysetup/veritysetup.c',
1775 include_directories : includes,
1776 link_with : [libshared],
1777 dependencies : [libcryptsetup],
1778 install_rpath : rootlibexecdir,
1780 install_dir : rootlibexecdir)
1782 executable('systemd-veritysetup-generator',
1783 'src/veritysetup/veritysetup-generator.c',
1784 include_directories : includes,
1785 link_with : [libshared],
1786 dependencies : [libcryptsetup],
1787 install_rpath : rootlibexecdir,
1789 install_dir : systemgeneratordir)
1792 if conf.get('HAVE_SYSV_COMPAT') == 1
1793 executable('systemd-sysv-generator',
1794 'src/sysv-generator/sysv-generator.c',
1795 include_directories : includes,
1796 link_with : [libshared],
1797 install_rpath : rootlibexecdir,
1799 install_dir : systemgeneratordir)
1801 executable('systemd-rc-local-generator',
1802 'src/rc-local-generator/rc-local-generator.c',
1803 include_directories : includes,
1804 link_with : [libshared],
1805 install_rpath : rootlibexecdir,
1807 install_dir : systemgeneratordir)
1810 if conf.get('ENABLE_HOSTNAMED') == 1
1811 executable('systemd-hostnamed',
1812 'src/hostname/hostnamed.c',
1813 include_directories : includes,
1814 link_with : [libshared],
1815 install_rpath : rootlibexecdir,
1817 install_dir : rootlibexecdir)
1819 exe = executable('hostnamectl',
1820 'src/hostname/hostnamectl.c',
1821 include_directories : includes,
1822 link_with : [libshared],
1823 install_rpath : rootlibexecdir,
1825 public_programs += [exe]
1828 if conf.get('ENABLE_LOCALED') == 1
1829 if conf.get('HAVE_XKBCOMMON') == 1
1830 # logind will load libxkbcommon.so dynamically on its own
1836 executable('systemd-localed',
1837 systemd_localed_sources,
1838 include_directories : includes,
1839 link_with : [libshared],
1840 dependencies : deps,
1841 install_rpath : rootlibexecdir,
1843 install_dir : rootlibexecdir)
1845 exe = executable('localectl',
1847 include_directories : includes,
1848 link_with : [libshared],
1849 install_rpath : rootlibexecdir,
1851 public_programs += [exe]
1854 if conf.get('ENABLE_TIMEDATED') == 1
1855 executable('systemd-timedated',
1856 'src/timedate/timedated.c',
1857 include_directories : includes,
1858 link_with : [libshared],
1859 install_rpath : rootlibexecdir,
1861 install_dir : rootlibexecdir)
1863 exe = executable('timedatectl',
1864 'src/timedate/timedatectl.c',
1865 include_directories : includes,
1866 install_rpath : rootlibexecdir,
1867 link_with : [libshared],
1869 public_programs += [exe]
1872 if conf.get('ENABLE_TIMESYNCD') == 1
1873 executable('systemd-timesyncd',
1874 systemd_timesyncd_sources,
1875 include_directories : includes,
1876 link_with : [libshared],
1877 dependencies : [threads,
1879 install_rpath : rootlibexecdir,
1881 install_dir : rootlibexecdir)
1884 if conf.get('ENABLE_MACHINED') == 1
1885 executable('systemd-machined',
1886 systemd_machined_sources,
1887 include_directories : includes,
1888 link_with : [libmachine_core,
1890 install_rpath : rootlibexecdir,
1892 install_dir : rootlibexecdir)
1894 exe = executable('machinectl',
1895 'src/machine/machinectl.c',
1896 include_directories : includes,
1897 link_with : [libshared],
1898 dependencies : [threads,
1901 install_rpath : rootlibexecdir,
1903 install_dir : rootbindir)
1904 public_programs += [exe]
1907 if conf.get('ENABLE_IMPORTD') == 1
1908 executable('systemd-importd',
1909 systemd_importd_sources,
1910 include_directories : includes,
1911 link_with : [libshared],
1912 dependencies : [threads],
1913 install_rpath : rootlibexecdir,
1915 install_dir : rootlibexecdir)
1917 systemd_pull = executable('systemd-pull',
1918 systemd_pull_sources,
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [libcurl,
1926 install_rpath : rootlibexecdir,
1928 install_dir : rootlibexecdir)
1930 systemd_import = executable('systemd-import',
1931 systemd_import_sources,
1932 include_directories : includes,
1933 link_with : [libshared],
1934 dependencies : [libcurl,
1938 install_rpath : rootlibexecdir,
1940 install_dir : rootlibexecdir)
1942 systemd_export = executable('systemd-export',
1943 systemd_export_sources,
1944 include_directories : includes,
1945 link_with : [libshared],
1946 dependencies : [libcurl,
1950 install_rpath : rootlibexecdir,
1952 install_dir : rootlibexecdir)
1953 public_programs += [systemd_pull, systemd_import, systemd_export]
1956 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1957 exe = executable('systemd-journal-upload',
1958 systemd_journal_upload_sources,
1959 include_directories : includes,
1960 link_with : [libshared],
1961 dependencies : [threads,
1966 install_rpath : rootlibexecdir,
1968 install_dir : rootlibexecdir)
1969 public_programs += [exe]
1972 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1973 s_j_remote = executable('systemd-journal-remote',
1974 systemd_journal_remote_sources,
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [threads,
1982 install_rpath : rootlibexecdir,
1984 install_dir : rootlibexecdir)
1986 s_j_gatewayd = executable('systemd-journal-gatewayd',
1987 systemd_journal_gatewayd_sources,
1988 include_directories : includes,
1989 link_with : [libshared],
1990 dependencies : [threads,
1995 install_rpath : rootlibexecdir,
1997 install_dir : rootlibexecdir)
1998 public_programs += [s_j_remote, s_j_gatewayd]
2001 if conf.get('ENABLE_COREDUMP') == 1
2002 executable('systemd-coredump',
2003 systemd_coredump_sources,
2004 include_directories : includes,
2005 link_with : [libshared],
2006 dependencies : [threads,
2011 install_rpath : rootlibexecdir,
2013 install_dir : rootlibexecdir)
2015 exe = executable('coredumpctl',
2016 coredumpctl_sources,
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : [threads,
2022 install_rpath : rootlibexecdir,
2024 public_programs += [exe]
2027 if conf.get('ENABLE_BINFMT') == 1
2028 exe = executable('systemd-binfmt',
2029 'src/binfmt/binfmt.c',
2030 include_directories : includes,
2031 link_with : [libshared],
2032 install_rpath : rootlibexecdir,
2034 install_dir : rootlibexecdir)
2035 public_programs += [exe]
2037 meson.add_install_script('sh', '-c',
2038 mkdir_p.format(binfmtdir))
2039 meson.add_install_script('sh', '-c',
2040 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2043 if conf.get('ENABLE_VCONSOLE') == 1
2044 executable('systemd-vconsole-setup',
2045 'src/vconsole/vconsole-setup.c',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2050 install_dir : rootlibexecdir)
2053 if conf.get('ENABLE_RANDOMSEED') == 1
2054 executable('systemd-random-seed',
2055 'src/random-seed/random-seed.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2060 install_dir : rootlibexecdir)
2063 if conf.get('ENABLE_FIRSTBOOT') == 1
2064 executable('systemd-firstboot',
2065 'src/firstboot/firstboot.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 dependencies : [libcrypt],
2069 install_rpath : rootlibexecdir,
2071 install_dir : rootbindir)
2074 executable('systemd-remount-fs',
2075 'src/remount-fs/remount-fs.c',
2076 'src/core/mount-setup.c',
2077 'src/core/mount-setup.h',
2078 include_directories : includes,
2079 link_with : [libshared],
2080 install_rpath : rootlibexecdir,
2082 install_dir : rootlibexecdir)
2084 executable('systemd-machine-id-setup',
2085 'src/machine-id-setup/machine-id-setup-main.c',
2086 'src/core/machine-id-setup.c',
2087 'src/core/machine-id-setup.h',
2088 include_directories : includes,
2089 link_with : [libshared],
2090 install_rpath : rootlibexecdir,
2092 install_dir : rootbindir)
2094 executable('systemd-fsck',
2096 include_directories : includes,
2097 link_with : [libshared],
2098 install_rpath : rootlibexecdir,
2100 install_dir : rootlibexecdir)
2102 executable('systemd-growfs',
2103 'src/partition/growfs.c',
2104 include_directories : includes,
2105 link_with : [libshared],
2106 dependencies : [libcryptsetup],
2107 install_rpath : rootlibexecdir,
2109 install_dir : rootlibexecdir)
2111 executable('systemd-makefs',
2112 'src/partition/makefs.c',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 install_rpath : rootlibexecdir,
2117 install_dir : rootlibexecdir)
2119 executable('systemd-sleep',
2120 'src/sleep/sleep.c',
2121 include_directories : includes,
2122 link_with : [libshared],
2123 install_rpath : rootlibexecdir,
2125 install_dir : rootlibexecdir)
2127 exe = executable('systemd-sysctl',
2128 'src/sysctl/sysctl.c',
2129 include_directories : includes,
2130 link_with : [libshared],
2131 install_rpath : rootlibexecdir,
2133 install_dir : rootlibexecdir)
2134 public_programs += [exe]
2136 executable('systemd-ac-power',
2137 'src/ac-power/ac-power.c',
2138 include_directories : includes,
2139 link_with : [libshared],
2140 install_rpath : rootlibexecdir,
2142 install_dir : rootlibexecdir)
2144 exe = executable('systemd-detect-virt',
2145 'src/detect-virt/detect-virt.c',
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2150 public_programs += [exe]
2152 exe = executable('systemd-delta',
2153 'src/delta/delta.c',
2154 include_directories : includes,
2155 link_with : [libshared],
2156 install_rpath : rootlibexecdir,
2158 public_programs += [exe]
2160 exe = executable('systemd-escape',
2161 'src/escape/escape.c',
2162 include_directories : includes,
2163 link_with : [libshared],
2164 install_rpath : rootlibexecdir,
2166 install_dir : rootbindir)
2167 public_programs += [exe]
2169 exe = executable('systemd-notify',
2170 'src/notify/notify.c',
2171 include_directories : includes,
2172 link_with : [libshared],
2173 install_rpath : rootlibexecdir,
2175 install_dir : rootbindir)
2176 public_programs += [exe]
2178 executable('systemd-volatile-root',
2179 'src/volatile-root/volatile-root.c',
2180 include_directories : includes,
2181 link_with : [libshared],
2182 install_rpath : rootlibexecdir,
2184 install_dir : rootlibexecdir)
2186 executable('systemd-cgroups-agent',
2187 'src/cgroups-agent/cgroups-agent.c',
2188 include_directories : includes,
2189 link_with : [libshared],
2190 install_rpath : rootlibexecdir,
2192 install_dir : rootlibexecdir)
2194 exe = executable('systemd-path',
2196 include_directories : includes,
2197 link_with : [libshared],
2198 install_rpath : rootlibexecdir,
2200 public_programs += [exe]
2202 exe = executable('systemd-ask-password',
2203 'src/ask-password/ask-password.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2208 install_dir : rootbindir)
2209 public_programs += [exe]
2211 executable('systemd-reply-password',
2212 'src/reply-password/reply-password.c',
2213 include_directories : includes,
2214 link_with : [libshared],
2215 install_rpath : rootlibexecdir,
2217 install_dir : rootlibexecdir)
2219 exe = executable('systemd-tty-ask-password-agent',
2220 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2221 include_directories : includes,
2222 link_with : [libshared],
2223 install_rpath : rootlibexecdir,
2225 install_dir : rootbindir)
2226 public_programs += [exe]
2228 exe = executable('systemd-cgls',
2230 include_directories : includes,
2231 link_with : [libshared],
2232 install_rpath : rootlibexecdir,
2234 public_programs += [exe]
2236 exe = executable('systemd-cgtop',
2237 'src/cgtop/cgtop.c',
2238 include_directories : includes,
2239 link_with : [libshared],
2240 install_rpath : rootlibexecdir,
2242 public_programs += [exe]
2244 executable('systemd-initctl',
2245 'src/initctl/initctl.c',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 install_rpath : rootlibexecdir,
2250 install_dir : rootlibexecdir)
2252 exe = executable('systemd-mount',
2253 'src/mount/mount-tool.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 install_rpath : rootlibexecdir,
2258 public_programs += [exe]
2260 meson.add_install_script(meson_make_symlink,
2261 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2263 exe = executable('systemd-run',
2265 include_directories : includes,
2266 link_with : [libshared],
2267 install_rpath : rootlibexecdir,
2269 public_programs += [exe]
2271 exe = executable('systemd-stdio-bridge',
2272 'src/stdio-bridge/stdio-bridge.c',
2273 include_directories : includes,
2274 link_with : [libshared],
2275 install_rpath : rootlibexecdir,
2277 public_programs += [exe]
2279 exe = executable('busctl',
2280 'src/busctl/busctl.c',
2281 'src/busctl/busctl-introspect.c',
2282 'src/busctl/busctl-introspect.h',
2283 include_directories : includes,
2284 link_with : [libshared],
2285 install_rpath : rootlibexecdir,
2287 public_programs += [exe]
2289 if conf.get('ENABLE_SYSUSERS') == 1
2290 exe = executable('systemd-sysusers',
2291 'src/sysusers/sysusers.c',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 install_rpath : rootlibexecdir,
2296 install_dir : rootbindir)
2297 public_programs += [exe]
2300 if conf.get('ENABLE_TMPFILES') == 1
2301 exe = executable('systemd-tmpfiles',
2302 'src/tmpfiles/tmpfiles.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 dependencies : [libacl],
2306 install_rpath : rootlibexecdir,
2308 install_dir : rootbindir)
2309 public_programs += [exe]
2311 test('test-systemd-tmpfiles',
2312 test_systemd_tmpfiles_py,
2313 args : exe.full_path())
2314 # https://github.com/mesonbuild/meson/issues/2681
2317 if conf.get('ENABLE_HWDB') == 1
2318 exe = executable('systemd-hwdb',
2320 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2321 include_directories : includes,
2322 link_with : [libudev_static],
2323 install_rpath : udev_rpath,
2325 install_dir : rootbindir)
2326 public_programs += [exe]
2329 if conf.get('ENABLE_QUOTACHECK') == 1
2330 executable('systemd-quotacheck',
2331 'src/quotacheck/quotacheck.c',
2332 include_directories : includes,
2333 link_with : [libshared],
2334 install_rpath : rootlibexecdir,
2336 install_dir : rootlibexecdir)
2339 exe = executable('systemd-socket-proxyd',
2340 'src/socket-proxy/socket-proxyd.c',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 dependencies : [threads],
2344 install_rpath : rootlibexecdir,
2346 install_dir : rootlibexecdir)
2347 public_programs += [exe]
2349 exe = executable('systemd-udevd',
2350 systemd_udevd_sources,
2351 include_directories : includes,
2352 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2353 link_with : [libudev_core,
2356 dependencies : [threads,
2361 install_rpath : udev_rpath,
2363 install_dir : rootlibexecdir)
2364 public_programs += [exe]
2366 exe = executable('udevadm',
2368 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2369 include_directories : includes,
2370 link_with : [libudev_core,
2373 dependencies : [threads,
2378 install_rpath : udev_rpath,
2380 install_dir : rootbindir)
2381 public_programs += [exe]
2383 executable('systemd-shutdown',
2384 systemd_shutdown_sources,
2385 include_directories : includes,
2386 link_with : [libshared],
2387 install_rpath : rootlibexecdir,
2389 install_dir : rootlibexecdir)
2391 executable('systemd-update-done',
2392 'src/update-done/update-done.c',
2393 include_directories : includes,
2394 link_with : [libshared],
2395 install_rpath : rootlibexecdir,
2397 install_dir : rootlibexecdir)
2399 executable('systemd-update-utmp',
2400 'src/update-utmp/update-utmp.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 dependencies : [libaudit],
2404 install_rpath : rootlibexecdir,
2406 install_dir : rootlibexecdir)
2408 if conf.get('HAVE_KMOD') == 1
2409 executable('systemd-modules-load',
2410 'src/modules-load/modules-load.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 dependencies : [libkmod],
2414 install_rpath : rootlibexecdir,
2416 install_dir : rootlibexecdir)
2418 meson.add_install_script('sh', '-c',
2419 mkdir_p.format(modulesloaddir))
2420 meson.add_install_script('sh', '-c',
2421 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2424 exe = executable('systemd-nspawn',
2425 systemd_nspawn_sources,
2426 'src/core/mount-setup.c', # FIXME: use a variable?
2427 'src/core/mount-setup.h',
2428 'src/core/loopback-setup.c',
2429 'src/core/loopback-setup.h',
2430 include_directories : [includes, include_directories('src/nspawn')],
2431 link_with : [libshared],
2432 dependencies : [libacl,
2436 install_rpath : rootlibexecdir,
2438 public_programs += [exe]
2440 if conf.get('ENABLE_NETWORKD') == 1
2441 executable('systemd-networkd',
2442 systemd_networkd_sources,
2443 include_directories : includes,
2444 link_with : [libnetworkd_core,
2448 dependencies : [threads],
2449 install_rpath : rootlibexecdir,
2451 install_dir : rootlibexecdir)
2453 executable('systemd-networkd-wait-online',
2454 systemd_networkd_wait_online_sources,
2455 include_directories : includes,
2456 link_with : [libnetworkd_core,
2458 install_rpath : rootlibexecdir,
2460 install_dir : rootlibexecdir)
2462 exe = executable('networkctl',
2464 include_directories : includes,
2465 link_with : [libsystemd_network,
2467 install_rpath : rootlibexecdir,
2469 install_dir : rootbindir)
2470 public_programs += [exe]
2473 executable('systemd-sulogin-shell',
2474 ['src/sulogin-shell/sulogin-shell.c'],
2475 include_directories : includes,
2476 link_with : [libshared],
2477 install_rpath : rootlibexecdir,
2479 install_dir : rootlibexecdir)
2481 ############################################################
2483 foreach tuple : tests
2485 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2486 dependencies = tuple[2]
2487 condition = tuple.length() >= 4 ? tuple[3] : ''
2488 type = tuple.length() >= 5 ? tuple[4] : ''
2489 defs = tuple.length() >= 6 ? tuple[5] : []
2490 incs = tuple.length() >= 7 ? tuple[6] : includes
2493 name = sources[0].split('/')[-1].split('.')[0]
2494 if type.startswith('timeout=')
2495 timeout = type.split('=')[1].to_int()
2498 if want_tests == 'false'
2499 message('Not compiling @0@ because tests is set to false'.format(name))
2500 elif condition == '' or conf.get(condition) == 1
2504 include_directories : incs,
2505 link_with : link_with,
2506 dependencies : dependencies,
2508 install_rpath : rootlibexecdir,
2509 install : install_tests,
2510 install_dir : join_paths(testsdir, type))
2513 message('@0@ is a manual test'.format(name))
2514 elif type == 'unsafe' and want_tests != 'unsafe'
2515 message('@0@ is an unsafe test'.format(name))
2522 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2526 test_libsystemd_sym = executable(
2527 'test-libsystemd-sym',
2528 test_libsystemd_sym_c,
2529 include_directories : includes,
2530 link_with : [libsystemd],
2531 install : install_tests,
2532 install_dir : testsdir)
2533 test('test-libsystemd-sym',
2534 test_libsystemd_sym)
2536 test_libudev_sym = executable(
2539 include_directories : includes,
2540 c_args : ['-Wno-deprecated-declarations'],
2541 link_with : [libudev],
2542 install : install_tests,
2543 install_dir : testsdir)
2544 test('test-libudev-sym',
2547 ############################################################
2551 foreach tuple : fuzzers
2553 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2554 dependencies = tuple[2]
2555 defs = tuple.length() >= 4 ? tuple[3] : []
2556 incs = tuple.length() >= 5 ? tuple[4] : includes
2559 dependencies += fuzzing_engine
2561 sources += 'src/fuzz/fuzz-main.c'
2564 name = sources[0].split('/')[-1].split('.')[0]
2566 fuzzer_exes += executable(
2569 include_directories : [incs, include_directories('src/fuzz')],
2570 link_with : link_with,
2571 dependencies : dependencies,
2576 run_target('fuzzers',
2577 depends : fuzzer_exes,
2580 ############################################################
2582 make_directive_index_py = find_program('tools/make-directive-index.py')
2583 make_man_index_py = find_program('tools/make-man-index.py')
2584 xml_helper_py = find_program('tools/xml_helper.py')
2585 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2589 subdir('sysusers.d')
2590 subdir('tmpfiles.d')
2595 subdir('shell-completion/bash')
2596 subdir('shell-completion/zsh')
2597 subdir('docs/sysvinit')
2598 subdir('docs/var-log')
2600 # FIXME: figure out if the warning is true:
2601 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2602 install_subdir('factory/etc',
2603 install_dir : factorydir)
2606 install_data('xorg/50-systemd-user.sh',
2607 install_dir : xinitrcdir)
2608 install_data('modprobe.d/systemd.conf',
2609 install_dir : modprobedir)
2610 install_data('LICENSE.GPL2',
2615 'doc/DISTRO_PORTING',
2616 'doc/ENVIRONMENT.md',
2618 'doc/TRANSIENT-SETTINGS.md',
2621 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2622 install_dir : docdir)
2624 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2625 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2627 ############################################################
2629 meson_check_help = find_program('tools/meson-check-help.sh')
2631 foreach exec : public_programs
2632 name = exec.full_path().split('/')[-1]
2633 test('check-help-' + name,
2635 args : [exec.full_path()])
2638 ############################################################
2641 foreach p : fuzz_regression_tests
2642 a = p.split('/')[-3]
2643 b = p.split('/')[-2]
2644 c = p.split('/')[-1]
2647 build = sanitize_address
2649 error('unknown sanitizer @0@'.format(a))
2652 name = '@1@:@0@'.format(a, b)
2655 if want_tests == 'false'
2656 message('Not compiling @0@ because tests is set to false'.format(name))
2657 elif not sanitizers.contains(a)
2658 message('Not compiling @0@ because @1@ sanitizer is not available'.format(name, a))
2660 exe = custom_target(
2664 command : [env, 'ln', '-fs',
2665 join_paths(build.full_path(), b),
2667 build_by_default : true)
2669 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2674 if want_tests != 'false' and slow_tests
2675 test(c, env, args : [exe.full_path(),
2676 join_paths(meson.source_root(),
2677 'test/fuzz-regressions',
2682 ############################################################
2685 all_files = run_command(
2687 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2690 all_files = files(all_files.stdout().split())
2695 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2699 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2703 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2706 command : [meson_git_contrib_sh])
2710 git_head = run_command(
2712 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2713 'rev-parse', 'HEAD']).stdout().strip()
2714 git_head_short = run_command(
2716 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2717 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2721 command : ['git', 'archive',
2722 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2724 '--prefix', 'systemd-@0@/'.format(git_head),
2728 ############################################################
2730 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2733 depends : [man, libsystemd, libudev],
2734 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2736 ############################################################
2739 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2741 'prefix directory: @0@'.format(prefixdir),
2742 'rootprefix directory: @0@'.format(rootprefixdir),
2743 'sysconf directory: @0@'.format(sysconfdir),
2744 'include directory: @0@'.format(includedir),
2745 'lib directory: @0@'.format(libdir),
2746 'rootlib directory: @0@'.format(rootlibdir),
2747 'SysV init scripts: @0@'.format(sysvinit_path),
2748 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2749 'PAM modules directory: @0@'.format(pamlibdir),
2750 'PAM configuration directory: @0@'.format(pamconfdir),
2751 'RPM macros directory: @0@'.format(rpmmacrosdir),
2752 'modprobe.d directory: @0@'.format(modprobedir),
2753 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2754 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2755 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2756 'bash completions directory: @0@'.format(bashcompletiondir),
2757 'zsh completions directory: @0@'.format(zshcompletiondir),
2758 'extra start script: @0@'.format(get_option('rc-local')),
2759 'extra stop script: @0@'.format(get_option('halt-local')),
2760 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2761 get_option('debug-tty')),
2762 'TTY GID: @0@'.format(tty_gid),
2763 'users GID: @0@'.format(users_gid),
2764 'maximum system UID: @0@'.format(system_uid_max),
2765 'maximum system GID: @0@'.format(system_gid_max),
2766 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2767 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2768 'minimum container UID base: @0@'.format(container_uid_base_min),
2769 'maximum container UID base: @0@'.format(container_uid_base_max),
2770 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2771 'render group access mode: @0@'.format(get_option('group-render-mode')),
2772 'certificate root directory: @0@'.format(get_option('certificate-root')),
2773 'support URL: @0@'.format(support_url),
2774 'nobody user name: @0@'.format(nobody_user),
2775 'nobody group name: @0@'.format(nobody_group),
2776 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2777 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2779 'default DNSSEC mode: @0@'.format(default_dnssec),
2780 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2781 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2783 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2784 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2786 'default DNS servers: @0@'.format(alt_dns_servers),
2787 'default NTP servers: @0@'.format(alt_ntp_servers)]
2789 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2790 '@@0@'.format(time_epoch)).stdout().strip()
2792 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2795 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2796 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2797 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2799 if conf.get('ENABLE_EFI') == 1
2801 'efi arch: @0@'.format(efi_arch)]
2805 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2806 'EFI CC @0@'.format(efi_cc),
2807 'EFI lib directory: @0@'.format(efi_libdir),
2808 'EFI lds directory: @0@'.format(efi_ldsdir),
2809 'EFI include directory: @0@'.format(efi_incdir)]
2862 ['legacy pkla', install_polkit_pkla],
2864 ['gnu-efi', have_gnu_efi],
2871 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2874 ['man pages', want_man],
2875 ['html pages', want_html],
2876 ['man page indices', want_man and have_lxml],
2877 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2882 ['adm group', get_option('adm-group')],
2883 ['wheel group', get_option('wheel-group')],
2886 ['debug mmap cache'],
2889 cond = tuple.get(1, '')
2891 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2892 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2893 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2898 missing += [tuple[0]]
2904 'enabled features: @0@'.format(', '.join(found)),
2906 'disabled features: @0@'.format(', '.join(missing)),
2908 message('\n '.join(status))
2910 if rootprefixdir != rootprefix_default
2911 message('WARNING:\n' +
2912 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2913 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2914 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))