1 project('systemd', 'c',
10 meson_version : '>= 0.40',
13 # We need the same data in three different formats, ugh!
14 # Also, for hysterical reasons, we use different variable
15 # names, sometimes. Not all variables are included in every
17 conf = configuration_data()
18 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
19 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
21 substs = configuration_data()
22 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
23 substs.set('PACKAGE_VERSION', meson.project_version())
27 #####################################################################
29 # Try to install the git pre-commit hook
30 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
31 if git_hook.returncode() == 0
32 message(git_hook.stdout().strip())
35 #####################################################################
37 rootprefixdir = get_option('rootprefix')
38 if get_option('split-usr')
39 conf.set('HAVE_SPLIT_USR', true)
40 rootprefixdir = rootprefixdir != '' ? rootprefixdir : '/'
42 rootprefixdir = rootprefixdir != '' ? rootprefixdir : '/usr'
45 sysvinit_path = get_option('sysvinit-path')
46 sysvrcnd_path = get_option('sysvrcnd-path')
47 if sysvinit_path != '' or sysvrcnd_path != ''
48 conf.set('HAVE_SYSV_COMPAT', true,
49 description : 'SysV init scripts and rcN.d links are supported')
50 m4_defines += ['-DHAVE_SYSV_COMPAT']
53 # join_paths ignore the preceding arguments if an absolute component is
54 # encountered, so this should canonicalize various paths when they are
55 # absolute or relative.
56 prefixdir = get_option('prefix')
57 if not prefixdir.startswith('/')
58 error('Prefix is not absolute: "@0@"'.format(prefixdir))
60 bindir = join_paths(prefixdir, get_option('bindir'))
61 libdir = join_paths(prefixdir, get_option('libdir'))
62 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
63 includedir = join_paths(prefixdir, get_option('includedir'))
64 datadir = join_paths(prefixdir, get_option('datadir'))
65 localstatedir = join_paths('/', get_option('localstatedir'))
67 rootbindir = join_paths(rootprefixdir, 'bin')
68 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
70 rootlibdir = get_option('rootlibdir')
72 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
75 # Dirs of external packages
76 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
77 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
78 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
79 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
80 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
81 varlogdir = join_paths(localstatedir, 'log')
82 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
83 rpmmacrosdir = get_option('rpmmacrosdir')
86 pkgdatadir = join_paths(datadir, 'systemd')
87 environmentdir = join_paths(prefixdir, 'lib/environment.d')
88 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
89 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
90 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
91 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
92 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
93 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
94 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
95 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
96 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
97 pkgincludedir = join_paths(includedir, 'systemd')
98 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
99 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
100 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
101 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
102 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
103 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
104 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
105 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
106 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
107 udevhomedir = udevlibexecdir
108 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
109 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
110 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
111 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
112 factorydir = join_paths(datadir, 'factory')
113 docdir = join_paths(datadir, 'doc/systemd')
114 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
115 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
116 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
117 catalogstatedir = join_paths(systemdstatedir, 'catalog')
118 randomseeddir = join_paths(localstatedir, 'lib/systemd')
120 dbuspolicydir = get_option('dbuspolicydir')
121 if dbuspolicydir == ''
122 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
125 dbussessionservicedir = get_option('dbussessionservicedir')
126 if dbussessionservicedir == ''
127 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
130 dbussystemservicedir = get_option('dbussystemservicedir')
131 if dbussystemservicedir == ''
132 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
135 pamlibdir = get_option('pamlibdir')
137 pamlibdir = join_paths(rootlibdir, 'security')
140 pamconfdir = get_option('pamconfdir')
142 pamconfdir = join_paths(sysconfdir, 'pam.d')
145 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
146 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
147 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
148 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
149 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
150 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
151 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
152 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
153 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
154 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
155 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
156 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
157 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
158 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
159 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
160 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
161 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
162 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
163 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
164 conf.set_quoted('ROOTPREFIX', rootprefixdir)
165 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
166 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
167 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
168 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
169 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
170 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
171 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
172 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
173 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
174 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
175 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
176 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
177 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
178 conf.set_quoted('LIBDIR', libdir)
179 conf.set_quoted('ROOTLIBDIR', rootlibdir)
180 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
181 conf.set_quoted('BOOTLIBDIR', bootlibdir)
182 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
183 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
184 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
185 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
186 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
187 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
189 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
190 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
192 substs.set('prefix', prefixdir)
193 substs.set('exec_prefix', prefixdir)
194 substs.set('libdir', libdir)
195 substs.set('rootlibdir', rootlibdir)
196 substs.set('includedir', includedir)
197 substs.set('pkgsysconfdir', pkgsysconfdir)
198 substs.set('bindir', bindir)
199 substs.set('rootbindir', rootbindir)
200 substs.set('rootlibexecdir', rootlibexecdir)
201 substs.set('systemunitdir', systemunitdir)
202 substs.set('userunitdir', userunitdir)
203 substs.set('systempresetdir', systempresetdir)
204 substs.set('userpresetdir', userpresetdir)
205 substs.set('udevhwdbdir', udevhwdbdir)
206 substs.set('udevrulesdir', udevrulesdir)
207 substs.set('udevlibexecdir', udevlibexecdir)
208 substs.set('catalogdir', catalogdir)
209 substs.set('tmpfilesdir', tmpfilesdir)
210 substs.set('sysusersdir', sysusersdir)
211 substs.set('sysctldir', sysctldir)
212 substs.set('binfmtdir', binfmtdir)
213 substs.set('modulesloaddir', modulesloaddir)
214 substs.set('systemgeneratordir', systemgeneratordir)
215 substs.set('usergeneratordir', usergeneratordir)
216 substs.set('systemenvgeneratordir', systemenvgeneratordir)
217 substs.set('userenvgeneratordir', userenvgeneratordir)
218 substs.set('systemshutdowndir', systemshutdowndir)
219 substs.set('systemsleepdir', systemsleepdir)
220 substs.set('VARLOGDIR', varlogdir)
221 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
222 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
223 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
224 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
225 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
226 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
227 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
229 #####################################################################
231 cc = meson.get_compiler('c')
232 pkgconfig = import('pkgconfig')
233 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
235 cxx = find_program('c++', required : false)
237 # Used only for tests
241 foreach arg : ['-Wextra',
244 '-Wmissing-include-dirs',
245 '-Wold-style-definition',
248 '-Wdeclaration-after-statement',
250 '-Wsuggest-attribute=noreturn',
251 '-Werror=missing-prototypes',
252 '-Werror=implicit-function-declaration',
253 '-Werror=missing-declarations',
254 '-Werror=return-type',
255 '-Werror=incompatible-pointer-types',
257 '-Wstrict-prototypes',
259 '-Wmissing-noreturn',
262 '-Wstrict-aliasing=2',
269 '-fdiagnostics-show-option',
270 '-fno-strict-aliasing',
271 '-fvisibility=hidden',
273 '-fstack-protector-strong',
275 '--param=ssp-buffer-size=4',
277 if cc.has_argument(arg)
278 add_project_arguments(arg, language : 'c')
282 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
283 # arguments, just emits a warnings. So test for the "positive" version instead.
284 foreach arg : ['unused-parameter',
285 'missing-field-initializers',
288 if cc.has_argument('-W' + arg)
289 add_project_arguments('-Wno-' + arg, language : 'c')
295 #include <inttypes.h>
296 typedef uint64_t usec_t;
297 usec_t now(clockid_t clock);
302 ', name : '-Werror=shadow with local shadowing')
303 add_project_arguments('-Werror=shadow', language : 'c')
306 if cc.get_id() == 'clang'
307 foreach arg : ['-Wno-typedef-redefinition',
308 '-Wno-gnu-variable-sized-type-not-at-end',
310 if cc.has_argument(arg,
311 name : '@0@ is supported'.format(arg))
312 add_project_arguments(arg, language : 'c')
317 link_test_c = files('tools/meson-link-test.c')
319 # --as-needed and --no-undefined are provided by meson by default,
320 # run mesonconf to see what is enabled
321 foreach arg : ['-Wl,-z,relro',
326 have = run_command(check_compilation_sh,
327 cc.cmd_array(), '-x', 'c', arg,
328 '-include', link_test_c).returncode() == 0
329 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
331 add_project_link_arguments(arg, language : 'c')
335 if get_option('buildtype') != 'debug'
336 foreach arg : ['-ffunction-sections',
338 if cc.has_argument(arg,
339 name : '@0@ is supported'.format(arg))
340 add_project_arguments(arg, language : 'c')
344 foreach arg : ['-Wl,--gc-sections']
345 have = run_command(check_compilation_sh,
346 cc.cmd_array(), '-x', 'c', arg,
347 '-include', link_test_c).returncode() == 0
348 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
350 add_project_link_arguments(arg, language : 'c')
355 cpp = ' '.join(cc.cmd_array()) + ' -E'
357 #####################################################################
358 # compilation result tests
360 conf.set('_GNU_SOURCE', true)
361 conf.set('__SANE_USERSPACE_TYPES__', true)
363 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
364 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
365 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
366 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
367 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
368 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
369 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
373 #include <linux/ethtool.h>
375 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
377 foreach decl : ['char16_t',
380 'struct ethtool_link_settings',
383 # We get -1 if the size cannot be determined
384 have = cc.sizeof(decl, prefix : decl_headers) > 0
385 conf.set('HAVE_' + decl.underscorify().to_upper(), have)
388 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
389 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
390 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
391 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
392 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
393 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
394 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
395 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
396 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
397 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
398 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
399 # if_tunnel.h is buggy and cannot be included on its own
400 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
401 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
402 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
403 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
404 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
405 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
406 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
407 ['NDA_IFINDEX', 'linux/neighbour.h'],
408 ['IFA_FLAGS', 'linux/if_addr.h'],
409 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
411 prefix = decl.length() > 2 ? decl[2] : ''
412 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
413 conf.set10('HAVE_DECL_' + decl[0], have)
417 foreach ident : ['secure_getenv', '__secure_getenv']
418 if not skip and cc.has_function(ident)
419 conf.set('HAVE_' + ident.to_upper(), true)
425 ['memfd_create', '''#include <sys/memfd.h>'''],
426 ['gettid', '''#include <sys/types.h>'''],
427 ['pivot_root', '''#include <stdlib.h>'''], # no known header declares pivot_root
428 ['name_to_handle_at', '''#define _GNU_SOURCE
429 #include <sys/types.h>
430 #include <sys/stat.h>
431 #include <fcntl.h>'''],
432 ['setns', '''#define _GNU_SOURCE
433 #include <sched.h>'''],
434 ['renameat2', '''#include <stdio.h>'''],
435 ['kcmp', '''#include <linux/kcmp.h>'''],
436 ['keyctl', '''#include <sys/types.h>
437 #include <keyutils.h>'''],
438 ['copy_file_range', '''#include <sys/syscall.h>
439 #include <unistd.h>'''],
440 ['explicit_bzero' , '''#include <string.h>'''],
443 have = cc.has_function(ident[0], prefix : ident[1])
444 conf.set10('HAVE_DECL_' + ident[0].to_upper(), have)
447 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''')
448 conf.set('USE_SYS_RANDOM_H', true)
449 conf.set10('HAVE_DECL_GETRANDOM', true)
451 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
452 conf.set10('HAVE_DECL_GETRANDOM', have)
455 #####################################################################
457 sed = find_program('sed')
458 grep = find_program('grep')
459 awk = find_program('awk')
460 m4 = find_program('m4')
461 stat = find_program('stat')
462 git = find_program('git', required : false)
464 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
465 mkdir_p = 'mkdir -p $DESTDIR/@0@'
466 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
467 splash_bmp = files('test/splash.bmp')
469 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
470 # /usr/sbin, /sbin, and fall back to the default from middle column.
471 progs = [['telinit', '/lib/sysvinit/telinit'],
472 ['quotaon', '/usr/sbin/quotaon' ],
473 ['quotacheck', '/usr/sbin/quotacheck' ],
474 ['kill', '/usr/bin/kill' ],
475 ['kmod', '/usr/bin/kmod' ],
476 ['kexec', '/usr/sbin/kexec' ],
477 ['sulogin', '/usr/sbin/sulogin' ],
478 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
479 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
480 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
481 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
484 path = get_option(prog[0] + '-path')
486 message('Using @1@ for @0@'.format(prog[0], path))
488 exe = find_program(prog[0],
489 '/usr/sbin/' + prog[0],
492 path = exe.found() ? exe.path() : prog[1]
494 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
495 conf.set_quoted(name, path)
496 substs.set(name, path)
499 if run_command('ln', '--relative', '--help').returncode() != 0
500 error('ln does not support --relative')
503 ############################################################
505 gperf = find_program('gperf')
507 gperf_test_format = '''
509 const char * in_word_set(const char *, @0@);
512 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
513 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
514 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
515 if cc.compiles(gperf_test)
516 gperf_len_type = 'size_t'
518 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
519 if cc.compiles(gperf_test)
520 gperf_len_type = 'unsigned'
522 error('unable to determine gperf len type')
525 message('gperf len type is @0@'.format(gperf_len_type))
526 conf.set('GPERF_LEN_TYPE', gperf_len_type,
527 description : 'The type of gperf "len" parameter')
529 ############################################################
531 if not cc.has_header('sys/capability.h')
532 error('POSIX caps headers not found')
534 foreach header : ['linux/btrfs.h',
536 'linux/vm_sockets.h',
537 'valgrind/memcheck.h',
538 'valgrind/valgrind.h',
541 conf.set('HAVE_' + header.underscorify().to_upper(),
542 cc.has_header(header))
545 ############################################################
547 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
549 default_hierarchy = get_option('default-hierarchy')
550 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
551 description : 'default cgroup hierarchy as string')
552 if default_hierarchy == 'legacy'
553 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
554 elif default_hierarchy == 'hybrid'
555 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
557 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
560 time_epoch = get_option('time-epoch')
563 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
565 time_epoch = time_epoch.to_int()
566 conf.set('TIME_EPOCH', time_epoch)
568 system_uid_max = get_option('system-uid-max')
569 if system_uid_max == ''
570 system_uid_max = run_command(
572 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
573 '/etc/login.defs').stdout()
575 system_uid_max = system_uid_max.to_int()
576 conf.set('SYSTEM_UID_MAX', system_uid_max)
577 substs.set('systemuidmax', system_uid_max)
578 message('maximum system UID is @0@'.format(system_uid_max))
580 conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
581 conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
583 system_gid_max = get_option('system-gid-max')
584 if system_gid_max == ''
585 system_gid_max = run_command(
587 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
588 '/etc/login.defs').stdout()
590 system_gid_max = system_gid_max.to_int()
591 conf.set('SYSTEM_GID_MAX', system_gid_max)
592 substs.set('systemgidmax', system_gid_max)
593 message('maximum system GID is @0@'.format(system_gid_max))
595 tty_gid = get_option('tty-gid')
596 conf.set('TTY_GID', tty_gid)
597 substs.set('TTY_GID', tty_gid)
599 if get_option('adm-group')
600 m4_defines += ['-DENABLE_ADM_GROUP']
603 if get_option('wheel-group')
604 m4_defines += ['-DENABLE_WHEEL_GROUP']
607 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
609 kill_user_processes = get_option('default-kill-user-processes')
610 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
611 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
613 dns_servers = get_option('dns-servers')
614 conf.set_quoted('DNS_SERVERS', dns_servers)
615 substs.set('DNS_SERVERS', dns_servers)
617 ntp_servers = get_option('ntp-servers')
618 conf.set_quoted('NTP_SERVERS', ntp_servers)
619 substs.set('NTP_SERVERS', ntp_servers)
621 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
623 substs.set('SUSHELL', get_option('debug-shell'))
624 substs.set('DEBUGTTY', get_option('debug-tty'))
626 debug = get_option('debug')
628 foreach name : debug.split(',')
630 conf.set('ENABLE_DEBUG_HASHMAP', true)
631 elif name == 'mmap-cache'
632 conf.set('ENABLE_DEBUG_MMAP_CACHE', true)
634 message('unknown debug option "@0@", ignoring'.format(name))
639 #####################################################################
641 threads = dependency('threads')
642 librt = cc.find_library('rt')
643 libm = cc.find_library('m')
644 libdl = cc.find_library('dl')
645 libcrypt = cc.find_library('crypt')
647 libcap = dependency('libcap', required : false)
648 if not libcap.found()
649 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
650 libcap = cc.find_library('cap')
653 libmount = dependency('mount',
656 want_seccomp = get_option('seccomp')
657 if want_seccomp != 'false'
658 libseccomp = dependency('libseccomp',
659 version : '>= 2.3.1',
660 required : want_seccomp == 'true')
661 if libseccomp.found()
662 conf.set('HAVE_SECCOMP', true)
663 m4_defines += ['-DHAVE_SECCOMP']
669 want_selinux = get_option('selinux')
670 if want_selinux != 'false'
671 libselinux = dependency('libselinux',
672 version : '>= 2.1.9',
673 required : want_selinux == 'true')
674 if libselinux.found()
675 conf.set('HAVE_SELINUX', true)
676 m4_defines += ['-DHAVE_SELINUX']
682 want_apparmor = get_option('apparmor')
683 if want_apparmor != 'false'
684 libapparmor = dependency('libapparmor',
685 required : want_apparmor == 'true')
686 if libapparmor.found()
687 conf.set('HAVE_APPARMOR', true)
688 m4_defines += ['-DHAVE_APPARMOR']
694 smack_run_label = get_option('smack-run-label')
695 if smack_run_label != ''
696 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
697 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
700 want_polkit = get_option('polkit')
701 install_polkit = false
702 install_polkit_pkla = false
703 if want_polkit != 'false'
704 conf.set('ENABLE_POLKIT', true)
705 install_polkit = true
707 libpolkit = dependency('polkit-gobject-1',
709 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
710 message('Old polkit detected, will install pkla files')
711 install_polkit_pkla = true
715 want_acl = get_option('acl')
716 if want_acl != 'false'
717 libacl = cc.find_library('acl', required : want_acl == 'true')
719 conf.set('HAVE_ACL', true)
720 m4_defines += ['-DHAVE_ACL']
726 want_audit = get_option('audit')
727 if want_audit != 'false'
728 libaudit = dependency('audit', required : want_audit == 'true')
729 conf.set('HAVE_AUDIT', libaudit.found())
734 want_blkid = get_option('blkid')
735 if want_blkid != 'false'
736 libblkid = dependency('blkid', required : want_blkid == 'true')
737 conf.set('HAVE_BLKID', libblkid.found())
742 want_kmod = get_option('kmod')
743 if want_kmod != 'false'
744 libkmod = dependency('libkmod',
746 required : want_kmod == 'true')
747 conf.set('HAVE_KMOD', libkmod.found())
752 want_pam = get_option('pam')
753 if want_pam != 'false'
754 libpam = cc.find_library('pam', required : want_pam == 'true')
755 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
756 if libpam.found() and libpam_misc.found()
757 conf.set('HAVE_PAM', true)
758 m4_defines += ['-DHAVE_PAM']
765 want_microhttpd = get_option('microhttpd')
766 if want_microhttpd != 'false'
767 libmicrohttpd = dependency('libmicrohttpd',
768 version : '>= 0.9.33',
769 required : want_microhttpd == 'true')
770 if libmicrohttpd.found()
771 conf.set('HAVE_MICROHTTPD', true)
772 m4_defines += ['-DHAVE_MICROHTTPD']
778 want_libcryptsetup = get_option('libcryptsetup')
779 if want_libcryptsetup != 'false'
780 libcryptsetup = dependency('libcryptsetup',
781 version : '>= 1.6.0',
782 required : want_libcryptsetup == 'true')
783 conf.set('HAVE_LIBCRYPTSETUP', libcryptsetup.found())
788 want_libcurl = get_option('libcurl')
789 if want_libcurl != 'false'
790 libcurl = dependency('libcurl',
791 version : '>= 7.32.0',
792 required : want_libcurl == 'true')
794 conf.set('HAVE_LIBCURL', true)
795 m4_defines += ['-DHAVE_LIBCURL']
801 want_libidn = get_option('libidn')
802 want_libidn2 = get_option('libidn2')
803 if want_libidn == 'true' and want_libidn2 == 'true'
804 error('libidn and libidn2 cannot be requested simultaneously')
807 if want_libidn != 'false' and want_libidn2 != 'true'
808 libidn = dependency('libidn',
809 required : want_libidn == 'true')
811 conf.set('HAVE_LIBIDN', true)
812 m4_defines += ['-DHAVE_LIBIDN']
817 if not conf.get('HAVE_LIBIDN', false) and want_libidn2 != 'false'
818 # libidn is used for both libidn and libidn2 objects
819 libidn = dependency('libidn2',
820 required : want_libidn2 == 'true')
822 conf.set('HAVE_LIBIDN2', true)
823 m4_defines += ['-DHAVE_LIBIDN2']
827 want_libiptc = get_option('libiptc')
828 if want_libiptc != 'false'
829 libiptc = dependency('libiptc',
830 required : want_libiptc == 'true')
832 conf.set('HAVE_LIBIPTC', true)
833 m4_defines += ['-DHAVE_LIBIPTC']
839 want_qrencode = get_option('qrencode')
840 if want_qrencode != 'false'
841 libqrencode = dependency('libqrencode',
842 required : want_qrencode == 'true')
843 conf.set('HAVE_QRENCODE', libqrencode.found())
848 want_gcrypt = get_option('gcrypt')
849 if want_gcrypt != 'false'
850 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
851 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
853 have_deps = libgcrypt.found() and libgpg_error.found()
854 conf.set('HAVE_GCRYPT', have_deps)
856 # link to neither of the libs if one is not found
865 want_gnutls = get_option('gnutls')
866 if want_gnutls != 'false'
867 libgnutls = dependency('gnutls',
868 version : '>= 3.1.4',
869 required : want_gnutls == 'true')
870 conf.set('HAVE_GNUTLS', libgnutls.found())
875 want_elfutils = get_option('elfutils')
876 if want_elfutils != 'false'
877 libdw = dependency('libdw',
878 required : want_elfutils == 'true')
879 conf.set('HAVE_ELFUTILS', libdw.found())
884 want_zlib = get_option('zlib')
885 if want_zlib != 'false'
886 libz = dependency('zlib',
887 required : want_zlib == 'true')
888 conf.set('HAVE_ZLIB', libz.found())
893 want_bzip2 = get_option('bzip2')
894 if want_bzip2 != 'false'
895 libbzip2 = cc.find_library('bz2',
896 required : want_bzip2 == 'true')
897 conf.set('HAVE_BZIP2', libbzip2.found())
902 want_xz = get_option('xz')
903 if want_xz != 'false'
904 libxz = dependency('liblzma',
905 required : want_xz == 'true')
906 conf.set('HAVE_XZ', libxz.found())
911 want_lz4 = get_option('lz4')
912 if want_lz4 != 'false'
913 liblz4 = dependency('liblz4',
914 required : want_lz4 == 'true')
915 conf.set('HAVE_LZ4', liblz4.found())
920 want_xkbcommon = get_option('xkbcommon')
921 if want_xkbcommon != 'false'
922 libxkbcommon = dependency('xkbcommon',
923 version : '>= 0.3.0',
924 required : want_xkbcommon == 'true')
925 conf.set('HAVE_XKBCOMMON', libxkbcommon.found())
930 want_glib = get_option('glib')
931 if want_glib != 'false'
932 libglib = dependency('glib-2.0',
933 version : '>= 2.22.0',
934 required : want_glib == 'true')
935 libgobject = dependency('gobject-2.0',
936 version : '>= 2.22.0',
937 required : want_glib == 'true')
938 libgio = dependency('gio-2.0',
939 required : want_glib == 'true')
940 have = libglib.found() and libgobject.found() and libgio.found()
941 conf.set('HAVE_GLIB', have)
948 want_dbus = get_option('dbus')
949 if want_dbus != 'false'
950 libdbus = dependency('dbus-1',
951 version : '>= 1.3.2',
952 required : want_dbus == 'true')
953 conf.set('HAVE_DBUS', libdbus.found())
958 default_dnssec = get_option('default-dnssec')
959 if default_dnssec != 'no' and not conf.get('HAVE_GCRYPT', false)
960 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
961 default_dnssec = 'no'
963 conf.set('DEFAULT_DNSSEC_MODE',
964 'DNSSEC_' + default_dnssec.underscorify().to_upper())
965 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
967 want_importd = get_option('importd')
968 if want_importd != 'false'
969 have_deps = (conf.get('HAVE_LIBCURL', false) and
970 conf.get('HAVE_ZLIB', false) and
971 conf.get('HAVE_BZIP2', false) and
972 conf.get('HAVE_XZ', false) and
973 conf.get('HAVE_GCRYPT', false))
974 conf.set('ENABLE_IMPORTD', have_deps)
975 if want_importd == 'true' and not have_deps
976 error('importd support was requested, but dependencies are not available')
980 want_remote = get_option('remote')
981 if want_remote != 'false'
982 have_deps = [conf.get('HAVE_MICROHTTPD', false),
983 conf.get('HAVE_LIBCURL', false)]
984 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
985 # it's possible to build one without the other. Complain only if
986 # support was explictly requested. The auxiliary files like sysusers
987 # config should be installed when any of the programs are built.
988 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
989 error('remote support was requested, but dependencies are not available')
991 conf.set('ENABLE_REMOTE', have_deps[0] or have_deps[1])
994 foreach pair : [['utmp', 'HAVE_UTMP'],
995 ['hibernate', 'ENABLE_HIBERNATE'],
996 ['environment-d', 'ENABLE_ENVIRONMENT_D'],
997 ['binfmt', 'ENABLE_BINFMT'],
998 ['coredump', 'ENABLE_COREDUMP'],
999 ['resolve', 'ENABLE_RESOLVED'],
1000 ['logind', 'ENABLE_LOGIND'],
1001 ['hostnamed', 'ENABLE_HOSTNAMED'],
1002 ['localed', 'ENABLE_LOCALED'],
1003 ['machined', 'ENABLE_MACHINED'],
1004 ['networkd', 'ENABLE_NETWORKD'],
1005 ['timedated', 'ENABLE_TIMEDATED'],
1006 ['timesyncd', 'ENABLE_TIMESYNCD'],
1007 ['myhostname', 'HAVE_MYHOSTNAME'],
1008 ['firstboot', 'ENABLE_FIRSTBOOT'],
1009 ['randomseed', 'ENABLE_RANDOMSEED'],
1010 ['backlight', 'ENABLE_BACKLIGHT'],
1011 ['vconsole', 'ENABLE_VCONSOLE'],
1012 ['quotacheck', 'ENABLE_QUOTACHECK'],
1013 ['sysusers', 'ENABLE_SYSUSERS'],
1014 ['tmpfiles', 'ENABLE_TMPFILES'],
1015 ['hwdb', 'ENABLE_HWDB'],
1016 ['rfkill', 'ENABLE_RFKILL'],
1017 ['ldconfig', 'ENABLE_LDCONFIG'],
1018 ['efi', 'ENABLE_EFI'],
1019 ['tpm', 'ENABLE_TPM'],
1020 ['ima', 'HAVE_IMA'],
1021 ['smack', 'HAVE_SMACK'],
1022 ['gshadow', 'ENABLE_GSHADOW'],
1023 ['idn', 'ENABLE_IDN'],
1024 ['nss-systemd', 'ENABLE_NSS_SYSTEMD'],
1027 if get_option(pair[0])
1028 conf.set(pair[1], true)
1029 m4_defines += ['-D' + pair[1]]
1033 want_tests = get_option('tests')
1034 install_tests = get_option('install-tests')
1037 #####################################################################
1039 if get_option('efi')
1040 efi_arch = host_machine.cpu_family()
1042 if efi_arch == 'x86'
1043 EFI_MACHINE_TYPE_NAME = 'ia32'
1044 gnu_efi_arch = 'ia32'
1045 elif efi_arch == 'x86_64'
1046 EFI_MACHINE_TYPE_NAME = 'x64'
1047 gnu_efi_arch = 'x86_64'
1048 elif efi_arch == 'arm'
1049 EFI_MACHINE_TYPE_NAME = 'arm'
1050 gnu_efi_arch = 'arm'
1051 elif efi_arch == 'aarch64'
1052 EFI_MACHINE_TYPE_NAME = 'aa64'
1053 gnu_efi_arch = 'aarch64'
1055 EFI_MACHINE_TYPE_NAME = ''
1059 conf.set('ENABLE_EFI', true)
1060 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1062 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1065 #####################################################################
1067 config_h = configure_file(
1068 output : 'config.h',
1069 configuration : conf)
1071 includes = include_directories('src/basic',
1081 'src/libsystemd/sd-bus',
1082 'src/libsystemd/sd-device',
1083 'src/libsystemd/sd-hwdb',
1084 'src/libsystemd/sd-id128',
1085 'src/libsystemd/sd-netlink',
1086 'src/libsystemd/sd-network',
1087 'src/libsystemd-network',
1090 add_project_arguments('-include', 'config.h', language : 'c')
1092 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1093 'src/shared/gcrypt-util.c')
1097 subdir('src/systemd')
1099 subdir('src/libsystemd')
1100 subdir('src/libsystemd-network')
1101 subdir('src/journal')
1104 libjournal_core = static_library(
1106 libjournal_core_sources,
1108 include_directories : includes,
1111 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1112 libsystemd = shared_library(
1114 libsystemd_internal_sources,
1115 journal_internal_sources,
1117 include_directories : includes,
1118 link_args : ['-shared',
1119 '-Wl,--version-script=' + libsystemd_sym_path],
1120 link_with : [libbasic],
1121 dependencies : [threads,
1126 link_depends : libsystemd_sym,
1128 install_dir : rootlibdir)
1130 ############################################################
1132 # binaries that have --help and are intended for use by humans,
1133 # usually, but not always, installed in /bin.
1134 public_programs = []
1136 subdir('src/libudev')
1137 subdir('src/shared')
1140 subdir('src/network')
1142 subdir('src/analyze')
1143 subdir('src/journal-remote')
1144 subdir('src/coredump')
1145 subdir('src/hostname')
1146 subdir('src/import')
1147 subdir('src/kernel-install')
1148 subdir('src/locale')
1149 subdir('src/machine')
1150 subdir('src/nspawn')
1151 subdir('src/resolve')
1152 subdir('src/timedate')
1153 subdir('src/timesync')
1154 subdir('src/vconsole')
1155 subdir('src/sulogin-shell')
1156 subdir('src/boot/efi')
1161 ############################################################
1163 # only static linking apart from libdl, to make sure that the
1164 # module is linked to all libraries that it uses.
1165 test_dlopen = executable(
1168 include_directories : includes,
1169 link_with : [libbasic],
1170 dependencies : [libdl])
1172 foreach tuple : [['myhostname', 'HAVE_MYHOSTNAME'],
1173 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1174 ['mymachines', 'ENABLE_MACHINED'],
1175 ['resolve', 'ENABLE_RESOLVED']]
1177 condition = tuple[1] == '' or conf.get(tuple[1], false)
1181 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1182 version_script_arg = join_paths(meson.current_source_dir(), sym)
1184 nss = shared_library(
1186 'src/nss-@0@/nss-@0@.c'.format(module),
1188 include_directories : includes,
1189 link_args : ['-shared',
1190 '-Wl,--version-script=' + version_script_arg,
1192 link_with : [libsystemd_internal,
1194 dependencies : [threads,
1198 install_dir : rootlibdir)
1200 # We cannot use shared_module because it does not support version suffix.
1201 # Unfortunately shared_library insists on creating the symlink…
1202 meson.add_install_script('sh', '-c',
1203 'rm $DESTDIR@0@/libnss_@1@.so'
1204 .format(rootlibdir, module))
1206 test('dlopen-nss_' + module,
1208 args : [nss.full_path()]) # path to dlopen must include a slash
1212 ############################################################
1214 executable('systemd',
1216 include_directories : includes,
1217 link_with : [libcore,
1219 dependencies : [threads,
1225 install_rpath : rootlibexecdir,
1227 install_dir : rootlibexecdir)
1229 exe = executable('systemd-analyze',
1230 systemd_analyze_sources,
1231 include_directories : includes,
1232 link_with : [libcore,
1234 dependencies : [threads,
1240 install_rpath : rootlibexecdir,
1242 public_programs += [exe]
1244 executable('systemd-journald',
1245 systemd_journald_sources,
1246 include_directories : includes,
1247 link_with : [libjournal_core,
1249 dependencies : [threads,
1253 install_rpath : rootlibexecdir,
1255 install_dir : rootlibexecdir)
1257 exe = executable('systemd-cat',
1258 systemd_cat_sources,
1259 include_directories : includes,
1260 link_with : [libjournal_core,
1262 dependencies : [threads],
1263 install_rpath : rootlibexecdir,
1265 public_programs += [exe]
1267 exe = executable('journalctl',
1269 include_directories : includes,
1270 link_with : [libshared],
1271 dependencies : [threads,
1275 install_rpath : rootlibexecdir,
1277 install_dir : rootbindir)
1278 public_programs += [exe]
1280 executable('systemd-getty-generator',
1281 'src/getty-generator/getty-generator.c',
1282 include_directories : includes,
1283 link_with : [libshared],
1284 install_rpath : rootlibexecdir,
1286 install_dir : systemgeneratordir)
1288 executable('systemd-debug-generator',
1289 'src/debug-generator/debug-generator.c',
1290 include_directories : includes,
1291 link_with : [libshared],
1292 install_rpath : rootlibexecdir,
1294 install_dir : systemgeneratordir)
1296 executable('systemd-fstab-generator',
1297 'src/fstab-generator/fstab-generator.c',
1298 'src/core/mount-setup.c',
1299 include_directories : includes,
1300 link_with : [libshared],
1301 install_rpath : rootlibexecdir,
1303 install_dir : systemgeneratordir)
1305 if conf.get('ENABLE_ENVIRONMENT_D', false)
1306 executable('30-systemd-environment-d-generator',
1307 'src/environment-d-generator/environment-d-generator.c',
1308 include_directories : includes,
1309 link_with : [libshared],
1310 install_rpath : rootlibexecdir,
1312 install_dir : userenvgeneratordir)
1314 meson.add_install_script(meson_make_symlink,
1315 join_paths(sysconfdir, 'environment'),
1316 join_paths(environmentdir, '99-environment.conf'))
1319 if conf.get('ENABLE_HIBERNATE', false)
1320 executable('systemd-hibernate-resume-generator',
1321 'src/hibernate-resume/hibernate-resume-generator.c',
1322 include_directories : includes,
1323 link_with : [libshared],
1324 install_rpath : rootlibexecdir,
1326 install_dir : systemgeneratordir)
1328 executable('systemd-hibernate-resume',
1329 'src/hibernate-resume/hibernate-resume.c',
1330 include_directories : includes,
1331 link_with : [libshared],
1332 install_rpath : rootlibexecdir,
1334 install_dir : rootlibexecdir)
1337 if conf.get('HAVE_BLKID', false)
1338 executable('systemd-gpt-auto-generator',
1339 'src/gpt-auto-generator/gpt-auto-generator.c',
1340 'src/basic/blkid-util.h',
1341 include_directories : includes,
1342 link_with : [libshared],
1343 dependencies : libblkid,
1344 install_rpath : rootlibexecdir,
1346 install_dir : systemgeneratordir)
1348 exe = executable('systemd-dissect',
1349 'src/dissect/dissect.c',
1350 include_directories : includes,
1351 link_with : [libshared],
1352 install_rpath : rootlibexecdir,
1354 install_dir : rootlibexecdir)
1355 public_programs += [exe]
1358 if conf.get('ENABLE_RESOLVED', false)
1359 executable('systemd-resolved',
1360 systemd_resolved_sources,
1361 gcrypt_util_sources,
1362 include_directories : includes,
1363 link_with : [libshared],
1364 dependencies : [threads,
1369 install_rpath : rootlibexecdir,
1371 install_dir : rootlibexecdir)
1373 exe = executable('systemd-resolve',
1374 systemd_resolve_sources,
1375 gcrypt_util_sources,
1376 include_directories : includes,
1377 link_with : [libshared],
1378 dependencies : [threads,
1383 install_rpath : rootlibexecdir,
1385 public_programs += [exe]
1388 if conf.get('ENABLE_LOGIND', false)
1389 executable('systemd-logind',
1390 systemd_logind_sources,
1391 include_directories : includes,
1392 link_with : [liblogind_core,
1394 dependencies : [threads,
1396 install_rpath : rootlibexecdir,
1398 install_dir : rootlibexecdir)
1400 exe = executable('loginctl',
1402 include_directories : includes,
1403 link_with : [libshared],
1404 dependencies : [threads,
1407 install_rpath : rootlibexecdir,
1409 install_dir : rootbindir)
1410 public_programs += [exe]
1412 exe = executable('systemd-inhibit',
1413 'src/login/inhibit.c',
1414 include_directories : includes,
1415 link_with : [libshared],
1416 install_rpath : rootlibexecdir,
1418 install_dir : rootbindir)
1419 public_programs += [exe]
1421 if conf.get('HAVE_PAM', false)
1422 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1423 pam_systemd = shared_library(
1427 include_directories : includes,
1428 link_args : ['-shared',
1429 '-Wl,--version-script=' + version_script_arg],
1430 link_with : [libsystemd_internal,
1432 dependencies : [threads,
1435 link_depends : pam_systemd_sym,
1437 install_dir : pamlibdir)
1439 test('dlopen-pam_systemd',
1441 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1445 if conf.get('HAVE_PAM', false)
1446 executable('systemd-user-sessions',
1447 'src/user-sessions/user-sessions.c',
1448 include_directories : includes,
1449 link_with : [libshared],
1450 install_rpath : rootlibexecdir,
1452 install_dir : rootlibexecdir)
1455 if conf.get('ENABLE_EFI', false) and conf.get('HAVE_BLKID', false)
1456 exe = executable('bootctl',
1457 'src/boot/bootctl.c',
1458 include_directories : includes,
1459 link_with : [libshared],
1460 dependencies : [libblkid],
1461 install_rpath : rootlibexecdir,
1463 public_programs += [exe]
1466 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1467 include_directories : includes,
1468 link_with : [libshared],
1469 dependencies : [threads],
1470 install_rpath : rootlibexecdir,
1472 public_programs += [exe]
1474 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1475 include_directories : includes,
1476 link_with : [libshared],
1477 dependencies : [threads,
1482 install_rpath : rootlibexecdir,
1484 install_dir : rootbindir)
1485 public_programs += [exe]
1487 if conf.get('ENABLE_BACKLIGHT', false)
1488 executable('systemd-backlight',
1489 'src/backlight/backlight.c',
1490 include_directories : includes,
1491 link_with : [libshared],
1492 install_rpath : rootlibexecdir,
1494 install_dir : rootlibexecdir)
1497 if conf.get('ENABLE_RFKILL', false)
1498 executable('systemd-rfkill',
1499 'src/rfkill/rfkill.c',
1500 include_directories : includes,
1501 link_with : [libshared],
1502 install_rpath : rootlibexecdir,
1504 install_dir : rootlibexecdir)
1507 executable('systemd-system-update-generator',
1508 'src/system-update-generator/system-update-generator.c',
1509 include_directories : includes,
1510 link_with : [libshared],
1511 install_rpath : rootlibexecdir,
1513 install_dir : systemgeneratordir)
1515 if conf.get('HAVE_LIBCRYPTSETUP', false)
1516 executable('systemd-cryptsetup',
1517 'src/cryptsetup/cryptsetup.c',
1518 include_directories : includes,
1519 link_with : [libshared],
1520 dependencies : [libcryptsetup],
1521 install_rpath : rootlibexecdir,
1523 install_dir : rootlibexecdir)
1525 executable('systemd-cryptsetup-generator',
1526 'src/cryptsetup/cryptsetup-generator.c',
1527 include_directories : includes,
1528 link_with : [libshared],
1529 dependencies : [libcryptsetup],
1530 install_rpath : rootlibexecdir,
1532 install_dir : systemgeneratordir)
1534 executable('systemd-veritysetup',
1535 'src/veritysetup/veritysetup.c',
1536 include_directories : includes,
1537 link_with : [libshared],
1538 dependencies : [libcryptsetup],
1539 install_rpath : rootlibexecdir,
1541 install_dir : rootlibexecdir)
1543 executable('systemd-veritysetup-generator',
1544 'src/veritysetup/veritysetup-generator.c',
1545 include_directories : includes,
1546 link_with : [libshared],
1547 dependencies : [libcryptsetup],
1548 install_rpath : rootlibexecdir,
1550 install_dir : systemgeneratordir)
1553 if conf.get('HAVE_SYSV_COMPAT', false)
1554 executable('systemd-sysv-generator',
1555 'src/sysv-generator/sysv-generator.c',
1556 include_directories : includes,
1557 link_with : [libshared],
1558 install_rpath : rootlibexecdir,
1560 install_dir : systemgeneratordir)
1562 executable('systemd-rc-local-generator',
1563 'src/rc-local-generator/rc-local-generator.c',
1564 include_directories : includes,
1565 link_with : [libshared],
1566 install_rpath : rootlibexecdir,
1568 install_dir : systemgeneratordir)
1571 if conf.get('ENABLE_HOSTNAMED', false)
1572 executable('systemd-hostnamed',
1573 'src/hostname/hostnamed.c',
1574 include_directories : includes,
1575 link_with : [libshared],
1576 install_rpath : rootlibexecdir,
1578 install_dir : rootlibexecdir)
1580 exe = executable('hostnamectl',
1581 'src/hostname/hostnamectl.c',
1582 include_directories : includes,
1583 link_with : [libshared],
1584 install_rpath : rootlibexecdir,
1586 public_programs += [exe]
1589 if conf.get('ENABLE_LOCALED', false)
1590 if conf.get('HAVE_XKBCOMMON', false)
1591 # logind will load libxkbcommon.so dynamically on its own
1597 executable('systemd-localed',
1598 systemd_localed_sources,
1599 include_directories : includes,
1600 link_with : [libshared],
1601 dependencies : deps,
1602 install_rpath : rootlibexecdir,
1604 install_dir : rootlibexecdir)
1606 exe = executable('localectl',
1608 include_directories : includes,
1609 link_with : [libshared],
1610 install_rpath : rootlibexecdir,
1612 public_programs += [exe]
1615 if conf.get('ENABLE_TIMEDATED', false)
1616 executable('systemd-timedated',
1617 'src/timedate/timedated.c',
1618 include_directories : includes,
1619 link_with : [libshared],
1620 install_rpath : rootlibexecdir,
1622 install_dir : rootlibexecdir)
1624 exe = executable('timedatectl',
1625 'src/timedate/timedatectl.c',
1626 include_directories : includes,
1627 install_rpath : rootlibexecdir,
1628 link_with : [libshared],
1630 public_programs += [exe]
1633 if conf.get('ENABLE_TIMESYNCD', false)
1634 executable('systemd-timesyncd',
1635 systemd_timesyncd_sources,
1636 include_directories : includes,
1637 link_with : [libshared],
1638 dependencies : [threads,
1640 install_rpath : rootlibexecdir,
1642 install_dir : rootlibexecdir)
1645 if conf.get('ENABLE_MACHINED', false)
1646 executable('systemd-machined',
1647 systemd_machined_sources,
1648 include_directories : includes,
1649 link_with : [libmachine_core,
1651 install_rpath : rootlibexecdir,
1653 install_dir : rootlibexecdir)
1655 exe = executable('machinectl',
1656 'src/machine/machinectl.c',
1657 include_directories : includes,
1658 link_with : [libshared],
1659 dependencies : [threads,
1662 install_rpath : rootlibexecdir,
1664 install_dir : rootbindir)
1665 public_programs += [exe]
1668 if conf.get('ENABLE_IMPORTD', false)
1669 executable('systemd-importd',
1670 systemd_importd_sources,
1671 include_directories : includes,
1672 link_with : [libshared],
1673 dependencies : [threads],
1674 install_rpath : rootlibexecdir,
1676 install_dir : rootlibexecdir)
1678 systemd_pull = executable('systemd-pull',
1679 systemd_pull_sources,
1680 include_directories : includes,
1681 link_with : [libshared],
1682 dependencies : [libcurl,
1687 install_rpath : rootlibexecdir,
1689 install_dir : rootlibexecdir)
1691 systemd_import = executable('systemd-import',
1692 systemd_import_sources,
1693 include_directories : includes,
1694 link_with : [libshared],
1695 dependencies : [libcurl,
1699 install_rpath : rootlibexecdir,
1701 install_dir : rootlibexecdir)
1703 systemd_export = executable('systemd-export',
1704 systemd_export_sources,
1705 include_directories : includes,
1706 link_with : [libshared],
1707 dependencies : [libcurl,
1711 install_rpath : rootlibexecdir,
1713 install_dir : rootlibexecdir)
1714 public_programs += [systemd_pull, systemd_import, systemd_export]
1717 if conf.get('ENABLE_REMOTE', false) and conf.get('HAVE_LIBCURL', false)
1718 exe = executable('systemd-journal-upload',
1719 systemd_journal_upload_sources,
1720 include_directories : includes,
1721 link_with : [libshared],
1722 dependencies : [threads,
1727 install_rpath : rootlibexecdir,
1729 install_dir : rootlibexecdir)
1730 public_programs += [exe]
1733 if conf.get('ENABLE_REMOTE', false) and conf.get('HAVE_MICROHTTPD', false)
1734 s_j_remote = executable('systemd-journal-remote',
1735 systemd_journal_remote_sources,
1736 include_directories : includes,
1737 link_with : [libshared],
1738 dependencies : [threads,
1743 install_rpath : rootlibexecdir,
1745 install_dir : rootlibexecdir)
1747 s_j_gatewayd = executable('systemd-journal-gatewayd',
1748 systemd_journal_gatewayd_sources,
1749 include_directories : includes,
1750 link_with : [libshared],
1751 dependencies : [threads,
1756 install_rpath : rootlibexecdir,
1758 install_dir : rootlibexecdir)
1759 public_programs += [s_j_remote, s_j_gatewayd]
1762 if conf.get('ENABLE_COREDUMP', false)
1763 executable('systemd-coredump',
1764 systemd_coredump_sources,
1765 include_directories : includes,
1766 link_with : [libshared],
1767 dependencies : [threads,
1772 install_rpath : rootlibexecdir,
1774 install_dir : rootlibexecdir)
1776 exe = executable('coredumpctl',
1777 coredumpctl_sources,
1778 include_directories : includes,
1779 link_with : [libshared],
1780 dependencies : [threads,
1783 install_rpath : rootlibexecdir,
1785 public_programs += [exe]
1788 if conf.get('ENABLE_BINFMT', false)
1789 exe = executable('systemd-binfmt',
1790 'src/binfmt/binfmt.c',
1791 include_directories : includes,
1792 link_with : [libshared],
1793 install_rpath : rootlibexecdir,
1795 install_dir : rootlibexecdir)
1796 public_programs += [exe]
1798 meson.add_install_script('sh', '-c',
1799 mkdir_p.format(binfmtdir))
1800 meson.add_install_script('sh', '-c',
1801 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1804 if conf.get('ENABLE_VCONSOLE', false)
1805 executable('systemd-vconsole-setup',
1806 'src/vconsole/vconsole-setup.c',
1807 include_directories : includes,
1808 link_with : [libshared],
1809 install_rpath : rootlibexecdir,
1811 install_dir : rootlibexecdir)
1814 if conf.get('ENABLE_RANDOMSEED', false)
1815 executable('systemd-random-seed',
1816 'src/random-seed/random-seed.c',
1817 include_directories : includes,
1818 link_with : [libshared],
1819 install_rpath : rootlibexecdir,
1821 install_dir : rootlibexecdir)
1824 if conf.get('ENABLE_FIRSTBOOT', false)
1825 executable('systemd-firstboot',
1826 'src/firstboot/firstboot.c',
1827 include_directories : includes,
1828 link_with : [libshared],
1829 dependencies : [libcrypt],
1830 install_rpath : rootlibexecdir,
1832 install_dir : rootbindir)
1835 executable('systemd-remount-fs',
1836 'src/remount-fs/remount-fs.c',
1837 'src/core/mount-setup.c',
1838 'src/core/mount-setup.h',
1839 include_directories : includes,
1840 link_with : [libshared],
1841 install_rpath : rootlibexecdir,
1843 install_dir : rootlibexecdir)
1845 executable('systemd-machine-id-setup',
1846 'src/machine-id-setup/machine-id-setup-main.c',
1847 'src/core/machine-id-setup.c',
1848 'src/core/machine-id-setup.h',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 install_rpath : rootlibexecdir,
1853 install_dir : rootbindir)
1855 executable('systemd-fsck',
1857 include_directories : includes,
1858 link_with : [libshared],
1859 install_rpath : rootlibexecdir,
1861 install_dir : rootlibexecdir)
1863 executable('systemd-sleep',
1864 'src/sleep/sleep.c',
1865 include_directories : includes,
1866 link_with : [libshared],
1867 install_rpath : rootlibexecdir,
1869 install_dir : rootlibexecdir)
1871 exe = executable('systemd-sysctl',
1872 'src/sysctl/sysctl.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 install_rpath : rootlibexecdir,
1877 install_dir : rootlibexecdir)
1878 public_programs += [exe]
1880 executable('systemd-ac-power',
1881 'src/ac-power/ac-power.c',
1882 include_directories : includes,
1883 link_with : [libshared],
1884 install_rpath : rootlibexecdir,
1886 install_dir : rootlibexecdir)
1888 exe = executable('systemd-detect-virt',
1889 'src/detect-virt/detect-virt.c',
1890 include_directories : includes,
1891 link_with : [libshared],
1892 install_rpath : rootlibexecdir,
1894 public_programs += [exe]
1896 exe = executable('systemd-delta',
1897 'src/delta/delta.c',
1898 include_directories : includes,
1899 link_with : [libshared],
1900 install_rpath : rootlibexecdir,
1902 public_programs += [exe]
1904 exe = executable('systemd-escape',
1905 'src/escape/escape.c',
1906 include_directories : includes,
1907 link_with : [libshared],
1908 install_rpath : rootlibexecdir,
1910 install_dir : rootbindir)
1911 public_programs += [exe]
1913 exe = executable('systemd-notify',
1914 'src/notify/notify.c',
1915 include_directories : includes,
1916 link_with : [libshared],
1917 install_rpath : rootlibexecdir,
1919 install_dir : rootbindir)
1920 public_programs += [exe]
1922 executable('systemd-volatile-root',
1923 'src/volatile-root/volatile-root.c',
1924 include_directories : includes,
1925 link_with : [libshared],
1926 install_rpath : rootlibexecdir,
1928 install_dir : rootlibexecdir)
1930 executable('systemd-cgroups-agent',
1931 'src/cgroups-agent/cgroups-agent.c',
1932 include_directories : includes,
1933 link_with : [libshared],
1934 install_rpath : rootlibexecdir,
1936 install_dir : rootlibexecdir)
1938 exe = executable('systemd-path',
1940 include_directories : includes,
1941 link_with : [libshared],
1942 install_rpath : rootlibexecdir,
1944 public_programs += [exe]
1946 exe = executable('systemd-ask-password',
1947 'src/ask-password/ask-password.c',
1948 include_directories : includes,
1949 link_with : [libshared],
1950 install_rpath : rootlibexecdir,
1952 install_dir : rootbindir)
1953 public_programs += [exe]
1955 executable('systemd-reply-password',
1956 'src/reply-password/reply-password.c',
1957 include_directories : includes,
1958 link_with : [libshared],
1959 install_rpath : rootlibexecdir,
1961 install_dir : rootlibexecdir)
1963 exe = executable('systemd-tty-ask-password-agent',
1964 'src/tty-ask-password-agent/tty-ask-password-agent.c',
1965 include_directories : includes,
1966 link_with : [libshared],
1967 install_rpath : rootlibexecdir,
1969 install_dir : rootbindir)
1970 public_programs += [exe]
1972 exe = executable('systemd-cgls',
1974 include_directories : includes,
1975 link_with : [libshared],
1976 install_rpath : rootlibexecdir,
1978 public_programs += [exe]
1980 exe = executable('systemd-cgtop',
1981 'src/cgtop/cgtop.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 install_rpath : rootlibexecdir,
1986 public_programs += [exe]
1988 executable('systemd-initctl',
1989 'src/initctl/initctl.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootlibexecdir)
1996 exe = executable('systemd-mount',
1997 'src/mount/mount-tool.c',
1998 include_directories : includes,
1999 link_with : [libshared],
2000 install_rpath : rootlibexecdir,
2002 public_programs += [exe]
2004 meson.add_install_script(meson_make_symlink,
2005 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2007 exe = executable('systemd-run',
2009 include_directories : includes,
2010 link_with : [libshared],
2011 install_rpath : rootlibexecdir,
2013 public_programs += [exe]
2015 exe = executable('systemd-stdio-bridge',
2016 'src/stdio-bridge/stdio-bridge.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 install_rpath : rootlibexecdir,
2021 public_programs += [exe]
2023 exe = executable('busctl',
2024 'src/busctl/busctl.c',
2025 'src/busctl/busctl-introspect.c',
2026 'src/busctl/busctl-introspect.h',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 install_rpath : rootlibexecdir,
2031 public_programs += [exe]
2033 if conf.get('ENABLE_SYSUSERS', false)
2034 exe = executable('systemd-sysusers',
2035 'src/sysusers/sysusers.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 install_rpath : rootlibexecdir,
2040 install_dir : rootbindir)
2041 public_programs += [exe]
2044 if conf.get('ENABLE_TMPFILES', false)
2045 exe = executable('systemd-tmpfiles',
2046 'src/tmpfiles/tmpfiles.c',
2047 include_directories : includes,
2048 link_with : [libshared],
2049 dependencies : [libacl],
2050 install_rpath : rootlibexecdir,
2052 install_dir : rootbindir)
2053 public_programs += [exe]
2056 if conf.get('ENABLE_HWDB', false)
2057 exe = executable('systemd-hwdb',
2059 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2060 include_directories : includes,
2061 link_with : [libudev_internal],
2062 install_rpath : udev_rpath,
2064 install_dir : rootbindir)
2065 public_programs += [exe]
2068 if conf.get('ENABLE_QUOTACHECK', false)
2069 executable('systemd-quotacheck',
2070 'src/quotacheck/quotacheck.c',
2071 include_directories : includes,
2072 link_with : [libshared],
2073 install_rpath : rootlibexecdir,
2075 install_dir : rootlibexecdir)
2078 exe = executable('systemd-socket-proxyd',
2079 'src/socket-proxy/socket-proxyd.c',
2080 include_directories : includes,
2081 link_with : [libshared],
2082 dependencies : [threads],
2083 install_rpath : rootlibexecdir,
2085 install_dir : rootlibexecdir)
2086 public_programs += [exe]
2088 exe = executable('systemd-udevd',
2089 systemd_udevd_sources,
2090 include_directories : includes,
2091 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2092 link_with : [libudev_core,
2095 dependencies : [threads,
2100 install_rpath : udev_rpath,
2102 install_dir : rootlibexecdir)
2103 public_programs += [exe]
2105 exe = executable('udevadm',
2107 include_directories : includes,
2108 link_with : [libudev_core,
2111 dependencies : [threads,
2116 install_rpath : udev_rpath,
2118 install_dir : rootbindir)
2119 public_programs += [exe]
2121 executable('systemd-shutdown',
2122 systemd_shutdown_sources,
2123 include_directories : includes,
2124 link_with : [libshared],
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootlibexecdir)
2129 executable('systemd-update-done',
2130 'src/update-done/update-done.c',
2131 include_directories : includes,
2132 link_with : [libshared],
2133 install_rpath : rootlibexecdir,
2135 install_dir : rootlibexecdir)
2137 executable('systemd-update-utmp',
2138 'src/update-utmp/update-utmp.c',
2139 include_directories : includes,
2140 link_with : [libshared],
2141 dependencies : [libaudit],
2142 install_rpath : rootlibexecdir,
2144 install_dir : rootlibexecdir)
2146 if conf.get('HAVE_KMOD', false)
2147 executable('systemd-modules-load',
2148 'src/modules-load/modules-load.c',
2149 include_directories : includes,
2150 link_with : [libshared],
2151 dependencies : [libkmod],
2152 install_rpath : rootlibexecdir,
2154 install_dir : rootlibexecdir)
2156 meson.add_install_script('sh', '-c',
2157 mkdir_p.format(modulesloaddir))
2158 meson.add_install_script('sh', '-c',
2159 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2162 exe = executable('systemd-nspawn',
2163 systemd_nspawn_sources,
2164 'src/core/mount-setup.c', # FIXME: use a variable?
2165 'src/core/mount-setup.h',
2166 'src/core/loopback-setup.c',
2167 'src/core/loopback-setup.h',
2168 include_directories : [includes, include_directories('src/nspawn')],
2169 link_with : [libshared],
2170 dependencies : [libacl,
2174 install_rpath : rootlibexecdir,
2176 public_programs += [exe]
2178 if conf.get('ENABLE_NETWORKD', false)
2179 executable('systemd-networkd',
2180 systemd_networkd_sources,
2181 include_directories : includes,
2182 link_with : [libnetworkd_core,
2186 dependencies : [threads],
2187 install_rpath : rootlibexecdir,
2189 install_dir : rootlibexecdir)
2191 executable('systemd-networkd-wait-online',
2192 systemd_networkd_wait_online_sources,
2193 include_directories : includes,
2194 link_with : [libnetworkd_core,
2196 install_rpath : rootlibexecdir,
2198 install_dir : rootlibexecdir)
2201 exe = executable('networkctl',
2203 include_directories : includes,
2204 link_with : [libsystemd_network,
2206 install_rpath : rootlibexecdir,
2208 install_dir : rootbindir)
2209 public_programs += [exe]
2211 ############################################################
2213 foreach tuple : tests
2215 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2216 dependencies = tuple[2]
2217 condition = tuple.length() >= 4 ? tuple[3] : ''
2218 type = tuple.length() >= 5 ? tuple[4] : ''
2219 defs = tuple.length() >= 6 ? tuple[5] : []
2220 incs = tuple.length() >= 7 ? tuple[6] : includes
2223 name = sources[0].split('/')[-1].split('.')[0]
2224 if type.startswith('timeout=')
2225 timeout = type.split('=')[1].to_int()
2229 if condition == '' or conf.get(condition, false)
2233 include_directories : incs,
2234 link_with : link_with,
2235 dependencies : dependencies,
2237 install_rpath : rootlibexecdir,
2238 install : install_tests,
2239 install_dir : join_paths(testsdir, type))
2242 message('@0@ is a manual test'.format(name))
2243 elif type == 'unsafe' and want_tests != 'unsafe'
2244 message('@0@ is an unsafe test'.format(name))
2251 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2255 test_libsystemd_sym = executable(
2256 'test-libsystemd-sym',
2257 test_libsystemd_sym_c,
2258 include_directories : includes,
2259 link_with : [libsystemd],
2260 install : install_tests,
2261 install_dir : testsdir)
2262 test('test-libsystemd-sym',
2263 test_libsystemd_sym)
2265 test_libudev_sym = executable(
2268 include_directories : includes,
2269 c_args : ['-Wno-deprecated-declarations'],
2270 link_with : [libudev],
2271 install : install_tests,
2272 install_dir : testsdir)
2273 test('test-libudev-sym',
2276 ############################################################
2278 make_directive_index_py = find_program('tools/make-directive-index.py')
2279 make_man_index_py = find_program('tools/make-man-index.py')
2280 xml_helper_py = find_program('tools/xml_helper.py')
2281 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2285 subdir('sysusers.d')
2286 subdir('tmpfiles.d')
2291 subdir('shell-completion/bash')
2292 subdir('shell-completion/zsh')
2293 subdir('docs/sysvinit')
2294 subdir('docs/var-log')
2296 # FIXME: figure out if the warning is true:
2297 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2298 install_subdir('factory/etc',
2299 install_dir : factorydir)
2302 install_data('xorg/50-systemd-user.sh',
2303 install_dir : xinitrcdir)
2304 install_data('system-preset/90-systemd.preset',
2305 install_dir : systempresetdir)
2306 install_data('README',
2313 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2314 install_dir : docdir)
2316 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2317 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2319 ############################################################
2321 meson_check_help = find_program('tools/meson-check-help.sh')
2323 foreach exec : public_programs
2324 name = exec.full_path().split('/')[-1]
2325 test('check-help-' + name,
2327 args : [exec.full_path()])
2330 ############################################################
2333 all_files = run_command(
2335 ['--git-dir=@0@/.git'.format(meson.source_root()),
2338 all_files = files(all_files.stdout().split())
2343 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2347 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2351 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2354 command : [meson_git_contrib_sh])
2358 git_head = run_command(
2360 ['--git-dir=@0@/.git'.format(meson.source_root()),
2361 'rev-parse', 'HEAD']).stdout().strip()
2362 git_head_short = run_command(
2364 ['--git-dir=@0@/.git'.format(meson.source_root()),
2365 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2369 command : ['git', 'archive',
2370 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2372 '--prefix', 'systemd-@0@/'.format(git_head),
2376 ############################################################
2379 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2381 'prefix: @0@'.format(prefixdir),
2382 'rootprefix: @0@'.format(rootprefixdir),
2383 'sysconf dir: @0@'.format(sysconfdir),
2384 'includedir: @0@'.format(includedir),
2385 'lib dir: @0@'.format(libdir),
2386 'rootlib dir: @0@'.format(rootlibdir),
2387 'SysV init scripts: @0@'.format(sysvinit_path),
2388 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2389 'PAM modules dir: @0@'.format(pamlibdir),
2390 'PAM configuration dir: @0@'.format(pamconfdir),
2391 'RPM macros dir: @0@'.format(rpmmacrosdir),
2392 'D-Bus policy dir: @0@'.format(dbuspolicydir),
2393 'D-Bus session dir: @0@'.format(dbussessionservicedir),
2394 'D-Bus system dir: @0@'.format(dbussystemservicedir),
2395 'bash completions dir: @0@'.format(bashcompletiondir),
2396 'zsh completions dir: @0@'.format(zshcompletiondir),
2397 'extra start script: @0@'.format(get_option('rc-local')),
2398 'extra stop script: @0@'.format(get_option('halt-local')),
2399 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2400 get_option('debug-tty')),
2401 'TTY GID: @0@'.format(tty_gid),
2402 'maximum system UID: @0@'.format(system_uid_max),
2403 'maximum system GID: @0@'.format(system_gid_max),
2404 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2405 'certificate root: @0@'.format(get_option('certificate-root')),
2406 'support URL: @0@'.format(support_url),
2407 'nobody user name: @0@'.format(get_option('nobody-user')),
2408 'nobody group name: @0@'.format(get_option('nobody-group')),
2409 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2411 'default DNSSEC mode: @0@'.format(default_dnssec),
2412 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2413 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2415 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2416 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2418 'default DNS servers: @0@'.format(alt_dns_servers),
2419 'default NTP servers: @0@'.format(alt_ntp_servers)]
2421 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2422 '@@0@'.format(time_epoch)).stdout().strip()
2424 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2427 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2428 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2429 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2431 if conf.get('ENABLE_EFI', false)
2433 'efi arch: @0@'.format(efi_arch)]
2437 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2438 'EFI CC @0@'.format(efi_cc),
2439 'EFI libdir: @0@'.format(efi_libdir),
2440 'EFI ldsdir: @0@'.format(efi_ldsdir),
2441 'EFI includedir: @0@'.format(efi_incdir)]
2494 ['legacy pkla', install_polkit_pkla],
2496 ['gnu-efi', have_gnu_efi],
2502 ['nss-myhostname', conf.get('HAVE_MYHOSTNAME', false)],
2505 ['man pages', want_man],
2506 ['html pages', want_html],
2507 ['man page indices', want_man and have_lxml],
2508 ['split /usr', conf.get('HAVE_SPLIT_USR', false)],
2513 ['adm group', get_option('adm-group')],
2514 ['wheel group', get_option('wheel-group')],
2517 ['debug mmap cache'],
2520 cond = tuple.get(1, '')
2522 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2523 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2524 cond = conf.get(ident1, false) or conf.get(ident2, false)
2529 missing += [tuple[0]]
2535 'enabled features: @0@'.format(', '.join(found)),
2537 'disabled features: @0@'.format(', '.join(missing)),
2539 message('\n '.join(status))