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 nobody_user = get_option('nobody-user')
644 nobody_group = get_option('nobody-group')
646 getent_result = run_command('getent', 'passwd', '65534')
647 if getent_result.returncode() == 0
648 name = getent_result.stdout().split(':')[0]
649 if name != nobody_user
650 message('WARNING:\n' +
651 ' The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
652 ' Your build will result in an user table setup that is incompatible with the local system.')
655 id_result = run_command('id', '-u', nobody_user)
656 if id_result.returncode() == 0
657 id = id_result.stdout().to_int()
659 message('WARNING:\n' +
660 ' The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
661 ' Your build will result in an user table setup that is incompatible with the local system.')
665 getent_result = run_command('getent', 'group', '65534')
666 if getent_result.returncode() == 0
667 name = getent_result.stdout().split(':')[0]
668 if name != nobody_group
669 message('WARNING:\n' +
670 ' The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
671 ' Your build will result in an group table setup that is incompatible with the local system.')
674 id_result = run_command('id', '-g', nobody_group)
675 if id_result.returncode() == 0
676 id = id_result.stdout().to_int()
678 message('WARNING:\n' +
679 ' The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
680 ' Your build will result in an group table setup that is incompatible with the local system.')
684 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
685 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
687 tty_gid = get_option('tty-gid')
688 conf.set('TTY_GID', tty_gid)
689 substs.set('TTY_GID', tty_gid)
691 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
692 if get_option('users-gid') != ''
693 users_gid = get_option('users-gid').to_int()
697 substs.set('USERS_GID', users_gid)
699 if get_option('adm-group')
700 m4_defines += ['-DENABLE_ADM_GROUP']
703 if get_option('wheel-group')
704 m4_defines += ['-DENABLE_WHEEL_GROUP']
707 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
708 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
710 kill_user_processes = get_option('default-kill-user-processes')
711 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
712 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
714 dns_servers = get_option('dns-servers')
715 conf.set_quoted('DNS_SERVERS', dns_servers)
716 substs.set('DNS_SERVERS', dns_servers)
718 ntp_servers = get_option('ntp-servers')
719 conf.set_quoted('NTP_SERVERS', ntp_servers)
720 substs.set('NTP_SERVERS', ntp_servers)
722 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
724 substs.set('SUSHELL', get_option('debug-shell'))
725 substs.set('DEBUGTTY', get_option('debug-tty'))
727 debug = get_option('debug')
728 enable_debug_hashmap = false
729 enable_debug_mmap_cache = false
731 foreach name : debug.split(',')
733 enable_debug_hashmap = true
734 elif name == 'mmap-cache'
735 enable_debug_mmap_cache = true
737 message('unknown debug option "@0@", ignoring'.format(name))
741 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
742 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
744 #####################################################################
746 threads = dependency('threads')
747 librt = cc.find_library('rt')
748 libm = cc.find_library('m')
749 libdl = cc.find_library('dl')
750 libcrypt = cc.find_library('crypt')
752 libcap = dependency('libcap', required : false)
753 if not libcap.found()
754 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
755 libcap = cc.find_library('cap')
758 libmount = dependency('mount',
761 want_seccomp = get_option('seccomp')
762 if want_seccomp != 'false'
763 libseccomp = dependency('libseccomp',
764 version : '>= 2.3.1',
765 required : want_seccomp == 'true')
766 have = libseccomp.found()
771 conf.set10('HAVE_SECCOMP', have)
772 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
774 want_selinux = get_option('selinux')
775 if want_selinux != 'false'
776 libselinux = dependency('libselinux',
777 version : '>= 2.1.9',
778 required : want_selinux == 'true')
779 have = libselinux.found()
784 conf.set10('HAVE_SELINUX', have)
785 m4_defines += have ? ['-DHAVE_SELINUX'] : []
787 want_apparmor = get_option('apparmor')
788 if want_apparmor != 'false'
789 libapparmor = dependency('libapparmor',
790 required : want_apparmor == 'true')
791 have = libapparmor.found()
796 conf.set10('HAVE_APPARMOR', have)
797 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
799 smack_run_label = get_option('smack-run-label')
800 if smack_run_label != ''
801 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
802 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
805 want_polkit = get_option('polkit')
806 install_polkit = false
807 install_polkit_pkla = false
808 if want_polkit != 'false'
809 install_polkit = true
811 libpolkit = dependency('polkit-gobject-1',
813 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
814 message('Old polkit detected, will install pkla files')
815 install_polkit_pkla = true
818 conf.set10('ENABLE_POLKIT', install_polkit)
820 want_acl = get_option('acl')
821 if want_acl != 'false'
822 libacl = cc.find_library('acl', required : want_acl == 'true')
823 have = libacl.found()
828 conf.set10('HAVE_ACL', have)
829 m4_defines += have ? ['-DHAVE_ACL'] : []
831 want_audit = get_option('audit')
832 if want_audit != 'false'
833 libaudit = dependency('audit', required : want_audit == 'true')
834 have = libaudit.found()
839 conf.set10('HAVE_AUDIT', have)
841 want_blkid = get_option('blkid')
842 if want_blkid != 'false'
843 libblkid = dependency('blkid', required : want_blkid == 'true')
844 have = libblkid.found()
849 conf.set10('HAVE_BLKID', have)
851 want_kmod = get_option('kmod')
852 if want_kmod != 'false'
853 libkmod = dependency('libkmod',
855 required : want_kmod == 'true')
856 have = libkmod.found()
861 conf.set10('HAVE_KMOD', have)
863 want_pam = get_option('pam')
864 if want_pam != 'false'
865 libpam = cc.find_library('pam', required : want_pam == 'true')
866 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
867 have = libpam.found() and libpam_misc.found()
873 conf.set10('HAVE_PAM', have)
874 m4_defines += have ? ['-DHAVE_PAM'] : []
876 want_microhttpd = get_option('microhttpd')
877 if want_microhttpd != 'false'
878 libmicrohttpd = dependency('libmicrohttpd',
879 version : '>= 0.9.33',
880 required : want_microhttpd == 'true')
881 have = libmicrohttpd.found()
886 conf.set10('HAVE_MICROHTTPD', have)
887 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
889 want_libcryptsetup = get_option('libcryptsetup')
890 if want_libcryptsetup != 'false'
891 libcryptsetup = dependency('libcryptsetup',
892 version : '>= 1.6.0',
893 required : want_libcryptsetup == 'true')
894 have = libcryptsetup.found()
899 conf.set10('HAVE_LIBCRYPTSETUP', have)
901 want_libcurl = get_option('libcurl')
902 if want_libcurl != 'false'
903 libcurl = dependency('libcurl',
904 version : '>= 7.32.0',
905 required : want_libcurl == 'true')
906 have = libcurl.found()
911 conf.set10('HAVE_LIBCURL', have)
912 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
914 want_libidn = get_option('libidn')
915 want_libidn2 = get_option('libidn2')
916 if want_libidn == 'true' and want_libidn2 == 'true'
917 error('libidn and libidn2 cannot be requested simultaneously')
920 if want_libidn != 'false' and want_libidn2 != 'true'
921 libidn = dependency('libidn',
922 required : want_libidn == 'true')
923 have = libidn.found()
928 conf.set10('HAVE_LIBIDN', have)
929 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
930 if not have and want_libidn2 != 'false'
931 # libidn is used for both libidn and libidn2 objects
932 libidn = dependency('libidn2',
933 required : want_libidn2 == 'true')
934 have = libidn.found()
938 conf.set10('HAVE_LIBIDN2', have)
939 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
941 want_libiptc = get_option('libiptc')
942 if want_libiptc != 'false'
943 libiptc = dependency('libiptc',
944 required : want_libiptc == 'true')
945 have = libiptc.found()
950 conf.set10('HAVE_LIBIPTC', have)
951 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
953 want_qrencode = get_option('qrencode')
954 if want_qrencode != 'false'
955 libqrencode = dependency('libqrencode',
956 required : want_qrencode == 'true')
957 have = libqrencode.found()
962 conf.set10('HAVE_QRENCODE', have)
964 want_gcrypt = get_option('gcrypt')
965 if want_gcrypt != 'false'
966 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
967 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
968 have = libgcrypt.found() and libgpg_error.found()
973 # link to neither of the libs if one is not found
977 conf.set10('HAVE_GCRYPT', have)
979 want_gnutls = get_option('gnutls')
980 if want_gnutls != 'false'
981 libgnutls = dependency('gnutls',
982 version : '>= 3.1.4',
983 required : want_gnutls == 'true')
984 have = libgnutls.found()
989 conf.set10('HAVE_GNUTLS', have)
991 want_elfutils = get_option('elfutils')
992 if want_elfutils != 'false'
993 libdw = dependency('libdw',
994 required : want_elfutils == 'true')
1000 conf.set10('HAVE_ELFUTILS', have)
1002 want_zlib = get_option('zlib')
1003 if want_zlib != 'false'
1004 libz = dependency('zlib',
1005 required : want_zlib == 'true')
1011 conf.set10('HAVE_ZLIB', have)
1013 want_bzip2 = get_option('bzip2')
1014 if want_bzip2 != 'false'
1015 libbzip2 = cc.find_library('bz2',
1016 required : want_bzip2 == 'true')
1017 have = libbzip2.found()
1022 conf.set10('HAVE_BZIP2', have)
1024 want_xz = get_option('xz')
1025 if want_xz != 'false'
1026 libxz = dependency('liblzma',
1027 required : want_xz == 'true')
1028 have = libxz.found()
1033 conf.set10('HAVE_XZ', have)
1035 want_lz4 = get_option('lz4')
1036 if want_lz4 != 'false'
1037 liblz4 = dependency('liblz4',
1038 required : want_lz4 == 'true')
1039 have = liblz4.found()
1044 conf.set10('HAVE_LZ4', have)
1046 want_xkbcommon = get_option('xkbcommon')
1047 if want_xkbcommon != 'false'
1048 libxkbcommon = dependency('xkbcommon',
1049 version : '>= 0.3.0',
1050 required : want_xkbcommon == 'true')
1051 have = libxkbcommon.found()
1056 conf.set10('HAVE_XKBCOMMON', have)
1058 want_glib = get_option('glib')
1059 if want_glib != 'false'
1060 libglib = dependency('glib-2.0',
1061 version : '>= 2.22.0',
1062 required : want_glib == 'true')
1063 libgobject = dependency('gobject-2.0',
1064 version : '>= 2.22.0',
1065 required : want_glib == 'true')
1066 libgio = dependency('gio-2.0',
1067 required : want_glib == 'true')
1068 have = libglib.found() and libgobject.found() and libgio.found()
1075 conf.set10('HAVE_GLIB', have)
1077 want_dbus = get_option('dbus')
1078 if want_dbus != 'false'
1079 libdbus = dependency('dbus-1',
1080 version : '>= 1.3.2',
1081 required : want_dbus == 'true')
1082 have = libdbus.found()
1087 conf.set10('HAVE_DBUS', have)
1089 default_dnssec = get_option('default-dnssec')
1090 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1091 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1092 default_dnssec = 'no'
1094 conf.set('DEFAULT_DNSSEC_MODE',
1095 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1096 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1098 want_importd = get_option('importd')
1099 if want_importd != 'false'
1100 have = (conf.get('HAVE_LIBCURL') == 1 and
1101 conf.get('HAVE_ZLIB') == 1 and
1102 conf.get('HAVE_BZIP2') == 1 and
1103 conf.get('HAVE_XZ') == 1 and
1104 conf.get('HAVE_GCRYPT') == 1)
1105 if want_importd == 'true' and not have
1106 error('importd support was requested, but dependencies are not available')
1111 conf.set10('ENABLE_IMPORTD', have)
1113 want_remote = get_option('remote')
1114 if want_remote != 'false'
1115 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1116 conf.get('HAVE_LIBCURL') == 1]
1117 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1118 # it's possible to build one without the other. Complain only if
1119 # support was explictly requested. The auxiliary files like sysusers
1120 # config should be installed when any of the programs are built.
1121 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1122 error('remote support was requested, but dependencies are not available')
1124 have = have_deps[0] or have_deps[1]
1128 conf.set10('ENABLE_REMOTE', have)
1130 foreach term : ['utmp',
1161 have = get_option(term)
1162 name = 'ENABLE_' + term.underscorify().to_upper()
1163 conf.set10(name, have)
1164 m4_defines += have ? ['-D' + name] : []
1167 want_tests = get_option('tests')
1168 install_tests = get_option('install-tests')
1171 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1173 #####################################################################
1175 if get_option('efi')
1176 efi_arch = host_machine.cpu_family()
1178 if efi_arch == 'x86'
1179 EFI_MACHINE_TYPE_NAME = 'ia32'
1180 gnu_efi_arch = 'ia32'
1181 elif efi_arch == 'x86_64'
1182 EFI_MACHINE_TYPE_NAME = 'x64'
1183 gnu_efi_arch = 'x86_64'
1184 elif efi_arch == 'arm'
1185 EFI_MACHINE_TYPE_NAME = 'arm'
1186 gnu_efi_arch = 'arm'
1187 elif efi_arch == 'aarch64'
1188 EFI_MACHINE_TYPE_NAME = 'aa64'
1189 gnu_efi_arch = 'aarch64'
1191 EFI_MACHINE_TYPE_NAME = ''
1196 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1198 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1202 conf.set10('ENABLE_EFI', have)
1204 #####################################################################
1206 config_h = configure_file(
1207 output : 'config.h',
1208 configuration : conf)
1210 includes = include_directories('src/basic',
1220 'src/libsystemd/sd-bus',
1221 'src/libsystemd/sd-device',
1222 'src/libsystemd/sd-hwdb',
1223 'src/libsystemd/sd-id128',
1224 'src/libsystemd/sd-netlink',
1225 'src/libsystemd/sd-network',
1226 'src/libsystemd-network',
1230 add_project_arguments('-include', 'config.h', language : 'c')
1232 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1233 'src/shared/gcrypt-util.c')
1237 subdir('src/systemd')
1239 subdir('src/libsystemd')
1240 subdir('src/libsystemd-network')
1241 subdir('src/journal')
1244 libjournal_core = static_library(
1246 libjournal_core_sources,
1248 include_directories : includes,
1251 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1252 libsystemd = shared_library(
1254 libsystemd_internal_sources,
1255 journal_internal_sources,
1256 version : libsystemd_version,
1257 include_directories : includes,
1258 link_args : ['-shared',
1259 '-Wl,--version-script=' + libsystemd_sym_path],
1260 link_with : [libbasic],
1261 dependencies : [threads,
1266 link_depends : libsystemd_sym,
1268 install_dir : rootlibdir)
1270 ############################################################
1272 # binaries that have --help and are intended for use by humans,
1273 # usually, but not always, installed in /bin.
1274 public_programs = []
1276 subdir('src/libudev')
1277 subdir('src/shared')
1280 subdir('src/network')
1282 subdir('src/analyze')
1283 subdir('src/journal-remote')
1284 subdir('src/coredump')
1285 subdir('src/hostname')
1286 subdir('src/import')
1287 subdir('src/kernel-install')
1288 subdir('src/locale')
1289 subdir('src/machine')
1290 subdir('src/nspawn')
1291 subdir('src/resolve')
1292 subdir('src/timedate')
1293 subdir('src/timesync')
1294 subdir('src/vconsole')
1295 subdir('src/sulogin-shell')
1296 subdir('src/boot/efi')
1302 ############################################################
1304 # only static linking apart from libdl, to make sure that the
1305 # module is linked to all libraries that it uses.
1306 test_dlopen = executable(
1309 include_directories : includes,
1310 link_with : [libbasic],
1311 dependencies : [libdl])
1313 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1314 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1315 ['mymachines', 'ENABLE_MACHINED'],
1316 ['resolve', 'ENABLE_RESOLVE']]
1318 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1322 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1323 version_script_arg = join_paths(meson.current_source_dir(), sym)
1325 nss = shared_library(
1327 'src/nss-@0@/nss-@0@.c'.format(module),
1329 include_directories : includes,
1330 link_args : ['-shared',
1331 '-Wl,--version-script=' + version_script_arg,
1333 link_with : [libsystemd_internal,
1335 dependencies : [threads,
1339 install_dir : rootlibdir)
1341 # We cannot use shared_module because it does not support version suffix.
1342 # Unfortunately shared_library insists on creating the symlink…
1343 meson.add_install_script('sh', '-c',
1344 'rm $DESTDIR@0@/libnss_@1@.so'
1345 .format(rootlibdir, module))
1347 test('dlopen-nss_' + module,
1349 args : [nss.full_path()]) # path to dlopen must include a slash
1353 ############################################################
1355 executable('systemd',
1357 include_directories : includes,
1358 link_with : [libcore,
1360 dependencies : [threads,
1366 install_rpath : rootlibexecdir,
1368 install_dir : rootlibexecdir)
1370 exe = executable('systemd-analyze',
1371 systemd_analyze_sources,
1372 include_directories : includes,
1373 link_with : [libcore,
1375 dependencies : [threads,
1381 install_rpath : rootlibexecdir,
1383 public_programs += [exe]
1385 executable('systemd-journald',
1386 systemd_journald_sources,
1387 include_directories : includes,
1388 link_with : [libjournal_core,
1390 dependencies : [threads,
1394 install_rpath : rootlibexecdir,
1396 install_dir : rootlibexecdir)
1398 exe = executable('systemd-cat',
1399 systemd_cat_sources,
1400 include_directories : includes,
1401 link_with : [libjournal_core,
1403 dependencies : [threads],
1404 install_rpath : rootlibexecdir,
1406 public_programs += [exe]
1408 exe = executable('journalctl',
1410 include_directories : includes,
1411 link_with : [libshared],
1412 dependencies : [threads,
1416 install_rpath : rootlibexecdir,
1418 install_dir : rootbindir)
1419 public_programs += [exe]
1421 executable('systemd-getty-generator',
1422 'src/getty-generator/getty-generator.c',
1423 include_directories : includes,
1424 link_with : [libshared],
1425 install_rpath : rootlibexecdir,
1427 install_dir : systemgeneratordir)
1429 executable('systemd-debug-generator',
1430 'src/debug-generator/debug-generator.c',
1431 include_directories : includes,
1432 link_with : [libshared],
1433 install_rpath : rootlibexecdir,
1435 install_dir : systemgeneratordir)
1437 executable('systemd-fstab-generator',
1438 'src/fstab-generator/fstab-generator.c',
1439 'src/core/mount-setup.c',
1440 include_directories : includes,
1441 link_with : [libshared],
1442 install_rpath : rootlibexecdir,
1444 install_dir : systemgeneratordir)
1446 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1447 executable('30-systemd-environment-d-generator',
1448 'src/environment-d-generator/environment-d-generator.c',
1449 include_directories : includes,
1450 link_with : [libshared],
1451 install_rpath : rootlibexecdir,
1453 install_dir : userenvgeneratordir)
1455 meson.add_install_script(meson_make_symlink,
1456 join_paths(sysconfdir, 'environment'),
1457 join_paths(environmentdir, '99-environment.conf'))
1460 if conf.get('ENABLE_HIBERNATE') == 1
1461 executable('systemd-hibernate-resume-generator',
1462 'src/hibernate-resume/hibernate-resume-generator.c',
1463 include_directories : includes,
1464 link_with : [libshared],
1465 install_rpath : rootlibexecdir,
1467 install_dir : systemgeneratordir)
1469 executable('systemd-hibernate-resume',
1470 'src/hibernate-resume/hibernate-resume.c',
1471 include_directories : includes,
1472 link_with : [libshared],
1473 install_rpath : rootlibexecdir,
1475 install_dir : rootlibexecdir)
1478 if conf.get('HAVE_BLKID') == 1
1479 executable('systemd-gpt-auto-generator',
1480 'src/gpt-auto-generator/gpt-auto-generator.c',
1481 'src/basic/blkid-util.h',
1482 include_directories : includes,
1483 link_with : [libshared],
1484 dependencies : libblkid,
1485 install_rpath : rootlibexecdir,
1487 install_dir : systemgeneratordir)
1489 exe = executable('systemd-dissect',
1490 'src/dissect/dissect.c',
1491 include_directories : includes,
1492 link_with : [libshared],
1493 install_rpath : rootlibexecdir,
1495 install_dir : rootlibexecdir)
1496 public_programs += [exe]
1499 if conf.get('ENABLE_RESOLVE') == 1
1500 executable('systemd-resolved',
1501 systemd_resolved_sources,
1502 gcrypt_util_sources,
1503 include_directories : includes,
1504 link_with : [libshared],
1505 dependencies : [threads,
1510 install_rpath : rootlibexecdir,
1512 install_dir : rootlibexecdir)
1514 exe = executable('systemd-resolve',
1515 systemd_resolve_sources,
1516 gcrypt_util_sources,
1517 include_directories : includes,
1518 link_with : [libshared],
1519 dependencies : [threads,
1524 install_rpath : rootlibexecdir,
1526 public_programs += [exe]
1529 if conf.get('ENABLE_LOGIND') == 1
1530 executable('systemd-logind',
1531 systemd_logind_sources,
1532 include_directories : includes,
1533 link_with : [liblogind_core,
1535 dependencies : [threads,
1537 install_rpath : rootlibexecdir,
1539 install_dir : rootlibexecdir)
1541 exe = executable('loginctl',
1543 include_directories : includes,
1544 link_with : [libshared],
1545 dependencies : [threads,
1548 install_rpath : rootlibexecdir,
1550 install_dir : rootbindir)
1551 public_programs += [exe]
1553 exe = executable('systemd-inhibit',
1554 'src/login/inhibit.c',
1555 include_directories : includes,
1556 link_with : [libshared],
1557 install_rpath : rootlibexecdir,
1559 install_dir : rootbindir)
1560 public_programs += [exe]
1562 if conf.get('HAVE_PAM') == 1
1563 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1564 pam_systemd = shared_library(
1568 include_directories : includes,
1569 link_args : ['-shared',
1570 '-Wl,--version-script=' + version_script_arg],
1571 link_with : [libsystemd_internal,
1573 dependencies : [threads,
1576 link_depends : pam_systemd_sym,
1578 install_dir : pamlibdir)
1580 test('dlopen-pam_systemd',
1582 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1586 if conf.get('HAVE_PAM') == 1
1587 executable('systemd-user-sessions',
1588 'src/user-sessions/user-sessions.c',
1589 include_directories : includes,
1590 link_with : [libshared],
1591 install_rpath : rootlibexecdir,
1593 install_dir : rootlibexecdir)
1596 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1597 exe = executable('bootctl',
1598 'src/boot/bootctl.c',
1599 include_directories : includes,
1600 link_with : [libshared],
1601 dependencies : [libblkid],
1602 install_rpath : rootlibexecdir,
1604 public_programs += [exe]
1607 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1608 include_directories : includes,
1609 link_with : [libshared],
1610 dependencies : [threads],
1611 install_rpath : rootlibexecdir,
1613 public_programs += [exe]
1615 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1616 include_directories : includes,
1617 link_with : [libshared],
1618 dependencies : [threads,
1623 install_rpath : rootlibexecdir,
1625 install_dir : rootbindir)
1626 public_programs += [exe]
1628 if conf.get('ENABLE_BACKLIGHT') == 1
1629 executable('systemd-backlight',
1630 'src/backlight/backlight.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 install_rpath : rootlibexecdir,
1635 install_dir : rootlibexecdir)
1638 if conf.get('ENABLE_RFKILL') == 1
1639 executable('systemd-rfkill',
1640 'src/rfkill/rfkill.c',
1641 include_directories : includes,
1642 link_with : [libshared],
1643 install_rpath : rootlibexecdir,
1645 install_dir : rootlibexecdir)
1648 executable('systemd-system-update-generator',
1649 'src/system-update-generator/system-update-generator.c',
1650 include_directories : includes,
1651 link_with : [libshared],
1652 install_rpath : rootlibexecdir,
1654 install_dir : systemgeneratordir)
1656 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1657 executable('systemd-cryptsetup',
1658 'src/cryptsetup/cryptsetup.c',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 dependencies : [libcryptsetup],
1662 install_rpath : rootlibexecdir,
1664 install_dir : rootlibexecdir)
1666 executable('systemd-cryptsetup-generator',
1667 'src/cryptsetup/cryptsetup-generator.c',
1668 include_directories : includes,
1669 link_with : [libshared],
1670 dependencies : [libcryptsetup],
1671 install_rpath : rootlibexecdir,
1673 install_dir : systemgeneratordir)
1675 executable('systemd-veritysetup',
1676 'src/veritysetup/veritysetup.c',
1677 include_directories : includes,
1678 link_with : [libshared],
1679 dependencies : [libcryptsetup],
1680 install_rpath : rootlibexecdir,
1682 install_dir : rootlibexecdir)
1684 executable('systemd-veritysetup-generator',
1685 'src/veritysetup/veritysetup-generator.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 dependencies : [libcryptsetup],
1689 install_rpath : rootlibexecdir,
1691 install_dir : systemgeneratordir)
1694 if conf.get('HAVE_SYSV_COMPAT') == 1
1695 executable('systemd-sysv-generator',
1696 'src/sysv-generator/sysv-generator.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 install_rpath : rootlibexecdir,
1701 install_dir : systemgeneratordir)
1703 executable('systemd-rc-local-generator',
1704 'src/rc-local-generator/rc-local-generator.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 install_rpath : rootlibexecdir,
1709 install_dir : systemgeneratordir)
1712 if conf.get('ENABLE_HOSTNAMED') == 1
1713 executable('systemd-hostnamed',
1714 'src/hostname/hostnamed.c',
1715 include_directories : includes,
1716 link_with : [libshared],
1717 install_rpath : rootlibexecdir,
1719 install_dir : rootlibexecdir)
1721 exe = executable('hostnamectl',
1722 'src/hostname/hostnamectl.c',
1723 include_directories : includes,
1724 link_with : [libshared],
1725 install_rpath : rootlibexecdir,
1727 public_programs += [exe]
1730 if conf.get('ENABLE_LOCALED') == 1
1731 if conf.get('HAVE_XKBCOMMON') == 1
1732 # logind will load libxkbcommon.so dynamically on its own
1738 executable('systemd-localed',
1739 systemd_localed_sources,
1740 include_directories : includes,
1741 link_with : [libshared],
1742 dependencies : deps,
1743 install_rpath : rootlibexecdir,
1745 install_dir : rootlibexecdir)
1747 exe = executable('localectl',
1749 include_directories : includes,
1750 link_with : [libshared],
1751 install_rpath : rootlibexecdir,
1753 public_programs += [exe]
1756 if conf.get('ENABLE_TIMEDATED') == 1
1757 executable('systemd-timedated',
1758 'src/timedate/timedated.c',
1759 include_directories : includes,
1760 link_with : [libshared],
1761 install_rpath : rootlibexecdir,
1763 install_dir : rootlibexecdir)
1765 exe = executable('timedatectl',
1766 'src/timedate/timedatectl.c',
1767 include_directories : includes,
1768 install_rpath : rootlibexecdir,
1769 link_with : [libshared],
1771 public_programs += [exe]
1774 if conf.get('ENABLE_TIMESYNCD') == 1
1775 executable('systemd-timesyncd',
1776 systemd_timesyncd_sources,
1777 include_directories : includes,
1778 link_with : [libshared],
1779 dependencies : [threads,
1781 install_rpath : rootlibexecdir,
1783 install_dir : rootlibexecdir)
1786 if conf.get('ENABLE_MACHINED') == 1
1787 executable('systemd-machined',
1788 systemd_machined_sources,
1789 include_directories : includes,
1790 link_with : [libmachine_core,
1792 install_rpath : rootlibexecdir,
1794 install_dir : rootlibexecdir)
1796 exe = executable('machinectl',
1797 'src/machine/machinectl.c',
1798 include_directories : includes,
1799 link_with : [libshared],
1800 dependencies : [threads,
1803 install_rpath : rootlibexecdir,
1805 install_dir : rootbindir)
1806 public_programs += [exe]
1809 if conf.get('ENABLE_IMPORTD') == 1
1810 executable('systemd-importd',
1811 systemd_importd_sources,
1812 include_directories : includes,
1813 link_with : [libshared],
1814 dependencies : [threads],
1815 install_rpath : rootlibexecdir,
1817 install_dir : rootlibexecdir)
1819 systemd_pull = executable('systemd-pull',
1820 systemd_pull_sources,
1821 include_directories : includes,
1822 link_with : [libshared],
1823 dependencies : [libcurl,
1828 install_rpath : rootlibexecdir,
1830 install_dir : rootlibexecdir)
1832 systemd_import = executable('systemd-import',
1833 systemd_import_sources,
1834 include_directories : includes,
1835 link_with : [libshared],
1836 dependencies : [libcurl,
1840 install_rpath : rootlibexecdir,
1842 install_dir : rootlibexecdir)
1844 systemd_export = executable('systemd-export',
1845 systemd_export_sources,
1846 include_directories : includes,
1847 link_with : [libshared],
1848 dependencies : [libcurl,
1852 install_rpath : rootlibexecdir,
1854 install_dir : rootlibexecdir)
1855 public_programs += [systemd_pull, systemd_import, systemd_export]
1858 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1859 exe = executable('systemd-journal-upload',
1860 systemd_journal_upload_sources,
1861 include_directories : includes,
1862 link_with : [libshared],
1863 dependencies : [threads,
1868 install_rpath : rootlibexecdir,
1870 install_dir : rootlibexecdir)
1871 public_programs += [exe]
1874 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1875 s_j_remote = executable('systemd-journal-remote',
1876 systemd_journal_remote_sources,
1877 include_directories : includes,
1878 link_with : [libshared],
1879 dependencies : [threads,
1884 install_rpath : rootlibexecdir,
1886 install_dir : rootlibexecdir)
1888 s_j_gatewayd = executable('systemd-journal-gatewayd',
1889 systemd_journal_gatewayd_sources,
1890 include_directories : includes,
1891 link_with : [libshared],
1892 dependencies : [threads,
1897 install_rpath : rootlibexecdir,
1899 install_dir : rootlibexecdir)
1900 public_programs += [s_j_remote, s_j_gatewayd]
1903 if conf.get('ENABLE_COREDUMP') == 1
1904 executable('systemd-coredump',
1905 systemd_coredump_sources,
1906 include_directories : includes,
1907 link_with : [libshared],
1908 dependencies : [threads,
1913 install_rpath : rootlibexecdir,
1915 install_dir : rootlibexecdir)
1917 exe = executable('coredumpctl',
1918 coredumpctl_sources,
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [threads,
1924 install_rpath : rootlibexecdir,
1926 public_programs += [exe]
1929 if conf.get('ENABLE_BINFMT') == 1
1930 exe = executable('systemd-binfmt',
1931 'src/binfmt/binfmt.c',
1932 include_directories : includes,
1933 link_with : [libshared],
1934 install_rpath : rootlibexecdir,
1936 install_dir : rootlibexecdir)
1937 public_programs += [exe]
1939 meson.add_install_script('sh', '-c',
1940 mkdir_p.format(binfmtdir))
1941 meson.add_install_script('sh', '-c',
1942 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1945 if conf.get('ENABLE_VCONSOLE') == 1
1946 executable('systemd-vconsole-setup',
1947 'src/vconsole/vconsole-setup.c',
1948 include_directories : includes,
1949 link_with : [libshared],
1950 install_rpath : rootlibexecdir,
1952 install_dir : rootlibexecdir)
1955 if conf.get('ENABLE_RANDOMSEED') == 1
1956 executable('systemd-random-seed',
1957 'src/random-seed/random-seed.c',
1958 include_directories : includes,
1959 link_with : [libshared],
1960 install_rpath : rootlibexecdir,
1962 install_dir : rootlibexecdir)
1965 if conf.get('ENABLE_FIRSTBOOT') == 1
1966 executable('systemd-firstboot',
1967 'src/firstboot/firstboot.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 dependencies : [libcrypt],
1971 install_rpath : rootlibexecdir,
1973 install_dir : rootbindir)
1976 executable('systemd-remount-fs',
1977 'src/remount-fs/remount-fs.c',
1978 'src/core/mount-setup.c',
1979 'src/core/mount-setup.h',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 install_rpath : rootlibexecdir,
1984 install_dir : rootlibexecdir)
1986 executable('systemd-machine-id-setup',
1987 'src/machine-id-setup/machine-id-setup-main.c',
1988 'src/core/machine-id-setup.c',
1989 'src/core/machine-id-setup.h',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootbindir)
1996 executable('systemd-fsck',
1998 include_directories : includes,
1999 link_with : [libshared],
2000 install_rpath : rootlibexecdir,
2002 install_dir : rootlibexecdir)
2004 executable('systemd-growfs',
2005 'src/partition/growfs.c',
2006 include_directories : includes,
2007 link_with : [libshared],
2008 dependencies : [libcryptsetup],
2009 install_rpath : rootlibexecdir,
2011 install_dir : rootlibexecdir)
2013 executable('systemd-makefs',
2014 'src/partition/makefs.c',
2015 include_directories : includes,
2016 link_with : [libshared],
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2021 executable('systemd-sleep',
2022 'src/sleep/sleep.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 install_rpath : rootlibexecdir,
2027 install_dir : rootlibexecdir)
2029 exe = executable('systemd-sysctl',
2030 'src/sysctl/sysctl.c',
2031 include_directories : includes,
2032 link_with : [libshared],
2033 install_rpath : rootlibexecdir,
2035 install_dir : rootlibexecdir)
2036 public_programs += [exe]
2038 executable('systemd-ac-power',
2039 'src/ac-power/ac-power.c',
2040 include_directories : includes,
2041 link_with : [libshared],
2042 install_rpath : rootlibexecdir,
2044 install_dir : rootlibexecdir)
2046 exe = executable('systemd-detect-virt',
2047 'src/detect-virt/detect-virt.c',
2048 include_directories : includes,
2049 link_with : [libshared],
2050 install_rpath : rootlibexecdir,
2052 public_programs += [exe]
2054 exe = executable('systemd-delta',
2055 'src/delta/delta.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2060 public_programs += [exe]
2062 exe = executable('systemd-escape',
2063 'src/escape/escape.c',
2064 include_directories : includes,
2065 link_with : [libshared],
2066 install_rpath : rootlibexecdir,
2068 install_dir : rootbindir)
2069 public_programs += [exe]
2071 exe = executable('systemd-notify',
2072 'src/notify/notify.c',
2073 include_directories : includes,
2074 link_with : [libshared],
2075 install_rpath : rootlibexecdir,
2077 install_dir : rootbindir)
2078 public_programs += [exe]
2080 executable('systemd-volatile-root',
2081 'src/volatile-root/volatile-root.c',
2082 include_directories : includes,
2083 link_with : [libshared],
2084 install_rpath : rootlibexecdir,
2086 install_dir : rootlibexecdir)
2088 executable('systemd-cgroups-agent',
2089 'src/cgroups-agent/cgroups-agent.c',
2090 include_directories : includes,
2091 link_with : [libshared],
2092 install_rpath : rootlibexecdir,
2094 install_dir : rootlibexecdir)
2096 exe = executable('systemd-path',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2102 public_programs += [exe]
2104 exe = executable('systemd-ask-password',
2105 'src/ask-password/ask-password.c',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 install_rpath : rootlibexecdir,
2110 install_dir : rootbindir)
2111 public_programs += [exe]
2113 executable('systemd-reply-password',
2114 'src/reply-password/reply-password.c',
2115 include_directories : includes,
2116 link_with : [libshared],
2117 install_rpath : rootlibexecdir,
2119 install_dir : rootlibexecdir)
2121 exe = executable('systemd-tty-ask-password-agent',
2122 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2123 include_directories : includes,
2124 link_with : [libshared],
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootbindir)
2128 public_programs += [exe]
2130 exe = executable('systemd-cgls',
2132 include_directories : includes,
2133 link_with : [libshared],
2134 install_rpath : rootlibexecdir,
2136 public_programs += [exe]
2138 exe = executable('systemd-cgtop',
2139 'src/cgtop/cgtop.c',
2140 include_directories : includes,
2141 link_with : [libshared],
2142 install_rpath : rootlibexecdir,
2144 public_programs += [exe]
2146 executable('systemd-initctl',
2147 'src/initctl/initctl.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2154 exe = executable('systemd-mount',
2155 'src/mount/mount-tool.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2160 public_programs += [exe]
2162 meson.add_install_script(meson_make_symlink,
2163 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2165 exe = executable('systemd-run',
2167 include_directories : includes,
2168 link_with : [libshared],
2169 install_rpath : rootlibexecdir,
2171 public_programs += [exe]
2173 exe = executable('systemd-stdio-bridge',
2174 'src/stdio-bridge/stdio-bridge.c',
2175 include_directories : includes,
2176 link_with : [libshared],
2177 install_rpath : rootlibexecdir,
2179 public_programs += [exe]
2181 exe = executable('busctl',
2182 'src/busctl/busctl.c',
2183 'src/busctl/busctl-introspect.c',
2184 'src/busctl/busctl-introspect.h',
2185 include_directories : includes,
2186 link_with : [libshared],
2187 install_rpath : rootlibexecdir,
2189 public_programs += [exe]
2191 if conf.get('ENABLE_SYSUSERS') == 1
2192 exe = executable('systemd-sysusers',
2193 'src/sysusers/sysusers.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 install_rpath : rootlibexecdir,
2198 install_dir : rootbindir)
2199 public_programs += [exe]
2202 if conf.get('ENABLE_TMPFILES') == 1
2203 exe = executable('systemd-tmpfiles',
2204 'src/tmpfiles/tmpfiles.c',
2205 include_directories : includes,
2206 link_with : [libshared],
2207 dependencies : [libacl],
2208 install_rpath : rootlibexecdir,
2210 install_dir : rootbindir)
2211 public_programs += [exe]
2213 test('test-systemd-tmpfiles',
2214 test_systemd_tmpfiles_py,
2215 args : exe.full_path())
2216 # https://github.com/mesonbuild/meson/issues/2681
2219 if conf.get('ENABLE_HWDB') == 1
2220 exe = executable('systemd-hwdb',
2222 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2223 include_directories : includes,
2224 link_with : [libudev_internal],
2225 install_rpath : udev_rpath,
2227 install_dir : rootbindir)
2228 public_programs += [exe]
2231 if conf.get('ENABLE_QUOTACHECK') == 1
2232 executable('systemd-quotacheck',
2233 'src/quotacheck/quotacheck.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 install_rpath : rootlibexecdir,
2238 install_dir : rootlibexecdir)
2241 exe = executable('systemd-socket-proxyd',
2242 'src/socket-proxy/socket-proxyd.c',
2243 include_directories : includes,
2244 link_with : [libshared],
2245 dependencies : [threads],
2246 install_rpath : rootlibexecdir,
2248 install_dir : rootlibexecdir)
2249 public_programs += [exe]
2251 exe = executable('systemd-udevd',
2252 systemd_udevd_sources,
2253 include_directories : includes,
2254 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2255 link_with : [libudev_core,
2258 dependencies : [threads,
2263 install_rpath : udev_rpath,
2265 install_dir : rootlibexecdir)
2266 public_programs += [exe]
2268 exe = executable('udevadm',
2270 include_directories : includes,
2271 link_with : [libudev_core,
2274 dependencies : [threads,
2279 install_rpath : udev_rpath,
2281 install_dir : rootbindir)
2282 public_programs += [exe]
2284 executable('systemd-shutdown',
2285 systemd_shutdown_sources,
2286 include_directories : includes,
2287 link_with : [libshared],
2288 install_rpath : rootlibexecdir,
2290 install_dir : rootlibexecdir)
2292 executable('systemd-update-done',
2293 'src/update-done/update-done.c',
2294 include_directories : includes,
2295 link_with : [libshared],
2296 install_rpath : rootlibexecdir,
2298 install_dir : rootlibexecdir)
2300 executable('systemd-update-utmp',
2301 'src/update-utmp/update-utmp.c',
2302 include_directories : includes,
2303 link_with : [libshared],
2304 dependencies : [libaudit],
2305 install_rpath : rootlibexecdir,
2307 install_dir : rootlibexecdir)
2309 if conf.get('HAVE_KMOD') == 1
2310 executable('systemd-modules-load',
2311 'src/modules-load/modules-load.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 dependencies : [libkmod],
2315 install_rpath : rootlibexecdir,
2317 install_dir : rootlibexecdir)
2319 meson.add_install_script('sh', '-c',
2320 mkdir_p.format(modulesloaddir))
2321 meson.add_install_script('sh', '-c',
2322 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2325 exe = executable('systemd-nspawn',
2326 systemd_nspawn_sources,
2327 'src/core/mount-setup.c', # FIXME: use a variable?
2328 'src/core/mount-setup.h',
2329 'src/core/loopback-setup.c',
2330 'src/core/loopback-setup.h',
2331 include_directories : [includes, include_directories('src/nspawn')],
2332 link_with : [libshared],
2333 dependencies : [libacl,
2337 install_rpath : rootlibexecdir,
2339 public_programs += [exe]
2341 if conf.get('ENABLE_NETWORKD') == 1
2342 executable('systemd-networkd',
2343 systemd_networkd_sources,
2344 include_directories : includes,
2345 link_with : [libnetworkd_core,
2349 dependencies : [threads],
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2354 executable('systemd-networkd-wait-online',
2355 systemd_networkd_wait_online_sources,
2356 include_directories : includes,
2357 link_with : [libnetworkd_core,
2359 install_rpath : rootlibexecdir,
2361 install_dir : rootlibexecdir)
2363 exe = executable('networkctl',
2365 include_directories : includes,
2366 link_with : [libsystemd_network,
2368 install_rpath : rootlibexecdir,
2370 install_dir : rootbindir)
2371 public_programs += [exe]
2373 ############################################################
2375 foreach tuple : tests
2377 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2378 dependencies = tuple[2]
2379 condition = tuple.length() >= 4 ? tuple[3] : ''
2380 type = tuple.length() >= 5 ? tuple[4] : ''
2381 defs = tuple.length() >= 6 ? tuple[5] : []
2382 incs = tuple.length() >= 7 ? tuple[6] : includes
2385 name = sources[0].split('/')[-1].split('.')[0]
2386 if type.startswith('timeout=')
2387 timeout = type.split('=')[1].to_int()
2391 if condition == '' or conf.get(condition) == 1
2395 include_directories : incs,
2396 link_with : link_with,
2397 dependencies : dependencies,
2399 install_rpath : rootlibexecdir,
2400 install : install_tests,
2401 install_dir : join_paths(testsdir, type))
2404 message('@0@ is a manual test'.format(name))
2405 elif type == 'unsafe' and want_tests != 'unsafe'
2406 message('@0@ is an unsafe test'.format(name))
2413 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2417 test_libsystemd_sym = executable(
2418 'test-libsystemd-sym',
2419 test_libsystemd_sym_c,
2420 include_directories : includes,
2421 link_with : [libsystemd],
2422 install : install_tests,
2423 install_dir : testsdir)
2424 test('test-libsystemd-sym',
2425 test_libsystemd_sym)
2427 test_libudev_sym = executable(
2430 include_directories : includes,
2431 c_args : ['-Wno-deprecated-declarations'],
2432 link_with : [libudev],
2433 install : install_tests,
2434 install_dir : testsdir)
2435 test('test-libudev-sym',
2438 ############################################################
2440 make_directive_index_py = find_program('tools/make-directive-index.py')
2441 make_man_index_py = find_program('tools/make-man-index.py')
2442 xml_helper_py = find_program('tools/xml_helper.py')
2443 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2447 subdir('sysusers.d')
2448 subdir('tmpfiles.d')
2453 subdir('shell-completion/bash')
2454 subdir('shell-completion/zsh')
2455 subdir('docs/sysvinit')
2456 subdir('docs/var-log')
2458 # FIXME: figure out if the warning is true:
2459 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2460 install_subdir('factory/etc',
2461 install_dir : factorydir)
2464 install_data('xorg/50-systemd-user.sh',
2465 install_dir : xinitrcdir)
2466 install_data('modprobe.d/systemd.conf',
2467 install_dir : modprobedir)
2468 install_data('README',
2475 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2476 install_dir : docdir)
2478 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2479 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2481 ############################################################
2483 meson_check_help = find_program('tools/meson-check-help.sh')
2485 foreach exec : public_programs
2486 name = exec.full_path().split('/')[-1]
2487 test('check-help-' + name,
2489 args : [exec.full_path()])
2492 ############################################################
2495 all_files = run_command(
2497 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2500 all_files = files(all_files.stdout().split())
2505 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2509 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2513 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2516 command : [meson_git_contrib_sh])
2520 git_head = run_command(
2522 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2523 'rev-parse', 'HEAD']).stdout().strip()
2524 git_head_short = run_command(
2526 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2527 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2531 command : ['git', 'archive',
2532 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2534 '--prefix', 'systemd-@0@/'.format(git_head),
2538 ############################################################
2541 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2543 'prefix directory: @0@'.format(prefixdir),
2544 'rootprefix directory: @0@'.format(rootprefixdir),
2545 'sysconf directory: @0@'.format(sysconfdir),
2546 'include directory: @0@'.format(includedir),
2547 'lib directory: @0@'.format(libdir),
2548 'rootlib directory: @0@'.format(rootlibdir),
2549 'SysV init scripts: @0@'.format(sysvinit_path),
2550 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2551 'PAM modules directory: @0@'.format(pamlibdir),
2552 'PAM configuration directory: @0@'.format(pamconfdir),
2553 'RPM macros directory: @0@'.format(rpmmacrosdir),
2554 'modprobe.d directory: @0@'.format(modprobedir),
2555 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2556 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2557 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2558 'bash completions directory: @0@'.format(bashcompletiondir),
2559 'zsh completions directory: @0@'.format(zshcompletiondir),
2560 'extra start script: @0@'.format(get_option('rc-local')),
2561 'extra stop script: @0@'.format(get_option('halt-local')),
2562 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2563 get_option('debug-tty')),
2564 'TTY GID: @0@'.format(tty_gid),
2565 'users GID: @0@'.format(users_gid),
2566 'maximum system UID: @0@'.format(system_uid_max),
2567 'maximum system GID: @0@'.format(system_gid_max),
2568 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2569 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2570 'minimum container UID base: @0@'.format(container_uid_base_min),
2571 'maximum container UID base: @0@'.format(container_uid_base_max),
2572 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2573 'render group access mode: @0@'.format(get_option('group-render-mode')),
2574 'certificate root directory: @0@'.format(get_option('certificate-root')),
2575 'support URL: @0@'.format(support_url),
2576 'nobody user name: @0@'.format(nobody_user),
2577 'nobody group name: @0@'.format(nobody_group),
2578 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2579 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2581 'default DNSSEC mode: @0@'.format(default_dnssec),
2582 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2583 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2585 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2586 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2588 'default DNS servers: @0@'.format(alt_dns_servers),
2589 'default NTP servers: @0@'.format(alt_ntp_servers)]
2591 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2592 '@@0@'.format(time_epoch)).stdout().strip()
2594 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2597 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2598 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2599 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2601 if conf.get('ENABLE_EFI') == 1
2603 'efi arch: @0@'.format(efi_arch)]
2607 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2608 'EFI CC @0@'.format(efi_cc),
2609 'EFI lib directory: @0@'.format(efi_libdir),
2610 'EFI lds directory: @0@'.format(efi_ldsdir),
2611 'EFI include directory: @0@'.format(efi_incdir)]
2664 ['legacy pkla', install_polkit_pkla],
2666 ['gnu-efi', have_gnu_efi],
2672 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2675 ['man pages', want_man],
2676 ['html pages', want_html],
2677 ['man page indices', want_man and have_lxml],
2678 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2683 ['adm group', get_option('adm-group')],
2684 ['wheel group', get_option('wheel-group')],
2687 ['debug mmap cache'],
2690 cond = tuple.get(1, '')
2692 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2693 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2694 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2699 missing += [tuple[0]]
2705 'enabled features: @0@'.format(', '.join(found)),
2707 'disabled features: @0@'.format(', '.join(missing)),
2709 message('\n '.join(status))
2711 if rootprefixdir != rootprefix_default
2712 message('WARNING:\n' +
2713 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2714 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2715 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))