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/boot/efi')
1301 ############################################################
1303 # only static linking apart from libdl, to make sure that the
1304 # module is linked to all libraries that it uses.
1305 test_dlopen = executable(
1308 include_directories : includes,
1309 link_with : [libbasic],
1310 dependencies : [libdl])
1312 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1313 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1314 ['mymachines', 'ENABLE_MACHINED'],
1315 ['resolve', 'ENABLE_RESOLVE']]
1317 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1321 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1322 version_script_arg = join_paths(meson.current_source_dir(), sym)
1324 nss = shared_library(
1326 'src/nss-@0@/nss-@0@.c'.format(module),
1328 include_directories : includes,
1329 link_args : ['-shared',
1330 '-Wl,--version-script=' + version_script_arg,
1332 link_with : [libsystemd_internal,
1334 dependencies : [threads,
1338 install_dir : rootlibdir)
1340 # We cannot use shared_module because it does not support version suffix.
1341 # Unfortunately shared_library insists on creating the symlink…
1342 meson.add_install_script('sh', '-c',
1343 'rm $DESTDIR@0@/libnss_@1@.so'
1344 .format(rootlibdir, module))
1346 test('dlopen-nss_' + module,
1348 args : [nss.full_path()]) # path to dlopen must include a slash
1352 ############################################################
1354 executable('systemd',
1356 include_directories : includes,
1357 link_with : [libcore,
1359 dependencies : [threads,
1365 install_rpath : rootlibexecdir,
1367 install_dir : rootlibexecdir)
1369 exe = executable('systemd-analyze',
1370 systemd_analyze_sources,
1371 include_directories : includes,
1372 link_with : [libcore,
1374 dependencies : [threads,
1380 install_rpath : rootlibexecdir,
1382 public_programs += [exe]
1384 executable('systemd-journald',
1385 systemd_journald_sources,
1386 include_directories : includes,
1387 link_with : [libjournal_core,
1389 dependencies : [threads,
1393 install_rpath : rootlibexecdir,
1395 install_dir : rootlibexecdir)
1397 exe = executable('systemd-cat',
1398 systemd_cat_sources,
1399 include_directories : includes,
1400 link_with : [libjournal_core,
1402 dependencies : [threads],
1403 install_rpath : rootlibexecdir,
1405 public_programs += [exe]
1407 exe = executable('journalctl',
1409 include_directories : includes,
1410 link_with : [libshared],
1411 dependencies : [threads,
1415 install_rpath : rootlibexecdir,
1417 install_dir : rootbindir)
1418 public_programs += [exe]
1420 executable('systemd-getty-generator',
1421 'src/getty-generator/getty-generator.c',
1422 include_directories : includes,
1423 link_with : [libshared],
1424 install_rpath : rootlibexecdir,
1426 install_dir : systemgeneratordir)
1428 executable('systemd-debug-generator',
1429 'src/debug-generator/debug-generator.c',
1430 include_directories : includes,
1431 link_with : [libshared],
1432 install_rpath : rootlibexecdir,
1434 install_dir : systemgeneratordir)
1436 executable('systemd-fstab-generator',
1437 'src/fstab-generator/fstab-generator.c',
1438 'src/core/mount-setup.c',
1439 include_directories : includes,
1440 link_with : [libshared],
1441 install_rpath : rootlibexecdir,
1443 install_dir : systemgeneratordir)
1445 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1446 executable('30-systemd-environment-d-generator',
1447 'src/environment-d-generator/environment-d-generator.c',
1448 include_directories : includes,
1449 link_with : [libshared],
1450 install_rpath : rootlibexecdir,
1452 install_dir : userenvgeneratordir)
1454 meson.add_install_script(meson_make_symlink,
1455 join_paths(sysconfdir, 'environment'),
1456 join_paths(environmentdir, '99-environment.conf'))
1459 if conf.get('ENABLE_HIBERNATE') == 1
1460 executable('systemd-hibernate-resume-generator',
1461 'src/hibernate-resume/hibernate-resume-generator.c',
1462 include_directories : includes,
1463 link_with : [libshared],
1464 install_rpath : rootlibexecdir,
1466 install_dir : systemgeneratordir)
1468 executable('systemd-hibernate-resume',
1469 'src/hibernate-resume/hibernate-resume.c',
1470 include_directories : includes,
1471 link_with : [libshared],
1472 install_rpath : rootlibexecdir,
1474 install_dir : rootlibexecdir)
1477 if conf.get('HAVE_BLKID') == 1
1478 executable('systemd-gpt-auto-generator',
1479 'src/gpt-auto-generator/gpt-auto-generator.c',
1480 'src/basic/blkid-util.h',
1481 include_directories : includes,
1482 link_with : [libshared],
1483 dependencies : libblkid,
1484 install_rpath : rootlibexecdir,
1486 install_dir : systemgeneratordir)
1488 exe = executable('systemd-dissect',
1489 'src/dissect/dissect.c',
1490 include_directories : includes,
1491 link_with : [libshared],
1492 install_rpath : rootlibexecdir,
1494 install_dir : rootlibexecdir)
1495 public_programs += [exe]
1498 if conf.get('ENABLE_RESOLVE') == 1
1499 executable('systemd-resolved',
1500 systemd_resolved_sources,
1501 gcrypt_util_sources,
1502 include_directories : includes,
1503 link_with : [libshared],
1504 dependencies : [threads,
1509 install_rpath : rootlibexecdir,
1511 install_dir : rootlibexecdir)
1513 exe = executable('systemd-resolve',
1514 systemd_resolve_sources,
1515 gcrypt_util_sources,
1516 include_directories : includes,
1517 link_with : [libshared],
1518 dependencies : [threads,
1523 install_rpath : rootlibexecdir,
1525 public_programs += [exe]
1528 if conf.get('ENABLE_LOGIND') == 1
1529 executable('systemd-logind',
1530 systemd_logind_sources,
1531 include_directories : includes,
1532 link_with : [liblogind_core,
1534 dependencies : [threads,
1536 install_rpath : rootlibexecdir,
1538 install_dir : rootlibexecdir)
1540 exe = executable('loginctl',
1542 include_directories : includes,
1543 link_with : [libshared],
1544 dependencies : [threads,
1547 install_rpath : rootlibexecdir,
1549 install_dir : rootbindir)
1550 public_programs += [exe]
1552 exe = executable('systemd-inhibit',
1553 'src/login/inhibit.c',
1554 include_directories : includes,
1555 link_with : [libshared],
1556 install_rpath : rootlibexecdir,
1558 install_dir : rootbindir)
1559 public_programs += [exe]
1561 if conf.get('HAVE_PAM') == 1
1562 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1563 pam_systemd = shared_library(
1567 include_directories : includes,
1568 link_args : ['-shared',
1569 '-Wl,--version-script=' + version_script_arg],
1570 link_with : [libsystemd_internal,
1572 dependencies : [threads,
1575 link_depends : pam_systemd_sym,
1577 install_dir : pamlibdir)
1579 test('dlopen-pam_systemd',
1581 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1585 if conf.get('HAVE_PAM') == 1
1586 executable('systemd-user-sessions',
1587 'src/user-sessions/user-sessions.c',
1588 include_directories : includes,
1589 link_with : [libshared],
1590 install_rpath : rootlibexecdir,
1592 install_dir : rootlibexecdir)
1595 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1596 exe = executable('bootctl',
1597 'src/boot/bootctl.c',
1598 include_directories : includes,
1599 link_with : [libshared],
1600 dependencies : [libblkid],
1601 install_rpath : rootlibexecdir,
1603 public_programs += [exe]
1606 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1607 include_directories : includes,
1608 link_with : [libshared],
1609 dependencies : [threads],
1610 install_rpath : rootlibexecdir,
1612 public_programs += [exe]
1614 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1615 include_directories : includes,
1616 link_with : [libshared],
1617 dependencies : [threads,
1622 install_rpath : rootlibexecdir,
1624 install_dir : rootbindir)
1625 public_programs += [exe]
1627 if conf.get('ENABLE_BACKLIGHT') == 1
1628 executable('systemd-backlight',
1629 'src/backlight/backlight.c',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 install_rpath : rootlibexecdir,
1634 install_dir : rootlibexecdir)
1637 if conf.get('ENABLE_RFKILL') == 1
1638 executable('systemd-rfkill',
1639 'src/rfkill/rfkill.c',
1640 include_directories : includes,
1641 link_with : [libshared],
1642 install_rpath : rootlibexecdir,
1644 install_dir : rootlibexecdir)
1647 executable('systemd-system-update-generator',
1648 'src/system-update-generator/system-update-generator.c',
1649 include_directories : includes,
1650 link_with : [libshared],
1651 install_rpath : rootlibexecdir,
1653 install_dir : systemgeneratordir)
1655 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1656 executable('systemd-cryptsetup',
1657 'src/cryptsetup/cryptsetup.c',
1658 include_directories : includes,
1659 link_with : [libshared],
1660 dependencies : [libcryptsetup],
1661 install_rpath : rootlibexecdir,
1663 install_dir : rootlibexecdir)
1665 executable('systemd-cryptsetup-generator',
1666 'src/cryptsetup/cryptsetup-generator.c',
1667 include_directories : includes,
1668 link_with : [libshared],
1669 dependencies : [libcryptsetup],
1670 install_rpath : rootlibexecdir,
1672 install_dir : systemgeneratordir)
1674 executable('systemd-veritysetup',
1675 'src/veritysetup/veritysetup.c',
1676 include_directories : includes,
1677 link_with : [libshared],
1678 dependencies : [libcryptsetup],
1679 install_rpath : rootlibexecdir,
1681 install_dir : rootlibexecdir)
1683 executable('systemd-veritysetup-generator',
1684 'src/veritysetup/veritysetup-generator.c',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 dependencies : [libcryptsetup],
1688 install_rpath : rootlibexecdir,
1690 install_dir : systemgeneratordir)
1693 if conf.get('HAVE_SYSV_COMPAT') == 1
1694 executable('systemd-sysv-generator',
1695 'src/sysv-generator/sysv-generator.c',
1696 include_directories : includes,
1697 link_with : [libshared],
1698 install_rpath : rootlibexecdir,
1700 install_dir : systemgeneratordir)
1702 executable('systemd-rc-local-generator',
1703 'src/rc-local-generator/rc-local-generator.c',
1704 include_directories : includes,
1705 link_with : [libshared],
1706 install_rpath : rootlibexecdir,
1708 install_dir : systemgeneratordir)
1711 if conf.get('ENABLE_HOSTNAMED') == 1
1712 executable('systemd-hostnamed',
1713 'src/hostname/hostnamed.c',
1714 include_directories : includes,
1715 link_with : [libshared],
1716 install_rpath : rootlibexecdir,
1718 install_dir : rootlibexecdir)
1720 exe = executable('hostnamectl',
1721 'src/hostname/hostnamectl.c',
1722 include_directories : includes,
1723 link_with : [libshared],
1724 install_rpath : rootlibexecdir,
1726 public_programs += [exe]
1729 if conf.get('ENABLE_LOCALED') == 1
1730 if conf.get('HAVE_XKBCOMMON') == 1
1731 # logind will load libxkbcommon.so dynamically on its own
1737 executable('systemd-localed',
1738 systemd_localed_sources,
1739 include_directories : includes,
1740 link_with : [libshared],
1741 dependencies : deps,
1742 install_rpath : rootlibexecdir,
1744 install_dir : rootlibexecdir)
1746 exe = executable('localectl',
1748 include_directories : includes,
1749 link_with : [libshared],
1750 install_rpath : rootlibexecdir,
1752 public_programs += [exe]
1755 if conf.get('ENABLE_TIMEDATED') == 1
1756 executable('systemd-timedated',
1757 'src/timedate/timedated.c',
1758 include_directories : includes,
1759 link_with : [libshared],
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootlibexecdir)
1764 exe = executable('timedatectl',
1765 'src/timedate/timedatectl.c',
1766 include_directories : includes,
1767 install_rpath : rootlibexecdir,
1768 link_with : [libshared],
1770 public_programs += [exe]
1773 if conf.get('ENABLE_TIMESYNCD') == 1
1774 executable('systemd-timesyncd',
1775 systemd_timesyncd_sources,
1776 include_directories : includes,
1777 link_with : [libshared],
1778 dependencies : [threads,
1780 install_rpath : rootlibexecdir,
1782 install_dir : rootlibexecdir)
1785 if conf.get('ENABLE_MACHINED') == 1
1786 executable('systemd-machined',
1787 systemd_machined_sources,
1788 include_directories : includes,
1789 link_with : [libmachine_core,
1791 install_rpath : rootlibexecdir,
1793 install_dir : rootlibexecdir)
1795 exe = executable('machinectl',
1796 'src/machine/machinectl.c',
1797 include_directories : includes,
1798 link_with : [libshared],
1799 dependencies : [threads,
1802 install_rpath : rootlibexecdir,
1804 install_dir : rootbindir)
1805 public_programs += [exe]
1808 if conf.get('ENABLE_IMPORTD') == 1
1809 executable('systemd-importd',
1810 systemd_importd_sources,
1811 include_directories : includes,
1812 link_with : [libshared],
1813 dependencies : [threads],
1814 install_rpath : rootlibexecdir,
1816 install_dir : rootlibexecdir)
1818 systemd_pull = executable('systemd-pull',
1819 systemd_pull_sources,
1820 include_directories : includes,
1821 link_with : [libshared],
1822 dependencies : [libcurl,
1827 install_rpath : rootlibexecdir,
1829 install_dir : rootlibexecdir)
1831 systemd_import = executable('systemd-import',
1832 systemd_import_sources,
1833 include_directories : includes,
1834 link_with : [libshared],
1835 dependencies : [libcurl,
1839 install_rpath : rootlibexecdir,
1841 install_dir : rootlibexecdir)
1843 systemd_export = executable('systemd-export',
1844 systemd_export_sources,
1845 include_directories : includes,
1846 link_with : [libshared],
1847 dependencies : [libcurl,
1851 install_rpath : rootlibexecdir,
1853 install_dir : rootlibexecdir)
1854 public_programs += [systemd_pull, systemd_import, systemd_export]
1857 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1858 exe = executable('systemd-journal-upload',
1859 systemd_journal_upload_sources,
1860 include_directories : includes,
1861 link_with : [libshared],
1862 dependencies : [threads,
1867 install_rpath : rootlibexecdir,
1869 install_dir : rootlibexecdir)
1870 public_programs += [exe]
1873 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1874 s_j_remote = executable('systemd-journal-remote',
1875 systemd_journal_remote_sources,
1876 include_directories : includes,
1877 link_with : [libshared],
1878 dependencies : [threads,
1883 install_rpath : rootlibexecdir,
1885 install_dir : rootlibexecdir)
1887 s_j_gatewayd = executable('systemd-journal-gatewayd',
1888 systemd_journal_gatewayd_sources,
1889 include_directories : includes,
1890 link_with : [libshared],
1891 dependencies : [threads,
1896 install_rpath : rootlibexecdir,
1898 install_dir : rootlibexecdir)
1899 public_programs += [s_j_remote, s_j_gatewayd]
1902 if conf.get('ENABLE_COREDUMP') == 1
1903 executable('systemd-coredump',
1904 systemd_coredump_sources,
1905 include_directories : includes,
1906 link_with : [libshared],
1907 dependencies : [threads,
1912 install_rpath : rootlibexecdir,
1914 install_dir : rootlibexecdir)
1916 exe = executable('coredumpctl',
1917 coredumpctl_sources,
1918 include_directories : includes,
1919 link_with : [libshared],
1920 dependencies : [threads,
1923 install_rpath : rootlibexecdir,
1925 public_programs += [exe]
1928 if conf.get('ENABLE_BINFMT') == 1
1929 exe = executable('systemd-binfmt',
1930 'src/binfmt/binfmt.c',
1931 include_directories : includes,
1932 link_with : [libshared],
1933 install_rpath : rootlibexecdir,
1935 install_dir : rootlibexecdir)
1936 public_programs += [exe]
1938 meson.add_install_script('sh', '-c',
1939 mkdir_p.format(binfmtdir))
1940 meson.add_install_script('sh', '-c',
1941 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1944 if conf.get('ENABLE_VCONSOLE') == 1
1945 executable('systemd-vconsole-setup',
1946 'src/vconsole/vconsole-setup.c',
1947 include_directories : includes,
1948 link_with : [libshared],
1949 install_rpath : rootlibexecdir,
1951 install_dir : rootlibexecdir)
1954 if conf.get('ENABLE_RANDOMSEED') == 1
1955 executable('systemd-random-seed',
1956 'src/random-seed/random-seed.c',
1957 include_directories : includes,
1958 link_with : [libshared],
1959 install_rpath : rootlibexecdir,
1961 install_dir : rootlibexecdir)
1964 if conf.get('ENABLE_FIRSTBOOT') == 1
1965 executable('systemd-firstboot',
1966 'src/firstboot/firstboot.c',
1967 include_directories : includes,
1968 link_with : [libshared],
1969 dependencies : [libcrypt],
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootbindir)
1975 executable('systemd-remount-fs',
1976 'src/remount-fs/remount-fs.c',
1977 'src/core/mount-setup.c',
1978 'src/core/mount-setup.h',
1979 include_directories : includes,
1980 link_with : [libshared],
1981 install_rpath : rootlibexecdir,
1983 install_dir : rootlibexecdir)
1985 executable('systemd-machine-id-setup',
1986 'src/machine-id-setup/machine-id-setup-main.c',
1987 'src/core/machine-id-setup.c',
1988 'src/core/machine-id-setup.h',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 install_rpath : rootlibexecdir,
1993 install_dir : rootbindir)
1995 executable('systemd-fsck',
1997 include_directories : includes,
1998 link_with : [libshared],
1999 install_rpath : rootlibexecdir,
2001 install_dir : rootlibexecdir)
2003 executable('systemd-growfs',
2004 'src/partition/growfs.c',
2005 include_directories : includes,
2006 link_with : [libshared],
2007 dependencies : [libcryptsetup],
2008 install_rpath : rootlibexecdir,
2010 install_dir : rootlibexecdir)
2012 executable('systemd-makefs',
2013 'src/partition/makefs.c',
2014 include_directories : includes,
2015 link_with : [libshared],
2016 install_rpath : rootlibexecdir,
2018 install_dir : rootlibexecdir)
2020 executable('systemd-sleep',
2021 'src/sleep/sleep.c',
2022 include_directories : includes,
2023 link_with : [libshared],
2024 install_rpath : rootlibexecdir,
2026 install_dir : rootlibexecdir)
2028 exe = executable('systemd-sysctl',
2029 'src/sysctl/sysctl.c',
2030 include_directories : includes,
2031 link_with : [libshared],
2032 install_rpath : rootlibexecdir,
2034 install_dir : rootlibexecdir)
2035 public_programs += [exe]
2037 executable('systemd-ac-power',
2038 'src/ac-power/ac-power.c',
2039 include_directories : includes,
2040 link_with : [libshared],
2041 install_rpath : rootlibexecdir,
2043 install_dir : rootlibexecdir)
2045 exe = executable('systemd-detect-virt',
2046 'src/detect-virt/detect-virt.c',
2047 include_directories : includes,
2048 link_with : [libshared],
2049 install_rpath : rootlibexecdir,
2051 public_programs += [exe]
2053 exe = executable('systemd-delta',
2054 'src/delta/delta.c',
2055 include_directories : includes,
2056 link_with : [libshared],
2057 install_rpath : rootlibexecdir,
2059 public_programs += [exe]
2061 exe = executable('systemd-escape',
2062 'src/escape/escape.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 install_rpath : rootlibexecdir,
2067 install_dir : rootbindir)
2068 public_programs += [exe]
2070 exe = executable('systemd-notify',
2071 'src/notify/notify.c',
2072 include_directories : includes,
2073 link_with : [libshared],
2074 install_rpath : rootlibexecdir,
2076 install_dir : rootbindir)
2077 public_programs += [exe]
2079 executable('systemd-volatile-root',
2080 'src/volatile-root/volatile-root.c',
2081 include_directories : includes,
2082 link_with : [libshared],
2083 install_rpath : rootlibexecdir,
2085 install_dir : rootlibexecdir)
2087 executable('systemd-cgroups-agent',
2088 'src/cgroups-agent/cgroups-agent.c',
2089 include_directories : includes,
2090 link_with : [libshared],
2091 install_rpath : rootlibexecdir,
2093 install_dir : rootlibexecdir)
2095 exe = executable('systemd-path',
2097 include_directories : includes,
2098 link_with : [libshared],
2099 install_rpath : rootlibexecdir,
2101 public_programs += [exe]
2103 exe = executable('systemd-ask-password',
2104 'src/ask-password/ask-password.c',
2105 include_directories : includes,
2106 link_with : [libshared],
2107 install_rpath : rootlibexecdir,
2109 install_dir : rootbindir)
2110 public_programs += [exe]
2112 executable('systemd-reply-password',
2113 'src/reply-password/reply-password.c',
2114 include_directories : includes,
2115 link_with : [libshared],
2116 install_rpath : rootlibexecdir,
2118 install_dir : rootlibexecdir)
2120 exe = executable('systemd-tty-ask-password-agent',
2121 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2122 include_directories : includes,
2123 link_with : [libshared],
2124 install_rpath : rootlibexecdir,
2126 install_dir : rootbindir)
2127 public_programs += [exe]
2129 exe = executable('systemd-cgls',
2131 include_directories : includes,
2132 link_with : [libshared],
2133 install_rpath : rootlibexecdir,
2135 public_programs += [exe]
2137 exe = executable('systemd-cgtop',
2138 'src/cgtop/cgtop.c',
2139 include_directories : includes,
2140 link_with : [libshared],
2141 install_rpath : rootlibexecdir,
2143 public_programs += [exe]
2145 executable('systemd-initctl',
2146 'src/initctl/initctl.c',
2147 include_directories : includes,
2148 link_with : [libshared],
2149 install_rpath : rootlibexecdir,
2151 install_dir : rootlibexecdir)
2153 exe = executable('systemd-mount',
2154 'src/mount/mount-tool.c',
2155 include_directories : includes,
2156 link_with : [libshared],
2157 install_rpath : rootlibexecdir,
2159 public_programs += [exe]
2161 meson.add_install_script(meson_make_symlink,
2162 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2164 exe = executable('systemd-run',
2166 include_directories : includes,
2167 link_with : [libshared],
2168 install_rpath : rootlibexecdir,
2170 public_programs += [exe]
2172 exe = executable('systemd-stdio-bridge',
2173 'src/stdio-bridge/stdio-bridge.c',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2178 public_programs += [exe]
2180 exe = executable('busctl',
2181 'src/busctl/busctl.c',
2182 'src/busctl/busctl-introspect.c',
2183 'src/busctl/busctl-introspect.h',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 install_rpath : rootlibexecdir,
2188 public_programs += [exe]
2190 if conf.get('ENABLE_SYSUSERS') == 1
2191 exe = executable('systemd-sysusers',
2192 'src/sysusers/sysusers.c',
2193 include_directories : includes,
2194 link_with : [libshared],
2195 install_rpath : rootlibexecdir,
2197 install_dir : rootbindir)
2198 public_programs += [exe]
2201 if conf.get('ENABLE_TMPFILES') == 1
2202 exe = executable('systemd-tmpfiles',
2203 'src/tmpfiles/tmpfiles.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 dependencies : [libacl],
2207 install_rpath : rootlibexecdir,
2209 install_dir : rootbindir)
2210 public_programs += [exe]
2212 test('test-systemd-tmpfiles',
2213 test_systemd_tmpfiles_py,
2214 args : exe.full_path())
2215 # https://github.com/mesonbuild/meson/issues/2681
2218 if conf.get('ENABLE_HWDB') == 1
2219 exe = executable('systemd-hwdb',
2221 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2222 include_directories : includes,
2223 link_with : [libudev_internal],
2224 install_rpath : udev_rpath,
2226 install_dir : rootbindir)
2227 public_programs += [exe]
2230 if conf.get('ENABLE_QUOTACHECK') == 1
2231 executable('systemd-quotacheck',
2232 'src/quotacheck/quotacheck.c',
2233 include_directories : includes,
2234 link_with : [libshared],
2235 install_rpath : rootlibexecdir,
2237 install_dir : rootlibexecdir)
2240 exe = executable('systemd-socket-proxyd',
2241 'src/socket-proxy/socket-proxyd.c',
2242 include_directories : includes,
2243 link_with : [libshared],
2244 dependencies : [threads],
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootlibexecdir)
2248 public_programs += [exe]
2250 exe = executable('systemd-udevd',
2251 systemd_udevd_sources,
2252 include_directories : includes,
2253 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2254 link_with : [libudev_core,
2257 dependencies : [threads,
2262 install_rpath : udev_rpath,
2264 install_dir : rootlibexecdir)
2265 public_programs += [exe]
2267 exe = executable('udevadm',
2269 include_directories : includes,
2270 link_with : [libudev_core,
2273 dependencies : [threads,
2278 install_rpath : udev_rpath,
2280 install_dir : rootbindir)
2281 public_programs += [exe]
2283 executable('systemd-shutdown',
2284 systemd_shutdown_sources,
2285 include_directories : includes,
2286 link_with : [libshared],
2287 install_rpath : rootlibexecdir,
2289 install_dir : rootlibexecdir)
2291 executable('systemd-update-done',
2292 'src/update-done/update-done.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2297 install_dir : rootlibexecdir)
2299 executable('systemd-update-utmp',
2300 'src/update-utmp/update-utmp.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 dependencies : [libaudit],
2304 install_rpath : rootlibexecdir,
2306 install_dir : rootlibexecdir)
2308 if conf.get('HAVE_KMOD') == 1
2309 executable('systemd-modules-load',
2310 'src/modules-load/modules-load.c',
2311 include_directories : includes,
2312 link_with : [libshared],
2313 dependencies : [libkmod],
2314 install_rpath : rootlibexecdir,
2316 install_dir : rootlibexecdir)
2318 meson.add_install_script('sh', '-c',
2319 mkdir_p.format(modulesloaddir))
2320 meson.add_install_script('sh', '-c',
2321 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2324 exe = executable('systemd-nspawn',
2325 systemd_nspawn_sources,
2326 'src/core/mount-setup.c', # FIXME: use a variable?
2327 'src/core/mount-setup.h',
2328 'src/core/loopback-setup.c',
2329 'src/core/loopback-setup.h',
2330 include_directories : [includes, include_directories('src/nspawn')],
2331 link_with : [libshared],
2332 dependencies : [libacl,
2336 install_rpath : rootlibexecdir,
2338 public_programs += [exe]
2340 if conf.get('ENABLE_NETWORKD') == 1
2341 executable('systemd-networkd',
2342 systemd_networkd_sources,
2343 include_directories : includes,
2344 link_with : [libnetworkd_core,
2348 dependencies : [threads],
2349 install_rpath : rootlibexecdir,
2351 install_dir : rootlibexecdir)
2353 executable('systemd-networkd-wait-online',
2354 systemd_networkd_wait_online_sources,
2355 include_directories : includes,
2356 link_with : [libnetworkd_core,
2358 install_rpath : rootlibexecdir,
2360 install_dir : rootlibexecdir)
2362 exe = executable('networkctl',
2364 include_directories : includes,
2365 link_with : [libsystemd_network,
2367 install_rpath : rootlibexecdir,
2369 install_dir : rootbindir)
2370 public_programs += [exe]
2373 executable('systemd-sulogin-shell',
2374 ['src/sulogin-shell/sulogin-shell.c'],
2375 include_directories : includes,
2376 link_with : [libshared],
2377 install_rpath : rootlibexecdir,
2379 install_dir : rootlibexecdir)
2381 ############################################################
2383 foreach tuple : tests
2385 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2386 dependencies = tuple[2]
2387 condition = tuple.length() >= 4 ? tuple[3] : ''
2388 type = tuple.length() >= 5 ? tuple[4] : ''
2389 defs = tuple.length() >= 6 ? tuple[5] : []
2390 incs = tuple.length() >= 7 ? tuple[6] : includes
2393 name = sources[0].split('/')[-1].split('.')[0]
2394 if type.startswith('timeout=')
2395 timeout = type.split('=')[1].to_int()
2399 if condition == '' or conf.get(condition) == 1
2403 include_directories : incs,
2404 link_with : link_with,
2405 dependencies : dependencies,
2407 install_rpath : rootlibexecdir,
2408 install : install_tests,
2409 install_dir : join_paths(testsdir, type))
2412 message('@0@ is a manual test'.format(name))
2413 elif type == 'unsafe' and want_tests != 'unsafe'
2414 message('@0@ is an unsafe test'.format(name))
2421 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2425 test_libsystemd_sym = executable(
2426 'test-libsystemd-sym',
2427 test_libsystemd_sym_c,
2428 include_directories : includes,
2429 link_with : [libsystemd],
2430 install : install_tests,
2431 install_dir : testsdir)
2432 test('test-libsystemd-sym',
2433 test_libsystemd_sym)
2435 test_libudev_sym = executable(
2438 include_directories : includes,
2439 c_args : ['-Wno-deprecated-declarations'],
2440 link_with : [libudev],
2441 install : install_tests,
2442 install_dir : testsdir)
2443 test('test-libudev-sym',
2446 ############################################################
2448 make_directive_index_py = find_program('tools/make-directive-index.py')
2449 make_man_index_py = find_program('tools/make-man-index.py')
2450 xml_helper_py = find_program('tools/xml_helper.py')
2451 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2455 subdir('sysusers.d')
2456 subdir('tmpfiles.d')
2461 subdir('shell-completion/bash')
2462 subdir('shell-completion/zsh')
2463 subdir('docs/sysvinit')
2464 subdir('docs/var-log')
2466 # FIXME: figure out if the warning is true:
2467 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2468 install_subdir('factory/etc',
2469 install_dir : factorydir)
2472 install_data('xorg/50-systemd-user.sh',
2473 install_dir : xinitrcdir)
2474 install_data('modprobe.d/systemd.conf',
2475 install_dir : modprobedir)
2476 install_data('README',
2483 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2484 install_dir : docdir)
2486 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2487 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2489 ############################################################
2491 meson_check_help = find_program('tools/meson-check-help.sh')
2493 foreach exec : public_programs
2494 name = exec.full_path().split('/')[-1]
2495 test('check-help-' + name,
2497 args : [exec.full_path()])
2500 ############################################################
2503 all_files = run_command(
2505 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2508 all_files = files(all_files.stdout().split())
2513 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2517 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2521 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2524 command : [meson_git_contrib_sh])
2528 git_head = run_command(
2530 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2531 'rev-parse', 'HEAD']).stdout().strip()
2532 git_head_short = run_command(
2534 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2535 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2539 command : ['git', 'archive',
2540 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2542 '--prefix', 'systemd-@0@/'.format(git_head),
2546 ############################################################
2549 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2551 'prefix directory: @0@'.format(prefixdir),
2552 'rootprefix directory: @0@'.format(rootprefixdir),
2553 'sysconf directory: @0@'.format(sysconfdir),
2554 'include directory: @0@'.format(includedir),
2555 'lib directory: @0@'.format(libdir),
2556 'rootlib directory: @0@'.format(rootlibdir),
2557 'SysV init scripts: @0@'.format(sysvinit_path),
2558 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2559 'PAM modules directory: @0@'.format(pamlibdir),
2560 'PAM configuration directory: @0@'.format(pamconfdir),
2561 'RPM macros directory: @0@'.format(rpmmacrosdir),
2562 'modprobe.d directory: @0@'.format(modprobedir),
2563 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2564 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2565 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2566 'bash completions directory: @0@'.format(bashcompletiondir),
2567 'zsh completions directory: @0@'.format(zshcompletiondir),
2568 'extra start script: @0@'.format(get_option('rc-local')),
2569 'extra stop script: @0@'.format(get_option('halt-local')),
2570 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2571 get_option('debug-tty')),
2572 'TTY GID: @0@'.format(tty_gid),
2573 'users GID: @0@'.format(users_gid),
2574 'maximum system UID: @0@'.format(system_uid_max),
2575 'maximum system GID: @0@'.format(system_gid_max),
2576 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2577 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2578 'minimum container UID base: @0@'.format(container_uid_base_min),
2579 'maximum container UID base: @0@'.format(container_uid_base_max),
2580 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2581 'render group access mode: @0@'.format(get_option('group-render-mode')),
2582 'certificate root directory: @0@'.format(get_option('certificate-root')),
2583 'support URL: @0@'.format(support_url),
2584 'nobody user name: @0@'.format(nobody_user),
2585 'nobody group name: @0@'.format(nobody_group),
2586 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2587 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2589 'default DNSSEC mode: @0@'.format(default_dnssec),
2590 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2591 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2593 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2594 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2596 'default DNS servers: @0@'.format(alt_dns_servers),
2597 'default NTP servers: @0@'.format(alt_ntp_servers)]
2599 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2600 '@@0@'.format(time_epoch)).stdout().strip()
2602 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2605 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2606 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2607 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2609 if conf.get('ENABLE_EFI') == 1
2611 'efi arch: @0@'.format(efi_arch)]
2615 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2616 'EFI CC @0@'.format(efi_cc),
2617 'EFI lib directory: @0@'.format(efi_libdir),
2618 'EFI lds directory: @0@'.format(efi_ldsdir),
2619 'EFI include directory: @0@'.format(efi_incdir)]
2672 ['legacy pkla', install_polkit_pkla],
2674 ['gnu-efi', have_gnu_efi],
2680 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2683 ['man pages', want_man],
2684 ['html pages', want_html],
2685 ['man page indices', want_man and have_lxml],
2686 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2691 ['adm group', get_option('adm-group')],
2692 ['wheel group', get_option('wheel-group')],
2695 ['debug mmap cache'],
2698 cond = tuple.get(1, '')
2700 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2701 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2702 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2707 missing += [tuple[0]]
2713 'enabled features: @0@'.format(', '.join(found)),
2715 'disabled features: @0@'.format(', '.join(missing)),
2717 message('\n '.join(status))
2719 if rootprefixdir != rootprefix_default
2720 message('WARNING:\n' +
2721 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2722 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2723 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))