1 # SPDX-License-Identifier: LGPL-2.1+
3 # Copyright 2017 Zbigniew Jędrzejewski-Szmek
5 # systemd is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU Lesser General Public License as published by
7 # the Free Software Foundation; either version 2.1 of the License, or
8 # (at your option) any later version.
10 # systemd is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public License
16 # along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 project('systemd', 'c',
27 meson_version : '>= 0.41',
30 libsystemd_version = '0.19.1'
31 libudev_version = '1.6.7'
33 # We need the same data in three different formats, ugh!
34 # Also, for hysterical reasons, we use different variable
35 # names, sometimes. Not all variables are included in every
37 conf = configuration_data()
38 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
39 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
41 substs = configuration_data()
42 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
43 substs.set('PACKAGE_VERSION', meson.project_version())
47 #####################################################################
49 # Try to install the git pre-commit hook
50 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
51 if git_hook.returncode() == 0
52 message(git_hook.stdout().strip())
55 #####################################################################
57 split_usr = get_option('split-usr')
58 conf.set10('HAVE_SPLIT_USR', split_usr)
60 rootprefixdir = get_option('rootprefix')
61 # Unusual rootprefixdir values are used by some distros
62 # (see https://github.com/systemd/systemd/pull/7461).
63 rootprefix_default = get_option('split-usr') ? '/' : '/usr'
64 if rootprefixdir == ''
65 rootprefixdir = rootprefix_default
68 sysvinit_path = get_option('sysvinit-path')
69 sysvrcnd_path = get_option('sysvrcnd-path')
70 have = sysvinit_path != '' or sysvrcnd_path != ''
71 conf.set10('HAVE_SYSV_COMPAT', have,
72 description : 'SysV init scripts and rcN.d links are supported')
73 m4_defines += have ? ['-DHAVE_SYSV_COMPAT'] : []
75 # join_paths ignore the preceding arguments if an absolute component is
76 # encountered, so this should canonicalize various paths when they are
77 # absolute or relative.
78 prefixdir = get_option('prefix')
79 if not prefixdir.startswith('/')
80 error('Prefix is not absolute: "@0@"'.format(prefixdir))
82 bindir = join_paths(prefixdir, get_option('bindir'))
83 libdir = join_paths(prefixdir, get_option('libdir'))
84 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
85 includedir = join_paths(prefixdir, get_option('includedir'))
86 datadir = join_paths(prefixdir, get_option('datadir'))
87 localstatedir = join_paths('/', get_option('localstatedir'))
89 rootbindir = join_paths(rootprefixdir, 'bin')
90 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
92 rootlibdir = get_option('rootlibdir')
94 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
97 # Dirs of external packages
98 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
99 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
100 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
101 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
102 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
103 varlogdir = join_paths(localstatedir, 'log')
104 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
105 rpmmacrosdir = get_option('rpmmacrosdir')
106 if rpmmacrosdir != 'no'
107 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
109 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
112 pkgdatadir = join_paths(datadir, 'systemd')
113 environmentdir = join_paths(prefixdir, 'lib/environment.d')
114 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
115 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
116 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
117 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
118 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
119 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
120 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
121 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
122 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
123 pkgincludedir = join_paths(includedir, 'systemd')
124 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
125 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
126 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
127 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
128 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
129 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
130 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
131 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
132 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
133 udevhomedir = udevlibexecdir
134 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
135 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
136 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
137 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
138 factorydir = join_paths(datadir, 'factory')
139 docdir = join_paths(datadir, 'doc/systemd')
140 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
141 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
142 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
143 catalogstatedir = join_paths(systemdstatedir, 'catalog')
144 randomseeddir = join_paths(localstatedir, 'lib/systemd')
146 dbuspolicydir = get_option('dbuspolicydir')
147 if dbuspolicydir == ''
148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
151 dbussessionservicedir = get_option('dbussessionservicedir')
152 if dbussessionservicedir == ''
153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
156 dbussystemservicedir = get_option('dbussystemservicedir')
157 if dbussystemservicedir == ''
158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
161 pamlibdir = get_option('pamlibdir')
163 pamlibdir = join_paths(rootlibdir, 'security')
166 pamconfdir = get_option('pamconfdir')
168 pamconfdir = join_paths(sysconfdir, 'pam.d')
171 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
172 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
173 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
174 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
175 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
176 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
177 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
178 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
179 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
180 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
181 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
182 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
183 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
184 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
185 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
186 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
187 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
188 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
189 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
190 conf.set_quoted('ROOTPREFIX', rootprefixdir)
191 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
192 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
193 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
194 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
195 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
196 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
197 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
198 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
199 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
200 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
201 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
202 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
203 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
204 conf.set_quoted('LIBDIR', libdir)
205 conf.set_quoted('ROOTLIBDIR', rootlibdir)
206 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
207 conf.set_quoted('BOOTLIBDIR', bootlibdir)
208 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
209 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
210 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
211 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
212 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
213 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
215 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
216 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
218 substs.set('prefix', prefixdir)
219 substs.set('exec_prefix', prefixdir)
220 substs.set('libdir', libdir)
221 substs.set('rootlibdir', rootlibdir)
222 substs.set('includedir', includedir)
223 substs.set('pkgsysconfdir', pkgsysconfdir)
224 substs.set('bindir', bindir)
225 substs.set('rootbindir', rootbindir)
226 substs.set('rootlibexecdir', rootlibexecdir)
227 substs.set('systemunitdir', systemunitdir)
228 substs.set('userunitdir', userunitdir)
229 substs.set('systempresetdir', systempresetdir)
230 substs.set('userpresetdir', userpresetdir)
231 substs.set('udevhwdbdir', udevhwdbdir)
232 substs.set('udevrulesdir', udevrulesdir)
233 substs.set('udevlibexecdir', udevlibexecdir)
234 substs.set('catalogdir', catalogdir)
235 substs.set('tmpfilesdir', tmpfilesdir)
236 substs.set('sysusersdir', sysusersdir)
237 substs.set('sysctldir', sysctldir)
238 substs.set('binfmtdir', binfmtdir)
239 substs.set('modulesloaddir', modulesloaddir)
240 substs.set('systemgeneratordir', systemgeneratordir)
241 substs.set('usergeneratordir', usergeneratordir)
242 substs.set('systemenvgeneratordir', systemenvgeneratordir)
243 substs.set('userenvgeneratordir', userenvgeneratordir)
244 substs.set('systemshutdowndir', systemshutdowndir)
245 substs.set('systemsleepdir', systemsleepdir)
246 substs.set('VARLOGDIR', varlogdir)
247 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
248 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
249 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
250 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
251 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
252 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
253 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
255 #####################################################################
257 cc = meson.get_compiler('c')
258 pkgconfig = import('pkgconfig')
259 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
261 cxx = find_program('c++', required : false)
263 # Used only for tests
267 foreach arg : ['-Wextra',
270 '-Wmissing-include-dirs',
271 '-Wold-style-definition',
274 '-Wdeclaration-after-statement',
276 '-Wsuggest-attribute=noreturn',
277 '-Werror=missing-prototypes',
278 '-Werror=implicit-function-declaration',
279 '-Werror=missing-declarations',
280 '-Werror=return-type',
281 '-Werror=incompatible-pointer-types',
283 '-Wstrict-prototypes',
285 '-Wmissing-noreturn',
286 '-Wimplicit-fallthrough=5',
289 '-Wstrict-aliasing=2',
296 '-fdiagnostics-show-option',
297 '-fno-strict-aliasing',
298 '-fvisibility=hidden',
300 '-fstack-protector-strong',
302 '--param=ssp-buffer-size=4',
304 if cc.has_argument(arg)
305 add_project_arguments(arg, language : 'c')
309 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
310 # arguments, just emits a warnings. So test for the "positive" version instead.
311 foreach arg : ['unused-parameter',
312 'missing-field-initializers',
315 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
317 if cc.has_argument('-W' + arg)
318 add_project_arguments('-Wno-' + arg, language : 'c')
324 #include <inttypes.h>
325 typedef uint64_t usec_t;
326 usec_t now(clockid_t clock);
331 ', name : '-Werror=shadow with local shadowing')
332 add_project_arguments('-Werror=shadow', language : 'c')
335 if cc.get_id() == 'clang'
336 foreach arg : ['-Wno-typedef-redefinition',
337 '-Wno-gnu-variable-sized-type-not-at-end',
339 if cc.has_argument(arg,
340 name : '@0@ is supported'.format(arg))
341 add_project_arguments(arg, language : 'c')
346 link_test_c = files('tools/meson-link-test.c')
348 # --as-needed and --no-undefined are provided by meson by default,
349 # run mesonconf to see what is enabled
350 foreach arg : ['-Wl,-z,relro',
355 have = run_command(check_compilation_sh,
356 cc.cmd_array(), '-x', 'c', arg,
357 '-include', link_test_c).returncode() == 0
358 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
360 add_project_link_arguments(arg, language : 'c')
364 if get_option('buildtype') != 'debug'
365 foreach arg : ['-ffunction-sections',
367 if cc.has_argument(arg,
368 name : '@0@ is supported'.format(arg))
369 add_project_arguments(arg, language : 'c')
373 foreach arg : ['-Wl,--gc-sections']
374 have = run_command(check_compilation_sh,
375 cc.cmd_array(), '-x', 'c', arg,
376 '-include', link_test_c).returncode() == 0
377 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
379 add_project_link_arguments(arg, language : 'c')
384 cpp = ' '.join(cc.cmd_array()) + ' -E'
386 #####################################################################
387 # compilation result tests
389 conf.set('_GNU_SOURCE', true)
390 conf.set('__SANE_USERSPACE_TYPES__', true)
392 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
393 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
394 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
395 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
396 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
397 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
398 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
402 #include <linux/ethtool.h>
403 #include <linux/fib_rules.h>
405 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
407 foreach decl : ['char16_t',
410 'struct ethtool_link_settings',
411 'struct fib_rule_uid_range',
414 # We get -1 if the size cannot be determined
415 have = cc.sizeof(decl, prefix : decl_headers) > 0
416 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
419 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
420 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
421 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
422 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
423 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
424 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
425 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
426 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
427 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
428 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
429 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
430 # if_tunnel.h is buggy and cannot be included on its own
431 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
432 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
433 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
434 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
435 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
436 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
437 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
438 ['NDA_IFINDEX', 'linux/neighbour.h'],
439 ['IFA_FLAGS', 'linux/if_addr.h'],
440 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
441 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
442 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
444 prefix = decl.length() > 2 ? decl[2] : ''
445 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
446 conf.set10('HAVE_' + decl[0], have)
449 foreach ident : ['secure_getenv', '__secure_getenv']
450 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
454 ['memfd_create', '''#define _GNU_SOURCE
455 #include <sys/mman.h>'''],
456 ['gettid', '''#include <sys/types.h>'''],
457 ['pivot_root', '''#include <stdlib.h>'''], # no known header declares pivot_root
458 ['name_to_handle_at', '''#define _GNU_SOURCE
459 #include <sys/types.h>
460 #include <sys/stat.h>
461 #include <fcntl.h>'''],
462 ['setns', '''#define _GNU_SOURCE
463 #include <sched.h>'''],
464 ['renameat2', '''#include <stdio.h>'''],
465 ['kcmp', '''#include <linux/kcmp.h>'''],
466 ['keyctl', '''#include <sys/types.h>
467 #include <keyutils.h>'''],
468 ['copy_file_range', '''#include <sys/syscall.h>
469 #include <unistd.h>'''],
470 ['bpf', '''#include <sys/syscall.h>
471 #include <unistd.h>'''],
472 ['explicit_bzero' , '''#include <string.h>'''],
475 have = cc.has_function(ident[0], prefix : ident[1])
476 conf.set10('HAVE_' + ident[0].to_upper(), have)
479 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''')
480 conf.set10('USE_SYS_RANDOM_H', true)
481 conf.set10('HAVE_GETRANDOM', true)
483 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
484 conf.set10('USE_SYS_RANDOM_H', false)
485 conf.set10('HAVE_GETRANDOM', have)
488 #####################################################################
490 sed = find_program('sed')
491 awk = find_program('awk')
492 m4 = find_program('m4')
493 stat = find_program('stat')
494 git = find_program('git', required : false)
496 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
497 mkdir_p = 'mkdir -p $DESTDIR/@0@'
498 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
499 splash_bmp = files('test/splash.bmp')
501 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
502 # /usr/sbin, /sbin, and fall back to the default from middle column.
503 progs = [['telinit', '/lib/sysvinit/telinit'],
504 ['quotaon', '/usr/sbin/quotaon' ],
505 ['quotacheck', '/usr/sbin/quotacheck' ],
506 ['kill', '/usr/bin/kill' ],
507 ['kmod', '/usr/bin/kmod' ],
508 ['kexec', '/usr/sbin/kexec' ],
509 ['sulogin', '/usr/sbin/sulogin' ],
510 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
511 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
512 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
513 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
516 path = get_option(prog[0] + '-path')
518 message('Using @1@ for @0@'.format(prog[0], path))
520 exe = find_program(prog[0],
521 '/usr/sbin/' + prog[0],
524 path = exe.found() ? exe.path() : prog[1]
526 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
527 conf.set_quoted(name, path)
528 substs.set(name, path)
531 if run_command('ln', '--relative', '--help').returncode() != 0
532 error('ln does not support --relative')
535 ############################################################
537 gperf = find_program('gperf')
539 gperf_test_format = '''
541 const char * in_word_set(const char *, @0@);
544 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
545 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
546 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
547 if cc.compiles(gperf_test)
548 gperf_len_type = 'size_t'
550 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
551 if cc.compiles(gperf_test)
552 gperf_len_type = 'unsigned'
554 error('unable to determine gperf len type')
557 message('gperf len type is @0@'.format(gperf_len_type))
558 conf.set('GPERF_LEN_TYPE', gperf_len_type,
559 description : 'The type of gperf "len" parameter')
561 ############################################################
563 if not cc.has_header('sys/capability.h')
564 error('POSIX caps headers not found')
566 foreach header : ['linux/btrfs.h',
568 'linux/vm_sockets.h',
570 'valgrind/memcheck.h',
571 'valgrind/valgrind.h',
574 conf.set10('HAVE_' + header.underscorify().to_upper(),
575 cc.has_header(header))
578 ############################################################
580 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
581 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
582 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
584 default_hierarchy = get_option('default-hierarchy')
585 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
586 description : 'default cgroup hierarchy as string')
587 if default_hierarchy == 'legacy'
588 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
589 elif default_hierarchy == 'hybrid'
590 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
592 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
595 time_epoch = get_option('time-epoch')
598 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
600 time_epoch = time_epoch.to_int()
601 conf.set('TIME_EPOCH', time_epoch)
603 system_uid_max = get_option('system-uid-max')
604 if system_uid_max == ''
605 system_uid_max = run_command(
607 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
608 '/etc/login.defs').stdout()
610 system_uid_max = system_uid_max.to_int()
611 conf.set('SYSTEM_UID_MAX', system_uid_max)
612 substs.set('systemuidmax', system_uid_max)
613 message('maximum system UID is @0@'.format(system_uid_max))
615 conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
616 conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
618 system_gid_max = get_option('system-gid-max')
619 if system_gid_max == ''
620 system_gid_max = run_command(
622 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
623 '/etc/login.defs').stdout()
625 system_gid_max = system_gid_max.to_int()
626 conf.set('SYSTEM_GID_MAX', system_gid_max)
627 substs.set('systemgidmax', system_gid_max)
628 message('maximum system GID is @0@'.format(system_gid_max))
630 tty_gid = get_option('tty-gid')
631 conf.set('TTY_GID', tty_gid)
632 substs.set('TTY_GID', tty_gid)
634 if get_option('adm-group')
635 m4_defines += ['-DENABLE_ADM_GROUP']
638 if get_option('wheel-group')
639 m4_defines += ['-DENABLE_WHEEL_GROUP']
642 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
643 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
645 kill_user_processes = get_option('default-kill-user-processes')
646 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
647 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
649 dns_servers = get_option('dns-servers')
650 conf.set_quoted('DNS_SERVERS', dns_servers)
651 substs.set('DNS_SERVERS', dns_servers)
653 ntp_servers = get_option('ntp-servers')
654 conf.set_quoted('NTP_SERVERS', ntp_servers)
655 substs.set('NTP_SERVERS', ntp_servers)
657 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
659 substs.set('SUSHELL', get_option('debug-shell'))
660 substs.set('DEBUGTTY', get_option('debug-tty'))
662 debug = get_option('debug')
663 enable_debug_hashmap = false
664 enable_debug_mmap_cache = false
666 foreach name : debug.split(',')
668 enable_debug_hashmap = true
669 elif name == 'mmap-cache'
670 enable_debug_mmap_cache = true
672 message('unknown debug option "@0@", ignoring'.format(name))
676 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
677 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
679 #####################################################################
681 threads = dependency('threads')
682 librt = cc.find_library('rt')
683 libm = cc.find_library('m')
684 libdl = cc.find_library('dl')
685 libcrypt = cc.find_library('crypt')
687 libcap = dependency('libcap', required : false)
688 if not libcap.found()
689 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
690 libcap = cc.find_library('cap')
693 libmount = dependency('mount',
696 want_seccomp = get_option('seccomp')
697 if want_seccomp != 'false'
698 libseccomp = dependency('libseccomp',
699 version : '>= 2.3.1',
700 required : want_seccomp == 'true')
701 have = libseccomp.found()
706 conf.set10('HAVE_SECCOMP', have)
707 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
709 want_selinux = get_option('selinux')
710 if want_selinux != 'false'
711 libselinux = dependency('libselinux',
712 version : '>= 2.1.9',
713 required : want_selinux == 'true')
714 have = libselinux.found()
719 conf.set10('HAVE_SELINUX', have)
720 m4_defines += have ? ['-DHAVE_SELINUX'] : []
722 want_apparmor = get_option('apparmor')
723 if want_apparmor != 'false'
724 libapparmor = dependency('libapparmor',
725 required : want_apparmor == 'true')
726 have = libapparmor.found()
731 conf.set10('HAVE_APPARMOR', have)
732 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
734 smack_run_label = get_option('smack-run-label')
735 if smack_run_label != ''
736 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
737 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
740 want_polkit = get_option('polkit')
741 install_polkit = false
742 install_polkit_pkla = false
743 if want_polkit != 'false'
744 install_polkit = true
746 libpolkit = dependency('polkit-gobject-1',
748 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
749 message('Old polkit detected, will install pkla files')
750 install_polkit_pkla = true
753 conf.set10('ENABLE_POLKIT', install_polkit)
755 want_acl = get_option('acl')
756 if want_acl != 'false'
757 libacl = cc.find_library('acl', required : want_acl == 'true')
758 have = libacl.found()
763 conf.set10('HAVE_ACL', have)
764 m4_defines += have ? ['-DHAVE_ACL'] : []
766 want_audit = get_option('audit')
767 if want_audit != 'false'
768 libaudit = dependency('audit', required : want_audit == 'true')
769 have = libaudit.found()
774 conf.set10('HAVE_AUDIT', have)
776 want_blkid = get_option('blkid')
777 if want_blkid != 'false'
778 libblkid = dependency('blkid', required : want_blkid == 'true')
779 have = libblkid.found()
784 conf.set10('HAVE_BLKID', have)
786 want_kmod = get_option('kmod')
787 if want_kmod != 'false'
788 libkmod = dependency('libkmod',
790 required : want_kmod == 'true')
791 have = libkmod.found()
796 conf.set10('HAVE_KMOD', have)
798 want_pam = get_option('pam')
799 if want_pam != 'false'
800 libpam = cc.find_library('pam', required : want_pam == 'true')
801 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
802 have = libpam.found() and libpam_misc.found()
808 conf.set10('HAVE_PAM', have)
809 m4_defines += have ? ['-DHAVE_PAM'] : []
811 want_microhttpd = get_option('microhttpd')
812 if want_microhttpd != 'false'
813 libmicrohttpd = dependency('libmicrohttpd',
814 version : '>= 0.9.33',
815 required : want_microhttpd == 'true')
816 have = libmicrohttpd.found()
821 conf.set10('HAVE_MICROHTTPD', have)
822 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
824 want_libcryptsetup = get_option('libcryptsetup')
825 if want_libcryptsetup != 'false'
826 libcryptsetup = dependency('libcryptsetup',
827 version : '>= 1.6.0',
828 required : want_libcryptsetup == 'true')
829 have = libcryptsetup.found()
834 conf.set10('HAVE_LIBCRYPTSETUP', have)
836 want_libcurl = get_option('libcurl')
837 if want_libcurl != 'false'
838 libcurl = dependency('libcurl',
839 version : '>= 7.32.0',
840 required : want_libcurl == 'true')
841 have = libcurl.found()
846 conf.set10('HAVE_LIBCURL', have)
847 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
849 want_libidn = get_option('libidn')
850 want_libidn2 = get_option('libidn2')
851 if want_libidn == 'true' and want_libidn2 == 'true'
852 error('libidn and libidn2 cannot be requested simultaneously')
855 if want_libidn != 'false' and want_libidn2 != 'true'
856 libidn = dependency('libidn',
857 required : want_libidn == 'true')
858 have = libidn.found()
863 conf.set10('HAVE_LIBIDN', have)
864 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
865 if not have and want_libidn2 != 'false'
866 # libidn is used for both libidn and libidn2 objects
867 libidn = dependency('libidn2',
868 required : want_libidn2 == 'true')
869 have = libidn.found()
873 conf.set10('HAVE_LIBIDN2', have)
874 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
876 want_libiptc = get_option('libiptc')
877 if want_libiptc != 'false'
878 libiptc = dependency('libiptc',
879 required : want_libiptc == 'true')
880 have = libiptc.found()
885 conf.set10('HAVE_LIBIPTC', have)
886 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
888 want_qrencode = get_option('qrencode')
889 if want_qrencode != 'false'
890 libqrencode = dependency('libqrencode',
891 required : want_qrencode == 'true')
892 have = libqrencode.found()
897 conf.set10('HAVE_QRENCODE', have)
899 want_gcrypt = get_option('gcrypt')
900 if want_gcrypt != 'false'
901 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
902 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
903 have = libgcrypt.found() and libgpg_error.found()
908 # link to neither of the libs if one is not found
912 conf.set10('HAVE_GCRYPT', have)
914 want_gnutls = get_option('gnutls')
915 if want_gnutls != 'false'
916 libgnutls = dependency('gnutls',
917 version : '>= 3.1.4',
918 required : want_gnutls == 'true')
919 have = libgnutls.found()
924 conf.set10('HAVE_GNUTLS', have)
926 want_elfutils = get_option('elfutils')
927 if want_elfutils != 'false'
928 libdw = dependency('libdw',
929 required : want_elfutils == 'true')
935 conf.set10('HAVE_ELFUTILS', have)
937 want_zlib = get_option('zlib')
938 if want_zlib != 'false'
939 libz = dependency('zlib',
940 required : want_zlib == 'true')
946 conf.set10('HAVE_ZLIB', have)
948 want_bzip2 = get_option('bzip2')
949 if want_bzip2 != 'false'
950 libbzip2 = cc.find_library('bz2',
951 required : want_bzip2 == 'true')
952 have = libbzip2.found()
957 conf.set10('HAVE_BZIP2', have)
959 want_xz = get_option('xz')
960 if want_xz != 'false'
961 libxz = dependency('liblzma',
962 required : want_xz == 'true')
968 conf.set10('HAVE_XZ', have)
970 want_lz4 = get_option('lz4')
971 if want_lz4 != 'false'
972 liblz4 = dependency('liblz4',
973 required : want_lz4 == 'true')
974 have = liblz4.found()
979 conf.set10('HAVE_LZ4', have)
981 want_xkbcommon = get_option('xkbcommon')
982 if want_xkbcommon != 'false'
983 libxkbcommon = dependency('xkbcommon',
984 version : '>= 0.3.0',
985 required : want_xkbcommon == 'true')
986 have = libxkbcommon.found()
991 conf.set10('HAVE_XKBCOMMON', have)
993 want_glib = get_option('glib')
994 if want_glib != 'false'
995 libglib = dependency('glib-2.0',
996 version : '>= 2.22.0',
997 required : want_glib == 'true')
998 libgobject = dependency('gobject-2.0',
999 version : '>= 2.22.0',
1000 required : want_glib == 'true')
1001 libgio = dependency('gio-2.0',
1002 required : want_glib == 'true')
1003 have = libglib.found() and libgobject.found() and libgio.found()
1010 conf.set10('HAVE_GLIB', have)
1012 want_dbus = get_option('dbus')
1013 if want_dbus != 'false'
1014 libdbus = dependency('dbus-1',
1015 version : '>= 1.3.2',
1016 required : want_dbus == 'true')
1017 have = libdbus.found()
1022 conf.set10('HAVE_DBUS', have)
1024 default_dnssec = get_option('default-dnssec')
1025 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1026 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1027 default_dnssec = 'no'
1029 conf.set('DEFAULT_DNSSEC_MODE',
1030 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1031 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1033 want_importd = get_option('importd')
1034 if want_importd != 'false'
1035 have = (conf.get('HAVE_LIBCURL') == 1 and
1036 conf.get('HAVE_ZLIB') == 1 and
1037 conf.get('HAVE_BZIP2') == 1 and
1038 conf.get('HAVE_XZ') == 1 and
1039 conf.get('HAVE_GCRYPT') == 1)
1040 if want_importd == 'true' and not have
1041 error('importd support was requested, but dependencies are not available')
1046 conf.set10('ENABLE_IMPORTD', have)
1048 want_remote = get_option('remote')
1049 if want_remote != 'false'
1050 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1051 conf.get('HAVE_LIBCURL') == 1]
1052 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1053 # it's possible to build one without the other. Complain only if
1054 # support was explictly requested. The auxiliary files like sysusers
1055 # config should be installed when any of the programs are built.
1056 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1057 error('remote support was requested, but dependencies are not available')
1059 have = have_deps[0] or have_deps[1]
1063 conf.set10('ENABLE_REMOTE', have)
1065 foreach term : ['utmp',
1096 have = get_option(term)
1097 name = 'ENABLE_' + term.underscorify().to_upper()
1098 conf.set10(name, have)
1099 m4_defines += have ? ['-D' + name] : []
1102 want_tests = get_option('tests')
1103 install_tests = get_option('install-tests')
1106 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1108 #####################################################################
1110 if get_option('efi')
1111 efi_arch = host_machine.cpu_family()
1113 if efi_arch == 'x86'
1114 EFI_MACHINE_TYPE_NAME = 'ia32'
1115 gnu_efi_arch = 'ia32'
1116 elif efi_arch == 'x86_64'
1117 EFI_MACHINE_TYPE_NAME = 'x64'
1118 gnu_efi_arch = 'x86_64'
1119 elif efi_arch == 'arm'
1120 EFI_MACHINE_TYPE_NAME = 'arm'
1121 gnu_efi_arch = 'arm'
1122 elif efi_arch == 'aarch64'
1123 EFI_MACHINE_TYPE_NAME = 'aa64'
1124 gnu_efi_arch = 'aarch64'
1126 EFI_MACHINE_TYPE_NAME = ''
1131 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1133 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1137 conf.set10('ENABLE_EFI', have)
1139 #####################################################################
1141 config_h = configure_file(
1142 output : 'config.h',
1143 configuration : conf)
1145 includes = include_directories('src/basic',
1155 'src/libsystemd/sd-bus',
1156 'src/libsystemd/sd-device',
1157 'src/libsystemd/sd-hwdb',
1158 'src/libsystemd/sd-id128',
1159 'src/libsystemd/sd-netlink',
1160 'src/libsystemd/sd-network',
1161 'src/libsystemd-network',
1165 add_project_arguments('-include', 'config.h', language : 'c')
1167 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1168 'src/shared/gcrypt-util.c')
1172 subdir('src/systemd')
1174 subdir('src/libsystemd')
1175 subdir('src/libsystemd-network')
1176 subdir('src/journal')
1179 libjournal_core = static_library(
1181 libjournal_core_sources,
1183 include_directories : includes,
1186 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1187 libsystemd = shared_library(
1189 libsystemd_internal_sources,
1190 journal_internal_sources,
1191 version : libsystemd_version,
1192 include_directories : includes,
1193 link_args : ['-shared',
1194 '-Wl,--version-script=' + libsystemd_sym_path],
1195 link_with : [libbasic],
1196 dependencies : [threads,
1201 link_depends : libsystemd_sym,
1203 install_dir : rootlibdir)
1205 ############################################################
1207 # binaries that have --help and are intended for use by humans,
1208 # usually, but not always, installed in /bin.
1209 public_programs = []
1211 subdir('src/libudev')
1212 subdir('src/shared')
1215 subdir('src/network')
1217 subdir('src/analyze')
1218 subdir('src/journal-remote')
1219 subdir('src/coredump')
1220 subdir('src/hostname')
1221 subdir('src/import')
1222 subdir('src/kernel-install')
1223 subdir('src/locale')
1224 subdir('src/machine')
1225 subdir('src/nspawn')
1226 subdir('src/resolve')
1227 subdir('src/timedate')
1228 subdir('src/timesync')
1229 subdir('src/vconsole')
1230 subdir('src/sulogin-shell')
1231 subdir('src/boot/efi')
1237 ############################################################
1239 # only static linking apart from libdl, to make sure that the
1240 # module is linked to all libraries that it uses.
1241 test_dlopen = executable(
1244 include_directories : includes,
1245 link_with : [libbasic],
1246 dependencies : [libdl])
1248 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1249 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1250 ['mymachines', 'ENABLE_MACHINED'],
1251 ['resolve', 'ENABLE_RESOLVE']]
1253 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1257 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1258 version_script_arg = join_paths(meson.current_source_dir(), sym)
1260 nss = shared_library(
1262 'src/nss-@0@/nss-@0@.c'.format(module),
1264 include_directories : includes,
1265 link_args : ['-shared',
1266 '-Wl,--version-script=' + version_script_arg,
1268 link_with : [libsystemd_internal,
1270 dependencies : [threads,
1274 install_dir : rootlibdir)
1276 # We cannot use shared_module because it does not support version suffix.
1277 # Unfortunately shared_library insists on creating the symlink…
1278 meson.add_install_script('sh', '-c',
1279 'rm $DESTDIR@0@/libnss_@1@.so'
1280 .format(rootlibdir, module))
1282 test('dlopen-nss_' + module,
1284 args : [nss.full_path()]) # path to dlopen must include a slash
1288 ############################################################
1290 executable('systemd',
1292 include_directories : includes,
1293 link_with : [libcore,
1295 dependencies : [threads,
1301 install_rpath : rootlibexecdir,
1303 install_dir : rootlibexecdir)
1305 exe = executable('systemd-analyze',
1306 systemd_analyze_sources,
1307 include_directories : includes,
1308 link_with : [libcore,
1310 dependencies : [threads,
1316 install_rpath : rootlibexecdir,
1318 public_programs += [exe]
1320 executable('systemd-journald',
1321 systemd_journald_sources,
1322 include_directories : includes,
1323 link_with : [libjournal_core,
1325 dependencies : [threads,
1329 install_rpath : rootlibexecdir,
1331 install_dir : rootlibexecdir)
1333 exe = executable('systemd-cat',
1334 systemd_cat_sources,
1335 include_directories : includes,
1336 link_with : [libjournal_core,
1338 dependencies : [threads],
1339 install_rpath : rootlibexecdir,
1341 public_programs += [exe]
1343 exe = executable('journalctl',
1345 include_directories : includes,
1346 link_with : [libshared],
1347 dependencies : [threads,
1351 install_rpath : rootlibexecdir,
1353 install_dir : rootbindir)
1354 public_programs += [exe]
1356 executable('systemd-getty-generator',
1357 'src/getty-generator/getty-generator.c',
1358 include_directories : includes,
1359 link_with : [libshared],
1360 install_rpath : rootlibexecdir,
1362 install_dir : systemgeneratordir)
1364 executable('systemd-debug-generator',
1365 'src/debug-generator/debug-generator.c',
1366 include_directories : includes,
1367 link_with : [libshared],
1368 install_rpath : rootlibexecdir,
1370 install_dir : systemgeneratordir)
1372 executable('systemd-fstab-generator',
1373 'src/fstab-generator/fstab-generator.c',
1374 'src/core/mount-setup.c',
1375 include_directories : includes,
1376 link_with : [libshared],
1377 install_rpath : rootlibexecdir,
1379 install_dir : systemgeneratordir)
1381 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1382 executable('30-systemd-environment-d-generator',
1383 'src/environment-d-generator/environment-d-generator.c',
1384 include_directories : includes,
1385 link_with : [libshared],
1386 install_rpath : rootlibexecdir,
1388 install_dir : userenvgeneratordir)
1390 meson.add_install_script(meson_make_symlink,
1391 join_paths(sysconfdir, 'environment'),
1392 join_paths(environmentdir, '99-environment.conf'))
1395 if conf.get('ENABLE_HIBERNATE') == 1
1396 executable('systemd-hibernate-resume-generator',
1397 'src/hibernate-resume/hibernate-resume-generator.c',
1398 include_directories : includes,
1399 link_with : [libshared],
1400 install_rpath : rootlibexecdir,
1402 install_dir : systemgeneratordir)
1404 executable('systemd-hibernate-resume',
1405 'src/hibernate-resume/hibernate-resume.c',
1406 include_directories : includes,
1407 link_with : [libshared],
1408 install_rpath : rootlibexecdir,
1410 install_dir : rootlibexecdir)
1413 if conf.get('HAVE_BLKID') == 1
1414 executable('systemd-gpt-auto-generator',
1415 'src/gpt-auto-generator/gpt-auto-generator.c',
1416 'src/basic/blkid-util.h',
1417 include_directories : includes,
1418 link_with : [libshared],
1419 dependencies : libblkid,
1420 install_rpath : rootlibexecdir,
1422 install_dir : systemgeneratordir)
1424 exe = executable('systemd-dissect',
1425 'src/dissect/dissect.c',
1426 include_directories : includes,
1427 link_with : [libshared],
1428 install_rpath : rootlibexecdir,
1430 install_dir : rootlibexecdir)
1431 public_programs += [exe]
1434 if conf.get('ENABLE_RESOLVE') == 1
1435 executable('systemd-resolved',
1436 systemd_resolved_sources,
1437 gcrypt_util_sources,
1438 include_directories : includes,
1439 link_with : [libshared],
1440 dependencies : [threads,
1445 install_rpath : rootlibexecdir,
1447 install_dir : rootlibexecdir)
1449 exe = executable('systemd-resolve',
1450 systemd_resolve_sources,
1451 gcrypt_util_sources,
1452 include_directories : includes,
1453 link_with : [libshared],
1454 dependencies : [threads,
1459 install_rpath : rootlibexecdir,
1461 public_programs += [exe]
1464 if conf.get('ENABLE_LOGIND') == 1
1465 executable('systemd-logind',
1466 systemd_logind_sources,
1467 include_directories : includes,
1468 link_with : [liblogind_core,
1470 dependencies : [threads,
1472 install_rpath : rootlibexecdir,
1474 install_dir : rootlibexecdir)
1476 exe = executable('loginctl',
1478 include_directories : includes,
1479 link_with : [libshared],
1480 dependencies : [threads,
1483 install_rpath : rootlibexecdir,
1485 install_dir : rootbindir)
1486 public_programs += [exe]
1488 exe = executable('systemd-inhibit',
1489 'src/login/inhibit.c',
1490 include_directories : includes,
1491 link_with : [libshared],
1492 install_rpath : rootlibexecdir,
1494 install_dir : rootbindir)
1495 public_programs += [exe]
1497 if conf.get('HAVE_PAM') == 1
1498 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1499 pam_systemd = shared_library(
1503 include_directories : includes,
1504 link_args : ['-shared',
1505 '-Wl,--version-script=' + version_script_arg],
1506 link_with : [libsystemd_internal,
1508 dependencies : [threads,
1511 link_depends : pam_systemd_sym,
1513 install_dir : pamlibdir)
1515 test('dlopen-pam_systemd',
1517 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1521 if conf.get('HAVE_PAM') == 1
1522 executable('systemd-user-sessions',
1523 'src/user-sessions/user-sessions.c',
1524 include_directories : includes,
1525 link_with : [libshared],
1526 install_rpath : rootlibexecdir,
1528 install_dir : rootlibexecdir)
1531 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1532 exe = executable('bootctl',
1533 'src/boot/bootctl.c',
1534 include_directories : includes,
1535 link_with : [libshared],
1536 dependencies : [libblkid],
1537 install_rpath : rootlibexecdir,
1539 public_programs += [exe]
1542 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1543 include_directories : includes,
1544 link_with : [libshared],
1545 dependencies : [threads],
1546 install_rpath : rootlibexecdir,
1548 public_programs += [exe]
1550 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1551 include_directories : includes,
1552 link_with : [libshared],
1553 dependencies : [threads,
1558 install_rpath : rootlibexecdir,
1560 install_dir : rootbindir)
1561 public_programs += [exe]
1563 if conf.get('ENABLE_BACKLIGHT') == 1
1564 executable('systemd-backlight',
1565 'src/backlight/backlight.c',
1566 include_directories : includes,
1567 link_with : [libshared],
1568 install_rpath : rootlibexecdir,
1570 install_dir : rootlibexecdir)
1573 if conf.get('ENABLE_RFKILL') == 1
1574 executable('systemd-rfkill',
1575 'src/rfkill/rfkill.c',
1576 include_directories : includes,
1577 link_with : [libshared],
1578 install_rpath : rootlibexecdir,
1580 install_dir : rootlibexecdir)
1583 executable('systemd-system-update-generator',
1584 'src/system-update-generator/system-update-generator.c',
1585 include_directories : includes,
1586 link_with : [libshared],
1587 install_rpath : rootlibexecdir,
1589 install_dir : systemgeneratordir)
1591 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1592 executable('systemd-cryptsetup',
1593 'src/cryptsetup/cryptsetup.c',
1594 include_directories : includes,
1595 link_with : [libshared],
1596 dependencies : [libcryptsetup],
1597 install_rpath : rootlibexecdir,
1599 install_dir : rootlibexecdir)
1601 executable('systemd-cryptsetup-generator',
1602 'src/cryptsetup/cryptsetup-generator.c',
1603 include_directories : includes,
1604 link_with : [libshared],
1605 dependencies : [libcryptsetup],
1606 install_rpath : rootlibexecdir,
1608 install_dir : systemgeneratordir)
1610 executable('systemd-veritysetup',
1611 'src/veritysetup/veritysetup.c',
1612 include_directories : includes,
1613 link_with : [libshared],
1614 dependencies : [libcryptsetup],
1615 install_rpath : rootlibexecdir,
1617 install_dir : rootlibexecdir)
1619 executable('systemd-veritysetup-generator',
1620 'src/veritysetup/veritysetup-generator.c',
1621 include_directories : includes,
1622 link_with : [libshared],
1623 dependencies : [libcryptsetup],
1624 install_rpath : rootlibexecdir,
1626 install_dir : systemgeneratordir)
1629 if conf.get('HAVE_SYSV_COMPAT') == 1
1630 executable('systemd-sysv-generator',
1631 'src/sysv-generator/sysv-generator.c',
1632 include_directories : includes,
1633 link_with : [libshared],
1634 install_rpath : rootlibexecdir,
1636 install_dir : systemgeneratordir)
1638 executable('systemd-rc-local-generator',
1639 'src/rc-local-generator/rc-local-generator.c',
1640 include_directories : includes,
1641 link_with : [libshared],
1642 install_rpath : rootlibexecdir,
1644 install_dir : systemgeneratordir)
1647 if conf.get('ENABLE_HOSTNAMED') == 1
1648 executable('systemd-hostnamed',
1649 'src/hostname/hostnamed.c',
1650 include_directories : includes,
1651 link_with : [libshared],
1652 install_rpath : rootlibexecdir,
1654 install_dir : rootlibexecdir)
1656 exe = executable('hostnamectl',
1657 'src/hostname/hostnamectl.c',
1658 include_directories : includes,
1659 link_with : [libshared],
1660 install_rpath : rootlibexecdir,
1662 public_programs += [exe]
1665 if conf.get('ENABLE_LOCALED') == 1
1666 if conf.get('HAVE_XKBCOMMON') == 1
1667 # logind will load libxkbcommon.so dynamically on its own
1673 executable('systemd-localed',
1674 systemd_localed_sources,
1675 include_directories : includes,
1676 link_with : [libshared],
1677 dependencies : deps,
1678 install_rpath : rootlibexecdir,
1680 install_dir : rootlibexecdir)
1682 exe = executable('localectl',
1684 include_directories : includes,
1685 link_with : [libshared],
1686 install_rpath : rootlibexecdir,
1688 public_programs += [exe]
1691 if conf.get('ENABLE_TIMEDATED') == 1
1692 executable('systemd-timedated',
1693 'src/timedate/timedated.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 install_rpath : rootlibexecdir,
1698 install_dir : rootlibexecdir)
1700 exe = executable('timedatectl',
1701 'src/timedate/timedatectl.c',
1702 include_directories : includes,
1703 install_rpath : rootlibexecdir,
1704 link_with : [libshared],
1706 public_programs += [exe]
1709 if conf.get('ENABLE_TIMESYNCD') == 1
1710 executable('systemd-timesyncd',
1711 systemd_timesyncd_sources,
1712 include_directories : includes,
1713 link_with : [libshared],
1714 dependencies : [threads,
1716 install_rpath : rootlibexecdir,
1718 install_dir : rootlibexecdir)
1721 if conf.get('ENABLE_MACHINED') == 1
1722 executable('systemd-machined',
1723 systemd_machined_sources,
1724 include_directories : includes,
1725 link_with : [libmachine_core,
1727 install_rpath : rootlibexecdir,
1729 install_dir : rootlibexecdir)
1731 exe = executable('machinectl',
1732 'src/machine/machinectl.c',
1733 include_directories : includes,
1734 link_with : [libshared],
1735 dependencies : [threads,
1738 install_rpath : rootlibexecdir,
1740 install_dir : rootbindir)
1741 public_programs += [exe]
1744 if conf.get('ENABLE_IMPORTD') == 1
1745 executable('systemd-importd',
1746 systemd_importd_sources,
1747 include_directories : includes,
1748 link_with : [libshared],
1749 dependencies : [threads],
1750 install_rpath : rootlibexecdir,
1752 install_dir : rootlibexecdir)
1754 systemd_pull = executable('systemd-pull',
1755 systemd_pull_sources,
1756 include_directories : includes,
1757 link_with : [libshared],
1758 dependencies : [libcurl,
1763 install_rpath : rootlibexecdir,
1765 install_dir : rootlibexecdir)
1767 systemd_import = executable('systemd-import',
1768 systemd_import_sources,
1769 include_directories : includes,
1770 link_with : [libshared],
1771 dependencies : [libcurl,
1775 install_rpath : rootlibexecdir,
1777 install_dir : rootlibexecdir)
1779 systemd_export = executable('systemd-export',
1780 systemd_export_sources,
1781 include_directories : includes,
1782 link_with : [libshared],
1783 dependencies : [libcurl,
1787 install_rpath : rootlibexecdir,
1789 install_dir : rootlibexecdir)
1790 public_programs += [systemd_pull, systemd_import, systemd_export]
1793 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1794 exe = executable('systemd-journal-upload',
1795 systemd_journal_upload_sources,
1796 include_directories : includes,
1797 link_with : [libshared],
1798 dependencies : [threads,
1803 install_rpath : rootlibexecdir,
1805 install_dir : rootlibexecdir)
1806 public_programs += [exe]
1809 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1810 s_j_remote = executable('systemd-journal-remote',
1811 systemd_journal_remote_sources,
1812 include_directories : includes,
1813 link_with : [libshared],
1814 dependencies : [threads,
1819 install_rpath : rootlibexecdir,
1821 install_dir : rootlibexecdir)
1823 s_j_gatewayd = executable('systemd-journal-gatewayd',
1824 systemd_journal_gatewayd_sources,
1825 include_directories : includes,
1826 link_with : [libshared],
1827 dependencies : [threads,
1832 install_rpath : rootlibexecdir,
1834 install_dir : rootlibexecdir)
1835 public_programs += [s_j_remote, s_j_gatewayd]
1838 if conf.get('ENABLE_COREDUMP') == 1
1839 executable('systemd-coredump',
1840 systemd_coredump_sources,
1841 include_directories : includes,
1842 link_with : [libshared],
1843 dependencies : [threads,
1848 install_rpath : rootlibexecdir,
1850 install_dir : rootlibexecdir)
1852 exe = executable('coredumpctl',
1853 coredumpctl_sources,
1854 include_directories : includes,
1855 link_with : [libshared],
1856 dependencies : [threads,
1859 install_rpath : rootlibexecdir,
1861 public_programs += [exe]
1864 if conf.get('ENABLE_BINFMT') == 1
1865 exe = executable('systemd-binfmt',
1866 'src/binfmt/binfmt.c',
1867 include_directories : includes,
1868 link_with : [libshared],
1869 install_rpath : rootlibexecdir,
1871 install_dir : rootlibexecdir)
1872 public_programs += [exe]
1874 meson.add_install_script('sh', '-c',
1875 mkdir_p.format(binfmtdir))
1876 meson.add_install_script('sh', '-c',
1877 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1880 if conf.get('ENABLE_VCONSOLE') == 1
1881 executable('systemd-vconsole-setup',
1882 'src/vconsole/vconsole-setup.c',
1883 include_directories : includes,
1884 link_with : [libshared],
1885 install_rpath : rootlibexecdir,
1887 install_dir : rootlibexecdir)
1890 if conf.get('ENABLE_RANDOMSEED') == 1
1891 executable('systemd-random-seed',
1892 'src/random-seed/random-seed.c',
1893 include_directories : includes,
1894 link_with : [libshared],
1895 install_rpath : rootlibexecdir,
1897 install_dir : rootlibexecdir)
1900 if conf.get('ENABLE_FIRSTBOOT') == 1
1901 executable('systemd-firstboot',
1902 'src/firstboot/firstboot.c',
1903 include_directories : includes,
1904 link_with : [libshared],
1905 dependencies : [libcrypt],
1906 install_rpath : rootlibexecdir,
1908 install_dir : rootbindir)
1911 executable('systemd-remount-fs',
1912 'src/remount-fs/remount-fs.c',
1913 'src/core/mount-setup.c',
1914 'src/core/mount-setup.h',
1915 include_directories : includes,
1916 link_with : [libshared],
1917 install_rpath : rootlibexecdir,
1919 install_dir : rootlibexecdir)
1921 executable('systemd-machine-id-setup',
1922 'src/machine-id-setup/machine-id-setup-main.c',
1923 'src/core/machine-id-setup.c',
1924 'src/core/machine-id-setup.h',
1925 include_directories : includes,
1926 link_with : [libshared],
1927 install_rpath : rootlibexecdir,
1929 install_dir : rootbindir)
1931 executable('systemd-fsck',
1933 include_directories : includes,
1934 link_with : [libshared],
1935 install_rpath : rootlibexecdir,
1937 install_dir : rootlibexecdir)
1939 executable('systemd-sleep',
1940 'src/sleep/sleep.c',
1941 include_directories : includes,
1942 link_with : [libshared],
1943 install_rpath : rootlibexecdir,
1945 install_dir : rootlibexecdir)
1947 exe = executable('systemd-sysctl',
1948 'src/sysctl/sysctl.c',
1949 include_directories : includes,
1950 link_with : [libshared],
1951 install_rpath : rootlibexecdir,
1953 install_dir : rootlibexecdir)
1954 public_programs += [exe]
1956 executable('systemd-ac-power',
1957 'src/ac-power/ac-power.c',
1958 include_directories : includes,
1959 link_with : [libshared],
1960 install_rpath : rootlibexecdir,
1962 install_dir : rootlibexecdir)
1964 exe = executable('systemd-detect-virt',
1965 'src/detect-virt/detect-virt.c',
1966 include_directories : includes,
1967 link_with : [libshared],
1968 install_rpath : rootlibexecdir,
1970 public_programs += [exe]
1972 exe = executable('systemd-delta',
1973 'src/delta/delta.c',
1974 include_directories : includes,
1975 link_with : [libshared],
1976 install_rpath : rootlibexecdir,
1978 public_programs += [exe]
1980 exe = executable('systemd-escape',
1981 'src/escape/escape.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 install_rpath : rootlibexecdir,
1986 install_dir : rootbindir)
1987 public_programs += [exe]
1989 exe = executable('systemd-notify',
1990 'src/notify/notify.c',
1991 include_directories : includes,
1992 link_with : [libshared],
1993 install_rpath : rootlibexecdir,
1995 install_dir : rootbindir)
1996 public_programs += [exe]
1998 executable('systemd-volatile-root',
1999 'src/volatile-root/volatile-root.c',
2000 include_directories : includes,
2001 link_with : [libshared],
2002 install_rpath : rootlibexecdir,
2004 install_dir : rootlibexecdir)
2006 executable('systemd-cgroups-agent',
2007 'src/cgroups-agent/cgroups-agent.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2012 install_dir : rootlibexecdir)
2014 exe = executable('systemd-path',
2016 include_directories : includes,
2017 link_with : [libshared],
2018 install_rpath : rootlibexecdir,
2020 public_programs += [exe]
2022 exe = executable('systemd-ask-password',
2023 'src/ask-password/ask-password.c',
2024 include_directories : includes,
2025 link_with : [libshared],
2026 install_rpath : rootlibexecdir,
2028 install_dir : rootbindir)
2029 public_programs += [exe]
2031 executable('systemd-reply-password',
2032 'src/reply-password/reply-password.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 install_rpath : rootlibexecdir,
2037 install_dir : rootlibexecdir)
2039 exe = executable('systemd-tty-ask-password-agent',
2040 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 install_rpath : rootlibexecdir,
2045 install_dir : rootbindir)
2046 public_programs += [exe]
2048 exe = executable('systemd-cgls',
2050 include_directories : includes,
2051 link_with : [libshared],
2052 install_rpath : rootlibexecdir,
2054 public_programs += [exe]
2056 exe = executable('systemd-cgtop',
2057 'src/cgtop/cgtop.c',
2058 include_directories : includes,
2059 link_with : [libshared],
2060 install_rpath : rootlibexecdir,
2062 public_programs += [exe]
2064 executable('systemd-initctl',
2065 'src/initctl/initctl.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 install_rpath : rootlibexecdir,
2070 install_dir : rootlibexecdir)
2072 exe = executable('systemd-mount',
2073 'src/mount/mount-tool.c',
2074 include_directories : includes,
2075 link_with : [libshared],
2076 install_rpath : rootlibexecdir,
2078 public_programs += [exe]
2080 meson.add_install_script(meson_make_symlink,
2081 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2083 exe = executable('systemd-run',
2085 include_directories : includes,
2086 link_with : [libshared],
2087 install_rpath : rootlibexecdir,
2089 public_programs += [exe]
2091 exe = executable('systemd-stdio-bridge',
2092 'src/stdio-bridge/stdio-bridge.c',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 install_rpath : rootlibexecdir,
2097 public_programs += [exe]
2099 exe = executable('busctl',
2100 'src/busctl/busctl.c',
2101 'src/busctl/busctl-introspect.c',
2102 'src/busctl/busctl-introspect.h',
2103 include_directories : includes,
2104 link_with : [libshared],
2105 install_rpath : rootlibexecdir,
2107 public_programs += [exe]
2109 if conf.get('ENABLE_SYSUSERS') == 1
2110 exe = executable('systemd-sysusers',
2111 'src/sysusers/sysusers.c',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootbindir)
2117 public_programs += [exe]
2120 if conf.get('ENABLE_TMPFILES') == 1
2121 exe = executable('systemd-tmpfiles',
2122 'src/tmpfiles/tmpfiles.c',
2123 include_directories : includes,
2124 link_with : [libshared],
2125 dependencies : [libacl],
2126 install_rpath : rootlibexecdir,
2128 install_dir : rootbindir)
2129 public_programs += [exe]
2132 if conf.get('ENABLE_HWDB') == 1
2133 exe = executable('systemd-hwdb',
2135 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2136 include_directories : includes,
2137 link_with : [libudev_internal],
2138 install_rpath : udev_rpath,
2140 install_dir : rootbindir)
2141 public_programs += [exe]
2144 if conf.get('ENABLE_QUOTACHECK') == 1
2145 executable('systemd-quotacheck',
2146 'src/quotacheck/quotacheck.c',
2147 include_directories : includes,
2148 link_with : [libshared],
2149 install_rpath : rootlibexecdir,
2151 install_dir : rootlibexecdir)
2154 exe = executable('systemd-socket-proxyd',
2155 'src/socket-proxy/socket-proxyd.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 dependencies : [threads],
2159 install_rpath : rootlibexecdir,
2161 install_dir : rootlibexecdir)
2162 public_programs += [exe]
2164 exe = executable('systemd-udevd',
2165 systemd_udevd_sources,
2166 include_directories : includes,
2167 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2168 link_with : [libudev_core,
2171 dependencies : [threads,
2176 install_rpath : udev_rpath,
2178 install_dir : rootlibexecdir)
2179 public_programs += [exe]
2181 exe = executable('udevadm',
2183 include_directories : includes,
2184 link_with : [libudev_core,
2187 dependencies : [threads,
2192 install_rpath : udev_rpath,
2194 install_dir : rootbindir)
2195 public_programs += [exe]
2197 executable('systemd-shutdown',
2198 systemd_shutdown_sources,
2199 include_directories : includes,
2200 link_with : [libshared],
2201 install_rpath : rootlibexecdir,
2203 install_dir : rootlibexecdir)
2205 executable('systemd-update-done',
2206 'src/update-done/update-done.c',
2207 include_directories : includes,
2208 link_with : [libshared],
2209 install_rpath : rootlibexecdir,
2211 install_dir : rootlibexecdir)
2213 executable('systemd-update-utmp',
2214 'src/update-utmp/update-utmp.c',
2215 include_directories : includes,
2216 link_with : [libshared],
2217 dependencies : [libaudit],
2218 install_rpath : rootlibexecdir,
2220 install_dir : rootlibexecdir)
2222 if conf.get('HAVE_KMOD') == 1
2223 executable('systemd-modules-load',
2224 'src/modules-load/modules-load.c',
2225 include_directories : includes,
2226 link_with : [libshared],
2227 dependencies : [libkmod],
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootlibexecdir)
2232 meson.add_install_script('sh', '-c',
2233 mkdir_p.format(modulesloaddir))
2234 meson.add_install_script('sh', '-c',
2235 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2238 exe = executable('systemd-nspawn',
2239 systemd_nspawn_sources,
2240 'src/core/mount-setup.c', # FIXME: use a variable?
2241 'src/core/mount-setup.h',
2242 'src/core/loopback-setup.c',
2243 'src/core/loopback-setup.h',
2244 include_directories : [includes, include_directories('src/nspawn')],
2245 link_with : [libshared],
2246 dependencies : [libacl,
2250 install_rpath : rootlibexecdir,
2252 public_programs += [exe]
2254 if conf.get('ENABLE_NETWORKD') == 1
2255 executable('systemd-networkd',
2256 systemd_networkd_sources,
2257 include_directories : includes,
2258 link_with : [libnetworkd_core,
2262 dependencies : [threads],
2263 install_rpath : rootlibexecdir,
2265 install_dir : rootlibexecdir)
2267 executable('systemd-networkd-wait-online',
2268 systemd_networkd_wait_online_sources,
2269 include_directories : includes,
2270 link_with : [libnetworkd_core,
2272 install_rpath : rootlibexecdir,
2274 install_dir : rootlibexecdir)
2276 exe = executable('networkctl',
2278 include_directories : includes,
2279 link_with : [libsystemd_network,
2281 install_rpath : rootlibexecdir,
2283 install_dir : rootbindir)
2284 public_programs += [exe]
2286 ############################################################
2288 foreach tuple : tests
2290 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2291 dependencies = tuple[2]
2292 condition = tuple.length() >= 4 ? tuple[3] : ''
2293 type = tuple.length() >= 5 ? tuple[4] : ''
2294 defs = tuple.length() >= 6 ? tuple[5] : []
2295 incs = tuple.length() >= 7 ? tuple[6] : includes
2298 name = sources[0].split('/')[-1].split('.')[0]
2299 if type.startswith('timeout=')
2300 timeout = type.split('=')[1].to_int()
2304 if condition == '' or conf.get(condition) == 1
2308 include_directories : incs,
2309 link_with : link_with,
2310 dependencies : dependencies,
2312 install_rpath : rootlibexecdir,
2313 install : install_tests,
2314 install_dir : join_paths(testsdir, type))
2317 message('@0@ is a manual test'.format(name))
2318 elif type == 'unsafe' and want_tests != 'unsafe'
2319 message('@0@ is an unsafe test'.format(name))
2326 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2330 test_libsystemd_sym = executable(
2331 'test-libsystemd-sym',
2332 test_libsystemd_sym_c,
2333 include_directories : includes,
2334 link_with : [libsystemd],
2335 install : install_tests,
2336 install_dir : testsdir)
2337 test('test-libsystemd-sym',
2338 test_libsystemd_sym)
2340 test_libudev_sym = executable(
2343 include_directories : includes,
2344 c_args : ['-Wno-deprecated-declarations'],
2345 link_with : [libudev],
2346 install : install_tests,
2347 install_dir : testsdir)
2348 test('test-libudev-sym',
2351 ############################################################
2353 make_directive_index_py = find_program('tools/make-directive-index.py')
2354 make_man_index_py = find_program('tools/make-man-index.py')
2355 xml_helper_py = find_program('tools/xml_helper.py')
2356 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2360 subdir('sysusers.d')
2361 subdir('tmpfiles.d')
2365 subdir('shell-completion/bash')
2366 subdir('shell-completion/zsh')
2367 subdir('docs/sysvinit')
2368 subdir('docs/var-log')
2370 # FIXME: figure out if the warning is true:
2371 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2372 install_subdir('factory/etc',
2373 install_dir : factorydir)
2376 install_data('xorg/50-systemd-user.sh',
2377 install_dir : xinitrcdir)
2378 install_data('system-preset/90-systemd.preset',
2379 install_dir : systempresetdir)
2380 install_data('modprobe.d/systemd.conf',
2381 install_dir : modprobedir)
2382 install_data('README',
2389 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2390 install_dir : docdir)
2392 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2393 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2395 ############################################################
2397 meson_check_help = find_program('tools/meson-check-help.sh')
2399 foreach exec : public_programs
2400 name = exec.full_path().split('/')[-1]
2401 test('check-help-' + name,
2403 args : [exec.full_path()])
2406 ############################################################
2409 all_files = run_command(
2411 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2414 all_files = files(all_files.stdout().split())
2419 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2423 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2427 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2430 command : [meson_git_contrib_sh])
2434 git_head = run_command(
2436 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2437 'rev-parse', 'HEAD']).stdout().strip()
2438 git_head_short = run_command(
2440 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2441 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2445 command : ['git', 'archive',
2446 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2448 '--prefix', 'systemd-@0@/'.format(git_head),
2452 ############################################################
2455 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2457 'prefix directory: @0@'.format(prefixdir),
2458 'rootprefix directory: @0@'.format(rootprefixdir),
2459 'sysconf directory: @0@'.format(sysconfdir),
2460 'include directory: @0@'.format(includedir),
2461 'lib directory: @0@'.format(libdir),
2462 'rootlib directory: @0@'.format(rootlibdir),
2463 'SysV init scripts: @0@'.format(sysvinit_path),
2464 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2465 'PAM modules directory: @0@'.format(pamlibdir),
2466 'PAM configuration directory: @0@'.format(pamconfdir),
2467 'RPM macros directory: @0@'.format(rpmmacrosdir),
2468 'modprobe.d directory: @0@'.format(modprobedir),
2469 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2470 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2471 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2472 'bash completions directory: @0@'.format(bashcompletiondir),
2473 'zsh completions directory: @0@'.format(zshcompletiondir),
2474 'extra start script: @0@'.format(get_option('rc-local')),
2475 'extra stop script: @0@'.format(get_option('halt-local')),
2476 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2477 get_option('debug-tty')),
2478 'TTY GID: @0@'.format(tty_gid),
2479 'maximum system UID: @0@'.format(system_uid_max),
2480 'maximum system GID: @0@'.format(system_gid_max),
2481 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2482 'render group access mode: @0@'.format(get_option('group-render-mode')),
2483 'certificate root directory: @0@'.format(get_option('certificate-root')),
2484 'support URL: @0@'.format(support_url),
2485 'nobody user name: @0@'.format(get_option('nobody-user')),
2486 'nobody group name: @0@'.format(get_option('nobody-group')),
2487 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2488 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2490 'default DNSSEC mode: @0@'.format(default_dnssec),
2491 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2492 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2494 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2495 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2497 'default DNS servers: @0@'.format(alt_dns_servers),
2498 'default NTP servers: @0@'.format(alt_ntp_servers)]
2500 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2501 '@@0@'.format(time_epoch)).stdout().strip()
2503 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2506 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2507 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2508 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2510 if conf.get('ENABLE_EFI') == 1
2512 'efi arch: @0@'.format(efi_arch)]
2516 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2517 'EFI CC @0@'.format(efi_cc),
2518 'EFI lib directory: @0@'.format(efi_libdir),
2519 'EFI lds directory: @0@'.format(efi_ldsdir),
2520 'EFI include directory: @0@'.format(efi_incdir)]
2573 ['legacy pkla', install_polkit_pkla],
2575 ['gnu-efi', have_gnu_efi],
2581 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2584 ['man pages', want_man],
2585 ['html pages', want_html],
2586 ['man page indices', want_man and have_lxml],
2587 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2592 ['adm group', get_option('adm-group')],
2593 ['wheel group', get_option('wheel-group')],
2596 ['debug mmap cache'],
2599 cond = tuple.get(1, '')
2601 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2602 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2603 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2608 missing += [tuple[0]]
2614 'enabled features: @0@'.format(', '.join(found)),
2616 'disabled features: @0@'.format(', '.join(missing)),
2618 message('\n '.join(status))
2620 if rootprefixdir != rootprefix_default
2621 message('WARNING:\n' +
2622 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2623 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2624 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))