3 project('systemd', 'c',
12 meson_version : '>= 0.39.1',
15 # We need the same data in three different formats, ugh!
16 # Also, for hysterical reasons, we use different variable
17 # names, sometimes. Not all variables are included in every
19 conf = configuration_data()
20 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
21 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
23 substs = configuration_data()
24 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
25 substs.set('PACKAGE_VERSION', meson.project_version())
29 #####################################################################
31 if get_option('split-usr')
32 conf.set('HAVE_SPLIT_USR', 1)
35 rootprefixdir = '/usr'
38 sysvinit_path = get_option('sysvinit-path')
39 sysvrcnd_path = get_option('sysvrcnd-path')
40 if sysvinit_path != '' or sysvrcnd_path != ''
41 conf.set('HAVE_SYSV_COMPAT', 1,
42 description : 'SysV init scripts and rcN.d links are supported')
45 # join_paths ignore the preceding arguments if an absolute component is
46 # encountered, so this should canonicalize various paths when they are
47 # absolute or relative.
48 prefixdir = get_option('prefix')
49 if not prefixdir.startswith('/')
50 error('Prefix is not absolute: "@0@"'.format(prefixdir))
52 bindir = join_paths(prefixdir, get_option('bindir'))
53 libdir = join_paths(prefixdir, get_option('libdir'))
54 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
55 includedir = join_paths(prefixdir, get_option('includedir'))
56 datadir = join_paths(prefixdir, get_option('datadir'))
57 localstatedir = join_paths('/', get_option('localstatedir'))
59 rootbindir = join_paths(rootprefixdir, 'bin')
60 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
62 rootlibdir = get_option('rootlibdir')
64 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
67 # Dirs of external packages
68 pkgconfigdatadir = datadir + '/pkgconfig'
69 pkgconfiglibdir = libdir + '/pkgconfig'
70 polkitpolicydir = datadir + '/polkit-1/actions'
71 polkitrulesdir = datadir + '/polkit-1/rules.d'
72 polkitpkladir = localstatedir + '/lib/polkit-1/localauthority/10-vendor.d'
73 varlogdir = localstatedir + '/log'
74 xinitrcdir = sysconfdir + '/X11/xinit/xinitrc.d'
75 rpmmacrosdir = get_option('rpmmacrosdir')
78 pkgdatadir = datadir + '/systemd'
79 environmentdir = prefixdir + '/lib/environment.d'
80 pkgsysconfdir = sysconfdir + '/systemd'
81 userunitdir = prefixdir + '/lib/systemd/user'
82 userpresetdir = prefixdir + '/lib/systemd/user-preset'
83 tmpfilesdir = prefixdir + '/lib/tmpfiles.d'
84 sysusersdir = prefixdir + '/lib/sysusers.d'
85 sysctldir = prefixdir + '/lib/sysctl.d'
86 binfmtdir = prefixdir + '/lib/binfmt.d'
87 modulesloaddir = prefixdir + '/lib/modules-load.d'
88 networkdir = rootprefixdir + '/lib/systemd/network'
89 pkgincludedir = includedir + '/systemd'
90 systemgeneratordir = rootlibexecdir + '/system-generators'
91 usergeneratordir = prefixdir + '/lib/systemd/user-generators'
92 systemenvgeneratordir = prefixdir + '/lib/systemd/system-environment-generators'
93 userenvgeneratordir = prefixdir + '/lib/systemd/user-environment-generators'
94 systemshutdowndir = rootlibexecdir + '/system-shutdown'
95 systemsleepdir = rootlibexecdir + '/system-sleep'
96 systemunitdir = rootprefixdir + '/lib/systemd/system'
97 systempresetdir = rootprefixdir + '/lib/systemd/system-preset'
98 udevlibexecdir = rootprefixdir + '/lib/udev'
99 udevhomedir = udevlibexecdir + ''
100 udevrulesdir = udevlibexecdir + '/rules.d'
101 udevhwdbdir = udevlibexecdir + '/hwdb.d'
102 catalogdir = prefixdir + '/lib/systemd/catalog'
103 kernelinstalldir = prefixdir + '/lib/kernel/install.d'
104 factorydir = datadir + '/factory'
105 docdir = datadir + '/doc/systemd'
106 bootlibdir = prefixdir + '/lib/systemd/boot/efi'
107 testsdir = prefixdir + '/lib/systemd/tests'
108 systemdstatedir = localstatedir + '/lib/systemd'
109 catalogstatedir = systemdstatedir + '/catalog'
111 dbuspolicydir = get_option('dbuspolicydir')
112 if dbuspolicydir == ''
113 dbuspolicydir = datadir + '/dbus-1/system.d'
116 dbussessionservicedir = get_option('dbussessionservicedir')
117 if dbussessionservicedir == ''
118 dbussessionservicedir = datadir + '/dbus-1/services'
121 dbussystemservicedir = get_option('dbussystemservicedir')
122 if dbussystemservicedir == ''
123 dbussystemservicedir = datadir + '/dbus-1/system-services'
126 pamlibdir = get_option('pamlibdir')
128 pamlibdir = rootlibdir + '/security'
131 pamconfdir = get_option('pamconfdir')
133 pamconfdir = sysconfdir + '/pam.d'
136 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
137 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', pkgsysconfdir + '/system')
138 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
139 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
140 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
141 conf.set_quoted('USER_CONFIG_UNIT_PATH', pkgsysconfdir + '/user')
142 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
143 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
144 conf.set_quoted('CATALOG_DATABASE', catalogstatedir + '/database')
145 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', rootlibexecdir + '/systemd-cgroups-agent')
146 conf.set_quoted('SYSTEMD_BINARY_PATH', rootlibexecdir + '/systemd')
147 conf.set_quoted('SYSTEMD_FSCK_PATH', rootlibexecdir + '/systemd-fsck')
148 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', rootlibexecdir + '/systemd-shutdown')
149 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', rootlibexecdir + '/systemd-sleep')
150 conf.set_quoted('SYSTEMCTL_BINARY_PATH', rootbindir + '/systemctl')
151 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', rootbindir + '/systemd-tty-ask-password-agent')
152 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', bindir + '/systemd-stdio-bridge')
153 conf.set_quoted('ROOTPREFIX', rootprefixdir)
154 conf.set_quoted('RANDOM_SEED_DIR', localstatedir + '/lib/systemd/')
155 conf.set_quoted('RANDOM_SEED', localstatedir + '/lib/systemd/random-seed')
156 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', rootlibexecdir + '/systemd-cryptsetup')
157 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
158 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
159 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
160 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
161 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
162 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
163 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', pkgdatadir + '/kbd-model-map')
164 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', pkgdatadir + '/language-fallback-map')
165 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
166 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', bindir + '/pkttyagent')
167 conf.set_quoted('LIBDIR', libdir)
168 conf.set_quoted('ROOTLIBDIR', rootlibdir)
169 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
170 conf.set_quoted('BOOTLIBDIR', bootlibdir)
171 conf.set_quoted('SYSTEMD_PULL_PATH', rootlibexecdir + '/systemd-pull')
172 conf.set_quoted('SYSTEMD_IMPORT_PATH', rootlibexecdir + '/systemd-import')
173 conf.set_quoted('SYSTEMD_EXPORT_PATH', rootlibexecdir + '/systemd-export')
174 conf.set_quoted('VENDOR_KEYRING_PATH', rootlibexecdir + '/import-pubring.gpg')
175 conf.set_quoted('USER_KEYRING_PATH', pkgsysconfdir + '/import-pubring.gpg')
176 conf.set_quoted('DOCUMENT_ROOT', pkgdatadir + '/gatewayd')
178 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
179 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
181 substs.set('prefix', prefixdir)
182 substs.set('pkgsysconfdir', pkgsysconfdir)
183 substs.set('rootlibexecdir', rootlibexecdir)
184 substs.set('systemunitdir', systemunitdir)
185 substs.set('userunitdir', userunitdir)
186 substs.set('systempresetdir', systempresetdir)
187 substs.set('userpresetdir', userpresetdir)
188 substs.set('udevhwdbdir', udevhwdbdir)
189 substs.set('udevrulesdir', udevrulesdir)
190 substs.set('catalogdir', catalogdir)
191 substs.set('tmpfilesdir', tmpfilesdir)
192 substs.set('sysusersdir', sysusersdir)
193 substs.set('sysctldir', sysctldir)
194 substs.set('binfmtdir', binfmtdir)
195 substs.set('modulesloaddir', modulesloaddir)
196 substs.set('systemgeneratordir', systemgeneratordir)
197 substs.set('usergeneratordir', usergeneratordir)
198 substs.set('systemenvgeneratordir', systemenvgeneratordir)
199 substs.set('userenvgeneratordir', userenvgeneratordir)
200 substs.set('systemshutdowndir', systemshutdowndir)
201 substs.set('systemsleepdir', systemsleepdir)
202 substs.set('SYSTEMCTL', rootbindir + '/systemctl')
204 #####################################################################
206 cc = meson.get_compiler('c')
207 pkgconfig = import('pkgconfig')
209 foreach arg : ['-Wundef',
211 '-Wmissing-include-dirs',
212 '-Wold-style-definition',
215 '-Wdeclaration-after-statement',
217 '-Wsuggest-attribute=noreturn',
218 '-Werror=missing-prototypes',
219 '-Werror=implicit-function-declaration',
220 '-Werror=missing-declarations',
221 '-Werror=return-type',
222 '-Werror=incompatible-pointer-types',
224 '-Wstrict-prototypes',
226 '-Wmissing-noreturn',
229 '-Wstrict-aliasing=2',
231 '-Wno-unused-parameter',
232 '-Wno-missing-field-initializers',
233 '-Wno-unused-result',
234 '-Wno-format-signedness',
240 '-fdiagnostics-show-option',
241 '-fno-strict-aliasing',
242 '-fvisibility=hidden',
244 '-fstack-protector-strong',
246 '--param=ssp-buffer-size=4',
248 if cc.has_argument(arg)
249 add_project_arguments(arg, language : 'c')
255 #include <inttypes.h>
256 typedef uint64_t usec_t;
257 usec_t now(clockid_t clock);
264 add_project_arguments('-Werror=shadow', language : 'c')
267 if cc.get_id() == 'clang'
268 foreach arg : ['-Wno-typedef-redefinition',
269 '-Wno-gnu-variable-sized-type-not-at-end',
271 if cc.has_argument(arg)
272 add_project_arguments(arg, language : 'c')
277 # --as-needed and --no-undefined are provided by meson by default,
278 # run mesonconf to see what is enabled
279 foreach arg : ['-Wl,-z,relro',
284 if cc.has_argument(arg)
285 add_project_link_arguments(arg, language : 'c')
289 #####################################################################
290 # compilation result tests
292 conf.set('_GNU_SOURCE', 1)
293 conf.set('__SANE_USERSPACE_TYPES__', 1)
295 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
296 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
297 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
298 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
299 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
300 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
301 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
305 #include <linux/ethtool.h>
307 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
309 foreach decl : ['char16_t',
312 'struct ethtool_link_settings',
314 if cc.sizeof(decl, prefix : decl_headers) > 0
315 # We get -1 if the size cannot be determined
316 conf.set('HAVE_' + decl.underscorify().to_upper(), 1)
320 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
321 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
322 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
323 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
324 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
325 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
326 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
327 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
328 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
329 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
330 # if_tunnel.h is buggy and cannot be included on its own
331 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
332 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
333 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
334 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
335 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
336 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
337 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
338 ['NDA_IFINDEX', 'linux/neighbour.h'],
339 ['IFA_FLAGS', 'linux/if_addr.h'],
340 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
342 prefix = decl.length() > 2 ? decl[2] : ''
343 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
344 conf.set10('HAVE_DECL_' + decl[0], have)
348 foreach ident : ['secure_getenv', '__secure_getenv']
349 if not skip and cc.has_function(ident)
350 conf.set('HAVE_' + ident.to_upper(), 1)
356 ['memfd_create', '''#include <sys/memfd.h>'''],
357 ['gettid', '''#include <sys/types.h>'''],
358 ['pivot_root', '''#include <stdlib.h>'''], # no known header declares pivot_root
359 ['name_to_handle_at', '''#define _GNU_SOURCE
360 #include <sys/types.h>
361 #include <sys/stat.h>
362 #include <fcntl.h>'''],
363 ['setns', '''#define _GNU_SOURCE
364 #include <sched.h>'''],
365 ['getrandom', '''#include <sys/random.h>'''],
366 ['renameat2', '''#include <stdio.h>'''],
367 ['kcmp', '''#include <linux/kcmp.h>'''],
368 ['keyctl', '''#include <sys/types.h>
369 #include <keyutils.h>'''],
370 ['copy_file_range', '''#include <sys/syscall.h>
371 #include <unistd.h>'''],
372 ['explicit_bzero' , '''#include <strings.h>'''],
375 have = cc.has_function(ident[0], prefix : ident[1])
376 conf.set10('HAVE_DECL_' + ident[0].to_upper(), have)
379 #####################################################################
381 sed = find_program('sed')
382 grep = find_program('grep')
383 awk = find_program('awk')
384 m4 = find_program('/usr/bin/m4')
385 stat = find_program('stat')
386 git = find_program('git', required : false)
387 etags = find_program('etags', required : false)
389 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
390 mkdir_p = 'mkdir -p $DESTDIR/@0@'
392 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
393 # /usr/sbin, /sbin, and fall back to the default from middle column.
394 progs = [['telinit', '/lib/sysvinit/telinit'],
395 ['quotaon', '/usr/sbin/quotaon' ],
396 ['quotacheck', '/usr/sbin/quotacheck' ],
397 ['kill', '/usr/bin/kill' ],
398 ['kmod', '/usr/bin/kmod' ],
399 ['kexec', '/usr/sbin/kexec' ],
400 ['sulogin', '/usr/sbin/sulogin' ],
401 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
402 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
403 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
404 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
407 path = get_option(prog[0] + '-path')
409 message('Using @1@ for @0@'.format(prog[0], path))
411 exe = find_program(prog[0], '/usr/sbin/' + prog[0], '/sbin/' + prog[0], required: false)
412 path = exe.found() ? exe.path() : prog[1]
414 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
415 conf.set_quoted(name, path)
416 substs.set(name, path)
419 # TODO: add ln --relative check
420 # AS_IF([! ln --relative --help > /dev/null 2>&1], [AC_MSG_ERROR([*** ln doesn't support --relative ***])])
422 ############################################################
424 gperf = find_program('gperf')
426 gperf_test_format = '''
428 const char * in_word_set(const char *, @0@);
431 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
432 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
433 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
434 if cc.compiles(gperf_test)
435 gperf_len_type = 'size_t'
437 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
438 if cc.compiles(gperf_test)
439 gperf_len_type = 'unsigned'
441 error('unable to determine gperf len type')
444 message('gperf len type is @0@'.format(gperf_len_type))
445 conf.set('GPERF_LEN_TYPE', gperf_len_type, description : 'The type of gperf "len" parameter')
447 ############################################################
449 if not cc.has_header('sys/capability.h')
450 error('POSIX caps headers not found')
452 foreach header : ['linux/btrfs.h',
454 'linux/vm_sockets.h',
455 'valgrind/memcheck.h',
456 'valgrind/valgrind.h',
458 if cc.has_header(header)
459 conf.set('HAVE_' + header.underscorify().to_upper(), 1)
463 ############################################################
465 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
467 default_hierarchy = get_option('default-hierarchy')
468 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
469 description : 'default cgroup hierarchy as string')
470 if default_hierarchy == 'legacy'
471 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
472 elif default_hierarchy == 'hybrid'
473 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
475 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
478 time_epoch = get_option('time-epoch')
481 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
483 time_epoch = time_epoch.to_int()
484 conf.set('TIME_EPOCH', time_epoch)
486 system_uid_max = get_option('system-uid-max')
487 if system_uid_max == ''
488 system_uid_max = run_command(
490 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
491 '/etc/login.defs').stdout()
493 system_uid_max = system_uid_max.to_int()
494 conf.set('SYSTEM_UID_MAX', system_uid_max)
495 substs.set('systemuidmax', system_uid_max)
496 message('Maximum system UID is @0@'.format(system_uid_max))
498 conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
499 conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
501 system_gid_max = get_option('system-gid-max')
502 if system_gid_max == ''
503 system_gid_max = run_command(
505 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
506 '/etc/login.defs').stdout()
508 system_gid_max = system_gid_max.to_int()
509 conf.set('SYSTEM_GID_MAX', system_gid_max)
510 substs.set('systemgidmax', system_gid_max)
511 message('Maximum system GID is @0@'.format(system_gid_max))
513 tty_gid = get_option('tty-gid')
514 conf.set('TTY_GID', tty_gid)
515 m4_defines += ['-DTTY_GID=' + tty_gid]
517 if get_option('adm-group')
518 m4_defines += ['-DENABLE_ADM_GROUP']
521 if get_option('wheel-group')
522 m4_defines += ['-DENABLE_WHEEL_GROUP']
525 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
527 conf.set10('KILL_USER_PROCESSES', get_option('default-kill-user-processes'))
529 default_dnssec = get_option('default-dnssec')
530 conf.set('DEFAULT_DNSSEC_MODE',
531 'DNSSEC_' + default_dnssec.underscorify().to_upper())
533 conf.set_quoted('DNS_SERVERS', get_option('dns-servers'))
535 conf.set_quoted('NTP_SERVERS', get_option('ntp-servers'))
537 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
539 #####################################################################
541 threads = dependency('threads')
542 librt = cc.find_library('rt')
543 libm = cc.find_library('m')
544 libdl = cc.find_library('dl')
545 libcrypt = cc.find_library('crypt')
547 libcap = dependency('libcap')
548 libmount = dependency('mount',
551 want_seccomp = get_option('seccomp')
552 if want_seccomp != 'no'
553 libseccomp = dependency('libseccomp',
554 required : want_seccomp == 'yes')
555 if libseccomp.found()
556 conf.set('HAVE_SECCOMP', 1)
557 m4_defines += ['-DHAVE_SECCOMP']
563 want_selinux = get_option('selinux')
564 if want_selinux != 'no'
565 libselinux = dependency('libselinux',
566 version : '>= 2.1.9',
567 required : want_selinux == 'yes')
568 if libselinux.found()
569 conf.set('HAVE_SELINUX', 1)
570 m4_defines += ['-DHAVE_SELINUX']
576 want_apparmor = get_option('apparmor')
577 if want_apparmor != 'no'
578 libapparmor = dependency('libapparmor',
579 required : want_apparmor == 'yes')
580 if libapparmor.found()
581 conf.set('HAVE_APPARMOR', 1)
582 m4_defines += ['-DHAVE_APPARMOR']
588 want_smack = get_option('smack')
589 if want_smack != 'no'
590 libsmack = dependency('libsmack',
591 required : want_smack == 'yes')
593 conf.set('HAVE_SMACK', 1)
594 m4_defines += ['-DHAVE_SMACK']
600 smack_run_label = get_option('smack-run-label')
601 if smack_run_label != ''
602 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
603 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
606 want_audit = get_option('audit')
607 if want_audit != 'no'
608 libaudit = dependency('audit', required : want_audit == 'yes')
610 conf.set('HAVE_AUDIT', 1)
616 want_blkid = get_option('blkid')
617 if want_blkid != 'no'
618 libblkid = dependency('blkid', required : want_blkid == 'yes')
620 conf.set('HAVE_BLKID', 1)
626 want_kmod = get_option('kmod')
628 libkmod = dependency('libkmod',
630 required : want_kmod == 'yes')
632 conf.set('HAVE_KMOD', 1)
638 want_pam = get_option('pam')
640 libpam = cc.find_library('pam', required : want_pam == 'yes')
641 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'yes')
642 if libpam.found() and libpam_misc.found()
643 conf.set('HAVE_PAM', 1)
644 m4_defines += ['-DHAVE_PAM']
651 want_microhttpd = get_option('microhttpd')
652 if want_microhttpd != 'no'
653 libmicrohttpd = dependency('libmicrohttpd',
654 version : '>= 0.9.33',
655 required : want_microhttpd == 'yes')
656 if libmicrohttpd.found()
657 conf.set('HAVE_MICROHTTPD', 1)
658 m4_defines += ['-DHAVE_MICROHTTPD']
664 want_libcryptsetup = get_option('libcryptsetup')
665 if want_libcryptsetup != 'no'
666 libcryptsetup = dependency('libcryptsetup',
667 version : '>= 1.6.0',
668 required : want_libcryptsetup == 'yes')
669 if libcryptsetup.found()
670 conf.set('HAVE_LIBCRYPTSETUP', 1)
676 want_libcurl = get_option('libcurl')
677 if want_libcurl != 'no'
678 libcurl = dependency('libcurl',
679 version : '>= 7.32.0',
680 required : want_libcurl == 'yes')
682 conf.set('HAVE_LIBCURL', 1)
683 m4_defines += ['-DHAVE_LIBCURL']
689 want_libidn = get_option('libidn')
690 if want_libidn != 'no'
691 libidn = dependency('libidn',
692 required : want_libidn == 'yes')
694 conf.set('HAVE_LIBIDN', 1)
695 m4_defines += ['-DHAVE_LIBIDN']
701 want_libiptc = get_option('libiptc')
702 if want_libiptc != 'no'
703 libiptc = dependency('libiptc',
704 required : want_libiptc == 'yes')
706 conf.set('HAVE_LIBIPTC', 1)
707 m4_defines += ['-DHAVE_LIBIPTC']
713 want_qrencode = get_option('qrencode')
714 if want_qrencode != 'no'
715 libqrencode = dependency('libqrencode',
716 required : want_qrencode == 'yes')
717 if libqrencode.found()
718 conf.set('HAVE_QRENCODE', 1)
724 want_gnutls = get_option('gnutls')
725 if want_gnutls != 'no'
726 libgnutls = dependency('gnutls',
727 version : '>= 3.1.4',
728 required : want_gnutls == 'yes')
730 conf.set('HAVE_GNUTLS', 1)
736 want_elfutils = get_option('elfutils')
737 if want_elfutils != 'no'
738 libdw = dependency('libdw',
739 required : want_elfutils == 'yes')
741 conf.set('HAVE_ELFUTILS', 1)
747 want_zlib = get_option('zlib')
749 libz = dependency('zlib',
750 required : want_zlib == 'yes')
752 conf.set('HAVE_ZLIB', 1)
758 want_bzip2 = get_option('bzip2')
759 if want_bzip2 != 'no'
760 libbzip2 = cc.find_library('bz2',
761 required : want_bzip2 == 'yes')
763 conf.set('HAVE_BZIP2', 1)
769 want_xz = get_option('xz')
771 libxz = dependency('liblzma',
772 required : want_xz == 'yes')
774 conf.set('HAVE_XZ', 1)
780 want_lz4 = get_option('lz4')
782 liblz4 = dependency('liblz4',
783 required : want_lz4 == 'yes')
785 conf.set('HAVE_LZ4', 1)
791 libacl = cc.find_library('acl', required : false)
793 conf.set('HAVE_ACL', 1)
794 m4_defines += ['-DHAVE_ACL']
797 want_glib = get_option('glib')
799 libglib = dependency('glib-2.0',
800 version : '>= 2.22.0',
801 required : want_glib == 'yes')
802 libgobject = dependency('gobject-2.0',
803 version : '>= 2.22.0',
804 required : want_glib == 'yes')
805 libgio = dependency('gio-2.0',
806 required : want_glib == 'yes')
807 if libglib.found() and libgobject.found() and libgio.found()
808 conf.set('HAVE_GLIB', 1)
816 want_dbus = get_option('dbus')
818 libdbus = dependency('dbus-1',
819 version : '>= 1.3.2',
820 required : want_dbus == 'yes')
822 conf.set('HAVE_DBUS', 1)
828 want_libgcrypt = get_option('libgcrypt')
829 if want_libgcrypt != 'no'
830 libgcrypt = cc.find_library('gcrypt', required : want_libgcrypt == 'yes')
832 conf.set('HAVE_LIBGCRYPT', 1)
838 want_importd = get_option('importd')
839 if want_importd != 'no'
840 have_deps = (conf.get('HAVE_LIBCURL', 0) == 1 and
841 conf.get('HAVE_ZLIB', 0) == 1 and
842 conf.get('HAVE_BZIP2', 0) == 1 and
843 conf.get('HAVE_XZ', 0) == 1 and
844 conf.get('HAVE_LZ4', 0) == 1)
846 conf.set('ENABLE_IMPORTD', 1)
847 elif want_importd == 'yes'
848 error('importd support was requested, but dependencies are not available')
852 want_remote = get_option('remote')
853 if want_remote != 'no'
854 have_deps = [conf.get('HAVE_MICROHTTPD', 0) == 1,
855 conf.get('HAVE_LIBCURL', 0) == 1]
856 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
857 # it's possible to build one without the other. Complain only if
858 # support was explictly requested. The auxiliary files like sysusers
859 # config should be installed when any of the programs are built.
860 if want_remote == 'yes' and not (have_deps[0] and have_deps[1])
861 error('remote support was requested, but dependencies are not available')
863 if have_deps[0] or have_deps[1]
864 conf.set('ENABLE_REMOTE', 1)
868 foreach pair : [['utmp', 'HAVE_UTMP'],
869 ['hibernate', 'ENABLE_HIBERNATE'],
870 ['environment-d', 'ENABLE_ENVIRONMENT_D'],
871 ['binfmt', 'ENABLE_BINFMT'],
872 ['coredump', 'ENABLE_COREDUMP'],
873 ['resolve', 'ENABLE_RESOLVED'],
874 ['logind', 'ENABLE_LOGIND'],
875 ['hostnamed', 'ENABLE_HOSTNAMED'],
876 ['localed', 'ENABLE_LOCALED'],
877 ['machined', 'ENABLE_MACHINED'],
878 ['networkd', 'ENABLE_NETWORKD'],
879 ['timedated', 'ENABLE_TIMEDATED'],
880 ['timesyncd', 'ENABLE_TIMESYNCD'],
881 ['myhostname', 'HAVE_MYHOSTNAME'],
882 ['firstboot', 'ENABLE_FIRSTBOOT'],
883 ['randomseed', 'ENABLE_RANDOMSEED'],
884 ['backlight', 'ENABLE_BACKLIGHT'],
885 ['vconsole', 'ENABLE_VCONSOLE'],
886 ['quotacheck', 'ENABLE_QUOTACHECK'],
887 ['sysusers', 'ENABLE_SYSUSERS'],
888 ['tmpfiles', 'ENABLE_TMPFILES'],
889 ['hwdb', 'ENABLE_HWDB'],
890 ['rfkill', 'ENABLE_RFKILL'],
891 ['ldconfig', 'ENABLE_LDCONFIG'],
894 if get_option(pair[0])
899 want_tests = get_option('tests')
900 install_tests = get_option('install-tests')
903 #####################################################################
906 efi_arch = host_machine.cpu_family() # TODO: check this works at all
907 if efi_arch == 'ia32'
908 EFI_MACHINE_TYPE_NAME = 'ia32'
909 elif efi_arch == 'x86_64'
910 EFI_MACHINE_TYPE_NAME = 'x64'
911 elif efi_arch == 'aarch64'
912 EFI_MACHINE_TYPE_NAME = 'x64'
914 EFI_MACHINE_TYPE_NAME = efi_arch
917 conf.set('ENABLE_EFI', 1)
918 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
921 #####################################################################
923 config_h = configure_file(
925 configuration : conf)
927 includes = include_directories('src/basic',
937 'src/libsystemd/sd-bus',
938 'src/libsystemd/sd-device',
939 'src/libsystemd/sd-hwdb',
940 'src/libsystemd/sd-id128',
941 'src/libsystemd/sd-netlink',
942 'src/libsystemd/sd-network',
943 'src/libsystemd-network',
946 add_project_arguments('-include', 'config.h', language : 'c')
948 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
949 'src/shared/gcrypt-util.c')
953 subdir('src/systemd')
955 subdir('src/libsystemd')
956 subdir('src/libsystemd-network')
957 subdir('src/journal')
960 libjournal_core = static_library(
962 libjournal_core_sources,
964 include_directories : includes,
965 link_with : [libbasic,
967 libsystemd_journal_internal],
970 version_script_arg = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
971 libsystemd = shared_library(
973 libsystemd_internal_sources,
975 include_directories : includes,
976 link_args : ['-shared',
977 '-Wl,--version-script=' + version_script_arg],
978 link_with : [libbasic,
980 libsystemd_journal_internal],
981 dependencies : [threads],
982 link_depends : libsystemd_sym,
984 install_dir : rootlibdir)
986 ############################################################
988 foreach tuple : [['myhostname', 'HAVE_MYHOSTNAME', []],
990 ['mymachines', 'ENABLE_MACHINED', []],
991 ['resolve', 'ENABLE_RESOLVED', [libdl]]]
993 condition = tuple[1] == '' or conf.get(tuple[1], 0) == 1
996 extra_deps = tuple[2]
998 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
999 version_script_arg = join_paths(meson.current_source_dir(), sym)
1003 'src/nss-@0@/nss-@0@.c'.format(module),
1005 include_directories : includes,
1006 link_args : ['-shared',
1007 '-Wl,--version-script=' + version_script_arg,
1009 link_with : [libsystemd_internal,
1011 dependencies : [threads,
1012 librt] + extra_deps,
1015 install_dir : rootlibdir)
1017 # We cannot use shared_module because it does not support version suffix.
1018 # Unfortunately shared_library insists on creating the symlink…
1019 meson.add_install_script('sh', '-c',
1020 'rm $DESTDIR@0@/libnss_@1@.so'
1021 .format(rootlibdir, module))
1025 ############################################################
1027 subdir('src/libudev')
1028 subdir('src/shared')
1031 subdir('src/network')
1033 subdir('src/analyze')
1034 subdir('src/journal-remote')
1035 subdir('src/coredump')
1036 subdir('src/hostname')
1037 subdir('src/import')
1038 subdir('src/kernel-install')
1039 subdir('src/locale')
1040 subdir('src/machine')
1041 subdir('src/nspawn')
1042 subdir('src/resolve')
1043 subdir('src/timedate')
1044 subdir('src/timesync')
1045 subdir('src/vconsole')
1046 subdir('src/sulogin-shell')
1050 executable('systemd',
1052 include_directories : includes,
1053 link_with : [libcore,
1055 dependencies : [threads,
1062 install_dir : rootlibexecdir)
1064 executable('systemd-analyze',
1065 systemd_analyze_sources,
1066 include_directories : includes,
1067 link_with : [libcore,
1069 dependencies : [threads,
1077 executable('systemd-journald',
1078 systemd_journald_sources,
1079 include_directories : includes,
1080 link_with : [libsystemd_journal_internal,
1084 dependencies : [threads,
1088 install_dir : rootlibexecdir)
1090 executable('systemd-cat',
1091 systemd_cat_sources,
1092 include_directories : includes,
1093 link_with : [libjournal_core,
1096 dependencies : [threads],
1099 executable('journalctl',
1101 include_directories : includes,
1102 link_with : [libshared,
1104 dependencies : [threads,
1109 install_dir : rootbindir)
1111 executable('systemd-getty-generator',
1112 'src/getty-generator/getty-generator.c',
1114 install_dir : systemgeneratordir,
1115 include_directories : includes,
1116 link_with : [libshared])
1118 executable('systemd-debug-generator',
1119 'src/debug-generator/debug-generator.c',
1121 install_dir : systemgeneratordir,
1122 include_directories : includes,
1123 link_with : [libshared])
1125 executable('systemd-fstab-generator',
1126 'src/fstab-generator/fstab-generator.c',
1127 'src/core/mount-setup.c',
1129 install_dir : systemgeneratordir,
1130 include_directories : includes,
1131 link_with : [libshared])
1133 if conf.get('ENABLE_ENVIRONMENT_D', 0) == 1
1134 executable('30-systemd-environment-d-generator',
1135 'src/environment-d-generator/environment-d-generator.c',
1137 install_dir : userenvgeneratordir,
1138 include_directories : includes,
1139 link_with : [libshared])
1141 meson.add_install_script(meson_make_symlink,
1142 sysconfdir + '/environment',
1143 environmentdir + '/99-environment.conf')
1146 if conf.get('ENABLE_HIBERNATE', 0) == 1
1147 executable('systemd-hibernate-resume-generator',
1148 'src/hibernate-resume/hibernate-resume-generator.c',
1149 include_directories : includes,
1150 link_with : [libshared],
1152 install_dir : systemgeneratordir)
1154 executable('systemd-hibernate-resume',
1155 'src/hibernate-resume/hibernate-resume.c',
1156 include_directories : includes,
1157 link_with : [libshared],
1159 install_dir : rootlibexecdir)
1162 if conf.get('HAVE_BLKID', 0) == 1
1163 executable('systemd-gpt-auto-generator',
1164 'src/gpt-auto-generator/gpt-auto-generator.c',
1165 'src/basic/blkid-util.h',
1167 install_dir : systemgeneratordir,
1168 include_directories : includes,
1169 link_with : libshared,
1170 dependencies : libblkid)
1172 executable('systemd-dissect',
1173 'src/dissect/dissect.c',
1174 include_directories : includes,
1175 link_with : [libshared],
1177 install_dir : rootlibexecdir)
1180 if conf.get('ENABLE_RESOLVED', 0) == 1
1181 executable('systemd-resolved',
1182 systemd_resolved_sources,
1183 include_directories : includes,
1184 link_with : [libshared,
1186 dependencies : [threads,
1190 install_dir : rootlibexecdir)
1192 executable('systemd-resolve',
1193 systemd_resolve_sources,
1194 include_directories : includes,
1195 link_with : [libshared,
1197 dependencies : [threads,
1203 if conf.get('ENABLE_LOGIND', 0) == 1
1204 executable('systemd-logind',
1205 systemd_logind_sources,
1206 include_directories : includes,
1207 link_with : [liblogind_core,
1209 dependencies : [threads,
1212 install_dir : rootlibexecdir)
1214 executable('loginctl',
1216 include_directories : includes,
1217 link_with : [libshared],
1218 dependencies : [threads,
1222 install_dir : rootbindir)
1224 executable('systemd-inhibit',
1225 'src/login/inhibit.c',
1226 include_directories : includes,
1227 link_with : [libshared],
1229 install_dir : rootbindir)
1231 if conf.get('HAVE_PAM', 0) == 1
1232 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1237 include_directories : includes,
1238 link_args : ['-shared',
1239 '-Wl,--version-script=' + version_script_arg],
1240 link_with : [libshared],
1241 dependencies : [libpam,
1243 link_depends : pam_systemd_sym,
1245 install_dir : pamlibdir)
1249 if conf.get('HAVE_PAM', 0) == 1
1250 executable('systemd-user-sessions',
1251 'src/user-sessions/user-sessions.c',
1252 include_directories : includes,
1253 link_with : [libshared],
1255 install_dir : rootlibexecdir)
1258 if conf.get('ENABLE_EFI', 0) == 1
1259 executable('bootctl',
1260 'src/boot/bootctl.c',
1261 include_directories : includes,
1262 link_with : [libshared],
1263 dependencies : [libblkid],
1267 executable('systemd-socket-activate', 'src/activate/activate.c',
1268 include_directories : includes,
1269 link_with : [libshared],
1270 dependencies : [threads],
1273 executable('systemctl', 'src/systemctl/systemctl.c',
1274 include_directories : includes,
1275 link_with : [libshared],
1276 dependencies : [threads,
1282 install_dir : rootbindir)
1284 if conf.get('ENABLE_BACKLIGHT', 0) == 1
1285 executable('systemd-backlight',
1286 'src/backlight/backlight.c',
1287 include_directories : includes,
1288 link_with : [libshared],
1290 install_dir : rootlibexecdir)
1293 if conf.get('ENABLE_RFKILL', 0) == 1
1294 executable('systemd-rfkill',
1295 'src/rfkill/rfkill.c',
1296 include_directories : includes,
1297 link_with : [libshared],
1299 install_dir : rootlibexecdir)
1302 executable('systemd-system-update-generator',
1303 'src/system-update-generator/system-update-generator.c',
1304 include_directories : includes,
1305 link_with : [libshared],
1307 install_dir : systemgeneratordir)
1309 if conf.get('HAVE_LIBCRYPTSETUP', 0) == 1
1310 executable('systemd-cryptsetup',
1311 'src/cryptsetup/cryptsetup.c',
1312 include_directories : includes,
1313 link_with : [libshared],
1314 dependencies : [libcryptsetup],
1316 install_dir : rootlibexecdir)
1318 executable('systemd-cryptsetup-generator',
1319 'src/cryptsetup/cryptsetup-generator.c',
1320 include_directories : includes,
1321 link_with : [libshared],
1322 dependencies : [libcryptsetup],
1324 install_dir : systemgeneratordir)
1326 executable('systemd-veritysetup',
1327 'src/veritysetup/veritysetup.c',
1328 include_directories : includes,
1329 link_with : [libshared],
1330 dependencies : [libcryptsetup],
1332 install_dir : rootlibexecdir)
1334 executable('systemd-veritysetup-generator',
1335 'src/veritysetup/veritysetup-generator.c',
1336 include_directories : includes,
1337 link_with : [libshared],
1338 dependencies : [libcryptsetup],
1340 install_dir : systemgeneratordir)
1343 if conf.get('HAVE_SYSV_COMPAT', 0) == 1
1344 executable('systemd-sysv-generator',
1345 'src/sysv-generator/sysv-generator.c',
1346 include_directories : includes,
1347 link_with : [libshared],
1349 install_dir : systemgeneratordir)
1351 executable('systemd-rc-local-generator',
1352 'src/rc-local-generator/rc-local-generator.c',
1353 include_directories : includes,
1354 link_with : [libshared],
1356 install_dir : systemgeneratordir)
1359 if conf.get('ENABLE_HOSTNAMED', 0) == 1
1360 executable('systemd-hostnamed',
1361 'src/hostname/hostnamed.c',
1362 include_directories : includes,
1363 link_with : [libshared],
1365 install_dir : rootlibexecdir)
1367 executable('hostnamectl',
1368 'src/hostname/hostnamectl.c',
1369 include_directories : includes,
1370 link_with : [libshared],
1374 if conf.get('ENABLE_LOCALED', 0) == 1
1375 executable('systemd-localed',
1376 systemd_localed_sources,
1377 include_directories : includes,
1378 link_with : [libshared],
1379 dependencies : [libdl],
1381 install_dir : rootlibexecdir)
1383 executable('localectl',
1385 include_directories : includes,
1386 link_with : [libshared],
1390 if conf.get('ENABLE_TIMEDATED', 0) == 1
1391 executable('systemd-timedated',
1392 'src/timedate/timedated.c',
1393 include_directories : includes,
1394 link_with : [libshared],
1396 install_dir : rootlibexecdir)
1398 executable('timedatectl',
1399 'src/timedate/timedatectl.c',
1400 include_directories : includes,
1401 link_with : [libshared],
1405 if conf.get('ENABLE_TIMESYNCD', 0) == 1
1406 executable('systemd-timesyncd',
1407 systemd_timesyncd_sources,
1408 include_directories : includes,
1409 link_with : [libshared],
1410 dependencies : [threads,
1413 install_dir : rootlibexecdir)
1416 if conf.get('ENABLE_MACHINED', 0) == 1
1417 executable('systemd-machined',
1418 systemd_machined_sources,
1419 include_directories : includes,
1420 link_with : [libmachine_core,
1423 install_dir : rootlibexecdir)
1425 executable('machinectl',
1426 'src/machine/machinectl.c',
1427 include_directories : includes,
1428 link_with : [libshared],
1429 dependencies : [threads,
1433 install_dir : rootbindir)
1436 if conf.get('ENABLE_IMPORTD', 0) == 1
1437 executable('systemd-importd',
1438 systemd_importd_sources,
1439 include_directories : includes,
1440 link_with : [libshared],
1442 install_dir : rootlibexecdir)
1444 executable('systemd-pull',
1445 systemd_pull_sources,
1446 include_directories : includes,
1447 link_with : [libshared],
1448 dependencies : [libcurl,
1454 install_dir : rootlibexecdir)
1456 executable('systemd-import',
1457 systemd_import_sources,
1458 include_directories : includes,
1459 link_with : [libshared],
1460 dependencies : [libcurl,
1465 install_dir : rootlibexecdir)
1467 executable('systemd-export',
1468 systemd_export_sources,
1469 include_directories : includes,
1470 link_with : [libshared],
1471 dependencies : [libcurl,
1476 install_dir : rootlibexecdir)
1479 if conf.get('ENABLE_REMOTE', 0) == 1 and conf.get('HAVE_LIBCURL', 0) == 1
1480 executable('systemd-journal-upload',
1481 systemd_journal_upload_sources,
1482 include_directories : includes,
1483 link_with : [libshared],
1484 dependencies : [threads,
1490 install_dir : rootlibexecdir)
1493 if conf.get('ENABLE_REMOTE', 0) == 1 and conf.get('HAVE_MICROHTTPD', 0) == 1
1494 executable('systemd-journal-remote',
1495 systemd_journal_remote_sources,
1496 include_directories : includes,
1497 link_with : [libshared],
1498 dependencies : [threads,
1504 install_dir : rootlibexecdir)
1506 executable('systemd-journal-gatewayd',
1507 systemd_journal_gatewayd_sources,
1508 include_directories : includes,
1509 link_with : [libshared],
1510 dependencies : [threads,
1516 install_dir : rootlibexecdir)
1519 if conf.get('ENABLE_COREDUMP', 0) == 1
1520 executable('systemd-coredump',
1521 systemd_coredump_sources,
1522 include_directories : includes,
1523 link_with : [libshared],
1524 dependencies : [threads,
1530 install_dir : rootlibexecdir)
1532 executable('coredumpctl',
1533 coredumpctl_sources,
1534 include_directories : includes,
1535 link_with : [libshared],
1536 dependencies : [threads,
1542 if conf.get('ENABLE_BINFMT', 0) == 1
1543 executable('systemd-binfmt',
1544 'src/binfmt/binfmt.c',
1545 include_directories : includes,
1546 link_with : [libshared],
1548 install_dir : rootlibexecdir)
1550 meson.add_install_script('sh', '-c',
1551 mkdir_p.format(binfmtdir))
1552 meson.add_install_script('sh', '-c',
1553 mkdir_p.format(sysconfdir + '/binfmt.d'))
1556 if conf.get('ENABLE_VCONSOLE', 0) == 1
1557 executable('systemd-vconsole-setup',
1558 'src/vconsole/vconsole-setup.c',
1559 include_directories : includes,
1560 link_with : [libshared],
1562 install_dir : rootlibexecdir)
1565 if conf.get('ENABLE_RANDOMSEED', 0) == 1
1566 executable('systemd-random-seed',
1567 'src/random-seed/random-seed.c',
1568 include_directories : includes,
1569 link_with : [libshared],
1571 install_dir : rootlibexecdir)
1574 if conf.get('ENABLE_FIRSTBOOT', 0) == 1
1575 executable('systemd-firstboot',
1576 'src/firstboot/firstboot.c',
1577 include_directories : includes,
1578 link_with : [libshared],
1579 dependencies : [libcrypt],
1581 install_dir : rootbindir)
1584 executable('systemd-remount-fs',
1585 'src/remount-fs/remount-fs.c',
1586 'src/core/mount-setup.c',
1587 'src/core/mount-setup.h',
1588 include_directories : includes,
1589 link_with : [libshared],
1591 install_dir : rootlibexecdir)
1593 executable('systemd-machine-id-setup',
1594 'src/machine-id-setup/machine-id-setup-main.c',
1595 'src/core/machine-id-setup.c',
1596 'src/core/machine-id-setup.h',
1597 include_directories : includes,
1598 link_with : [libshared],
1600 install_dir : rootbindir)
1602 executable('systemd-fsck',
1604 include_directories : includes,
1605 link_with : [libshared],
1607 install_dir : rootlibexecdir)
1609 executable('systemd-sleep',
1610 'src/sleep/sleep.c',
1611 include_directories : includes,
1612 link_with : [libshared],
1614 install_dir : rootlibexecdir)
1616 executable('systemd-sysctl',
1617 'src/sysctl/sysctl.c',
1618 include_directories : includes,
1619 link_with : [libshared],
1621 install_dir : rootlibexecdir)
1623 executable('systemd-ac-power',
1624 'src/ac-power/ac-power.c',
1625 include_directories : includes,
1626 link_with : [libshared],
1628 install_dir : rootlibexecdir)
1630 executable('systemd-detect-virt',
1631 'src/detect-virt/detect-virt.c',
1632 include_directories : includes,
1633 link_with : [libshared],
1636 executable('systemd-delta',
1637 'src/delta/delta.c',
1638 include_directories : includes,
1639 link_with : [libshared],
1642 executable('systemd-escape',
1643 'src/escape/escape.c',
1644 include_directories : includes,
1645 link_with : [libshared],
1647 install_dir : rootbindir)
1649 executable('systemd-notify',
1650 'src/notify/notify.c',
1651 include_directories : includes,
1652 link_with : [libshared],
1654 install_dir : rootbindir)
1656 executable('systemd-volatile-root',
1657 'src/volatile-root/volatile-root.c',
1658 include_directories : includes,
1659 link_with : [libshared],
1661 install_dir : rootlibexecdir)
1663 executable('systemd-cgroups-agent',
1664 'src/cgroups-agent/cgroups-agent.c',
1665 include_directories : includes,
1666 link_with : [libshared],
1668 install_dir : rootlibexecdir)
1670 executable('systemd-path',
1672 include_directories : includes,
1673 link_with : [libshared],
1676 executable('systemd-ask-password',
1677 'src/ask-password/ask-password.c',
1678 include_directories : includes,
1679 link_with : [libshared],
1681 install_dir : rootbindir)
1683 executable('systemd-reply-password',
1684 'src/reply-password/reply-password.c',
1685 include_directories : includes,
1686 link_with : [libshared],
1688 install_dir : rootlibexecdir)
1690 executable('systemd-tty-ask-password-agent',
1691 'src/tty-ask-password-agent/tty-ask-password-agent.c',
1692 include_directories : includes,
1693 link_with : [libshared],
1695 install_dir : rootbindir)
1697 executable('systemd-cgls',
1699 include_directories : includes,
1700 link_with : [libshared],
1703 executable('systemd-cgtop',
1704 'src/cgtop/cgtop.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1709 executable('systemd-initctl',
1710 'src/initctl/initctl.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1714 install_dir : rootlibexecdir)
1716 executable('systemd-mount',
1717 'src/mount/mount-tool.c',
1718 include_directories : includes,
1719 link_with : [libshared],
1722 meson.add_install_script(meson_make_symlink,
1723 'systemd-mount', bindir + '/systemd-umount')
1725 executable('systemd-run',
1727 include_directories : includes,
1728 link_with : [libshared],
1731 executable('systemd-stdio-bridge',
1732 'src/stdio-bridge/stdio-bridge.c',
1733 include_directories : includes,
1734 link_with : [libshared],
1737 executable('busctl',
1738 'src/busctl/busctl.c',
1739 'src/busctl/busctl-introspect.c',
1740 'src/busctl/busctl-introspect.h',
1741 include_directories : includes,
1742 link_with : [libshared],
1745 if conf.get('ENABLE_SYSUSERS', 0) == 1
1746 executable('systemd-sysusers',
1747 'src/sysusers/sysusers.c',
1748 include_directories : includes,
1749 link_with : [libshared],
1751 install_dir : rootbindir)
1754 if conf.get('ENABLE_TMPFILES', 0) == 1
1755 executable('systemd-tmpfiles',
1756 'src/tmpfiles/tmpfiles.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 dependencies : [libacl],
1761 install_dir : rootbindir)
1764 if conf.get('ENABLE_HWDB', 0) == 1
1765 executable('systemd-hwdb',
1767 'src/libsystemd/sd-hwdb/hwdb-internal.h',
1768 include_directories : includes,
1769 link_with : [libshared],
1771 install_dir : rootbindir)
1774 if conf.get('ENABLE_QUOTACHECK', 0) == 1
1775 executable('systemd-quotacheck',
1776 'src/quotacheck/quotacheck.c',
1777 include_directories : includes,
1778 link_with : [libshared],
1780 install_dir : rootlibexecdir)
1783 executable('systemd-socket-proxyd',
1784 'src/socket-proxy/socket-proxyd.c',
1785 include_directories : includes,
1786 link_with : [libshared,
1788 dependencies : [threads],
1790 install_dir : rootlibexecdir)
1792 executable('systemd-udevd',
1793 systemd_udevd_sources,
1794 include_directories : includes,
1795 link_with : [libudev_core,
1799 dependencies : [libkmod,
1803 install_dir : rootlibexecdir)
1805 executable('udevadm',
1807 include_directories : includes,
1808 link_with : [libudev_core,
1812 dependencies : [libkmod,
1816 install_dir : rootbindir)
1818 executable('systemd-shutdown',
1819 systemd_shutdown_sources,
1820 include_directories : includes,
1821 link_with : [libshared],
1823 install_dir : rootlibexecdir)
1825 executable('systemd-update-done',
1826 'src/update-done/update-done.c',
1827 include_directories : includes,
1828 link_with : [libshared],
1830 install_dir : rootlibexecdir)
1832 executable('systemd-update-utmp',
1833 'src/update-utmp/update-utmp.c',
1834 include_directories : includes,
1835 link_with : [libshared],
1836 dependencies : [libaudit],
1838 install_dir : rootlibexecdir)
1840 if conf.get('HAVE_KMOD', 0) == 1
1841 executable('systemd-modules-load',
1842 'src/modules-load/modules-load.c',
1843 include_directories : includes,
1844 link_with : [libshared],
1845 dependencies : [libkmod],
1847 install_dir : rootlibexecdir)
1849 meson.add_install_script('sh', '-c',
1850 mkdir_p.format(modulesloaddir))
1851 meson.add_install_script('sh', '-c',
1852 mkdir_p.format(sysconfdir + '/modules-load.d'))
1855 executable('systemd-nspawn',
1856 systemd_nspawn_sources,
1857 'src/core/mount-setup.c', # FIXME: use a variable?
1858 'src/core/mount-setup.h',
1859 'src/core/loopback-setup.c',
1860 'src/core/loopback-setup.h',
1861 include_directories : [includes, include_directories('src/nspawn')],
1862 link_with : [libfirewall,
1864 dependencies : [libacl,
1870 executable('systemd-networkd',
1871 systemd_networkd_sources,
1872 include_directories : includes,
1873 link_with : [libnetworkd_core,
1879 install_dir : rootlibexecdir)
1881 executable('systemd-networkd-wait-online',
1882 systemd_networkd_wait_online_sources,
1883 include_directories : includes,
1884 link_with : [libnetworkd_core,
1887 install_dir : rootlibexecdir)
1889 executable('networkctl',
1891 include_directories : includes,
1892 link_with : [libsystemd_network,
1895 install_dir : rootbindir)
1897 ############################################################
1899 foreach tuple : tests
1901 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
1902 dependencies = tuple[2]
1903 condition = tuple.length() >= 4 ? tuple[3] : ''
1904 type = tuple.length() >= 5 ? tuple[4] : ''
1905 defs = tuple.length() >= 6 ? tuple[5] : []
1906 incs = tuple.length() >= 7 ? tuple[6] : includes
1908 name = sources[0].split('/')[-1].split('.')[0]
1910 if condition == '' or conf.get(condition, 0) == 1
1911 install = install_tests and type == ''
1916 include_directories : incs,
1917 link_with : link_with,
1918 dependencies : dependencies,
1921 install_dir : testsdir)
1924 message('@0@ is a manual test'.format(name))
1925 elif type == 'unsafe' and want_tests != 'unsafe'
1926 message('@0@ is an unsafe test'.format(name))
1928 test(name, exe, env : test_env)
1931 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
1935 ############################################################
1937 make_directive_index_py = find_program('tools/make-directive-index.py')
1938 make_man_index_py = find_program('tools/make-man-index.py')
1942 subdir('sysusers.d')
1943 subdir('tmpfiles.d')
1948 subdir('shell-completion/bash')
1949 subdir('shell-completion/zsh')
1950 subdir('docs/sysvinit')
1951 subdir('docs/var-log')
1953 # FIXME: figure out if the warning is true:
1954 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
1955 install_subdir('factory/etc',
1956 install_dir : factorydir)
1959 install_data('xorg/50-systemd-user.sh',
1960 install_dir : xinitrcdir)
1961 install_data('system-preset/90-systemd.preset',
1962 install_dir : systempresetdir)
1963 install_data('README',
1970 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
1971 install_dir : docdir)
1973 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
1974 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
1976 ############################################################
1978 if git.found() and etags.found()
1979 all_files = run_command(
1981 ['--git-dir=@0@/.git'.format(meson.source_root()),
1984 all_files = files(all_files.stdout().split())
1990 command : [etags, '-o', '@OUTPUT@'] + all_files)