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 conf.set10('HAVE_SPLIT_USR', get_option('split-usr'))
58 rootprefixdir = get_option('split-usr') ? '/' : '/usr'
60 sysvinit_path = get_option('sysvinit-path')
61 sysvrcnd_path = get_option('sysvrcnd-path')
62 have = sysvinit_path != '' or sysvrcnd_path != ''
63 conf.set10('HAVE_SYSV_COMPAT', have,
64 description : 'SysV init scripts and rcN.d links are supported')
65 m4_defines += have ? ['-DHAVE_SYSV_COMPAT'] : []
67 # join_paths ignore the preceding arguments if an absolute component is
68 # encountered, so this should canonicalize various paths when they are
69 # absolute or relative.
70 prefixdir = get_option('prefix')
71 if not prefixdir.startswith('/')
72 error('Prefix is not absolute: "@0@"'.format(prefixdir))
74 bindir = join_paths(prefixdir, get_option('bindir'))
75 libdir = join_paths(prefixdir, get_option('libdir'))
76 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
77 includedir = join_paths(prefixdir, get_option('includedir'))
78 datadir = join_paths(prefixdir, get_option('datadir'))
79 localstatedir = join_paths('/', get_option('localstatedir'))
81 rootbindir = join_paths(rootprefixdir, 'bin')
82 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
84 rootlibdir = get_option('rootlibdir')
86 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
89 # Dirs of external packages
90 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
91 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
92 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
93 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
94 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
95 varlogdir = join_paths(localstatedir, 'log')
96 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
97 rpmmacrosdir = get_option('rpmmacrosdir')
98 if rpmmacrosdir != 'no'
99 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
101 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
104 pkgdatadir = join_paths(datadir, 'systemd')
105 environmentdir = join_paths(prefixdir, 'lib/environment.d')
106 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
107 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
108 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
109 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
110 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
111 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
112 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
113 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
114 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
115 pkgincludedir = join_paths(includedir, 'systemd')
116 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
117 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
118 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
119 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
120 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
121 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
122 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
123 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
124 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
125 udevhomedir = udevlibexecdir
126 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
127 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
128 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
129 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
130 factorydir = join_paths(datadir, 'factory')
131 docdir = join_paths(datadir, 'doc/systemd')
132 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
133 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
134 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
135 catalogstatedir = join_paths(systemdstatedir, 'catalog')
136 randomseeddir = join_paths(localstatedir, 'lib/systemd')
138 dbuspolicydir = get_option('dbuspolicydir')
139 if dbuspolicydir == ''
140 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
143 dbussessionservicedir = get_option('dbussessionservicedir')
144 if dbussessionservicedir == ''
145 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
148 dbussystemservicedir = get_option('dbussystemservicedir')
149 if dbussystemservicedir == ''
150 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
153 pamlibdir = get_option('pamlibdir')
155 pamlibdir = join_paths(rootlibdir, 'security')
158 pamconfdir = get_option('pamconfdir')
160 pamconfdir = join_paths(sysconfdir, 'pam.d')
163 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
164 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
165 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
166 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
167 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
168 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
169 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
170 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
171 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
172 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
173 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
174 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
175 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
176 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
177 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
178 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
179 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
180 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
181 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
182 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
183 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
184 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
185 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
186 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
187 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
188 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
189 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
190 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
191 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
192 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
193 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
194 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
195 conf.set_quoted('LIBDIR', libdir)
196 conf.set_quoted('ROOTLIBDIR', rootlibdir)
197 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
198 conf.set_quoted('BOOTLIBDIR', bootlibdir)
199 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
200 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
201 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
202 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
203 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
204 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
206 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
207 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
209 substs.set('prefix', prefixdir)
210 substs.set('exec_prefix', prefixdir)
211 substs.set('libdir', libdir)
212 substs.set('rootlibdir', rootlibdir)
213 substs.set('includedir', includedir)
214 substs.set('pkgsysconfdir', pkgsysconfdir)
215 substs.set('bindir', bindir)
216 substs.set('rootbindir', rootbindir)
217 substs.set('rootlibexecdir', rootlibexecdir)
218 substs.set('systemunitdir', systemunitdir)
219 substs.set('userunitdir', userunitdir)
220 substs.set('systempresetdir', systempresetdir)
221 substs.set('userpresetdir', userpresetdir)
222 substs.set('udevhwdbdir', udevhwdbdir)
223 substs.set('udevrulesdir', udevrulesdir)
224 substs.set('udevlibexecdir', udevlibexecdir)
225 substs.set('catalogdir', catalogdir)
226 substs.set('tmpfilesdir', tmpfilesdir)
227 substs.set('sysusersdir', sysusersdir)
228 substs.set('sysctldir', sysctldir)
229 substs.set('binfmtdir', binfmtdir)
230 substs.set('modulesloaddir', modulesloaddir)
231 substs.set('systemgeneratordir', systemgeneratordir)
232 substs.set('usergeneratordir', usergeneratordir)
233 substs.set('systemenvgeneratordir', systemenvgeneratordir)
234 substs.set('userenvgeneratordir', userenvgeneratordir)
235 substs.set('systemshutdowndir', systemshutdowndir)
236 substs.set('systemsleepdir', systemsleepdir)
237 substs.set('VARLOGDIR', varlogdir)
238 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
239 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
240 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
241 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
242 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
243 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
244 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
246 #####################################################################
248 cc = meson.get_compiler('c')
249 pkgconfig = import('pkgconfig')
250 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
252 cxx = find_program('c++', required : false)
254 # Used only for tests
258 foreach arg : ['-Wextra',
261 '-Wmissing-include-dirs',
262 '-Wold-style-definition',
265 '-Wdeclaration-after-statement',
267 '-Wsuggest-attribute=noreturn',
268 '-Werror=missing-prototypes',
269 '-Werror=implicit-function-declaration',
270 '-Werror=missing-declarations',
271 '-Werror=return-type',
272 '-Werror=incompatible-pointer-types',
274 '-Wstrict-prototypes',
276 '-Wmissing-noreturn',
277 '-Wimplicit-fallthrough=5',
280 '-Wstrict-aliasing=2',
287 '-fdiagnostics-show-option',
288 '-fno-strict-aliasing',
289 '-fvisibility=hidden',
291 '-fstack-protector-strong',
293 '--param=ssp-buffer-size=4',
295 if cc.has_argument(arg)
296 add_project_arguments(arg, language : 'c')
300 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
301 # arguments, just emits a warnings. So test for the "positive" version instead.
302 foreach arg : ['unused-parameter',
303 'missing-field-initializers',
306 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
308 if cc.has_argument('-W' + arg)
309 add_project_arguments('-Wno-' + arg, language : 'c')
315 #include <inttypes.h>
316 typedef uint64_t usec_t;
317 usec_t now(clockid_t clock);
322 ', name : '-Werror=shadow with local shadowing')
323 add_project_arguments('-Werror=shadow', language : 'c')
326 if cc.get_id() == 'clang'
327 foreach arg : ['-Wno-typedef-redefinition',
328 '-Wno-gnu-variable-sized-type-not-at-end',
330 if cc.has_argument(arg,
331 name : '@0@ is supported'.format(arg))
332 add_project_arguments(arg, language : 'c')
337 link_test_c = files('tools/meson-link-test.c')
339 # --as-needed and --no-undefined are provided by meson by default,
340 # run mesonconf to see what is enabled
341 foreach arg : ['-Wl,-z,relro',
346 have = run_command(check_compilation_sh,
347 cc.cmd_array(), '-x', 'c', arg,
348 '-include', link_test_c).returncode() == 0
349 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
351 add_project_link_arguments(arg, language : 'c')
355 if get_option('buildtype') != 'debug'
356 foreach arg : ['-ffunction-sections',
358 if cc.has_argument(arg,
359 name : '@0@ is supported'.format(arg))
360 add_project_arguments(arg, language : 'c')
364 foreach arg : ['-Wl,--gc-sections']
365 have = run_command(check_compilation_sh,
366 cc.cmd_array(), '-x', 'c', arg,
367 '-include', link_test_c).returncode() == 0
368 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
370 add_project_link_arguments(arg, language : 'c')
375 cpp = ' '.join(cc.cmd_array()) + ' -E'
377 #####################################################################
378 # compilation result tests
380 conf.set('_GNU_SOURCE', true)
381 conf.set('__SANE_USERSPACE_TYPES__', true)
383 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
384 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
385 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
386 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
387 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
388 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
389 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
393 #include <linux/ethtool.h>
394 #include <linux/fib_rules.h>
396 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
398 foreach decl : ['char16_t',
401 'struct ethtool_link_settings',
402 'struct fib_rule_uid_range',
405 # We get -1 if the size cannot be determined
406 have = cc.sizeof(decl, prefix : decl_headers) > 0
407 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
410 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
411 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
412 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
413 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
414 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
415 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
416 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
417 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
418 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
419 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
420 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
421 # if_tunnel.h is buggy and cannot be included on its own
422 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
423 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
424 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
425 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
426 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
427 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
428 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
429 ['NDA_IFINDEX', 'linux/neighbour.h'],
430 ['IFA_FLAGS', 'linux/if_addr.h'],
431 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
432 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
433 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
435 prefix = decl.length() > 2 ? decl[2] : ''
436 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
437 conf.set10('HAVE_' + decl[0], have)
440 foreach ident : ['secure_getenv', '__secure_getenv']
441 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
445 ['memfd_create', '''#define _GNU_SOURCE
446 #include <sys/mman.h>'''],
447 ['gettid', '''#include <sys/types.h>'''],
448 ['pivot_root', '''#include <stdlib.h>'''], # no known header declares pivot_root
449 ['name_to_handle_at', '''#define _GNU_SOURCE
450 #include <sys/types.h>
451 #include <sys/stat.h>
452 #include <fcntl.h>'''],
453 ['setns', '''#define _GNU_SOURCE
454 #include <sched.h>'''],
455 ['renameat2', '''#include <stdio.h>'''],
456 ['kcmp', '''#include <linux/kcmp.h>'''],
457 ['keyctl', '''#include <sys/types.h>
458 #include <keyutils.h>'''],
459 ['copy_file_range', '''#include <sys/syscall.h>
460 #include <unistd.h>'''],
461 ['bpf', '''#include <sys/syscall.h>
462 #include <unistd.h>'''],
463 ['explicit_bzero' , '''#include <string.h>'''],
466 have = cc.has_function(ident[0], prefix : ident[1])
467 conf.set10('HAVE_' + ident[0].to_upper(), have)
470 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''')
471 conf.set10('USE_SYS_RANDOM_H', true)
472 conf.set10('HAVE_GETRANDOM', true)
474 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
475 conf.set10('USE_SYS_RANDOM_H', false)
476 conf.set10('HAVE_GETRANDOM', have)
479 #####################################################################
481 sed = find_program('sed')
482 awk = find_program('awk')
483 m4 = find_program('m4')
484 stat = find_program('stat')
485 git = find_program('git', required : false)
487 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
488 mkdir_p = 'mkdir -p $DESTDIR/@0@'
489 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
490 splash_bmp = files('test/splash.bmp')
492 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
493 # /usr/sbin, /sbin, and fall back to the default from middle column.
494 progs = [['telinit', '/lib/sysvinit/telinit'],
495 ['quotaon', '/usr/sbin/quotaon' ],
496 ['quotacheck', '/usr/sbin/quotacheck' ],
497 ['kill', '/usr/bin/kill' ],
498 ['kmod', '/usr/bin/kmod' ],
499 ['kexec', '/usr/sbin/kexec' ],
500 ['sulogin', '/usr/sbin/sulogin' ],
501 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
502 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
503 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
504 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
507 path = get_option(prog[0] + '-path')
509 message('Using @1@ for @0@'.format(prog[0], path))
511 exe = find_program(prog[0],
512 '/usr/sbin/' + prog[0],
515 path = exe.found() ? exe.path() : prog[1]
517 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
518 conf.set_quoted(name, path)
519 substs.set(name, path)
522 if run_command('ln', '--relative', '--help').returncode() != 0
523 error('ln does not support --relative')
526 ############################################################
528 gperf = find_program('gperf')
530 gperf_test_format = '''
532 const char * in_word_set(const char *, @0@);
535 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
536 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
537 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
538 if cc.compiles(gperf_test)
539 gperf_len_type = 'size_t'
541 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
542 if cc.compiles(gperf_test)
543 gperf_len_type = 'unsigned'
545 error('unable to determine gperf len type')
548 message('gperf len type is @0@'.format(gperf_len_type))
549 conf.set('GPERF_LEN_TYPE', gperf_len_type,
550 description : 'The type of gperf "len" parameter')
552 ############################################################
554 if not cc.has_header('sys/capability.h')
555 error('POSIX caps headers not found')
557 foreach header : ['linux/btrfs.h',
559 'linux/vm_sockets.h',
561 'valgrind/memcheck.h',
562 'valgrind/valgrind.h',
565 conf.set10('HAVE_' + header.underscorify().to_upper(),
566 cc.has_header(header))
569 ############################################################
571 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
572 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
573 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
575 default_hierarchy = get_option('default-hierarchy')
576 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
577 description : 'default cgroup hierarchy as string')
578 if default_hierarchy == 'legacy'
579 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
580 elif default_hierarchy == 'hybrid'
581 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
583 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
586 time_epoch = get_option('time-epoch')
589 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
591 time_epoch = time_epoch.to_int()
592 conf.set('TIME_EPOCH', time_epoch)
594 system_uid_max = get_option('system-uid-max')
595 if system_uid_max == ''
596 system_uid_max = run_command(
598 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
599 '/etc/login.defs').stdout()
601 system_uid_max = system_uid_max.to_int()
602 conf.set('SYSTEM_UID_MAX', system_uid_max)
603 substs.set('systemuidmax', system_uid_max)
604 message('maximum system UID is @0@'.format(system_uid_max))
606 conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
607 conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
609 system_gid_max = get_option('system-gid-max')
610 if system_gid_max == ''
611 system_gid_max = run_command(
613 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
614 '/etc/login.defs').stdout()
616 system_gid_max = system_gid_max.to_int()
617 conf.set('SYSTEM_GID_MAX', system_gid_max)
618 substs.set('systemgidmax', system_gid_max)
619 message('maximum system GID is @0@'.format(system_gid_max))
621 tty_gid = get_option('tty-gid')
622 conf.set('TTY_GID', tty_gid)
623 substs.set('TTY_GID', tty_gid)
625 if get_option('adm-group')
626 m4_defines += ['-DENABLE_ADM_GROUP']
629 if get_option('wheel-group')
630 m4_defines += ['-DENABLE_WHEEL_GROUP']
633 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
634 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
636 kill_user_processes = get_option('default-kill-user-processes')
637 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
638 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
640 dns_servers = get_option('dns-servers')
641 conf.set_quoted('DNS_SERVERS', dns_servers)
642 substs.set('DNS_SERVERS', dns_servers)
644 ntp_servers = get_option('ntp-servers')
645 conf.set_quoted('NTP_SERVERS', ntp_servers)
646 substs.set('NTP_SERVERS', ntp_servers)
648 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
650 substs.set('SUSHELL', get_option('debug-shell'))
651 substs.set('DEBUGTTY', get_option('debug-tty'))
653 debug = get_option('debug')
654 enable_debug_hashmap = false
655 enable_debug_mmap_cache = false
657 foreach name : debug.split(',')
659 enable_debug_hashmap = true
660 elif name == 'mmap-cache'
661 enable_debug_mmap_cache = true
663 message('unknown debug option "@0@", ignoring'.format(name))
667 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
668 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
670 #####################################################################
672 threads = dependency('threads')
673 librt = cc.find_library('rt')
674 libm = cc.find_library('m')
675 libdl = cc.find_library('dl')
676 libcrypt = cc.find_library('crypt')
678 libcap = dependency('libcap', required : false)
679 if not libcap.found()
680 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
681 libcap = cc.find_library('cap')
684 libmount = dependency('mount',
687 want_seccomp = get_option('seccomp')
688 if want_seccomp != 'false'
689 libseccomp = dependency('libseccomp',
690 version : '>= 2.3.1',
691 required : want_seccomp == 'true')
692 have = libseccomp.found()
697 conf.set10('HAVE_SECCOMP', have)
698 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
700 want_selinux = get_option('selinux')
701 if want_selinux != 'false'
702 libselinux = dependency('libselinux',
703 version : '>= 2.1.9',
704 required : want_selinux == 'true')
705 have = libselinux.found()
710 conf.set10('HAVE_SELINUX', have)
711 m4_defines += have ? ['-DHAVE_SELINUX'] : []
713 want_apparmor = get_option('apparmor')
714 if want_apparmor != 'false'
715 libapparmor = dependency('libapparmor',
716 required : want_apparmor == 'true')
717 have = libapparmor.found()
722 conf.set10('HAVE_APPARMOR', have)
723 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
725 smack_run_label = get_option('smack-run-label')
726 if smack_run_label != ''
727 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
728 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
731 want_polkit = get_option('polkit')
732 install_polkit = false
733 install_polkit_pkla = false
734 if want_polkit != 'false'
735 install_polkit = true
737 libpolkit = dependency('polkit-gobject-1',
739 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
740 message('Old polkit detected, will install pkla files')
741 install_polkit_pkla = true
744 conf.set10('ENABLE_POLKIT', install_polkit)
746 want_acl = get_option('acl')
747 if want_acl != 'false'
748 libacl = cc.find_library('acl', required : want_acl == 'true')
749 have = libacl.found()
754 conf.set10('HAVE_ACL', have)
755 m4_defines += have ? ['-DHAVE_ACL'] : []
757 want_audit = get_option('audit')
758 if want_audit != 'false'
759 libaudit = dependency('audit', required : want_audit == 'true')
760 have = libaudit.found()
765 conf.set10('HAVE_AUDIT', have)
767 want_blkid = get_option('blkid')
768 if want_blkid != 'false'
769 libblkid = dependency('blkid', required : want_blkid == 'true')
770 have = libblkid.found()
775 conf.set10('HAVE_BLKID', have)
777 want_kmod = get_option('kmod')
778 if want_kmod != 'false'
779 libkmod = dependency('libkmod',
781 required : want_kmod == 'true')
782 have = libkmod.found()
787 conf.set10('HAVE_KMOD', have)
789 want_pam = get_option('pam')
790 if want_pam != 'false'
791 libpam = cc.find_library('pam', required : want_pam == 'true')
792 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
793 have = libpam.found() and libpam_misc.found()
799 conf.set10('HAVE_PAM', have)
800 m4_defines += have ? ['-DHAVE_PAM'] : []
802 want_microhttpd = get_option('microhttpd')
803 if want_microhttpd != 'false'
804 libmicrohttpd = dependency('libmicrohttpd',
805 version : '>= 0.9.33',
806 required : want_microhttpd == 'true')
807 have = libmicrohttpd.found()
812 conf.set10('HAVE_MICROHTTPD', have)
813 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
815 want_libcryptsetup = get_option('libcryptsetup')
816 if want_libcryptsetup != 'false'
817 libcryptsetup = dependency('libcryptsetup',
818 version : '>= 1.6.0',
819 required : want_libcryptsetup == 'true')
820 have = libcryptsetup.found()
825 conf.set10('HAVE_LIBCRYPTSETUP', have)
827 want_libcurl = get_option('libcurl')
828 if want_libcurl != 'false'
829 libcurl = dependency('libcurl',
830 version : '>= 7.32.0',
831 required : want_libcurl == 'true')
832 have = libcurl.found()
837 conf.set10('HAVE_LIBCURL', have)
838 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
840 want_libidn = get_option('libidn')
841 want_libidn2 = get_option('libidn2')
842 if want_libidn == 'true' and want_libidn2 == 'true'
843 error('libidn and libidn2 cannot be requested simultaneously')
846 if want_libidn != 'false' and want_libidn2 != 'true'
847 libidn = dependency('libidn',
848 required : want_libidn == 'true')
849 have = libidn.found()
854 conf.set10('HAVE_LIBIDN', have)
855 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
856 if not have and want_libidn2 != 'false'
857 # libidn is used for both libidn and libidn2 objects
858 libidn = dependency('libidn2',
859 required : want_libidn2 == 'true')
860 have = libidn.found()
864 conf.set10('HAVE_LIBIDN2', have)
865 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
867 want_libiptc = get_option('libiptc')
868 if want_libiptc != 'false'
869 libiptc = dependency('libiptc',
870 required : want_libiptc == 'true')
871 have = libiptc.found()
876 conf.set10('HAVE_LIBIPTC', have)
877 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
879 want_qrencode = get_option('qrencode')
880 if want_qrencode != 'false'
881 libqrencode = dependency('libqrencode',
882 required : want_qrencode == 'true')
883 have = libqrencode.found()
888 conf.set10('HAVE_QRENCODE', have)
890 want_gcrypt = get_option('gcrypt')
891 if want_gcrypt != 'false'
892 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
893 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
894 have = libgcrypt.found() and libgpg_error.found()
899 # link to neither of the libs if one is not found
903 conf.set10('HAVE_GCRYPT', have)
905 want_gnutls = get_option('gnutls')
906 if want_gnutls != 'false'
907 libgnutls = dependency('gnutls',
908 version : '>= 3.1.4',
909 required : want_gnutls == 'true')
910 have = libgnutls.found()
915 conf.set10('HAVE_GNUTLS', have)
917 want_elfutils = get_option('elfutils')
918 if want_elfutils != 'false'
919 libdw = dependency('libdw',
920 required : want_elfutils == 'true')
926 conf.set10('HAVE_ELFUTILS', have)
928 want_zlib = get_option('zlib')
929 if want_zlib != 'false'
930 libz = dependency('zlib',
931 required : want_zlib == 'true')
937 conf.set10('HAVE_ZLIB', have)
939 want_bzip2 = get_option('bzip2')
940 if want_bzip2 != 'false'
941 libbzip2 = cc.find_library('bz2',
942 required : want_bzip2 == 'true')
943 have = libbzip2.found()
948 conf.set10('HAVE_BZIP2', have)
950 want_xz = get_option('xz')
951 if want_xz != 'false'
952 libxz = dependency('liblzma',
953 required : want_xz == 'true')
959 conf.set10('HAVE_XZ', have)
961 want_lz4 = get_option('lz4')
962 if want_lz4 != 'false'
963 liblz4 = dependency('liblz4',
964 required : want_lz4 == 'true')
965 have = liblz4.found()
970 conf.set10('HAVE_LZ4', have)
972 want_xkbcommon = get_option('xkbcommon')
973 if want_xkbcommon != 'false'
974 libxkbcommon = dependency('xkbcommon',
975 version : '>= 0.3.0',
976 required : want_xkbcommon == 'true')
977 have = libxkbcommon.found()
982 conf.set10('HAVE_XKBCOMMON', have)
984 want_glib = get_option('glib')
985 if want_glib != 'false'
986 libglib = dependency('glib-2.0',
987 version : '>= 2.22.0',
988 required : want_glib == 'true')
989 libgobject = dependency('gobject-2.0',
990 version : '>= 2.22.0',
991 required : want_glib == 'true')
992 libgio = dependency('gio-2.0',
993 required : want_glib == 'true')
994 have = libglib.found() and libgobject.found() and libgio.found()
1001 conf.set10('HAVE_GLIB', have)
1003 want_dbus = get_option('dbus')
1004 if want_dbus != 'false'
1005 libdbus = dependency('dbus-1',
1006 version : '>= 1.3.2',
1007 required : want_dbus == 'true')
1008 have = libdbus.found()
1013 conf.set10('HAVE_DBUS', have)
1015 default_dnssec = get_option('default-dnssec')
1016 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1017 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1018 default_dnssec = 'no'
1020 conf.set('DEFAULT_DNSSEC_MODE',
1021 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1022 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1024 want_importd = get_option('importd')
1025 if want_importd != 'false'
1026 have = (conf.get('HAVE_LIBCURL') == 1 and
1027 conf.get('HAVE_ZLIB') == 1 and
1028 conf.get('HAVE_BZIP2') == 1 and
1029 conf.get('HAVE_XZ') == 1 and
1030 conf.get('HAVE_GCRYPT') == 1)
1031 if want_importd == 'true' and not have
1032 error('importd support was requested, but dependencies are not available')
1037 conf.set10('ENABLE_IMPORTD', have)
1039 want_remote = get_option('remote')
1040 if want_remote != 'false'
1041 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1042 conf.get('HAVE_LIBCURL') == 1]
1043 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1044 # it's possible to build one without the other. Complain only if
1045 # support was explictly requested. The auxiliary files like sysusers
1046 # config should be installed when any of the programs are built.
1047 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1048 error('remote support was requested, but dependencies are not available')
1050 have = have_deps[0] or have_deps[1]
1054 conf.set10('ENABLE_REMOTE', have)
1056 foreach term : ['utmp',
1087 have = get_option(term)
1088 name = 'ENABLE_' + term.underscorify().to_upper()
1089 conf.set10(name, have)
1090 m4_defines += have ? ['-D' + name] : []
1093 want_tests = get_option('tests')
1094 install_tests = get_option('install-tests')
1097 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1099 #####################################################################
1101 if get_option('efi')
1102 efi_arch = host_machine.cpu_family()
1104 if efi_arch == 'x86'
1105 EFI_MACHINE_TYPE_NAME = 'ia32'
1106 gnu_efi_arch = 'ia32'
1107 elif efi_arch == 'x86_64'
1108 EFI_MACHINE_TYPE_NAME = 'x64'
1109 gnu_efi_arch = 'x86_64'
1110 elif efi_arch == 'arm'
1111 EFI_MACHINE_TYPE_NAME = 'arm'
1112 gnu_efi_arch = 'arm'
1113 elif efi_arch == 'aarch64'
1114 EFI_MACHINE_TYPE_NAME = 'aa64'
1115 gnu_efi_arch = 'aarch64'
1117 EFI_MACHINE_TYPE_NAME = ''
1122 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1124 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1128 conf.set10('ENABLE_EFI', have)
1130 #####################################################################
1132 config_h = configure_file(
1133 output : 'config.h',
1134 configuration : conf)
1136 includes = include_directories('src/basic',
1146 'src/libsystemd/sd-bus',
1147 'src/libsystemd/sd-device',
1148 'src/libsystemd/sd-hwdb',
1149 'src/libsystemd/sd-id128',
1150 'src/libsystemd/sd-netlink',
1151 'src/libsystemd/sd-network',
1152 'src/libsystemd-network',
1156 add_project_arguments('-include', 'config.h', language : 'c')
1158 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1159 'src/shared/gcrypt-util.c')
1163 subdir('src/systemd')
1165 subdir('src/libsystemd')
1166 subdir('src/libsystemd-network')
1167 subdir('src/journal')
1170 libjournal_core = static_library(
1172 libjournal_core_sources,
1174 include_directories : includes,
1177 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1178 libsystemd = shared_library(
1180 libsystemd_internal_sources,
1181 journal_internal_sources,
1182 version : libsystemd_version,
1183 include_directories : includes,
1184 link_args : ['-shared',
1185 '-Wl,--version-script=' + libsystemd_sym_path],
1186 link_with : [libbasic],
1187 dependencies : [threads,
1192 link_depends : libsystemd_sym,
1194 install_dir : rootlibdir)
1196 ############################################################
1198 # binaries that have --help and are intended for use by humans,
1199 # usually, but not always, installed in /bin.
1200 public_programs = []
1202 subdir('src/libudev')
1203 subdir('src/shared')
1206 subdir('src/network')
1208 subdir('src/analyze')
1209 subdir('src/journal-remote')
1210 subdir('src/coredump')
1211 subdir('src/hostname')
1212 subdir('src/import')
1213 subdir('src/kernel-install')
1214 subdir('src/locale')
1215 subdir('src/machine')
1216 subdir('src/nspawn')
1217 subdir('src/resolve')
1218 subdir('src/timedate')
1219 subdir('src/timesync')
1220 subdir('src/vconsole')
1221 subdir('src/sulogin-shell')
1222 subdir('src/boot/efi')
1228 ############################################################
1230 # only static linking apart from libdl, to make sure that the
1231 # module is linked to all libraries that it uses.
1232 test_dlopen = executable(
1235 include_directories : includes,
1236 link_with : [libbasic],
1237 dependencies : [libdl])
1239 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1240 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1241 ['mymachines', 'ENABLE_MACHINED'],
1242 ['resolve', 'ENABLE_RESOLVE']]
1244 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1248 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1249 version_script_arg = join_paths(meson.current_source_dir(), sym)
1251 nss = shared_library(
1253 'src/nss-@0@/nss-@0@.c'.format(module),
1255 include_directories : includes,
1256 link_args : ['-shared',
1257 '-Wl,--version-script=' + version_script_arg,
1259 link_with : [libsystemd_internal,
1261 dependencies : [threads,
1265 install_dir : rootlibdir)
1267 # We cannot use shared_module because it does not support version suffix.
1268 # Unfortunately shared_library insists on creating the symlink…
1269 meson.add_install_script('sh', '-c',
1270 'rm $DESTDIR@0@/libnss_@1@.so'
1271 .format(rootlibdir, module))
1273 test('dlopen-nss_' + module,
1275 args : [nss.full_path()]) # path to dlopen must include a slash
1279 ############################################################
1281 executable('systemd',
1283 include_directories : includes,
1284 link_with : [libcore,
1286 dependencies : [threads,
1292 install_rpath : rootlibexecdir,
1294 install_dir : rootlibexecdir)
1296 exe = executable('systemd-analyze',
1297 systemd_analyze_sources,
1298 include_directories : includes,
1299 link_with : [libcore,
1301 dependencies : [threads,
1307 install_rpath : rootlibexecdir,
1309 public_programs += [exe]
1311 executable('systemd-journald',
1312 systemd_journald_sources,
1313 include_directories : includes,
1314 link_with : [libjournal_core,
1316 dependencies : [threads,
1320 install_rpath : rootlibexecdir,
1322 install_dir : rootlibexecdir)
1324 exe = executable('systemd-cat',
1325 systemd_cat_sources,
1326 include_directories : includes,
1327 link_with : [libjournal_core,
1329 dependencies : [threads],
1330 install_rpath : rootlibexecdir,
1332 public_programs += [exe]
1334 exe = executable('journalctl',
1336 include_directories : includes,
1337 link_with : [libshared],
1338 dependencies : [threads,
1342 install_rpath : rootlibexecdir,
1344 install_dir : rootbindir)
1345 public_programs += [exe]
1347 executable('systemd-getty-generator',
1348 'src/getty-generator/getty-generator.c',
1349 include_directories : includes,
1350 link_with : [libshared],
1351 install_rpath : rootlibexecdir,
1353 install_dir : systemgeneratordir)
1355 executable('systemd-debug-generator',
1356 'src/debug-generator/debug-generator.c',
1357 include_directories : includes,
1358 link_with : [libshared],
1359 install_rpath : rootlibexecdir,
1361 install_dir : systemgeneratordir)
1363 executable('systemd-fstab-generator',
1364 'src/fstab-generator/fstab-generator.c',
1365 'src/core/mount-setup.c',
1366 include_directories : includes,
1367 link_with : [libshared],
1368 install_rpath : rootlibexecdir,
1370 install_dir : systemgeneratordir)
1372 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1373 executable('30-systemd-environment-d-generator',
1374 'src/environment-d-generator/environment-d-generator.c',
1375 include_directories : includes,
1376 link_with : [libshared],
1377 install_rpath : rootlibexecdir,
1379 install_dir : userenvgeneratordir)
1381 meson.add_install_script(meson_make_symlink,
1382 join_paths(sysconfdir, 'environment'),
1383 join_paths(environmentdir, '99-environment.conf'))
1386 if conf.get('ENABLE_HIBERNATE') == 1
1387 executable('systemd-hibernate-resume-generator',
1388 'src/hibernate-resume/hibernate-resume-generator.c',
1389 include_directories : includes,
1390 link_with : [libshared],
1391 install_rpath : rootlibexecdir,
1393 install_dir : systemgeneratordir)
1395 executable('systemd-hibernate-resume',
1396 'src/hibernate-resume/hibernate-resume.c',
1397 include_directories : includes,
1398 link_with : [libshared],
1399 install_rpath : rootlibexecdir,
1401 install_dir : rootlibexecdir)
1404 if conf.get('HAVE_BLKID') == 1
1405 executable('systemd-gpt-auto-generator',
1406 'src/gpt-auto-generator/gpt-auto-generator.c',
1407 'src/basic/blkid-util.h',
1408 include_directories : includes,
1409 link_with : [libshared],
1410 dependencies : libblkid,
1411 install_rpath : rootlibexecdir,
1413 install_dir : systemgeneratordir)
1415 exe = executable('systemd-dissect',
1416 'src/dissect/dissect.c',
1417 include_directories : includes,
1418 link_with : [libshared],
1419 install_rpath : rootlibexecdir,
1421 install_dir : rootlibexecdir)
1422 public_programs += [exe]
1425 if conf.get('ENABLE_RESOLVE') == 1
1426 executable('systemd-resolved',
1427 systemd_resolved_sources,
1428 gcrypt_util_sources,
1429 include_directories : includes,
1430 link_with : [libshared],
1431 dependencies : [threads,
1436 install_rpath : rootlibexecdir,
1438 install_dir : rootlibexecdir)
1440 exe = executable('systemd-resolve',
1441 systemd_resolve_sources,
1442 gcrypt_util_sources,
1443 include_directories : includes,
1444 link_with : [libshared],
1445 dependencies : [threads,
1450 install_rpath : rootlibexecdir,
1452 public_programs += [exe]
1455 if conf.get('ENABLE_LOGIND') == 1
1456 executable('systemd-logind',
1457 systemd_logind_sources,
1458 include_directories : includes,
1459 link_with : [liblogind_core,
1461 dependencies : [threads,
1463 install_rpath : rootlibexecdir,
1465 install_dir : rootlibexecdir)
1467 exe = executable('loginctl',
1469 include_directories : includes,
1470 link_with : [libshared],
1471 dependencies : [threads,
1474 install_rpath : rootlibexecdir,
1476 install_dir : rootbindir)
1477 public_programs += [exe]
1479 exe = executable('systemd-inhibit',
1480 'src/login/inhibit.c',
1481 include_directories : includes,
1482 link_with : [libshared],
1483 install_rpath : rootlibexecdir,
1485 install_dir : rootbindir)
1486 public_programs += [exe]
1488 if conf.get('HAVE_PAM') == 1
1489 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1490 pam_systemd = shared_library(
1494 include_directories : includes,
1495 link_args : ['-shared',
1496 '-Wl,--version-script=' + version_script_arg],
1497 link_with : [libsystemd_internal,
1499 dependencies : [threads,
1502 link_depends : pam_systemd_sym,
1504 install_dir : pamlibdir)
1506 test('dlopen-pam_systemd',
1508 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1512 if conf.get('HAVE_PAM') == 1
1513 executable('systemd-user-sessions',
1514 'src/user-sessions/user-sessions.c',
1515 include_directories : includes,
1516 link_with : [libshared],
1517 install_rpath : rootlibexecdir,
1519 install_dir : rootlibexecdir)
1522 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1523 exe = executable('bootctl',
1524 'src/boot/bootctl.c',
1525 include_directories : includes,
1526 link_with : [libshared],
1527 dependencies : [libblkid],
1528 install_rpath : rootlibexecdir,
1530 public_programs += [exe]
1533 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1534 include_directories : includes,
1535 link_with : [libshared],
1536 dependencies : [threads],
1537 install_rpath : rootlibexecdir,
1539 public_programs += [exe]
1541 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1542 include_directories : includes,
1543 link_with : [libshared],
1544 dependencies : [threads,
1549 install_rpath : rootlibexecdir,
1551 install_dir : rootbindir)
1552 public_programs += [exe]
1554 if conf.get('ENABLE_BACKLIGHT') == 1
1555 executable('systemd-backlight',
1556 'src/backlight/backlight.c',
1557 include_directories : includes,
1558 link_with : [libshared],
1559 install_rpath : rootlibexecdir,
1561 install_dir : rootlibexecdir)
1564 if conf.get('ENABLE_RFKILL') == 1
1565 executable('systemd-rfkill',
1566 'src/rfkill/rfkill.c',
1567 include_directories : includes,
1568 link_with : [libshared],
1569 install_rpath : rootlibexecdir,
1571 install_dir : rootlibexecdir)
1574 executable('systemd-system-update-generator',
1575 'src/system-update-generator/system-update-generator.c',
1576 include_directories : includes,
1577 link_with : [libshared],
1578 install_rpath : rootlibexecdir,
1580 install_dir : systemgeneratordir)
1582 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1583 executable('systemd-cryptsetup',
1584 'src/cryptsetup/cryptsetup.c',
1585 include_directories : includes,
1586 link_with : [libshared],
1587 dependencies : [libcryptsetup],
1588 install_rpath : rootlibexecdir,
1590 install_dir : rootlibexecdir)
1592 executable('systemd-cryptsetup-generator',
1593 'src/cryptsetup/cryptsetup-generator.c',
1594 include_directories : includes,
1595 link_with : [libshared],
1596 dependencies : [libcryptsetup],
1597 install_rpath : rootlibexecdir,
1599 install_dir : systemgeneratordir)
1601 executable('systemd-veritysetup',
1602 'src/veritysetup/veritysetup.c',
1603 include_directories : includes,
1604 link_with : [libshared],
1605 dependencies : [libcryptsetup],
1606 install_rpath : rootlibexecdir,
1608 install_dir : rootlibexecdir)
1610 executable('systemd-veritysetup-generator',
1611 'src/veritysetup/veritysetup-generator.c',
1612 include_directories : includes,
1613 link_with : [libshared],
1614 dependencies : [libcryptsetup],
1615 install_rpath : rootlibexecdir,
1617 install_dir : systemgeneratordir)
1620 if conf.get('HAVE_SYSV_COMPAT') == 1
1621 executable('systemd-sysv-generator',
1622 'src/sysv-generator/sysv-generator.c',
1623 include_directories : includes,
1624 link_with : [libshared],
1625 install_rpath : rootlibexecdir,
1627 install_dir : systemgeneratordir)
1629 executable('systemd-rc-local-generator',
1630 'src/rc-local-generator/rc-local-generator.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 install_rpath : rootlibexecdir,
1635 install_dir : systemgeneratordir)
1638 if conf.get('ENABLE_HOSTNAMED') == 1
1639 executable('systemd-hostnamed',
1640 'src/hostname/hostnamed.c',
1641 include_directories : includes,
1642 link_with : [libshared],
1643 install_rpath : rootlibexecdir,
1645 install_dir : rootlibexecdir)
1647 exe = executable('hostnamectl',
1648 'src/hostname/hostnamectl.c',
1649 include_directories : includes,
1650 link_with : [libshared],
1651 install_rpath : rootlibexecdir,
1653 public_programs += [exe]
1656 if conf.get('ENABLE_LOCALED') == 1
1657 if conf.get('HAVE_XKBCOMMON') == 1
1658 # logind will load libxkbcommon.so dynamically on its own
1664 executable('systemd-localed',
1665 systemd_localed_sources,
1666 include_directories : includes,
1667 link_with : [libshared],
1668 dependencies : deps,
1669 install_rpath : rootlibexecdir,
1671 install_dir : rootlibexecdir)
1673 exe = executable('localectl',
1675 include_directories : includes,
1676 link_with : [libshared],
1677 install_rpath : rootlibexecdir,
1679 public_programs += [exe]
1682 if conf.get('ENABLE_TIMEDATED') == 1
1683 executable('systemd-timedated',
1684 'src/timedate/timedated.c',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 install_rpath : rootlibexecdir,
1689 install_dir : rootlibexecdir)
1691 exe = executable('timedatectl',
1692 'src/timedate/timedatectl.c',
1693 include_directories : includes,
1694 install_rpath : rootlibexecdir,
1695 link_with : [libshared],
1697 public_programs += [exe]
1700 if conf.get('ENABLE_TIMESYNCD') == 1
1701 executable('systemd-timesyncd',
1702 systemd_timesyncd_sources,
1703 include_directories : includes,
1704 link_with : [libshared],
1705 dependencies : [threads,
1707 install_rpath : rootlibexecdir,
1709 install_dir : rootlibexecdir)
1712 if conf.get('ENABLE_MACHINED') == 1
1713 executable('systemd-machined',
1714 systemd_machined_sources,
1715 include_directories : includes,
1716 link_with : [libmachine_core,
1718 install_rpath : rootlibexecdir,
1720 install_dir : rootlibexecdir)
1722 exe = executable('machinectl',
1723 'src/machine/machinectl.c',
1724 include_directories : includes,
1725 link_with : [libshared],
1726 dependencies : [threads,
1729 install_rpath : rootlibexecdir,
1731 install_dir : rootbindir)
1732 public_programs += [exe]
1735 if conf.get('ENABLE_IMPORTD') == 1
1736 executable('systemd-importd',
1737 systemd_importd_sources,
1738 include_directories : includes,
1739 link_with : [libshared],
1740 dependencies : [threads],
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootlibexecdir)
1745 systemd_pull = executable('systemd-pull',
1746 systemd_pull_sources,
1747 include_directories : includes,
1748 link_with : [libshared],
1749 dependencies : [libcurl,
1754 install_rpath : rootlibexecdir,
1756 install_dir : rootlibexecdir)
1758 systemd_import = executable('systemd-import',
1759 systemd_import_sources,
1760 include_directories : includes,
1761 link_with : [libshared],
1762 dependencies : [libcurl,
1766 install_rpath : rootlibexecdir,
1768 install_dir : rootlibexecdir)
1770 systemd_export = executable('systemd-export',
1771 systemd_export_sources,
1772 include_directories : includes,
1773 link_with : [libshared],
1774 dependencies : [libcurl,
1778 install_rpath : rootlibexecdir,
1780 install_dir : rootlibexecdir)
1781 public_programs += [systemd_pull, systemd_import, systemd_export]
1784 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1785 exe = executable('systemd-journal-upload',
1786 systemd_journal_upload_sources,
1787 include_directories : includes,
1788 link_with : [libshared],
1789 dependencies : [threads,
1794 install_rpath : rootlibexecdir,
1796 install_dir : rootlibexecdir)
1797 public_programs += [exe]
1800 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1801 s_j_remote = executable('systemd-journal-remote',
1802 systemd_journal_remote_sources,
1803 include_directories : includes,
1804 link_with : [libshared],
1805 dependencies : [threads,
1810 install_rpath : rootlibexecdir,
1812 install_dir : rootlibexecdir)
1814 s_j_gatewayd = executable('systemd-journal-gatewayd',
1815 systemd_journal_gatewayd_sources,
1816 include_directories : includes,
1817 link_with : [libshared],
1818 dependencies : [threads,
1823 install_rpath : rootlibexecdir,
1825 install_dir : rootlibexecdir)
1826 public_programs += [s_j_remote, s_j_gatewayd]
1829 if conf.get('ENABLE_COREDUMP') == 1
1830 executable('systemd-coredump',
1831 systemd_coredump_sources,
1832 include_directories : includes,
1833 link_with : [libshared],
1834 dependencies : [threads,
1839 install_rpath : rootlibexecdir,
1841 install_dir : rootlibexecdir)
1843 exe = executable('coredumpctl',
1844 coredumpctl_sources,
1845 include_directories : includes,
1846 link_with : [libshared],
1847 dependencies : [threads,
1850 install_rpath : rootlibexecdir,
1852 public_programs += [exe]
1855 if conf.get('ENABLE_BINFMT') == 1
1856 exe = executable('systemd-binfmt',
1857 'src/binfmt/binfmt.c',
1858 include_directories : includes,
1859 link_with : [libshared],
1860 install_rpath : rootlibexecdir,
1862 install_dir : rootlibexecdir)
1863 public_programs += [exe]
1865 meson.add_install_script('sh', '-c',
1866 mkdir_p.format(binfmtdir))
1867 meson.add_install_script('sh', '-c',
1868 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1871 if conf.get('ENABLE_VCONSOLE') == 1
1872 executable('systemd-vconsole-setup',
1873 'src/vconsole/vconsole-setup.c',
1874 include_directories : includes,
1875 link_with : [libshared],
1876 install_rpath : rootlibexecdir,
1878 install_dir : rootlibexecdir)
1881 if conf.get('ENABLE_RANDOMSEED') == 1
1882 executable('systemd-random-seed',
1883 'src/random-seed/random-seed.c',
1884 include_directories : includes,
1885 link_with : [libshared],
1886 install_rpath : rootlibexecdir,
1888 install_dir : rootlibexecdir)
1891 if conf.get('ENABLE_FIRSTBOOT') == 1
1892 executable('systemd-firstboot',
1893 'src/firstboot/firstboot.c',
1894 include_directories : includes,
1895 link_with : [libshared],
1896 dependencies : [libcrypt],
1897 install_rpath : rootlibexecdir,
1899 install_dir : rootbindir)
1902 executable('systemd-remount-fs',
1903 'src/remount-fs/remount-fs.c',
1904 'src/core/mount-setup.c',
1905 'src/core/mount-setup.h',
1906 include_directories : includes,
1907 link_with : [libshared],
1908 install_rpath : rootlibexecdir,
1910 install_dir : rootlibexecdir)
1912 executable('systemd-machine-id-setup',
1913 'src/machine-id-setup/machine-id-setup-main.c',
1914 'src/core/machine-id-setup.c',
1915 'src/core/machine-id-setup.h',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 install_rpath : rootlibexecdir,
1920 install_dir : rootbindir)
1922 executable('systemd-fsck',
1924 include_directories : includes,
1925 link_with : [libshared],
1926 install_rpath : rootlibexecdir,
1928 install_dir : rootlibexecdir)
1930 executable('systemd-sleep',
1931 'src/sleep/sleep.c',
1932 include_directories : includes,
1933 link_with : [libshared],
1934 install_rpath : rootlibexecdir,
1936 install_dir : rootlibexecdir)
1938 exe = executable('systemd-sysctl',
1939 'src/sysctl/sysctl.c',
1940 include_directories : includes,
1941 link_with : [libshared],
1942 install_rpath : rootlibexecdir,
1944 install_dir : rootlibexecdir)
1945 public_programs += [exe]
1947 executable('systemd-ac-power',
1948 'src/ac-power/ac-power.c',
1949 include_directories : includes,
1950 link_with : [libshared],
1951 install_rpath : rootlibexecdir,
1953 install_dir : rootlibexecdir)
1955 exe = executable('systemd-detect-virt',
1956 'src/detect-virt/detect-virt.c',
1957 include_directories : includes,
1958 link_with : [libshared],
1959 install_rpath : rootlibexecdir,
1961 public_programs += [exe]
1963 exe = executable('systemd-delta',
1964 'src/delta/delta.c',
1965 include_directories : includes,
1966 link_with : [libshared],
1967 install_rpath : rootlibexecdir,
1969 public_programs += [exe]
1971 exe = executable('systemd-escape',
1972 'src/escape/escape.c',
1973 include_directories : includes,
1974 link_with : [libshared],
1975 install_rpath : rootlibexecdir,
1977 install_dir : rootbindir)
1978 public_programs += [exe]
1980 exe = executable('systemd-notify',
1981 'src/notify/notify.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 install_rpath : rootlibexecdir,
1986 install_dir : rootbindir)
1987 public_programs += [exe]
1989 executable('systemd-volatile-root',
1990 'src/volatile-root/volatile-root.c',
1991 include_directories : includes,
1992 link_with : [libshared],
1993 install_rpath : rootlibexecdir,
1995 install_dir : rootlibexecdir)
1997 executable('systemd-cgroups-agent',
1998 'src/cgroups-agent/cgroups-agent.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 install_rpath : rootlibexecdir,
2003 install_dir : rootlibexecdir)
2005 exe = executable('systemd-path',
2007 include_directories : includes,
2008 link_with : [libshared],
2009 install_rpath : rootlibexecdir,
2011 public_programs += [exe]
2013 exe = executable('systemd-ask-password',
2014 'src/ask-password/ask-password.c',
2015 include_directories : includes,
2016 link_with : [libshared],
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootbindir)
2020 public_programs += [exe]
2022 executable('systemd-reply-password',
2023 'src/reply-password/reply-password.c',
2024 include_directories : includes,
2025 link_with : [libshared],
2026 install_rpath : rootlibexecdir,
2028 install_dir : rootlibexecdir)
2030 exe = executable('systemd-tty-ask-password-agent',
2031 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 install_rpath : rootlibexecdir,
2036 install_dir : rootbindir)
2037 public_programs += [exe]
2039 exe = executable('systemd-cgls',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 install_rpath : rootlibexecdir,
2045 public_programs += [exe]
2047 exe = executable('systemd-cgtop',
2048 'src/cgtop/cgtop.c',
2049 include_directories : includes,
2050 link_with : [libshared],
2051 install_rpath : rootlibexecdir,
2053 public_programs += [exe]
2055 executable('systemd-initctl',
2056 'src/initctl/initctl.c',
2057 include_directories : includes,
2058 link_with : [libshared],
2059 install_rpath : rootlibexecdir,
2061 install_dir : rootlibexecdir)
2063 exe = executable('systemd-mount',
2064 'src/mount/mount-tool.c',
2065 include_directories : includes,
2066 link_with : [libshared],
2067 install_rpath : rootlibexecdir,
2069 public_programs += [exe]
2071 meson.add_install_script(meson_make_symlink,
2072 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2074 exe = executable('systemd-run',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 install_rpath : rootlibexecdir,
2080 public_programs += [exe]
2082 exe = executable('systemd-stdio-bridge',
2083 'src/stdio-bridge/stdio-bridge.c',
2084 include_directories : includes,
2085 link_with : [libshared],
2086 install_rpath : rootlibexecdir,
2088 public_programs += [exe]
2090 exe = executable('busctl',
2091 'src/busctl/busctl.c',
2092 'src/busctl/busctl-introspect.c',
2093 'src/busctl/busctl-introspect.h',
2094 include_directories : includes,
2095 link_with : [libshared],
2096 install_rpath : rootlibexecdir,
2098 public_programs += [exe]
2100 if conf.get('ENABLE_SYSUSERS') == 1
2101 exe = executable('systemd-sysusers',
2102 'src/sysusers/sysusers.c',
2103 include_directories : includes,
2104 link_with : [libshared],
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootbindir)
2108 public_programs += [exe]
2111 if conf.get('ENABLE_TMPFILES') == 1
2112 exe = executable('systemd-tmpfiles',
2113 'src/tmpfiles/tmpfiles.c',
2114 include_directories : includes,
2115 link_with : [libshared],
2116 dependencies : [libacl],
2117 install_rpath : rootlibexecdir,
2119 install_dir : rootbindir)
2120 public_programs += [exe]
2123 if conf.get('ENABLE_HWDB') == 1
2124 exe = executable('systemd-hwdb',
2126 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2127 include_directories : includes,
2128 link_with : [libudev_internal],
2129 install_rpath : udev_rpath,
2131 install_dir : rootbindir)
2132 public_programs += [exe]
2135 if conf.get('ENABLE_QUOTACHECK') == 1
2136 executable('systemd-quotacheck',
2137 'src/quotacheck/quotacheck.c',
2138 include_directories : includes,
2139 link_with : [libshared],
2140 install_rpath : rootlibexecdir,
2142 install_dir : rootlibexecdir)
2145 exe = executable('systemd-socket-proxyd',
2146 'src/socket-proxy/socket-proxyd.c',
2147 include_directories : includes,
2148 link_with : [libshared],
2149 dependencies : [threads],
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2153 public_programs += [exe]
2155 exe = executable('systemd-udevd',
2156 systemd_udevd_sources,
2157 include_directories : includes,
2158 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2159 link_with : [libudev_core,
2162 dependencies : [threads,
2167 install_rpath : udev_rpath,
2169 install_dir : rootlibexecdir)
2170 public_programs += [exe]
2172 exe = executable('udevadm',
2174 include_directories : includes,
2175 link_with : [libudev_core,
2178 dependencies : [threads,
2183 install_rpath : udev_rpath,
2185 install_dir : rootbindir)
2186 public_programs += [exe]
2188 executable('systemd-shutdown',
2189 systemd_shutdown_sources,
2190 include_directories : includes,
2191 link_with : [libshared],
2192 install_rpath : rootlibexecdir,
2194 install_dir : rootlibexecdir)
2196 executable('systemd-update-done',
2197 'src/update-done/update-done.c',
2198 include_directories : includes,
2199 link_with : [libshared],
2200 install_rpath : rootlibexecdir,
2202 install_dir : rootlibexecdir)
2204 executable('systemd-update-utmp',
2205 'src/update-utmp/update-utmp.c',
2206 include_directories : includes,
2207 link_with : [libshared],
2208 dependencies : [libaudit],
2209 install_rpath : rootlibexecdir,
2211 install_dir : rootlibexecdir)
2213 if conf.get('HAVE_KMOD') == 1
2214 executable('systemd-modules-load',
2215 'src/modules-load/modules-load.c',
2216 include_directories : includes,
2217 link_with : [libshared],
2218 dependencies : [libkmod],
2219 install_rpath : rootlibexecdir,
2221 install_dir : rootlibexecdir)
2223 meson.add_install_script('sh', '-c',
2224 mkdir_p.format(modulesloaddir))
2225 meson.add_install_script('sh', '-c',
2226 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2229 exe = executable('systemd-nspawn',
2230 systemd_nspawn_sources,
2231 'src/core/mount-setup.c', # FIXME: use a variable?
2232 'src/core/mount-setup.h',
2233 'src/core/loopback-setup.c',
2234 'src/core/loopback-setup.h',
2235 include_directories : [includes, include_directories('src/nspawn')],
2236 link_with : [libshared],
2237 dependencies : [libacl,
2241 install_rpath : rootlibexecdir,
2243 public_programs += [exe]
2245 if conf.get('ENABLE_NETWORKD') == 1
2246 executable('systemd-networkd',
2247 systemd_networkd_sources,
2248 include_directories : includes,
2249 link_with : [libnetworkd_core,
2253 dependencies : [threads],
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootlibexecdir)
2258 executable('systemd-networkd-wait-online',
2259 systemd_networkd_wait_online_sources,
2260 include_directories : includes,
2261 link_with : [libnetworkd_core,
2263 install_rpath : rootlibexecdir,
2265 install_dir : rootlibexecdir)
2267 exe = executable('networkctl',
2269 include_directories : includes,
2270 link_with : [libsystemd_network,
2272 install_rpath : rootlibexecdir,
2274 install_dir : rootbindir)
2275 public_programs += [exe]
2277 ############################################################
2279 foreach tuple : tests
2281 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2282 dependencies = tuple[2]
2283 condition = tuple.length() >= 4 ? tuple[3] : ''
2284 type = tuple.length() >= 5 ? tuple[4] : ''
2285 defs = tuple.length() >= 6 ? tuple[5] : []
2286 incs = tuple.length() >= 7 ? tuple[6] : includes
2289 name = sources[0].split('/')[-1].split('.')[0]
2290 if type.startswith('timeout=')
2291 timeout = type.split('=')[1].to_int()
2295 if condition == '' or conf.get(condition) == 1
2299 include_directories : incs,
2300 link_with : link_with,
2301 dependencies : dependencies,
2303 install_rpath : rootlibexecdir,
2304 install : install_tests,
2305 install_dir : join_paths(testsdir, type))
2308 message('@0@ is a manual test'.format(name))
2309 elif type == 'unsafe' and want_tests != 'unsafe'
2310 message('@0@ is an unsafe test'.format(name))
2317 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2321 test_libsystemd_sym = executable(
2322 'test-libsystemd-sym',
2323 test_libsystemd_sym_c,
2324 include_directories : includes,
2325 link_with : [libsystemd],
2326 install : install_tests,
2327 install_dir : testsdir)
2328 test('test-libsystemd-sym',
2329 test_libsystemd_sym)
2331 test_libudev_sym = executable(
2334 include_directories : includes,
2335 c_args : ['-Wno-deprecated-declarations'],
2336 link_with : [libudev],
2337 install : install_tests,
2338 install_dir : testsdir)
2339 test('test-libudev-sym',
2342 ############################################################
2344 make_directive_index_py = find_program('tools/make-directive-index.py')
2345 make_man_index_py = find_program('tools/make-man-index.py')
2346 xml_helper_py = find_program('tools/xml_helper.py')
2347 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2351 subdir('sysusers.d')
2352 subdir('tmpfiles.d')
2356 subdir('shell-completion/bash')
2357 subdir('shell-completion/zsh')
2358 subdir('docs/sysvinit')
2359 subdir('docs/var-log')
2361 # FIXME: figure out if the warning is true:
2362 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2363 install_subdir('factory/etc',
2364 install_dir : factorydir)
2367 install_data('xorg/50-systemd-user.sh',
2368 install_dir : xinitrcdir)
2369 install_data('system-preset/90-systemd.preset',
2370 install_dir : systempresetdir)
2371 install_data('modprobe.d/systemd.conf',
2372 install_dir : modprobedir)
2373 install_data('README',
2380 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2381 install_dir : docdir)
2383 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2384 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2386 ############################################################
2388 meson_check_help = find_program('tools/meson-check-help.sh')
2390 foreach exec : public_programs
2391 name = exec.full_path().split('/')[-1]
2392 test('check-help-' + name,
2394 args : [exec.full_path()])
2397 ############################################################
2400 all_files = run_command(
2402 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2405 all_files = files(all_files.stdout().split())
2410 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2414 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2418 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2421 command : [meson_git_contrib_sh])
2425 git_head = run_command(
2427 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2428 'rev-parse', 'HEAD']).stdout().strip()
2429 git_head_short = run_command(
2431 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2432 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2436 command : ['git', 'archive',
2437 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2439 '--prefix', 'systemd-@0@/'.format(git_head),
2443 ############################################################
2446 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2448 'prefix directory: @0@'.format(prefixdir),
2449 'rootprefix directory: @0@'.format(rootprefixdir),
2450 'sysconf directory: @0@'.format(sysconfdir),
2451 'include directory: @0@'.format(includedir),
2452 'lib directory: @0@'.format(libdir),
2453 'rootlib directory: @0@'.format(rootlibdir),
2454 'SysV init scripts: @0@'.format(sysvinit_path),
2455 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2456 'PAM modules directory: @0@'.format(pamlibdir),
2457 'PAM configuration directory: @0@'.format(pamconfdir),
2458 'RPM macros directory: @0@'.format(rpmmacrosdir),
2459 'modprobe.d directory: @0@'.format(modprobedir),
2460 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2461 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2462 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2463 'bash completions directory: @0@'.format(bashcompletiondir),
2464 'zsh completions directory: @0@'.format(zshcompletiondir),
2465 'extra start script: @0@'.format(get_option('rc-local')),
2466 'extra stop script: @0@'.format(get_option('halt-local')),
2467 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2468 get_option('debug-tty')),
2469 'TTY GID: @0@'.format(tty_gid),
2470 'maximum system UID: @0@'.format(system_uid_max),
2471 'maximum system GID: @0@'.format(system_gid_max),
2472 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2473 'render group access mode: @0@'.format(get_option('group-render-mode')),
2474 'certificate root directory: @0@'.format(get_option('certificate-root')),
2475 'support URL: @0@'.format(support_url),
2476 'nobody user name: @0@'.format(get_option('nobody-user')),
2477 'nobody group name: @0@'.format(get_option('nobody-group')),
2478 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2479 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2481 'default DNSSEC mode: @0@'.format(default_dnssec),
2482 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2483 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2485 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2486 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2488 'default DNS servers: @0@'.format(alt_dns_servers),
2489 'default NTP servers: @0@'.format(alt_ntp_servers)]
2491 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2492 '@@0@'.format(time_epoch)).stdout().strip()
2494 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2497 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2498 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2499 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2501 if conf.get('ENABLE_EFI') == 1
2503 'efi arch: @0@'.format(efi_arch)]
2507 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2508 'EFI CC @0@'.format(efi_cc),
2509 'EFI lib directory: @0@'.format(efi_libdir),
2510 'EFI lds directory: @0@'.format(efi_ldsdir),
2511 'EFI include directory: @0@'.format(efi_incdir)]
2564 ['legacy pkla', install_polkit_pkla],
2566 ['gnu-efi', have_gnu_efi],
2572 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2575 ['man pages', want_man],
2576 ['html pages', want_html],
2577 ['man page indices', want_man and have_lxml],
2578 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2583 ['adm group', get_option('adm-group')],
2584 ['wheel group', get_option('wheel-group')],
2587 ['debug mmap cache'],
2590 cond = tuple.get(1, '')
2592 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2593 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2594 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2599 missing += [tuple[0]]
2605 'enabled features: @0@'.format(', '.join(found)),
2607 'disabled features: @0@'.format(', '.join(missing)),
2609 message('\n '.join(status))