1 project('systemd', 'c',
10 meson_version : '>= 0.40',
13 libsystemd_version = '0.19.1'
14 libudev_version = '1.6.7'
16 # We need the same data in three different formats, ugh!
17 # Also, for hysterical reasons, we use different variable
18 # names, sometimes. Not all variables are included in every
20 conf = configuration_data()
21 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
22 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
24 substs = configuration_data()
25 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
26 substs.set('PACKAGE_VERSION', meson.project_version())
30 #####################################################################
32 # Try to install the git pre-commit hook
33 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
34 if git_hook.returncode() == 0
35 message(git_hook.stdout().strip())
38 #####################################################################
40 rootprefixdir = get_option('rootprefix')
41 conf.set10('HAVE_SPLIT_USR', get_option('split-usr'))
42 if get_option('split-usr')
43 rootprefixdir = rootprefixdir != '' ? rootprefixdir : '/'
45 rootprefixdir = rootprefixdir != '' ? rootprefixdir : '/usr'
48 sysvinit_path = get_option('sysvinit-path')
49 sysvrcnd_path = get_option('sysvrcnd-path')
50 have = sysvinit_path != '' or sysvrcnd_path != ''
51 conf.set10('HAVE_SYSV_COMPAT', have,
52 description : 'SysV init scripts and rcN.d links are supported')
53 m4_defines += have ? ['-DHAVE_SYSV_COMPAT'] : []
55 # join_paths ignore the preceding arguments if an absolute component is
56 # encountered, so this should canonicalize various paths when they are
57 # absolute or relative.
58 prefixdir = get_option('prefix')
59 if not prefixdir.startswith('/')
60 error('Prefix is not absolute: "@0@"'.format(prefixdir))
62 bindir = join_paths(prefixdir, get_option('bindir'))
63 libdir = join_paths(prefixdir, get_option('libdir'))
64 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
65 includedir = join_paths(prefixdir, get_option('includedir'))
66 datadir = join_paths(prefixdir, get_option('datadir'))
67 localstatedir = join_paths('/', get_option('localstatedir'))
69 rootbindir = join_paths(rootprefixdir, 'bin')
70 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
72 rootlibdir = get_option('rootlibdir')
74 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
77 # Dirs of external packages
78 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
79 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
80 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
81 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
82 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
83 varlogdir = join_paths(localstatedir, 'log')
84 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
85 rpmmacrosdir = get_option('rpmmacrosdir')
86 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
89 pkgdatadir = join_paths(datadir, 'systemd')
90 environmentdir = join_paths(prefixdir, 'lib/environment.d')
91 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
92 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
93 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
94 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
95 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
96 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
97 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
98 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
99 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
100 pkgincludedir = join_paths(includedir, 'systemd')
101 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
102 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
103 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
104 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
105 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
106 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
107 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
108 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
109 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
110 udevhomedir = udevlibexecdir
111 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
112 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
113 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
114 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
115 factorydir = join_paths(datadir, 'factory')
116 docdir = join_paths(datadir, 'doc/systemd')
117 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
118 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
119 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
120 catalogstatedir = join_paths(systemdstatedir, 'catalog')
121 randomseeddir = join_paths(localstatedir, 'lib/systemd')
123 dbuspolicydir = get_option('dbuspolicydir')
124 if dbuspolicydir == ''
125 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
128 dbussessionservicedir = get_option('dbussessionservicedir')
129 if dbussessionservicedir == ''
130 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
133 dbussystemservicedir = get_option('dbussystemservicedir')
134 if dbussystemservicedir == ''
135 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
138 pamlibdir = get_option('pamlibdir')
140 pamlibdir = join_paths(rootlibdir, 'security')
143 pamconfdir = get_option('pamconfdir')
145 pamconfdir = join_paths(sysconfdir, 'pam.d')
148 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
149 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
150 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
151 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
152 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
153 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
154 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
155 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
156 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
157 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
158 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
159 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
160 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
161 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
162 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
163 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
164 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
165 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
166 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
167 conf.set_quoted('ROOTPREFIX', rootprefixdir)
168 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
169 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
170 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
171 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
172 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
173 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
174 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
175 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
176 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
177 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
178 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
179 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
180 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
181 conf.set_quoted('LIBDIR', libdir)
182 conf.set_quoted('ROOTLIBDIR', rootlibdir)
183 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
184 conf.set_quoted('BOOTLIBDIR', bootlibdir)
185 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
186 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
187 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
188 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
189 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
190 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
192 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
193 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
195 substs.set('prefix', prefixdir)
196 substs.set('exec_prefix', prefixdir)
197 substs.set('libdir', libdir)
198 substs.set('rootlibdir', rootlibdir)
199 substs.set('includedir', includedir)
200 substs.set('pkgsysconfdir', pkgsysconfdir)
201 substs.set('bindir', bindir)
202 substs.set('rootbindir', rootbindir)
203 substs.set('rootlibexecdir', rootlibexecdir)
204 substs.set('systemunitdir', systemunitdir)
205 substs.set('userunitdir', userunitdir)
206 substs.set('systempresetdir', systempresetdir)
207 substs.set('userpresetdir', userpresetdir)
208 substs.set('udevhwdbdir', udevhwdbdir)
209 substs.set('udevrulesdir', udevrulesdir)
210 substs.set('udevlibexecdir', udevlibexecdir)
211 substs.set('catalogdir', catalogdir)
212 substs.set('tmpfilesdir', tmpfilesdir)
213 substs.set('sysusersdir', sysusersdir)
214 substs.set('sysctldir', sysctldir)
215 substs.set('binfmtdir', binfmtdir)
216 substs.set('modulesloaddir', modulesloaddir)
217 substs.set('systemgeneratordir', systemgeneratordir)
218 substs.set('usergeneratordir', usergeneratordir)
219 substs.set('systemenvgeneratordir', systemenvgeneratordir)
220 substs.set('userenvgeneratordir', userenvgeneratordir)
221 substs.set('systemshutdowndir', systemshutdowndir)
222 substs.set('systemsleepdir', systemsleepdir)
223 substs.set('VARLOGDIR', varlogdir)
224 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
225 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
226 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
227 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
228 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
229 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
230 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
232 #####################################################################
234 cc = meson.get_compiler('c')
235 pkgconfig = import('pkgconfig')
236 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
238 cxx = find_program('c++', required : false)
240 # Used only for tests
244 foreach arg : ['-Wextra',
247 '-Wmissing-include-dirs',
248 '-Wold-style-definition',
251 '-Wdeclaration-after-statement',
253 '-Wsuggest-attribute=noreturn',
254 '-Werror=missing-prototypes',
255 '-Werror=implicit-function-declaration',
256 '-Werror=missing-declarations',
257 '-Werror=return-type',
258 '-Werror=incompatible-pointer-types',
260 '-Wstrict-prototypes',
262 '-Wmissing-noreturn',
265 '-Wstrict-aliasing=2',
272 '-fdiagnostics-show-option',
273 '-fno-strict-aliasing',
274 '-fvisibility=hidden',
276 '-fstack-protector-strong',
278 '--param=ssp-buffer-size=4',
280 if cc.has_argument(arg)
281 add_project_arguments(arg, language : 'c')
285 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
286 # arguments, just emits a warnings. So test for the "positive" version instead.
287 foreach arg : ['unused-parameter',
288 'missing-field-initializers',
291 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
293 if cc.has_argument('-W' + arg)
294 add_project_arguments('-Wno-' + arg, language : 'c')
300 #include <inttypes.h>
301 typedef uint64_t usec_t;
302 usec_t now(clockid_t clock);
307 ', name : '-Werror=shadow with local shadowing')
308 add_project_arguments('-Werror=shadow', language : 'c')
311 if cc.get_id() == 'clang'
312 foreach arg : ['-Wno-typedef-redefinition',
313 '-Wno-gnu-variable-sized-type-not-at-end',
315 if cc.has_argument(arg,
316 name : '@0@ is supported'.format(arg))
317 add_project_arguments(arg, language : 'c')
322 link_test_c = files('tools/meson-link-test.c')
324 # --as-needed and --no-undefined are provided by meson by default,
325 # run mesonconf to see what is enabled
326 foreach arg : ['-Wl,-z,relro',
331 have = run_command(check_compilation_sh,
332 cc.cmd_array(), '-x', 'c', arg,
333 '-include', link_test_c).returncode() == 0
334 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
336 add_project_link_arguments(arg, language : 'c')
340 if get_option('buildtype') != 'debug'
341 foreach arg : ['-ffunction-sections',
343 if cc.has_argument(arg,
344 name : '@0@ is supported'.format(arg))
345 add_project_arguments(arg, language : 'c')
349 foreach arg : ['-Wl,--gc-sections']
350 have = run_command(check_compilation_sh,
351 cc.cmd_array(), '-x', 'c', arg,
352 '-include', link_test_c).returncode() == 0
353 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
355 add_project_link_arguments(arg, language : 'c')
360 cpp = ' '.join(cc.cmd_array()) + ' -E'
362 #####################################################################
363 # compilation result tests
365 conf.set('_GNU_SOURCE', true)
366 conf.set('__SANE_USERSPACE_TYPES__', true)
368 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
369 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
370 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
371 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
372 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
373 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
374 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
378 #include <linux/ethtool.h>
379 #include <linux/fib_rules.h>
381 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
383 foreach decl : ['char16_t',
386 'struct ethtool_link_settings',
387 'struct fib_rule_uid_range',
390 # We get -1 if the size cannot be determined
391 have = cc.sizeof(decl, prefix : decl_headers) > 0
392 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
395 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
396 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
397 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
398 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
399 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
400 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
401 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
402 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
403 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
404 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
405 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
406 # if_tunnel.h is buggy and cannot be included on its own
407 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
408 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
409 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
410 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
411 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
412 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
413 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
414 ['NDA_IFINDEX', 'linux/neighbour.h'],
415 ['IFA_FLAGS', 'linux/if_addr.h'],
416 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
417 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
419 prefix = decl.length() > 2 ? decl[2] : ''
420 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
421 conf.set10('HAVE_' + decl[0], have)
424 foreach ident : ['secure_getenv', '__secure_getenv']
425 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
429 ['memfd_create', '''#include <sys/memfd.h>'''],
430 ['gettid', '''#include <sys/types.h>'''],
431 ['pivot_root', '''#include <stdlib.h>'''], # no known header declares pivot_root
432 ['name_to_handle_at', '''#define _GNU_SOURCE
433 #include <sys/types.h>
434 #include <sys/stat.h>
435 #include <fcntl.h>'''],
436 ['setns', '''#define _GNU_SOURCE
437 #include <sched.h>'''],
438 ['renameat2', '''#include <stdio.h>'''],
439 ['kcmp', '''#include <linux/kcmp.h>'''],
440 ['keyctl', '''#include <sys/types.h>
441 #include <keyutils.h>'''],
442 ['copy_file_range', '''#include <sys/syscall.h>
443 #include <unistd.h>'''],
444 ['bpf', '''#include <sys/syscall.h>
445 #include <unistd.h>'''],
446 ['explicit_bzero' , '''#include <string.h>'''],
449 have = cc.has_function(ident[0], prefix : ident[1])
450 conf.set10('HAVE_' + ident[0].to_upper(), have)
453 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''')
454 conf.set10('USE_SYS_RANDOM_H', true)
455 conf.set10('HAVE_GETRANDOM', true)
457 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
458 conf.set10('USE_SYS_RANDOM_H', false)
459 conf.set10('HAVE_GETRANDOM', have)
462 #####################################################################
464 sed = find_program('sed')
465 awk = find_program('awk')
466 m4 = find_program('m4')
467 stat = find_program('stat')
468 git = find_program('git', required : false)
470 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
471 mkdir_p = 'mkdir -p $DESTDIR/@0@'
472 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
473 splash_bmp = files('test/splash.bmp')
475 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
476 # /usr/sbin, /sbin, and fall back to the default from middle column.
477 progs = [['telinit', '/lib/sysvinit/telinit'],
478 ['quotaon', '/usr/sbin/quotaon' ],
479 ['quotacheck', '/usr/sbin/quotacheck' ],
480 ['kill', '/usr/bin/kill' ],
481 ['kmod', '/usr/bin/kmod' ],
482 ['kexec', '/usr/sbin/kexec' ],
483 ['sulogin', '/usr/sbin/sulogin' ],
484 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
485 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
486 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
487 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
490 path = get_option(prog[0] + '-path')
492 message('Using @1@ for @0@'.format(prog[0], path))
494 exe = find_program(prog[0],
495 '/usr/sbin/' + prog[0],
498 path = exe.found() ? exe.path() : prog[1]
500 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
501 conf.set_quoted(name, path)
502 substs.set(name, path)
505 if run_command('ln', '--relative', '--help').returncode() != 0
506 error('ln does not support --relative')
509 ############################################################
511 gperf = find_program('gperf')
513 gperf_test_format = '''
515 const char * in_word_set(const char *, @0@);
518 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
519 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
520 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
521 if cc.compiles(gperf_test)
522 gperf_len_type = 'size_t'
524 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
525 if cc.compiles(gperf_test)
526 gperf_len_type = 'unsigned'
528 error('unable to determine gperf len type')
531 message('gperf len type is @0@'.format(gperf_len_type))
532 conf.set('GPERF_LEN_TYPE', gperf_len_type,
533 description : 'The type of gperf "len" parameter')
535 ############################################################
537 if not cc.has_header('sys/capability.h')
538 error('POSIX caps headers not found')
540 foreach header : ['linux/btrfs.h',
542 'linux/vm_sockets.h',
544 'valgrind/memcheck.h',
545 'valgrind/valgrind.h',
548 conf.set10('HAVE_' + header.underscorify().to_upper(),
549 cc.has_header(header))
552 ############################################################
554 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
555 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
556 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
558 default_hierarchy = get_option('default-hierarchy')
559 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
560 description : 'default cgroup hierarchy as string')
561 if default_hierarchy == 'legacy'
562 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
563 elif default_hierarchy == 'hybrid'
564 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
566 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
569 time_epoch = get_option('time-epoch')
572 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
574 time_epoch = time_epoch.to_int()
575 conf.set('TIME_EPOCH', time_epoch)
577 system_uid_max = get_option('system-uid-max')
578 if system_uid_max == ''
579 system_uid_max = run_command(
581 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
582 '/etc/login.defs').stdout()
584 system_uid_max = system_uid_max.to_int()
585 conf.set('SYSTEM_UID_MAX', system_uid_max)
586 substs.set('systemuidmax', system_uid_max)
587 message('maximum system UID is @0@'.format(system_uid_max))
589 conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
590 conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
592 system_gid_max = get_option('system-gid-max')
593 if system_gid_max == ''
594 system_gid_max = run_command(
596 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
597 '/etc/login.defs').stdout()
599 system_gid_max = system_gid_max.to_int()
600 conf.set('SYSTEM_GID_MAX', system_gid_max)
601 substs.set('systemgidmax', system_gid_max)
602 message('maximum system GID is @0@'.format(system_gid_max))
604 tty_gid = get_option('tty-gid')
605 conf.set('TTY_GID', tty_gid)
606 substs.set('TTY_GID', tty_gid)
608 if get_option('adm-group')
609 m4_defines += ['-DENABLE_ADM_GROUP']
612 if get_option('wheel-group')
613 m4_defines += ['-DENABLE_WHEEL_GROUP']
616 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
618 kill_user_processes = get_option('default-kill-user-processes')
619 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
620 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
622 dns_servers = get_option('dns-servers')
623 conf.set_quoted('DNS_SERVERS', dns_servers)
624 substs.set('DNS_SERVERS', dns_servers)
626 ntp_servers = get_option('ntp-servers')
627 conf.set_quoted('NTP_SERVERS', ntp_servers)
628 substs.set('NTP_SERVERS', ntp_servers)
630 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
632 substs.set('SUSHELL', get_option('debug-shell'))
633 substs.set('DEBUGTTY', get_option('debug-tty'))
635 debug = get_option('debug')
636 enable_debug_hashmap = false
637 enable_debug_mmap_cache = false
639 foreach name : debug.split(',')
641 enable_debug_hashmap = true
642 elif name == 'mmap-cache'
643 enable_debug_mmap_cache = true
645 message('unknown debug option "@0@", ignoring'.format(name))
649 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
650 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
652 #####################################################################
654 threads = dependency('threads')
655 librt = cc.find_library('rt')
656 libm = cc.find_library('m')
657 libdl = cc.find_library('dl')
658 libcrypt = cc.find_library('crypt')
660 libcap = dependency('libcap', required : false)
661 if not libcap.found()
662 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
663 libcap = cc.find_library('cap')
666 libmount = dependency('mount',
669 want_seccomp = get_option('seccomp')
670 if want_seccomp != 'false'
671 libseccomp = dependency('libseccomp',
672 version : '>= 2.3.1',
673 required : want_seccomp == 'true')
674 have = libseccomp.found()
679 conf.set10('HAVE_SECCOMP', have)
680 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
682 want_selinux = get_option('selinux')
683 if want_selinux != 'false'
684 libselinux = dependency('libselinux',
685 version : '>= 2.1.9',
686 required : want_selinux == 'true')
687 have = libselinux.found()
692 conf.set10('HAVE_SELINUX', have)
693 m4_defines += have ? ['-DHAVE_SELINUX'] : []
695 want_apparmor = get_option('apparmor')
696 if want_apparmor != 'false'
697 libapparmor = dependency('libapparmor',
698 required : want_apparmor == 'true')
699 have = libapparmor.found()
704 conf.set10('HAVE_APPARMOR', have)
705 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
707 smack_run_label = get_option('smack-run-label')
708 if smack_run_label != ''
709 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
710 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
713 want_polkit = get_option('polkit')
714 install_polkit = false
715 install_polkit_pkla = false
716 if want_polkit != 'false'
717 install_polkit = true
719 libpolkit = dependency('polkit-gobject-1',
721 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
722 message('Old polkit detected, will install pkla files')
723 install_polkit_pkla = true
726 conf.set10('ENABLE_POLKIT', install_polkit)
728 want_acl = get_option('acl')
729 if want_acl != 'false'
730 libacl = cc.find_library('acl', required : want_acl == 'true')
731 have = libacl.found()
736 conf.set10('HAVE_ACL', have)
737 m4_defines += have ? ['-DHAVE_ACL'] : []
739 want_audit = get_option('audit')
740 if want_audit != 'false'
741 libaudit = dependency('audit', required : want_audit == 'true')
742 have = libaudit.found()
747 conf.set10('HAVE_AUDIT', have)
749 want_blkid = get_option('blkid')
750 if want_blkid != 'false'
751 libblkid = dependency('blkid', required : want_blkid == 'true')
752 have = libblkid.found()
757 conf.set10('HAVE_BLKID', have)
759 want_kmod = get_option('kmod')
760 if want_kmod != 'false'
761 libkmod = dependency('libkmod',
763 required : want_kmod == 'true')
764 have = libkmod.found()
769 conf.set10('HAVE_KMOD', have)
771 want_pam = get_option('pam')
772 if want_pam != 'false'
773 libpam = cc.find_library('pam', required : want_pam == 'true')
774 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
775 have = libpam.found() and libpam_misc.found()
781 conf.set10('HAVE_PAM', have)
782 m4_defines += have ? ['-DHAVE_PAM'] : []
784 want_microhttpd = get_option('microhttpd')
785 if want_microhttpd != 'false'
786 libmicrohttpd = dependency('libmicrohttpd',
787 version : '>= 0.9.33',
788 required : want_microhttpd == 'true')
789 have = libmicrohttpd.found()
794 conf.set10('HAVE_MICROHTTPD', have)
795 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
797 want_libcryptsetup = get_option('libcryptsetup')
798 if want_libcryptsetup != 'false'
799 libcryptsetup = dependency('libcryptsetup',
800 version : '>= 1.6.0',
801 required : want_libcryptsetup == 'true')
802 have = libcryptsetup.found()
807 conf.set10('HAVE_LIBCRYPTSETUP', have)
809 want_libcurl = get_option('libcurl')
810 if want_libcurl != 'false'
811 libcurl = dependency('libcurl',
812 version : '>= 7.32.0',
813 required : want_libcurl == 'true')
814 have = libcurl.found()
819 conf.set10('HAVE_LIBCURL', have)
820 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
822 want_libidn = get_option('libidn')
823 want_libidn2 = get_option('libidn2')
824 if want_libidn == 'true' and want_libidn2 == 'true'
825 error('libidn and libidn2 cannot be requested simultaneously')
828 if want_libidn != 'false' and want_libidn2 != 'true'
829 libidn = dependency('libidn',
830 required : want_libidn == 'true')
831 have = libidn.found()
836 conf.set10('HAVE_LIBIDN', have)
837 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
838 if not have and want_libidn2 != 'false'
839 # libidn is used for both libidn and libidn2 objects
840 libidn = dependency('libidn2',
841 required : want_libidn2 == 'true')
842 have = libidn.found()
846 conf.set10('HAVE_LIBIDN2', have)
847 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
849 want_libiptc = get_option('libiptc')
850 if want_libiptc != 'false'
851 libiptc = dependency('libiptc',
852 required : want_libiptc == 'true')
853 have = libiptc.found()
858 conf.set10('HAVE_LIBIPTC', have)
859 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
861 want_qrencode = get_option('qrencode')
862 if want_qrencode != 'false'
863 libqrencode = dependency('libqrencode',
864 required : want_qrencode == 'true')
865 have = libqrencode.found()
870 conf.set10('HAVE_QRENCODE', have)
872 want_gcrypt = get_option('gcrypt')
873 if want_gcrypt != 'false'
874 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
875 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
876 have = libgcrypt.found() and libgpg_error.found()
881 # link to neither of the libs if one is not found
885 conf.set10('HAVE_GCRYPT', have)
887 want_gnutls = get_option('gnutls')
888 if want_gnutls != 'false'
889 libgnutls = dependency('gnutls',
890 version : '>= 3.1.4',
891 required : want_gnutls == 'true')
892 have = libgnutls.found()
897 conf.set10('HAVE_GNUTLS', have)
899 want_elfutils = get_option('elfutils')
900 if want_elfutils != 'false'
901 libdw = dependency('libdw',
902 required : want_elfutils == 'true')
908 conf.set10('HAVE_ELFUTILS', have)
910 want_zlib = get_option('zlib')
911 if want_zlib != 'false'
912 libz = dependency('zlib',
913 required : want_zlib == 'true')
919 conf.set10('HAVE_ZLIB', have)
921 want_bzip2 = get_option('bzip2')
922 if want_bzip2 != 'false'
923 libbzip2 = cc.find_library('bz2',
924 required : want_bzip2 == 'true')
925 have = libbzip2.found()
930 conf.set10('HAVE_BZIP2', have)
932 want_xz = get_option('xz')
933 if want_xz != 'false'
934 libxz = dependency('liblzma',
935 required : want_xz == 'true')
941 conf.set10('HAVE_XZ', have)
943 want_lz4 = get_option('lz4')
944 if want_lz4 != 'false'
945 liblz4 = dependency('liblz4',
946 required : want_lz4 == 'true')
947 have = liblz4.found()
952 conf.set10('HAVE_LZ4', have)
954 want_xkbcommon = get_option('xkbcommon')
955 if want_xkbcommon != 'false'
956 libxkbcommon = dependency('xkbcommon',
957 version : '>= 0.3.0',
958 required : want_xkbcommon == 'true')
959 have = libxkbcommon.found()
964 conf.set10('HAVE_XKBCOMMON', have)
966 want_glib = get_option('glib')
967 if want_glib != 'false'
968 libglib = dependency('glib-2.0',
969 version : '>= 2.22.0',
970 required : want_glib == 'true')
971 libgobject = dependency('gobject-2.0',
972 version : '>= 2.22.0',
973 required : want_glib == 'true')
974 libgio = dependency('gio-2.0',
975 required : want_glib == 'true')
976 have = libglib.found() and libgobject.found() and libgio.found()
983 conf.set10('HAVE_GLIB', have)
985 want_dbus = get_option('dbus')
986 if want_dbus != 'false'
987 libdbus = dependency('dbus-1',
988 version : '>= 1.3.2',
989 required : want_dbus == 'true')
990 have = libdbus.found()
995 conf.set10('HAVE_DBUS', have)
997 default_dnssec = get_option('default-dnssec')
998 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
999 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1000 default_dnssec = 'no'
1002 conf.set('DEFAULT_DNSSEC_MODE',
1003 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1004 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1006 want_importd = get_option('importd')
1007 if want_importd != 'false'
1008 have = (conf.get('HAVE_LIBCURL') == 1 and
1009 conf.get('HAVE_ZLIB') == 1 and
1010 conf.get('HAVE_BZIP2') == 1 and
1011 conf.get('HAVE_XZ') == 1 and
1012 conf.get('HAVE_GCRYPT') == 1)
1013 if want_importd == 'true' and not have
1014 error('importd support was requested, but dependencies are not available')
1019 conf.set10('ENABLE_IMPORTD', have)
1021 want_remote = get_option('remote')
1022 if want_remote != 'false'
1023 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1024 conf.get('HAVE_LIBCURL') == 1]
1025 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1026 # it's possible to build one without the other. Complain only if
1027 # support was explictly requested. The auxiliary files like sysusers
1028 # config should be installed when any of the programs are built.
1029 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1030 error('remote support was requested, but dependencies are not available')
1032 have = have_deps[0] or have_deps[1]
1036 conf.set10('ENABLE_REMOTE', have)
1038 foreach term : ['utmp',
1069 have = get_option(term)
1070 name = 'ENABLE_' + term.underscorify().to_upper()
1071 conf.set10(name, have)
1072 m4_defines += have ? ['-D' + name] : []
1075 want_tests = get_option('tests')
1076 install_tests = get_option('install-tests')
1079 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1081 #####################################################################
1083 if get_option('efi')
1084 efi_arch = host_machine.cpu_family()
1086 if efi_arch == 'x86'
1087 EFI_MACHINE_TYPE_NAME = 'ia32'
1088 gnu_efi_arch = 'ia32'
1089 elif efi_arch == 'x86_64'
1090 EFI_MACHINE_TYPE_NAME = 'x64'
1091 gnu_efi_arch = 'x86_64'
1092 elif efi_arch == 'arm'
1093 EFI_MACHINE_TYPE_NAME = 'arm'
1094 gnu_efi_arch = 'arm'
1095 elif efi_arch == 'aarch64'
1096 EFI_MACHINE_TYPE_NAME = 'aa64'
1097 gnu_efi_arch = 'aarch64'
1099 EFI_MACHINE_TYPE_NAME = ''
1104 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1106 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1110 conf.set10('ENABLE_EFI', have)
1112 #####################################################################
1114 config_h = configure_file(
1115 output : 'config.h',
1116 configuration : conf)
1118 includes = include_directories('src/basic',
1128 'src/libsystemd/sd-bus',
1129 'src/libsystemd/sd-device',
1130 'src/libsystemd/sd-hwdb',
1131 'src/libsystemd/sd-id128',
1132 'src/libsystemd/sd-netlink',
1133 'src/libsystemd/sd-network',
1134 'src/libsystemd-network',
1138 add_project_arguments('-include', 'config.h', language : 'c')
1140 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1141 'src/shared/gcrypt-util.c')
1145 subdir('src/systemd')
1147 subdir('src/libsystemd')
1148 subdir('src/libsystemd-network')
1149 subdir('src/journal')
1152 libjournal_core = static_library(
1154 libjournal_core_sources,
1156 include_directories : includes,
1159 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1160 libsystemd = shared_library(
1162 libsystemd_internal_sources,
1163 journal_internal_sources,
1164 version : libsystemd_version,
1165 include_directories : includes,
1166 link_args : ['-shared',
1167 '-Wl,--version-script=' + libsystemd_sym_path],
1168 link_with : [libbasic],
1169 dependencies : [threads,
1174 link_depends : libsystemd_sym,
1176 install_dir : rootlibdir)
1178 ############################################################
1180 # binaries that have --help and are intended for use by humans,
1181 # usually, but not always, installed in /bin.
1182 public_programs = []
1184 subdir('src/libudev')
1185 subdir('src/shared')
1188 subdir('src/network')
1190 subdir('src/analyze')
1191 subdir('src/journal-remote')
1192 subdir('src/coredump')
1193 subdir('src/hostname')
1194 subdir('src/import')
1195 subdir('src/kernel-install')
1196 subdir('src/locale')
1197 subdir('src/machine')
1198 subdir('src/nspawn')
1199 subdir('src/resolve')
1200 subdir('src/timedate')
1201 subdir('src/timesync')
1202 subdir('src/vconsole')
1203 subdir('src/sulogin-shell')
1204 subdir('src/boot/efi')
1209 ############################################################
1211 # only static linking apart from libdl, to make sure that the
1212 # module is linked to all libraries that it uses.
1213 test_dlopen = executable(
1216 include_directories : includes,
1217 link_with : [libbasic],
1218 dependencies : [libdl])
1220 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1221 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1222 ['mymachines', 'ENABLE_MACHINED'],
1223 ['resolve', 'ENABLE_RESOLVE']]
1225 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1229 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1230 version_script_arg = join_paths(meson.current_source_dir(), sym)
1232 nss = shared_library(
1234 'src/nss-@0@/nss-@0@.c'.format(module),
1236 include_directories : includes,
1237 link_args : ['-shared',
1238 '-Wl,--version-script=' + version_script_arg,
1240 link_with : [libsystemd_internal,
1242 dependencies : [threads,
1246 install_dir : rootlibdir)
1248 # We cannot use shared_module because it does not support version suffix.
1249 # Unfortunately shared_library insists on creating the symlink…
1250 meson.add_install_script('sh', '-c',
1251 'rm $DESTDIR@0@/libnss_@1@.so'
1252 .format(rootlibdir, module))
1254 test('dlopen-nss_' + module,
1256 args : [nss.full_path()]) # path to dlopen must include a slash
1260 ############################################################
1262 executable('systemd',
1264 include_directories : includes,
1265 link_with : [libcore,
1267 dependencies : [threads,
1273 install_rpath : rootlibexecdir,
1275 install_dir : rootlibexecdir)
1277 exe = executable('systemd-analyze',
1278 systemd_analyze_sources,
1279 include_directories : includes,
1280 link_with : [libcore,
1282 dependencies : [threads,
1288 install_rpath : rootlibexecdir,
1290 public_programs += [exe]
1292 executable('systemd-journald',
1293 systemd_journald_sources,
1294 include_directories : includes,
1295 link_with : [libjournal_core,
1297 dependencies : [threads,
1301 install_rpath : rootlibexecdir,
1303 install_dir : rootlibexecdir)
1305 exe = executable('systemd-cat',
1306 systemd_cat_sources,
1307 include_directories : includes,
1308 link_with : [libjournal_core,
1310 dependencies : [threads],
1311 install_rpath : rootlibexecdir,
1313 public_programs += [exe]
1315 exe = executable('journalctl',
1317 include_directories : includes,
1318 link_with : [libshared],
1319 dependencies : [threads,
1323 install_rpath : rootlibexecdir,
1325 install_dir : rootbindir)
1326 public_programs += [exe]
1328 executable('systemd-getty-generator',
1329 'src/getty-generator/getty-generator.c',
1330 include_directories : includes,
1331 link_with : [libshared],
1332 install_rpath : rootlibexecdir,
1334 install_dir : systemgeneratordir)
1336 executable('systemd-debug-generator',
1337 'src/debug-generator/debug-generator.c',
1338 include_directories : includes,
1339 link_with : [libshared],
1340 install_rpath : rootlibexecdir,
1342 install_dir : systemgeneratordir)
1344 executable('systemd-fstab-generator',
1345 'src/fstab-generator/fstab-generator.c',
1346 'src/core/mount-setup.c',
1347 include_directories : includes,
1348 link_with : [libshared],
1349 install_rpath : rootlibexecdir,
1351 install_dir : systemgeneratordir)
1353 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1354 executable('30-systemd-environment-d-generator',
1355 'src/environment-d-generator/environment-d-generator.c',
1356 include_directories : includes,
1357 link_with : [libshared],
1358 install_rpath : rootlibexecdir,
1360 install_dir : userenvgeneratordir)
1362 meson.add_install_script(meson_make_symlink,
1363 join_paths(sysconfdir, 'environment'),
1364 join_paths(environmentdir, '99-environment.conf'))
1367 if conf.get('ENABLE_HIBERNATE') == 1
1368 executable('systemd-hibernate-resume-generator',
1369 'src/hibernate-resume/hibernate-resume-generator.c',
1370 include_directories : includes,
1371 link_with : [libshared],
1372 install_rpath : rootlibexecdir,
1374 install_dir : systemgeneratordir)
1376 executable('systemd-hibernate-resume',
1377 'src/hibernate-resume/hibernate-resume.c',
1378 include_directories : includes,
1379 link_with : [libshared],
1380 install_rpath : rootlibexecdir,
1382 install_dir : rootlibexecdir)
1385 if conf.get('HAVE_BLKID') == 1
1386 executable('systemd-gpt-auto-generator',
1387 'src/gpt-auto-generator/gpt-auto-generator.c',
1388 'src/basic/blkid-util.h',
1389 include_directories : includes,
1390 link_with : [libshared],
1391 dependencies : libblkid,
1392 install_rpath : rootlibexecdir,
1394 install_dir : systemgeneratordir)
1396 exe = executable('systemd-dissect',
1397 'src/dissect/dissect.c',
1398 include_directories : includes,
1399 link_with : [libshared],
1400 install_rpath : rootlibexecdir,
1402 install_dir : rootlibexecdir)
1403 public_programs += [exe]
1406 if conf.get('ENABLE_RESOLVE') == 1
1407 executable('systemd-resolved',
1408 systemd_resolved_sources,
1409 gcrypt_util_sources,
1410 include_directories : includes,
1411 link_with : [libshared],
1412 dependencies : [threads,
1417 install_rpath : rootlibexecdir,
1419 install_dir : rootlibexecdir)
1421 exe = executable('systemd-resolve',
1422 systemd_resolve_sources,
1423 gcrypt_util_sources,
1424 include_directories : includes,
1425 link_with : [libshared],
1426 dependencies : [threads,
1431 install_rpath : rootlibexecdir,
1433 public_programs += [exe]
1436 if conf.get('ENABLE_LOGIND') == 1
1437 executable('systemd-logind',
1438 systemd_logind_sources,
1439 include_directories : includes,
1440 link_with : [liblogind_core,
1442 dependencies : [threads,
1444 install_rpath : rootlibexecdir,
1446 install_dir : rootlibexecdir)
1448 exe = executable('loginctl',
1450 include_directories : includes,
1451 link_with : [libshared],
1452 dependencies : [threads,
1455 install_rpath : rootlibexecdir,
1457 install_dir : rootbindir)
1458 public_programs += [exe]
1460 exe = executable('systemd-inhibit',
1461 'src/login/inhibit.c',
1462 include_directories : includes,
1463 link_with : [libshared],
1464 install_rpath : rootlibexecdir,
1466 install_dir : rootbindir)
1467 public_programs += [exe]
1469 if conf.get('HAVE_PAM') == 1
1470 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1471 pam_systemd = shared_library(
1475 include_directories : includes,
1476 link_args : ['-shared',
1477 '-Wl,--version-script=' + version_script_arg],
1478 link_with : [libsystemd_internal,
1480 dependencies : [threads,
1483 link_depends : pam_systemd_sym,
1485 install_dir : pamlibdir)
1487 test('dlopen-pam_systemd',
1489 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1493 if conf.get('HAVE_PAM') == 1
1494 executable('systemd-user-sessions',
1495 'src/user-sessions/user-sessions.c',
1496 include_directories : includes,
1497 link_with : [libshared],
1498 install_rpath : rootlibexecdir,
1500 install_dir : rootlibexecdir)
1503 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1504 exe = executable('bootctl',
1505 'src/boot/bootctl.c',
1506 include_directories : includes,
1507 link_with : [libshared],
1508 dependencies : [libblkid],
1509 install_rpath : rootlibexecdir,
1511 public_programs += [exe]
1514 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1515 include_directories : includes,
1516 link_with : [libshared],
1517 dependencies : [threads],
1518 install_rpath : rootlibexecdir,
1520 public_programs += [exe]
1522 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1523 include_directories : includes,
1524 link_with : [libshared],
1525 dependencies : [threads,
1530 install_rpath : rootlibexecdir,
1532 install_dir : rootbindir)
1533 public_programs += [exe]
1535 if conf.get('ENABLE_BACKLIGHT') == 1
1536 executable('systemd-backlight',
1537 'src/backlight/backlight.c',
1538 include_directories : includes,
1539 link_with : [libshared],
1540 install_rpath : rootlibexecdir,
1542 install_dir : rootlibexecdir)
1545 if conf.get('ENABLE_RFKILL') == 1
1546 executable('systemd-rfkill',
1547 'src/rfkill/rfkill.c',
1548 include_directories : includes,
1549 link_with : [libshared],
1550 install_rpath : rootlibexecdir,
1552 install_dir : rootlibexecdir)
1555 executable('systemd-system-update-generator',
1556 'src/system-update-generator/system-update-generator.c',
1557 include_directories : includes,
1558 link_with : [libshared],
1559 install_rpath : rootlibexecdir,
1561 install_dir : systemgeneratordir)
1563 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1564 executable('systemd-cryptsetup',
1565 'src/cryptsetup/cryptsetup.c',
1566 include_directories : includes,
1567 link_with : [libshared],
1568 dependencies : [libcryptsetup],
1569 install_rpath : rootlibexecdir,
1571 install_dir : rootlibexecdir)
1573 executable('systemd-cryptsetup-generator',
1574 'src/cryptsetup/cryptsetup-generator.c',
1575 include_directories : includes,
1576 link_with : [libshared],
1577 dependencies : [libcryptsetup],
1578 install_rpath : rootlibexecdir,
1580 install_dir : systemgeneratordir)
1582 executable('systemd-veritysetup',
1583 'src/veritysetup/veritysetup.c',
1584 include_directories : includes,
1585 link_with : [libshared],
1586 dependencies : [libcryptsetup],
1587 install_rpath : rootlibexecdir,
1589 install_dir : rootlibexecdir)
1591 executable('systemd-veritysetup-generator',
1592 'src/veritysetup/veritysetup-generator.c',
1593 include_directories : includes,
1594 link_with : [libshared],
1595 dependencies : [libcryptsetup],
1596 install_rpath : rootlibexecdir,
1598 install_dir : systemgeneratordir)
1601 if conf.get('HAVE_SYSV_COMPAT') == 1
1602 executable('systemd-sysv-generator',
1603 'src/sysv-generator/sysv-generator.c',
1604 include_directories : includes,
1605 link_with : [libshared],
1606 install_rpath : rootlibexecdir,
1608 install_dir : systemgeneratordir)
1610 executable('systemd-rc-local-generator',
1611 'src/rc-local-generator/rc-local-generator.c',
1612 include_directories : includes,
1613 link_with : [libshared],
1614 install_rpath : rootlibexecdir,
1616 install_dir : systemgeneratordir)
1619 if conf.get('ENABLE_HOSTNAMED') == 1
1620 executable('systemd-hostnamed',
1621 'src/hostname/hostnamed.c',
1622 include_directories : includes,
1623 link_with : [libshared],
1624 install_rpath : rootlibexecdir,
1626 install_dir : rootlibexecdir)
1628 exe = executable('hostnamectl',
1629 'src/hostname/hostnamectl.c',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 install_rpath : rootlibexecdir,
1634 public_programs += [exe]
1637 if conf.get('ENABLE_LOCALED') == 1
1638 if conf.get('HAVE_XKBCOMMON') == 1
1639 # logind will load libxkbcommon.so dynamically on its own
1645 executable('systemd-localed',
1646 systemd_localed_sources,
1647 include_directories : includes,
1648 link_with : [libshared],
1649 dependencies : deps,
1650 install_rpath : rootlibexecdir,
1652 install_dir : rootlibexecdir)
1654 exe = executable('localectl',
1656 include_directories : includes,
1657 link_with : [libshared],
1658 install_rpath : rootlibexecdir,
1660 public_programs += [exe]
1663 if conf.get('ENABLE_TIMEDATED') == 1
1664 executable('systemd-timedated',
1665 'src/timedate/timedated.c',
1666 include_directories : includes,
1667 link_with : [libshared],
1668 install_rpath : rootlibexecdir,
1670 install_dir : rootlibexecdir)
1672 exe = executable('timedatectl',
1673 'src/timedate/timedatectl.c',
1674 include_directories : includes,
1675 install_rpath : rootlibexecdir,
1676 link_with : [libshared],
1678 public_programs += [exe]
1681 if conf.get('ENABLE_TIMESYNCD') == 1
1682 executable('systemd-timesyncd',
1683 systemd_timesyncd_sources,
1684 include_directories : includes,
1685 link_with : [libshared],
1686 dependencies : [threads,
1688 install_rpath : rootlibexecdir,
1690 install_dir : rootlibexecdir)
1693 if conf.get('ENABLE_MACHINED') == 1
1694 executable('systemd-machined',
1695 systemd_machined_sources,
1696 include_directories : includes,
1697 link_with : [libmachine_core,
1699 install_rpath : rootlibexecdir,
1701 install_dir : rootlibexecdir)
1703 exe = executable('machinectl',
1704 'src/machine/machinectl.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 dependencies : [threads,
1710 install_rpath : rootlibexecdir,
1712 install_dir : rootbindir)
1713 public_programs += [exe]
1716 if conf.get('ENABLE_IMPORTD') == 1
1717 executable('systemd-importd',
1718 systemd_importd_sources,
1719 include_directories : includes,
1720 link_with : [libshared],
1721 dependencies : [threads],
1722 install_rpath : rootlibexecdir,
1724 install_dir : rootlibexecdir)
1726 systemd_pull = executable('systemd-pull',
1727 systemd_pull_sources,
1728 include_directories : includes,
1729 link_with : [libshared],
1730 dependencies : [libcurl,
1735 install_rpath : rootlibexecdir,
1737 install_dir : rootlibexecdir)
1739 systemd_import = executable('systemd-import',
1740 systemd_import_sources,
1741 include_directories : includes,
1742 link_with : [libshared],
1743 dependencies : [libcurl,
1747 install_rpath : rootlibexecdir,
1749 install_dir : rootlibexecdir)
1751 systemd_export = executable('systemd-export',
1752 systemd_export_sources,
1753 include_directories : includes,
1754 link_with : [libshared],
1755 dependencies : [libcurl,
1759 install_rpath : rootlibexecdir,
1761 install_dir : rootlibexecdir)
1762 public_programs += [systemd_pull, systemd_import, systemd_export]
1765 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1766 exe = executable('systemd-journal-upload',
1767 systemd_journal_upload_sources,
1768 include_directories : includes,
1769 link_with : [libshared],
1770 dependencies : [threads,
1775 install_rpath : rootlibexecdir,
1777 install_dir : rootlibexecdir)
1778 public_programs += [exe]
1781 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1782 s_j_remote = executable('systemd-journal-remote',
1783 systemd_journal_remote_sources,
1784 include_directories : includes,
1785 link_with : [libshared],
1786 dependencies : [threads,
1791 install_rpath : rootlibexecdir,
1793 install_dir : rootlibexecdir)
1795 s_j_gatewayd = executable('systemd-journal-gatewayd',
1796 systemd_journal_gatewayd_sources,
1797 include_directories : includes,
1798 link_with : [libshared],
1799 dependencies : [threads,
1804 install_rpath : rootlibexecdir,
1806 install_dir : rootlibexecdir)
1807 public_programs += [s_j_remote, s_j_gatewayd]
1810 if conf.get('ENABLE_COREDUMP') == 1
1811 executable('systemd-coredump',
1812 systemd_coredump_sources,
1813 include_directories : includes,
1814 link_with : [libshared],
1815 dependencies : [threads,
1820 install_rpath : rootlibexecdir,
1822 install_dir : rootlibexecdir)
1824 exe = executable('coredumpctl',
1825 coredumpctl_sources,
1826 include_directories : includes,
1827 link_with : [libshared],
1828 dependencies : [threads,
1831 install_rpath : rootlibexecdir,
1833 public_programs += [exe]
1836 if conf.get('ENABLE_BINFMT') == 1
1837 exe = executable('systemd-binfmt',
1838 'src/binfmt/binfmt.c',
1839 include_directories : includes,
1840 link_with : [libshared],
1841 install_rpath : rootlibexecdir,
1843 install_dir : rootlibexecdir)
1844 public_programs += [exe]
1846 meson.add_install_script('sh', '-c',
1847 mkdir_p.format(binfmtdir))
1848 meson.add_install_script('sh', '-c',
1849 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1852 if conf.get('ENABLE_VCONSOLE') == 1
1853 executable('systemd-vconsole-setup',
1854 'src/vconsole/vconsole-setup.c',
1855 include_directories : includes,
1856 link_with : [libshared],
1857 install_rpath : rootlibexecdir,
1859 install_dir : rootlibexecdir)
1862 if conf.get('ENABLE_RANDOMSEED') == 1
1863 executable('systemd-random-seed',
1864 'src/random-seed/random-seed.c',
1865 include_directories : includes,
1866 link_with : [libshared],
1867 install_rpath : rootlibexecdir,
1869 install_dir : rootlibexecdir)
1872 if conf.get('ENABLE_FIRSTBOOT') == 1
1873 executable('systemd-firstboot',
1874 'src/firstboot/firstboot.c',
1875 include_directories : includes,
1876 link_with : [libshared],
1877 dependencies : [libcrypt],
1878 install_rpath : rootlibexecdir,
1880 install_dir : rootbindir)
1883 executable('systemd-remount-fs',
1884 'src/remount-fs/remount-fs.c',
1885 'src/core/mount-setup.c',
1886 'src/core/mount-setup.h',
1887 include_directories : includes,
1888 link_with : [libshared],
1889 install_rpath : rootlibexecdir,
1891 install_dir : rootlibexecdir)
1893 executable('systemd-machine-id-setup',
1894 'src/machine-id-setup/machine-id-setup-main.c',
1895 'src/core/machine-id-setup.c',
1896 'src/core/machine-id-setup.h',
1897 include_directories : includes,
1898 link_with : [libshared],
1899 install_rpath : rootlibexecdir,
1901 install_dir : rootbindir)
1903 executable('systemd-fsck',
1905 include_directories : includes,
1906 link_with : [libshared],
1907 install_rpath : rootlibexecdir,
1909 install_dir : rootlibexecdir)
1911 executable('systemd-sleep',
1912 'src/sleep/sleep.c',
1913 include_directories : includes,
1914 link_with : [libshared],
1915 install_rpath : rootlibexecdir,
1917 install_dir : rootlibexecdir)
1919 exe = executable('systemd-sysctl',
1920 'src/sysctl/sysctl.c',
1921 include_directories : includes,
1922 link_with : [libshared],
1923 install_rpath : rootlibexecdir,
1925 install_dir : rootlibexecdir)
1926 public_programs += [exe]
1928 executable('systemd-ac-power',
1929 'src/ac-power/ac-power.c',
1930 include_directories : includes,
1931 link_with : [libshared],
1932 install_rpath : rootlibexecdir,
1934 install_dir : rootlibexecdir)
1936 exe = executable('systemd-detect-virt',
1937 'src/detect-virt/detect-virt.c',
1938 include_directories : includes,
1939 link_with : [libshared],
1940 install_rpath : rootlibexecdir,
1942 public_programs += [exe]
1944 exe = executable('systemd-delta',
1945 'src/delta/delta.c',
1946 include_directories : includes,
1947 link_with : [libshared],
1948 install_rpath : rootlibexecdir,
1950 public_programs += [exe]
1952 exe = executable('systemd-escape',
1953 'src/escape/escape.c',
1954 include_directories : includes,
1955 link_with : [libshared],
1956 install_rpath : rootlibexecdir,
1958 install_dir : rootbindir)
1959 public_programs += [exe]
1961 exe = executable('systemd-notify',
1962 'src/notify/notify.c',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 install_rpath : rootlibexecdir,
1967 install_dir : rootbindir)
1968 public_programs += [exe]
1970 executable('systemd-volatile-root',
1971 'src/volatile-root/volatile-root.c',
1972 include_directories : includes,
1973 link_with : [libshared],
1974 install_rpath : rootlibexecdir,
1976 install_dir : rootlibexecdir)
1978 executable('systemd-cgroups-agent',
1979 'src/cgroups-agent/cgroups-agent.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 install_rpath : rootlibexecdir,
1984 install_dir : rootlibexecdir)
1986 exe = executable('systemd-path',
1988 include_directories : includes,
1989 link_with : [libshared],
1990 install_rpath : rootlibexecdir,
1992 public_programs += [exe]
1994 exe = executable('systemd-ask-password',
1995 'src/ask-password/ask-password.c',
1996 include_directories : includes,
1997 link_with : [libshared],
1998 install_rpath : rootlibexecdir,
2000 install_dir : rootbindir)
2001 public_programs += [exe]
2003 executable('systemd-reply-password',
2004 'src/reply-password/reply-password.c',
2005 include_directories : includes,
2006 link_with : [libshared],
2007 install_rpath : rootlibexecdir,
2009 install_dir : rootlibexecdir)
2011 exe = executable('systemd-tty-ask-password-agent',
2012 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2013 include_directories : includes,
2014 link_with : [libshared],
2015 install_rpath : rootlibexecdir,
2017 install_dir : rootbindir)
2018 public_programs += [exe]
2020 exe = executable('systemd-cgls',
2022 include_directories : includes,
2023 link_with : [libshared],
2024 install_rpath : rootlibexecdir,
2026 public_programs += [exe]
2028 exe = executable('systemd-cgtop',
2029 'src/cgtop/cgtop.c',
2030 include_directories : includes,
2031 link_with : [libshared],
2032 install_rpath : rootlibexecdir,
2034 public_programs += [exe]
2036 executable('systemd-initctl',
2037 'src/initctl/initctl.c',
2038 include_directories : includes,
2039 link_with : [libshared],
2040 install_rpath : rootlibexecdir,
2042 install_dir : rootlibexecdir)
2044 exe = executable('systemd-mount',
2045 'src/mount/mount-tool.c',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2050 public_programs += [exe]
2052 meson.add_install_script(meson_make_symlink,
2053 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2055 exe = executable('systemd-run',
2057 include_directories : includes,
2058 link_with : [libshared],
2059 install_rpath : rootlibexecdir,
2061 public_programs += [exe]
2063 exe = executable('systemd-stdio-bridge',
2064 'src/stdio-bridge/stdio-bridge.c',
2065 include_directories : includes,
2066 link_with : [libshared],
2067 install_rpath : rootlibexecdir,
2069 public_programs += [exe]
2071 exe = executable('busctl',
2072 'src/busctl/busctl.c',
2073 'src/busctl/busctl-introspect.c',
2074 'src/busctl/busctl-introspect.h',
2075 include_directories : includes,
2076 link_with : [libshared],
2077 install_rpath : rootlibexecdir,
2079 public_programs += [exe]
2081 if conf.get('ENABLE_SYSUSERS') == 1
2082 exe = executable('systemd-sysusers',
2083 'src/sysusers/sysusers.c',
2084 include_directories : includes,
2085 link_with : [libshared],
2086 install_rpath : rootlibexecdir,
2088 install_dir : rootbindir)
2089 public_programs += [exe]
2092 if conf.get('ENABLE_TMPFILES') == 1
2093 exe = executable('systemd-tmpfiles',
2094 'src/tmpfiles/tmpfiles.c',
2095 include_directories : includes,
2096 link_with : [libshared],
2097 dependencies : [libacl],
2098 install_rpath : rootlibexecdir,
2100 install_dir : rootbindir)
2101 public_programs += [exe]
2104 if conf.get('ENABLE_HWDB') == 1
2105 exe = executable('systemd-hwdb',
2107 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2108 include_directories : includes,
2109 link_with : [libudev_internal],
2110 install_rpath : udev_rpath,
2112 install_dir : rootbindir)
2113 public_programs += [exe]
2116 if conf.get('ENABLE_QUOTACHECK') == 1
2117 executable('systemd-quotacheck',
2118 'src/quotacheck/quotacheck.c',
2119 include_directories : includes,
2120 link_with : [libshared],
2121 install_rpath : rootlibexecdir,
2123 install_dir : rootlibexecdir)
2126 exe = executable('systemd-socket-proxyd',
2127 'src/socket-proxy/socket-proxyd.c',
2128 include_directories : includes,
2129 link_with : [libshared],
2130 dependencies : [threads],
2131 install_rpath : rootlibexecdir,
2133 install_dir : rootlibexecdir)
2134 public_programs += [exe]
2136 exe = executable('systemd-udevd',
2137 systemd_udevd_sources,
2138 include_directories : includes,
2139 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2140 link_with : [libudev_core,
2143 dependencies : [threads,
2148 install_rpath : udev_rpath,
2150 install_dir : rootlibexecdir)
2151 public_programs += [exe]
2153 exe = executable('udevadm',
2155 include_directories : includes,
2156 link_with : [libudev_core,
2159 dependencies : [threads,
2164 install_rpath : udev_rpath,
2166 install_dir : rootbindir)
2167 public_programs += [exe]
2169 executable('systemd-shutdown',
2170 systemd_shutdown_sources,
2171 include_directories : includes,
2172 link_with : [libshared],
2173 install_rpath : rootlibexecdir,
2175 install_dir : rootlibexecdir)
2177 executable('systemd-update-done',
2178 'src/update-done/update-done.c',
2179 include_directories : includes,
2180 link_with : [libshared],
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootlibexecdir)
2185 executable('systemd-update-utmp',
2186 'src/update-utmp/update-utmp.c',
2187 include_directories : includes,
2188 link_with : [libshared],
2189 dependencies : [libaudit],
2190 install_rpath : rootlibexecdir,
2192 install_dir : rootlibexecdir)
2194 if conf.get('HAVE_KMOD') == 1
2195 executable('systemd-modules-load',
2196 'src/modules-load/modules-load.c',
2197 include_directories : includes,
2198 link_with : [libshared],
2199 dependencies : [libkmod],
2200 install_rpath : rootlibexecdir,
2202 install_dir : rootlibexecdir)
2204 meson.add_install_script('sh', '-c',
2205 mkdir_p.format(modulesloaddir))
2206 meson.add_install_script('sh', '-c',
2207 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2210 exe = executable('systemd-nspawn',
2211 systemd_nspawn_sources,
2212 'src/core/mount-setup.c', # FIXME: use a variable?
2213 'src/core/mount-setup.h',
2214 'src/core/loopback-setup.c',
2215 'src/core/loopback-setup.h',
2216 include_directories : [includes, include_directories('src/nspawn')],
2217 link_with : [libshared],
2218 dependencies : [libacl,
2222 install_rpath : rootlibexecdir,
2224 public_programs += [exe]
2226 if conf.get('ENABLE_NETWORKD') == 1
2227 executable('systemd-networkd',
2228 systemd_networkd_sources,
2229 include_directories : includes,
2230 link_with : [libnetworkd_core,
2234 dependencies : [threads],
2235 install_rpath : rootlibexecdir,
2237 install_dir : rootlibexecdir)
2239 executable('systemd-networkd-wait-online',
2240 systemd_networkd_wait_online_sources,
2241 include_directories : includes,
2242 link_with : [libnetworkd_core,
2244 install_rpath : rootlibexecdir,
2246 install_dir : rootlibexecdir)
2248 exe = executable('networkctl',
2250 include_directories : includes,
2251 link_with : [libsystemd_network,
2253 install_rpath : rootlibexecdir,
2255 install_dir : rootbindir)
2256 public_programs += [exe]
2258 ############################################################
2260 foreach tuple : tests
2262 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2263 dependencies = tuple[2]
2264 condition = tuple.length() >= 4 ? tuple[3] : ''
2265 type = tuple.length() >= 5 ? tuple[4] : ''
2266 defs = tuple.length() >= 6 ? tuple[5] : []
2267 incs = tuple.length() >= 7 ? tuple[6] : includes
2270 name = sources[0].split('/')[-1].split('.')[0]
2271 if type.startswith('timeout=')
2272 timeout = type.split('=')[1].to_int()
2276 if condition == '' or conf.get(condition) == 1
2280 include_directories : incs,
2281 link_with : link_with,
2282 dependencies : dependencies,
2284 install_rpath : rootlibexecdir,
2285 install : install_tests,
2286 install_dir : join_paths(testsdir, type))
2289 message('@0@ is a manual test'.format(name))
2290 elif type == 'unsafe' and want_tests != 'unsafe'
2291 message('@0@ is an unsafe test'.format(name))
2298 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2302 test_libsystemd_sym = executable(
2303 'test-libsystemd-sym',
2304 test_libsystemd_sym_c,
2305 include_directories : includes,
2306 link_with : [libsystemd],
2307 install : install_tests,
2308 install_dir : testsdir)
2309 test('test-libsystemd-sym',
2310 test_libsystemd_sym)
2312 test_libudev_sym = executable(
2315 include_directories : includes,
2316 c_args : ['-Wno-deprecated-declarations'],
2317 link_with : [libudev],
2318 install : install_tests,
2319 install_dir : testsdir)
2320 test('test-libudev-sym',
2323 ############################################################
2325 make_directive_index_py = find_program('tools/make-directive-index.py')
2326 make_man_index_py = find_program('tools/make-man-index.py')
2327 xml_helper_py = find_program('tools/xml_helper.py')
2328 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2332 subdir('sysusers.d')
2333 subdir('tmpfiles.d')
2338 subdir('shell-completion/bash')
2339 subdir('shell-completion/zsh')
2340 subdir('docs/sysvinit')
2341 subdir('docs/var-log')
2343 # FIXME: figure out if the warning is true:
2344 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2345 install_subdir('factory/etc',
2346 install_dir : factorydir)
2349 install_data('xorg/50-systemd-user.sh',
2350 install_dir : xinitrcdir)
2351 install_data('system-preset/90-systemd.preset',
2352 install_dir : systempresetdir)
2353 install_data('modprobe.d/systemd.conf',
2354 install_dir : modprobedir)
2355 install_data('README',
2362 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2363 install_dir : docdir)
2365 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2366 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2368 ############################################################
2370 meson_check_help = find_program('tools/meson-check-help.sh')
2372 foreach exec : public_programs
2373 name = exec.full_path().split('/')[-1]
2374 test('check-help-' + name,
2376 args : [exec.full_path()])
2379 ############################################################
2382 all_files = run_command(
2384 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2387 all_files = files(all_files.stdout().split())
2392 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2396 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2400 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2403 command : [meson_git_contrib_sh])
2407 git_head = run_command(
2409 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2410 'rev-parse', 'HEAD']).stdout().strip()
2411 git_head_short = run_command(
2413 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2414 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2418 command : ['git', 'archive',
2419 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2421 '--prefix', 'systemd-@0@/'.format(git_head),
2425 ############################################################
2428 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2430 'prefix: @0@'.format(prefixdir),
2431 'rootprefix: @0@'.format(rootprefixdir),
2432 'sysconf dir: @0@'.format(sysconfdir),
2433 'includedir: @0@'.format(includedir),
2434 'lib dir: @0@'.format(libdir),
2435 'rootlib dir: @0@'.format(rootlibdir),
2436 'SysV init scripts: @0@'.format(sysvinit_path),
2437 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2438 'PAM modules dir: @0@'.format(pamlibdir),
2439 'PAM configuration dir: @0@'.format(pamconfdir),
2440 'RPM macros dir: @0@'.format(rpmmacrosdir),
2441 'modprobe.d dir: @0@'.format(modprobedir),
2442 'D-Bus policy dir: @0@'.format(dbuspolicydir),
2443 'D-Bus session dir: @0@'.format(dbussessionservicedir),
2444 'D-Bus system dir: @0@'.format(dbussystemservicedir),
2445 'bash completions dir: @0@'.format(bashcompletiondir),
2446 'zsh completions dir: @0@'.format(zshcompletiondir),
2447 'extra start script: @0@'.format(get_option('rc-local')),
2448 'extra stop script: @0@'.format(get_option('halt-local')),
2449 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2450 get_option('debug-tty')),
2451 'TTY GID: @0@'.format(tty_gid),
2452 'maximum system UID: @0@'.format(system_uid_max),
2453 'maximum system GID: @0@'.format(system_gid_max),
2454 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2455 'certificate root: @0@'.format(get_option('certificate-root')),
2456 'support URL: @0@'.format(support_url),
2457 'nobody user name: @0@'.format(get_option('nobody-user')),
2458 'nobody group name: @0@'.format(get_option('nobody-group')),
2459 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2460 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2462 'default DNSSEC mode: @0@'.format(default_dnssec),
2463 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2464 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2466 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2467 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2469 'default DNS servers: @0@'.format(alt_dns_servers),
2470 'default NTP servers: @0@'.format(alt_ntp_servers)]
2472 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2473 '@@0@'.format(time_epoch)).stdout().strip()
2475 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2478 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2479 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2480 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2482 if conf.get('ENABLE_EFI') == 1
2484 'efi arch: @0@'.format(efi_arch)]
2488 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2489 'EFI CC @0@'.format(efi_cc),
2490 'EFI libdir: @0@'.format(efi_libdir),
2491 'EFI ldsdir: @0@'.format(efi_ldsdir),
2492 'EFI includedir: @0@'.format(efi_incdir)]
2545 ['legacy pkla', install_polkit_pkla],
2547 ['gnu-efi', have_gnu_efi],
2553 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2556 ['man pages', want_man],
2557 ['html pages', want_html],
2558 ['man page indices', want_man and have_lxml],
2559 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2564 ['adm group', get_option('adm-group')],
2565 ['wheel group', get_option('wheel-group')],
2568 ['debug mmap cache'],
2571 cond = tuple.get(1, '')
2573 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2574 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2575 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2580 missing += [tuple[0]]
2586 'enabled features: @0@'.format(', '.join(found)),
2588 'disabled features: @0@'.format(', '.join(missing)),
2590 message('\n '.join(status))