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(prefixdir, '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 grep = find_program('grep')
466 awk = find_program('awk')
467 m4 = find_program('m4')
468 stat = find_program('stat')
469 git = find_program('git', required : false)
471 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
472 mkdir_p = 'mkdir -p $DESTDIR/@0@'
473 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
474 splash_bmp = files('test/splash.bmp')
476 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
477 # /usr/sbin, /sbin, and fall back to the default from middle column.
478 progs = [['telinit', '/lib/sysvinit/telinit'],
479 ['quotaon', '/usr/sbin/quotaon' ],
480 ['quotacheck', '/usr/sbin/quotacheck' ],
481 ['kill', '/usr/bin/kill' ],
482 ['kmod', '/usr/bin/kmod' ],
483 ['kexec', '/usr/sbin/kexec' ],
484 ['sulogin', '/usr/sbin/sulogin' ],
485 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
486 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
487 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
488 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
491 path = get_option(prog[0] + '-path')
493 message('Using @1@ for @0@'.format(prog[0], path))
495 exe = find_program(prog[0],
496 '/usr/sbin/' + prog[0],
499 path = exe.found() ? exe.path() : prog[1]
501 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
502 conf.set_quoted(name, path)
503 substs.set(name, path)
506 if run_command('ln', '--relative', '--help').returncode() != 0
507 error('ln does not support --relative')
510 ############################################################
512 gperf = find_program('gperf')
514 gperf_test_format = '''
516 const char * in_word_set(const char *, @0@);
519 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
520 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
521 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
522 if cc.compiles(gperf_test)
523 gperf_len_type = 'size_t'
525 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
526 if cc.compiles(gperf_test)
527 gperf_len_type = 'unsigned'
529 error('unable to determine gperf len type')
532 message('gperf len type is @0@'.format(gperf_len_type))
533 conf.set('GPERF_LEN_TYPE', gperf_len_type,
534 description : 'The type of gperf "len" parameter')
536 ############################################################
538 if not cc.has_header('sys/capability.h')
539 error('POSIX caps headers not found')
541 foreach header : ['linux/btrfs.h',
543 'linux/vm_sockets.h',
545 'valgrind/memcheck.h',
546 'valgrind/valgrind.h',
549 conf.set10('HAVE_' + header.underscorify().to_upper(),
550 cc.has_header(header))
553 ############################################################
555 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
556 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
557 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
559 default_hierarchy = get_option('default-hierarchy')
560 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
561 description : 'default cgroup hierarchy as string')
562 if default_hierarchy == 'legacy'
563 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
564 elif default_hierarchy == 'hybrid'
565 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
567 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
570 time_epoch = get_option('time-epoch')
573 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
575 time_epoch = time_epoch.to_int()
576 conf.set('TIME_EPOCH', time_epoch)
578 system_uid_max = get_option('system-uid-max')
579 if system_uid_max == ''
580 system_uid_max = run_command(
582 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
583 '/etc/login.defs').stdout()
585 system_uid_max = system_uid_max.to_int()
586 conf.set('SYSTEM_UID_MAX', system_uid_max)
587 substs.set('systemuidmax', system_uid_max)
588 message('maximum system UID is @0@'.format(system_uid_max))
590 conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
591 conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
593 system_gid_max = get_option('system-gid-max')
594 if system_gid_max == ''
595 system_gid_max = run_command(
597 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
598 '/etc/login.defs').stdout()
600 system_gid_max = system_gid_max.to_int()
601 conf.set('SYSTEM_GID_MAX', system_gid_max)
602 substs.set('systemgidmax', system_gid_max)
603 message('maximum system GID is @0@'.format(system_gid_max))
605 tty_gid = get_option('tty-gid')
606 conf.set('TTY_GID', tty_gid)
607 substs.set('TTY_GID', tty_gid)
609 if get_option('adm-group')
610 m4_defines += ['-DENABLE_ADM_GROUP']
613 if get_option('wheel-group')
614 m4_defines += ['-DENABLE_WHEEL_GROUP']
617 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
619 kill_user_processes = get_option('default-kill-user-processes')
620 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
621 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
623 dns_servers = get_option('dns-servers')
624 conf.set_quoted('DNS_SERVERS', dns_servers)
625 substs.set('DNS_SERVERS', dns_servers)
627 ntp_servers = get_option('ntp-servers')
628 conf.set_quoted('NTP_SERVERS', ntp_servers)
629 substs.set('NTP_SERVERS', ntp_servers)
631 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
633 substs.set('SUSHELL', get_option('debug-shell'))
634 substs.set('DEBUGTTY', get_option('debug-tty'))
636 debug = get_option('debug')
637 enable_debug_hashmap = false
638 enable_debug_mmap_cache = false
640 foreach name : debug.split(',')
642 enable_debug_hashmap = true
643 elif name == 'mmap-cache'
644 enable_debug_mmap_cache = true
646 message('unknown debug option "@0@", ignoring'.format(name))
650 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
651 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
653 #####################################################################
655 threads = dependency('threads')
656 librt = cc.find_library('rt')
657 libm = cc.find_library('m')
658 libdl = cc.find_library('dl')
659 libcrypt = cc.find_library('crypt')
661 libcap = dependency('libcap', required : false)
662 if not libcap.found()
663 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
664 libcap = cc.find_library('cap')
667 libmount = dependency('mount',
670 want_seccomp = get_option('seccomp')
671 if want_seccomp != 'false'
672 libseccomp = dependency('libseccomp',
673 version : '>= 2.3.1',
674 required : want_seccomp == 'true')
675 have = libseccomp.found()
680 conf.set10('HAVE_SECCOMP', have)
681 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
683 want_selinux = get_option('selinux')
684 if want_selinux != 'false'
685 libselinux = dependency('libselinux',
686 version : '>= 2.1.9',
687 required : want_selinux == 'true')
688 have = libselinux.found()
693 conf.set10('HAVE_SELINUX', have)
694 m4_defines += have ? ['-DHAVE_SELINUX'] : []
696 want_apparmor = get_option('apparmor')
697 if want_apparmor != 'false'
698 libapparmor = dependency('libapparmor',
699 required : want_apparmor == 'true')
700 have = libapparmor.found()
705 conf.set10('HAVE_APPARMOR', have)
706 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
708 smack_run_label = get_option('smack-run-label')
709 if smack_run_label != ''
710 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
711 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
714 want_polkit = get_option('polkit')
715 install_polkit = false
716 install_polkit_pkla = false
717 if want_polkit != 'false'
718 install_polkit = true
720 libpolkit = dependency('polkit-gobject-1',
722 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
723 message('Old polkit detected, will install pkla files')
724 install_polkit_pkla = true
727 conf.set10('ENABLE_POLKIT', install_polkit)
729 want_acl = get_option('acl')
730 if want_acl != 'false'
731 libacl = cc.find_library('acl', required : want_acl == 'true')
732 have = libacl.found()
737 conf.set10('HAVE_ACL', have)
738 m4_defines += have ? ['-DHAVE_ACL'] : []
740 want_audit = get_option('audit')
741 if want_audit != 'false'
742 libaudit = dependency('audit', required : want_audit == 'true')
743 have = libaudit.found()
748 conf.set10('HAVE_AUDIT', have)
750 want_blkid = get_option('blkid')
751 if want_blkid != 'false'
752 libblkid = dependency('blkid', required : want_blkid == 'true')
753 have = libblkid.found()
758 conf.set10('HAVE_BLKID', have)
760 want_kmod = get_option('kmod')
761 if want_kmod != 'false'
762 libkmod = dependency('libkmod',
764 required : want_kmod == 'true')
765 have = libkmod.found()
770 conf.set10('HAVE_KMOD', have)
772 want_pam = get_option('pam')
773 if want_pam != 'false'
774 libpam = cc.find_library('pam', required : want_pam == 'true')
775 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
776 have = libpam.found() and libpam_misc.found()
782 conf.set10('HAVE_PAM', have)
783 m4_defines += have ? ['-DHAVE_PAM'] : []
785 want_microhttpd = get_option('microhttpd')
786 if want_microhttpd != 'false'
787 libmicrohttpd = dependency('libmicrohttpd',
788 version : '>= 0.9.33',
789 required : want_microhttpd == 'true')
790 have = libmicrohttpd.found()
795 conf.set10('HAVE_MICROHTTPD', have)
796 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
798 want_libcryptsetup = get_option('libcryptsetup')
799 if want_libcryptsetup != 'false'
800 libcryptsetup = dependency('libcryptsetup',
801 version : '>= 1.6.0',
802 required : want_libcryptsetup == 'true')
803 have = libcryptsetup.found()
808 conf.set10('HAVE_LIBCRYPTSETUP', have)
810 want_libcurl = get_option('libcurl')
811 if want_libcurl != 'false'
812 libcurl = dependency('libcurl',
813 version : '>= 7.32.0',
814 required : want_libcurl == 'true')
815 have = libcurl.found()
820 conf.set10('HAVE_LIBCURL', have)
821 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
823 want_libidn = get_option('libidn')
824 want_libidn2 = get_option('libidn2')
825 if want_libidn == 'true' and want_libidn2 == 'true'
826 error('libidn and libidn2 cannot be requested simultaneously')
829 if want_libidn != 'false' and want_libidn2 != 'true'
830 libidn = dependency('libidn',
831 required : want_libidn == 'true')
832 have = libidn.found()
837 conf.set10('HAVE_LIBIDN', have)
838 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
839 if not have and want_libidn2 != 'false'
840 # libidn is used for both libidn and libidn2 objects
841 libidn = dependency('libidn2',
842 required : want_libidn2 == 'true')
843 have = libidn.found()
847 conf.set10('HAVE_LIBIDN2', have)
848 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
850 want_libiptc = get_option('libiptc')
851 if want_libiptc != 'false'
852 libiptc = dependency('libiptc',
853 required : want_libiptc == 'true')
854 have = libiptc.found()
859 conf.set10('HAVE_LIBIPTC', have)
860 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
862 want_qrencode = get_option('qrencode')
863 if want_qrencode != 'false'
864 libqrencode = dependency('libqrencode',
865 required : want_qrencode == 'true')
866 have = libqrencode.found()
871 conf.set10('HAVE_QRENCODE', have)
873 want_gcrypt = get_option('gcrypt')
874 if want_gcrypt != 'false'
875 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
876 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
877 have = libgcrypt.found() and libgpg_error.found()
882 # link to neither of the libs if one is not found
886 conf.set10('HAVE_GCRYPT', have)
888 want_gnutls = get_option('gnutls')
889 if want_gnutls != 'false'
890 libgnutls = dependency('gnutls',
891 version : '>= 3.1.4',
892 required : want_gnutls == 'true')
893 have = libgnutls.found()
898 conf.set10('HAVE_GNUTLS', have)
900 want_elfutils = get_option('elfutils')
901 if want_elfutils != 'false'
902 libdw = dependency('libdw',
903 required : want_elfutils == 'true')
909 conf.set10('HAVE_ELFUTILS', have)
911 want_zlib = get_option('zlib')
912 if want_zlib != 'false'
913 libz = dependency('zlib',
914 required : want_zlib == 'true')
920 conf.set10('HAVE_ZLIB', have)
922 want_bzip2 = get_option('bzip2')
923 if want_bzip2 != 'false'
924 libbzip2 = cc.find_library('bz2',
925 required : want_bzip2 == 'true')
926 have = libbzip2.found()
931 conf.set10('HAVE_BZIP2', have)
933 want_xz = get_option('xz')
934 if want_xz != 'false'
935 libxz = dependency('liblzma',
936 required : want_xz == 'true')
942 conf.set10('HAVE_XZ', have)
944 want_lz4 = get_option('lz4')
945 if want_lz4 != 'false'
946 liblz4 = dependency('liblz4',
947 required : want_lz4 == 'true')
948 have = liblz4.found()
953 conf.set10('HAVE_LZ4', have)
955 want_xkbcommon = get_option('xkbcommon')
956 if want_xkbcommon != 'false'
957 libxkbcommon = dependency('xkbcommon',
958 version : '>= 0.3.0',
959 required : want_xkbcommon == 'true')
960 have = libxkbcommon.found()
965 conf.set10('HAVE_XKBCOMMON', have)
967 want_glib = get_option('glib')
968 if want_glib != 'false'
969 libglib = dependency('glib-2.0',
970 version : '>= 2.22.0',
971 required : want_glib == 'true')
972 libgobject = dependency('gobject-2.0',
973 version : '>= 2.22.0',
974 required : want_glib == 'true')
975 libgio = dependency('gio-2.0',
976 required : want_glib == 'true')
977 have = libglib.found() and libgobject.found() and libgio.found()
984 conf.set10('HAVE_GLIB', have)
986 want_dbus = get_option('dbus')
987 if want_dbus != 'false'
988 libdbus = dependency('dbus-1',
989 version : '>= 1.3.2',
990 required : want_dbus == 'true')
991 have = libdbus.found()
996 conf.set10('HAVE_DBUS', have)
998 default_dnssec = get_option('default-dnssec')
999 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1000 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1001 default_dnssec = 'no'
1003 conf.set('DEFAULT_DNSSEC_MODE',
1004 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1005 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1007 want_importd = get_option('importd')
1008 if want_importd != 'false'
1009 have = (conf.get('HAVE_LIBCURL') == 1 and
1010 conf.get('HAVE_ZLIB') == 1 and
1011 conf.get('HAVE_BZIP2') == 1 and
1012 conf.get('HAVE_XZ') == 1 and
1013 conf.get('HAVE_GCRYPT') == 1)
1014 if want_importd == 'true' and not have
1015 error('importd support was requested, but dependencies are not available')
1020 conf.set10('ENABLE_IMPORTD', have)
1022 want_remote = get_option('remote')
1023 if want_remote != 'false'
1024 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1025 conf.get('HAVE_LIBCURL') == 1]
1026 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1027 # it's possible to build one without the other. Complain only if
1028 # support was explictly requested. The auxiliary files like sysusers
1029 # config should be installed when any of the programs are built.
1030 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1031 error('remote support was requested, but dependencies are not available')
1033 have = have_deps[0] or have_deps[1]
1037 conf.set10('ENABLE_REMOTE', have)
1039 foreach term : ['utmp',
1070 have = get_option(term)
1071 name = 'ENABLE_' + term.underscorify().to_upper()
1072 conf.set10(name, have)
1073 m4_defines += have ? ['-D' + name] : []
1076 want_tests = get_option('tests')
1077 install_tests = get_option('install-tests')
1080 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1082 #####################################################################
1084 if get_option('efi')
1085 efi_arch = host_machine.cpu_family()
1087 if efi_arch == 'x86'
1088 EFI_MACHINE_TYPE_NAME = 'ia32'
1089 gnu_efi_arch = 'ia32'
1090 elif efi_arch == 'x86_64'
1091 EFI_MACHINE_TYPE_NAME = 'x64'
1092 gnu_efi_arch = 'x86_64'
1093 elif efi_arch == 'arm'
1094 EFI_MACHINE_TYPE_NAME = 'arm'
1095 gnu_efi_arch = 'arm'
1096 elif efi_arch == 'aarch64'
1097 EFI_MACHINE_TYPE_NAME = 'aa64'
1098 gnu_efi_arch = 'aarch64'
1100 EFI_MACHINE_TYPE_NAME = ''
1105 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1107 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1111 conf.set10('ENABLE_EFI', have)
1113 #####################################################################
1115 config_h = configure_file(
1116 output : 'config.h',
1117 configuration : conf)
1119 includes = include_directories('src/basic',
1129 'src/libsystemd/sd-bus',
1130 'src/libsystemd/sd-device',
1131 'src/libsystemd/sd-hwdb',
1132 'src/libsystemd/sd-id128',
1133 'src/libsystemd/sd-netlink',
1134 'src/libsystemd/sd-network',
1135 'src/libsystemd-network',
1139 add_project_arguments('-include', 'config.h', language : 'c')
1141 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1142 'src/shared/gcrypt-util.c')
1146 subdir('src/systemd')
1148 subdir('src/libsystemd')
1149 subdir('src/libsystemd-network')
1150 subdir('src/journal')
1153 libjournal_core = static_library(
1155 libjournal_core_sources,
1157 include_directories : includes,
1160 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1161 libsystemd = shared_library(
1163 libsystemd_internal_sources,
1164 journal_internal_sources,
1165 version : libsystemd_version,
1166 include_directories : includes,
1167 link_args : ['-shared',
1168 '-Wl,--version-script=' + libsystemd_sym_path],
1169 link_with : [libbasic],
1170 dependencies : [threads,
1175 link_depends : libsystemd_sym,
1177 install_dir : rootlibdir)
1179 ############################################################
1181 # binaries that have --help and are intended for use by humans,
1182 # usually, but not always, installed in /bin.
1183 public_programs = []
1185 subdir('src/libudev')
1186 subdir('src/shared')
1189 subdir('src/network')
1191 subdir('src/analyze')
1192 subdir('src/journal-remote')
1193 subdir('src/coredump')
1194 subdir('src/hostname')
1195 subdir('src/import')
1196 subdir('src/kernel-install')
1197 subdir('src/locale')
1198 subdir('src/machine')
1199 subdir('src/nspawn')
1200 subdir('src/resolve')
1201 subdir('src/timedate')
1202 subdir('src/timesync')
1203 subdir('src/vconsole')
1204 subdir('src/sulogin-shell')
1205 subdir('src/boot/efi')
1210 ############################################################
1212 # only static linking apart from libdl, to make sure that the
1213 # module is linked to all libraries that it uses.
1214 test_dlopen = executable(
1217 include_directories : includes,
1218 link_with : [libbasic],
1219 dependencies : [libdl])
1221 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1222 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1223 ['mymachines', 'ENABLE_MACHINED'],
1224 ['resolve', 'ENABLE_RESOLVE']]
1226 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1230 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1231 version_script_arg = join_paths(meson.current_source_dir(), sym)
1233 nss = shared_library(
1235 'src/nss-@0@/nss-@0@.c'.format(module),
1237 include_directories : includes,
1238 link_args : ['-shared',
1239 '-Wl,--version-script=' + version_script_arg,
1241 link_with : [libsystemd_internal,
1243 dependencies : [threads,
1247 install_dir : rootlibdir)
1249 # We cannot use shared_module because it does not support version suffix.
1250 # Unfortunately shared_library insists on creating the symlink…
1251 meson.add_install_script('sh', '-c',
1252 'rm $DESTDIR@0@/libnss_@1@.so'
1253 .format(rootlibdir, module))
1255 test('dlopen-nss_' + module,
1257 args : [nss.full_path()]) # path to dlopen must include a slash
1261 ############################################################
1263 executable('systemd',
1265 include_directories : includes,
1266 link_with : [libcore,
1268 dependencies : [threads,
1274 install_rpath : rootlibexecdir,
1276 install_dir : rootlibexecdir)
1278 exe = executable('systemd-analyze',
1279 systemd_analyze_sources,
1280 include_directories : includes,
1281 link_with : [libcore,
1283 dependencies : [threads,
1289 install_rpath : rootlibexecdir,
1291 public_programs += [exe]
1293 executable('systemd-journald',
1294 systemd_journald_sources,
1295 include_directories : includes,
1296 link_with : [libjournal_core,
1298 dependencies : [threads,
1302 install_rpath : rootlibexecdir,
1304 install_dir : rootlibexecdir)
1306 exe = executable('systemd-cat',
1307 systemd_cat_sources,
1308 include_directories : includes,
1309 link_with : [libjournal_core,
1311 dependencies : [threads],
1312 install_rpath : rootlibexecdir,
1314 public_programs += [exe]
1316 exe = executable('journalctl',
1318 include_directories : includes,
1319 link_with : [libshared],
1320 dependencies : [threads,
1324 install_rpath : rootlibexecdir,
1326 install_dir : rootbindir)
1327 public_programs += [exe]
1329 executable('systemd-getty-generator',
1330 'src/getty-generator/getty-generator.c',
1331 include_directories : includes,
1332 link_with : [libshared],
1333 install_rpath : rootlibexecdir,
1335 install_dir : systemgeneratordir)
1337 executable('systemd-debug-generator',
1338 'src/debug-generator/debug-generator.c',
1339 include_directories : includes,
1340 link_with : [libshared],
1341 install_rpath : rootlibexecdir,
1343 install_dir : systemgeneratordir)
1345 executable('systemd-fstab-generator',
1346 'src/fstab-generator/fstab-generator.c',
1347 'src/core/mount-setup.c',
1348 include_directories : includes,
1349 link_with : [libshared],
1350 install_rpath : rootlibexecdir,
1352 install_dir : systemgeneratordir)
1354 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1355 executable('30-systemd-environment-d-generator',
1356 'src/environment-d-generator/environment-d-generator.c',
1357 include_directories : includes,
1358 link_with : [libshared],
1359 install_rpath : rootlibexecdir,
1361 install_dir : userenvgeneratordir)
1363 meson.add_install_script(meson_make_symlink,
1364 join_paths(sysconfdir, 'environment'),
1365 join_paths(environmentdir, '99-environment.conf'))
1368 if conf.get('ENABLE_HIBERNATE') == 1
1369 executable('systemd-hibernate-resume-generator',
1370 'src/hibernate-resume/hibernate-resume-generator.c',
1371 include_directories : includes,
1372 link_with : [libshared],
1373 install_rpath : rootlibexecdir,
1375 install_dir : systemgeneratordir)
1377 executable('systemd-hibernate-resume',
1378 'src/hibernate-resume/hibernate-resume.c',
1379 include_directories : includes,
1380 link_with : [libshared],
1381 install_rpath : rootlibexecdir,
1383 install_dir : rootlibexecdir)
1386 if conf.get('HAVE_BLKID') == 1
1387 executable('systemd-gpt-auto-generator',
1388 'src/gpt-auto-generator/gpt-auto-generator.c',
1389 'src/basic/blkid-util.h',
1390 include_directories : includes,
1391 link_with : [libshared],
1392 dependencies : libblkid,
1393 install_rpath : rootlibexecdir,
1395 install_dir : systemgeneratordir)
1397 exe = executable('systemd-dissect',
1398 'src/dissect/dissect.c',
1399 include_directories : includes,
1400 link_with : [libshared],
1401 install_rpath : rootlibexecdir,
1403 install_dir : rootlibexecdir)
1404 public_programs += [exe]
1407 if conf.get('ENABLE_RESOLVE') == 1
1408 executable('systemd-resolved',
1409 systemd_resolved_sources,
1410 gcrypt_util_sources,
1411 include_directories : includes,
1412 link_with : [libshared],
1413 dependencies : [threads,
1418 install_rpath : rootlibexecdir,
1420 install_dir : rootlibexecdir)
1422 exe = executable('systemd-resolve',
1423 systemd_resolve_sources,
1424 gcrypt_util_sources,
1425 include_directories : includes,
1426 link_with : [libshared],
1427 dependencies : [threads,
1432 install_rpath : rootlibexecdir,
1434 public_programs += [exe]
1437 if conf.get('ENABLE_LOGIND') == 1
1438 executable('systemd-logind',
1439 systemd_logind_sources,
1440 include_directories : includes,
1441 link_with : [liblogind_core,
1443 dependencies : [threads,
1445 install_rpath : rootlibexecdir,
1447 install_dir : rootlibexecdir)
1449 exe = executable('loginctl',
1451 include_directories : includes,
1452 link_with : [libshared],
1453 dependencies : [threads,
1456 install_rpath : rootlibexecdir,
1458 install_dir : rootbindir)
1459 public_programs += [exe]
1461 exe = executable('systemd-inhibit',
1462 'src/login/inhibit.c',
1463 include_directories : includes,
1464 link_with : [libshared],
1465 install_rpath : rootlibexecdir,
1467 install_dir : rootbindir)
1468 public_programs += [exe]
1470 if conf.get('HAVE_PAM') == 1
1471 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1472 pam_systemd = shared_library(
1476 include_directories : includes,
1477 link_args : ['-shared',
1478 '-Wl,--version-script=' + version_script_arg],
1479 link_with : [libsystemd_internal,
1481 dependencies : [threads,
1484 link_depends : pam_systemd_sym,
1486 install_dir : pamlibdir)
1488 test('dlopen-pam_systemd',
1490 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1494 if conf.get('HAVE_PAM') == 1
1495 executable('systemd-user-sessions',
1496 'src/user-sessions/user-sessions.c',
1497 include_directories : includes,
1498 link_with : [libshared],
1499 install_rpath : rootlibexecdir,
1501 install_dir : rootlibexecdir)
1504 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1505 exe = executable('bootctl',
1506 'src/boot/bootctl.c',
1507 include_directories : includes,
1508 link_with : [libshared],
1509 dependencies : [libblkid],
1510 install_rpath : rootlibexecdir,
1512 public_programs += [exe]
1515 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1516 include_directories : includes,
1517 link_with : [libshared],
1518 dependencies : [threads],
1519 install_rpath : rootlibexecdir,
1521 public_programs += [exe]
1523 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1524 include_directories : includes,
1525 link_with : [libshared],
1526 dependencies : [threads,
1531 install_rpath : rootlibexecdir,
1533 install_dir : rootbindir)
1534 public_programs += [exe]
1536 if conf.get('ENABLE_BACKLIGHT') == 1
1537 executable('systemd-backlight',
1538 'src/backlight/backlight.c',
1539 include_directories : includes,
1540 link_with : [libshared],
1541 install_rpath : rootlibexecdir,
1543 install_dir : rootlibexecdir)
1546 if conf.get('ENABLE_RFKILL') == 1
1547 executable('systemd-rfkill',
1548 'src/rfkill/rfkill.c',
1549 include_directories : includes,
1550 link_with : [libshared],
1551 install_rpath : rootlibexecdir,
1553 install_dir : rootlibexecdir)
1556 executable('systemd-system-update-generator',
1557 'src/system-update-generator/system-update-generator.c',
1558 include_directories : includes,
1559 link_with : [libshared],
1560 install_rpath : rootlibexecdir,
1562 install_dir : systemgeneratordir)
1564 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1565 executable('systemd-cryptsetup',
1566 'src/cryptsetup/cryptsetup.c',
1567 include_directories : includes,
1568 link_with : [libshared],
1569 dependencies : [libcryptsetup],
1570 install_rpath : rootlibexecdir,
1572 install_dir : rootlibexecdir)
1574 executable('systemd-cryptsetup-generator',
1575 'src/cryptsetup/cryptsetup-generator.c',
1576 include_directories : includes,
1577 link_with : [libshared],
1578 dependencies : [libcryptsetup],
1579 install_rpath : rootlibexecdir,
1581 install_dir : systemgeneratordir)
1583 executable('systemd-veritysetup',
1584 'src/veritysetup/veritysetup.c',
1585 include_directories : includes,
1586 link_with : [libshared],
1587 dependencies : [libcryptsetup],
1588 install_rpath : rootlibexecdir,
1590 install_dir : rootlibexecdir)
1592 executable('systemd-veritysetup-generator',
1593 'src/veritysetup/veritysetup-generator.c',
1594 include_directories : includes,
1595 link_with : [libshared],
1596 dependencies : [libcryptsetup],
1597 install_rpath : rootlibexecdir,
1599 install_dir : systemgeneratordir)
1602 if conf.get('HAVE_SYSV_COMPAT') == 1
1603 executable('systemd-sysv-generator',
1604 'src/sysv-generator/sysv-generator.c',
1605 include_directories : includes,
1606 link_with : [libshared],
1607 install_rpath : rootlibexecdir,
1609 install_dir : systemgeneratordir)
1611 executable('systemd-rc-local-generator',
1612 'src/rc-local-generator/rc-local-generator.c',
1613 include_directories : includes,
1614 link_with : [libshared],
1615 install_rpath : rootlibexecdir,
1617 install_dir : systemgeneratordir)
1620 if conf.get('ENABLE_HOSTNAMED') == 1
1621 executable('systemd-hostnamed',
1622 'src/hostname/hostnamed.c',
1623 include_directories : includes,
1624 link_with : [libshared],
1625 install_rpath : rootlibexecdir,
1627 install_dir : rootlibexecdir)
1629 exe = executable('hostnamectl',
1630 'src/hostname/hostnamectl.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 install_rpath : rootlibexecdir,
1635 public_programs += [exe]
1638 if conf.get('ENABLE_LOCALED') == 1
1639 if conf.get('HAVE_XKBCOMMON') == 1
1640 # logind will load libxkbcommon.so dynamically on its own
1646 executable('systemd-localed',
1647 systemd_localed_sources,
1648 include_directories : includes,
1649 link_with : [libshared],
1650 dependencies : deps,
1651 install_rpath : rootlibexecdir,
1653 install_dir : rootlibexecdir)
1655 exe = executable('localectl',
1657 include_directories : includes,
1658 link_with : [libshared],
1659 install_rpath : rootlibexecdir,
1661 public_programs += [exe]
1664 if conf.get('ENABLE_TIMEDATED') == 1
1665 executable('systemd-timedated',
1666 'src/timedate/timedated.c',
1667 include_directories : includes,
1668 link_with : [libshared],
1669 install_rpath : rootlibexecdir,
1671 install_dir : rootlibexecdir)
1673 exe = executable('timedatectl',
1674 'src/timedate/timedatectl.c',
1675 include_directories : includes,
1676 install_rpath : rootlibexecdir,
1677 link_with : [libshared],
1679 public_programs += [exe]
1682 if conf.get('ENABLE_TIMESYNCD') == 1
1683 executable('systemd-timesyncd',
1684 systemd_timesyncd_sources,
1685 include_directories : includes,
1686 link_with : [libshared],
1687 dependencies : [threads,
1689 install_rpath : rootlibexecdir,
1691 install_dir : rootlibexecdir)
1694 if conf.get('ENABLE_MACHINED') == 1
1695 executable('systemd-machined',
1696 systemd_machined_sources,
1697 include_directories : includes,
1698 link_with : [libmachine_core,
1700 install_rpath : rootlibexecdir,
1702 install_dir : rootlibexecdir)
1704 exe = executable('machinectl',
1705 'src/machine/machinectl.c',
1706 include_directories : includes,
1707 link_with : [libshared],
1708 dependencies : [threads,
1711 install_rpath : rootlibexecdir,
1713 install_dir : rootbindir)
1714 public_programs += [exe]
1717 if conf.get('ENABLE_IMPORTD') == 1
1718 executable('systemd-importd',
1719 systemd_importd_sources,
1720 include_directories : includes,
1721 link_with : [libshared],
1722 dependencies : [threads],
1723 install_rpath : rootlibexecdir,
1725 install_dir : rootlibexecdir)
1727 systemd_pull = executable('systemd-pull',
1728 systemd_pull_sources,
1729 include_directories : includes,
1730 link_with : [libshared],
1731 dependencies : [libcurl,
1736 install_rpath : rootlibexecdir,
1738 install_dir : rootlibexecdir)
1740 systemd_import = executable('systemd-import',
1741 systemd_import_sources,
1742 include_directories : includes,
1743 link_with : [libshared],
1744 dependencies : [libcurl,
1748 install_rpath : rootlibexecdir,
1750 install_dir : rootlibexecdir)
1752 systemd_export = executable('systemd-export',
1753 systemd_export_sources,
1754 include_directories : includes,
1755 link_with : [libshared],
1756 dependencies : [libcurl,
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootlibexecdir)
1763 public_programs += [systemd_pull, systemd_import, systemd_export]
1766 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1767 exe = executable('systemd-journal-upload',
1768 systemd_journal_upload_sources,
1769 include_directories : includes,
1770 link_with : [libshared],
1771 dependencies : [threads,
1776 install_rpath : rootlibexecdir,
1778 install_dir : rootlibexecdir)
1779 public_programs += [exe]
1782 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1783 s_j_remote = executable('systemd-journal-remote',
1784 systemd_journal_remote_sources,
1785 include_directories : includes,
1786 link_with : [libshared],
1787 dependencies : [threads,
1792 install_rpath : rootlibexecdir,
1794 install_dir : rootlibexecdir)
1796 s_j_gatewayd = executable('systemd-journal-gatewayd',
1797 systemd_journal_gatewayd_sources,
1798 include_directories : includes,
1799 link_with : [libshared],
1800 dependencies : [threads,
1805 install_rpath : rootlibexecdir,
1807 install_dir : rootlibexecdir)
1808 public_programs += [s_j_remote, s_j_gatewayd]
1811 if conf.get('ENABLE_COREDUMP') == 1
1812 executable('systemd-coredump',
1813 systemd_coredump_sources,
1814 include_directories : includes,
1815 link_with : [libshared],
1816 dependencies : [threads,
1821 install_rpath : rootlibexecdir,
1823 install_dir : rootlibexecdir)
1825 exe = executable('coredumpctl',
1826 coredumpctl_sources,
1827 include_directories : includes,
1828 link_with : [libshared],
1829 dependencies : [threads,
1832 install_rpath : rootlibexecdir,
1834 public_programs += [exe]
1837 if conf.get('ENABLE_BINFMT') == 1
1838 exe = executable('systemd-binfmt',
1839 'src/binfmt/binfmt.c',
1840 include_directories : includes,
1841 link_with : [libshared],
1842 install_rpath : rootlibexecdir,
1844 install_dir : rootlibexecdir)
1845 public_programs += [exe]
1847 meson.add_install_script('sh', '-c',
1848 mkdir_p.format(binfmtdir))
1849 meson.add_install_script('sh', '-c',
1850 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1853 if conf.get('ENABLE_VCONSOLE') == 1
1854 executable('systemd-vconsole-setup',
1855 'src/vconsole/vconsole-setup.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1860 install_dir : rootlibexecdir)
1863 if conf.get('ENABLE_RANDOMSEED') == 1
1864 executable('systemd-random-seed',
1865 'src/random-seed/random-seed.c',
1866 include_directories : includes,
1867 link_with : [libshared],
1868 install_rpath : rootlibexecdir,
1870 install_dir : rootlibexecdir)
1873 if conf.get('ENABLE_FIRSTBOOT') == 1
1874 executable('systemd-firstboot',
1875 'src/firstboot/firstboot.c',
1876 include_directories : includes,
1877 link_with : [libshared],
1878 dependencies : [libcrypt],
1879 install_rpath : rootlibexecdir,
1881 install_dir : rootbindir)
1884 executable('systemd-remount-fs',
1885 'src/remount-fs/remount-fs.c',
1886 'src/core/mount-setup.c',
1887 'src/core/mount-setup.h',
1888 include_directories : includes,
1889 link_with : [libshared],
1890 install_rpath : rootlibexecdir,
1892 install_dir : rootlibexecdir)
1894 executable('systemd-machine-id-setup',
1895 'src/machine-id-setup/machine-id-setup-main.c',
1896 'src/core/machine-id-setup.c',
1897 'src/core/machine-id-setup.h',
1898 include_directories : includes,
1899 link_with : [libshared],
1900 install_rpath : rootlibexecdir,
1902 install_dir : rootbindir)
1904 executable('systemd-fsck',
1906 include_directories : includes,
1907 link_with : [libshared],
1908 install_rpath : rootlibexecdir,
1910 install_dir : rootlibexecdir)
1912 executable('systemd-sleep',
1913 'src/sleep/sleep.c',
1914 include_directories : includes,
1915 link_with : [libshared],
1916 install_rpath : rootlibexecdir,
1918 install_dir : rootlibexecdir)
1920 exe = executable('systemd-sysctl',
1921 'src/sysctl/sysctl.c',
1922 include_directories : includes,
1923 link_with : [libshared],
1924 install_rpath : rootlibexecdir,
1926 install_dir : rootlibexecdir)
1927 public_programs += [exe]
1929 executable('systemd-ac-power',
1930 'src/ac-power/ac-power.c',
1931 include_directories : includes,
1932 link_with : [libshared],
1933 install_rpath : rootlibexecdir,
1935 install_dir : rootlibexecdir)
1937 exe = executable('systemd-detect-virt',
1938 'src/detect-virt/detect-virt.c',
1939 include_directories : includes,
1940 link_with : [libshared],
1941 install_rpath : rootlibexecdir,
1943 public_programs += [exe]
1945 exe = executable('systemd-delta',
1946 'src/delta/delta.c',
1947 include_directories : includes,
1948 link_with : [libshared],
1949 install_rpath : rootlibexecdir,
1951 public_programs += [exe]
1953 exe = executable('systemd-escape',
1954 'src/escape/escape.c',
1955 include_directories : includes,
1956 link_with : [libshared],
1957 install_rpath : rootlibexecdir,
1959 install_dir : rootbindir)
1960 public_programs += [exe]
1962 exe = executable('systemd-notify',
1963 'src/notify/notify.c',
1964 include_directories : includes,
1965 link_with : [libshared],
1966 install_rpath : rootlibexecdir,
1968 install_dir : rootbindir)
1969 public_programs += [exe]
1971 executable('systemd-volatile-root',
1972 'src/volatile-root/volatile-root.c',
1973 include_directories : includes,
1974 link_with : [libshared],
1975 install_rpath : rootlibexecdir,
1977 install_dir : rootlibexecdir)
1979 executable('systemd-cgroups-agent',
1980 'src/cgroups-agent/cgroups-agent.c',
1981 include_directories : includes,
1982 link_with : [libshared],
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootlibexecdir)
1987 exe = executable('systemd-path',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 install_rpath : rootlibexecdir,
1993 public_programs += [exe]
1995 exe = executable('systemd-ask-password',
1996 'src/ask-password/ask-password.c',
1997 include_directories : includes,
1998 link_with : [libshared],
1999 install_rpath : rootlibexecdir,
2001 install_dir : rootbindir)
2002 public_programs += [exe]
2004 executable('systemd-reply-password',
2005 'src/reply-password/reply-password.c',
2006 include_directories : includes,
2007 link_with : [libshared],
2008 install_rpath : rootlibexecdir,
2010 install_dir : rootlibexecdir)
2012 exe = executable('systemd-tty-ask-password-agent',
2013 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2014 include_directories : includes,
2015 link_with : [libshared],
2016 install_rpath : rootlibexecdir,
2018 install_dir : rootbindir)
2019 public_programs += [exe]
2021 exe = executable('systemd-cgls',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 install_rpath : rootlibexecdir,
2027 public_programs += [exe]
2029 exe = executable('systemd-cgtop',
2030 'src/cgtop/cgtop.c',
2031 include_directories : includes,
2032 link_with : [libshared],
2033 install_rpath : rootlibexecdir,
2035 public_programs += [exe]
2037 executable('systemd-initctl',
2038 'src/initctl/initctl.c',
2039 include_directories : includes,
2040 link_with : [libshared],
2041 install_rpath : rootlibexecdir,
2043 install_dir : rootlibexecdir)
2045 exe = executable('systemd-mount',
2046 'src/mount/mount-tool.c',
2047 include_directories : includes,
2048 link_with : [libshared],
2049 install_rpath : rootlibexecdir,
2051 public_programs += [exe]
2053 meson.add_install_script(meson_make_symlink,
2054 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2056 exe = executable('systemd-run',
2058 include_directories : includes,
2059 link_with : [libshared],
2060 install_rpath : rootlibexecdir,
2062 public_programs += [exe]
2064 exe = executable('systemd-stdio-bridge',
2065 'src/stdio-bridge/stdio-bridge.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 install_rpath : rootlibexecdir,
2070 public_programs += [exe]
2072 exe = executable('busctl',
2073 'src/busctl/busctl.c',
2074 'src/busctl/busctl-introspect.c',
2075 'src/busctl/busctl-introspect.h',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 install_rpath : rootlibexecdir,
2080 public_programs += [exe]
2082 if conf.get('ENABLE_SYSUSERS') == 1
2083 exe = executable('systemd-sysusers',
2084 'src/sysusers/sysusers.c',
2085 include_directories : includes,
2086 link_with : [libshared],
2087 install_rpath : rootlibexecdir,
2089 install_dir : rootbindir)
2090 public_programs += [exe]
2093 if conf.get('ENABLE_TMPFILES') == 1
2094 exe = executable('systemd-tmpfiles',
2095 'src/tmpfiles/tmpfiles.c',
2096 include_directories : includes,
2097 link_with : [libshared],
2098 dependencies : [libacl],
2099 install_rpath : rootlibexecdir,
2101 install_dir : rootbindir)
2102 public_programs += [exe]
2105 if conf.get('ENABLE_HWDB') == 1
2106 exe = executable('systemd-hwdb',
2108 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2109 include_directories : includes,
2110 link_with : [libudev_internal],
2111 install_rpath : udev_rpath,
2113 install_dir : rootbindir)
2114 public_programs += [exe]
2117 if conf.get('ENABLE_QUOTACHECK') == 1
2118 executable('systemd-quotacheck',
2119 'src/quotacheck/quotacheck.c',
2120 include_directories : includes,
2121 link_with : [libshared],
2122 install_rpath : rootlibexecdir,
2124 install_dir : rootlibexecdir)
2127 exe = executable('systemd-socket-proxyd',
2128 'src/socket-proxy/socket-proxyd.c',
2129 include_directories : includes,
2130 link_with : [libshared],
2131 dependencies : [threads],
2132 install_rpath : rootlibexecdir,
2134 install_dir : rootlibexecdir)
2135 public_programs += [exe]
2137 exe = executable('systemd-udevd',
2138 systemd_udevd_sources,
2139 include_directories : includes,
2140 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2141 link_with : [libudev_core,
2144 dependencies : [threads,
2149 install_rpath : udev_rpath,
2151 install_dir : rootlibexecdir)
2152 public_programs += [exe]
2154 exe = executable('udevadm',
2156 include_directories : includes,
2157 link_with : [libudev_core,
2160 dependencies : [threads,
2165 install_rpath : udev_rpath,
2167 install_dir : rootbindir)
2168 public_programs += [exe]
2170 executable('systemd-shutdown',
2171 systemd_shutdown_sources,
2172 include_directories : includes,
2173 link_with : [libshared],
2174 install_rpath : rootlibexecdir,
2176 install_dir : rootlibexecdir)
2178 executable('systemd-update-done',
2179 'src/update-done/update-done.c',
2180 include_directories : includes,
2181 link_with : [libshared],
2182 install_rpath : rootlibexecdir,
2184 install_dir : rootlibexecdir)
2186 executable('systemd-update-utmp',
2187 'src/update-utmp/update-utmp.c',
2188 include_directories : includes,
2189 link_with : [libshared],
2190 dependencies : [libaudit],
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootlibexecdir)
2195 if conf.get('HAVE_KMOD') == 1
2196 executable('systemd-modules-load',
2197 'src/modules-load/modules-load.c',
2198 include_directories : includes,
2199 link_with : [libshared],
2200 dependencies : [libkmod],
2201 install_rpath : rootlibexecdir,
2203 install_dir : rootlibexecdir)
2205 meson.add_install_script('sh', '-c',
2206 mkdir_p.format(modulesloaddir))
2207 meson.add_install_script('sh', '-c',
2208 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2211 exe = executable('systemd-nspawn',
2212 systemd_nspawn_sources,
2213 'src/core/mount-setup.c', # FIXME: use a variable?
2214 'src/core/mount-setup.h',
2215 'src/core/loopback-setup.c',
2216 'src/core/loopback-setup.h',
2217 include_directories : [includes, include_directories('src/nspawn')],
2218 link_with : [libshared],
2219 dependencies : [libacl,
2223 install_rpath : rootlibexecdir,
2225 public_programs += [exe]
2227 if conf.get('ENABLE_NETWORKD') == 1
2228 executable('systemd-networkd',
2229 systemd_networkd_sources,
2230 include_directories : includes,
2231 link_with : [libnetworkd_core,
2235 dependencies : [threads],
2236 install_rpath : rootlibexecdir,
2238 install_dir : rootlibexecdir)
2240 executable('systemd-networkd-wait-online',
2241 systemd_networkd_wait_online_sources,
2242 include_directories : includes,
2243 link_with : [libnetworkd_core,
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootlibexecdir)
2249 exe = executable('networkctl',
2251 include_directories : includes,
2252 link_with : [libsystemd_network,
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootbindir)
2257 public_programs += [exe]
2259 ############################################################
2261 foreach tuple : tests
2263 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2264 dependencies = tuple[2]
2265 condition = tuple.length() >= 4 ? tuple[3] : ''
2266 type = tuple.length() >= 5 ? tuple[4] : ''
2267 defs = tuple.length() >= 6 ? tuple[5] : []
2268 incs = tuple.length() >= 7 ? tuple[6] : includes
2271 name = sources[0].split('/')[-1].split('.')[0]
2272 if type.startswith('timeout=')
2273 timeout = type.split('=')[1].to_int()
2277 if condition == '' or conf.get(condition) == 1
2281 include_directories : incs,
2282 link_with : link_with,
2283 dependencies : dependencies,
2285 install_rpath : rootlibexecdir,
2286 install : install_tests,
2287 install_dir : join_paths(testsdir, type))
2290 message('@0@ is a manual test'.format(name))
2291 elif type == 'unsafe' and want_tests != 'unsafe'
2292 message('@0@ is an unsafe test'.format(name))
2299 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2303 test_libsystemd_sym = executable(
2304 'test-libsystemd-sym',
2305 test_libsystemd_sym_c,
2306 include_directories : includes,
2307 link_with : [libsystemd],
2308 install : install_tests,
2309 install_dir : testsdir)
2310 test('test-libsystemd-sym',
2311 test_libsystemd_sym)
2313 test_libudev_sym = executable(
2316 include_directories : includes,
2317 c_args : ['-Wno-deprecated-declarations'],
2318 link_with : [libudev],
2319 install : install_tests,
2320 install_dir : testsdir)
2321 test('test-libudev-sym',
2324 ############################################################
2326 make_directive_index_py = find_program('tools/make-directive-index.py')
2327 make_man_index_py = find_program('tools/make-man-index.py')
2328 xml_helper_py = find_program('tools/xml_helper.py')
2329 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2333 subdir('sysusers.d')
2334 subdir('tmpfiles.d')
2339 subdir('shell-completion/bash')
2340 subdir('shell-completion/zsh')
2341 subdir('docs/sysvinit')
2342 subdir('docs/var-log')
2344 # FIXME: figure out if the warning is true:
2345 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2346 install_subdir('factory/etc',
2347 install_dir : factorydir)
2350 install_data('xorg/50-systemd-user.sh',
2351 install_dir : xinitrcdir)
2352 install_data('system-preset/90-systemd.preset',
2353 install_dir : systempresetdir)
2354 install_data('modprobe.d/systemd.conf',
2355 install_dir : modprobedir)
2356 install_data('README',
2363 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2364 install_dir : docdir)
2366 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2367 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2369 ############################################################
2371 meson_check_help = find_program('tools/meson-check-help.sh')
2373 foreach exec : public_programs
2374 name = exec.full_path().split('/')[-1]
2375 test('check-help-' + name,
2377 args : [exec.full_path()])
2380 ############################################################
2383 all_files = run_command(
2385 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2388 all_files = files(all_files.stdout().split())
2393 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2397 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2401 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2404 command : [meson_git_contrib_sh])
2408 git_head = run_command(
2410 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2411 'rev-parse', 'HEAD']).stdout().strip()
2412 git_head_short = run_command(
2414 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2415 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2419 command : ['git', 'archive',
2420 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2422 '--prefix', 'systemd-@0@/'.format(git_head),
2426 ############################################################
2429 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2431 'prefix: @0@'.format(prefixdir),
2432 'rootprefix: @0@'.format(rootprefixdir),
2433 'sysconf dir: @0@'.format(sysconfdir),
2434 'includedir: @0@'.format(includedir),
2435 'lib dir: @0@'.format(libdir),
2436 'rootlib dir: @0@'.format(rootlibdir),
2437 'SysV init scripts: @0@'.format(sysvinit_path),
2438 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2439 'PAM modules dir: @0@'.format(pamlibdir),
2440 'PAM configuration dir: @0@'.format(pamconfdir),
2441 'RPM macros dir: @0@'.format(rpmmacrosdir),
2442 'modprobe.d dir: @0@'.format(modprobedir),
2443 'D-Bus policy dir: @0@'.format(dbuspolicydir),
2444 'D-Bus session dir: @0@'.format(dbussessionservicedir),
2445 'D-Bus system dir: @0@'.format(dbussystemservicedir),
2446 'bash completions dir: @0@'.format(bashcompletiondir),
2447 'zsh completions dir: @0@'.format(zshcompletiondir),
2448 'extra start script: @0@'.format(get_option('rc-local')),
2449 'extra stop script: @0@'.format(get_option('halt-local')),
2450 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2451 get_option('debug-tty')),
2452 'TTY GID: @0@'.format(tty_gid),
2453 'maximum system UID: @0@'.format(system_uid_max),
2454 'maximum system GID: @0@'.format(system_gid_max),
2455 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2456 'certificate root: @0@'.format(get_option('certificate-root')),
2457 'support URL: @0@'.format(support_url),
2458 'nobody user name: @0@'.format(get_option('nobody-user')),
2459 'nobody group name: @0@'.format(get_option('nobody-group')),
2460 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2461 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2463 'default DNSSEC mode: @0@'.format(default_dnssec),
2464 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2465 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2467 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2468 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2470 'default DNS servers: @0@'.format(alt_dns_servers),
2471 'default NTP servers: @0@'.format(alt_ntp_servers)]
2473 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2474 '@@0@'.format(time_epoch)).stdout().strip()
2476 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2479 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2480 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2481 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2483 if conf.get('ENABLE_EFI') == 1
2485 'efi arch: @0@'.format(efi_arch)]
2489 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2490 'EFI CC @0@'.format(efi_cc),
2491 'EFI libdir: @0@'.format(efi_libdir),
2492 'EFI ldsdir: @0@'.format(efi_ldsdir),
2493 'EFI includedir: @0@'.format(efi_incdir)]
2546 ['legacy pkla', install_polkit_pkla],
2548 ['gnu-efi', have_gnu_efi],
2554 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2557 ['man pages', want_man],
2558 ['html pages', want_html],
2559 ['man page indices', want_man and have_lxml],
2560 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2565 ['adm group', get_option('adm-group')],
2566 ['wheel group', get_option('wheel-group')],
2569 ['debug mmap cache'],
2572 cond = tuple.get(1, '')
2574 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2575 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2576 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2581 missing += [tuple[0]]
2587 'enabled features: @0@'.format(', '.join(found)),
2589 'disabled features: @0@'.format(', '.join(missing)),
2591 message('\n '.join(status))