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.19.1'
31 libudev_version = '1.6.7'
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 != '' or 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')
263 cxx = find_program('c++', required : false)
265 # Used only for tests
269 foreach arg : ['-Wextra',
272 '-Wmissing-include-dirs',
273 '-Wold-style-definition',
276 '-Wdeclaration-after-statement',
278 '-Wsuggest-attribute=noreturn',
279 '-Werror=missing-prototypes',
280 '-Werror=implicit-function-declaration',
281 '-Werror=missing-declarations',
282 '-Werror=return-type',
283 '-Werror=incompatible-pointer-types',
285 '-Wstrict-prototypes',
287 '-Wmissing-noreturn',
288 '-Wimplicit-fallthrough=5',
291 '-Wstrict-aliasing=2',
298 '-fdiagnostics-show-option',
299 '-fno-strict-aliasing',
300 '-fvisibility=hidden',
302 '-fstack-protector-strong',
304 '--param=ssp-buffer-size=4',
306 if cc.has_argument(arg)
307 add_project_arguments(arg, language : 'c')
311 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
312 # arguments, just emits a warnings. So test for the "positive" version instead.
313 foreach arg : ['unused-parameter',
314 'missing-field-initializers',
317 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
319 if cc.has_argument('-W' + arg)
320 add_project_arguments('-Wno-' + arg, language : 'c')
326 #include <inttypes.h>
327 typedef uint64_t usec_t;
328 usec_t now(clockid_t clock);
333 ', name : '-Werror=shadow with local shadowing')
334 add_project_arguments('-Werror=shadow', language : 'c')
337 if cc.get_id() == 'clang'
338 foreach arg : ['-Wno-typedef-redefinition',
339 '-Wno-gnu-variable-sized-type-not-at-end',
341 if cc.has_argument(arg,
342 name : '@0@ is supported'.format(arg))
343 add_project_arguments(arg, language : 'c')
348 link_test_c = files('tools/meson-link-test.c')
350 # --as-needed and --no-undefined are provided by meson by default,
351 # run mesonconf to see what is enabled
352 foreach arg : ['-Wl,-z,relro',
357 have = run_command(check_compilation_sh,
358 cc.cmd_array(), '-x', 'c', arg,
359 '-include', link_test_c).returncode() == 0
360 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
362 add_project_link_arguments(arg, language : 'c')
366 if get_option('buildtype') != 'debug'
367 foreach arg : ['-ffunction-sections',
369 if cc.has_argument(arg,
370 name : '@0@ is supported'.format(arg))
371 add_project_arguments(arg, language : 'c')
375 foreach arg : ['-Wl,--gc-sections']
376 have = run_command(check_compilation_sh,
377 cc.cmd_array(), '-x', 'c', arg,
378 '-include', link_test_c).returncode() == 0
379 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
381 add_project_link_arguments(arg, language : 'c')
386 cpp = ' '.join(cc.cmd_array()) + ' -E'
388 #####################################################################
389 # compilation result tests
391 conf.set('_GNU_SOURCE', true)
392 conf.set('__SANE_USERSPACE_TYPES__', true)
394 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
395 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
396 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
397 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
398 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
399 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
400 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
404 #include <linux/ethtool.h>
405 #include <linux/fib_rules.h>
407 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
409 foreach decl : ['char16_t',
412 'struct ethtool_link_settings',
413 'struct fib_rule_uid_range',
416 # We get -1 if the size cannot be determined
417 have = cc.sizeof(decl, prefix : decl_headers) > 0
418 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
421 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
422 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
423 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
424 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
425 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
426 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
427 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
428 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
429 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
430 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
431 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
432 # if_tunnel.h is buggy and cannot be included on its own
433 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
434 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
435 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
436 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
437 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
438 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
439 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
440 ['NDA_IFINDEX', 'linux/neighbour.h'],
441 ['IFA_FLAGS', 'linux/if_addr.h'],
442 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
443 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
444 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
446 prefix = decl.length() > 2 ? decl[2] : ''
447 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
448 conf.set10('HAVE_' + decl[0], have)
451 foreach ident : ['secure_getenv', '__secure_getenv']
452 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
456 ['memfd_create', '''#define _GNU_SOURCE
457 #include <sys/mman.h>'''],
458 ['gettid', '''#include <sys/types.h>'''],
459 ['pivot_root', '''#include <stdlib.h>'''], # no known header declares pivot_root
460 ['name_to_handle_at', '''#define _GNU_SOURCE
461 #include <sys/types.h>
462 #include <sys/stat.h>
463 #include <fcntl.h>'''],
464 ['setns', '''#define _GNU_SOURCE
465 #include <sched.h>'''],
466 ['renameat2', '''#include <stdio.h>'''],
467 ['kcmp', '''#include <linux/kcmp.h>'''],
468 ['keyctl', '''#include <sys/types.h>
469 #include <keyutils.h>'''],
470 ['copy_file_range', '''#include <sys/syscall.h>
471 #include <unistd.h>'''],
472 ['bpf', '''#include <sys/syscall.h>
473 #include <unistd.h>'''],
474 ['explicit_bzero' , '''#include <string.h>'''],
477 have = cc.has_function(ident[0], prefix : ident[1])
478 conf.set10('HAVE_' + ident[0].to_upper(), have)
481 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''')
482 conf.set10('USE_SYS_RANDOM_H', true)
483 conf.set10('HAVE_GETRANDOM', true)
485 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
486 conf.set10('USE_SYS_RANDOM_H', false)
487 conf.set10('HAVE_GETRANDOM', have)
490 #####################################################################
492 sed = find_program('sed')
493 awk = find_program('awk')
494 m4 = find_program('m4')
495 stat = find_program('stat')
496 git = find_program('git', required : false)
498 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
499 mkdir_p = 'mkdir -p $DESTDIR/@0@'
500 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
501 splash_bmp = files('test/splash.bmp')
503 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
504 # /usr/sbin, /sbin, and fall back to the default from middle column.
505 progs = [['telinit', '/lib/sysvinit/telinit'],
506 ['quotaon', '/usr/sbin/quotaon' ],
507 ['quotacheck', '/usr/sbin/quotacheck' ],
508 ['kill', '/usr/bin/kill' ],
509 ['kmod', '/usr/bin/kmod' ],
510 ['kexec', '/usr/sbin/kexec' ],
511 ['sulogin', '/usr/sbin/sulogin' ],
512 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
513 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
514 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
515 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
518 path = get_option(prog[0] + '-path')
520 message('Using @1@ for @0@'.format(prog[0], path))
522 exe = find_program(prog[0],
523 '/usr/sbin/' + prog[0],
526 path = exe.found() ? exe.path() : prog[1]
528 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
529 conf.set_quoted(name, path)
530 substs.set(name, path)
533 if run_command('ln', '--relative', '--help').returncode() != 0
534 error('ln does not support --relative')
537 ############################################################
539 gperf = find_program('gperf')
541 gperf_test_format = '''
543 const char * in_word_set(const char *, @0@);
546 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
547 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
548 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
549 if cc.compiles(gperf_test)
550 gperf_len_type = 'size_t'
552 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
553 if cc.compiles(gperf_test)
554 gperf_len_type = 'unsigned'
556 error('unable to determine gperf len type')
559 message('gperf len type is @0@'.format(gperf_len_type))
560 conf.set('GPERF_LEN_TYPE', gperf_len_type,
561 description : 'The type of gperf "len" parameter')
563 ############################################################
565 if not cc.has_header('sys/capability.h')
566 error('POSIX caps headers not found')
568 foreach header : ['linux/btrfs.h',
570 'linux/vm_sockets.h',
572 'valgrind/memcheck.h',
573 'valgrind/valgrind.h',
576 conf.set10('HAVE_' + header.underscorify().to_upper(),
577 cc.has_header(header))
580 ############################################################
582 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
583 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
584 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
586 default_hierarchy = get_option('default-hierarchy')
587 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
588 description : 'default cgroup hierarchy as string')
589 if default_hierarchy == 'legacy'
590 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
591 elif default_hierarchy == 'hybrid'
592 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
594 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
597 time_epoch = get_option('time-epoch')
600 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
602 time_epoch = time_epoch.to_int()
603 conf.set('TIME_EPOCH', time_epoch)
605 system_uid_max = get_option('system-uid-max')
606 if system_uid_max == ''
607 system_uid_max = run_command(
609 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
610 '/etc/login.defs').stdout()
612 system_uid_max = system_uid_max.to_int()
613 conf.set('SYSTEM_UID_MAX', system_uid_max)
614 substs.set('systemuidmax', system_uid_max)
615 message('maximum system UID is @0@'.format(system_uid_max))
617 system_gid_max = get_option('system-gid-max')
618 if system_gid_max == ''
619 system_gid_max = run_command(
621 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
622 '/etc/login.defs').stdout()
624 system_gid_max = system_gid_max.to_int()
625 conf.set('SYSTEM_GID_MAX', system_gid_max)
626 substs.set('systemgidmax', system_gid_max)
627 message('maximum system GID is @0@'.format(system_gid_max))
629 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
630 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
631 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
632 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
633 substs.set('dynamicuidmin', dynamic_uid_min)
634 substs.set('dynamicuidmax', dynamic_uid_max)
636 container_uid_base_min = get_option('container-uid-base-min').to_int()
637 container_uid_base_max = get_option('container-uid-base-max').to_int()
638 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
639 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
640 substs.set('containeruidbasemin', container_uid_base_min)
641 substs.set('containeruidbasemax', container_uid_base_max)
643 nobody_user = get_option('nobody-user')
644 nobody_group = get_option('nobody-group')
646 getent_result = run_command('getent', 'passwd', '65534')
647 if getent_result.returncode() == 0
648 name = getent_result.stdout().split(':')[0]
649 if name != nobody_user
650 message('WARNING:\n' +
651 ' 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) +
652 ' Your build will result in an user table setup that is incompatible with the local system.')
655 id_result = run_command('id', '-u', nobody_user)
656 if id_result.returncode() == 0
657 id = id_result.stdout().to_int()
659 message('WARNING:\n' +
660 ' 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) +
661 ' Your build will result in an user table setup that is incompatible with the local system.')
665 getent_result = run_command('getent', 'group', '65534')
666 if getent_result.returncode() == 0
667 name = getent_result.stdout().split(':')[0]
668 if name != nobody_group
669 message('WARNING:\n' +
670 ' 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) +
671 ' Your build will result in an group table setup that is incompatible with the local system.')
674 id_result = run_command('id', '-g', nobody_group)
675 if id_result.returncode() == 0
676 id = id_result.stdout().to_int()
678 message('WARNING:\n' +
679 ' 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) +
680 ' Your build will result in an group table setup that is incompatible with the local system.')
683 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
684 message('WARNING:\n' +
685 ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
686 ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
689 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
690 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
691 substs.set('NOBODY_USER_NAME', nobody_user)
692 substs.set('NOBODY_GROUP_NAME', nobody_group)
694 tty_gid = get_option('tty-gid')
695 conf.set('TTY_GID', tty_gid)
696 substs.set('TTY_GID', tty_gid)
698 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
699 if get_option('users-gid') != ''
700 users_gid = get_option('users-gid').to_int()
704 substs.set('USERS_GID', users_gid)
706 if get_option('adm-group')
707 m4_defines += ['-DENABLE_ADM_GROUP']
710 if get_option('wheel-group')
711 m4_defines += ['-DENABLE_WHEEL_GROUP']
714 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
715 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
717 kill_user_processes = get_option('default-kill-user-processes')
718 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
719 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
721 dns_servers = get_option('dns-servers')
722 conf.set_quoted('DNS_SERVERS', dns_servers)
723 substs.set('DNS_SERVERS', dns_servers)
725 ntp_servers = get_option('ntp-servers')
726 conf.set_quoted('NTP_SERVERS', ntp_servers)
727 substs.set('NTP_SERVERS', ntp_servers)
729 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
731 substs.set('SUSHELL', get_option('debug-shell'))
732 substs.set('DEBUGTTY', get_option('debug-tty'))
734 debug = get_option('debug')
735 enable_debug_hashmap = false
736 enable_debug_mmap_cache = false
738 foreach name : debug.split(',')
740 enable_debug_hashmap = true
741 elif name == 'mmap-cache'
742 enable_debug_mmap_cache = true
744 message('unknown debug option "@0@", ignoring'.format(name))
748 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
749 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
751 #####################################################################
753 threads = dependency('threads')
754 librt = cc.find_library('rt')
755 libm = cc.find_library('m')
756 libdl = cc.find_library('dl')
757 libcrypt = cc.find_library('crypt')
759 libcap = dependency('libcap', required : false)
760 if not libcap.found()
761 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
762 libcap = cc.find_library('cap')
765 libmount = dependency('mount',
768 want_seccomp = get_option('seccomp')
769 if want_seccomp != 'false'
770 libseccomp = dependency('libseccomp',
771 version : '>= 2.3.1',
772 required : want_seccomp == 'true')
773 have = libseccomp.found()
778 conf.set10('HAVE_SECCOMP', have)
779 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
781 want_selinux = get_option('selinux')
782 if want_selinux != 'false'
783 libselinux = dependency('libselinux',
784 version : '>= 2.1.9',
785 required : want_selinux == 'true')
786 have = libselinux.found()
791 conf.set10('HAVE_SELINUX', have)
792 m4_defines += have ? ['-DHAVE_SELINUX'] : []
794 want_apparmor = get_option('apparmor')
795 if want_apparmor != 'false'
796 libapparmor = dependency('libapparmor',
797 required : want_apparmor == 'true')
798 have = libapparmor.found()
803 conf.set10('HAVE_APPARMOR', have)
804 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
806 smack_run_label = get_option('smack-run-label')
807 if smack_run_label != ''
808 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
809 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
812 want_polkit = get_option('polkit')
813 install_polkit = false
814 install_polkit_pkla = false
815 if want_polkit != 'false'
816 install_polkit = true
818 libpolkit = dependency('polkit-gobject-1',
820 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
821 message('Old polkit detected, will install pkla files')
822 install_polkit_pkla = true
825 conf.set10('ENABLE_POLKIT', install_polkit)
827 want_acl = get_option('acl')
828 if want_acl != 'false'
829 libacl = cc.find_library('acl', required : want_acl == 'true')
830 have = libacl.found()
835 conf.set10('HAVE_ACL', have)
836 m4_defines += have ? ['-DHAVE_ACL'] : []
838 want_audit = get_option('audit')
839 if want_audit != 'false'
840 libaudit = dependency('audit', required : want_audit == 'true')
841 have = libaudit.found()
846 conf.set10('HAVE_AUDIT', have)
848 want_blkid = get_option('blkid')
849 if want_blkid != 'false'
850 libblkid = dependency('blkid', required : want_blkid == 'true')
851 have = libblkid.found()
856 conf.set10('HAVE_BLKID', have)
858 want_kmod = get_option('kmod')
859 if want_kmod != 'false'
860 libkmod = dependency('libkmod',
862 required : want_kmod == 'true')
863 have = libkmod.found()
868 conf.set10('HAVE_KMOD', have)
870 want_pam = get_option('pam')
871 if want_pam != 'false'
872 libpam = cc.find_library('pam', required : want_pam == 'true')
873 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
874 have = libpam.found() and libpam_misc.found()
880 conf.set10('HAVE_PAM', have)
881 m4_defines += have ? ['-DHAVE_PAM'] : []
883 want_microhttpd = get_option('microhttpd')
884 if want_microhttpd != 'false'
885 libmicrohttpd = dependency('libmicrohttpd',
886 version : '>= 0.9.33',
887 required : want_microhttpd == 'true')
888 have = libmicrohttpd.found()
893 conf.set10('HAVE_MICROHTTPD', have)
894 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
896 want_libcryptsetup = get_option('libcryptsetup')
897 if want_libcryptsetup != 'false'
898 libcryptsetup = dependency('libcryptsetup',
899 version : '>= 1.6.0',
900 required : want_libcryptsetup == 'true')
901 have = libcryptsetup.found()
906 conf.set10('HAVE_LIBCRYPTSETUP', have)
908 want_libcurl = get_option('libcurl')
909 if want_libcurl != 'false'
910 libcurl = dependency('libcurl',
911 version : '>= 7.32.0',
912 required : want_libcurl == 'true')
913 have = libcurl.found()
918 conf.set10('HAVE_LIBCURL', have)
919 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
921 want_libidn = get_option('libidn')
922 want_libidn2 = get_option('libidn2')
923 if want_libidn == 'true' and want_libidn2 == 'true'
924 error('libidn and libidn2 cannot be requested simultaneously')
927 if want_libidn != 'false' and want_libidn2 != 'true'
928 libidn = dependency('libidn',
929 required : want_libidn == 'true')
930 have = libidn.found()
935 conf.set10('HAVE_LIBIDN', have)
936 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
937 if not have and want_libidn2 != 'false'
938 # libidn is used for both libidn and libidn2 objects
939 libidn = dependency('libidn2',
940 required : want_libidn2 == 'true')
941 have = libidn.found()
945 conf.set10('HAVE_LIBIDN2', have)
946 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
948 want_libiptc = get_option('libiptc')
949 if want_libiptc != 'false'
950 libiptc = dependency('libiptc',
951 required : want_libiptc == 'true')
952 have = libiptc.found()
957 conf.set10('HAVE_LIBIPTC', have)
958 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
960 want_qrencode = get_option('qrencode')
961 if want_qrencode != 'false'
962 libqrencode = dependency('libqrencode',
963 required : want_qrencode == 'true')
964 have = libqrencode.found()
969 conf.set10('HAVE_QRENCODE', have)
971 want_gcrypt = get_option('gcrypt')
972 if want_gcrypt != 'false'
973 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
974 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
975 have = libgcrypt.found() and libgpg_error.found()
980 # link to neither of the libs if one is not found
984 conf.set10('HAVE_GCRYPT', have)
986 want_gnutls = get_option('gnutls')
987 if want_gnutls != 'false'
988 libgnutls = dependency('gnutls',
989 version : '>= 3.1.4',
990 required : want_gnutls == 'true')
991 have = libgnutls.found()
996 conf.set10('HAVE_GNUTLS', have)
998 want_elfutils = get_option('elfutils')
999 if want_elfutils != 'false'
1000 libdw = dependency('libdw',
1001 required : want_elfutils == 'true')
1002 have = libdw.found()
1007 conf.set10('HAVE_ELFUTILS', have)
1009 want_zlib = get_option('zlib')
1010 if want_zlib != 'false'
1011 libz = dependency('zlib',
1012 required : want_zlib == 'true')
1018 conf.set10('HAVE_ZLIB', have)
1020 want_bzip2 = get_option('bzip2')
1021 if want_bzip2 != 'false'
1022 libbzip2 = cc.find_library('bz2',
1023 required : want_bzip2 == 'true')
1024 have = libbzip2.found()
1029 conf.set10('HAVE_BZIP2', have)
1031 want_xz = get_option('xz')
1032 if want_xz != 'false'
1033 libxz = dependency('liblzma',
1034 required : want_xz == 'true')
1035 have = libxz.found()
1040 conf.set10('HAVE_XZ', have)
1042 want_lz4 = get_option('lz4')
1043 if want_lz4 != 'false'
1044 liblz4 = dependency('liblz4',
1045 required : want_lz4 == 'true')
1046 have = liblz4.found()
1051 conf.set10('HAVE_LZ4', have)
1053 want_xkbcommon = get_option('xkbcommon')
1054 if want_xkbcommon != 'false'
1055 libxkbcommon = dependency('xkbcommon',
1056 version : '>= 0.3.0',
1057 required : want_xkbcommon == 'true')
1058 have = libxkbcommon.found()
1063 conf.set10('HAVE_XKBCOMMON', have)
1065 want_glib = get_option('glib')
1066 if want_glib != 'false'
1067 libglib = dependency('glib-2.0',
1068 version : '>= 2.22.0',
1069 required : want_glib == 'true')
1070 libgobject = dependency('gobject-2.0',
1071 version : '>= 2.22.0',
1072 required : want_glib == 'true')
1073 libgio = dependency('gio-2.0',
1074 required : want_glib == 'true')
1075 have = libglib.found() and libgobject.found() and libgio.found()
1082 conf.set10('HAVE_GLIB', have)
1084 want_dbus = get_option('dbus')
1085 if want_dbus != 'false'
1086 libdbus = dependency('dbus-1',
1087 version : '>= 1.3.2',
1088 required : want_dbus == 'true')
1089 have = libdbus.found()
1094 conf.set10('HAVE_DBUS', have)
1096 default_dnssec = get_option('default-dnssec')
1097 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1098 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1099 default_dnssec = 'no'
1101 conf.set('DEFAULT_DNSSEC_MODE',
1102 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1103 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1105 want_importd = get_option('importd')
1106 if want_importd != 'false'
1107 have = (conf.get('HAVE_LIBCURL') == 1 and
1108 conf.get('HAVE_ZLIB') == 1 and
1109 conf.get('HAVE_BZIP2') == 1 and
1110 conf.get('HAVE_XZ') == 1 and
1111 conf.get('HAVE_GCRYPT') == 1)
1112 if want_importd == 'true' and not have
1113 error('importd support was requested, but dependencies are not available')
1118 conf.set10('ENABLE_IMPORTD', have)
1120 want_remote = get_option('remote')
1121 if want_remote != 'false'
1122 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1123 conf.get('HAVE_LIBCURL') == 1]
1124 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1125 # it's possible to build one without the other. Complain only if
1126 # support was explictly requested. The auxiliary files like sysusers
1127 # config should be installed when any of the programs are built.
1128 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1129 error('remote support was requested, but dependencies are not available')
1131 have = have_deps[0] or have_deps[1]
1135 conf.set10('ENABLE_REMOTE', have)
1137 foreach term : ['utmp',
1168 have = get_option(term)
1169 name = 'ENABLE_' + term.underscorify().to_upper()
1170 conf.set10(name, have)
1171 m4_defines += have ? ['-D' + name] : []
1174 want_tests = get_option('tests')
1175 install_tests = get_option('install-tests')
1178 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1180 #####################################################################
1182 if get_option('efi')
1183 efi_arch = host_machine.cpu_family()
1185 if efi_arch == 'x86'
1186 EFI_MACHINE_TYPE_NAME = 'ia32'
1187 gnu_efi_arch = 'ia32'
1188 elif efi_arch == 'x86_64'
1189 EFI_MACHINE_TYPE_NAME = 'x64'
1190 gnu_efi_arch = 'x86_64'
1191 elif efi_arch == 'arm'
1192 EFI_MACHINE_TYPE_NAME = 'arm'
1193 gnu_efi_arch = 'arm'
1194 elif efi_arch == 'aarch64'
1195 EFI_MACHINE_TYPE_NAME = 'aa64'
1196 gnu_efi_arch = 'aarch64'
1198 EFI_MACHINE_TYPE_NAME = ''
1203 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1205 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1209 conf.set10('ENABLE_EFI', have)
1211 #####################################################################
1213 config_h = configure_file(
1214 output : 'config.h',
1215 configuration : conf)
1217 includes = include_directories('src/basic',
1227 'src/libsystemd/sd-bus',
1228 'src/libsystemd/sd-device',
1229 'src/libsystemd/sd-hwdb',
1230 'src/libsystemd/sd-id128',
1231 'src/libsystemd/sd-netlink',
1232 'src/libsystemd/sd-network',
1233 'src/libsystemd-network',
1237 add_project_arguments('-include', 'config.h', language : 'c')
1239 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1240 'src/shared/gcrypt-util.c')
1244 subdir('src/systemd')
1246 subdir('src/libsystemd')
1247 subdir('src/libsystemd-network')
1248 subdir('src/journal')
1251 libjournal_core = static_library(
1253 libjournal_core_sources,
1255 include_directories : includes,
1258 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1259 libsystemd = shared_library(
1261 libsystemd_internal_sources,
1262 journal_internal_sources,
1263 version : libsystemd_version,
1264 include_directories : includes,
1265 link_args : ['-shared',
1266 '-Wl,--version-script=' + libsystemd_sym_path],
1267 link_with : [libbasic],
1268 dependencies : [threads,
1273 link_depends : libsystemd_sym,
1275 install_dir : rootlibdir)
1277 ############################################################
1279 # binaries that have --help and are intended for use by humans,
1280 # usually, but not always, installed in /bin.
1281 public_programs = []
1283 subdir('src/libudev')
1284 subdir('src/shared')
1287 subdir('src/network')
1289 subdir('src/analyze')
1290 subdir('src/journal-remote')
1291 subdir('src/coredump')
1292 subdir('src/hostname')
1293 subdir('src/import')
1294 subdir('src/kernel-install')
1295 subdir('src/locale')
1296 subdir('src/machine')
1297 subdir('src/nspawn')
1298 subdir('src/resolve')
1299 subdir('src/timedate')
1300 subdir('src/timesync')
1301 subdir('src/vconsole')
1302 subdir('src/sulogin-shell')
1303 subdir('src/boot/efi')
1309 ############################################################
1311 # only static linking apart from libdl, to make sure that the
1312 # module is linked to all libraries that it uses.
1313 test_dlopen = executable(
1316 include_directories : includes,
1317 link_with : [libbasic],
1318 dependencies : [libdl])
1320 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1321 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1322 ['mymachines', 'ENABLE_MACHINED'],
1323 ['resolve', 'ENABLE_RESOLVE']]
1325 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1329 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1330 version_script_arg = join_paths(meson.current_source_dir(), sym)
1332 nss = shared_library(
1334 'src/nss-@0@/nss-@0@.c'.format(module),
1336 include_directories : includes,
1337 link_args : ['-shared',
1338 '-Wl,--version-script=' + version_script_arg,
1340 link_with : [libsystemd_internal,
1342 dependencies : [threads,
1346 install_dir : rootlibdir)
1348 # We cannot use shared_module because it does not support version suffix.
1349 # Unfortunately shared_library insists on creating the symlink…
1350 meson.add_install_script('sh', '-c',
1351 'rm $DESTDIR@0@/libnss_@1@.so'
1352 .format(rootlibdir, module))
1354 test('dlopen-nss_' + module,
1356 args : [nss.full_path()]) # path to dlopen must include a slash
1360 ############################################################
1362 executable('systemd',
1364 include_directories : includes,
1365 link_with : [libcore,
1367 dependencies : [threads,
1373 install_rpath : rootlibexecdir,
1375 install_dir : rootlibexecdir)
1377 exe = executable('systemd-analyze',
1378 systemd_analyze_sources,
1379 include_directories : includes,
1380 link_with : [libcore,
1382 dependencies : [threads,
1388 install_rpath : rootlibexecdir,
1390 public_programs += [exe]
1392 executable('systemd-journald',
1393 systemd_journald_sources,
1394 include_directories : includes,
1395 link_with : [libjournal_core,
1397 dependencies : [threads,
1401 install_rpath : rootlibexecdir,
1403 install_dir : rootlibexecdir)
1405 exe = executable('systemd-cat',
1406 systemd_cat_sources,
1407 include_directories : includes,
1408 link_with : [libjournal_core,
1410 dependencies : [threads],
1411 install_rpath : rootlibexecdir,
1413 public_programs += [exe]
1415 exe = executable('journalctl',
1417 include_directories : includes,
1418 link_with : [libshared],
1419 dependencies : [threads,
1423 install_rpath : rootlibexecdir,
1425 install_dir : rootbindir)
1426 public_programs += [exe]
1428 executable('systemd-getty-generator',
1429 'src/getty-generator/getty-generator.c',
1430 include_directories : includes,
1431 link_with : [libshared],
1432 install_rpath : rootlibexecdir,
1434 install_dir : systemgeneratordir)
1436 executable('systemd-debug-generator',
1437 'src/debug-generator/debug-generator.c',
1438 include_directories : includes,
1439 link_with : [libshared],
1440 install_rpath : rootlibexecdir,
1442 install_dir : systemgeneratordir)
1444 executable('systemd-fstab-generator',
1445 'src/fstab-generator/fstab-generator.c',
1446 'src/core/mount-setup.c',
1447 include_directories : includes,
1448 link_with : [libshared],
1449 install_rpath : rootlibexecdir,
1451 install_dir : systemgeneratordir)
1453 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1454 executable('30-systemd-environment-d-generator',
1455 'src/environment-d-generator/environment-d-generator.c',
1456 include_directories : includes,
1457 link_with : [libshared],
1458 install_rpath : rootlibexecdir,
1460 install_dir : userenvgeneratordir)
1462 meson.add_install_script(meson_make_symlink,
1463 join_paths(sysconfdir, 'environment'),
1464 join_paths(environmentdir, '99-environment.conf'))
1467 if conf.get('ENABLE_HIBERNATE') == 1
1468 executable('systemd-hibernate-resume-generator',
1469 'src/hibernate-resume/hibernate-resume-generator.c',
1470 include_directories : includes,
1471 link_with : [libshared],
1472 install_rpath : rootlibexecdir,
1474 install_dir : systemgeneratordir)
1476 executable('systemd-hibernate-resume',
1477 'src/hibernate-resume/hibernate-resume.c',
1478 include_directories : includes,
1479 link_with : [libshared],
1480 install_rpath : rootlibexecdir,
1482 install_dir : rootlibexecdir)
1485 if conf.get('HAVE_BLKID') == 1
1486 executable('systemd-gpt-auto-generator',
1487 'src/gpt-auto-generator/gpt-auto-generator.c',
1488 'src/basic/blkid-util.h',
1489 include_directories : includes,
1490 link_with : [libshared],
1491 dependencies : libblkid,
1492 install_rpath : rootlibexecdir,
1494 install_dir : systemgeneratordir)
1496 exe = executable('systemd-dissect',
1497 'src/dissect/dissect.c',
1498 include_directories : includes,
1499 link_with : [libshared],
1500 install_rpath : rootlibexecdir,
1502 install_dir : rootlibexecdir)
1503 public_programs += [exe]
1506 if conf.get('ENABLE_RESOLVE') == 1
1507 executable('systemd-resolved',
1508 systemd_resolved_sources,
1509 gcrypt_util_sources,
1510 include_directories : includes,
1511 link_with : [libshared],
1512 dependencies : [threads,
1517 install_rpath : rootlibexecdir,
1519 install_dir : rootlibexecdir)
1521 exe = executable('systemd-resolve',
1522 systemd_resolve_sources,
1523 gcrypt_util_sources,
1524 include_directories : includes,
1525 link_with : [libshared],
1526 dependencies : [threads,
1531 install_rpath : rootlibexecdir,
1533 public_programs += [exe]
1536 if conf.get('ENABLE_LOGIND') == 1
1537 executable('systemd-logind',
1538 systemd_logind_sources,
1539 include_directories : includes,
1540 link_with : [liblogind_core,
1542 dependencies : [threads,
1544 install_rpath : rootlibexecdir,
1546 install_dir : rootlibexecdir)
1548 exe = executable('loginctl',
1550 include_directories : includes,
1551 link_with : [libshared],
1552 dependencies : [threads,
1555 install_rpath : rootlibexecdir,
1557 install_dir : rootbindir)
1558 public_programs += [exe]
1560 exe = executable('systemd-inhibit',
1561 'src/login/inhibit.c',
1562 include_directories : includes,
1563 link_with : [libshared],
1564 install_rpath : rootlibexecdir,
1566 install_dir : rootbindir)
1567 public_programs += [exe]
1569 if conf.get('HAVE_PAM') == 1
1570 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1571 pam_systemd = shared_library(
1575 include_directories : includes,
1576 link_args : ['-shared',
1577 '-Wl,--version-script=' + version_script_arg],
1578 link_with : [libsystemd_internal,
1580 dependencies : [threads,
1583 link_depends : pam_systemd_sym,
1585 install_dir : pamlibdir)
1587 test('dlopen-pam_systemd',
1589 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1593 if conf.get('HAVE_PAM') == 1
1594 executable('systemd-user-sessions',
1595 'src/user-sessions/user-sessions.c',
1596 include_directories : includes,
1597 link_with : [libshared],
1598 install_rpath : rootlibexecdir,
1600 install_dir : rootlibexecdir)
1603 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1604 exe = executable('bootctl',
1605 'src/boot/bootctl.c',
1606 include_directories : includes,
1607 link_with : [libshared],
1608 dependencies : [libblkid],
1609 install_rpath : rootlibexecdir,
1611 public_programs += [exe]
1614 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1615 include_directories : includes,
1616 link_with : [libshared],
1617 dependencies : [threads],
1618 install_rpath : rootlibexecdir,
1620 public_programs += [exe]
1622 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1623 include_directories : includes,
1624 link_with : [libshared],
1625 dependencies : [threads,
1630 install_rpath : rootlibexecdir,
1632 install_dir : rootbindir)
1633 public_programs += [exe]
1635 if conf.get('ENABLE_BACKLIGHT') == 1
1636 executable('systemd-backlight',
1637 'src/backlight/backlight.c',
1638 include_directories : includes,
1639 link_with : [libshared],
1640 install_rpath : rootlibexecdir,
1642 install_dir : rootlibexecdir)
1645 if conf.get('ENABLE_RFKILL') == 1
1646 executable('systemd-rfkill',
1647 'src/rfkill/rfkill.c',
1648 include_directories : includes,
1649 link_with : [libshared],
1650 install_rpath : rootlibexecdir,
1652 install_dir : rootlibexecdir)
1655 executable('systemd-system-update-generator',
1656 'src/system-update-generator/system-update-generator.c',
1657 include_directories : includes,
1658 link_with : [libshared],
1659 install_rpath : rootlibexecdir,
1661 install_dir : systemgeneratordir)
1663 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1664 executable('systemd-cryptsetup',
1665 'src/cryptsetup/cryptsetup.c',
1666 include_directories : includes,
1667 link_with : [libshared],
1668 dependencies : [libcryptsetup],
1669 install_rpath : rootlibexecdir,
1671 install_dir : rootlibexecdir)
1673 executable('systemd-cryptsetup-generator',
1674 'src/cryptsetup/cryptsetup-generator.c',
1675 include_directories : includes,
1676 link_with : [libshared],
1677 dependencies : [libcryptsetup],
1678 install_rpath : rootlibexecdir,
1680 install_dir : systemgeneratordir)
1682 executable('systemd-veritysetup',
1683 'src/veritysetup/veritysetup.c',
1684 include_directories : includes,
1685 link_with : [libshared],
1686 dependencies : [libcryptsetup],
1687 install_rpath : rootlibexecdir,
1689 install_dir : rootlibexecdir)
1691 executable('systemd-veritysetup-generator',
1692 'src/veritysetup/veritysetup-generator.c',
1693 include_directories : includes,
1694 link_with : [libshared],
1695 dependencies : [libcryptsetup],
1696 install_rpath : rootlibexecdir,
1698 install_dir : systemgeneratordir)
1701 if conf.get('HAVE_SYSV_COMPAT') == 1
1702 executable('systemd-sysv-generator',
1703 'src/sysv-generator/sysv-generator.c',
1704 include_directories : includes,
1705 link_with : [libshared],
1706 install_rpath : rootlibexecdir,
1708 install_dir : systemgeneratordir)
1710 executable('systemd-rc-local-generator',
1711 'src/rc-local-generator/rc-local-generator.c',
1712 include_directories : includes,
1713 link_with : [libshared],
1714 install_rpath : rootlibexecdir,
1716 install_dir : systemgeneratordir)
1719 if conf.get('ENABLE_HOSTNAMED') == 1
1720 executable('systemd-hostnamed',
1721 'src/hostname/hostnamed.c',
1722 include_directories : includes,
1723 link_with : [libshared],
1724 install_rpath : rootlibexecdir,
1726 install_dir : rootlibexecdir)
1728 exe = executable('hostnamectl',
1729 'src/hostname/hostnamectl.c',
1730 include_directories : includes,
1731 link_with : [libshared],
1732 install_rpath : rootlibexecdir,
1734 public_programs += [exe]
1737 if conf.get('ENABLE_LOCALED') == 1
1738 if conf.get('HAVE_XKBCOMMON') == 1
1739 # logind will load libxkbcommon.so dynamically on its own
1745 executable('systemd-localed',
1746 systemd_localed_sources,
1747 include_directories : includes,
1748 link_with : [libshared],
1749 dependencies : deps,
1750 install_rpath : rootlibexecdir,
1752 install_dir : rootlibexecdir)
1754 exe = executable('localectl',
1756 include_directories : includes,
1757 link_with : [libshared],
1758 install_rpath : rootlibexecdir,
1760 public_programs += [exe]
1763 if conf.get('ENABLE_TIMEDATED') == 1
1764 executable('systemd-timedated',
1765 'src/timedate/timedated.c',
1766 include_directories : includes,
1767 link_with : [libshared],
1768 install_rpath : rootlibexecdir,
1770 install_dir : rootlibexecdir)
1772 exe = executable('timedatectl',
1773 'src/timedate/timedatectl.c',
1774 include_directories : includes,
1775 install_rpath : rootlibexecdir,
1776 link_with : [libshared],
1778 public_programs += [exe]
1781 if conf.get('ENABLE_TIMESYNCD') == 1
1782 executable('systemd-timesyncd',
1783 systemd_timesyncd_sources,
1784 include_directories : includes,
1785 link_with : [libshared],
1786 dependencies : [threads,
1788 install_rpath : rootlibexecdir,
1790 install_dir : rootlibexecdir)
1793 if conf.get('ENABLE_MACHINED') == 1
1794 executable('systemd-machined',
1795 systemd_machined_sources,
1796 include_directories : includes,
1797 link_with : [libmachine_core,
1799 install_rpath : rootlibexecdir,
1801 install_dir : rootlibexecdir)
1803 exe = executable('machinectl',
1804 'src/machine/machinectl.c',
1805 include_directories : includes,
1806 link_with : [libshared],
1807 dependencies : [threads,
1810 install_rpath : rootlibexecdir,
1812 install_dir : rootbindir)
1813 public_programs += [exe]
1816 if conf.get('ENABLE_IMPORTD') == 1
1817 executable('systemd-importd',
1818 systemd_importd_sources,
1819 include_directories : includes,
1820 link_with : [libshared],
1821 dependencies : [threads],
1822 install_rpath : rootlibexecdir,
1824 install_dir : rootlibexecdir)
1826 systemd_pull = executable('systemd-pull',
1827 systemd_pull_sources,
1828 include_directories : includes,
1829 link_with : [libshared],
1830 dependencies : [libcurl,
1835 install_rpath : rootlibexecdir,
1837 install_dir : rootlibexecdir)
1839 systemd_import = executable('systemd-import',
1840 systemd_import_sources,
1841 include_directories : includes,
1842 link_with : [libshared],
1843 dependencies : [libcurl,
1847 install_rpath : rootlibexecdir,
1849 install_dir : rootlibexecdir)
1851 systemd_export = executable('systemd-export',
1852 systemd_export_sources,
1853 include_directories : includes,
1854 link_with : [libshared],
1855 dependencies : [libcurl,
1859 install_rpath : rootlibexecdir,
1861 install_dir : rootlibexecdir)
1862 public_programs += [systemd_pull, systemd_import, systemd_export]
1865 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1866 exe = executable('systemd-journal-upload',
1867 systemd_journal_upload_sources,
1868 include_directories : includes,
1869 link_with : [libshared],
1870 dependencies : [threads,
1875 install_rpath : rootlibexecdir,
1877 install_dir : rootlibexecdir)
1878 public_programs += [exe]
1881 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1882 s_j_remote = executable('systemd-journal-remote',
1883 systemd_journal_remote_sources,
1884 include_directories : includes,
1885 link_with : [libshared],
1886 dependencies : [threads,
1891 install_rpath : rootlibexecdir,
1893 install_dir : rootlibexecdir)
1895 s_j_gatewayd = executable('systemd-journal-gatewayd',
1896 systemd_journal_gatewayd_sources,
1897 include_directories : includes,
1898 link_with : [libshared],
1899 dependencies : [threads,
1904 install_rpath : rootlibexecdir,
1906 install_dir : rootlibexecdir)
1907 public_programs += [s_j_remote, s_j_gatewayd]
1910 if conf.get('ENABLE_COREDUMP') == 1
1911 executable('systemd-coredump',
1912 systemd_coredump_sources,
1913 include_directories : includes,
1914 link_with : [libshared],
1915 dependencies : [threads,
1920 install_rpath : rootlibexecdir,
1922 install_dir : rootlibexecdir)
1924 exe = executable('coredumpctl',
1925 coredumpctl_sources,
1926 include_directories : includes,
1927 link_with : [libshared],
1928 dependencies : [threads,
1931 install_rpath : rootlibexecdir,
1933 public_programs += [exe]
1936 if conf.get('ENABLE_BINFMT') == 1
1937 exe = executable('systemd-binfmt',
1938 'src/binfmt/binfmt.c',
1939 include_directories : includes,
1940 link_with : [libshared],
1941 install_rpath : rootlibexecdir,
1943 install_dir : rootlibexecdir)
1944 public_programs += [exe]
1946 meson.add_install_script('sh', '-c',
1947 mkdir_p.format(binfmtdir))
1948 meson.add_install_script('sh', '-c',
1949 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1952 if conf.get('ENABLE_VCONSOLE') == 1
1953 executable('systemd-vconsole-setup',
1954 'src/vconsole/vconsole-setup.c',
1955 include_directories : includes,
1956 link_with : [libshared],
1957 install_rpath : rootlibexecdir,
1959 install_dir : rootlibexecdir)
1962 if conf.get('ENABLE_RANDOMSEED') == 1
1963 executable('systemd-random-seed',
1964 'src/random-seed/random-seed.c',
1965 include_directories : includes,
1966 link_with : [libshared],
1967 install_rpath : rootlibexecdir,
1969 install_dir : rootlibexecdir)
1972 if conf.get('ENABLE_FIRSTBOOT') == 1
1973 executable('systemd-firstboot',
1974 'src/firstboot/firstboot.c',
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [libcrypt],
1978 install_rpath : rootlibexecdir,
1980 install_dir : rootbindir)
1983 executable('systemd-remount-fs',
1984 'src/remount-fs/remount-fs.c',
1985 'src/core/mount-setup.c',
1986 'src/core/mount-setup.h',
1987 include_directories : includes,
1988 link_with : [libshared],
1989 install_rpath : rootlibexecdir,
1991 install_dir : rootlibexecdir)
1993 executable('systemd-machine-id-setup',
1994 'src/machine-id-setup/machine-id-setup-main.c',
1995 'src/core/machine-id-setup.c',
1996 'src/core/machine-id-setup.h',
1997 include_directories : includes,
1998 link_with : [libshared],
1999 install_rpath : rootlibexecdir,
2001 install_dir : rootbindir)
2003 executable('systemd-fsck',
2005 include_directories : includes,
2006 link_with : [libshared],
2007 install_rpath : rootlibexecdir,
2009 install_dir : rootlibexecdir)
2011 executable('systemd-growfs',
2012 'src/partition/growfs.c',
2013 include_directories : includes,
2014 link_with : [libshared],
2015 dependencies : [libcryptsetup],
2016 install_rpath : rootlibexecdir,
2018 install_dir : rootlibexecdir)
2020 executable('systemd-makefs',
2021 'src/partition/makefs.c',
2022 include_directories : includes,
2023 link_with : [libshared],
2024 install_rpath : rootlibexecdir,
2026 install_dir : rootlibexecdir)
2028 executable('systemd-sleep',
2029 'src/sleep/sleep.c',
2030 include_directories : includes,
2031 link_with : [libshared],
2032 install_rpath : rootlibexecdir,
2034 install_dir : rootlibexecdir)
2036 exe = executable('systemd-sysctl',
2037 'src/sysctl/sysctl.c',
2038 include_directories : includes,
2039 link_with : [libshared],
2040 install_rpath : rootlibexecdir,
2042 install_dir : rootlibexecdir)
2043 public_programs += [exe]
2045 executable('systemd-ac-power',
2046 'src/ac-power/ac-power.c',
2047 include_directories : includes,
2048 link_with : [libshared],
2049 install_rpath : rootlibexecdir,
2051 install_dir : rootlibexecdir)
2053 exe = executable('systemd-detect-virt',
2054 'src/detect-virt/detect-virt.c',
2055 include_directories : includes,
2056 link_with : [libshared],
2057 install_rpath : rootlibexecdir,
2059 public_programs += [exe]
2061 exe = executable('systemd-delta',
2062 'src/delta/delta.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 install_rpath : rootlibexecdir,
2067 public_programs += [exe]
2069 exe = executable('systemd-escape',
2070 'src/escape/escape.c',
2071 include_directories : includes,
2072 link_with : [libshared],
2073 install_rpath : rootlibexecdir,
2075 install_dir : rootbindir)
2076 public_programs += [exe]
2078 exe = executable('systemd-notify',
2079 'src/notify/notify.c',
2080 include_directories : includes,
2081 link_with : [libshared],
2082 install_rpath : rootlibexecdir,
2084 install_dir : rootbindir)
2085 public_programs += [exe]
2087 executable('systemd-volatile-root',
2088 'src/volatile-root/volatile-root.c',
2089 include_directories : includes,
2090 link_with : [libshared],
2091 install_rpath : rootlibexecdir,
2093 install_dir : rootlibexecdir)
2095 executable('systemd-cgroups-agent',
2096 'src/cgroups-agent/cgroups-agent.c',
2097 include_directories : includes,
2098 link_with : [libshared],
2099 install_rpath : rootlibexecdir,
2101 install_dir : rootlibexecdir)
2103 exe = executable('systemd-path',
2105 include_directories : includes,
2106 link_with : [libshared],
2107 install_rpath : rootlibexecdir,
2109 public_programs += [exe]
2111 exe = executable('systemd-ask-password',
2112 'src/ask-password/ask-password.c',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 install_rpath : rootlibexecdir,
2117 install_dir : rootbindir)
2118 public_programs += [exe]
2120 executable('systemd-reply-password',
2121 'src/reply-password/reply-password.c',
2122 include_directories : includes,
2123 link_with : [libshared],
2124 install_rpath : rootlibexecdir,
2126 install_dir : rootlibexecdir)
2128 exe = executable('systemd-tty-ask-password-agent',
2129 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 install_rpath : rootlibexecdir,
2134 install_dir : rootbindir)
2135 public_programs += [exe]
2137 exe = executable('systemd-cgls',
2139 include_directories : includes,
2140 link_with : [libshared],
2141 install_rpath : rootlibexecdir,
2143 public_programs += [exe]
2145 exe = executable('systemd-cgtop',
2146 'src/cgtop/cgtop.c',
2147 include_directories : includes,
2148 link_with : [libshared],
2149 install_rpath : rootlibexecdir,
2151 public_programs += [exe]
2153 executable('systemd-initctl',
2154 'src/initctl/initctl.c',
2155 include_directories : includes,
2156 link_with : [libshared],
2157 install_rpath : rootlibexecdir,
2159 install_dir : rootlibexecdir)
2161 exe = executable('systemd-mount',
2162 'src/mount/mount-tool.c',
2163 include_directories : includes,
2164 link_with : [libshared],
2165 install_rpath : rootlibexecdir,
2167 public_programs += [exe]
2169 meson.add_install_script(meson_make_symlink,
2170 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2172 exe = executable('systemd-run',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2178 public_programs += [exe]
2180 exe = executable('systemd-stdio-bridge',
2181 'src/stdio-bridge/stdio-bridge.c',
2182 include_directories : includes,
2183 link_with : [libshared],
2184 install_rpath : rootlibexecdir,
2186 public_programs += [exe]
2188 exe = executable('busctl',
2189 'src/busctl/busctl.c',
2190 'src/busctl/busctl-introspect.c',
2191 'src/busctl/busctl-introspect.h',
2192 include_directories : includes,
2193 link_with : [libshared],
2194 install_rpath : rootlibexecdir,
2196 public_programs += [exe]
2198 if conf.get('ENABLE_SYSUSERS') == 1
2199 exe = executable('systemd-sysusers',
2200 'src/sysusers/sysusers.c',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 install_rpath : rootlibexecdir,
2205 install_dir : rootbindir)
2206 public_programs += [exe]
2209 if conf.get('ENABLE_TMPFILES') == 1
2210 exe = executable('systemd-tmpfiles',
2211 'src/tmpfiles/tmpfiles.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 dependencies : [libacl],
2215 install_rpath : rootlibexecdir,
2217 install_dir : rootbindir)
2218 public_programs += [exe]
2220 test('test-systemd-tmpfiles',
2221 test_systemd_tmpfiles_py,
2222 args : exe.full_path())
2223 # https://github.com/mesonbuild/meson/issues/2681
2226 if conf.get('ENABLE_HWDB') == 1
2227 exe = executable('systemd-hwdb',
2229 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2230 include_directories : includes,
2231 link_with : [libudev_internal],
2232 install_rpath : udev_rpath,
2234 install_dir : rootbindir)
2235 public_programs += [exe]
2238 if conf.get('ENABLE_QUOTACHECK') == 1
2239 executable('systemd-quotacheck',
2240 'src/quotacheck/quotacheck.c',
2241 include_directories : includes,
2242 link_with : [libshared],
2243 install_rpath : rootlibexecdir,
2245 install_dir : rootlibexecdir)
2248 exe = executable('systemd-socket-proxyd',
2249 'src/socket-proxy/socket-proxyd.c',
2250 include_directories : includes,
2251 link_with : [libshared],
2252 dependencies : [threads],
2253 install_rpath : rootlibexecdir,
2255 install_dir : rootlibexecdir)
2256 public_programs += [exe]
2258 exe = executable('systemd-udevd',
2259 systemd_udevd_sources,
2260 include_directories : includes,
2261 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2262 link_with : [libudev_core,
2265 dependencies : [threads,
2270 install_rpath : udev_rpath,
2272 install_dir : rootlibexecdir)
2273 public_programs += [exe]
2275 exe = executable('udevadm',
2277 include_directories : includes,
2278 link_with : [libudev_core,
2281 dependencies : [threads,
2286 install_rpath : udev_rpath,
2288 install_dir : rootbindir)
2289 public_programs += [exe]
2291 executable('systemd-shutdown',
2292 systemd_shutdown_sources,
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2297 install_dir : rootlibexecdir)
2299 executable('systemd-update-done',
2300 'src/update-done/update-done.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2305 install_dir : rootlibexecdir)
2307 executable('systemd-update-utmp',
2308 'src/update-utmp/update-utmp.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 dependencies : [libaudit],
2312 install_rpath : rootlibexecdir,
2314 install_dir : rootlibexecdir)
2316 if conf.get('HAVE_KMOD') == 1
2317 executable('systemd-modules-load',
2318 'src/modules-load/modules-load.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 dependencies : [libkmod],
2322 install_rpath : rootlibexecdir,
2324 install_dir : rootlibexecdir)
2326 meson.add_install_script('sh', '-c',
2327 mkdir_p.format(modulesloaddir))
2328 meson.add_install_script('sh', '-c',
2329 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2332 exe = executable('systemd-nspawn',
2333 systemd_nspawn_sources,
2334 'src/core/mount-setup.c', # FIXME: use a variable?
2335 'src/core/mount-setup.h',
2336 'src/core/loopback-setup.c',
2337 'src/core/loopback-setup.h',
2338 include_directories : [includes, include_directories('src/nspawn')],
2339 link_with : [libshared],
2340 dependencies : [libacl,
2344 install_rpath : rootlibexecdir,
2346 public_programs += [exe]
2348 if conf.get('ENABLE_NETWORKD') == 1
2349 executable('systemd-networkd',
2350 systemd_networkd_sources,
2351 include_directories : includes,
2352 link_with : [libnetworkd_core,
2356 dependencies : [threads],
2357 install_rpath : rootlibexecdir,
2359 install_dir : rootlibexecdir)
2361 executable('systemd-networkd-wait-online',
2362 systemd_networkd_wait_online_sources,
2363 include_directories : includes,
2364 link_with : [libnetworkd_core,
2366 install_rpath : rootlibexecdir,
2368 install_dir : rootlibexecdir)
2370 exe = executable('networkctl',
2372 include_directories : includes,
2373 link_with : [libsystemd_network,
2375 install_rpath : rootlibexecdir,
2377 install_dir : rootbindir)
2378 public_programs += [exe]
2380 ############################################################
2382 foreach tuple : tests
2384 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2385 dependencies = tuple[2]
2386 condition = tuple.length() >= 4 ? tuple[3] : ''
2387 type = tuple.length() >= 5 ? tuple[4] : ''
2388 defs = tuple.length() >= 6 ? tuple[5] : []
2389 incs = tuple.length() >= 7 ? tuple[6] : includes
2392 name = sources[0].split('/')[-1].split('.')[0]
2393 if type.startswith('timeout=')
2394 timeout = type.split('=')[1].to_int()
2398 if condition == '' or conf.get(condition) == 1
2402 include_directories : incs,
2403 link_with : link_with,
2404 dependencies : dependencies,
2406 install_rpath : rootlibexecdir,
2407 install : install_tests,
2408 install_dir : join_paths(testsdir, type))
2411 message('@0@ is a manual test'.format(name))
2412 elif type == 'unsafe' and want_tests != 'unsafe'
2413 message('@0@ is an unsafe test'.format(name))
2420 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2424 test_libsystemd_sym = executable(
2425 'test-libsystemd-sym',
2426 test_libsystemd_sym_c,
2427 include_directories : includes,
2428 link_with : [libsystemd],
2429 install : install_tests,
2430 install_dir : testsdir)
2431 test('test-libsystemd-sym',
2432 test_libsystemd_sym)
2434 test_libudev_sym = executable(
2437 include_directories : includes,
2438 c_args : ['-Wno-deprecated-declarations'],
2439 link_with : [libudev],
2440 install : install_tests,
2441 install_dir : testsdir)
2442 test('test-libudev-sym',
2445 ############################################################
2447 make_directive_index_py = find_program('tools/make-directive-index.py')
2448 make_man_index_py = find_program('tools/make-man-index.py')
2449 xml_helper_py = find_program('tools/xml_helper.py')
2450 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2454 subdir('sysusers.d')
2455 subdir('tmpfiles.d')
2460 subdir('shell-completion/bash')
2461 subdir('shell-completion/zsh')
2462 subdir('docs/sysvinit')
2463 subdir('docs/var-log')
2465 # FIXME: figure out if the warning is true:
2466 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2467 install_subdir('factory/etc',
2468 install_dir : factorydir)
2471 install_data('xorg/50-systemd-user.sh',
2472 install_dir : xinitrcdir)
2473 install_data('modprobe.d/systemd.conf',
2474 install_dir : modprobedir)
2475 install_data('README',
2482 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2483 install_dir : docdir)
2485 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2486 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2488 ############################################################
2490 meson_check_help = find_program('tools/meson-check-help.sh')
2492 foreach exec : public_programs
2493 name = exec.full_path().split('/')[-1]
2494 test('check-help-' + name,
2496 args : [exec.full_path()])
2499 ############################################################
2502 all_files = run_command(
2504 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2507 all_files = files(all_files.stdout().split())
2512 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2516 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2520 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2523 command : [meson_git_contrib_sh])
2527 git_head = run_command(
2529 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2530 'rev-parse', 'HEAD']).stdout().strip()
2531 git_head_short = run_command(
2533 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2534 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2538 command : ['git', 'archive',
2539 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2541 '--prefix', 'systemd-@0@/'.format(git_head),
2545 ############################################################
2548 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2550 'prefix directory: @0@'.format(prefixdir),
2551 'rootprefix directory: @0@'.format(rootprefixdir),
2552 'sysconf directory: @0@'.format(sysconfdir),
2553 'include directory: @0@'.format(includedir),
2554 'lib directory: @0@'.format(libdir),
2555 'rootlib directory: @0@'.format(rootlibdir),
2556 'SysV init scripts: @0@'.format(sysvinit_path),
2557 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2558 'PAM modules directory: @0@'.format(pamlibdir),
2559 'PAM configuration directory: @0@'.format(pamconfdir),
2560 'RPM macros directory: @0@'.format(rpmmacrosdir),
2561 'modprobe.d directory: @0@'.format(modprobedir),
2562 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2563 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2564 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2565 'bash completions directory: @0@'.format(bashcompletiondir),
2566 'zsh completions directory: @0@'.format(zshcompletiondir),
2567 'extra start script: @0@'.format(get_option('rc-local')),
2568 'extra stop script: @0@'.format(get_option('halt-local')),
2569 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2570 get_option('debug-tty')),
2571 'TTY GID: @0@'.format(tty_gid),
2572 'users GID: @0@'.format(users_gid),
2573 'maximum system UID: @0@'.format(system_uid_max),
2574 'maximum system GID: @0@'.format(system_gid_max),
2575 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2576 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2577 'minimum container UID base: @0@'.format(container_uid_base_min),
2578 'maximum container UID base: @0@'.format(container_uid_base_max),
2579 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2580 'render group access mode: @0@'.format(get_option('group-render-mode')),
2581 'certificate root directory: @0@'.format(get_option('certificate-root')),
2582 'support URL: @0@'.format(support_url),
2583 'nobody user name: @0@'.format(nobody_user),
2584 'nobody group name: @0@'.format(nobody_group),
2585 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2586 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2588 'default DNSSEC mode: @0@'.format(default_dnssec),
2589 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2590 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2592 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2593 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2595 'default DNS servers: @0@'.format(alt_dns_servers),
2596 'default NTP servers: @0@'.format(alt_ntp_servers)]
2598 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2599 '@@0@'.format(time_epoch)).stdout().strip()
2601 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2604 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2605 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2606 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2608 if conf.get('ENABLE_EFI') == 1
2610 'efi arch: @0@'.format(efi_arch)]
2614 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2615 'EFI CC @0@'.format(efi_cc),
2616 'EFI lib directory: @0@'.format(efi_libdir),
2617 'EFI lds directory: @0@'.format(efi_ldsdir),
2618 'EFI include directory: @0@'.format(efi_incdir)]
2671 ['legacy pkla', install_polkit_pkla],
2673 ['gnu-efi', have_gnu_efi],
2679 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2682 ['man pages', want_man],
2683 ['html pages', want_html],
2684 ['man page indices', want_man and have_lxml],
2685 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2690 ['adm group', get_option('adm-group')],
2691 ['wheel group', get_option('wheel-group')],
2694 ['debug mmap cache'],
2697 cond = tuple.get(1, '')
2699 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2700 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2701 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2706 missing += [tuple[0]]
2712 'enabled features: @0@'.format(', '.join(found)),
2714 'disabled features: @0@'.format(', '.join(missing)),
2716 message('\n '.join(status))
2718 if rootprefixdir != rootprefix_default
2719 message('WARNING:\n' +
2720 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2721 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2722 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))