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 docdir = join_paths(datadir, 'doc/systemd')
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 dbuspolicydir = get_option('dbuspolicydir')
147 if dbuspolicydir == ''
148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
151 dbussessionservicedir = get_option('dbussessionservicedir')
152 if dbussessionservicedir == ''
153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
156 dbussystemservicedir = get_option('dbussystemservicedir')
157 if dbussystemservicedir == ''
158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
161 pamlibdir = get_option('pamlibdir')
163 pamlibdir = join_paths(rootlibdir, 'security')
166 pamconfdir = get_option('pamconfdir')
168 pamconfdir = join_paths(sysconfdir, 'pam.d')
171 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
172 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
173 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
174 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
175 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
176 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
177 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
178 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
179 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
180 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
181 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
182 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
183 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
184 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
185 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
186 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
187 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
188 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
189 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
190 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
191 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
192 conf.set_quoted('ROOTPREFIX', rootprefixdir)
193 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
194 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
195 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
196 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
197 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
198 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
199 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
200 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
201 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
202 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
203 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
204 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
205 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
206 conf.set_quoted('LIBDIR', libdir)
207 conf.set_quoted('ROOTLIBDIR', rootlibdir)
208 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
209 conf.set_quoted('BOOTLIBDIR', bootlibdir)
210 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
211 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
212 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
213 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
214 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
215 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
217 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
218 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
220 substs.set('prefix', prefixdir)
221 substs.set('exec_prefix', prefixdir)
222 substs.set('libdir', libdir)
223 substs.set('rootlibdir', rootlibdir)
224 substs.set('includedir', includedir)
225 substs.set('pkgsysconfdir', pkgsysconfdir)
226 substs.set('bindir', bindir)
227 substs.set('rootbindir', rootbindir)
228 substs.set('rootlibexecdir', rootlibexecdir)
229 substs.set('systemunitdir', systemunitdir)
230 substs.set('userunitdir', userunitdir)
231 substs.set('systempresetdir', systempresetdir)
232 substs.set('userpresetdir', userpresetdir)
233 substs.set('udevhwdbdir', udevhwdbdir)
234 substs.set('udevrulesdir', udevrulesdir)
235 substs.set('udevlibexecdir', udevlibexecdir)
236 substs.set('catalogdir', catalogdir)
237 substs.set('tmpfilesdir', tmpfilesdir)
238 substs.set('sysusersdir', sysusersdir)
239 substs.set('sysctldir', sysctldir)
240 substs.set('binfmtdir', binfmtdir)
241 substs.set('modulesloaddir', modulesloaddir)
242 substs.set('systemgeneratordir', systemgeneratordir)
243 substs.set('usergeneratordir', usergeneratordir)
244 substs.set('systemenvgeneratordir', systemenvgeneratordir)
245 substs.set('userenvgeneratordir', userenvgeneratordir)
246 substs.set('systemshutdowndir', systemshutdowndir)
247 substs.set('systemsleepdir', systemsleepdir)
248 substs.set('VARLOGDIR', varlogdir)
249 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
250 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
251 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
252 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
253 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
254 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
255 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
257 #####################################################################
259 cc = meson.get_compiler('c')
260 pkgconfig = import('pkgconfig')
261 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
262 meson_build_sh = find_program('tools/meson-build.sh')
264 if get_option('tests') != 'false'
265 cxx = find_program('c++', required : false)
267 # Used only for tests
272 want_ossfuzz = get_option('oss-fuzz')
273 want_libfuzzer = get_option('llvm-fuzz')
274 fuzzer_build = want_ossfuzz or want_libfuzzer
275 if want_ossfuzz and want_libfuzzer
276 error('only one of oss-fuzz and llvm-fuzz can be specified')
279 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
282 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
285 foreach arg : ['-Wextra',
288 '-Wmissing-include-dirs',
289 '-Wold-style-definition',
292 '-Wdeclaration-after-statement',
294 '-Wsuggest-attribute=noreturn',
295 '-Werror=missing-prototypes',
296 '-Werror=implicit-function-declaration',
297 '-Werror=missing-declarations',
298 '-Werror=return-type',
299 '-Werror=incompatible-pointer-types',
301 '-Wstrict-prototypes',
303 '-Wmissing-noreturn',
304 '-Wimplicit-fallthrough=5',
307 '-Wstrict-aliasing=2',
314 '-fdiagnostics-show-option',
315 '-fno-strict-aliasing',
316 '-fvisibility=hidden',
318 '-fstack-protector-strong',
319 '--param=ssp-buffer-size=4',
321 if cc.has_argument(arg)
322 add_project_arguments(arg, language : 'c')
326 # the oss-fuzz fuzzers are not built with -fPIE, so don't
327 # enable it when we are linking against them
329 if cc.has_argument('-fPIE')
330 add_project_arguments('-fPIE', language : 'c')
334 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
335 # arguments, just emits a warnings. So test for the "positive" version instead.
336 foreach arg : ['unused-parameter',
337 'missing-field-initializers',
340 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
342 if cc.has_argument('-W' + arg)
343 add_project_arguments('-Wno-' + arg, language : 'c')
349 #include <inttypes.h>
350 typedef uint64_t usec_t;
351 usec_t now(clockid_t clock);
356 ', name : '-Werror=shadow with local shadowing')
357 add_project_arguments('-Werror=shadow', language : 'c')
360 if cc.get_id() == 'clang'
361 foreach arg : ['-Wno-typedef-redefinition',
362 '-Wno-gnu-variable-sized-type-not-at-end',
364 if cc.has_argument(arg,
365 name : '@0@ is supported'.format(arg))
366 add_project_arguments(arg, language : 'c')
371 link_test_c = files('tools/meson-link-test.c')
373 # --as-needed and --no-undefined are provided by meson by default,
374 # run mesonconf to see what is enabled
375 foreach arg : ['-Wl,-z,relro',
380 have = run_command(check_compilation_sh,
381 cc.cmd_array(), '-x', 'c', arg,
382 '-include', link_test_c).returncode() == 0
383 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
384 if have and (arg != '-pie' or not fuzzer_build)
385 add_project_link_arguments(arg, language : 'c')
389 # Check if various sanitizers are supported
391 foreach arg : ['address']
393 have = run_command(check_compilation_sh,
394 cc.cmd_array(), '-x', 'c',
395 '-fsanitize=@0@'.format(arg),
396 '-include', link_test_c).returncode() == 0
397 message('@0@ sanitizer supported: @1@'.format(arg, have ? 'yes' : 'no'))
403 if get_option('buildtype') != 'debug'
404 foreach arg : ['-ffunction-sections',
406 if cc.has_argument(arg,
407 name : '@0@ is supported'.format(arg))
408 add_project_arguments(arg, language : 'c')
412 foreach arg : ['-Wl,--gc-sections']
413 have = run_command(check_compilation_sh,
414 cc.cmd_array(), '-x', 'c', arg,
415 '-include', link_test_c).returncode() == 0
416 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
418 add_project_link_arguments(arg, language : 'c')
423 cpp = ' '.join(cc.cmd_array()) + ' -E'
425 #####################################################################
426 # compilation result tests
428 conf.set('_GNU_SOURCE', true)
429 conf.set('__SANE_USERSPACE_TYPES__', true)
431 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
432 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
433 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
434 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
435 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
436 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
437 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
441 #include <linux/ethtool.h>
442 #include <linux/fib_rules.h>
444 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
446 foreach decl : ['char16_t',
449 'struct ethtool_link_settings',
450 'struct fib_rule_uid_range',
453 # We get -1 if the size cannot be determined
454 have = cc.sizeof(decl, prefix : decl_headers) > 0
455 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
458 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
459 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
460 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
461 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
462 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
463 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
464 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
465 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
466 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
467 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
468 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
469 # if_tunnel.h is buggy and cannot be included on its own
470 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
471 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
472 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
473 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
474 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
475 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
476 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
477 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
478 ['NDA_IFINDEX', 'linux/neighbour.h'],
479 ['IFA_FLAGS', 'linux/if_addr.h'],
480 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
481 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
482 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
484 prefix = decl.length() > 2 ? decl[2] : ''
485 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
486 conf.set10('HAVE_' + decl[0], have)
489 foreach ident : ['secure_getenv', '__secure_getenv']
490 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
494 ['memfd_create', '''#include <sys/mman.h>'''],
495 ['gettid', '''#include <sys/types.h>
496 #include <unistd.h>'''],
497 ['pivot_root', '''#include <stdlib.h>
498 #include <unistd.h>'''], # no known header declares pivot_root
499 ['name_to_handle_at', '''#include <sys/types.h>
500 #include <sys/stat.h>
501 #include <fcntl.h>'''],
502 ['setns', '''#include <sched.h>'''],
503 ['renameat2', '''#include <stdio.h>
504 #include <fcntl.h>'''],
505 ['kcmp', '''#include <linux/kcmp.h>'''],
506 ['keyctl', '''#include <sys/types.h>
507 #include <keyutils.h>'''],
508 ['copy_file_range', '''#include <sys/syscall.h>
509 #include <unistd.h>'''],
510 ['bpf', '''#include <sys/syscall.h>
511 #include <unistd.h>'''],
512 ['explicit_bzero' , '''#include <string.h>'''],
515 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
516 conf.set10('HAVE_' + ident[0].to_upper(), have)
519 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
520 conf.set10('USE_SYS_RANDOM_H', true)
521 conf.set10('HAVE_GETRANDOM', true)
523 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
524 conf.set10('USE_SYS_RANDOM_H', false)
525 conf.set10('HAVE_GETRANDOM', have)
528 #####################################################################
530 sed = find_program('sed')
531 awk = find_program('awk')
532 m4 = find_program('m4')
533 stat = find_program('stat')
534 git = find_program('git', required : false)
535 env = find_program('env')
537 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
538 mkdir_p = 'mkdir -p $DESTDIR/@0@'
539 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
540 splash_bmp = files('test/splash.bmp')
542 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
543 # /usr/sbin, /sbin, and fall back to the default from middle column.
544 progs = [['quotaon', '/usr/sbin/quotaon' ],
545 ['quotacheck', '/usr/sbin/quotacheck' ],
546 ['kill', '/usr/bin/kill' ],
547 ['kmod', '/usr/bin/kmod' ],
548 ['kexec', '/usr/sbin/kexec' ],
549 ['sulogin', '/usr/sbin/sulogin' ],
550 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
551 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
552 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
553 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
556 path = get_option(prog[0] + '-path')
558 message('Using @1@ for @0@'.format(prog[0], path))
560 exe = find_program(prog[0],
561 '/usr/sbin/' + prog[0],
564 path = exe.found() ? exe.path() : prog[1]
566 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
567 conf.set_quoted(name, path)
568 substs.set(name, path)
571 conf.set_quoted('TELINIT', get_option('telinit-path'))
573 if run_command('ln', '--relative', '--help').returncode() != 0
574 error('ln does not support --relative')
577 ############################################################
579 gperf = find_program('gperf')
581 gperf_test_format = '''
583 const char * in_word_set(const char *, @0@);
586 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
587 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
588 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
589 if cc.compiles(gperf_test)
590 gperf_len_type = 'size_t'
592 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
593 if cc.compiles(gperf_test)
594 gperf_len_type = 'unsigned'
596 error('unable to determine gperf len type')
599 message('gperf len type is @0@'.format(gperf_len_type))
600 conf.set('GPERF_LEN_TYPE', gperf_len_type,
601 description : 'The type of gperf "len" parameter')
603 ############################################################
605 if not cc.has_header('sys/capability.h')
606 error('POSIX caps headers not found')
608 foreach header : ['crypt.h',
611 'linux/vm_sockets.h',
613 'valgrind/memcheck.h',
614 'valgrind/valgrind.h',
617 conf.set10('HAVE_' + header.underscorify().to_upper(),
618 cc.has_header(header))
621 ############################################################
623 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
624 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
625 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
627 default_hierarchy = get_option('default-hierarchy')
628 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
629 description : 'default cgroup hierarchy as string')
630 if default_hierarchy == 'legacy'
631 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
632 elif default_hierarchy == 'hybrid'
633 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
635 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
638 time_epoch = get_option('time-epoch')
641 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
643 time_epoch = time_epoch.to_int()
644 conf.set('TIME_EPOCH', time_epoch)
646 system_uid_max = get_option('system-uid-max')
647 if system_uid_max == ''
648 system_uid_max = run_command(
650 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
651 '/etc/login.defs').stdout()
653 system_uid_max = system_uid_max.to_int()
654 conf.set('SYSTEM_UID_MAX', system_uid_max)
655 substs.set('systemuidmax', system_uid_max)
656 message('maximum system UID is @0@'.format(system_uid_max))
658 system_gid_max = get_option('system-gid-max')
659 if system_gid_max == ''
660 system_gid_max = run_command(
662 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
663 '/etc/login.defs').stdout()
665 system_gid_max = system_gid_max.to_int()
666 conf.set('SYSTEM_GID_MAX', system_gid_max)
667 substs.set('systemgidmax', system_gid_max)
668 message('maximum system GID is @0@'.format(system_gid_max))
670 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
671 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
672 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
673 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
674 substs.set('dynamicuidmin', dynamic_uid_min)
675 substs.set('dynamicuidmax', dynamic_uid_max)
677 container_uid_base_min = get_option('container-uid-base-min').to_int()
678 container_uid_base_max = get_option('container-uid-base-max').to_int()
679 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
680 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
681 substs.set('containeruidbasemin', container_uid_base_min)
682 substs.set('containeruidbasemax', container_uid_base_max)
684 nobody_user = get_option('nobody-user')
685 nobody_group = get_option('nobody-group')
687 getent_result = run_command('getent', 'passwd', '65534')
688 if getent_result.returncode() == 0
689 name = getent_result.stdout().split(':')[0]
690 if name != nobody_user
691 message('WARNING:\n' +
692 ' 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) +
693 ' Your build will result in an user table setup that is incompatible with the local system.')
696 id_result = run_command('id', '-u', nobody_user)
697 if id_result.returncode() == 0
698 id = id_result.stdout().to_int()
700 message('WARNING:\n' +
701 ' 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) +
702 ' Your build will result in an user table setup that is incompatible with the local system.')
706 getent_result = run_command('getent', 'group', '65534')
707 if getent_result.returncode() == 0
708 name = getent_result.stdout().split(':')[0]
709 if name != nobody_group
710 message('WARNING:\n' +
711 ' 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) +
712 ' Your build will result in an group table setup that is incompatible with the local system.')
715 id_result = run_command('id', '-g', nobody_group)
716 if id_result.returncode() == 0
717 id = id_result.stdout().to_int()
719 message('WARNING:\n' +
720 ' 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) +
721 ' Your build will result in an group table setup that is incompatible with the local system.')
724 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
725 message('WARNING:\n' +
726 ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
727 ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
730 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
731 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
732 substs.set('NOBODY_USER_NAME', nobody_user)
733 substs.set('NOBODY_GROUP_NAME', nobody_group)
735 tty_gid = get_option('tty-gid')
736 conf.set('TTY_GID', tty_gid)
737 substs.set('TTY_GID', tty_gid)
739 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
740 if get_option('users-gid') != ''
741 users_gid = get_option('users-gid').to_int()
745 substs.set('USERS_GID', users_gid)
747 if get_option('adm-group')
748 m4_defines += ['-DENABLE_ADM_GROUP']
751 if get_option('wheel-group')
752 m4_defines += ['-DENABLE_WHEEL_GROUP']
755 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
756 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
758 kill_user_processes = get_option('default-kill-user-processes')
759 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
760 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
762 dns_servers = get_option('dns-servers')
763 conf.set_quoted('DNS_SERVERS', dns_servers)
764 substs.set('DNS_SERVERS', dns_servers)
766 ntp_servers = get_option('ntp-servers')
767 conf.set_quoted('NTP_SERVERS', ntp_servers)
768 substs.set('NTP_SERVERS', ntp_servers)
770 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
772 substs.set('SUSHELL', get_option('debug-shell'))
773 substs.set('DEBUGTTY', get_option('debug-tty'))
775 debug = get_option('debug')
776 enable_debug_hashmap = false
777 enable_debug_mmap_cache = false
779 foreach name : debug.split(',')
781 enable_debug_hashmap = true
782 elif name == 'mmap-cache'
783 enable_debug_mmap_cache = true
785 message('unknown debug option "@0@", ignoring'.format(name))
789 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
790 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
792 #####################################################################
794 threads = dependency('threads')
795 librt = cc.find_library('rt')
796 libm = cc.find_library('m')
797 libdl = cc.find_library('dl')
798 libcrypt = cc.find_library('crypt')
800 libcap = dependency('libcap', required : false)
801 if not libcap.found()
802 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
803 libcap = cc.find_library('cap')
806 libmount = dependency('mount',
808 required : not fuzzer_build)
810 want_seccomp = get_option('seccomp')
811 if want_seccomp != 'false' and not fuzzer_build
812 libseccomp = dependency('libseccomp',
813 version : '>= 2.3.1',
814 required : want_seccomp == 'true')
815 have = libseccomp.found()
820 conf.set10('HAVE_SECCOMP', have)
821 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
823 want_selinux = get_option('selinux')
824 if want_selinux != 'false' and not fuzzer_build
825 libselinux = dependency('libselinux',
826 version : '>= 2.1.9',
827 required : want_selinux == 'true')
828 have = libselinux.found()
833 conf.set10('HAVE_SELINUX', have)
834 m4_defines += have ? ['-DHAVE_SELINUX'] : []
836 want_apparmor = get_option('apparmor')
837 if want_apparmor != 'false' and not fuzzer_build
838 libapparmor = dependency('libapparmor',
839 required : want_apparmor == 'true')
840 have = libapparmor.found()
845 conf.set10('HAVE_APPARMOR', have)
846 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
848 smack_run_label = get_option('smack-run-label')
849 if smack_run_label != ''
850 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
851 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
854 want_polkit = get_option('polkit')
855 install_polkit = false
856 install_polkit_pkla = false
857 if want_polkit != 'false' and not fuzzer_build
858 install_polkit = true
860 libpolkit = dependency('polkit-gobject-1',
862 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
863 message('Old polkit detected, will install pkla files')
864 install_polkit_pkla = true
867 conf.set10('ENABLE_POLKIT', install_polkit)
869 want_acl = get_option('acl')
870 if want_acl != 'false' and not fuzzer_build
871 libacl = cc.find_library('acl', required : want_acl == 'true')
872 have = libacl.found()
877 conf.set10('HAVE_ACL', have)
878 m4_defines += have ? ['-DHAVE_ACL'] : []
880 want_audit = get_option('audit')
881 if want_audit != 'false' and not fuzzer_build
882 libaudit = dependency('audit', required : want_audit == 'true')
883 have = libaudit.found()
888 conf.set10('HAVE_AUDIT', have)
890 want_blkid = get_option('blkid')
891 if want_blkid != 'false' and not fuzzer_build
892 libblkid = dependency('blkid', required : want_blkid == 'true')
893 have = libblkid.found()
898 conf.set10('HAVE_BLKID', have)
900 want_kmod = get_option('kmod')
901 if want_kmod != 'false' and not fuzzer_build
902 libkmod = dependency('libkmod',
904 required : want_kmod == 'true')
905 have = libkmod.found()
910 conf.set10('HAVE_KMOD', have)
912 want_pam = get_option('pam')
913 if want_pam != 'false' and not fuzzer_build
914 libpam = cc.find_library('pam', required : want_pam == 'true')
915 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
916 have = libpam.found() and libpam_misc.found()
922 conf.set10('HAVE_PAM', have)
923 m4_defines += have ? ['-DHAVE_PAM'] : []
925 want_microhttpd = get_option('microhttpd')
926 if want_microhttpd != 'false' and not fuzzer_build
927 libmicrohttpd = dependency('libmicrohttpd',
928 version : '>= 0.9.33',
929 required : want_microhttpd == 'true')
930 have = libmicrohttpd.found()
935 conf.set10('HAVE_MICROHTTPD', have)
936 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
938 want_libcryptsetup = get_option('libcryptsetup')
939 if want_libcryptsetup != 'false' and not fuzzer_build
940 libcryptsetup = dependency('libcryptsetup',
941 version : '>= 1.6.0',
942 required : want_libcryptsetup == 'true')
943 have = libcryptsetup.found()
948 conf.set10('HAVE_LIBCRYPTSETUP', have)
950 want_libcurl = get_option('libcurl')
951 if want_libcurl != 'false' and not fuzzer_build
952 libcurl = dependency('libcurl',
953 version : '>= 7.32.0',
954 required : want_libcurl == 'true')
955 have = libcurl.found()
960 conf.set10('HAVE_LIBCURL', have)
961 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
963 want_libidn = get_option('libidn')
964 want_libidn2 = get_option('libidn2')
965 if want_libidn == 'true' and want_libidn2 == 'true'
966 error('libidn and libidn2 cannot be requested simultaneously')
969 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
970 libidn = dependency('libidn',
971 required : want_libidn == 'true')
972 have = libidn.found()
977 conf.set10('HAVE_LIBIDN', have)
978 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
979 if not have and want_libidn2 != 'false' and not fuzzer_build
980 # libidn is used for both libidn and libidn2 objects
981 libidn = dependency('libidn2',
982 required : want_libidn2 == 'true')
983 have = libidn.found()
987 conf.set10('HAVE_LIBIDN2', have)
988 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
990 want_libiptc = get_option('libiptc')
991 if want_libiptc != 'false' and not fuzzer_build
992 libiptc = dependency('libiptc',
993 required : want_libiptc == 'true')
994 have = libiptc.found()
999 conf.set10('HAVE_LIBIPTC', have)
1000 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
1002 want_qrencode = get_option('qrencode')
1003 if want_qrencode != 'false' and not fuzzer_build
1004 libqrencode = dependency('libqrencode',
1005 required : want_qrencode == 'true')
1006 have = libqrencode.found()
1011 conf.set10('HAVE_QRENCODE', have)
1013 want_gcrypt = get_option('gcrypt')
1014 if want_gcrypt != 'false' and not fuzzer_build
1015 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1016 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1017 have = libgcrypt.found() and libgpg_error.found()
1022 # link to neither of the libs if one is not found
1026 conf.set10('HAVE_GCRYPT', have)
1028 want_gnutls = get_option('gnutls')
1029 if want_gnutls != 'false' and not fuzzer_build
1030 libgnutls = dependency('gnutls',
1031 version : '>= 3.1.4',
1032 required : want_gnutls == 'true')
1033 have = libgnutls.found()
1038 conf.set10('HAVE_GNUTLS', have)
1040 want_elfutils = get_option('elfutils')
1041 if want_elfutils != 'false' and not fuzzer_build
1042 libdw = dependency('libdw',
1043 required : want_elfutils == 'true')
1044 have = libdw.found()
1049 conf.set10('HAVE_ELFUTILS', have)
1051 want_zlib = get_option('zlib')
1052 if want_zlib != 'false' and not fuzzer_build
1053 libz = dependency('zlib',
1054 required : want_zlib == 'true')
1060 conf.set10('HAVE_ZLIB', have)
1062 want_bzip2 = get_option('bzip2')
1063 if want_bzip2 != 'false' and not fuzzer_build
1064 libbzip2 = cc.find_library('bz2',
1065 required : want_bzip2 == 'true')
1066 have = libbzip2.found()
1071 conf.set10('HAVE_BZIP2', have)
1073 want_xz = get_option('xz')
1074 if want_xz != 'false' and not fuzzer_build
1075 libxz = dependency('liblzma',
1076 required : want_xz == 'true')
1077 have = libxz.found()
1082 conf.set10('HAVE_XZ', have)
1084 want_lz4 = get_option('lz4')
1085 if want_lz4 != 'false' and not fuzzer_build
1086 liblz4 = dependency('liblz4',
1087 required : want_lz4 == 'true')
1088 have = liblz4.found()
1093 conf.set10('HAVE_LZ4', have)
1095 want_xkbcommon = get_option('xkbcommon')
1096 if want_xkbcommon != 'false' and not fuzzer_build
1097 libxkbcommon = dependency('xkbcommon',
1098 version : '>= 0.3.0',
1099 required : want_xkbcommon == 'true')
1100 have = libxkbcommon.found()
1105 conf.set10('HAVE_XKBCOMMON', have)
1107 want_glib = get_option('glib')
1108 if want_glib != 'false' and not fuzzer_build
1109 libglib = dependency('glib-2.0',
1110 version : '>= 2.22.0',
1111 required : want_glib == 'true')
1112 libgobject = dependency('gobject-2.0',
1113 version : '>= 2.22.0',
1114 required : want_glib == 'true')
1115 libgio = dependency('gio-2.0',
1116 required : want_glib == 'true')
1117 have = libglib.found() and libgobject.found() and libgio.found()
1124 conf.set10('HAVE_GLIB', have)
1126 want_dbus = get_option('dbus')
1127 if want_dbus != 'false' and not fuzzer_build
1128 libdbus = dependency('dbus-1',
1129 version : '>= 1.3.2',
1130 required : want_dbus == 'true')
1131 have = libdbus.found()
1136 conf.set10('HAVE_DBUS', have)
1138 default_dnssec = get_option('default-dnssec')
1140 default_dnssec = 'no'
1142 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1143 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1144 default_dnssec = 'no'
1146 conf.set('DEFAULT_DNSSEC_MODE',
1147 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1148 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1150 want_importd = get_option('importd')
1151 if want_importd != 'false'
1152 have = (conf.get('HAVE_LIBCURL') == 1 and
1153 conf.get('HAVE_ZLIB') == 1 and
1154 conf.get('HAVE_BZIP2') == 1 and
1155 conf.get('HAVE_XZ') == 1 and
1156 conf.get('HAVE_GCRYPT') == 1)
1157 if want_importd == 'true' and not have
1158 error('importd support was requested, but dependencies are not available')
1163 conf.set10('ENABLE_IMPORTD', have)
1165 want_remote = get_option('remote')
1166 if want_remote != 'false'
1167 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1168 conf.get('HAVE_LIBCURL') == 1]
1169 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1170 # it's possible to build one without the other. Complain only if
1171 # support was explictly requested. The auxiliary files like sysusers
1172 # config should be installed when any of the programs are built.
1173 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1174 error('remote support was requested, but dependencies are not available')
1176 have = have_deps[0] or have_deps[1]
1180 conf.set10('ENABLE_REMOTE', have)
1182 foreach term : ['utmp',
1213 have = get_option(term)
1214 name = 'ENABLE_' + term.underscorify().to_upper()
1215 conf.set10(name, have)
1216 m4_defines += have ? ['-D' + name] : []
1219 want_tests = get_option('tests')
1220 install_tests = get_option('install-tests')
1221 slow_tests = get_option('slow-tests')
1225 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1227 #####################################################################
1229 if get_option('efi')
1230 efi_arch = host_machine.cpu_family()
1232 if efi_arch == 'x86'
1233 EFI_MACHINE_TYPE_NAME = 'ia32'
1234 gnu_efi_arch = 'ia32'
1235 elif efi_arch == 'x86_64'
1236 EFI_MACHINE_TYPE_NAME = 'x64'
1237 gnu_efi_arch = 'x86_64'
1238 elif efi_arch == 'arm'
1239 EFI_MACHINE_TYPE_NAME = 'arm'
1240 gnu_efi_arch = 'arm'
1241 elif efi_arch == 'aarch64'
1242 EFI_MACHINE_TYPE_NAME = 'aa64'
1243 gnu_efi_arch = 'aarch64'
1245 EFI_MACHINE_TYPE_NAME = ''
1250 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1252 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1256 conf.set10('ENABLE_EFI', have)
1258 #####################################################################
1260 config_h = configure_file(
1261 output : 'config.h',
1262 configuration : conf)
1264 includes = include_directories('src/basic',
1274 'src/libsystemd/sd-bus',
1275 'src/libsystemd/sd-device',
1276 'src/libsystemd/sd-hwdb',
1277 'src/libsystemd/sd-id128',
1278 'src/libsystemd/sd-netlink',
1279 'src/libsystemd/sd-network',
1280 'src/libsystemd-network',
1283 add_project_arguments('-include', 'config.h', language : 'c')
1287 subdir('src/systemd')
1289 subdir('src/libsystemd')
1290 subdir('src/libsystemd-network')
1291 subdir('src/journal')
1294 libjournal_core = static_library(
1296 libjournal_core_sources,
1298 include_directories : includes,
1301 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1302 libsystemd = shared_library(
1304 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1305 version : libsystemd_version,
1306 include_directories : includes,
1307 link_args : ['-shared',
1308 '-Wl,--version-script=' + libsystemd_sym_path],
1309 link_with : [libbasic,
1311 link_whole : [libsystemd_static,
1313 dependencies : [threads,
1317 link_depends : libsystemd_sym,
1319 install_dir : rootlibdir)
1321 ############################################################
1323 # binaries that have --help and are intended for use by humans,
1324 # usually, but not always, installed in /bin.
1325 public_programs = []
1327 subdir('src/libudev')
1328 subdir('src/shared')
1331 subdir('src/network')
1333 subdir('src/analyze')
1334 subdir('src/journal-remote')
1335 subdir('src/coredump')
1336 subdir('src/hostname')
1337 subdir('src/import')
1338 subdir('src/kernel-install')
1339 subdir('src/locale')
1340 subdir('src/machine')
1341 subdir('src/nspawn')
1342 subdir('src/resolve')
1343 subdir('src/timedate')
1344 subdir('src/timesync')
1345 subdir('src/vconsole')
1346 subdir('src/boot/efi')
1353 ############################################################
1355 # only static linking apart from libdl, to make sure that the
1356 # module is linked to all libraries that it uses.
1357 test_dlopen = executable(
1360 include_directories : includes,
1361 link_with : [libbasic],
1362 dependencies : [libdl])
1364 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1365 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1366 ['mymachines', 'ENABLE_MACHINED'],
1367 ['resolve', 'ENABLE_RESOLVE']]
1369 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1373 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1374 version_script_arg = join_paths(meson.current_source_dir(), sym)
1376 nss = shared_library(
1378 'src/nss-@0@/nss-@0@.c'.format(module),
1380 include_directories : includes,
1381 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1382 link_args : ['-Wl,-z,nodelete',
1384 '-Wl,--version-script=' + version_script_arg,
1386 link_with : [libsystemd_static,
1388 dependencies : [threads,
1392 install_dir : rootlibdir)
1394 # We cannot use shared_module because it does not support version suffix.
1395 # Unfortunately shared_library insists on creating the symlink…
1396 meson.add_install_script('sh', '-c',
1397 'rm $DESTDIR@0@/libnss_@1@.so'
1398 .format(rootlibdir, module))
1400 test('dlopen-nss_' + module,
1402 args : [nss.full_path()]) # path to dlopen must include a slash
1406 ############################################################
1408 executable('systemd',
1410 include_directories : includes,
1411 link_with : [libcore,
1413 dependencies : [threads,
1419 install_rpath : rootlibexecdir,
1421 install_dir : rootlibexecdir)
1423 exe = executable('systemd-analyze',
1424 systemd_analyze_sources,
1425 include_directories : includes,
1426 link_with : [libcore,
1428 dependencies : [threads,
1434 install_rpath : rootlibexecdir,
1436 public_programs += [exe]
1438 executable('systemd-journald',
1439 systemd_journald_sources,
1440 include_directories : includes,
1441 link_with : [libjournal_core,
1443 dependencies : [threads,
1447 install_rpath : rootlibexecdir,
1449 install_dir : rootlibexecdir)
1451 exe = executable('systemd-cat',
1452 systemd_cat_sources,
1453 include_directories : includes,
1454 link_with : [libjournal_core,
1456 dependencies : [threads],
1457 install_rpath : rootlibexecdir,
1459 public_programs += [exe]
1461 exe = executable('journalctl',
1463 include_directories : includes,
1464 link_with : [libshared],
1465 dependencies : [threads,
1469 install_rpath : rootlibexecdir,
1471 install_dir : rootbindir)
1472 public_programs += [exe]
1474 executable('systemd-getty-generator',
1475 'src/getty-generator/getty-generator.c',
1476 include_directories : includes,
1477 link_with : [libshared],
1478 install_rpath : rootlibexecdir,
1480 install_dir : systemgeneratordir)
1482 executable('systemd-debug-generator',
1483 'src/debug-generator/debug-generator.c',
1484 include_directories : includes,
1485 link_with : [libshared],
1486 install_rpath : rootlibexecdir,
1488 install_dir : systemgeneratordir)
1490 executable('systemd-fstab-generator',
1491 'src/fstab-generator/fstab-generator.c',
1492 'src/core/mount-setup.c',
1493 include_directories : includes,
1494 link_with : [libshared],
1495 install_rpath : rootlibexecdir,
1497 install_dir : systemgeneratordir)
1499 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1500 executable('30-systemd-environment-d-generator',
1501 'src/environment-d-generator/environment-d-generator.c',
1502 include_directories : includes,
1503 link_with : [libshared],
1504 install_rpath : rootlibexecdir,
1506 install_dir : userenvgeneratordir)
1508 meson.add_install_script(meson_make_symlink,
1509 join_paths(sysconfdir, 'environment'),
1510 join_paths(environmentdir, '99-environment.conf'))
1513 if conf.get('ENABLE_HIBERNATE') == 1
1514 executable('systemd-hibernate-resume-generator',
1515 'src/hibernate-resume/hibernate-resume-generator.c',
1516 include_directories : includes,
1517 link_with : [libshared],
1518 install_rpath : rootlibexecdir,
1520 install_dir : systemgeneratordir)
1522 executable('systemd-hibernate-resume',
1523 'src/hibernate-resume/hibernate-resume.c',
1524 include_directories : includes,
1525 link_with : [libshared],
1526 install_rpath : rootlibexecdir,
1528 install_dir : rootlibexecdir)
1531 if conf.get('HAVE_BLKID') == 1
1532 executable('systemd-gpt-auto-generator',
1533 'src/gpt-auto-generator/gpt-auto-generator.c',
1534 'src/basic/blkid-util.h',
1535 include_directories : includes,
1536 link_with : [libshared],
1537 dependencies : libblkid,
1538 install_rpath : rootlibexecdir,
1540 install_dir : systemgeneratordir)
1542 exe = executable('systemd-dissect',
1543 'src/dissect/dissect.c',
1544 include_directories : includes,
1545 link_with : [libshared],
1546 install_rpath : rootlibexecdir,
1548 install_dir : rootlibexecdir)
1549 public_programs += [exe]
1552 if conf.get('ENABLE_RESOLVE') == 1
1553 executable('systemd-resolved',
1554 systemd_resolved_sources,
1555 include_directories : includes,
1556 link_with : [libshared,
1558 libsystemd_resolve_core],
1559 dependencies : [threads,
1563 install_rpath : rootlibexecdir,
1565 install_dir : rootlibexecdir)
1567 exe = executable('systemd-resolve',
1568 systemd_resolve_sources,
1569 include_directories : includes,
1570 link_with : [libshared,
1572 libsystemd_resolve_core],
1573 dependencies : [threads,
1577 install_rpath : rootlibexecdir,
1579 public_programs += [exe]
1582 if conf.get('ENABLE_LOGIND') == 1
1583 executable('systemd-logind',
1584 systemd_logind_sources,
1585 include_directories : includes,
1586 link_with : [liblogind_core,
1588 dependencies : [threads,
1590 install_rpath : rootlibexecdir,
1592 install_dir : rootlibexecdir)
1594 exe = executable('loginctl',
1596 include_directories : includes,
1597 link_with : [libshared],
1598 dependencies : [threads,
1601 install_rpath : rootlibexecdir,
1603 install_dir : rootbindir)
1604 public_programs += [exe]
1606 exe = executable('systemd-inhibit',
1607 'src/login/inhibit.c',
1608 include_directories : includes,
1609 link_with : [libshared],
1610 install_rpath : rootlibexecdir,
1612 install_dir : rootbindir)
1613 public_programs += [exe]
1615 if conf.get('HAVE_PAM') == 1
1616 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1617 pam_systemd = shared_library(
1621 include_directories : includes,
1622 link_args : ['-shared',
1623 '-Wl,--version-script=' + version_script_arg],
1624 link_with : [libsystemd_static,
1626 dependencies : [threads,
1629 link_depends : pam_systemd_sym,
1631 install_dir : pamlibdir)
1633 test('dlopen-pam_systemd',
1635 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1639 if conf.get('HAVE_PAM') == 1
1640 executable('systemd-user-sessions',
1641 'src/user-sessions/user-sessions.c',
1642 include_directories : includes,
1643 link_with : [libshared],
1644 install_rpath : rootlibexecdir,
1646 install_dir : rootlibexecdir)
1649 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1650 exe = executable('bootctl',
1651 'src/boot/bootctl.c',
1652 include_directories : includes,
1653 link_with : [libshared],
1654 dependencies : [libblkid],
1655 install_rpath : rootlibexecdir,
1657 public_programs += [exe]
1660 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1661 include_directories : includes,
1662 link_with : [libshared],
1663 dependencies : [threads],
1664 install_rpath : rootlibexecdir,
1666 public_programs += [exe]
1668 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1669 include_directories : includes,
1670 link_with : [libshared],
1671 dependencies : [threads,
1676 install_rpath : rootlibexecdir,
1678 install_dir : rootbindir)
1679 public_programs += [exe]
1681 if conf.get('ENABLE_BACKLIGHT') == 1
1682 executable('systemd-backlight',
1683 'src/backlight/backlight.c',
1684 include_directories : includes,
1685 link_with : [libshared],
1686 install_rpath : rootlibexecdir,
1688 install_dir : rootlibexecdir)
1691 if conf.get('ENABLE_RFKILL') == 1
1692 executable('systemd-rfkill',
1693 'src/rfkill/rfkill.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 install_rpath : rootlibexecdir,
1698 install_dir : rootlibexecdir)
1701 executable('systemd-system-update-generator',
1702 'src/system-update-generator/system-update-generator.c',
1703 include_directories : includes,
1704 link_with : [libshared],
1705 install_rpath : rootlibexecdir,
1707 install_dir : systemgeneratordir)
1709 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1710 executable('systemd-cryptsetup',
1711 'src/cryptsetup/cryptsetup.c',
1712 include_directories : includes,
1713 link_with : [libshared],
1714 dependencies : [libcryptsetup],
1715 install_rpath : rootlibexecdir,
1717 install_dir : rootlibexecdir)
1719 executable('systemd-cryptsetup-generator',
1720 'src/cryptsetup/cryptsetup-generator.c',
1721 include_directories : includes,
1722 link_with : [libshared],
1723 dependencies : [libcryptsetup],
1724 install_rpath : rootlibexecdir,
1726 install_dir : systemgeneratordir)
1728 executable('systemd-veritysetup',
1729 'src/veritysetup/veritysetup.c',
1730 include_directories : includes,
1731 link_with : [libshared],
1732 dependencies : [libcryptsetup],
1733 install_rpath : rootlibexecdir,
1735 install_dir : rootlibexecdir)
1737 executable('systemd-veritysetup-generator',
1738 'src/veritysetup/veritysetup-generator.c',
1739 include_directories : includes,
1740 link_with : [libshared],
1741 dependencies : [libcryptsetup],
1742 install_rpath : rootlibexecdir,
1744 install_dir : systemgeneratordir)
1747 if conf.get('HAVE_SYSV_COMPAT') == 1
1748 executable('systemd-sysv-generator',
1749 'src/sysv-generator/sysv-generator.c',
1750 include_directories : includes,
1751 link_with : [libshared],
1752 install_rpath : rootlibexecdir,
1754 install_dir : systemgeneratordir)
1756 executable('systemd-rc-local-generator',
1757 'src/rc-local-generator/rc-local-generator.c',
1758 include_directories : includes,
1759 link_with : [libshared],
1760 install_rpath : rootlibexecdir,
1762 install_dir : systemgeneratordir)
1765 if conf.get('ENABLE_HOSTNAMED') == 1
1766 executable('systemd-hostnamed',
1767 'src/hostname/hostnamed.c',
1768 include_directories : includes,
1769 link_with : [libshared],
1770 install_rpath : rootlibexecdir,
1772 install_dir : rootlibexecdir)
1774 exe = executable('hostnamectl',
1775 'src/hostname/hostnamectl.c',
1776 include_directories : includes,
1777 link_with : [libshared],
1778 install_rpath : rootlibexecdir,
1780 public_programs += [exe]
1783 if conf.get('ENABLE_LOCALED') == 1
1784 if conf.get('HAVE_XKBCOMMON') == 1
1785 # logind will load libxkbcommon.so dynamically on its own
1791 executable('systemd-localed',
1792 systemd_localed_sources,
1793 include_directories : includes,
1794 link_with : [libshared],
1795 dependencies : deps,
1796 install_rpath : rootlibexecdir,
1798 install_dir : rootlibexecdir)
1800 exe = executable('localectl',
1802 include_directories : includes,
1803 link_with : [libshared],
1804 install_rpath : rootlibexecdir,
1806 public_programs += [exe]
1809 if conf.get('ENABLE_TIMEDATED') == 1
1810 executable('systemd-timedated',
1811 'src/timedate/timedated.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 install_rpath : rootlibexecdir,
1816 install_dir : rootlibexecdir)
1818 exe = executable('timedatectl',
1819 'src/timedate/timedatectl.c',
1820 include_directories : includes,
1821 install_rpath : rootlibexecdir,
1822 link_with : [libshared],
1824 public_programs += [exe]
1827 if conf.get('ENABLE_TIMESYNCD') == 1
1828 executable('systemd-timesyncd',
1829 systemd_timesyncd_sources,
1830 include_directories : includes,
1831 link_with : [libshared],
1832 dependencies : [threads,
1834 install_rpath : rootlibexecdir,
1836 install_dir : rootlibexecdir)
1839 if conf.get('ENABLE_MACHINED') == 1
1840 executable('systemd-machined',
1841 systemd_machined_sources,
1842 include_directories : includes,
1843 link_with : [libmachine_core,
1845 install_rpath : rootlibexecdir,
1847 install_dir : rootlibexecdir)
1849 exe = executable('machinectl',
1850 'src/machine/machinectl.c',
1851 include_directories : includes,
1852 link_with : [libshared],
1853 dependencies : [threads,
1856 install_rpath : rootlibexecdir,
1858 install_dir : rootbindir)
1859 public_programs += [exe]
1862 if conf.get('ENABLE_IMPORTD') == 1
1863 executable('systemd-importd',
1864 systemd_importd_sources,
1865 include_directories : includes,
1866 link_with : [libshared],
1867 dependencies : [threads],
1868 install_rpath : rootlibexecdir,
1870 install_dir : rootlibexecdir)
1872 systemd_pull = executable('systemd-pull',
1873 systemd_pull_sources,
1874 include_directories : includes,
1875 link_with : [libshared],
1876 dependencies : [libcurl,
1881 install_rpath : rootlibexecdir,
1883 install_dir : rootlibexecdir)
1885 systemd_import = executable('systemd-import',
1886 systemd_import_sources,
1887 include_directories : includes,
1888 link_with : [libshared],
1889 dependencies : [libcurl,
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootlibexecdir)
1897 systemd_export = executable('systemd-export',
1898 systemd_export_sources,
1899 include_directories : includes,
1900 link_with : [libshared],
1901 dependencies : [libcurl,
1905 install_rpath : rootlibexecdir,
1907 install_dir : rootlibexecdir)
1908 public_programs += [systemd_pull, systemd_import, systemd_export]
1911 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1912 exe = executable('systemd-journal-upload',
1913 systemd_journal_upload_sources,
1914 include_directories : includes,
1915 link_with : [libshared],
1916 dependencies : [threads,
1921 install_rpath : rootlibexecdir,
1923 install_dir : rootlibexecdir)
1924 public_programs += [exe]
1927 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1928 s_j_remote = executable('systemd-journal-remote',
1929 systemd_journal_remote_sources,
1930 include_directories : includes,
1931 link_with : [libshared],
1932 dependencies : [threads,
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootlibexecdir)
1941 s_j_gatewayd = executable('systemd-journal-gatewayd',
1942 systemd_journal_gatewayd_sources,
1943 include_directories : includes,
1944 link_with : [libshared],
1945 dependencies : [threads,
1950 install_rpath : rootlibexecdir,
1952 install_dir : rootlibexecdir)
1953 public_programs += [s_j_remote, s_j_gatewayd]
1956 if conf.get('ENABLE_COREDUMP') == 1
1957 executable('systemd-coredump',
1958 systemd_coredump_sources,
1959 include_directories : includes,
1960 link_with : [libshared],
1961 dependencies : [threads,
1966 install_rpath : rootlibexecdir,
1968 install_dir : rootlibexecdir)
1970 exe = executable('coredumpctl',
1971 coredumpctl_sources,
1972 include_directories : includes,
1973 link_with : [libshared],
1974 dependencies : [threads,
1977 install_rpath : rootlibexecdir,
1979 public_programs += [exe]
1982 if conf.get('ENABLE_BINFMT') == 1
1983 exe = executable('systemd-binfmt',
1984 'src/binfmt/binfmt.c',
1985 include_directories : includes,
1986 link_with : [libshared],
1987 install_rpath : rootlibexecdir,
1989 install_dir : rootlibexecdir)
1990 public_programs += [exe]
1992 meson.add_install_script('sh', '-c',
1993 mkdir_p.format(binfmtdir))
1994 meson.add_install_script('sh', '-c',
1995 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1998 if conf.get('ENABLE_VCONSOLE') == 1
1999 executable('systemd-vconsole-setup',
2000 'src/vconsole/vconsole-setup.c',
2001 include_directories : includes,
2002 link_with : [libshared],
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootlibexecdir)
2008 if conf.get('ENABLE_RANDOMSEED') == 1
2009 executable('systemd-random-seed',
2010 'src/random-seed/random-seed.c',
2011 include_directories : includes,
2012 link_with : [libshared],
2013 install_rpath : rootlibexecdir,
2015 install_dir : rootlibexecdir)
2018 if conf.get('ENABLE_FIRSTBOOT') == 1
2019 executable('systemd-firstboot',
2020 'src/firstboot/firstboot.c',
2021 include_directories : includes,
2022 link_with : [libshared],
2023 dependencies : [libcrypt],
2024 install_rpath : rootlibexecdir,
2026 install_dir : rootbindir)
2029 executable('systemd-remount-fs',
2030 'src/remount-fs/remount-fs.c',
2031 'src/core/mount-setup.c',
2032 'src/core/mount-setup.h',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 install_rpath : rootlibexecdir,
2037 install_dir : rootlibexecdir)
2039 executable('systemd-machine-id-setup',
2040 'src/machine-id-setup/machine-id-setup-main.c',
2041 'src/core/machine-id-setup.c',
2042 'src/core/machine-id-setup.h',
2043 include_directories : includes,
2044 link_with : [libshared],
2045 install_rpath : rootlibexecdir,
2047 install_dir : rootbindir)
2049 executable('systemd-fsck',
2051 include_directories : includes,
2052 link_with : [libshared],
2053 install_rpath : rootlibexecdir,
2055 install_dir : rootlibexecdir)
2057 executable('systemd-growfs',
2058 'src/partition/growfs.c',
2059 include_directories : includes,
2060 link_with : [libshared],
2061 dependencies : [libcryptsetup],
2062 install_rpath : rootlibexecdir,
2064 install_dir : rootlibexecdir)
2066 executable('systemd-makefs',
2067 'src/partition/makefs.c',
2068 include_directories : includes,
2069 link_with : [libshared],
2070 install_rpath : rootlibexecdir,
2072 install_dir : rootlibexecdir)
2074 executable('systemd-sleep',
2075 'src/sleep/sleep.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 install_rpath : rootlibexecdir,
2080 install_dir : rootlibexecdir)
2082 exe = executable('systemd-sysctl',
2083 'src/sysctl/sysctl.c',
2084 include_directories : includes,
2085 link_with : [libshared],
2086 install_rpath : rootlibexecdir,
2088 install_dir : rootlibexecdir)
2089 public_programs += [exe]
2091 executable('systemd-ac-power',
2092 'src/ac-power/ac-power.c',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 install_rpath : rootlibexecdir,
2097 install_dir : rootlibexecdir)
2099 exe = executable('systemd-detect-virt',
2100 'src/detect-virt/detect-virt.c',
2101 include_directories : includes,
2102 link_with : [libshared],
2103 install_rpath : rootlibexecdir,
2105 public_programs += [exe]
2107 exe = executable('systemd-delta',
2108 'src/delta/delta.c',
2109 include_directories : includes,
2110 link_with : [libshared],
2111 install_rpath : rootlibexecdir,
2113 public_programs += [exe]
2115 exe = executable('systemd-escape',
2116 'src/escape/escape.c',
2117 include_directories : includes,
2118 link_with : [libshared],
2119 install_rpath : rootlibexecdir,
2121 install_dir : rootbindir)
2122 public_programs += [exe]
2124 exe = executable('systemd-notify',
2125 'src/notify/notify.c',
2126 include_directories : includes,
2127 link_with : [libshared],
2128 install_rpath : rootlibexecdir,
2130 install_dir : rootbindir)
2131 public_programs += [exe]
2133 executable('systemd-volatile-root',
2134 'src/volatile-root/volatile-root.c',
2135 include_directories : includes,
2136 link_with : [libshared],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2141 executable('systemd-cgroups-agent',
2142 'src/cgroups-agent/cgroups-agent.c',
2143 include_directories : includes,
2144 link_with : [libshared],
2145 install_rpath : rootlibexecdir,
2147 install_dir : rootlibexecdir)
2149 exe = executable('systemd-path',
2151 include_directories : includes,
2152 link_with : [libshared],
2153 install_rpath : rootlibexecdir,
2155 public_programs += [exe]
2157 exe = executable('systemd-ask-password',
2158 'src/ask-password/ask-password.c',
2159 include_directories : includes,
2160 link_with : [libshared],
2161 install_rpath : rootlibexecdir,
2163 install_dir : rootbindir)
2164 public_programs += [exe]
2166 executable('systemd-reply-password',
2167 'src/reply-password/reply-password.c',
2168 include_directories : includes,
2169 link_with : [libshared],
2170 install_rpath : rootlibexecdir,
2172 install_dir : rootlibexecdir)
2174 exe = executable('systemd-tty-ask-password-agent',
2175 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2176 include_directories : includes,
2177 link_with : [libshared],
2178 install_rpath : rootlibexecdir,
2180 install_dir : rootbindir)
2181 public_programs += [exe]
2183 exe = executable('systemd-cgls',
2185 include_directories : includes,
2186 link_with : [libshared],
2187 install_rpath : rootlibexecdir,
2189 public_programs += [exe]
2191 exe = executable('systemd-cgtop',
2192 'src/cgtop/cgtop.c',
2193 include_directories : includes,
2194 link_with : [libshared],
2195 install_rpath : rootlibexecdir,
2197 public_programs += [exe]
2199 executable('systemd-initctl',
2200 'src/initctl/initctl.c',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 install_rpath : rootlibexecdir,
2205 install_dir : rootlibexecdir)
2207 exe = executable('systemd-mount',
2208 'src/mount/mount-tool.c',
2209 include_directories : includes,
2210 link_with : [libshared],
2211 install_rpath : rootlibexecdir,
2213 public_programs += [exe]
2215 meson.add_install_script(meson_make_symlink,
2216 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2218 exe = executable('systemd-run',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2224 public_programs += [exe]
2226 exe = executable('systemd-stdio-bridge',
2227 'src/stdio-bridge/stdio-bridge.c',
2228 include_directories : includes,
2229 link_with : [libshared],
2230 install_rpath : rootlibexecdir,
2232 public_programs += [exe]
2234 exe = executable('busctl',
2235 'src/busctl/busctl.c',
2236 'src/busctl/busctl-introspect.c',
2237 'src/busctl/busctl-introspect.h',
2238 include_directories : includes,
2239 link_with : [libshared],
2240 install_rpath : rootlibexecdir,
2242 public_programs += [exe]
2244 if conf.get('ENABLE_SYSUSERS') == 1
2245 exe = executable('systemd-sysusers',
2246 'src/sysusers/sysusers.c',
2247 include_directories : includes,
2248 link_with : [libshared],
2249 install_rpath : rootlibexecdir,
2251 install_dir : rootbindir)
2252 public_programs += [exe]
2255 if conf.get('ENABLE_TMPFILES') == 1
2256 exe = executable('systemd-tmpfiles',
2257 'src/tmpfiles/tmpfiles.c',
2258 include_directories : includes,
2259 link_with : [libshared],
2260 dependencies : [libacl],
2261 install_rpath : rootlibexecdir,
2263 install_dir : rootbindir)
2264 public_programs += [exe]
2266 test('test-systemd-tmpfiles',
2267 test_systemd_tmpfiles_py,
2268 args : exe.full_path())
2269 # https://github.com/mesonbuild/meson/issues/2681
2272 if conf.get('ENABLE_HWDB') == 1
2273 exe = executable('systemd-hwdb',
2275 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2276 include_directories : includes,
2277 link_with : [libudev_static],
2278 install_rpath : udev_rpath,
2280 install_dir : rootbindir)
2281 public_programs += [exe]
2284 if conf.get('ENABLE_QUOTACHECK') == 1
2285 executable('systemd-quotacheck',
2286 'src/quotacheck/quotacheck.c',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2291 install_dir : rootlibexecdir)
2294 exe = executable('systemd-socket-proxyd',
2295 'src/socket-proxy/socket-proxyd.c',
2296 include_directories : includes,
2297 link_with : [libshared],
2298 dependencies : [threads],
2299 install_rpath : rootlibexecdir,
2301 install_dir : rootlibexecdir)
2302 public_programs += [exe]
2304 exe = executable('systemd-udevd',
2305 systemd_udevd_sources,
2306 include_directories : includes,
2307 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2308 link_with : [libudev_core,
2311 dependencies : [threads,
2316 install_rpath : udev_rpath,
2318 install_dir : rootlibexecdir)
2319 public_programs += [exe]
2321 exe = executable('udevadm',
2323 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2324 include_directories : includes,
2325 link_with : [libudev_core,
2328 dependencies : [threads,
2333 install_rpath : udev_rpath,
2335 install_dir : rootbindir)
2336 public_programs += [exe]
2338 executable('systemd-shutdown',
2339 systemd_shutdown_sources,
2340 include_directories : includes,
2341 link_with : [libshared],
2342 install_rpath : rootlibexecdir,
2344 install_dir : rootlibexecdir)
2346 executable('systemd-update-done',
2347 'src/update-done/update-done.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2354 executable('systemd-update-utmp',
2355 'src/update-utmp/update-utmp.c',
2356 include_directories : includes,
2357 link_with : [libshared],
2358 dependencies : [libaudit],
2359 install_rpath : rootlibexecdir,
2361 install_dir : rootlibexecdir)
2363 if conf.get('HAVE_KMOD') == 1
2364 executable('systemd-modules-load',
2365 'src/modules-load/modules-load.c',
2366 include_directories : includes,
2367 link_with : [libshared],
2368 dependencies : [libkmod],
2369 install_rpath : rootlibexecdir,
2371 install_dir : rootlibexecdir)
2373 meson.add_install_script('sh', '-c',
2374 mkdir_p.format(modulesloaddir))
2375 meson.add_install_script('sh', '-c',
2376 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2379 exe = executable('systemd-nspawn',
2380 systemd_nspawn_sources,
2381 'src/core/mount-setup.c', # FIXME: use a variable?
2382 'src/core/mount-setup.h',
2383 'src/core/loopback-setup.c',
2384 'src/core/loopback-setup.h',
2385 include_directories : [includes, include_directories('src/nspawn')],
2386 link_with : [libshared],
2387 dependencies : [libacl,
2391 install_rpath : rootlibexecdir,
2393 public_programs += [exe]
2395 if conf.get('ENABLE_NETWORKD') == 1
2396 executable('systemd-networkd',
2397 systemd_networkd_sources,
2398 include_directories : includes,
2399 link_with : [libnetworkd_core,
2403 dependencies : [threads],
2404 install_rpath : rootlibexecdir,
2406 install_dir : rootlibexecdir)
2408 executable('systemd-networkd-wait-online',
2409 systemd_networkd_wait_online_sources,
2410 include_directories : includes,
2411 link_with : [libnetworkd_core,
2413 install_rpath : rootlibexecdir,
2415 install_dir : rootlibexecdir)
2417 exe = executable('networkctl',
2419 include_directories : includes,
2420 link_with : [libsystemd_network,
2422 install_rpath : rootlibexecdir,
2424 install_dir : rootbindir)
2425 public_programs += [exe]
2428 executable('systemd-sulogin-shell',
2429 ['src/sulogin-shell/sulogin-shell.c'],
2430 include_directories : includes,
2431 link_with : [libshared],
2432 install_rpath : rootlibexecdir,
2434 install_dir : rootlibexecdir)
2436 ############################################################
2438 foreach tuple : tests
2440 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2441 dependencies = tuple[2]
2442 condition = tuple.length() >= 4 ? tuple[3] : ''
2443 type = tuple.length() >= 5 ? tuple[4] : ''
2444 defs = tuple.length() >= 6 ? tuple[5] : []
2445 incs = tuple.length() >= 7 ? tuple[6] : includes
2448 name = sources[0].split('/')[-1].split('.')[0]
2449 if type.startswith('timeout=')
2450 timeout = type.split('=')[1].to_int()
2453 if want_tests == 'false'
2454 message('Not compiling @0@ because tests is set to false'.format(name))
2455 elif condition == '' or conf.get(condition) == 1
2459 include_directories : incs,
2460 link_with : link_with,
2461 dependencies : dependencies,
2463 install_rpath : rootlibexecdir,
2464 install : install_tests,
2465 install_dir : join_paths(testsdir, type))
2468 message('@0@ is a manual test'.format(name))
2469 elif type == 'unsafe' and want_tests != 'unsafe'
2470 message('@0@ is an unsafe test'.format(name))
2477 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2481 test_libsystemd_sym = executable(
2482 'test-libsystemd-sym',
2483 test_libsystemd_sym_c,
2484 include_directories : includes,
2485 link_with : [libsystemd],
2486 install : install_tests,
2487 install_dir : testsdir)
2488 test('test-libsystemd-sym',
2489 test_libsystemd_sym)
2491 test_libudev_sym = executable(
2494 include_directories : includes,
2495 c_args : ['-Wno-deprecated-declarations'],
2496 link_with : [libudev],
2497 install : install_tests,
2498 install_dir : testsdir)
2499 test('test-libudev-sym',
2502 ############################################################
2506 foreach tuple : fuzzers
2508 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2509 dependencies = tuple[2]
2510 defs = tuple.length() >= 4 ? tuple[3] : []
2511 incs = tuple.length() >= 5 ? tuple[4] : includes
2514 dependencies += fuzzing_engine
2516 sources += 'src/fuzz/fuzz-main.c'
2519 name = sources[0].split('/')[-1].split('.')[0]
2521 fuzzer_exes += executable(
2524 include_directories : [incs, include_directories('src/fuzz')],
2525 link_with : link_with,
2526 dependencies : dependencies,
2531 run_target('fuzzers',
2532 depends : fuzzer_exes,
2535 ############################################################
2537 make_directive_index_py = find_program('tools/make-directive-index.py')
2538 make_man_index_py = find_program('tools/make-man-index.py')
2539 xml_helper_py = find_program('tools/xml_helper.py')
2540 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2544 subdir('sysusers.d')
2545 subdir('tmpfiles.d')
2550 subdir('shell-completion/bash')
2551 subdir('shell-completion/zsh')
2552 subdir('docs/sysvinit')
2553 subdir('docs/var-log')
2555 # FIXME: figure out if the warning is true:
2556 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2557 install_subdir('factory/etc',
2558 install_dir : factorydir)
2561 install_data('xorg/50-systemd-user.sh',
2562 install_dir : xinitrcdir)
2563 install_data('modprobe.d/systemd.conf',
2564 install_dir : modprobedir)
2565 install_data('README',
2572 'TRANSIENT-SETTINGS.md',
2574 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2575 install_dir : docdir)
2577 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2578 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2580 ############################################################
2582 meson_check_help = find_program('tools/meson-check-help.sh')
2584 foreach exec : public_programs
2585 name = exec.full_path().split('/')[-1]
2586 test('check-help-' + name,
2588 args : [exec.full_path()])
2591 ############################################################
2594 foreach p : fuzz_regression_tests
2595 a = p.split('/')[-3]
2596 b = p.split('/')[-2]
2597 c = p.split('/')[-1]
2600 build = sanitize_address
2602 error('unknown sanitizer @0@'.format(a))
2605 name = '@1@:@0@'.format(a, b)
2608 if want_tests == 'false'
2609 message('Not compiling @0@ because tests is set to false'.format(name))
2610 elif not sanitizers.contains(a)
2611 message('Not compiling @0@ because @1@ sanitizer is not available'.format(name, a))
2613 exe = custom_target(
2617 command : [env, 'ln', '-fs',
2618 join_paths(build.full_path(), b),
2620 build_by_default : true)
2622 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2627 if want_tests != 'false' and slow_tests
2628 test(c, env, args : [exe.full_path(),
2629 join_paths(meson.source_root(),
2630 'test/fuzz-regressions',
2635 ############################################################
2638 all_files = run_command(
2640 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2643 all_files = files(all_files.stdout().split())
2648 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2652 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2656 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2659 command : [meson_git_contrib_sh])
2663 git_head = run_command(
2665 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2666 'rev-parse', 'HEAD']).stdout().strip()
2667 git_head_short = run_command(
2669 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2670 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2674 command : ['git', 'archive',
2675 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2677 '--prefix', 'systemd-@0@/'.format(git_head),
2681 ############################################################
2683 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2686 depends : [man, libsystemd, libudev],
2687 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2689 ############################################################
2692 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2694 'prefix directory: @0@'.format(prefixdir),
2695 'rootprefix directory: @0@'.format(rootprefixdir),
2696 'sysconf directory: @0@'.format(sysconfdir),
2697 'include directory: @0@'.format(includedir),
2698 'lib directory: @0@'.format(libdir),
2699 'rootlib directory: @0@'.format(rootlibdir),
2700 'SysV init scripts: @0@'.format(sysvinit_path),
2701 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2702 'PAM modules directory: @0@'.format(pamlibdir),
2703 'PAM configuration directory: @0@'.format(pamconfdir),
2704 'RPM macros directory: @0@'.format(rpmmacrosdir),
2705 'modprobe.d directory: @0@'.format(modprobedir),
2706 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2707 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2708 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2709 'bash completions directory: @0@'.format(bashcompletiondir),
2710 'zsh completions directory: @0@'.format(zshcompletiondir),
2711 'extra start script: @0@'.format(get_option('rc-local')),
2712 'extra stop script: @0@'.format(get_option('halt-local')),
2713 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2714 get_option('debug-tty')),
2715 'TTY GID: @0@'.format(tty_gid),
2716 'users GID: @0@'.format(users_gid),
2717 'maximum system UID: @0@'.format(system_uid_max),
2718 'maximum system GID: @0@'.format(system_gid_max),
2719 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2720 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2721 'minimum container UID base: @0@'.format(container_uid_base_min),
2722 'maximum container UID base: @0@'.format(container_uid_base_max),
2723 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2724 'render group access mode: @0@'.format(get_option('group-render-mode')),
2725 'certificate root directory: @0@'.format(get_option('certificate-root')),
2726 'support URL: @0@'.format(support_url),
2727 'nobody user name: @0@'.format(nobody_user),
2728 'nobody group name: @0@'.format(nobody_group),
2729 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2730 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2732 'default DNSSEC mode: @0@'.format(default_dnssec),
2733 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2734 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2736 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2737 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2739 'default DNS servers: @0@'.format(alt_dns_servers),
2740 'default NTP servers: @0@'.format(alt_ntp_servers)]
2742 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2743 '@@0@'.format(time_epoch)).stdout().strip()
2745 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2748 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2749 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2750 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2752 if conf.get('ENABLE_EFI') == 1
2754 'efi arch: @0@'.format(efi_arch)]
2758 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2759 'EFI CC @0@'.format(efi_cc),
2760 'EFI lib directory: @0@'.format(efi_libdir),
2761 'EFI lds directory: @0@'.format(efi_ldsdir),
2762 'EFI include directory: @0@'.format(efi_incdir)]
2815 ['legacy pkla', install_polkit_pkla],
2817 ['gnu-efi', have_gnu_efi],
2823 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2826 ['man pages', want_man],
2827 ['html pages', want_html],
2828 ['man page indices', want_man and have_lxml],
2829 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2834 ['adm group', get_option('adm-group')],
2835 ['wheel group', get_option('wheel-group')],
2838 ['debug mmap cache'],
2841 cond = tuple.get(1, '')
2843 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2844 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2845 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2850 missing += [tuple[0]]
2856 'enabled features: @0@'.format(', '.join(found)),
2858 'disabled features: @0@'.format(', '.join(missing)),
2860 message('\n '.join(status))
2862 if rootprefixdir != rootprefix_default
2863 message('WARNING:\n' +
2864 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2865 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2866 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))