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.20.0'
31 libudev_version = '1.6.8'
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 != '' and 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_FLAGS', '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 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
441 ['NDA_IFINDEX', 'linux/neighbour.h'],
442 ['IFA_FLAGS', 'linux/if_addr.h'],
443 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
444 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
445 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
447 prefix = decl.length() > 2 ? decl[2] : ''
448 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
449 conf.set10('HAVE_' + decl[0], have)
452 foreach ident : ['secure_getenv', '__secure_getenv']
453 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
457 ['memfd_create', '''#include <sys/mman.h>'''],
458 ['gettid', '''#include <sys/types.h>
459 #include <unistd.h>'''],
460 ['pivot_root', '''#include <stdlib.h>
461 #include <unistd.h>'''], # no known header declares pivot_root
462 ['name_to_handle_at', '''#include <sys/types.h>
463 #include <sys/stat.h>
464 #include <fcntl.h>'''],
465 ['setns', '''#include <sched.h>'''],
466 ['renameat2', '''#include <stdio.h>
467 #include <fcntl.h>'''],
468 ['kcmp', '''#include <linux/kcmp.h>'''],
469 ['keyctl', '''#include <sys/types.h>
470 #include <keyutils.h>'''],
471 ['copy_file_range', '''#include <sys/syscall.h>
472 #include <unistd.h>'''],
473 ['bpf', '''#include <sys/syscall.h>
474 #include <unistd.h>'''],
475 ['explicit_bzero' , '''#include <string.h>'''],
478 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
479 conf.set10('HAVE_' + ident[0].to_upper(), have)
482 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
483 conf.set10('USE_SYS_RANDOM_H', true)
484 conf.set10('HAVE_GETRANDOM', true)
486 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
487 conf.set10('USE_SYS_RANDOM_H', false)
488 conf.set10('HAVE_GETRANDOM', have)
491 #####################################################################
493 sed = find_program('sed')
494 awk = find_program('awk')
495 m4 = find_program('m4')
496 stat = find_program('stat')
497 git = find_program('git', required : false)
499 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
500 mkdir_p = 'mkdir -p $DESTDIR/@0@'
501 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
502 splash_bmp = files('test/splash.bmp')
504 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
505 # /usr/sbin, /sbin, and fall back to the default from middle column.
506 progs = [['telinit', '/lib/sysvinit/telinit'],
507 ['quotaon', '/usr/sbin/quotaon' ],
508 ['quotacheck', '/usr/sbin/quotacheck' ],
509 ['kill', '/usr/bin/kill' ],
510 ['kmod', '/usr/bin/kmod' ],
511 ['kexec', '/usr/sbin/kexec' ],
512 ['sulogin', '/usr/sbin/sulogin' ],
513 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
514 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
515 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
516 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
519 path = get_option(prog[0] + '-path')
521 message('Using @1@ for @0@'.format(prog[0], path))
523 exe = find_program(prog[0],
524 '/usr/sbin/' + prog[0],
527 path = exe.found() ? exe.path() : prog[1]
529 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
530 conf.set_quoted(name, path)
531 substs.set(name, path)
534 if run_command('ln', '--relative', '--help').returncode() != 0
535 error('ln does not support --relative')
538 ############################################################
540 gperf = find_program('gperf')
542 gperf_test_format = '''
544 const char * in_word_set(const char *, @0@);
547 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
548 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
549 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
550 if cc.compiles(gperf_test)
551 gperf_len_type = 'size_t'
553 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
554 if cc.compiles(gperf_test)
555 gperf_len_type = 'unsigned'
557 error('unable to determine gperf len type')
560 message('gperf len type is @0@'.format(gperf_len_type))
561 conf.set('GPERF_LEN_TYPE', gperf_len_type,
562 description : 'The type of gperf "len" parameter')
564 ############################################################
566 if not cc.has_header('sys/capability.h')
567 error('POSIX caps headers not found')
569 foreach header : ['linux/btrfs.h',
571 'linux/vm_sockets.h',
573 'valgrind/memcheck.h',
574 'valgrind/valgrind.h',
577 conf.set10('HAVE_' + header.underscorify().to_upper(),
578 cc.has_header(header))
581 ############################################################
583 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
584 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
585 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
587 default_hierarchy = get_option('default-hierarchy')
588 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
589 description : 'default cgroup hierarchy as string')
590 if default_hierarchy == 'legacy'
591 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
592 elif default_hierarchy == 'hybrid'
593 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
595 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
598 time_epoch = get_option('time-epoch')
601 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
603 time_epoch = time_epoch.to_int()
604 conf.set('TIME_EPOCH', time_epoch)
606 system_uid_max = get_option('system-uid-max')
607 if system_uid_max == ''
608 system_uid_max = run_command(
610 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
611 '/etc/login.defs').stdout()
613 system_uid_max = system_uid_max.to_int()
614 conf.set('SYSTEM_UID_MAX', system_uid_max)
615 substs.set('systemuidmax', system_uid_max)
616 message('maximum system UID is @0@'.format(system_uid_max))
618 system_gid_max = get_option('system-gid-max')
619 if system_gid_max == ''
620 system_gid_max = run_command(
622 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
623 '/etc/login.defs').stdout()
625 system_gid_max = system_gid_max.to_int()
626 conf.set('SYSTEM_GID_MAX', system_gid_max)
627 substs.set('systemgidmax', system_gid_max)
628 message('maximum system GID is @0@'.format(system_gid_max))
630 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
631 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
632 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
633 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
634 substs.set('dynamicuidmin', dynamic_uid_min)
635 substs.set('dynamicuidmax', dynamic_uid_max)
637 container_uid_base_min = get_option('container-uid-base-min').to_int()
638 container_uid_base_max = get_option('container-uid-base-max').to_int()
639 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
640 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
641 substs.set('containeruidbasemin', container_uid_base_min)
642 substs.set('containeruidbasemax', container_uid_base_max)
644 nobody_user = get_option('nobody-user')
645 nobody_group = get_option('nobody-group')
647 getent_result = run_command('getent', 'passwd', '65534')
648 if getent_result.returncode() == 0
649 name = getent_result.stdout().split(':')[0]
650 if name != nobody_user
651 message('WARNING:\n' +
652 ' 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) +
653 ' Your build will result in an user table setup that is incompatible with the local system.')
656 id_result = run_command('id', '-u', nobody_user)
657 if id_result.returncode() == 0
658 id = id_result.stdout().to_int()
660 message('WARNING:\n' +
661 ' 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) +
662 ' Your build will result in an user table setup that is incompatible with the local system.')
666 getent_result = run_command('getent', 'group', '65534')
667 if getent_result.returncode() == 0
668 name = getent_result.stdout().split(':')[0]
669 if name != nobody_group
670 message('WARNING:\n' +
671 ' 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) +
672 ' Your build will result in an group table setup that is incompatible with the local system.')
675 id_result = run_command('id', '-g', nobody_group)
676 if id_result.returncode() == 0
677 id = id_result.stdout().to_int()
679 message('WARNING:\n' +
680 ' 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) +
681 ' Your build will result in an group table setup that is incompatible with the local system.')
684 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
685 message('WARNING:\n' +
686 ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
687 ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
690 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
691 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
692 substs.set('NOBODY_USER_NAME', nobody_user)
693 substs.set('NOBODY_GROUP_NAME', nobody_group)
695 tty_gid = get_option('tty-gid')
696 conf.set('TTY_GID', tty_gid)
697 substs.set('TTY_GID', tty_gid)
699 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
700 if get_option('users-gid') != ''
701 users_gid = get_option('users-gid').to_int()
705 substs.set('USERS_GID', users_gid)
707 if get_option('adm-group')
708 m4_defines += ['-DENABLE_ADM_GROUP']
711 if get_option('wheel-group')
712 m4_defines += ['-DENABLE_WHEEL_GROUP']
715 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
716 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
718 kill_user_processes = get_option('default-kill-user-processes')
719 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
720 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
722 dns_servers = get_option('dns-servers')
723 conf.set_quoted('DNS_SERVERS', dns_servers)
724 substs.set('DNS_SERVERS', dns_servers)
726 ntp_servers = get_option('ntp-servers')
727 conf.set_quoted('NTP_SERVERS', ntp_servers)
728 substs.set('NTP_SERVERS', ntp_servers)
730 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
732 substs.set('SUSHELL', get_option('debug-shell'))
733 substs.set('DEBUGTTY', get_option('debug-tty'))
735 debug = get_option('debug')
736 enable_debug_hashmap = false
737 enable_debug_mmap_cache = false
739 foreach name : debug.split(',')
741 enable_debug_hashmap = true
742 elif name == 'mmap-cache'
743 enable_debug_mmap_cache = true
745 message('unknown debug option "@0@", ignoring'.format(name))
749 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
750 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
752 #####################################################################
754 threads = dependency('threads')
755 librt = cc.find_library('rt')
756 libm = cc.find_library('m')
757 libdl = cc.find_library('dl')
758 libcrypt = cc.find_library('crypt')
760 libcap = dependency('libcap', required : false)
761 if not libcap.found()
762 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
763 libcap = cc.find_library('cap')
766 libmount = dependency('mount',
769 want_seccomp = get_option('seccomp')
770 if want_seccomp != 'false'
771 libseccomp = dependency('libseccomp',
772 version : '>= 2.3.1',
773 required : want_seccomp == 'true')
774 have = libseccomp.found()
779 conf.set10('HAVE_SECCOMP', have)
780 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
782 want_selinux = get_option('selinux')
783 if want_selinux != 'false'
784 libselinux = dependency('libselinux',
785 version : '>= 2.1.9',
786 required : want_selinux == 'true')
787 have = libselinux.found()
792 conf.set10('HAVE_SELINUX', have)
793 m4_defines += have ? ['-DHAVE_SELINUX'] : []
795 want_apparmor = get_option('apparmor')
796 if want_apparmor != 'false'
797 libapparmor = dependency('libapparmor',
798 required : want_apparmor == 'true')
799 have = libapparmor.found()
804 conf.set10('HAVE_APPARMOR', have)
805 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
807 smack_run_label = get_option('smack-run-label')
808 if smack_run_label != ''
809 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
810 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
813 want_polkit = get_option('polkit')
814 install_polkit = false
815 install_polkit_pkla = false
816 if want_polkit != 'false'
817 install_polkit = true
819 libpolkit = dependency('polkit-gobject-1',
821 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
822 message('Old polkit detected, will install pkla files')
823 install_polkit_pkla = true
826 conf.set10('ENABLE_POLKIT', install_polkit)
828 want_acl = get_option('acl')
829 if want_acl != 'false'
830 libacl = cc.find_library('acl', required : want_acl == 'true')
831 have = libacl.found()
836 conf.set10('HAVE_ACL', have)
837 m4_defines += have ? ['-DHAVE_ACL'] : []
839 want_audit = get_option('audit')
840 if want_audit != 'false'
841 libaudit = dependency('audit', required : want_audit == 'true')
842 have = libaudit.found()
847 conf.set10('HAVE_AUDIT', have)
849 want_blkid = get_option('blkid')
850 if want_blkid != 'false'
851 libblkid = dependency('blkid', required : want_blkid == 'true')
852 have = libblkid.found()
857 conf.set10('HAVE_BLKID', have)
859 want_kmod = get_option('kmod')
860 if want_kmod != 'false'
861 libkmod = dependency('libkmod',
863 required : want_kmod == 'true')
864 have = libkmod.found()
869 conf.set10('HAVE_KMOD', have)
871 want_pam = get_option('pam')
872 if want_pam != 'false'
873 libpam = cc.find_library('pam', required : want_pam == 'true')
874 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
875 have = libpam.found() and libpam_misc.found()
881 conf.set10('HAVE_PAM', have)
882 m4_defines += have ? ['-DHAVE_PAM'] : []
884 want_microhttpd = get_option('microhttpd')
885 if want_microhttpd != 'false'
886 libmicrohttpd = dependency('libmicrohttpd',
887 version : '>= 0.9.33',
888 required : want_microhttpd == 'true')
889 have = libmicrohttpd.found()
894 conf.set10('HAVE_MICROHTTPD', have)
895 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
897 want_libcryptsetup = get_option('libcryptsetup')
898 if want_libcryptsetup != 'false'
899 libcryptsetup = dependency('libcryptsetup',
900 version : '>= 1.6.0',
901 required : want_libcryptsetup == 'true')
902 have = libcryptsetup.found()
907 conf.set10('HAVE_LIBCRYPTSETUP', have)
909 want_libcurl = get_option('libcurl')
910 if want_libcurl != 'false'
911 libcurl = dependency('libcurl',
912 version : '>= 7.32.0',
913 required : want_libcurl == 'true')
914 have = libcurl.found()
919 conf.set10('HAVE_LIBCURL', have)
920 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
922 want_libidn = get_option('libidn')
923 want_libidn2 = get_option('libidn2')
924 if want_libidn == 'true' and want_libidn2 == 'true'
925 error('libidn and libidn2 cannot be requested simultaneously')
928 if want_libidn != 'false' and want_libidn2 != 'true'
929 libidn = dependency('libidn',
930 required : want_libidn == 'true')
931 have = libidn.found()
936 conf.set10('HAVE_LIBIDN', have)
937 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
938 if not have and want_libidn2 != 'false'
939 # libidn is used for both libidn and libidn2 objects
940 libidn = dependency('libidn2',
941 required : want_libidn2 == 'true')
942 have = libidn.found()
946 conf.set10('HAVE_LIBIDN2', have)
947 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
949 want_libiptc = get_option('libiptc')
950 if want_libiptc != 'false'
951 libiptc = dependency('libiptc',
952 required : want_libiptc == 'true')
953 have = libiptc.found()
958 conf.set10('HAVE_LIBIPTC', have)
959 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
961 want_qrencode = get_option('qrencode')
962 if want_qrencode != 'false'
963 libqrencode = dependency('libqrencode',
964 required : want_qrencode == 'true')
965 have = libqrencode.found()
970 conf.set10('HAVE_QRENCODE', have)
972 want_gcrypt = get_option('gcrypt')
973 if want_gcrypt != 'false'
974 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
975 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
976 have = libgcrypt.found() and libgpg_error.found()
981 # link to neither of the libs if one is not found
985 conf.set10('HAVE_GCRYPT', have)
987 want_gnutls = get_option('gnutls')
988 if want_gnutls != 'false'
989 libgnutls = dependency('gnutls',
990 version : '>= 3.1.4',
991 required : want_gnutls == 'true')
992 have = libgnutls.found()
997 conf.set10('HAVE_GNUTLS', have)
999 want_elfutils = get_option('elfutils')
1000 if want_elfutils != 'false'
1001 libdw = dependency('libdw',
1002 required : want_elfutils == 'true')
1003 have = libdw.found()
1008 conf.set10('HAVE_ELFUTILS', have)
1010 want_zlib = get_option('zlib')
1011 if want_zlib != 'false'
1012 libz = dependency('zlib',
1013 required : want_zlib == 'true')
1019 conf.set10('HAVE_ZLIB', have)
1021 want_bzip2 = get_option('bzip2')
1022 if want_bzip2 != 'false'
1023 libbzip2 = cc.find_library('bz2',
1024 required : want_bzip2 == 'true')
1025 have = libbzip2.found()
1030 conf.set10('HAVE_BZIP2', have)
1032 want_xz = get_option('xz')
1033 if want_xz != 'false'
1034 libxz = dependency('liblzma',
1035 required : want_xz == 'true')
1036 have = libxz.found()
1041 conf.set10('HAVE_XZ', have)
1043 want_lz4 = get_option('lz4')
1044 if want_lz4 != 'false'
1045 liblz4 = dependency('liblz4',
1046 required : want_lz4 == 'true')
1047 have = liblz4.found()
1052 conf.set10('HAVE_LZ4', have)
1054 want_xkbcommon = get_option('xkbcommon')
1055 if want_xkbcommon != 'false'
1056 libxkbcommon = dependency('xkbcommon',
1057 version : '>= 0.3.0',
1058 required : want_xkbcommon == 'true')
1059 have = libxkbcommon.found()
1064 conf.set10('HAVE_XKBCOMMON', have)
1066 want_glib = get_option('glib')
1067 if want_glib != 'false'
1068 libglib = dependency('glib-2.0',
1069 version : '>= 2.22.0',
1070 required : want_glib == 'true')
1071 libgobject = dependency('gobject-2.0',
1072 version : '>= 2.22.0',
1073 required : want_glib == 'true')
1074 libgio = dependency('gio-2.0',
1075 required : want_glib == 'true')
1076 have = libglib.found() and libgobject.found() and libgio.found()
1083 conf.set10('HAVE_GLIB', have)
1085 want_dbus = get_option('dbus')
1086 if want_dbus != 'false'
1087 libdbus = dependency('dbus-1',
1088 version : '>= 1.3.2',
1089 required : want_dbus == 'true')
1090 have = libdbus.found()
1095 conf.set10('HAVE_DBUS', have)
1097 default_dnssec = get_option('default-dnssec')
1098 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1099 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1100 default_dnssec = 'no'
1102 conf.set('DEFAULT_DNSSEC_MODE',
1103 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1104 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1106 want_importd = get_option('importd')
1107 if want_importd != 'false'
1108 have = (conf.get('HAVE_LIBCURL') == 1 and
1109 conf.get('HAVE_ZLIB') == 1 and
1110 conf.get('HAVE_BZIP2') == 1 and
1111 conf.get('HAVE_XZ') == 1 and
1112 conf.get('HAVE_GCRYPT') == 1)
1113 if want_importd == 'true' and not have
1114 error('importd support was requested, but dependencies are not available')
1119 conf.set10('ENABLE_IMPORTD', have)
1121 want_remote = get_option('remote')
1122 if want_remote != 'false'
1123 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1124 conf.get('HAVE_LIBCURL') == 1]
1125 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1126 # it's possible to build one without the other. Complain only if
1127 # support was explictly requested. The auxiliary files like sysusers
1128 # config should be installed when any of the programs are built.
1129 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1130 error('remote support was requested, but dependencies are not available')
1132 have = have_deps[0] or have_deps[1]
1136 conf.set10('ENABLE_REMOTE', have)
1138 foreach term : ['utmp',
1169 have = get_option(term)
1170 name = 'ENABLE_' + term.underscorify().to_upper()
1171 conf.set10(name, have)
1172 m4_defines += have ? ['-D' + name] : []
1175 want_tests = get_option('tests')
1176 install_tests = get_option('install-tests')
1179 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1181 #####################################################################
1183 if get_option('efi')
1184 efi_arch = host_machine.cpu_family()
1186 if efi_arch == 'x86'
1187 EFI_MACHINE_TYPE_NAME = 'ia32'
1188 gnu_efi_arch = 'ia32'
1189 elif efi_arch == 'x86_64'
1190 EFI_MACHINE_TYPE_NAME = 'x64'
1191 gnu_efi_arch = 'x86_64'
1192 elif efi_arch == 'arm'
1193 EFI_MACHINE_TYPE_NAME = 'arm'
1194 gnu_efi_arch = 'arm'
1195 elif efi_arch == 'aarch64'
1196 EFI_MACHINE_TYPE_NAME = 'aa64'
1197 gnu_efi_arch = 'aarch64'
1199 EFI_MACHINE_TYPE_NAME = ''
1204 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1206 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1210 conf.set10('ENABLE_EFI', have)
1212 #####################################################################
1214 config_h = configure_file(
1215 output : 'config.h',
1216 configuration : conf)
1218 includes = include_directories('src/basic',
1228 'src/libsystemd/sd-bus',
1229 'src/libsystemd/sd-device',
1230 'src/libsystemd/sd-hwdb',
1231 'src/libsystemd/sd-id128',
1232 'src/libsystemd/sd-netlink',
1233 'src/libsystemd/sd-network',
1234 'src/libsystemd-network',
1238 add_project_arguments('-include', 'config.h', language : 'c')
1240 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1241 'src/shared/gcrypt-util.c')
1245 subdir('src/systemd')
1247 subdir('src/libsystemd')
1248 subdir('src/libsystemd-network')
1249 subdir('src/journal')
1252 libjournal_core = static_library(
1254 libjournal_core_sources,
1256 include_directories : includes,
1259 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1260 libsystemd = shared_library(
1262 libsystemd_internal_sources,
1263 journal_internal_sources,
1264 version : libsystemd_version,
1265 include_directories : includes,
1266 link_args : ['-shared',
1267 '-Wl,--version-script=' + libsystemd_sym_path],
1268 link_with : [libbasic],
1269 dependencies : [threads,
1274 link_depends : libsystemd_sym,
1276 install_dir : rootlibdir)
1278 ############################################################
1280 # binaries that have --help and are intended for use by humans,
1281 # usually, but not always, installed in /bin.
1282 public_programs = []
1284 subdir('src/libudev')
1285 subdir('src/shared')
1288 subdir('src/network')
1290 subdir('src/analyze')
1291 subdir('src/journal-remote')
1292 subdir('src/coredump')
1293 subdir('src/hostname')
1294 subdir('src/import')
1295 subdir('src/kernel-install')
1296 subdir('src/locale')
1297 subdir('src/machine')
1298 subdir('src/nspawn')
1299 subdir('src/resolve')
1300 subdir('src/timedate')
1301 subdir('src/timesync')
1302 subdir('src/vconsole')
1303 subdir('src/boot/efi')
1309 ############################################################
1311 # only static linking apart from libdl, to make sure that the
1312 # module is linked to all libraries that it uses.
1313 test_dlopen = executable(
1316 include_directories : includes,
1317 link_with : [libbasic],
1318 dependencies : [libdl])
1320 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1321 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1322 ['mymachines', 'ENABLE_MACHINED'],
1323 ['resolve', 'ENABLE_RESOLVE']]
1325 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1329 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1330 version_script_arg = join_paths(meson.current_source_dir(), sym)
1332 nss = shared_library(
1334 'src/nss-@0@/nss-@0@.c'.format(module),
1336 include_directories : includes,
1337 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1338 link_args : ['-Wl,-z,nodelete',
1340 '-Wl,--version-script=' + version_script_arg,
1342 link_with : [libsystemd_internal,
1344 dependencies : [threads,
1348 install_dir : rootlibdir)
1350 # We cannot use shared_module because it does not support version suffix.
1351 # Unfortunately shared_library insists on creating the symlink…
1352 meson.add_install_script('sh', '-c',
1353 'rm $DESTDIR@0@/libnss_@1@.so'
1354 .format(rootlibdir, module))
1356 test('dlopen-nss_' + module,
1358 args : [nss.full_path()]) # path to dlopen must include a slash
1362 ############################################################
1364 executable('systemd',
1366 include_directories : includes,
1367 link_with : [libcore,
1369 dependencies : [threads,
1375 install_rpath : rootlibexecdir,
1377 install_dir : rootlibexecdir)
1379 exe = executable('systemd-analyze',
1380 systemd_analyze_sources,
1381 include_directories : includes,
1382 link_with : [libcore,
1384 dependencies : [threads,
1390 install_rpath : rootlibexecdir,
1392 public_programs += [exe]
1394 executable('systemd-journald',
1395 systemd_journald_sources,
1396 include_directories : includes,
1397 link_with : [libjournal_core,
1399 dependencies : [threads,
1403 install_rpath : rootlibexecdir,
1405 install_dir : rootlibexecdir)
1407 exe = executable('systemd-cat',
1408 systemd_cat_sources,
1409 include_directories : includes,
1410 link_with : [libjournal_core,
1412 dependencies : [threads],
1413 install_rpath : rootlibexecdir,
1415 public_programs += [exe]
1417 exe = executable('journalctl',
1419 include_directories : includes,
1420 link_with : [libshared],
1421 dependencies : [threads,
1425 install_rpath : rootlibexecdir,
1427 install_dir : rootbindir)
1428 public_programs += [exe]
1430 executable('systemd-getty-generator',
1431 'src/getty-generator/getty-generator.c',
1432 include_directories : includes,
1433 link_with : [libshared],
1434 install_rpath : rootlibexecdir,
1436 install_dir : systemgeneratordir)
1438 executable('systemd-debug-generator',
1439 'src/debug-generator/debug-generator.c',
1440 include_directories : includes,
1441 link_with : [libshared],
1442 install_rpath : rootlibexecdir,
1444 install_dir : systemgeneratordir)
1446 executable('systemd-fstab-generator',
1447 'src/fstab-generator/fstab-generator.c',
1448 'src/core/mount-setup.c',
1449 include_directories : includes,
1450 link_with : [libshared],
1451 install_rpath : rootlibexecdir,
1453 install_dir : systemgeneratordir)
1455 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1456 executable('30-systemd-environment-d-generator',
1457 'src/environment-d-generator/environment-d-generator.c',
1458 include_directories : includes,
1459 link_with : [libshared],
1460 install_rpath : rootlibexecdir,
1462 install_dir : userenvgeneratordir)
1464 meson.add_install_script(meson_make_symlink,
1465 join_paths(sysconfdir, 'environment'),
1466 join_paths(environmentdir, '99-environment.conf'))
1469 if conf.get('ENABLE_HIBERNATE') == 1
1470 executable('systemd-hibernate-resume-generator',
1471 'src/hibernate-resume/hibernate-resume-generator.c',
1472 include_directories : includes,
1473 link_with : [libshared],
1474 install_rpath : rootlibexecdir,
1476 install_dir : systemgeneratordir)
1478 executable('systemd-hibernate-resume',
1479 'src/hibernate-resume/hibernate-resume.c',
1480 include_directories : includes,
1481 link_with : [libshared],
1482 install_rpath : rootlibexecdir,
1484 install_dir : rootlibexecdir)
1487 if conf.get('HAVE_BLKID') == 1
1488 executable('systemd-gpt-auto-generator',
1489 'src/gpt-auto-generator/gpt-auto-generator.c',
1490 'src/basic/blkid-util.h',
1491 include_directories : includes,
1492 link_with : [libshared],
1493 dependencies : libblkid,
1494 install_rpath : rootlibexecdir,
1496 install_dir : systemgeneratordir)
1498 exe = executable('systemd-dissect',
1499 'src/dissect/dissect.c',
1500 include_directories : includes,
1501 link_with : [libshared],
1502 install_rpath : rootlibexecdir,
1504 install_dir : rootlibexecdir)
1505 public_programs += [exe]
1508 if conf.get('ENABLE_RESOLVE') == 1
1509 executable('systemd-resolved',
1510 systemd_resolved_sources,
1511 gcrypt_util_sources,
1512 include_directories : includes,
1513 link_with : [libshared],
1514 dependencies : [threads,
1519 install_rpath : rootlibexecdir,
1521 install_dir : rootlibexecdir)
1523 exe = executable('systemd-resolve',
1524 systemd_resolve_sources,
1525 gcrypt_util_sources,
1526 include_directories : includes,
1527 link_with : [libshared],
1528 dependencies : [threads,
1533 install_rpath : rootlibexecdir,
1535 public_programs += [exe]
1538 if conf.get('ENABLE_LOGIND') == 1
1539 executable('systemd-logind',
1540 systemd_logind_sources,
1541 include_directories : includes,
1542 link_with : [liblogind_core,
1544 dependencies : [threads,
1546 install_rpath : rootlibexecdir,
1548 install_dir : rootlibexecdir)
1550 exe = executable('loginctl',
1552 include_directories : includes,
1553 link_with : [libshared],
1554 dependencies : [threads,
1557 install_rpath : rootlibexecdir,
1559 install_dir : rootbindir)
1560 public_programs += [exe]
1562 exe = executable('systemd-inhibit',
1563 'src/login/inhibit.c',
1564 include_directories : includes,
1565 link_with : [libshared],
1566 install_rpath : rootlibexecdir,
1568 install_dir : rootbindir)
1569 public_programs += [exe]
1571 if conf.get('HAVE_PAM') == 1
1572 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1573 pam_systemd = shared_library(
1577 include_directories : includes,
1578 link_args : ['-shared',
1579 '-Wl,--version-script=' + version_script_arg],
1580 link_with : [libsystemd_internal,
1582 dependencies : [threads,
1585 link_depends : pam_systemd_sym,
1587 install_dir : pamlibdir)
1589 test('dlopen-pam_systemd',
1591 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1595 if conf.get('HAVE_PAM') == 1
1596 executable('systemd-user-sessions',
1597 'src/user-sessions/user-sessions.c',
1598 include_directories : includes,
1599 link_with : [libshared],
1600 install_rpath : rootlibexecdir,
1602 install_dir : rootlibexecdir)
1605 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1606 exe = executable('bootctl',
1607 'src/boot/bootctl.c',
1608 include_directories : includes,
1609 link_with : [libshared],
1610 dependencies : [libblkid],
1611 install_rpath : rootlibexecdir,
1613 public_programs += [exe]
1616 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1617 include_directories : includes,
1618 link_with : [libshared],
1619 dependencies : [threads],
1620 install_rpath : rootlibexecdir,
1622 public_programs += [exe]
1624 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1625 include_directories : includes,
1626 link_with : [libshared],
1627 dependencies : [threads,
1632 install_rpath : rootlibexecdir,
1634 install_dir : rootbindir)
1635 public_programs += [exe]
1637 if conf.get('ENABLE_BACKLIGHT') == 1
1638 executable('systemd-backlight',
1639 'src/backlight/backlight.c',
1640 include_directories : includes,
1641 link_with : [libshared],
1642 install_rpath : rootlibexecdir,
1644 install_dir : rootlibexecdir)
1647 if conf.get('ENABLE_RFKILL') == 1
1648 executable('systemd-rfkill',
1649 'src/rfkill/rfkill.c',
1650 include_directories : includes,
1651 link_with : [libshared],
1652 install_rpath : rootlibexecdir,
1654 install_dir : rootlibexecdir)
1657 executable('systemd-system-update-generator',
1658 'src/system-update-generator/system-update-generator.c',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 install_rpath : rootlibexecdir,
1663 install_dir : systemgeneratordir)
1665 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1666 executable('systemd-cryptsetup',
1667 'src/cryptsetup/cryptsetup.c',
1668 include_directories : includes,
1669 link_with : [libshared],
1670 dependencies : [libcryptsetup],
1671 install_rpath : rootlibexecdir,
1673 install_dir : rootlibexecdir)
1675 executable('systemd-cryptsetup-generator',
1676 'src/cryptsetup/cryptsetup-generator.c',
1677 include_directories : includes,
1678 link_with : [libshared],
1679 dependencies : [libcryptsetup],
1680 install_rpath : rootlibexecdir,
1682 install_dir : systemgeneratordir)
1684 executable('systemd-veritysetup',
1685 'src/veritysetup/veritysetup.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 dependencies : [libcryptsetup],
1689 install_rpath : rootlibexecdir,
1691 install_dir : rootlibexecdir)
1693 executable('systemd-veritysetup-generator',
1694 'src/veritysetup/veritysetup-generator.c',
1695 include_directories : includes,
1696 link_with : [libshared],
1697 dependencies : [libcryptsetup],
1698 install_rpath : rootlibexecdir,
1700 install_dir : systemgeneratordir)
1703 if conf.get('HAVE_SYSV_COMPAT') == 1
1704 executable('systemd-sysv-generator',
1705 'src/sysv-generator/sysv-generator.c',
1706 include_directories : includes,
1707 link_with : [libshared],
1708 install_rpath : rootlibexecdir,
1710 install_dir : systemgeneratordir)
1712 executable('systemd-rc-local-generator',
1713 'src/rc-local-generator/rc-local-generator.c',
1714 include_directories : includes,
1715 link_with : [libshared],
1716 install_rpath : rootlibexecdir,
1718 install_dir : systemgeneratordir)
1721 if conf.get('ENABLE_HOSTNAMED') == 1
1722 executable('systemd-hostnamed',
1723 'src/hostname/hostnamed.c',
1724 include_directories : includes,
1725 link_with : [libshared],
1726 install_rpath : rootlibexecdir,
1728 install_dir : rootlibexecdir)
1730 exe = executable('hostnamectl',
1731 'src/hostname/hostnamectl.c',
1732 include_directories : includes,
1733 link_with : [libshared],
1734 install_rpath : rootlibexecdir,
1736 public_programs += [exe]
1739 if conf.get('ENABLE_LOCALED') == 1
1740 if conf.get('HAVE_XKBCOMMON') == 1
1741 # logind will load libxkbcommon.so dynamically on its own
1747 executable('systemd-localed',
1748 systemd_localed_sources,
1749 include_directories : includes,
1750 link_with : [libshared],
1751 dependencies : deps,
1752 install_rpath : rootlibexecdir,
1754 install_dir : rootlibexecdir)
1756 exe = executable('localectl',
1758 include_directories : includes,
1759 link_with : [libshared],
1760 install_rpath : rootlibexecdir,
1762 public_programs += [exe]
1765 if conf.get('ENABLE_TIMEDATED') == 1
1766 executable('systemd-timedated',
1767 'src/timedate/timedated.c',
1768 include_directories : includes,
1769 link_with : [libshared],
1770 install_rpath : rootlibexecdir,
1772 install_dir : rootlibexecdir)
1774 exe = executable('timedatectl',
1775 'src/timedate/timedatectl.c',
1776 include_directories : includes,
1777 install_rpath : rootlibexecdir,
1778 link_with : [libshared],
1780 public_programs += [exe]
1783 if conf.get('ENABLE_TIMESYNCD') == 1
1784 executable('systemd-timesyncd',
1785 systemd_timesyncd_sources,
1786 include_directories : includes,
1787 link_with : [libshared],
1788 dependencies : [threads,
1790 install_rpath : rootlibexecdir,
1792 install_dir : rootlibexecdir)
1795 if conf.get('ENABLE_MACHINED') == 1
1796 executable('systemd-machined',
1797 systemd_machined_sources,
1798 include_directories : includes,
1799 link_with : [libmachine_core,
1801 install_rpath : rootlibexecdir,
1803 install_dir : rootlibexecdir)
1805 exe = executable('machinectl',
1806 'src/machine/machinectl.c',
1807 include_directories : includes,
1808 link_with : [libshared],
1809 dependencies : [threads,
1812 install_rpath : rootlibexecdir,
1814 install_dir : rootbindir)
1815 public_programs += [exe]
1818 if conf.get('ENABLE_IMPORTD') == 1
1819 executable('systemd-importd',
1820 systemd_importd_sources,
1821 include_directories : includes,
1822 link_with : [libshared],
1823 dependencies : [threads],
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootlibexecdir)
1828 systemd_pull = executable('systemd-pull',
1829 systemd_pull_sources,
1830 include_directories : includes,
1831 link_with : [libshared],
1832 dependencies : [libcurl,
1837 install_rpath : rootlibexecdir,
1839 install_dir : rootlibexecdir)
1841 systemd_import = executable('systemd-import',
1842 systemd_import_sources,
1843 include_directories : includes,
1844 link_with : [libshared],
1845 dependencies : [libcurl,
1849 install_rpath : rootlibexecdir,
1851 install_dir : rootlibexecdir)
1853 systemd_export = executable('systemd-export',
1854 systemd_export_sources,
1855 include_directories : includes,
1856 link_with : [libshared],
1857 dependencies : [libcurl,
1861 install_rpath : rootlibexecdir,
1863 install_dir : rootlibexecdir)
1864 public_programs += [systemd_pull, systemd_import, systemd_export]
1867 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1868 exe = executable('systemd-journal-upload',
1869 systemd_journal_upload_sources,
1870 include_directories : includes,
1871 link_with : [libshared],
1872 dependencies : [threads,
1877 install_rpath : rootlibexecdir,
1879 install_dir : rootlibexecdir)
1880 public_programs += [exe]
1883 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1884 s_j_remote = executable('systemd-journal-remote',
1885 systemd_journal_remote_sources,
1886 include_directories : includes,
1887 link_with : [libshared],
1888 dependencies : [threads,
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootlibexecdir)
1897 s_j_gatewayd = executable('systemd-journal-gatewayd',
1898 systemd_journal_gatewayd_sources,
1899 include_directories : includes,
1900 link_with : [libshared],
1901 dependencies : [threads,
1906 install_rpath : rootlibexecdir,
1908 install_dir : rootlibexecdir)
1909 public_programs += [s_j_remote, s_j_gatewayd]
1912 if conf.get('ENABLE_COREDUMP') == 1
1913 executable('systemd-coredump',
1914 systemd_coredump_sources,
1915 include_directories : includes,
1916 link_with : [libshared],
1917 dependencies : [threads,
1922 install_rpath : rootlibexecdir,
1924 install_dir : rootlibexecdir)
1926 exe = executable('coredumpctl',
1927 coredumpctl_sources,
1928 include_directories : includes,
1929 link_with : [libshared],
1930 dependencies : [threads,
1933 install_rpath : rootlibexecdir,
1935 public_programs += [exe]
1938 if conf.get('ENABLE_BINFMT') == 1
1939 exe = executable('systemd-binfmt',
1940 'src/binfmt/binfmt.c',
1941 include_directories : includes,
1942 link_with : [libshared],
1943 install_rpath : rootlibexecdir,
1945 install_dir : rootlibexecdir)
1946 public_programs += [exe]
1948 meson.add_install_script('sh', '-c',
1949 mkdir_p.format(binfmtdir))
1950 meson.add_install_script('sh', '-c',
1951 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1954 if conf.get('ENABLE_VCONSOLE') == 1
1955 executable('systemd-vconsole-setup',
1956 'src/vconsole/vconsole-setup.c',
1957 include_directories : includes,
1958 link_with : [libshared],
1959 install_rpath : rootlibexecdir,
1961 install_dir : rootlibexecdir)
1964 if conf.get('ENABLE_RANDOMSEED') == 1
1965 executable('systemd-random-seed',
1966 'src/random-seed/random-seed.c',
1967 include_directories : includes,
1968 link_with : [libshared],
1969 install_rpath : rootlibexecdir,
1971 install_dir : rootlibexecdir)
1974 if conf.get('ENABLE_FIRSTBOOT') == 1
1975 executable('systemd-firstboot',
1976 'src/firstboot/firstboot.c',
1977 include_directories : includes,
1978 link_with : [libshared],
1979 dependencies : [libcrypt],
1980 install_rpath : rootlibexecdir,
1982 install_dir : rootbindir)
1985 executable('systemd-remount-fs',
1986 'src/remount-fs/remount-fs.c',
1987 'src/core/mount-setup.c',
1988 'src/core/mount-setup.h',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 install_rpath : rootlibexecdir,
1993 install_dir : rootlibexecdir)
1995 executable('systemd-machine-id-setup',
1996 'src/machine-id-setup/machine-id-setup-main.c',
1997 'src/core/machine-id-setup.c',
1998 'src/core/machine-id-setup.h',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 install_rpath : rootlibexecdir,
2003 install_dir : rootbindir)
2005 executable('systemd-fsck',
2007 include_directories : includes,
2008 link_with : [libshared],
2009 install_rpath : rootlibexecdir,
2011 install_dir : rootlibexecdir)
2013 executable('systemd-growfs',
2014 'src/partition/growfs.c',
2015 include_directories : includes,
2016 link_with : [libshared],
2017 dependencies : [libcryptsetup],
2018 install_rpath : rootlibexecdir,
2020 install_dir : rootlibexecdir)
2022 executable('systemd-makefs',
2023 'src/partition/makefs.c',
2024 include_directories : includes,
2025 link_with : [libshared],
2026 install_rpath : rootlibexecdir,
2028 install_dir : rootlibexecdir)
2030 executable('systemd-sleep',
2031 'src/sleep/sleep.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 install_rpath : rootlibexecdir,
2036 install_dir : rootlibexecdir)
2038 exe = executable('systemd-sysctl',
2039 'src/sysctl/sysctl.c',
2040 include_directories : includes,
2041 link_with : [libshared],
2042 install_rpath : rootlibexecdir,
2044 install_dir : rootlibexecdir)
2045 public_programs += [exe]
2047 executable('systemd-ac-power',
2048 'src/ac-power/ac-power.c',
2049 include_directories : includes,
2050 link_with : [libshared],
2051 install_rpath : rootlibexecdir,
2053 install_dir : rootlibexecdir)
2055 exe = executable('systemd-detect-virt',
2056 'src/detect-virt/detect-virt.c',
2057 include_directories : includes,
2058 link_with : [libshared],
2059 install_rpath : rootlibexecdir,
2061 public_programs += [exe]
2063 exe = executable('systemd-delta',
2064 'src/delta/delta.c',
2065 include_directories : includes,
2066 link_with : [libshared],
2067 install_rpath : rootlibexecdir,
2069 public_programs += [exe]
2071 exe = executable('systemd-escape',
2072 'src/escape/escape.c',
2073 include_directories : includes,
2074 link_with : [libshared],
2075 install_rpath : rootlibexecdir,
2077 install_dir : rootbindir)
2078 public_programs += [exe]
2080 exe = executable('systemd-notify',
2081 'src/notify/notify.c',
2082 include_directories : includes,
2083 link_with : [libshared],
2084 install_rpath : rootlibexecdir,
2086 install_dir : rootbindir)
2087 public_programs += [exe]
2089 executable('systemd-volatile-root',
2090 'src/volatile-root/volatile-root.c',
2091 include_directories : includes,
2092 link_with : [libshared],
2093 install_rpath : rootlibexecdir,
2095 install_dir : rootlibexecdir)
2097 executable('systemd-cgroups-agent',
2098 'src/cgroups-agent/cgroups-agent.c',
2099 include_directories : includes,
2100 link_with : [libshared],
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootlibexecdir)
2105 exe = executable('systemd-path',
2107 include_directories : includes,
2108 link_with : [libshared],
2109 install_rpath : rootlibexecdir,
2111 public_programs += [exe]
2113 exe = executable('systemd-ask-password',
2114 'src/ask-password/ask-password.c',
2115 include_directories : includes,
2116 link_with : [libshared],
2117 install_rpath : rootlibexecdir,
2119 install_dir : rootbindir)
2120 public_programs += [exe]
2122 executable('systemd-reply-password',
2123 'src/reply-password/reply-password.c',
2124 include_directories : includes,
2125 link_with : [libshared],
2126 install_rpath : rootlibexecdir,
2128 install_dir : rootlibexecdir)
2130 exe = executable('systemd-tty-ask-password-agent',
2131 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2132 include_directories : includes,
2133 link_with : [libshared],
2134 install_rpath : rootlibexecdir,
2136 install_dir : rootbindir)
2137 public_programs += [exe]
2139 exe = executable('systemd-cgls',
2141 include_directories : includes,
2142 link_with : [libshared],
2143 install_rpath : rootlibexecdir,
2145 public_programs += [exe]
2147 exe = executable('systemd-cgtop',
2148 'src/cgtop/cgtop.c',
2149 include_directories : includes,
2150 link_with : [libshared],
2151 install_rpath : rootlibexecdir,
2153 public_programs += [exe]
2155 executable('systemd-initctl',
2156 'src/initctl/initctl.c',
2157 include_directories : includes,
2158 link_with : [libshared],
2159 install_rpath : rootlibexecdir,
2161 install_dir : rootlibexecdir)
2163 exe = executable('systemd-mount',
2164 'src/mount/mount-tool.c',
2165 include_directories : includes,
2166 link_with : [libshared],
2167 install_rpath : rootlibexecdir,
2169 public_programs += [exe]
2171 meson.add_install_script(meson_make_symlink,
2172 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2174 exe = executable('systemd-run',
2176 include_directories : includes,
2177 link_with : [libshared],
2178 install_rpath : rootlibexecdir,
2180 public_programs += [exe]
2182 exe = executable('systemd-stdio-bridge',
2183 'src/stdio-bridge/stdio-bridge.c',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 install_rpath : rootlibexecdir,
2188 public_programs += [exe]
2190 exe = executable('busctl',
2191 'src/busctl/busctl.c',
2192 'src/busctl/busctl-introspect.c',
2193 'src/busctl/busctl-introspect.h',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 install_rpath : rootlibexecdir,
2198 public_programs += [exe]
2200 if conf.get('ENABLE_SYSUSERS') == 1
2201 exe = executable('systemd-sysusers',
2202 'src/sysusers/sysusers.c',
2203 include_directories : includes,
2204 link_with : [libshared],
2205 install_rpath : rootlibexecdir,
2207 install_dir : rootbindir)
2208 public_programs += [exe]
2211 if conf.get('ENABLE_TMPFILES') == 1
2212 exe = executable('systemd-tmpfiles',
2213 'src/tmpfiles/tmpfiles.c',
2214 include_directories : includes,
2215 link_with : [libshared],
2216 dependencies : [libacl],
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootbindir)
2220 public_programs += [exe]
2222 test('test-systemd-tmpfiles',
2223 test_systemd_tmpfiles_py,
2224 args : exe.full_path())
2225 # https://github.com/mesonbuild/meson/issues/2681
2228 if conf.get('ENABLE_HWDB') == 1
2229 exe = executable('systemd-hwdb',
2231 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2232 include_directories : includes,
2233 link_with : [libudev_internal],
2234 install_rpath : udev_rpath,
2236 install_dir : rootbindir)
2237 public_programs += [exe]
2240 if conf.get('ENABLE_QUOTACHECK') == 1
2241 executable('systemd-quotacheck',
2242 'src/quotacheck/quotacheck.c',
2243 include_directories : includes,
2244 link_with : [libshared],
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootlibexecdir)
2250 exe = executable('systemd-socket-proxyd',
2251 'src/socket-proxy/socket-proxyd.c',
2252 include_directories : includes,
2253 link_with : [libshared],
2254 dependencies : [threads],
2255 install_rpath : rootlibexecdir,
2257 install_dir : rootlibexecdir)
2258 public_programs += [exe]
2260 exe = executable('systemd-udevd',
2261 systemd_udevd_sources,
2262 include_directories : includes,
2263 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2264 link_with : [libudev_core,
2267 dependencies : [threads,
2272 install_rpath : udev_rpath,
2274 install_dir : rootlibexecdir)
2275 public_programs += [exe]
2277 exe = executable('udevadm',
2279 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2280 include_directories : includes,
2281 link_with : [libudev_core,
2284 dependencies : [threads,
2289 install_rpath : udev_rpath,
2291 install_dir : rootbindir)
2292 public_programs += [exe]
2294 executable('systemd-shutdown',
2295 systemd_shutdown_sources,
2296 include_directories : includes,
2297 link_with : [libshared],
2298 install_rpath : rootlibexecdir,
2300 install_dir : rootlibexecdir)
2302 executable('systemd-update-done',
2303 'src/update-done/update-done.c',
2304 include_directories : includes,
2305 link_with : [libshared],
2306 install_rpath : rootlibexecdir,
2308 install_dir : rootlibexecdir)
2310 executable('systemd-update-utmp',
2311 'src/update-utmp/update-utmp.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 dependencies : [libaudit],
2315 install_rpath : rootlibexecdir,
2317 install_dir : rootlibexecdir)
2319 if conf.get('HAVE_KMOD') == 1
2320 executable('systemd-modules-load',
2321 'src/modules-load/modules-load.c',
2322 include_directories : includes,
2323 link_with : [libshared],
2324 dependencies : [libkmod],
2325 install_rpath : rootlibexecdir,
2327 install_dir : rootlibexecdir)
2329 meson.add_install_script('sh', '-c',
2330 mkdir_p.format(modulesloaddir))
2331 meson.add_install_script('sh', '-c',
2332 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2335 exe = executable('systemd-nspawn',
2336 systemd_nspawn_sources,
2337 'src/core/mount-setup.c', # FIXME: use a variable?
2338 'src/core/mount-setup.h',
2339 'src/core/loopback-setup.c',
2340 'src/core/loopback-setup.h',
2341 include_directories : [includes, include_directories('src/nspawn')],
2342 link_with : [libshared],
2343 dependencies : [libacl,
2347 install_rpath : rootlibexecdir,
2349 public_programs += [exe]
2351 if conf.get('ENABLE_NETWORKD') == 1
2352 executable('systemd-networkd',
2353 systemd_networkd_sources,
2354 include_directories : includes,
2355 link_with : [libnetworkd_core,
2359 dependencies : [threads],
2360 install_rpath : rootlibexecdir,
2362 install_dir : rootlibexecdir)
2364 executable('systemd-networkd-wait-online',
2365 systemd_networkd_wait_online_sources,
2366 include_directories : includes,
2367 link_with : [libnetworkd_core,
2369 install_rpath : rootlibexecdir,
2371 install_dir : rootlibexecdir)
2373 exe = executable('networkctl',
2375 include_directories : includes,
2376 link_with : [libsystemd_network,
2378 install_rpath : rootlibexecdir,
2380 install_dir : rootbindir)
2381 public_programs += [exe]
2384 executable('systemd-sulogin-shell',
2385 ['src/sulogin-shell/sulogin-shell.c'],
2386 include_directories : includes,
2387 link_with : [libshared],
2388 install_rpath : rootlibexecdir,
2390 install_dir : rootlibexecdir)
2392 ############################################################
2394 foreach tuple : tests
2396 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2397 dependencies = tuple[2]
2398 condition = tuple.length() >= 4 ? tuple[3] : ''
2399 type = tuple.length() >= 5 ? tuple[4] : ''
2400 defs = tuple.length() >= 6 ? tuple[5] : []
2401 incs = tuple.length() >= 7 ? tuple[6] : includes
2404 name = sources[0].split('/')[-1].split('.')[0]
2405 if type.startswith('timeout=')
2406 timeout = type.split('=')[1].to_int()
2410 if condition == '' or conf.get(condition) == 1
2414 include_directories : incs,
2415 link_with : link_with,
2416 dependencies : dependencies,
2418 install_rpath : rootlibexecdir,
2419 install : install_tests,
2420 install_dir : join_paths(testsdir, type))
2423 message('@0@ is a manual test'.format(name))
2424 elif type == 'unsafe' and want_tests != 'unsafe'
2425 message('@0@ is an unsafe test'.format(name))
2432 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2436 test_libsystemd_sym = executable(
2437 'test-libsystemd-sym',
2438 test_libsystemd_sym_c,
2439 include_directories : includes,
2440 link_with : [libsystemd],
2441 install : install_tests,
2442 install_dir : testsdir)
2443 test('test-libsystemd-sym',
2444 test_libsystemd_sym)
2446 test_libudev_sym = executable(
2449 include_directories : includes,
2450 c_args : ['-Wno-deprecated-declarations'],
2451 link_with : [libudev],
2452 install : install_tests,
2453 install_dir : testsdir)
2454 test('test-libudev-sym',
2457 ############################################################
2459 make_directive_index_py = find_program('tools/make-directive-index.py')
2460 make_man_index_py = find_program('tools/make-man-index.py')
2461 xml_helper_py = find_program('tools/xml_helper.py')
2462 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2466 subdir('sysusers.d')
2467 subdir('tmpfiles.d')
2472 subdir('shell-completion/bash')
2473 subdir('shell-completion/zsh')
2474 subdir('docs/sysvinit')
2475 subdir('docs/var-log')
2477 # FIXME: figure out if the warning is true:
2478 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2479 install_subdir('factory/etc',
2480 install_dir : factorydir)
2483 install_data('xorg/50-systemd-user.sh',
2484 install_dir : xinitrcdir)
2485 install_data('modprobe.d/systemd.conf',
2486 install_dir : modprobedir)
2487 install_data('README',
2494 'TRANSIENT-SETTINGS.md',
2496 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2497 install_dir : docdir)
2499 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2500 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2502 ############################################################
2504 meson_check_help = find_program('tools/meson-check-help.sh')
2506 foreach exec : public_programs
2507 name = exec.full_path().split('/')[-1]
2508 test('check-help-' + name,
2510 args : [exec.full_path()])
2513 ############################################################
2516 all_files = run_command(
2518 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2521 all_files = files(all_files.stdout().split())
2526 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2530 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2534 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2537 command : [meson_git_contrib_sh])
2541 git_head = run_command(
2543 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2544 'rev-parse', 'HEAD']).stdout().strip()
2545 git_head_short = run_command(
2547 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2548 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2552 command : ['git', 'archive',
2553 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2555 '--prefix', 'systemd-@0@/'.format(git_head),
2559 ############################################################
2562 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2564 'prefix directory: @0@'.format(prefixdir),
2565 'rootprefix directory: @0@'.format(rootprefixdir),
2566 'sysconf directory: @0@'.format(sysconfdir),
2567 'include directory: @0@'.format(includedir),
2568 'lib directory: @0@'.format(libdir),
2569 'rootlib directory: @0@'.format(rootlibdir),
2570 'SysV init scripts: @0@'.format(sysvinit_path),
2571 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2572 'PAM modules directory: @0@'.format(pamlibdir),
2573 'PAM configuration directory: @0@'.format(pamconfdir),
2574 'RPM macros directory: @0@'.format(rpmmacrosdir),
2575 'modprobe.d directory: @0@'.format(modprobedir),
2576 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2577 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2578 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2579 'bash completions directory: @0@'.format(bashcompletiondir),
2580 'zsh completions directory: @0@'.format(zshcompletiondir),
2581 'extra start script: @0@'.format(get_option('rc-local')),
2582 'extra stop script: @0@'.format(get_option('halt-local')),
2583 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2584 get_option('debug-tty')),
2585 'TTY GID: @0@'.format(tty_gid),
2586 'users GID: @0@'.format(users_gid),
2587 'maximum system UID: @0@'.format(system_uid_max),
2588 'maximum system GID: @0@'.format(system_gid_max),
2589 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2590 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2591 'minimum container UID base: @0@'.format(container_uid_base_min),
2592 'maximum container UID base: @0@'.format(container_uid_base_max),
2593 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2594 'render group access mode: @0@'.format(get_option('group-render-mode')),
2595 'certificate root directory: @0@'.format(get_option('certificate-root')),
2596 'support URL: @0@'.format(support_url),
2597 'nobody user name: @0@'.format(nobody_user),
2598 'nobody group name: @0@'.format(nobody_group),
2599 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2600 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2602 'default DNSSEC mode: @0@'.format(default_dnssec),
2603 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2604 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2606 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2607 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2609 'default DNS servers: @0@'.format(alt_dns_servers),
2610 'default NTP servers: @0@'.format(alt_ntp_servers)]
2612 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2613 '@@0@'.format(time_epoch)).stdout().strip()
2615 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2618 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2619 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2620 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2622 if conf.get('ENABLE_EFI') == 1
2624 'efi arch: @0@'.format(efi_arch)]
2628 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2629 'EFI CC @0@'.format(efi_cc),
2630 'EFI lib directory: @0@'.format(efi_libdir),
2631 'EFI lds directory: @0@'.format(efi_ldsdir),
2632 'EFI include directory: @0@'.format(efi_incdir)]
2685 ['legacy pkla', install_polkit_pkla],
2687 ['gnu-efi', have_gnu_efi],
2693 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2696 ['man pages', want_man],
2697 ['html pages', want_html],
2698 ['man page indices', want_man and have_lxml],
2699 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2704 ['adm group', get_option('adm-group')],
2705 ['wheel group', get_option('wheel-group')],
2708 ['debug mmap cache'],
2711 cond = tuple.get(1, '')
2713 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2714 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2715 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2720 missing += [tuple[0]]
2726 'enabled features: @0@'.format(', '.join(found)),
2728 'disabled features: @0@'.format(', '.join(missing)),
2730 message('\n '.join(status))
2732 if rootprefixdir != rootprefix_default
2733 message('WARNING:\n' +
2734 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2735 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2736 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))