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 system_gid_max = get_option('system-gid-max')
618 if system_gid_max == ''
619 system_gid_max = run_command(
621 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
622 '/etc/login.defs').stdout()
624 system_gid_max = system_gid_max.to_int()
625 conf.set('SYSTEM_GID_MAX', system_gid_max)
626 substs.set('systemgidmax', system_gid_max)
627 message('maximum system GID is @0@'.format(system_gid_max))
629 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
630 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
631 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
632 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
633 substs.set('dynamicuidmin', dynamic_uid_min)
634 substs.set('dynamicuidmax', dynamic_uid_max)
636 container_uid_base_min = get_option('container-uid-base-min').to_int()
637 container_uid_base_max = get_option('container-uid-base-max').to_int()
638 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
639 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
640 substs.set('containeruidbasemin', container_uid_base_min)
641 substs.set('containeruidbasemax', container_uid_base_max)
643 conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
644 conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
646 tty_gid = get_option('tty-gid')
647 conf.set('TTY_GID', tty_gid)
648 substs.set('TTY_GID', tty_gid)
650 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
651 if get_option('users-gid') != ''
652 users_gid = get_option('users-gid').to_int()
656 substs.set('USERS_GID', users_gid)
658 if get_option('adm-group')
659 m4_defines += ['-DENABLE_ADM_GROUP']
662 if get_option('wheel-group')
663 m4_defines += ['-DENABLE_WHEEL_GROUP']
666 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
667 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
669 kill_user_processes = get_option('default-kill-user-processes')
670 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
671 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
673 dns_servers = get_option('dns-servers')
674 conf.set_quoted('DNS_SERVERS', dns_servers)
675 substs.set('DNS_SERVERS', dns_servers)
677 ntp_servers = get_option('ntp-servers')
678 conf.set_quoted('NTP_SERVERS', ntp_servers)
679 substs.set('NTP_SERVERS', ntp_servers)
681 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
683 substs.set('SUSHELL', get_option('debug-shell'))
684 substs.set('DEBUGTTY', get_option('debug-tty'))
686 debug = get_option('debug')
687 enable_debug_hashmap = false
688 enable_debug_mmap_cache = false
690 foreach name : debug.split(',')
692 enable_debug_hashmap = true
693 elif name == 'mmap-cache'
694 enable_debug_mmap_cache = true
696 message('unknown debug option "@0@", ignoring'.format(name))
700 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
701 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
703 #####################################################################
705 threads = dependency('threads')
706 librt = cc.find_library('rt')
707 libm = cc.find_library('m')
708 libdl = cc.find_library('dl')
709 libcrypt = cc.find_library('crypt')
711 libcap = dependency('libcap', required : false)
712 if not libcap.found()
713 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
714 libcap = cc.find_library('cap')
717 libmount = dependency('mount',
720 want_seccomp = get_option('seccomp')
721 if want_seccomp != 'false'
722 libseccomp = dependency('libseccomp',
723 version : '>= 2.3.1',
724 required : want_seccomp == 'true')
725 have = libseccomp.found()
730 conf.set10('HAVE_SECCOMP', have)
731 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
733 want_selinux = get_option('selinux')
734 if want_selinux != 'false'
735 libselinux = dependency('libselinux',
736 version : '>= 2.1.9',
737 required : want_selinux == 'true')
738 have = libselinux.found()
743 conf.set10('HAVE_SELINUX', have)
744 m4_defines += have ? ['-DHAVE_SELINUX'] : []
746 want_apparmor = get_option('apparmor')
747 if want_apparmor != 'false'
748 libapparmor = dependency('libapparmor',
749 required : want_apparmor == 'true')
750 have = libapparmor.found()
755 conf.set10('HAVE_APPARMOR', have)
756 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
758 smack_run_label = get_option('smack-run-label')
759 if smack_run_label != ''
760 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
761 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
764 want_polkit = get_option('polkit')
765 install_polkit = false
766 install_polkit_pkla = false
767 if want_polkit != 'false'
768 install_polkit = true
770 libpolkit = dependency('polkit-gobject-1',
772 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
773 message('Old polkit detected, will install pkla files')
774 install_polkit_pkla = true
777 conf.set10('ENABLE_POLKIT', install_polkit)
779 want_acl = get_option('acl')
780 if want_acl != 'false'
781 libacl = cc.find_library('acl', required : want_acl == 'true')
782 have = libacl.found()
787 conf.set10('HAVE_ACL', have)
788 m4_defines += have ? ['-DHAVE_ACL'] : []
790 want_audit = get_option('audit')
791 if want_audit != 'false'
792 libaudit = dependency('audit', required : want_audit == 'true')
793 have = libaudit.found()
798 conf.set10('HAVE_AUDIT', have)
800 want_blkid = get_option('blkid')
801 if want_blkid != 'false'
802 libblkid = dependency('blkid', required : want_blkid == 'true')
803 have = libblkid.found()
808 conf.set10('HAVE_BLKID', have)
810 want_kmod = get_option('kmod')
811 if want_kmod != 'false'
812 libkmod = dependency('libkmod',
814 required : want_kmod == 'true')
815 have = libkmod.found()
820 conf.set10('HAVE_KMOD', have)
822 want_pam = get_option('pam')
823 if want_pam != 'false'
824 libpam = cc.find_library('pam', required : want_pam == 'true')
825 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
826 have = libpam.found() and libpam_misc.found()
832 conf.set10('HAVE_PAM', have)
833 m4_defines += have ? ['-DHAVE_PAM'] : []
835 want_microhttpd = get_option('microhttpd')
836 if want_microhttpd != 'false'
837 libmicrohttpd = dependency('libmicrohttpd',
838 version : '>= 0.9.33',
839 required : want_microhttpd == 'true')
840 have = libmicrohttpd.found()
845 conf.set10('HAVE_MICROHTTPD', have)
846 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
848 want_libcryptsetup = get_option('libcryptsetup')
849 if want_libcryptsetup != 'false'
850 libcryptsetup = dependency('libcryptsetup',
851 version : '>= 1.6.0',
852 required : want_libcryptsetup == 'true')
853 have = libcryptsetup.found()
858 conf.set10('HAVE_LIBCRYPTSETUP', have)
860 want_libcurl = get_option('libcurl')
861 if want_libcurl != 'false'
862 libcurl = dependency('libcurl',
863 version : '>= 7.32.0',
864 required : want_libcurl == 'true')
865 have = libcurl.found()
870 conf.set10('HAVE_LIBCURL', have)
871 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
873 want_libidn = get_option('libidn')
874 want_libidn2 = get_option('libidn2')
875 if want_libidn == 'true' and want_libidn2 == 'true'
876 error('libidn and libidn2 cannot be requested simultaneously')
879 if want_libidn != 'false' and want_libidn2 != 'true'
880 libidn = dependency('libidn',
881 required : want_libidn == 'true')
882 have = libidn.found()
887 conf.set10('HAVE_LIBIDN', have)
888 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
889 if not have and want_libidn2 != 'false'
890 # libidn is used for both libidn and libidn2 objects
891 libidn = dependency('libidn2',
892 required : want_libidn2 == 'true')
893 have = libidn.found()
897 conf.set10('HAVE_LIBIDN2', have)
898 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
900 want_libiptc = get_option('libiptc')
901 if want_libiptc != 'false'
902 libiptc = dependency('libiptc',
903 required : want_libiptc == 'true')
904 have = libiptc.found()
909 conf.set10('HAVE_LIBIPTC', have)
910 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
912 want_qrencode = get_option('qrencode')
913 if want_qrencode != 'false'
914 libqrencode = dependency('libqrencode',
915 required : want_qrencode == 'true')
916 have = libqrencode.found()
921 conf.set10('HAVE_QRENCODE', have)
923 want_gcrypt = get_option('gcrypt')
924 if want_gcrypt != 'false'
925 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
926 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
927 have = libgcrypt.found() and libgpg_error.found()
932 # link to neither of the libs if one is not found
936 conf.set10('HAVE_GCRYPT', have)
938 want_gnutls = get_option('gnutls')
939 if want_gnutls != 'false'
940 libgnutls = dependency('gnutls',
941 version : '>= 3.1.4',
942 required : want_gnutls == 'true')
943 have = libgnutls.found()
948 conf.set10('HAVE_GNUTLS', have)
950 want_elfutils = get_option('elfutils')
951 if want_elfutils != 'false'
952 libdw = dependency('libdw',
953 required : want_elfutils == 'true')
959 conf.set10('HAVE_ELFUTILS', have)
961 want_zlib = get_option('zlib')
962 if want_zlib != 'false'
963 libz = dependency('zlib',
964 required : want_zlib == 'true')
970 conf.set10('HAVE_ZLIB', have)
972 want_bzip2 = get_option('bzip2')
973 if want_bzip2 != 'false'
974 libbzip2 = cc.find_library('bz2',
975 required : want_bzip2 == 'true')
976 have = libbzip2.found()
981 conf.set10('HAVE_BZIP2', have)
983 want_xz = get_option('xz')
984 if want_xz != 'false'
985 libxz = dependency('liblzma',
986 required : want_xz == 'true')
992 conf.set10('HAVE_XZ', have)
994 want_lz4 = get_option('lz4')
995 if want_lz4 != 'false'
996 liblz4 = dependency('liblz4',
997 required : want_lz4 == 'true')
998 have = liblz4.found()
1003 conf.set10('HAVE_LZ4', have)
1005 want_xkbcommon = get_option('xkbcommon')
1006 if want_xkbcommon != 'false'
1007 libxkbcommon = dependency('xkbcommon',
1008 version : '>= 0.3.0',
1009 required : want_xkbcommon == 'true')
1010 have = libxkbcommon.found()
1015 conf.set10('HAVE_XKBCOMMON', have)
1017 want_glib = get_option('glib')
1018 if want_glib != 'false'
1019 libglib = dependency('glib-2.0',
1020 version : '>= 2.22.0',
1021 required : want_glib == 'true')
1022 libgobject = dependency('gobject-2.0',
1023 version : '>= 2.22.0',
1024 required : want_glib == 'true')
1025 libgio = dependency('gio-2.0',
1026 required : want_glib == 'true')
1027 have = libglib.found() and libgobject.found() and libgio.found()
1034 conf.set10('HAVE_GLIB', have)
1036 want_dbus = get_option('dbus')
1037 if want_dbus != 'false'
1038 libdbus = dependency('dbus-1',
1039 version : '>= 1.3.2',
1040 required : want_dbus == 'true')
1041 have = libdbus.found()
1046 conf.set10('HAVE_DBUS', have)
1048 default_dnssec = get_option('default-dnssec')
1049 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1050 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1051 default_dnssec = 'no'
1053 conf.set('DEFAULT_DNSSEC_MODE',
1054 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1055 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1057 want_importd = get_option('importd')
1058 if want_importd != 'false'
1059 have = (conf.get('HAVE_LIBCURL') == 1 and
1060 conf.get('HAVE_ZLIB') == 1 and
1061 conf.get('HAVE_BZIP2') == 1 and
1062 conf.get('HAVE_XZ') == 1 and
1063 conf.get('HAVE_GCRYPT') == 1)
1064 if want_importd == 'true' and not have
1065 error('importd support was requested, but dependencies are not available')
1070 conf.set10('ENABLE_IMPORTD', have)
1072 want_remote = get_option('remote')
1073 if want_remote != 'false'
1074 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1075 conf.get('HAVE_LIBCURL') == 1]
1076 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1077 # it's possible to build one without the other. Complain only if
1078 # support was explictly requested. The auxiliary files like sysusers
1079 # config should be installed when any of the programs are built.
1080 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1081 error('remote support was requested, but dependencies are not available')
1083 have = have_deps[0] or have_deps[1]
1087 conf.set10('ENABLE_REMOTE', have)
1089 foreach term : ['utmp',
1120 have = get_option(term)
1121 name = 'ENABLE_' + term.underscorify().to_upper()
1122 conf.set10(name, have)
1123 m4_defines += have ? ['-D' + name] : []
1126 want_tests = get_option('tests')
1127 install_tests = get_option('install-tests')
1130 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1132 #####################################################################
1134 if get_option('efi')
1135 efi_arch = host_machine.cpu_family()
1137 if efi_arch == 'x86'
1138 EFI_MACHINE_TYPE_NAME = 'ia32'
1139 gnu_efi_arch = 'ia32'
1140 elif efi_arch == 'x86_64'
1141 EFI_MACHINE_TYPE_NAME = 'x64'
1142 gnu_efi_arch = 'x86_64'
1143 elif efi_arch == 'arm'
1144 EFI_MACHINE_TYPE_NAME = 'arm'
1145 gnu_efi_arch = 'arm'
1146 elif efi_arch == 'aarch64'
1147 EFI_MACHINE_TYPE_NAME = 'aa64'
1148 gnu_efi_arch = 'aarch64'
1150 EFI_MACHINE_TYPE_NAME = ''
1155 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1157 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1161 conf.set10('ENABLE_EFI', have)
1163 #####################################################################
1165 config_h = configure_file(
1166 output : 'config.h',
1167 configuration : conf)
1169 includes = include_directories('src/basic',
1179 'src/libsystemd/sd-bus',
1180 'src/libsystemd/sd-device',
1181 'src/libsystemd/sd-hwdb',
1182 'src/libsystemd/sd-id128',
1183 'src/libsystemd/sd-netlink',
1184 'src/libsystemd/sd-network',
1185 'src/libsystemd-network',
1189 add_project_arguments('-include', 'config.h', language : 'c')
1191 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1192 'src/shared/gcrypt-util.c')
1196 subdir('src/systemd')
1198 subdir('src/libsystemd')
1199 subdir('src/libsystemd-network')
1200 subdir('src/journal')
1203 libjournal_core = static_library(
1205 libjournal_core_sources,
1207 include_directories : includes,
1210 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1211 libsystemd = shared_library(
1213 libsystemd_internal_sources,
1214 journal_internal_sources,
1215 version : libsystemd_version,
1216 include_directories : includes,
1217 link_args : ['-shared',
1218 '-Wl,--version-script=' + libsystemd_sym_path],
1219 link_with : [libbasic],
1220 dependencies : [threads,
1225 link_depends : libsystemd_sym,
1227 install_dir : rootlibdir)
1229 ############################################################
1231 # binaries that have --help and are intended for use by humans,
1232 # usually, but not always, installed in /bin.
1233 public_programs = []
1235 subdir('src/libudev')
1236 subdir('src/shared')
1239 subdir('src/network')
1241 subdir('src/analyze')
1242 subdir('src/journal-remote')
1243 subdir('src/coredump')
1244 subdir('src/hostname')
1245 subdir('src/import')
1246 subdir('src/kernel-install')
1247 subdir('src/locale')
1248 subdir('src/machine')
1249 subdir('src/nspawn')
1250 subdir('src/resolve')
1251 subdir('src/timedate')
1252 subdir('src/timesync')
1253 subdir('src/vconsole')
1254 subdir('src/sulogin-shell')
1255 subdir('src/boot/efi')
1261 ############################################################
1263 # only static linking apart from libdl, to make sure that the
1264 # module is linked to all libraries that it uses.
1265 test_dlopen = executable(
1268 include_directories : includes,
1269 link_with : [libbasic],
1270 dependencies : [libdl])
1272 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1273 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1274 ['mymachines', 'ENABLE_MACHINED'],
1275 ['resolve', 'ENABLE_RESOLVE']]
1277 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1281 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1282 version_script_arg = join_paths(meson.current_source_dir(), sym)
1284 nss = shared_library(
1286 'src/nss-@0@/nss-@0@.c'.format(module),
1288 include_directories : includes,
1289 link_args : ['-shared',
1290 '-Wl,--version-script=' + version_script_arg,
1292 link_with : [libsystemd_internal,
1294 dependencies : [threads,
1298 install_dir : rootlibdir)
1300 # We cannot use shared_module because it does not support version suffix.
1301 # Unfortunately shared_library insists on creating the symlink…
1302 meson.add_install_script('sh', '-c',
1303 'rm $DESTDIR@0@/libnss_@1@.so'
1304 .format(rootlibdir, module))
1306 test('dlopen-nss_' + module,
1308 args : [nss.full_path()]) # path to dlopen must include a slash
1312 ############################################################
1314 executable('systemd',
1316 include_directories : includes,
1317 link_with : [libcore,
1319 dependencies : [threads,
1325 install_rpath : rootlibexecdir,
1327 install_dir : rootlibexecdir)
1329 exe = executable('systemd-analyze',
1330 systemd_analyze_sources,
1331 include_directories : includes,
1332 link_with : [libcore,
1334 dependencies : [threads,
1340 install_rpath : rootlibexecdir,
1342 public_programs += [exe]
1344 executable('systemd-journald',
1345 systemd_journald_sources,
1346 include_directories : includes,
1347 link_with : [libjournal_core,
1349 dependencies : [threads,
1353 install_rpath : rootlibexecdir,
1355 install_dir : rootlibexecdir)
1357 exe = executable('systemd-cat',
1358 systemd_cat_sources,
1359 include_directories : includes,
1360 link_with : [libjournal_core,
1362 dependencies : [threads],
1363 install_rpath : rootlibexecdir,
1365 public_programs += [exe]
1367 exe = executable('journalctl',
1369 include_directories : includes,
1370 link_with : [libshared],
1371 dependencies : [threads,
1375 install_rpath : rootlibexecdir,
1377 install_dir : rootbindir)
1378 public_programs += [exe]
1380 executable('systemd-getty-generator',
1381 'src/getty-generator/getty-generator.c',
1382 include_directories : includes,
1383 link_with : [libshared],
1384 install_rpath : rootlibexecdir,
1386 install_dir : systemgeneratordir)
1388 executable('systemd-debug-generator',
1389 'src/debug-generator/debug-generator.c',
1390 include_directories : includes,
1391 link_with : [libshared],
1392 install_rpath : rootlibexecdir,
1394 install_dir : systemgeneratordir)
1396 executable('systemd-fstab-generator',
1397 'src/fstab-generator/fstab-generator.c',
1398 'src/core/mount-setup.c',
1399 include_directories : includes,
1400 link_with : [libshared],
1401 install_rpath : rootlibexecdir,
1403 install_dir : systemgeneratordir)
1405 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1406 executable('30-systemd-environment-d-generator',
1407 'src/environment-d-generator/environment-d-generator.c',
1408 include_directories : includes,
1409 link_with : [libshared],
1410 install_rpath : rootlibexecdir,
1412 install_dir : userenvgeneratordir)
1414 meson.add_install_script(meson_make_symlink,
1415 join_paths(sysconfdir, 'environment'),
1416 join_paths(environmentdir, '99-environment.conf'))
1419 if conf.get('ENABLE_HIBERNATE') == 1
1420 executable('systemd-hibernate-resume-generator',
1421 'src/hibernate-resume/hibernate-resume-generator.c',
1422 include_directories : includes,
1423 link_with : [libshared],
1424 install_rpath : rootlibexecdir,
1426 install_dir : systemgeneratordir)
1428 executable('systemd-hibernate-resume',
1429 'src/hibernate-resume/hibernate-resume.c',
1430 include_directories : includes,
1431 link_with : [libshared],
1432 install_rpath : rootlibexecdir,
1434 install_dir : rootlibexecdir)
1437 if conf.get('HAVE_BLKID') == 1
1438 executable('systemd-gpt-auto-generator',
1439 'src/gpt-auto-generator/gpt-auto-generator.c',
1440 'src/basic/blkid-util.h',
1441 include_directories : includes,
1442 link_with : [libshared],
1443 dependencies : libblkid,
1444 install_rpath : rootlibexecdir,
1446 install_dir : systemgeneratordir)
1448 exe = executable('systemd-dissect',
1449 'src/dissect/dissect.c',
1450 include_directories : includes,
1451 link_with : [libshared],
1452 install_rpath : rootlibexecdir,
1454 install_dir : rootlibexecdir)
1455 public_programs += [exe]
1458 if conf.get('ENABLE_RESOLVE') == 1
1459 executable('systemd-resolved',
1460 systemd_resolved_sources,
1461 gcrypt_util_sources,
1462 include_directories : includes,
1463 link_with : [libshared],
1464 dependencies : [threads,
1469 install_rpath : rootlibexecdir,
1471 install_dir : rootlibexecdir)
1473 exe = executable('systemd-resolve',
1474 systemd_resolve_sources,
1475 gcrypt_util_sources,
1476 include_directories : includes,
1477 link_with : [libshared],
1478 dependencies : [threads,
1483 install_rpath : rootlibexecdir,
1485 public_programs += [exe]
1488 if conf.get('ENABLE_LOGIND') == 1
1489 executable('systemd-logind',
1490 systemd_logind_sources,
1491 include_directories : includes,
1492 link_with : [liblogind_core,
1494 dependencies : [threads,
1496 install_rpath : rootlibexecdir,
1498 install_dir : rootlibexecdir)
1500 exe = executable('loginctl',
1502 include_directories : includes,
1503 link_with : [libshared],
1504 dependencies : [threads,
1507 install_rpath : rootlibexecdir,
1509 install_dir : rootbindir)
1510 public_programs += [exe]
1512 exe = executable('systemd-inhibit',
1513 'src/login/inhibit.c',
1514 include_directories : includes,
1515 link_with : [libshared],
1516 install_rpath : rootlibexecdir,
1518 install_dir : rootbindir)
1519 public_programs += [exe]
1521 if conf.get('HAVE_PAM') == 1
1522 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1523 pam_systemd = shared_library(
1527 include_directories : includes,
1528 link_args : ['-shared',
1529 '-Wl,--version-script=' + version_script_arg],
1530 link_with : [libsystemd_internal,
1532 dependencies : [threads,
1535 link_depends : pam_systemd_sym,
1537 install_dir : pamlibdir)
1539 test('dlopen-pam_systemd',
1541 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1545 if conf.get('HAVE_PAM') == 1
1546 executable('systemd-user-sessions',
1547 'src/user-sessions/user-sessions.c',
1548 include_directories : includes,
1549 link_with : [libshared],
1550 install_rpath : rootlibexecdir,
1552 install_dir : rootlibexecdir)
1555 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1556 exe = executable('bootctl',
1557 'src/boot/bootctl.c',
1558 include_directories : includes,
1559 link_with : [libshared],
1560 dependencies : [libblkid],
1561 install_rpath : rootlibexecdir,
1563 public_programs += [exe]
1566 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1567 include_directories : includes,
1568 link_with : [libshared],
1569 dependencies : [threads],
1570 install_rpath : rootlibexecdir,
1572 public_programs += [exe]
1574 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1575 include_directories : includes,
1576 link_with : [libshared],
1577 dependencies : [threads,
1582 install_rpath : rootlibexecdir,
1584 install_dir : rootbindir)
1585 public_programs += [exe]
1587 if conf.get('ENABLE_BACKLIGHT') == 1
1588 executable('systemd-backlight',
1589 'src/backlight/backlight.c',
1590 include_directories : includes,
1591 link_with : [libshared],
1592 install_rpath : rootlibexecdir,
1594 install_dir : rootlibexecdir)
1597 if conf.get('ENABLE_RFKILL') == 1
1598 executable('systemd-rfkill',
1599 'src/rfkill/rfkill.c',
1600 include_directories : includes,
1601 link_with : [libshared],
1602 install_rpath : rootlibexecdir,
1604 install_dir : rootlibexecdir)
1607 executable('systemd-system-update-generator',
1608 'src/system-update-generator/system-update-generator.c',
1609 include_directories : includes,
1610 link_with : [libshared],
1611 install_rpath : rootlibexecdir,
1613 install_dir : systemgeneratordir)
1615 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1616 executable('systemd-cryptsetup',
1617 'src/cryptsetup/cryptsetup.c',
1618 include_directories : includes,
1619 link_with : [libshared],
1620 dependencies : [libcryptsetup],
1621 install_rpath : rootlibexecdir,
1623 install_dir : rootlibexecdir)
1625 executable('systemd-cryptsetup-generator',
1626 'src/cryptsetup/cryptsetup-generator.c',
1627 include_directories : includes,
1628 link_with : [libshared],
1629 dependencies : [libcryptsetup],
1630 install_rpath : rootlibexecdir,
1632 install_dir : systemgeneratordir)
1634 executable('systemd-veritysetup',
1635 'src/veritysetup/veritysetup.c',
1636 include_directories : includes,
1637 link_with : [libshared],
1638 dependencies : [libcryptsetup],
1639 install_rpath : rootlibexecdir,
1641 install_dir : rootlibexecdir)
1643 executable('systemd-veritysetup-generator',
1644 'src/veritysetup/veritysetup-generator.c',
1645 include_directories : includes,
1646 link_with : [libshared],
1647 dependencies : [libcryptsetup],
1648 install_rpath : rootlibexecdir,
1650 install_dir : systemgeneratordir)
1653 if conf.get('HAVE_SYSV_COMPAT') == 1
1654 executable('systemd-sysv-generator',
1655 'src/sysv-generator/sysv-generator.c',
1656 include_directories : includes,
1657 link_with : [libshared],
1658 install_rpath : rootlibexecdir,
1660 install_dir : systemgeneratordir)
1662 executable('systemd-rc-local-generator',
1663 'src/rc-local-generator/rc-local-generator.c',
1664 include_directories : includes,
1665 link_with : [libshared],
1666 install_rpath : rootlibexecdir,
1668 install_dir : systemgeneratordir)
1671 if conf.get('ENABLE_HOSTNAMED') == 1
1672 executable('systemd-hostnamed',
1673 'src/hostname/hostnamed.c',
1674 include_directories : includes,
1675 link_with : [libshared],
1676 install_rpath : rootlibexecdir,
1678 install_dir : rootlibexecdir)
1680 exe = executable('hostnamectl',
1681 'src/hostname/hostnamectl.c',
1682 include_directories : includes,
1683 link_with : [libshared],
1684 install_rpath : rootlibexecdir,
1686 public_programs += [exe]
1689 if conf.get('ENABLE_LOCALED') == 1
1690 if conf.get('HAVE_XKBCOMMON') == 1
1691 # logind will load libxkbcommon.so dynamically on its own
1697 executable('systemd-localed',
1698 systemd_localed_sources,
1699 include_directories : includes,
1700 link_with : [libshared],
1701 dependencies : deps,
1702 install_rpath : rootlibexecdir,
1704 install_dir : rootlibexecdir)
1706 exe = executable('localectl',
1708 include_directories : includes,
1709 link_with : [libshared],
1710 install_rpath : rootlibexecdir,
1712 public_programs += [exe]
1715 if conf.get('ENABLE_TIMEDATED') == 1
1716 executable('systemd-timedated',
1717 'src/timedate/timedated.c',
1718 include_directories : includes,
1719 link_with : [libshared],
1720 install_rpath : rootlibexecdir,
1722 install_dir : rootlibexecdir)
1724 exe = executable('timedatectl',
1725 'src/timedate/timedatectl.c',
1726 include_directories : includes,
1727 install_rpath : rootlibexecdir,
1728 link_with : [libshared],
1730 public_programs += [exe]
1733 if conf.get('ENABLE_TIMESYNCD') == 1
1734 executable('systemd-timesyncd',
1735 systemd_timesyncd_sources,
1736 include_directories : includes,
1737 link_with : [libshared],
1738 dependencies : [threads,
1740 install_rpath : rootlibexecdir,
1742 install_dir : rootlibexecdir)
1745 if conf.get('ENABLE_MACHINED') == 1
1746 executable('systemd-machined',
1747 systemd_machined_sources,
1748 include_directories : includes,
1749 link_with : [libmachine_core,
1751 install_rpath : rootlibexecdir,
1753 install_dir : rootlibexecdir)
1755 exe = executable('machinectl',
1756 'src/machine/machinectl.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 dependencies : [threads,
1762 install_rpath : rootlibexecdir,
1764 install_dir : rootbindir)
1765 public_programs += [exe]
1768 if conf.get('ENABLE_IMPORTD') == 1
1769 executable('systemd-importd',
1770 systemd_importd_sources,
1771 include_directories : includes,
1772 link_with : [libshared],
1773 dependencies : [threads],
1774 install_rpath : rootlibexecdir,
1776 install_dir : rootlibexecdir)
1778 systemd_pull = executable('systemd-pull',
1779 systemd_pull_sources,
1780 include_directories : includes,
1781 link_with : [libshared],
1782 dependencies : [libcurl,
1787 install_rpath : rootlibexecdir,
1789 install_dir : rootlibexecdir)
1791 systemd_import = executable('systemd-import',
1792 systemd_import_sources,
1793 include_directories : includes,
1794 link_with : [libshared],
1795 dependencies : [libcurl,
1799 install_rpath : rootlibexecdir,
1801 install_dir : rootlibexecdir)
1803 systemd_export = executable('systemd-export',
1804 systemd_export_sources,
1805 include_directories : includes,
1806 link_with : [libshared],
1807 dependencies : [libcurl,
1811 install_rpath : rootlibexecdir,
1813 install_dir : rootlibexecdir)
1814 public_programs += [systemd_pull, systemd_import, systemd_export]
1817 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1818 exe = executable('systemd-journal-upload',
1819 systemd_journal_upload_sources,
1820 include_directories : includes,
1821 link_with : [libshared],
1822 dependencies : [threads,
1827 install_rpath : rootlibexecdir,
1829 install_dir : rootlibexecdir)
1830 public_programs += [exe]
1833 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1834 s_j_remote = executable('systemd-journal-remote',
1835 systemd_journal_remote_sources,
1836 include_directories : includes,
1837 link_with : [libshared],
1838 dependencies : [threads,
1843 install_rpath : rootlibexecdir,
1845 install_dir : rootlibexecdir)
1847 s_j_gatewayd = executable('systemd-journal-gatewayd',
1848 systemd_journal_gatewayd_sources,
1849 include_directories : includes,
1850 link_with : [libshared],
1851 dependencies : [threads,
1856 install_rpath : rootlibexecdir,
1858 install_dir : rootlibexecdir)
1859 public_programs += [s_j_remote, s_j_gatewayd]
1862 if conf.get('ENABLE_COREDUMP') == 1
1863 executable('systemd-coredump',
1864 systemd_coredump_sources,
1865 include_directories : includes,
1866 link_with : [libshared],
1867 dependencies : [threads,
1872 install_rpath : rootlibexecdir,
1874 install_dir : rootlibexecdir)
1876 exe = executable('coredumpctl',
1877 coredumpctl_sources,
1878 include_directories : includes,
1879 link_with : [libshared],
1880 dependencies : [threads,
1883 install_rpath : rootlibexecdir,
1885 public_programs += [exe]
1888 if conf.get('ENABLE_BINFMT') == 1
1889 exe = executable('systemd-binfmt',
1890 'src/binfmt/binfmt.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootlibexecdir)
1896 public_programs += [exe]
1898 meson.add_install_script('sh', '-c',
1899 mkdir_p.format(binfmtdir))
1900 meson.add_install_script('sh', '-c',
1901 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1904 if conf.get('ENABLE_VCONSOLE') == 1
1905 executable('systemd-vconsole-setup',
1906 'src/vconsole/vconsole-setup.c',
1907 include_directories : includes,
1908 link_with : [libshared],
1909 install_rpath : rootlibexecdir,
1911 install_dir : rootlibexecdir)
1914 if conf.get('ENABLE_RANDOMSEED') == 1
1915 executable('systemd-random-seed',
1916 'src/random-seed/random-seed.c',
1917 include_directories : includes,
1918 link_with : [libshared],
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootlibexecdir)
1924 if conf.get('ENABLE_FIRSTBOOT') == 1
1925 executable('systemd-firstboot',
1926 'src/firstboot/firstboot.c',
1927 include_directories : includes,
1928 link_with : [libshared],
1929 dependencies : [libcrypt],
1930 install_rpath : rootlibexecdir,
1932 install_dir : rootbindir)
1935 executable('systemd-remount-fs',
1936 'src/remount-fs/remount-fs.c',
1937 'src/core/mount-setup.c',
1938 'src/core/mount-setup.h',
1939 include_directories : includes,
1940 link_with : [libshared],
1941 install_rpath : rootlibexecdir,
1943 install_dir : rootlibexecdir)
1945 executable('systemd-machine-id-setup',
1946 'src/machine-id-setup/machine-id-setup-main.c',
1947 'src/core/machine-id-setup.c',
1948 'src/core/machine-id-setup.h',
1949 include_directories : includes,
1950 link_with : [libshared],
1951 install_rpath : rootlibexecdir,
1953 install_dir : rootbindir)
1955 executable('systemd-fsck',
1957 include_directories : includes,
1958 link_with : [libshared],
1959 install_rpath : rootlibexecdir,
1961 install_dir : rootlibexecdir)
1963 executable('systemd-growfs',
1964 'src/partition/growfs.c',
1965 include_directories : includes,
1966 link_with : [libshared],
1967 dependencies : [libcryptsetup],
1968 install_rpath : rootlibexecdir,
1970 install_dir : rootlibexecdir)
1972 executable('systemd-makefs',
1973 'src/partition/makefs.c',
1974 include_directories : includes,
1975 link_with : [libshared],
1976 install_rpath : rootlibexecdir,
1978 install_dir : rootlibexecdir)
1980 executable('systemd-sleep',
1981 'src/sleep/sleep.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 install_rpath : rootlibexecdir,
1986 install_dir : rootlibexecdir)
1988 exe = executable('systemd-sysctl',
1989 'src/sysctl/sysctl.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootlibexecdir)
1995 public_programs += [exe]
1997 executable('systemd-ac-power',
1998 'src/ac-power/ac-power.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 install_rpath : rootlibexecdir,
2003 install_dir : rootlibexecdir)
2005 exe = executable('systemd-detect-virt',
2006 'src/detect-virt/detect-virt.c',
2007 include_directories : includes,
2008 link_with : [libshared],
2009 install_rpath : rootlibexecdir,
2011 public_programs += [exe]
2013 exe = executable('systemd-delta',
2014 'src/delta/delta.c',
2015 include_directories : includes,
2016 link_with : [libshared],
2017 install_rpath : rootlibexecdir,
2019 public_programs += [exe]
2021 exe = executable('systemd-escape',
2022 'src/escape/escape.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 install_rpath : rootlibexecdir,
2027 install_dir : rootbindir)
2028 public_programs += [exe]
2030 exe = executable('systemd-notify',
2031 'src/notify/notify.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 install_rpath : rootlibexecdir,
2036 install_dir : rootbindir)
2037 public_programs += [exe]
2039 executable('systemd-volatile-root',
2040 'src/volatile-root/volatile-root.c',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 install_rpath : rootlibexecdir,
2045 install_dir : rootlibexecdir)
2047 executable('systemd-cgroups-agent',
2048 'src/cgroups-agent/cgroups-agent.c',
2049 include_directories : includes,
2050 link_with : [libshared],
2051 install_rpath : rootlibexecdir,
2053 install_dir : rootlibexecdir)
2055 exe = executable('systemd-path',
2057 include_directories : includes,
2058 link_with : [libshared],
2059 install_rpath : rootlibexecdir,
2061 public_programs += [exe]
2063 exe = executable('systemd-ask-password',
2064 'src/ask-password/ask-password.c',
2065 include_directories : includes,
2066 link_with : [libshared],
2067 install_rpath : rootlibexecdir,
2069 install_dir : rootbindir)
2070 public_programs += [exe]
2072 executable('systemd-reply-password',
2073 'src/reply-password/reply-password.c',
2074 include_directories : includes,
2075 link_with : [libshared],
2076 install_rpath : rootlibexecdir,
2078 install_dir : rootlibexecdir)
2080 exe = executable('systemd-tty-ask-password-agent',
2081 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2082 include_directories : includes,
2083 link_with : [libshared],
2084 install_rpath : rootlibexecdir,
2086 install_dir : rootbindir)
2087 public_programs += [exe]
2089 exe = executable('systemd-cgls',
2091 include_directories : includes,
2092 link_with : [libshared],
2093 install_rpath : rootlibexecdir,
2095 public_programs += [exe]
2097 exe = executable('systemd-cgtop',
2098 'src/cgtop/cgtop.c',
2099 include_directories : includes,
2100 link_with : [libshared],
2101 install_rpath : rootlibexecdir,
2103 public_programs += [exe]
2105 executable('systemd-initctl',
2106 'src/initctl/initctl.c',
2107 include_directories : includes,
2108 link_with : [libshared],
2109 install_rpath : rootlibexecdir,
2111 install_dir : rootlibexecdir)
2113 exe = executable('systemd-mount',
2114 'src/mount/mount-tool.c',
2115 include_directories : includes,
2116 link_with : [libshared],
2117 install_rpath : rootlibexecdir,
2119 public_programs += [exe]
2121 meson.add_install_script(meson_make_symlink,
2122 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2124 exe = executable('systemd-run',
2126 include_directories : includes,
2127 link_with : [libshared],
2128 install_rpath : rootlibexecdir,
2130 public_programs += [exe]
2132 exe = executable('systemd-stdio-bridge',
2133 'src/stdio-bridge/stdio-bridge.c',
2134 include_directories : includes,
2135 link_with : [libshared],
2136 install_rpath : rootlibexecdir,
2138 public_programs += [exe]
2140 exe = executable('busctl',
2141 'src/busctl/busctl.c',
2142 'src/busctl/busctl-introspect.c',
2143 'src/busctl/busctl-introspect.h',
2144 include_directories : includes,
2145 link_with : [libshared],
2146 install_rpath : rootlibexecdir,
2148 public_programs += [exe]
2150 if conf.get('ENABLE_SYSUSERS') == 1
2151 exe = executable('systemd-sysusers',
2152 'src/sysusers/sysusers.c',
2153 include_directories : includes,
2154 link_with : [libshared],
2155 install_rpath : rootlibexecdir,
2157 install_dir : rootbindir)
2158 public_programs += [exe]
2161 if conf.get('ENABLE_TMPFILES') == 1
2162 exe = executable('systemd-tmpfiles',
2163 'src/tmpfiles/tmpfiles.c',
2164 include_directories : includes,
2165 link_with : [libshared],
2166 dependencies : [libacl],
2167 install_rpath : rootlibexecdir,
2169 install_dir : rootbindir)
2170 public_programs += [exe]
2173 if conf.get('ENABLE_HWDB') == 1
2174 exe = executable('systemd-hwdb',
2176 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2177 include_directories : includes,
2178 link_with : [libudev_internal],
2179 install_rpath : udev_rpath,
2181 install_dir : rootbindir)
2182 public_programs += [exe]
2185 if conf.get('ENABLE_QUOTACHECK') == 1
2186 executable('systemd-quotacheck',
2187 'src/quotacheck/quotacheck.c',
2188 include_directories : includes,
2189 link_with : [libshared],
2190 install_rpath : rootlibexecdir,
2192 install_dir : rootlibexecdir)
2195 exe = executable('systemd-socket-proxyd',
2196 'src/socket-proxy/socket-proxyd.c',
2197 include_directories : includes,
2198 link_with : [libshared],
2199 dependencies : [threads],
2200 install_rpath : rootlibexecdir,
2202 install_dir : rootlibexecdir)
2203 public_programs += [exe]
2205 exe = executable('systemd-udevd',
2206 systemd_udevd_sources,
2207 include_directories : includes,
2208 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2209 link_with : [libudev_core,
2212 dependencies : [threads,
2217 install_rpath : udev_rpath,
2219 install_dir : rootlibexecdir)
2220 public_programs += [exe]
2222 exe = executable('udevadm',
2224 include_directories : includes,
2225 link_with : [libudev_core,
2228 dependencies : [threads,
2233 install_rpath : udev_rpath,
2235 install_dir : rootbindir)
2236 public_programs += [exe]
2238 executable('systemd-shutdown',
2239 systemd_shutdown_sources,
2240 include_directories : includes,
2241 link_with : [libshared],
2242 install_rpath : rootlibexecdir,
2244 install_dir : rootlibexecdir)
2246 executable('systemd-update-done',
2247 'src/update-done/update-done.c',
2248 include_directories : includes,
2249 link_with : [libshared],
2250 install_rpath : rootlibexecdir,
2252 install_dir : rootlibexecdir)
2254 executable('systemd-update-utmp',
2255 'src/update-utmp/update-utmp.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 dependencies : [libaudit],
2259 install_rpath : rootlibexecdir,
2261 install_dir : rootlibexecdir)
2263 if conf.get('HAVE_KMOD') == 1
2264 executable('systemd-modules-load',
2265 'src/modules-load/modules-load.c',
2266 include_directories : includes,
2267 link_with : [libshared],
2268 dependencies : [libkmod],
2269 install_rpath : rootlibexecdir,
2271 install_dir : rootlibexecdir)
2273 meson.add_install_script('sh', '-c',
2274 mkdir_p.format(modulesloaddir))
2275 meson.add_install_script('sh', '-c',
2276 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2279 exe = executable('systemd-nspawn',
2280 systemd_nspawn_sources,
2281 'src/core/mount-setup.c', # FIXME: use a variable?
2282 'src/core/mount-setup.h',
2283 'src/core/loopback-setup.c',
2284 'src/core/loopback-setup.h',
2285 include_directories : [includes, include_directories('src/nspawn')],
2286 link_with : [libshared],
2287 dependencies : [libacl,
2291 install_rpath : rootlibexecdir,
2293 public_programs += [exe]
2295 if conf.get('ENABLE_NETWORKD') == 1
2296 executable('systemd-networkd',
2297 systemd_networkd_sources,
2298 include_directories : includes,
2299 link_with : [libnetworkd_core,
2303 dependencies : [threads],
2304 install_rpath : rootlibexecdir,
2306 install_dir : rootlibexecdir)
2308 executable('systemd-networkd-wait-online',
2309 systemd_networkd_wait_online_sources,
2310 include_directories : includes,
2311 link_with : [libnetworkd_core,
2313 install_rpath : rootlibexecdir,
2315 install_dir : rootlibexecdir)
2317 exe = executable('networkctl',
2319 include_directories : includes,
2320 link_with : [libsystemd_network,
2322 install_rpath : rootlibexecdir,
2324 install_dir : rootbindir)
2325 public_programs += [exe]
2327 ############################################################
2329 foreach tuple : tests
2331 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2332 dependencies = tuple[2]
2333 condition = tuple.length() >= 4 ? tuple[3] : ''
2334 type = tuple.length() >= 5 ? tuple[4] : ''
2335 defs = tuple.length() >= 6 ? tuple[5] : []
2336 incs = tuple.length() >= 7 ? tuple[6] : includes
2339 name = sources[0].split('/')[-1].split('.')[0]
2340 if type.startswith('timeout=')
2341 timeout = type.split('=')[1].to_int()
2345 if condition == '' or conf.get(condition) == 1
2349 include_directories : incs,
2350 link_with : link_with,
2351 dependencies : dependencies,
2353 install_rpath : rootlibexecdir,
2354 install : install_tests,
2355 install_dir : join_paths(testsdir, type))
2358 message('@0@ is a manual test'.format(name))
2359 elif type == 'unsafe' and want_tests != 'unsafe'
2360 message('@0@ is an unsafe test'.format(name))
2367 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2371 test_libsystemd_sym = executable(
2372 'test-libsystemd-sym',
2373 test_libsystemd_sym_c,
2374 include_directories : includes,
2375 link_with : [libsystemd],
2376 install : install_tests,
2377 install_dir : testsdir)
2378 test('test-libsystemd-sym',
2379 test_libsystemd_sym)
2381 test_libudev_sym = executable(
2384 include_directories : includes,
2385 c_args : ['-Wno-deprecated-declarations'],
2386 link_with : [libudev],
2387 install : install_tests,
2388 install_dir : testsdir)
2389 test('test-libudev-sym',
2392 ############################################################
2394 make_directive_index_py = find_program('tools/make-directive-index.py')
2395 make_man_index_py = find_program('tools/make-man-index.py')
2396 xml_helper_py = find_program('tools/xml_helper.py')
2397 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2401 subdir('sysusers.d')
2402 subdir('tmpfiles.d')
2406 subdir('shell-completion/bash')
2407 subdir('shell-completion/zsh')
2408 subdir('docs/sysvinit')
2409 subdir('docs/var-log')
2411 # FIXME: figure out if the warning is true:
2412 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2413 install_subdir('factory/etc',
2414 install_dir : factorydir)
2417 install_data('xorg/50-systemd-user.sh',
2418 install_dir : xinitrcdir)
2419 install_data('system-preset/90-systemd.preset',
2420 install_dir : systempresetdir)
2421 install_data('modprobe.d/systemd.conf',
2422 install_dir : modprobedir)
2423 install_data('README',
2430 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2431 install_dir : docdir)
2433 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2434 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2436 ############################################################
2438 meson_check_help = find_program('tools/meson-check-help.sh')
2440 foreach exec : public_programs
2441 name = exec.full_path().split('/')[-1]
2442 test('check-help-' + name,
2444 args : [exec.full_path()])
2447 ############################################################
2450 all_files = run_command(
2452 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2455 all_files = files(all_files.stdout().split())
2460 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2464 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2468 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2471 command : [meson_git_contrib_sh])
2475 git_head = run_command(
2477 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2478 'rev-parse', 'HEAD']).stdout().strip()
2479 git_head_short = run_command(
2481 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2482 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2486 command : ['git', 'archive',
2487 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2489 '--prefix', 'systemd-@0@/'.format(git_head),
2493 ############################################################
2496 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2498 'prefix directory: @0@'.format(prefixdir),
2499 'rootprefix directory: @0@'.format(rootprefixdir),
2500 'sysconf directory: @0@'.format(sysconfdir),
2501 'include directory: @0@'.format(includedir),
2502 'lib directory: @0@'.format(libdir),
2503 'rootlib directory: @0@'.format(rootlibdir),
2504 'SysV init scripts: @0@'.format(sysvinit_path),
2505 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2506 'PAM modules directory: @0@'.format(pamlibdir),
2507 'PAM configuration directory: @0@'.format(pamconfdir),
2508 'RPM macros directory: @0@'.format(rpmmacrosdir),
2509 'modprobe.d directory: @0@'.format(modprobedir),
2510 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2511 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2512 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2513 'bash completions directory: @0@'.format(bashcompletiondir),
2514 'zsh completions directory: @0@'.format(zshcompletiondir),
2515 'extra start script: @0@'.format(get_option('rc-local')),
2516 'extra stop script: @0@'.format(get_option('halt-local')),
2517 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2518 get_option('debug-tty')),
2519 'TTY GID: @0@'.format(tty_gid),
2520 'users GID: @0@'.format(users_gid),
2521 'maximum system UID: @0@'.format(system_uid_max),
2522 'maximum system GID: @0@'.format(system_gid_max),
2523 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2524 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2525 'minimum container UID base: @0@'.format(container_uid_base_min),
2526 'maximum container UID base: @0@'.format(container_uid_base_max),
2527 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2528 'render group access mode: @0@'.format(get_option('group-render-mode')),
2529 'certificate root directory: @0@'.format(get_option('certificate-root')),
2530 'support URL: @0@'.format(support_url),
2531 'nobody user name: @0@'.format(get_option('nobody-user')),
2532 'nobody group name: @0@'.format(get_option('nobody-group')),
2533 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2534 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2536 'default DNSSEC mode: @0@'.format(default_dnssec),
2537 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2538 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2540 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2541 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2543 'default DNS servers: @0@'.format(alt_dns_servers),
2544 'default NTP servers: @0@'.format(alt_ntp_servers)]
2546 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2547 '@@0@'.format(time_epoch)).stdout().strip()
2549 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2552 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2553 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2554 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2556 if conf.get('ENABLE_EFI') == 1
2558 'efi arch: @0@'.format(efi_arch)]
2562 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2563 'EFI CC @0@'.format(efi_cc),
2564 'EFI lib directory: @0@'.format(efi_libdir),
2565 'EFI lds directory: @0@'.format(efi_ldsdir),
2566 'EFI include directory: @0@'.format(efi_incdir)]
2619 ['legacy pkla', install_polkit_pkla],
2621 ['gnu-efi', have_gnu_efi],
2627 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2630 ['man pages', want_man],
2631 ['html pages', want_html],
2632 ['man page indices', want_man and have_lxml],
2633 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2638 ['adm group', get_option('adm-group')],
2639 ['wheel group', get_option('wheel-group')],
2642 ['debug mmap cache'],
2645 cond = tuple.get(1, '')
2647 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2648 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2649 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2654 missing += [tuple[0]]
2660 'enabled features: @0@'.format(', '.join(found)),
2662 'disabled features: @0@'.format(', '.join(missing)),
2664 message('\n '.join(status))
2666 if rootprefixdir != rootprefix_default
2667 message('WARNING:\n' +
2668 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2669 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2670 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))