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_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
186 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
187 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
188 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
189 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
190 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
191 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
192 conf.set_quoted('ROOTPREFIX', rootprefixdir)
193 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
194 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
195 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
196 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
197 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
198 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
199 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
200 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
201 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
202 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
203 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
204 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
205 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
206 conf.set_quoted('LIBDIR', libdir)
207 conf.set_quoted('ROOTLIBDIR', rootlibdir)
208 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
209 conf.set_quoted('BOOTLIBDIR', bootlibdir)
210 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
211 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
212 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
213 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
214 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
215 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
217 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
218 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
220 substs.set('prefix', prefixdir)
221 substs.set('exec_prefix', prefixdir)
222 substs.set('libdir', libdir)
223 substs.set('rootlibdir', rootlibdir)
224 substs.set('includedir', includedir)
225 substs.set('pkgsysconfdir', pkgsysconfdir)
226 substs.set('bindir', bindir)
227 substs.set('rootbindir', rootbindir)
228 substs.set('rootlibexecdir', rootlibexecdir)
229 substs.set('systemunitdir', systemunitdir)
230 substs.set('userunitdir', userunitdir)
231 substs.set('systempresetdir', systempresetdir)
232 substs.set('userpresetdir', userpresetdir)
233 substs.set('udevhwdbdir', udevhwdbdir)
234 substs.set('udevrulesdir', udevrulesdir)
235 substs.set('udevlibexecdir', udevlibexecdir)
236 substs.set('catalogdir', catalogdir)
237 substs.set('tmpfilesdir', tmpfilesdir)
238 substs.set('sysusersdir', sysusersdir)
239 substs.set('sysctldir', sysctldir)
240 substs.set('binfmtdir', binfmtdir)
241 substs.set('modulesloaddir', modulesloaddir)
242 substs.set('systemgeneratordir', systemgeneratordir)
243 substs.set('usergeneratordir', usergeneratordir)
244 substs.set('systemenvgeneratordir', systemenvgeneratordir)
245 substs.set('userenvgeneratordir', userenvgeneratordir)
246 substs.set('systemshutdowndir', systemshutdowndir)
247 substs.set('systemsleepdir', systemsleepdir)
248 substs.set('VARLOGDIR', varlogdir)
249 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
250 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
251 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
252 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
253 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
254 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
255 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
257 #####################################################################
259 cc = meson.get_compiler('c')
260 pkgconfig = import('pkgconfig')
261 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
263 cxx = find_program('c++', required : false)
265 # Used only for tests
269 foreach arg : ['-Wextra',
272 '-Wmissing-include-dirs',
273 '-Wold-style-definition',
276 '-Wdeclaration-after-statement',
278 '-Wsuggest-attribute=noreturn',
279 '-Werror=missing-prototypes',
280 '-Werror=implicit-function-declaration',
281 '-Werror=missing-declarations',
282 '-Werror=return-type',
283 '-Werror=incompatible-pointer-types',
285 '-Wstrict-prototypes',
287 '-Wmissing-noreturn',
288 '-Wimplicit-fallthrough=5',
291 '-Wstrict-aliasing=2',
298 '-fdiagnostics-show-option',
299 '-fno-strict-aliasing',
300 '-fvisibility=hidden',
302 '-fstack-protector-strong',
304 '--param=ssp-buffer-size=4',
306 if cc.has_argument(arg)
307 add_project_arguments(arg, language : 'c')
311 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
312 # arguments, just emits a warnings. So test for the "positive" version instead.
313 foreach arg : ['unused-parameter',
314 'missing-field-initializers',
317 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
319 if cc.has_argument('-W' + arg)
320 add_project_arguments('-Wno-' + arg, language : 'c')
326 #include <inttypes.h>
327 typedef uint64_t usec_t;
328 usec_t now(clockid_t clock);
333 ', name : '-Werror=shadow with local shadowing')
334 add_project_arguments('-Werror=shadow', language : 'c')
337 if cc.get_id() == 'clang'
338 foreach arg : ['-Wno-typedef-redefinition',
339 '-Wno-gnu-variable-sized-type-not-at-end',
341 if cc.has_argument(arg,
342 name : '@0@ is supported'.format(arg))
343 add_project_arguments(arg, language : 'c')
348 link_test_c = files('tools/meson-link-test.c')
350 # --as-needed and --no-undefined are provided by meson by default,
351 # run mesonconf to see what is enabled
352 foreach arg : ['-Wl,-z,relro',
357 have = run_command(check_compilation_sh,
358 cc.cmd_array(), '-x', 'c', arg,
359 '-include', link_test_c).returncode() == 0
360 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
362 add_project_link_arguments(arg, language : 'c')
366 if get_option('buildtype') != 'debug'
367 foreach arg : ['-ffunction-sections',
369 if cc.has_argument(arg,
370 name : '@0@ is supported'.format(arg))
371 add_project_arguments(arg, language : 'c')
375 foreach arg : ['-Wl,--gc-sections']
376 have = run_command(check_compilation_sh,
377 cc.cmd_array(), '-x', 'c', arg,
378 '-include', link_test_c).returncode() == 0
379 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
381 add_project_link_arguments(arg, language : 'c')
386 cpp = ' '.join(cc.cmd_array()) + ' -E'
388 #####################################################################
389 # compilation result tests
391 conf.set('_GNU_SOURCE', true)
392 conf.set('__SANE_USERSPACE_TYPES__', true)
394 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
395 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
396 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
397 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
398 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
399 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
400 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
404 #include <linux/ethtool.h>
405 #include <linux/fib_rules.h>
407 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
409 foreach decl : ['char16_t',
412 'struct ethtool_link_settings',
413 'struct fib_rule_uid_range',
416 # We get -1 if the size cannot be determined
417 have = cc.sizeof(decl, prefix : decl_headers) > 0
418 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
421 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
422 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
423 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
424 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
425 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
426 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
427 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
428 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
429 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
430 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
431 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
432 # if_tunnel.h is buggy and cannot be included on its own
433 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
434 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
435 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
436 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
437 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
438 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
439 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
440 ['NDA_IFINDEX', 'linux/neighbour.h'],
441 ['IFA_FLAGS', 'linux/if_addr.h'],
442 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
443 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
444 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
446 prefix = decl.length() > 2 ? decl[2] : ''
447 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
448 conf.set10('HAVE_' + decl[0], have)
451 foreach ident : ['secure_getenv', '__secure_getenv']
452 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
456 ['memfd_create', '''#define _GNU_SOURCE
457 #include <sys/mman.h>'''],
458 ['gettid', '''#include <sys/types.h>'''],
459 ['pivot_root', '''#include <stdlib.h>'''], # no known header declares pivot_root
460 ['name_to_handle_at', '''#define _GNU_SOURCE
461 #include <sys/types.h>
462 #include <sys/stat.h>
463 #include <fcntl.h>'''],
464 ['setns', '''#define _GNU_SOURCE
465 #include <sched.h>'''],
466 ['renameat2', '''#include <stdio.h>'''],
467 ['kcmp', '''#include <linux/kcmp.h>'''],
468 ['keyctl', '''#include <sys/types.h>
469 #include <keyutils.h>'''],
470 ['copy_file_range', '''#include <sys/syscall.h>
471 #include <unistd.h>'''],
472 ['bpf', '''#include <sys/syscall.h>
473 #include <unistd.h>'''],
474 ['explicit_bzero' , '''#include <string.h>'''],
477 have = cc.has_function(ident[0], prefix : ident[1])
478 conf.set10('HAVE_' + ident[0].to_upper(), have)
481 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''')
482 conf.set10('USE_SYS_RANDOM_H', true)
483 conf.set10('HAVE_GETRANDOM', true)
485 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
486 conf.set10('USE_SYS_RANDOM_H', false)
487 conf.set10('HAVE_GETRANDOM', have)
490 #####################################################################
492 sed = find_program('sed')
493 awk = find_program('awk')
494 m4 = find_program('m4')
495 stat = find_program('stat')
496 git = find_program('git', required : false)
498 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
499 mkdir_p = 'mkdir -p $DESTDIR/@0@'
500 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
501 splash_bmp = files('test/splash.bmp')
503 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
504 # /usr/sbin, /sbin, and fall back to the default from middle column.
505 progs = [['telinit', '/lib/sysvinit/telinit'],
506 ['quotaon', '/usr/sbin/quotaon' ],
507 ['quotacheck', '/usr/sbin/quotacheck' ],
508 ['kill', '/usr/bin/kill' ],
509 ['kmod', '/usr/bin/kmod' ],
510 ['kexec', '/usr/sbin/kexec' ],
511 ['sulogin', '/usr/sbin/sulogin' ],
512 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
513 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
514 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
515 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
518 path = get_option(prog[0] + '-path')
520 message('Using @1@ for @0@'.format(prog[0], path))
522 exe = find_program(prog[0],
523 '/usr/sbin/' + prog[0],
526 path = exe.found() ? exe.path() : prog[1]
528 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
529 conf.set_quoted(name, path)
530 substs.set(name, path)
533 if run_command('ln', '--relative', '--help').returncode() != 0
534 error('ln does not support --relative')
537 ############################################################
539 gperf = find_program('gperf')
541 gperf_test_format = '''
543 const char * in_word_set(const char *, @0@);
546 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
547 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
548 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
549 if cc.compiles(gperf_test)
550 gperf_len_type = 'size_t'
552 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
553 if cc.compiles(gperf_test)
554 gperf_len_type = 'unsigned'
556 error('unable to determine gperf len type')
559 message('gperf len type is @0@'.format(gperf_len_type))
560 conf.set('GPERF_LEN_TYPE', gperf_len_type,
561 description : 'The type of gperf "len" parameter')
563 ############################################################
565 if not cc.has_header('sys/capability.h')
566 error('POSIX caps headers not found')
568 foreach header : ['linux/btrfs.h',
570 'linux/vm_sockets.h',
572 'valgrind/memcheck.h',
573 'valgrind/valgrind.h',
576 conf.set10('HAVE_' + header.underscorify().to_upper(),
577 cc.has_header(header))
580 ############################################################
582 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
583 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
584 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
586 default_hierarchy = get_option('default-hierarchy')
587 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
588 description : 'default cgroup hierarchy as string')
589 if default_hierarchy == 'legacy'
590 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
591 elif default_hierarchy == 'hybrid'
592 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
594 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
597 time_epoch = get_option('time-epoch')
600 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
602 time_epoch = time_epoch.to_int()
603 conf.set('TIME_EPOCH', time_epoch)
605 system_uid_max = get_option('system-uid-max')
606 if system_uid_max == ''
607 system_uid_max = run_command(
609 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
610 '/etc/login.defs').stdout()
612 system_uid_max = system_uid_max.to_int()
613 conf.set('SYSTEM_UID_MAX', system_uid_max)
614 substs.set('systemuidmax', system_uid_max)
615 message('maximum system UID is @0@'.format(system_uid_max))
617 conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
618 conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
620 system_gid_max = get_option('system-gid-max')
621 if system_gid_max == ''
622 system_gid_max = run_command(
624 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
625 '/etc/login.defs').stdout()
627 system_gid_max = system_gid_max.to_int()
628 conf.set('SYSTEM_GID_MAX', system_gid_max)
629 substs.set('systemgidmax', system_gid_max)
630 message('maximum system GID is @0@'.format(system_gid_max))
632 tty_gid = get_option('tty-gid')
633 conf.set('TTY_GID', tty_gid)
634 substs.set('TTY_GID', tty_gid)
636 if get_option('adm-group')
637 m4_defines += ['-DENABLE_ADM_GROUP']
640 if get_option('wheel-group')
641 m4_defines += ['-DENABLE_WHEEL_GROUP']
644 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
645 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
647 kill_user_processes = get_option('default-kill-user-processes')
648 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
649 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
651 dns_servers = get_option('dns-servers')
652 conf.set_quoted('DNS_SERVERS', dns_servers)
653 substs.set('DNS_SERVERS', dns_servers)
655 ntp_servers = get_option('ntp-servers')
656 conf.set_quoted('NTP_SERVERS', ntp_servers)
657 substs.set('NTP_SERVERS', ntp_servers)
659 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
661 substs.set('SUSHELL', get_option('debug-shell'))
662 substs.set('DEBUGTTY', get_option('debug-tty'))
664 debug = get_option('debug')
665 enable_debug_hashmap = false
666 enable_debug_mmap_cache = false
668 foreach name : debug.split(',')
670 enable_debug_hashmap = true
671 elif name == 'mmap-cache'
672 enable_debug_mmap_cache = true
674 message('unknown debug option "@0@", ignoring'.format(name))
678 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
679 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
681 #####################################################################
683 threads = dependency('threads')
684 librt = cc.find_library('rt')
685 libm = cc.find_library('m')
686 libdl = cc.find_library('dl')
687 libcrypt = cc.find_library('crypt')
689 libcap = dependency('libcap', required : false)
690 if not libcap.found()
691 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
692 libcap = cc.find_library('cap')
695 libmount = dependency('mount',
698 want_seccomp = get_option('seccomp')
699 if want_seccomp != 'false'
700 libseccomp = dependency('libseccomp',
701 version : '>= 2.3.1',
702 required : want_seccomp == 'true')
703 have = libseccomp.found()
708 conf.set10('HAVE_SECCOMP', have)
709 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
711 want_selinux = get_option('selinux')
712 if want_selinux != 'false'
713 libselinux = dependency('libselinux',
714 version : '>= 2.1.9',
715 required : want_selinux == 'true')
716 have = libselinux.found()
721 conf.set10('HAVE_SELINUX', have)
722 m4_defines += have ? ['-DHAVE_SELINUX'] : []
724 want_apparmor = get_option('apparmor')
725 if want_apparmor != 'false'
726 libapparmor = dependency('libapparmor',
727 required : want_apparmor == 'true')
728 have = libapparmor.found()
733 conf.set10('HAVE_APPARMOR', have)
734 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
736 smack_run_label = get_option('smack-run-label')
737 if smack_run_label != ''
738 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
739 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
742 want_polkit = get_option('polkit')
743 install_polkit = false
744 install_polkit_pkla = false
745 if want_polkit != 'false'
746 install_polkit = true
748 libpolkit = dependency('polkit-gobject-1',
750 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
751 message('Old polkit detected, will install pkla files')
752 install_polkit_pkla = true
755 conf.set10('ENABLE_POLKIT', install_polkit)
757 want_acl = get_option('acl')
758 if want_acl != 'false'
759 libacl = cc.find_library('acl', required : want_acl == 'true')
760 have = libacl.found()
765 conf.set10('HAVE_ACL', have)
766 m4_defines += have ? ['-DHAVE_ACL'] : []
768 want_audit = get_option('audit')
769 if want_audit != 'false'
770 libaudit = dependency('audit', required : want_audit == 'true')
771 have = libaudit.found()
776 conf.set10('HAVE_AUDIT', have)
778 want_blkid = get_option('blkid')
779 if want_blkid != 'false'
780 libblkid = dependency('blkid', required : want_blkid == 'true')
781 have = libblkid.found()
786 conf.set10('HAVE_BLKID', have)
788 want_kmod = get_option('kmod')
789 if want_kmod != 'false'
790 libkmod = dependency('libkmod',
792 required : want_kmod == 'true')
793 have = libkmod.found()
798 conf.set10('HAVE_KMOD', have)
800 want_pam = get_option('pam')
801 if want_pam != 'false'
802 libpam = cc.find_library('pam', required : want_pam == 'true')
803 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
804 have = libpam.found() and libpam_misc.found()
810 conf.set10('HAVE_PAM', have)
811 m4_defines += have ? ['-DHAVE_PAM'] : []
813 want_microhttpd = get_option('microhttpd')
814 if want_microhttpd != 'false'
815 libmicrohttpd = dependency('libmicrohttpd',
816 version : '>= 0.9.33',
817 required : want_microhttpd == 'true')
818 have = libmicrohttpd.found()
823 conf.set10('HAVE_MICROHTTPD', have)
824 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
826 want_libcryptsetup = get_option('libcryptsetup')
827 if want_libcryptsetup != 'false'
828 libcryptsetup = dependency('libcryptsetup',
829 version : '>= 1.6.0',
830 required : want_libcryptsetup == 'true')
831 have = libcryptsetup.found()
836 conf.set10('HAVE_LIBCRYPTSETUP', have)
838 want_libcurl = get_option('libcurl')
839 if want_libcurl != 'false'
840 libcurl = dependency('libcurl',
841 version : '>= 7.32.0',
842 required : want_libcurl == 'true')
843 have = libcurl.found()
848 conf.set10('HAVE_LIBCURL', have)
849 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
851 want_libidn = get_option('libidn')
852 want_libidn2 = get_option('libidn2')
853 if want_libidn == 'true' and want_libidn2 == 'true'
854 error('libidn and libidn2 cannot be requested simultaneously')
857 if want_libidn != 'false' and want_libidn2 != 'true'
858 libidn = dependency('libidn',
859 required : want_libidn == 'true')
860 have = libidn.found()
865 conf.set10('HAVE_LIBIDN', have)
866 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
867 if not have and want_libidn2 != 'false'
868 # libidn is used for both libidn and libidn2 objects
869 libidn = dependency('libidn2',
870 required : want_libidn2 == 'true')
871 have = libidn.found()
875 conf.set10('HAVE_LIBIDN2', have)
876 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
878 want_libiptc = get_option('libiptc')
879 if want_libiptc != 'false'
880 libiptc = dependency('libiptc',
881 required : want_libiptc == 'true')
882 have = libiptc.found()
887 conf.set10('HAVE_LIBIPTC', have)
888 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
890 want_qrencode = get_option('qrencode')
891 if want_qrencode != 'false'
892 libqrencode = dependency('libqrencode',
893 required : want_qrencode == 'true')
894 have = libqrencode.found()
899 conf.set10('HAVE_QRENCODE', have)
901 want_gcrypt = get_option('gcrypt')
902 if want_gcrypt != 'false'
903 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
904 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
905 have = libgcrypt.found() and libgpg_error.found()
910 # link to neither of the libs if one is not found
914 conf.set10('HAVE_GCRYPT', have)
916 want_gnutls = get_option('gnutls')
917 if want_gnutls != 'false'
918 libgnutls = dependency('gnutls',
919 version : '>= 3.1.4',
920 required : want_gnutls == 'true')
921 have = libgnutls.found()
926 conf.set10('HAVE_GNUTLS', have)
928 want_elfutils = get_option('elfutils')
929 if want_elfutils != 'false'
930 libdw = dependency('libdw',
931 required : want_elfutils == 'true')
937 conf.set10('HAVE_ELFUTILS', have)
939 want_zlib = get_option('zlib')
940 if want_zlib != 'false'
941 libz = dependency('zlib',
942 required : want_zlib == 'true')
948 conf.set10('HAVE_ZLIB', have)
950 want_bzip2 = get_option('bzip2')
951 if want_bzip2 != 'false'
952 libbzip2 = cc.find_library('bz2',
953 required : want_bzip2 == 'true')
954 have = libbzip2.found()
959 conf.set10('HAVE_BZIP2', have)
961 want_xz = get_option('xz')
962 if want_xz != 'false'
963 libxz = dependency('liblzma',
964 required : want_xz == 'true')
970 conf.set10('HAVE_XZ', have)
972 want_lz4 = get_option('lz4')
973 if want_lz4 != 'false'
974 liblz4 = dependency('liblz4',
975 required : want_lz4 == 'true')
976 have = liblz4.found()
981 conf.set10('HAVE_LZ4', have)
983 want_xkbcommon = get_option('xkbcommon')
984 if want_xkbcommon != 'false'
985 libxkbcommon = dependency('xkbcommon',
986 version : '>= 0.3.0',
987 required : want_xkbcommon == 'true')
988 have = libxkbcommon.found()
993 conf.set10('HAVE_XKBCOMMON', have)
995 want_glib = get_option('glib')
996 if want_glib != 'false'
997 libglib = dependency('glib-2.0',
998 version : '>= 2.22.0',
999 required : want_glib == 'true')
1000 libgobject = dependency('gobject-2.0',
1001 version : '>= 2.22.0',
1002 required : want_glib == 'true')
1003 libgio = dependency('gio-2.0',
1004 required : want_glib == 'true')
1005 have = libglib.found() and libgobject.found() and libgio.found()
1012 conf.set10('HAVE_GLIB', have)
1014 want_dbus = get_option('dbus')
1015 if want_dbus != 'false'
1016 libdbus = dependency('dbus-1',
1017 version : '>= 1.3.2',
1018 required : want_dbus == 'true')
1019 have = libdbus.found()
1024 conf.set10('HAVE_DBUS', have)
1026 default_dnssec = get_option('default-dnssec')
1027 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1028 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1029 default_dnssec = 'no'
1031 conf.set('DEFAULT_DNSSEC_MODE',
1032 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1033 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1035 want_importd = get_option('importd')
1036 if want_importd != 'false'
1037 have = (conf.get('HAVE_LIBCURL') == 1 and
1038 conf.get('HAVE_ZLIB') == 1 and
1039 conf.get('HAVE_BZIP2') == 1 and
1040 conf.get('HAVE_XZ') == 1 and
1041 conf.get('HAVE_GCRYPT') == 1)
1042 if want_importd == 'true' and not have
1043 error('importd support was requested, but dependencies are not available')
1048 conf.set10('ENABLE_IMPORTD', have)
1050 want_remote = get_option('remote')
1051 if want_remote != 'false'
1052 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1053 conf.get('HAVE_LIBCURL') == 1]
1054 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1055 # it's possible to build one without the other. Complain only if
1056 # support was explictly requested. The auxiliary files like sysusers
1057 # config should be installed when any of the programs are built.
1058 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1059 error('remote support was requested, but dependencies are not available')
1061 have = have_deps[0] or have_deps[1]
1065 conf.set10('ENABLE_REMOTE', have)
1067 foreach term : ['utmp',
1098 have = get_option(term)
1099 name = 'ENABLE_' + term.underscorify().to_upper()
1100 conf.set10(name, have)
1101 m4_defines += have ? ['-D' + name] : []
1104 want_tests = get_option('tests')
1105 install_tests = get_option('install-tests')
1108 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1110 #####################################################################
1112 if get_option('efi')
1113 efi_arch = host_machine.cpu_family()
1115 if efi_arch == 'x86'
1116 EFI_MACHINE_TYPE_NAME = 'ia32'
1117 gnu_efi_arch = 'ia32'
1118 elif efi_arch == 'x86_64'
1119 EFI_MACHINE_TYPE_NAME = 'x64'
1120 gnu_efi_arch = 'x86_64'
1121 elif efi_arch == 'arm'
1122 EFI_MACHINE_TYPE_NAME = 'arm'
1123 gnu_efi_arch = 'arm'
1124 elif efi_arch == 'aarch64'
1125 EFI_MACHINE_TYPE_NAME = 'aa64'
1126 gnu_efi_arch = 'aarch64'
1128 EFI_MACHINE_TYPE_NAME = ''
1133 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1135 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1139 conf.set10('ENABLE_EFI', have)
1141 #####################################################################
1143 config_h = configure_file(
1144 output : 'config.h',
1145 configuration : conf)
1147 includes = include_directories('src/basic',
1157 'src/libsystemd/sd-bus',
1158 'src/libsystemd/sd-device',
1159 'src/libsystemd/sd-hwdb',
1160 'src/libsystemd/sd-id128',
1161 'src/libsystemd/sd-netlink',
1162 'src/libsystemd/sd-network',
1163 'src/libsystemd-network',
1167 add_project_arguments('-include', 'config.h', language : 'c')
1169 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1170 'src/shared/gcrypt-util.c')
1174 subdir('src/systemd')
1176 subdir('src/libsystemd')
1177 subdir('src/libsystemd-network')
1178 subdir('src/journal')
1181 libjournal_core = static_library(
1183 libjournal_core_sources,
1185 include_directories : includes,
1188 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1189 libsystemd = shared_library(
1191 libsystemd_internal_sources,
1192 journal_internal_sources,
1193 version : libsystemd_version,
1194 include_directories : includes,
1195 link_args : ['-shared',
1196 '-Wl,--version-script=' + libsystemd_sym_path],
1197 link_with : [libbasic],
1198 dependencies : [threads,
1203 link_depends : libsystemd_sym,
1205 install_dir : rootlibdir)
1207 ############################################################
1209 # binaries that have --help and are intended for use by humans,
1210 # usually, but not always, installed in /bin.
1211 public_programs = []
1213 subdir('src/libudev')
1214 subdir('src/shared')
1217 subdir('src/network')
1219 subdir('src/analyze')
1220 subdir('src/journal-remote')
1221 subdir('src/coredump')
1222 subdir('src/hostname')
1223 subdir('src/import')
1224 subdir('src/kernel-install')
1225 subdir('src/locale')
1226 subdir('src/machine')
1227 subdir('src/nspawn')
1228 subdir('src/resolve')
1229 subdir('src/timedate')
1230 subdir('src/timesync')
1231 subdir('src/vconsole')
1232 subdir('src/sulogin-shell')
1233 subdir('src/boot/efi')
1239 ############################################################
1241 # only static linking apart from libdl, to make sure that the
1242 # module is linked to all libraries that it uses.
1243 test_dlopen = executable(
1246 include_directories : includes,
1247 link_with : [libbasic],
1248 dependencies : [libdl])
1250 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1251 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1252 ['mymachines', 'ENABLE_MACHINED'],
1253 ['resolve', 'ENABLE_RESOLVE']]
1255 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1259 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1260 version_script_arg = join_paths(meson.current_source_dir(), sym)
1262 nss = shared_library(
1264 'src/nss-@0@/nss-@0@.c'.format(module),
1266 include_directories : includes,
1267 link_args : ['-shared',
1268 '-Wl,--version-script=' + version_script_arg,
1270 link_with : [libsystemd_internal,
1272 dependencies : [threads,
1276 install_dir : rootlibdir)
1278 # We cannot use shared_module because it does not support version suffix.
1279 # Unfortunately shared_library insists on creating the symlink…
1280 meson.add_install_script('sh', '-c',
1281 'rm $DESTDIR@0@/libnss_@1@.so'
1282 .format(rootlibdir, module))
1284 test('dlopen-nss_' + module,
1286 args : [nss.full_path()]) # path to dlopen must include a slash
1290 ############################################################
1292 executable('systemd',
1294 include_directories : includes,
1295 link_with : [libcore,
1297 dependencies : [threads,
1303 install_rpath : rootlibexecdir,
1305 install_dir : rootlibexecdir)
1307 exe = executable('systemd-analyze',
1308 systemd_analyze_sources,
1309 include_directories : includes,
1310 link_with : [libcore,
1312 dependencies : [threads,
1318 install_rpath : rootlibexecdir,
1320 public_programs += [exe]
1322 executable('systemd-journald',
1323 systemd_journald_sources,
1324 include_directories : includes,
1325 link_with : [libjournal_core,
1327 dependencies : [threads,
1331 install_rpath : rootlibexecdir,
1333 install_dir : rootlibexecdir)
1335 exe = executable('systemd-cat',
1336 systemd_cat_sources,
1337 include_directories : includes,
1338 link_with : [libjournal_core,
1340 dependencies : [threads],
1341 install_rpath : rootlibexecdir,
1343 public_programs += [exe]
1345 exe = executable('journalctl',
1347 include_directories : includes,
1348 link_with : [libshared],
1349 dependencies : [threads,
1353 install_rpath : rootlibexecdir,
1355 install_dir : rootbindir)
1356 public_programs += [exe]
1358 executable('systemd-getty-generator',
1359 'src/getty-generator/getty-generator.c',
1360 include_directories : includes,
1361 link_with : [libshared],
1362 install_rpath : rootlibexecdir,
1364 install_dir : systemgeneratordir)
1366 executable('systemd-debug-generator',
1367 'src/debug-generator/debug-generator.c',
1368 include_directories : includes,
1369 link_with : [libshared],
1370 install_rpath : rootlibexecdir,
1372 install_dir : systemgeneratordir)
1374 executable('systemd-fstab-generator',
1375 'src/fstab-generator/fstab-generator.c',
1376 'src/core/mount-setup.c',
1377 include_directories : includes,
1378 link_with : [libshared],
1379 install_rpath : rootlibexecdir,
1381 install_dir : systemgeneratordir)
1383 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1384 executable('30-systemd-environment-d-generator',
1385 'src/environment-d-generator/environment-d-generator.c',
1386 include_directories : includes,
1387 link_with : [libshared],
1388 install_rpath : rootlibexecdir,
1390 install_dir : userenvgeneratordir)
1392 meson.add_install_script(meson_make_symlink,
1393 join_paths(sysconfdir, 'environment'),
1394 join_paths(environmentdir, '99-environment.conf'))
1397 if conf.get('ENABLE_HIBERNATE') == 1
1398 executable('systemd-hibernate-resume-generator',
1399 'src/hibernate-resume/hibernate-resume-generator.c',
1400 include_directories : includes,
1401 link_with : [libshared],
1402 install_rpath : rootlibexecdir,
1404 install_dir : systemgeneratordir)
1406 executable('systemd-hibernate-resume',
1407 'src/hibernate-resume/hibernate-resume.c',
1408 include_directories : includes,
1409 link_with : [libshared],
1410 install_rpath : rootlibexecdir,
1412 install_dir : rootlibexecdir)
1415 if conf.get('HAVE_BLKID') == 1
1416 executable('systemd-gpt-auto-generator',
1417 'src/gpt-auto-generator/gpt-auto-generator.c',
1418 'src/basic/blkid-util.h',
1419 include_directories : includes,
1420 link_with : [libshared],
1421 dependencies : libblkid,
1422 install_rpath : rootlibexecdir,
1424 install_dir : systemgeneratordir)
1426 exe = executable('systemd-dissect',
1427 'src/dissect/dissect.c',
1428 include_directories : includes,
1429 link_with : [libshared],
1430 install_rpath : rootlibexecdir,
1432 install_dir : rootlibexecdir)
1433 public_programs += [exe]
1436 if conf.get('ENABLE_RESOLVE') == 1
1437 executable('systemd-resolved',
1438 systemd_resolved_sources,
1439 gcrypt_util_sources,
1440 include_directories : includes,
1441 link_with : [libshared],
1442 dependencies : [threads,
1447 install_rpath : rootlibexecdir,
1449 install_dir : rootlibexecdir)
1451 exe = executable('systemd-resolve',
1452 systemd_resolve_sources,
1453 gcrypt_util_sources,
1454 include_directories : includes,
1455 link_with : [libshared],
1456 dependencies : [threads,
1461 install_rpath : rootlibexecdir,
1463 public_programs += [exe]
1466 if conf.get('ENABLE_LOGIND') == 1
1467 executable('systemd-logind',
1468 systemd_logind_sources,
1469 include_directories : includes,
1470 link_with : [liblogind_core,
1472 dependencies : [threads,
1474 install_rpath : rootlibexecdir,
1476 install_dir : rootlibexecdir)
1478 exe = executable('loginctl',
1480 include_directories : includes,
1481 link_with : [libshared],
1482 dependencies : [threads,
1485 install_rpath : rootlibexecdir,
1487 install_dir : rootbindir)
1488 public_programs += [exe]
1490 exe = executable('systemd-inhibit',
1491 'src/login/inhibit.c',
1492 include_directories : includes,
1493 link_with : [libshared],
1494 install_rpath : rootlibexecdir,
1496 install_dir : rootbindir)
1497 public_programs += [exe]
1499 if conf.get('HAVE_PAM') == 1
1500 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1501 pam_systemd = shared_library(
1505 include_directories : includes,
1506 link_args : ['-shared',
1507 '-Wl,--version-script=' + version_script_arg],
1508 link_with : [libsystemd_internal,
1510 dependencies : [threads,
1513 link_depends : pam_systemd_sym,
1515 install_dir : pamlibdir)
1517 test('dlopen-pam_systemd',
1519 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1523 if conf.get('HAVE_PAM') == 1
1524 executable('systemd-user-sessions',
1525 'src/user-sessions/user-sessions.c',
1526 include_directories : includes,
1527 link_with : [libshared],
1528 install_rpath : rootlibexecdir,
1530 install_dir : rootlibexecdir)
1533 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1534 exe = executable('bootctl',
1535 'src/boot/bootctl.c',
1536 include_directories : includes,
1537 link_with : [libshared],
1538 dependencies : [libblkid],
1539 install_rpath : rootlibexecdir,
1541 public_programs += [exe]
1544 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1545 include_directories : includes,
1546 link_with : [libshared],
1547 dependencies : [threads],
1548 install_rpath : rootlibexecdir,
1550 public_programs += [exe]
1552 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1553 include_directories : includes,
1554 link_with : [libshared],
1555 dependencies : [threads,
1560 install_rpath : rootlibexecdir,
1562 install_dir : rootbindir)
1563 public_programs += [exe]
1565 if conf.get('ENABLE_BACKLIGHT') == 1
1566 executable('systemd-backlight',
1567 'src/backlight/backlight.c',
1568 include_directories : includes,
1569 link_with : [libshared],
1570 install_rpath : rootlibexecdir,
1572 install_dir : rootlibexecdir)
1575 if conf.get('ENABLE_RFKILL') == 1
1576 executable('systemd-rfkill',
1577 'src/rfkill/rfkill.c',
1578 include_directories : includes,
1579 link_with : [libshared],
1580 install_rpath : rootlibexecdir,
1582 install_dir : rootlibexecdir)
1585 executable('systemd-system-update-generator',
1586 'src/system-update-generator/system-update-generator.c',
1587 include_directories : includes,
1588 link_with : [libshared],
1589 install_rpath : rootlibexecdir,
1591 install_dir : systemgeneratordir)
1593 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1594 executable('systemd-cryptsetup',
1595 'src/cryptsetup/cryptsetup.c',
1596 include_directories : includes,
1597 link_with : [libshared],
1598 dependencies : [libcryptsetup],
1599 install_rpath : rootlibexecdir,
1601 install_dir : rootlibexecdir)
1603 executable('systemd-cryptsetup-generator',
1604 'src/cryptsetup/cryptsetup-generator.c',
1605 include_directories : includes,
1606 link_with : [libshared],
1607 dependencies : [libcryptsetup],
1608 install_rpath : rootlibexecdir,
1610 install_dir : systemgeneratordir)
1612 executable('systemd-veritysetup',
1613 'src/veritysetup/veritysetup.c',
1614 include_directories : includes,
1615 link_with : [libshared],
1616 dependencies : [libcryptsetup],
1617 install_rpath : rootlibexecdir,
1619 install_dir : rootlibexecdir)
1621 executable('systemd-veritysetup-generator',
1622 'src/veritysetup/veritysetup-generator.c',
1623 include_directories : includes,
1624 link_with : [libshared],
1625 dependencies : [libcryptsetup],
1626 install_rpath : rootlibexecdir,
1628 install_dir : systemgeneratordir)
1631 if conf.get('HAVE_SYSV_COMPAT') == 1
1632 executable('systemd-sysv-generator',
1633 'src/sysv-generator/sysv-generator.c',
1634 include_directories : includes,
1635 link_with : [libshared],
1636 install_rpath : rootlibexecdir,
1638 install_dir : systemgeneratordir)
1640 executable('systemd-rc-local-generator',
1641 'src/rc-local-generator/rc-local-generator.c',
1642 include_directories : includes,
1643 link_with : [libshared],
1644 install_rpath : rootlibexecdir,
1646 install_dir : systemgeneratordir)
1649 if conf.get('ENABLE_HOSTNAMED') == 1
1650 executable('systemd-hostnamed',
1651 'src/hostname/hostnamed.c',
1652 include_directories : includes,
1653 link_with : [libshared],
1654 install_rpath : rootlibexecdir,
1656 install_dir : rootlibexecdir)
1658 exe = executable('hostnamectl',
1659 'src/hostname/hostnamectl.c',
1660 include_directories : includes,
1661 link_with : [libshared],
1662 install_rpath : rootlibexecdir,
1664 public_programs += [exe]
1667 if conf.get('ENABLE_LOCALED') == 1
1668 if conf.get('HAVE_XKBCOMMON') == 1
1669 # logind will load libxkbcommon.so dynamically on its own
1675 executable('systemd-localed',
1676 systemd_localed_sources,
1677 include_directories : includes,
1678 link_with : [libshared],
1679 dependencies : deps,
1680 install_rpath : rootlibexecdir,
1682 install_dir : rootlibexecdir)
1684 exe = executable('localectl',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 install_rpath : rootlibexecdir,
1690 public_programs += [exe]
1693 if conf.get('ENABLE_TIMEDATED') == 1
1694 executable('systemd-timedated',
1695 'src/timedate/timedated.c',
1696 include_directories : includes,
1697 link_with : [libshared],
1698 install_rpath : rootlibexecdir,
1700 install_dir : rootlibexecdir)
1702 exe = executable('timedatectl',
1703 'src/timedate/timedatectl.c',
1704 include_directories : includes,
1705 install_rpath : rootlibexecdir,
1706 link_with : [libshared],
1708 public_programs += [exe]
1711 if conf.get('ENABLE_TIMESYNCD') == 1
1712 executable('systemd-timesyncd',
1713 systemd_timesyncd_sources,
1714 include_directories : includes,
1715 link_with : [libshared],
1716 dependencies : [threads,
1718 install_rpath : rootlibexecdir,
1720 install_dir : rootlibexecdir)
1723 if conf.get('ENABLE_MACHINED') == 1
1724 executable('systemd-machined',
1725 systemd_machined_sources,
1726 include_directories : includes,
1727 link_with : [libmachine_core,
1729 install_rpath : rootlibexecdir,
1731 install_dir : rootlibexecdir)
1733 exe = executable('machinectl',
1734 'src/machine/machinectl.c',
1735 include_directories : includes,
1736 link_with : [libshared],
1737 dependencies : [threads,
1740 install_rpath : rootlibexecdir,
1742 install_dir : rootbindir)
1743 public_programs += [exe]
1746 if conf.get('ENABLE_IMPORTD') == 1
1747 executable('systemd-importd',
1748 systemd_importd_sources,
1749 include_directories : includes,
1750 link_with : [libshared],
1751 dependencies : [threads],
1752 install_rpath : rootlibexecdir,
1754 install_dir : rootlibexecdir)
1756 systemd_pull = executable('systemd-pull',
1757 systemd_pull_sources,
1758 include_directories : includes,
1759 link_with : [libshared],
1760 dependencies : [libcurl,
1765 install_rpath : rootlibexecdir,
1767 install_dir : rootlibexecdir)
1769 systemd_import = executable('systemd-import',
1770 systemd_import_sources,
1771 include_directories : includes,
1772 link_with : [libshared],
1773 dependencies : [libcurl,
1777 install_rpath : rootlibexecdir,
1779 install_dir : rootlibexecdir)
1781 systemd_export = executable('systemd-export',
1782 systemd_export_sources,
1783 include_directories : includes,
1784 link_with : [libshared],
1785 dependencies : [libcurl,
1789 install_rpath : rootlibexecdir,
1791 install_dir : rootlibexecdir)
1792 public_programs += [systemd_pull, systemd_import, systemd_export]
1795 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1796 exe = executable('systemd-journal-upload',
1797 systemd_journal_upload_sources,
1798 include_directories : includes,
1799 link_with : [libshared],
1800 dependencies : [threads,
1805 install_rpath : rootlibexecdir,
1807 install_dir : rootlibexecdir)
1808 public_programs += [exe]
1811 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1812 s_j_remote = executable('systemd-journal-remote',
1813 systemd_journal_remote_sources,
1814 include_directories : includes,
1815 link_with : [libshared],
1816 dependencies : [threads,
1821 install_rpath : rootlibexecdir,
1823 install_dir : rootlibexecdir)
1825 s_j_gatewayd = executable('systemd-journal-gatewayd',
1826 systemd_journal_gatewayd_sources,
1827 include_directories : includes,
1828 link_with : [libshared],
1829 dependencies : [threads,
1834 install_rpath : rootlibexecdir,
1836 install_dir : rootlibexecdir)
1837 public_programs += [s_j_remote, s_j_gatewayd]
1840 if conf.get('ENABLE_COREDUMP') == 1
1841 executable('systemd-coredump',
1842 systemd_coredump_sources,
1843 include_directories : includes,
1844 link_with : [libshared],
1845 dependencies : [threads,
1850 install_rpath : rootlibexecdir,
1852 install_dir : rootlibexecdir)
1854 exe = executable('coredumpctl',
1855 coredumpctl_sources,
1856 include_directories : includes,
1857 link_with : [libshared],
1858 dependencies : [threads,
1861 install_rpath : rootlibexecdir,
1863 public_programs += [exe]
1866 if conf.get('ENABLE_BINFMT') == 1
1867 exe = executable('systemd-binfmt',
1868 'src/binfmt/binfmt.c',
1869 include_directories : includes,
1870 link_with : [libshared],
1871 install_rpath : rootlibexecdir,
1873 install_dir : rootlibexecdir)
1874 public_programs += [exe]
1876 meson.add_install_script('sh', '-c',
1877 mkdir_p.format(binfmtdir))
1878 meson.add_install_script('sh', '-c',
1879 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1882 if conf.get('ENABLE_VCONSOLE') == 1
1883 executable('systemd-vconsole-setup',
1884 'src/vconsole/vconsole-setup.c',
1885 include_directories : includes,
1886 link_with : [libshared],
1887 install_rpath : rootlibexecdir,
1889 install_dir : rootlibexecdir)
1892 if conf.get('ENABLE_RANDOMSEED') == 1
1893 executable('systemd-random-seed',
1894 'src/random-seed/random-seed.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 install_rpath : rootlibexecdir,
1899 install_dir : rootlibexecdir)
1902 if conf.get('ENABLE_FIRSTBOOT') == 1
1903 executable('systemd-firstboot',
1904 'src/firstboot/firstboot.c',
1905 include_directories : includes,
1906 link_with : [libshared],
1907 dependencies : [libcrypt],
1908 install_rpath : rootlibexecdir,
1910 install_dir : rootbindir)
1913 executable('systemd-remount-fs',
1914 'src/remount-fs/remount-fs.c',
1915 'src/core/mount-setup.c',
1916 'src/core/mount-setup.h',
1917 include_directories : includes,
1918 link_with : [libshared],
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootlibexecdir)
1923 executable('systemd-machine-id-setup',
1924 'src/machine-id-setup/machine-id-setup-main.c',
1925 'src/core/machine-id-setup.c',
1926 'src/core/machine-id-setup.h',
1927 include_directories : includes,
1928 link_with : [libshared],
1929 install_rpath : rootlibexecdir,
1931 install_dir : rootbindir)
1933 executable('systemd-fsck',
1935 include_directories : includes,
1936 link_with : [libshared],
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootlibexecdir)
1941 executable('systemd-growfs',
1942 'src/partition/growfs.c',
1943 include_directories : includes,
1944 link_with : [libshared],
1945 dependencies : [libcryptsetup],
1946 install_rpath : rootlibexecdir,
1948 install_dir : rootlibexecdir)
1950 executable('systemd-makefs',
1951 'src/partition/makefs.c',
1952 include_directories : includes,
1953 link_with : [libshared],
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootlibexecdir)
1958 executable('systemd-sleep',
1959 'src/sleep/sleep.c',
1960 include_directories : includes,
1961 link_with : [libshared],
1962 install_rpath : rootlibexecdir,
1964 install_dir : rootlibexecdir)
1966 exe = executable('systemd-sysctl',
1967 'src/sysctl/sysctl.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootlibexecdir)
1973 public_programs += [exe]
1975 executable('systemd-ac-power',
1976 'src/ac-power/ac-power.c',
1977 include_directories : includes,
1978 link_with : [libshared],
1979 install_rpath : rootlibexecdir,
1981 install_dir : rootlibexecdir)
1983 exe = executable('systemd-detect-virt',
1984 'src/detect-virt/detect-virt.c',
1985 include_directories : includes,
1986 link_with : [libshared],
1987 install_rpath : rootlibexecdir,
1989 public_programs += [exe]
1991 exe = executable('systemd-delta',
1992 'src/delta/delta.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 install_rpath : rootlibexecdir,
1997 public_programs += [exe]
1999 exe = executable('systemd-escape',
2000 'src/escape/escape.c',
2001 include_directories : includes,
2002 link_with : [libshared],
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootbindir)
2006 public_programs += [exe]
2008 exe = executable('systemd-notify',
2009 'src/notify/notify.c',
2010 include_directories : includes,
2011 link_with : [libshared],
2012 install_rpath : rootlibexecdir,
2014 install_dir : rootbindir)
2015 public_programs += [exe]
2017 executable('systemd-volatile-root',
2018 'src/volatile-root/volatile-root.c',
2019 include_directories : includes,
2020 link_with : [libshared],
2021 install_rpath : rootlibexecdir,
2023 install_dir : rootlibexecdir)
2025 executable('systemd-cgroups-agent',
2026 'src/cgroups-agent/cgroups-agent.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 install_rpath : rootlibexecdir,
2031 install_dir : rootlibexecdir)
2033 exe = executable('systemd-path',
2035 include_directories : includes,
2036 link_with : [libshared],
2037 install_rpath : rootlibexecdir,
2039 public_programs += [exe]
2041 exe = executable('systemd-ask-password',
2042 'src/ask-password/ask-password.c',
2043 include_directories : includes,
2044 link_with : [libshared],
2045 install_rpath : rootlibexecdir,
2047 install_dir : rootbindir)
2048 public_programs += [exe]
2050 executable('systemd-reply-password',
2051 'src/reply-password/reply-password.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 install_rpath : rootlibexecdir,
2056 install_dir : rootlibexecdir)
2058 exe = executable('systemd-tty-ask-password-agent',
2059 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2060 include_directories : includes,
2061 link_with : [libshared],
2062 install_rpath : rootlibexecdir,
2064 install_dir : rootbindir)
2065 public_programs += [exe]
2067 exe = executable('systemd-cgls',
2069 include_directories : includes,
2070 link_with : [libshared],
2071 install_rpath : rootlibexecdir,
2073 public_programs += [exe]
2075 exe = executable('systemd-cgtop',
2076 'src/cgtop/cgtop.c',
2077 include_directories : includes,
2078 link_with : [libshared],
2079 install_rpath : rootlibexecdir,
2081 public_programs += [exe]
2083 executable('systemd-initctl',
2084 'src/initctl/initctl.c',
2085 include_directories : includes,
2086 link_with : [libshared],
2087 install_rpath : rootlibexecdir,
2089 install_dir : rootlibexecdir)
2091 exe = executable('systemd-mount',
2092 'src/mount/mount-tool.c',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 install_rpath : rootlibexecdir,
2097 public_programs += [exe]
2099 meson.add_install_script(meson_make_symlink,
2100 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2102 exe = executable('systemd-run',
2104 include_directories : includes,
2105 link_with : [libshared],
2106 install_rpath : rootlibexecdir,
2108 public_programs += [exe]
2110 exe = executable('systemd-stdio-bridge',
2111 'src/stdio-bridge/stdio-bridge.c',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 install_rpath : rootlibexecdir,
2116 public_programs += [exe]
2118 exe = executable('busctl',
2119 'src/busctl/busctl.c',
2120 'src/busctl/busctl-introspect.c',
2121 'src/busctl/busctl-introspect.h',
2122 include_directories : includes,
2123 link_with : [libshared],
2124 install_rpath : rootlibexecdir,
2126 public_programs += [exe]
2128 if conf.get('ENABLE_SYSUSERS') == 1
2129 exe = executable('systemd-sysusers',
2130 'src/sysusers/sysusers.c',
2131 include_directories : includes,
2132 link_with : [libshared],
2133 install_rpath : rootlibexecdir,
2135 install_dir : rootbindir)
2136 public_programs += [exe]
2139 if conf.get('ENABLE_TMPFILES') == 1
2140 exe = executable('systemd-tmpfiles',
2141 'src/tmpfiles/tmpfiles.c',
2142 include_directories : includes,
2143 link_with : [libshared],
2144 dependencies : [libacl],
2145 install_rpath : rootlibexecdir,
2147 install_dir : rootbindir)
2148 public_programs += [exe]
2150 test('test-systemd-tmpfiles',
2151 test_systemd_tmpfiles_py,
2152 args : exe.full_path())
2153 # https://github.com/mesonbuild/meson/issues/2681
2156 if conf.get('ENABLE_HWDB') == 1
2157 exe = executable('systemd-hwdb',
2159 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2160 include_directories : includes,
2161 link_with : [libudev_internal],
2162 install_rpath : udev_rpath,
2164 install_dir : rootbindir)
2165 public_programs += [exe]
2168 if conf.get('ENABLE_QUOTACHECK') == 1
2169 executable('systemd-quotacheck',
2170 'src/quotacheck/quotacheck.c',
2171 include_directories : includes,
2172 link_with : [libshared],
2173 install_rpath : rootlibexecdir,
2175 install_dir : rootlibexecdir)
2178 exe = executable('systemd-socket-proxyd',
2179 'src/socket-proxy/socket-proxyd.c',
2180 include_directories : includes,
2181 link_with : [libshared],
2182 dependencies : [threads],
2183 install_rpath : rootlibexecdir,
2185 install_dir : rootlibexecdir)
2186 public_programs += [exe]
2188 exe = executable('systemd-udevd',
2189 systemd_udevd_sources,
2190 include_directories : includes,
2191 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2192 link_with : [libudev_core,
2195 dependencies : [threads,
2200 install_rpath : udev_rpath,
2202 install_dir : rootlibexecdir)
2203 public_programs += [exe]
2205 exe = executable('udevadm',
2207 include_directories : includes,
2208 link_with : [libudev_core,
2211 dependencies : [threads,
2216 install_rpath : udev_rpath,
2218 install_dir : rootbindir)
2219 public_programs += [exe]
2221 executable('systemd-shutdown',
2222 systemd_shutdown_sources,
2223 include_directories : includes,
2224 link_with : [libshared],
2225 install_rpath : rootlibexecdir,
2227 install_dir : rootlibexecdir)
2229 executable('systemd-update-done',
2230 'src/update-done/update-done.c',
2231 include_directories : includes,
2232 link_with : [libshared],
2233 install_rpath : rootlibexecdir,
2235 install_dir : rootlibexecdir)
2237 executable('systemd-update-utmp',
2238 'src/update-utmp/update-utmp.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 dependencies : [libaudit],
2242 install_rpath : rootlibexecdir,
2244 install_dir : rootlibexecdir)
2246 if conf.get('HAVE_KMOD') == 1
2247 executable('systemd-modules-load',
2248 'src/modules-load/modules-load.c',
2249 include_directories : includes,
2250 link_with : [libshared],
2251 dependencies : [libkmod],
2252 install_rpath : rootlibexecdir,
2254 install_dir : rootlibexecdir)
2256 meson.add_install_script('sh', '-c',
2257 mkdir_p.format(modulesloaddir))
2258 meson.add_install_script('sh', '-c',
2259 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2262 exe = executable('systemd-nspawn',
2263 systemd_nspawn_sources,
2264 'src/core/mount-setup.c', # FIXME: use a variable?
2265 'src/core/mount-setup.h',
2266 'src/core/loopback-setup.c',
2267 'src/core/loopback-setup.h',
2268 include_directories : [includes, include_directories('src/nspawn')],
2269 link_with : [libshared],
2270 dependencies : [libacl,
2274 install_rpath : rootlibexecdir,
2276 public_programs += [exe]
2278 if conf.get('ENABLE_NETWORKD') == 1
2279 executable('systemd-networkd',
2280 systemd_networkd_sources,
2281 include_directories : includes,
2282 link_with : [libnetworkd_core,
2286 dependencies : [threads],
2287 install_rpath : rootlibexecdir,
2289 install_dir : rootlibexecdir)
2291 executable('systemd-networkd-wait-online',
2292 systemd_networkd_wait_online_sources,
2293 include_directories : includes,
2294 link_with : [libnetworkd_core,
2296 install_rpath : rootlibexecdir,
2298 install_dir : rootlibexecdir)
2300 exe = executable('networkctl',
2302 include_directories : includes,
2303 link_with : [libsystemd_network,
2305 install_rpath : rootlibexecdir,
2307 install_dir : rootbindir)
2308 public_programs += [exe]
2310 ############################################################
2312 foreach tuple : tests
2314 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2315 dependencies = tuple[2]
2316 condition = tuple.length() >= 4 ? tuple[3] : ''
2317 type = tuple.length() >= 5 ? tuple[4] : ''
2318 defs = tuple.length() >= 6 ? tuple[5] : []
2319 incs = tuple.length() >= 7 ? tuple[6] : includes
2322 name = sources[0].split('/')[-1].split('.')[0]
2323 if type.startswith('timeout=')
2324 timeout = type.split('=')[1].to_int()
2328 if condition == '' or conf.get(condition) == 1
2332 include_directories : incs,
2333 link_with : link_with,
2334 dependencies : dependencies,
2336 install_rpath : rootlibexecdir,
2337 install : install_tests,
2338 install_dir : join_paths(testsdir, type))
2341 message('@0@ is a manual test'.format(name))
2342 elif type == 'unsafe' and want_tests != 'unsafe'
2343 message('@0@ is an unsafe test'.format(name))
2350 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2354 test_libsystemd_sym = executable(
2355 'test-libsystemd-sym',
2356 test_libsystemd_sym_c,
2357 include_directories : includes,
2358 link_with : [libsystemd],
2359 install : install_tests,
2360 install_dir : testsdir)
2361 test('test-libsystemd-sym',
2362 test_libsystemd_sym)
2364 test_libudev_sym = executable(
2367 include_directories : includes,
2368 c_args : ['-Wno-deprecated-declarations'],
2369 link_with : [libudev],
2370 install : install_tests,
2371 install_dir : testsdir)
2372 test('test-libudev-sym',
2375 ############################################################
2377 make_directive_index_py = find_program('tools/make-directive-index.py')
2378 make_man_index_py = find_program('tools/make-man-index.py')
2379 xml_helper_py = find_program('tools/xml_helper.py')
2380 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2384 subdir('sysusers.d')
2385 subdir('tmpfiles.d')
2389 subdir('shell-completion/bash')
2390 subdir('shell-completion/zsh')
2391 subdir('docs/sysvinit')
2392 subdir('docs/var-log')
2394 # FIXME: figure out if the warning is true:
2395 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2396 install_subdir('factory/etc',
2397 install_dir : factorydir)
2400 install_data('xorg/50-systemd-user.sh',
2401 install_dir : xinitrcdir)
2402 install_data('system-preset/90-systemd.preset',
2403 install_dir : systempresetdir)
2404 install_data('modprobe.d/systemd.conf',
2405 install_dir : modprobedir)
2406 install_data('README',
2413 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2414 install_dir : docdir)
2416 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2417 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2419 ############################################################
2421 meson_check_help = find_program('tools/meson-check-help.sh')
2423 foreach exec : public_programs
2424 name = exec.full_path().split('/')[-1]
2425 test('check-help-' + name,
2427 args : [exec.full_path()])
2430 ############################################################
2433 all_files = run_command(
2435 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2438 all_files = files(all_files.stdout().split())
2443 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2447 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2451 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2454 command : [meson_git_contrib_sh])
2458 git_head = run_command(
2460 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2461 'rev-parse', 'HEAD']).stdout().strip()
2462 git_head_short = run_command(
2464 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2465 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2469 command : ['git', 'archive',
2470 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2472 '--prefix', 'systemd-@0@/'.format(git_head),
2476 ############################################################
2479 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2481 'prefix directory: @0@'.format(prefixdir),
2482 'rootprefix directory: @0@'.format(rootprefixdir),
2483 'sysconf directory: @0@'.format(sysconfdir),
2484 'include directory: @0@'.format(includedir),
2485 'lib directory: @0@'.format(libdir),
2486 'rootlib directory: @0@'.format(rootlibdir),
2487 'SysV init scripts: @0@'.format(sysvinit_path),
2488 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2489 'PAM modules directory: @0@'.format(pamlibdir),
2490 'PAM configuration directory: @0@'.format(pamconfdir),
2491 'RPM macros directory: @0@'.format(rpmmacrosdir),
2492 'modprobe.d directory: @0@'.format(modprobedir),
2493 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2494 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2495 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2496 'bash completions directory: @0@'.format(bashcompletiondir),
2497 'zsh completions directory: @0@'.format(zshcompletiondir),
2498 'extra start script: @0@'.format(get_option('rc-local')),
2499 'extra stop script: @0@'.format(get_option('halt-local')),
2500 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2501 get_option('debug-tty')),
2502 'TTY GID: @0@'.format(tty_gid),
2503 'maximum system UID: @0@'.format(system_uid_max),
2504 'maximum system GID: @0@'.format(system_gid_max),
2505 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2506 'render group access mode: @0@'.format(get_option('group-render-mode')),
2507 'certificate root directory: @0@'.format(get_option('certificate-root')),
2508 'support URL: @0@'.format(support_url),
2509 'nobody user name: @0@'.format(get_option('nobody-user')),
2510 'nobody group name: @0@'.format(get_option('nobody-group')),
2511 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2512 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2514 'default DNSSEC mode: @0@'.format(default_dnssec),
2515 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2516 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2518 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2519 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2521 'default DNS servers: @0@'.format(alt_dns_servers),
2522 'default NTP servers: @0@'.format(alt_ntp_servers)]
2524 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2525 '@@0@'.format(time_epoch)).stdout().strip()
2527 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2530 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2531 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2532 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2534 if conf.get('ENABLE_EFI') == 1
2536 'efi arch: @0@'.format(efi_arch)]
2540 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2541 'EFI CC @0@'.format(efi_cc),
2542 'EFI lib directory: @0@'.format(efi_libdir),
2543 'EFI lds directory: @0@'.format(efi_ldsdir),
2544 'EFI include directory: @0@'.format(efi_incdir)]
2597 ['legacy pkla', install_polkit_pkla],
2599 ['gnu-efi', have_gnu_efi],
2605 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2608 ['man pages', want_man],
2609 ['html pages', want_html],
2610 ['man page indices', want_man and have_lxml],
2611 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2616 ['adm group', get_option('adm-group')],
2617 ['wheel group', get_option('wheel-group')],
2620 ['debug mmap cache'],
2623 cond = tuple.get(1, '')
2625 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2626 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2627 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2632 missing += [tuple[0]]
2638 'enabled features: @0@'.format(', '.join(found)),
2640 'disabled features: @0@'.format(', '.join(missing)),
2642 message('\n '.join(status))
2644 if rootprefixdir != rootprefix_default
2645 message('WARNING:\n' +
2646 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2647 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2648 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))