1 # SPDX-License-Identifier: LGPL-2.1+
3 # Copyright 2017 Zbigniew Jędrzejewski-Szmek
5 # systemd is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU Lesser General Public License as published by
7 # the Free Software Foundation; either version 2.1 of the License, or
8 # (at your option) any later version.
10 # systemd is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public License
16 # along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 project('systemd', 'c',
27 meson_version : '>= 0.41',
30 libsystemd_version = '0.19.1'
31 libudev_version = '1.6.7'
33 # We need the same data in three different formats, ugh!
34 # Also, for hysterical reasons, we use different variable
35 # names, sometimes. Not all variables are included in every
37 conf = configuration_data()
38 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
39 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
41 substs = configuration_data()
42 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
43 substs.set('PACKAGE_VERSION', meson.project_version())
47 #####################################################################
49 # Try to install the git pre-commit hook
50 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
51 if git_hook.returncode() == 0
52 message(git_hook.stdout().strip())
55 #####################################################################
57 split_usr = get_option('split-usr')
58 conf.set10('HAVE_SPLIT_USR', split_usr)
60 rootprefixdir = get_option('rootprefix')
61 # Unusual rootprefixdir values are used by some distros
62 # (see https://github.com/systemd/systemd/pull/7461).
63 rootprefix_default = get_option('split-usr') ? '/' : '/usr'
64 if rootprefixdir == ''
65 rootprefixdir = rootprefix_default
68 sysvinit_path = get_option('sysvinit-path')
69 sysvrcnd_path = get_option('sysvrcnd-path')
70 have = sysvinit_path != '' or sysvrcnd_path != ''
71 conf.set10('HAVE_SYSV_COMPAT', have,
72 description : 'SysV init scripts and rcN.d links are supported')
73 m4_defines += have ? ['-DHAVE_SYSV_COMPAT'] : []
75 # join_paths ignore the preceding arguments if an absolute component is
76 # encountered, so this should canonicalize various paths when they are
77 # absolute or relative.
78 prefixdir = get_option('prefix')
79 if not prefixdir.startswith('/')
80 error('Prefix is not absolute: "@0@"'.format(prefixdir))
82 bindir = join_paths(prefixdir, get_option('bindir'))
83 libdir = join_paths(prefixdir, get_option('libdir'))
84 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
85 includedir = join_paths(prefixdir, get_option('includedir'))
86 datadir = join_paths(prefixdir, get_option('datadir'))
87 localstatedir = join_paths('/', get_option('localstatedir'))
89 rootbindir = join_paths(rootprefixdir, 'bin')
90 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
92 rootlibdir = get_option('rootlibdir')
94 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
97 # Dirs of external packages
98 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
99 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
100 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
101 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
102 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
103 varlogdir = join_paths(localstatedir, 'log')
104 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
105 rpmmacrosdir = get_option('rpmmacrosdir')
106 if rpmmacrosdir != 'no'
107 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
109 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
112 pkgdatadir = join_paths(datadir, 'systemd')
113 environmentdir = join_paths(prefixdir, 'lib/environment.d')
114 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
115 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
116 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
117 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
118 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
119 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
120 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
121 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
122 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
123 pkgincludedir = join_paths(includedir, 'systemd')
124 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
125 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
126 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
127 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
128 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
129 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
130 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
131 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
132 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
133 udevhomedir = udevlibexecdir
134 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
135 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
136 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
137 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
138 factorydir = join_paths(datadir, 'factory')
139 docdir = join_paths(datadir, 'doc/systemd')
140 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
141 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
142 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
143 catalogstatedir = join_paths(systemdstatedir, 'catalog')
144 randomseeddir = join_paths(localstatedir, 'lib/systemd')
146 dbuspolicydir = get_option('dbuspolicydir')
147 if dbuspolicydir == ''
148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
151 dbussessionservicedir = get_option('dbussessionservicedir')
152 if dbussessionservicedir == ''
153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
156 dbussystemservicedir = get_option('dbussystemservicedir')
157 if dbussystemservicedir == ''
158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
161 pamlibdir = get_option('pamlibdir')
163 pamlibdir = join_paths(rootlibdir, 'security')
166 pamconfdir = get_option('pamconfdir')
168 pamconfdir = join_paths(sysconfdir, 'pam.d')
171 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
172 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
173 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
174 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
175 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
176 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
177 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
178 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
179 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
180 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
181 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
182 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
183 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
184 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
185 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
186 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
187 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
188 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
189 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
190 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
191 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
192 conf.set_quoted('ROOTPREFIX', rootprefixdir)
193 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
194 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
195 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
196 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
197 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
198 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
199 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
200 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
201 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
202 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
203 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
204 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
205 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
206 conf.set_quoted('LIBDIR', libdir)
207 conf.set_quoted('ROOTLIBDIR', rootlibdir)
208 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
209 conf.set_quoted('BOOTLIBDIR', bootlibdir)
210 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
211 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
212 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
213 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
214 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
215 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
217 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
218 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
220 substs.set('prefix', prefixdir)
221 substs.set('exec_prefix', prefixdir)
222 substs.set('libdir', libdir)
223 substs.set('rootlibdir', rootlibdir)
224 substs.set('includedir', includedir)
225 substs.set('pkgsysconfdir', pkgsysconfdir)
226 substs.set('bindir', bindir)
227 substs.set('rootbindir', rootbindir)
228 substs.set('rootlibexecdir', rootlibexecdir)
229 substs.set('systemunitdir', systemunitdir)
230 substs.set('userunitdir', userunitdir)
231 substs.set('systempresetdir', systempresetdir)
232 substs.set('userpresetdir', userpresetdir)
233 substs.set('udevhwdbdir', udevhwdbdir)
234 substs.set('udevrulesdir', udevrulesdir)
235 substs.set('udevlibexecdir', udevlibexecdir)
236 substs.set('catalogdir', catalogdir)
237 substs.set('tmpfilesdir', tmpfilesdir)
238 substs.set('sysusersdir', sysusersdir)
239 substs.set('sysctldir', sysctldir)
240 substs.set('binfmtdir', binfmtdir)
241 substs.set('modulesloaddir', modulesloaddir)
242 substs.set('systemgeneratordir', systemgeneratordir)
243 substs.set('usergeneratordir', usergeneratordir)
244 substs.set('systemenvgeneratordir', systemenvgeneratordir)
245 substs.set('userenvgeneratordir', userenvgeneratordir)
246 substs.set('systemshutdowndir', systemshutdowndir)
247 substs.set('systemsleepdir', systemsleepdir)
248 substs.set('VARLOGDIR', varlogdir)
249 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
250 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
251 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
252 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
253 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
254 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
255 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
257 #####################################################################
259 cc = meson.get_compiler('c')
260 pkgconfig = import('pkgconfig')
261 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
263 cxx = find_program('c++', required : false)
265 # Used only for tests
269 foreach arg : ['-Wextra',
272 '-Wmissing-include-dirs',
273 '-Wold-style-definition',
276 '-Wdeclaration-after-statement',
278 '-Wsuggest-attribute=noreturn',
279 '-Werror=missing-prototypes',
280 '-Werror=implicit-function-declaration',
281 '-Werror=missing-declarations',
282 '-Werror=return-type',
283 '-Werror=incompatible-pointer-types',
285 '-Wstrict-prototypes',
287 '-Wmissing-noreturn',
288 '-Wimplicit-fallthrough=5',
291 '-Wstrict-aliasing=2',
298 '-fdiagnostics-show-option',
299 '-fno-strict-aliasing',
300 '-fvisibility=hidden',
302 '-fstack-protector-strong',
304 '--param=ssp-buffer-size=4',
306 if cc.has_argument(arg)
307 add_project_arguments(arg, language : 'c')
311 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
312 # arguments, just emits a warnings. So test for the "positive" version instead.
313 foreach arg : ['unused-parameter',
314 'missing-field-initializers',
317 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
319 if cc.has_argument('-W' + arg)
320 add_project_arguments('-Wno-' + arg, language : 'c')
326 #include <inttypes.h>
327 typedef uint64_t usec_t;
328 usec_t now(clockid_t clock);
333 ', name : '-Werror=shadow with local shadowing')
334 add_project_arguments('-Werror=shadow', language : 'c')
337 if cc.get_id() == 'clang'
338 foreach arg : ['-Wno-typedef-redefinition',
339 '-Wno-gnu-variable-sized-type-not-at-end',
341 if cc.has_argument(arg,
342 name : '@0@ is supported'.format(arg))
343 add_project_arguments(arg, language : 'c')
348 link_test_c = files('tools/meson-link-test.c')
350 # --as-needed and --no-undefined are provided by meson by default,
351 # run mesonconf to see what is enabled
352 foreach arg : ['-Wl,-z,relro',
357 have = run_command(check_compilation_sh,
358 cc.cmd_array(), '-x', 'c', arg,
359 '-include', link_test_c).returncode() == 0
360 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
362 add_project_link_arguments(arg, language : 'c')
366 if get_option('buildtype') != 'debug'
367 foreach arg : ['-ffunction-sections',
369 if cc.has_argument(arg,
370 name : '@0@ is supported'.format(arg))
371 add_project_arguments(arg, language : 'c')
375 foreach arg : ['-Wl,--gc-sections']
376 have = run_command(check_compilation_sh,
377 cc.cmd_array(), '-x', 'c', arg,
378 '-include', link_test_c).returncode() == 0
379 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
381 add_project_link_arguments(arg, language : 'c')
386 cpp = ' '.join(cc.cmd_array()) + ' -E'
388 #####################################################################
389 # compilation result tests
391 conf.set('_GNU_SOURCE', true)
392 conf.set('__SANE_USERSPACE_TYPES__', true)
394 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
395 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
396 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
397 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
398 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
399 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
400 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
404 #include <linux/ethtool.h>
405 #include <linux/fib_rules.h>
407 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
409 foreach decl : ['char16_t',
412 'struct ethtool_link_settings',
413 'struct fib_rule_uid_range',
416 # We get -1 if the size cannot be determined
417 have = cc.sizeof(decl, prefix : decl_headers) > 0
418 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
421 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
422 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
423 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
424 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
425 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
426 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
427 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
428 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
429 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
430 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
431 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
432 # if_tunnel.h is buggy and cannot be included on its own
433 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
434 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
435 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
436 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
437 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
438 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
439 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
440 ['NDA_IFINDEX', 'linux/neighbour.h'],
441 ['IFA_FLAGS', 'linux/if_addr.h'],
442 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
443 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
444 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
446 prefix = decl.length() > 2 ? decl[2] : ''
447 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
448 conf.set10('HAVE_' + decl[0], have)
451 foreach ident : ['secure_getenv', '__secure_getenv']
452 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
456 ['memfd_create', '''#define _GNU_SOURCE
457 #include <sys/mman.h>'''],
458 ['gettid', '''#include <sys/types.h>'''],
459 ['pivot_root', '''#include <stdlib.h>'''], # no known header declares pivot_root
460 ['name_to_handle_at', '''#define _GNU_SOURCE
461 #include <sys/types.h>
462 #include <sys/stat.h>
463 #include <fcntl.h>'''],
464 ['setns', '''#define _GNU_SOURCE
465 #include <sched.h>'''],
466 ['renameat2', '''#include <stdio.h>'''],
467 ['kcmp', '''#include <linux/kcmp.h>'''],
468 ['keyctl', '''#include <sys/types.h>
469 #include <keyutils.h>'''],
470 ['copy_file_range', '''#include <sys/syscall.h>
471 #include <unistd.h>'''],
472 ['bpf', '''#include <sys/syscall.h>
473 #include <unistd.h>'''],
474 ['explicit_bzero' , '''#include <string.h>'''],
477 have = cc.has_function(ident[0], prefix : ident[1])
478 conf.set10('HAVE_' + ident[0].to_upper(), have)
481 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''')
482 conf.set10('USE_SYS_RANDOM_H', true)
483 conf.set10('HAVE_GETRANDOM', true)
485 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
486 conf.set10('USE_SYS_RANDOM_H', false)
487 conf.set10('HAVE_GETRANDOM', have)
490 #####################################################################
492 sed = find_program('sed')
493 awk = find_program('awk')
494 m4 = find_program('m4')
495 stat = find_program('stat')
496 git = find_program('git', required : false)
498 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
499 mkdir_p = 'mkdir -p $DESTDIR/@0@'
500 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
501 splash_bmp = files('test/splash.bmp')
503 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
504 # /usr/sbin, /sbin, and fall back to the default from middle column.
505 progs = [['telinit', '/lib/sysvinit/telinit'],
506 ['quotaon', '/usr/sbin/quotaon' ],
507 ['quotacheck', '/usr/sbin/quotacheck' ],
508 ['kill', '/usr/bin/kill' ],
509 ['kmod', '/usr/bin/kmod' ],
510 ['kexec', '/usr/sbin/kexec' ],
511 ['sulogin', '/usr/sbin/sulogin' ],
512 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
513 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
514 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
515 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
518 path = get_option(prog[0] + '-path')
520 message('Using @1@ for @0@'.format(prog[0], path))
522 exe = find_program(prog[0],
523 '/usr/sbin/' + prog[0],
526 path = exe.found() ? exe.path() : prog[1]
528 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
529 conf.set_quoted(name, path)
530 substs.set(name, path)
533 if run_command('ln', '--relative', '--help').returncode() != 0
534 error('ln does not support --relative')
537 ############################################################
539 gperf = find_program('gperf')
541 gperf_test_format = '''
543 const char * in_word_set(const char *, @0@);
546 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
547 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
548 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
549 if cc.compiles(gperf_test)
550 gperf_len_type = 'size_t'
552 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
553 if cc.compiles(gperf_test)
554 gperf_len_type = 'unsigned'
556 error('unable to determine gperf len type')
559 message('gperf len type is @0@'.format(gperf_len_type))
560 conf.set('GPERF_LEN_TYPE', gperf_len_type,
561 description : 'The type of gperf "len" parameter')
563 ############################################################
565 if not cc.has_header('sys/capability.h')
566 error('POSIX caps headers not found')
568 foreach header : ['linux/btrfs.h',
570 'linux/vm_sockets.h',
572 'valgrind/memcheck.h',
573 'valgrind/valgrind.h',
576 conf.set10('HAVE_' + header.underscorify().to_upper(),
577 cc.has_header(header))
580 ############################################################
582 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
583 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
584 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
586 default_hierarchy = get_option('default-hierarchy')
587 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
588 description : 'default cgroup hierarchy as string')
589 if default_hierarchy == 'legacy'
590 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
591 elif default_hierarchy == 'hybrid'
592 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
594 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
597 time_epoch = get_option('time-epoch')
600 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
602 time_epoch = time_epoch.to_int()
603 conf.set('TIME_EPOCH', time_epoch)
605 system_uid_max = get_option('system-uid-max')
606 if system_uid_max == ''
607 system_uid_max = run_command(
609 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
610 '/etc/login.defs').stdout()
612 system_uid_max = system_uid_max.to_int()
613 conf.set('SYSTEM_UID_MAX', system_uid_max)
614 substs.set('systemuidmax', system_uid_max)
615 message('maximum system UID is @0@'.format(system_uid_max))
617 conf.set_quoted('NOBODY_USER_NAME', get_option('nobody-user'))
618 conf.set_quoted('NOBODY_GROUP_NAME', get_option('nobody-group'))
620 system_gid_max = get_option('system-gid-max')
621 if system_gid_max == ''
622 system_gid_max = run_command(
624 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
625 '/etc/login.defs').stdout()
627 system_gid_max = system_gid_max.to_int()
628 conf.set('SYSTEM_GID_MAX', system_gid_max)
629 substs.set('systemgidmax', system_gid_max)
630 message('maximum system GID is @0@'.format(system_gid_max))
632 tty_gid = get_option('tty-gid')
633 conf.set('TTY_GID', tty_gid)
634 substs.set('TTY_GID', tty_gid)
636 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
637 if get_option('users-gid') != ''
638 users_gid = get_option('users-gid').to_int()
642 substs.set('USERS_GID', users_gid)
644 if get_option('adm-group')
645 m4_defines += ['-DENABLE_ADM_GROUP']
648 if get_option('wheel-group')
649 m4_defines += ['-DENABLE_WHEEL_GROUP']
652 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
653 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
655 kill_user_processes = get_option('default-kill-user-processes')
656 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
657 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
659 dns_servers = get_option('dns-servers')
660 conf.set_quoted('DNS_SERVERS', dns_servers)
661 substs.set('DNS_SERVERS', dns_servers)
663 ntp_servers = get_option('ntp-servers')
664 conf.set_quoted('NTP_SERVERS', ntp_servers)
665 substs.set('NTP_SERVERS', ntp_servers)
667 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
669 substs.set('SUSHELL', get_option('debug-shell'))
670 substs.set('DEBUGTTY', get_option('debug-tty'))
672 debug = get_option('debug')
673 enable_debug_hashmap = false
674 enable_debug_mmap_cache = false
676 foreach name : debug.split(',')
678 enable_debug_hashmap = true
679 elif name == 'mmap-cache'
680 enable_debug_mmap_cache = true
682 message('unknown debug option "@0@", ignoring'.format(name))
686 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
687 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
689 #####################################################################
691 threads = dependency('threads')
692 librt = cc.find_library('rt')
693 libm = cc.find_library('m')
694 libdl = cc.find_library('dl')
695 libcrypt = cc.find_library('crypt')
697 libcap = dependency('libcap', required : false)
698 if not libcap.found()
699 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
700 libcap = cc.find_library('cap')
703 libmount = dependency('mount',
706 want_seccomp = get_option('seccomp')
707 if want_seccomp != 'false'
708 libseccomp = dependency('libseccomp',
709 version : '>= 2.3.1',
710 required : want_seccomp == 'true')
711 have = libseccomp.found()
716 conf.set10('HAVE_SECCOMP', have)
717 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
719 want_selinux = get_option('selinux')
720 if want_selinux != 'false'
721 libselinux = dependency('libselinux',
722 version : '>= 2.1.9',
723 required : want_selinux == 'true')
724 have = libselinux.found()
729 conf.set10('HAVE_SELINUX', have)
730 m4_defines += have ? ['-DHAVE_SELINUX'] : []
732 want_apparmor = get_option('apparmor')
733 if want_apparmor != 'false'
734 libapparmor = dependency('libapparmor',
735 required : want_apparmor == 'true')
736 have = libapparmor.found()
741 conf.set10('HAVE_APPARMOR', have)
742 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
744 smack_run_label = get_option('smack-run-label')
745 if smack_run_label != ''
746 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
747 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
750 want_polkit = get_option('polkit')
751 install_polkit = false
752 install_polkit_pkla = false
753 if want_polkit != 'false'
754 install_polkit = true
756 libpolkit = dependency('polkit-gobject-1',
758 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
759 message('Old polkit detected, will install pkla files')
760 install_polkit_pkla = true
763 conf.set10('ENABLE_POLKIT', install_polkit)
765 want_acl = get_option('acl')
766 if want_acl != 'false'
767 libacl = cc.find_library('acl', required : want_acl == 'true')
768 have = libacl.found()
773 conf.set10('HAVE_ACL', have)
774 m4_defines += have ? ['-DHAVE_ACL'] : []
776 want_audit = get_option('audit')
777 if want_audit != 'false'
778 libaudit = dependency('audit', required : want_audit == 'true')
779 have = libaudit.found()
784 conf.set10('HAVE_AUDIT', have)
786 want_blkid = get_option('blkid')
787 if want_blkid != 'false'
788 libblkid = dependency('blkid', required : want_blkid == 'true')
789 have = libblkid.found()
794 conf.set10('HAVE_BLKID', have)
796 want_kmod = get_option('kmod')
797 if want_kmod != 'false'
798 libkmod = dependency('libkmod',
800 required : want_kmod == 'true')
801 have = libkmod.found()
806 conf.set10('HAVE_KMOD', have)
808 want_pam = get_option('pam')
809 if want_pam != 'false'
810 libpam = cc.find_library('pam', required : want_pam == 'true')
811 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
812 have = libpam.found() and libpam_misc.found()
818 conf.set10('HAVE_PAM', have)
819 m4_defines += have ? ['-DHAVE_PAM'] : []
821 want_microhttpd = get_option('microhttpd')
822 if want_microhttpd != 'false'
823 libmicrohttpd = dependency('libmicrohttpd',
824 version : '>= 0.9.33',
825 required : want_microhttpd == 'true')
826 have = libmicrohttpd.found()
831 conf.set10('HAVE_MICROHTTPD', have)
832 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
834 want_libcryptsetup = get_option('libcryptsetup')
835 if want_libcryptsetup != 'false'
836 libcryptsetup = dependency('libcryptsetup',
837 version : '>= 1.6.0',
838 required : want_libcryptsetup == 'true')
839 have = libcryptsetup.found()
844 conf.set10('HAVE_LIBCRYPTSETUP', have)
846 want_libcurl = get_option('libcurl')
847 if want_libcurl != 'false'
848 libcurl = dependency('libcurl',
849 version : '>= 7.32.0',
850 required : want_libcurl == 'true')
851 have = libcurl.found()
856 conf.set10('HAVE_LIBCURL', have)
857 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
859 want_libidn = get_option('libidn')
860 want_libidn2 = get_option('libidn2')
861 if want_libidn == 'true' and want_libidn2 == 'true'
862 error('libidn and libidn2 cannot be requested simultaneously')
865 if want_libidn != 'false' and want_libidn2 != 'true'
866 libidn = dependency('libidn',
867 required : want_libidn == 'true')
868 have = libidn.found()
873 conf.set10('HAVE_LIBIDN', have)
874 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
875 if not have and want_libidn2 != 'false'
876 # libidn is used for both libidn and libidn2 objects
877 libidn = dependency('libidn2',
878 required : want_libidn2 == 'true')
879 have = libidn.found()
883 conf.set10('HAVE_LIBIDN2', have)
884 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
886 want_libiptc = get_option('libiptc')
887 if want_libiptc != 'false'
888 libiptc = dependency('libiptc',
889 required : want_libiptc == 'true')
890 have = libiptc.found()
895 conf.set10('HAVE_LIBIPTC', have)
896 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
898 want_qrencode = get_option('qrencode')
899 if want_qrencode != 'false'
900 libqrencode = dependency('libqrencode',
901 required : want_qrencode == 'true')
902 have = libqrencode.found()
907 conf.set10('HAVE_QRENCODE', have)
909 want_gcrypt = get_option('gcrypt')
910 if want_gcrypt != 'false'
911 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
912 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
913 have = libgcrypt.found() and libgpg_error.found()
918 # link to neither of the libs if one is not found
922 conf.set10('HAVE_GCRYPT', have)
924 want_gnutls = get_option('gnutls')
925 if want_gnutls != 'false'
926 libgnutls = dependency('gnutls',
927 version : '>= 3.1.4',
928 required : want_gnutls == 'true')
929 have = libgnutls.found()
934 conf.set10('HAVE_GNUTLS', have)
936 want_elfutils = get_option('elfutils')
937 if want_elfutils != 'false'
938 libdw = dependency('libdw',
939 required : want_elfutils == 'true')
945 conf.set10('HAVE_ELFUTILS', have)
947 want_zlib = get_option('zlib')
948 if want_zlib != 'false'
949 libz = dependency('zlib',
950 required : want_zlib == 'true')
956 conf.set10('HAVE_ZLIB', have)
958 want_bzip2 = get_option('bzip2')
959 if want_bzip2 != 'false'
960 libbzip2 = cc.find_library('bz2',
961 required : want_bzip2 == 'true')
962 have = libbzip2.found()
967 conf.set10('HAVE_BZIP2', have)
969 want_xz = get_option('xz')
970 if want_xz != 'false'
971 libxz = dependency('liblzma',
972 required : want_xz == 'true')
978 conf.set10('HAVE_XZ', have)
980 want_lz4 = get_option('lz4')
981 if want_lz4 != 'false'
982 liblz4 = dependency('liblz4',
983 required : want_lz4 == 'true')
984 have = liblz4.found()
989 conf.set10('HAVE_LZ4', have)
991 want_xkbcommon = get_option('xkbcommon')
992 if want_xkbcommon != 'false'
993 libxkbcommon = dependency('xkbcommon',
994 version : '>= 0.3.0',
995 required : want_xkbcommon == 'true')
996 have = libxkbcommon.found()
1001 conf.set10('HAVE_XKBCOMMON', have)
1003 want_glib = get_option('glib')
1004 if want_glib != 'false'
1005 libglib = dependency('glib-2.0',
1006 version : '>= 2.22.0',
1007 required : want_glib == 'true')
1008 libgobject = dependency('gobject-2.0',
1009 version : '>= 2.22.0',
1010 required : want_glib == 'true')
1011 libgio = dependency('gio-2.0',
1012 required : want_glib == 'true')
1013 have = libglib.found() and libgobject.found() and libgio.found()
1020 conf.set10('HAVE_GLIB', have)
1022 want_dbus = get_option('dbus')
1023 if want_dbus != 'false'
1024 libdbus = dependency('dbus-1',
1025 version : '>= 1.3.2',
1026 required : want_dbus == 'true')
1027 have = libdbus.found()
1032 conf.set10('HAVE_DBUS', have)
1034 default_dnssec = get_option('default-dnssec')
1035 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1036 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1037 default_dnssec = 'no'
1039 conf.set('DEFAULT_DNSSEC_MODE',
1040 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1041 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1043 want_importd = get_option('importd')
1044 if want_importd != 'false'
1045 have = (conf.get('HAVE_LIBCURL') == 1 and
1046 conf.get('HAVE_ZLIB') == 1 and
1047 conf.get('HAVE_BZIP2') == 1 and
1048 conf.get('HAVE_XZ') == 1 and
1049 conf.get('HAVE_GCRYPT') == 1)
1050 if want_importd == 'true' and not have
1051 error('importd support was requested, but dependencies are not available')
1056 conf.set10('ENABLE_IMPORTD', have)
1058 want_remote = get_option('remote')
1059 if want_remote != 'false'
1060 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1061 conf.get('HAVE_LIBCURL') == 1]
1062 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1063 # it's possible to build one without the other. Complain only if
1064 # support was explictly requested. The auxiliary files like sysusers
1065 # config should be installed when any of the programs are built.
1066 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1067 error('remote support was requested, but dependencies are not available')
1069 have = have_deps[0] or have_deps[1]
1073 conf.set10('ENABLE_REMOTE', have)
1075 foreach term : ['utmp',
1106 have = get_option(term)
1107 name = 'ENABLE_' + term.underscorify().to_upper()
1108 conf.set10(name, have)
1109 m4_defines += have ? ['-D' + name] : []
1112 want_tests = get_option('tests')
1113 install_tests = get_option('install-tests')
1116 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1118 #####################################################################
1120 if get_option('efi')
1121 efi_arch = host_machine.cpu_family()
1123 if efi_arch == 'x86'
1124 EFI_MACHINE_TYPE_NAME = 'ia32'
1125 gnu_efi_arch = 'ia32'
1126 elif efi_arch == 'x86_64'
1127 EFI_MACHINE_TYPE_NAME = 'x64'
1128 gnu_efi_arch = 'x86_64'
1129 elif efi_arch == 'arm'
1130 EFI_MACHINE_TYPE_NAME = 'arm'
1131 gnu_efi_arch = 'arm'
1132 elif efi_arch == 'aarch64'
1133 EFI_MACHINE_TYPE_NAME = 'aa64'
1134 gnu_efi_arch = 'aarch64'
1136 EFI_MACHINE_TYPE_NAME = ''
1141 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1143 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1147 conf.set10('ENABLE_EFI', have)
1149 #####################################################################
1151 config_h = configure_file(
1152 output : 'config.h',
1153 configuration : conf)
1155 includes = include_directories('src/basic',
1165 'src/libsystemd/sd-bus',
1166 'src/libsystemd/sd-device',
1167 'src/libsystemd/sd-hwdb',
1168 'src/libsystemd/sd-id128',
1169 'src/libsystemd/sd-netlink',
1170 'src/libsystemd/sd-network',
1171 'src/libsystemd-network',
1175 add_project_arguments('-include', 'config.h', language : 'c')
1177 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1178 'src/shared/gcrypt-util.c')
1182 subdir('src/systemd')
1184 subdir('src/libsystemd')
1185 subdir('src/libsystemd-network')
1186 subdir('src/journal')
1189 libjournal_core = static_library(
1191 libjournal_core_sources,
1193 include_directories : includes,
1196 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1197 libsystemd = shared_library(
1199 libsystemd_internal_sources,
1200 journal_internal_sources,
1201 version : libsystemd_version,
1202 include_directories : includes,
1203 link_args : ['-shared',
1204 '-Wl,--version-script=' + libsystemd_sym_path],
1205 link_with : [libbasic],
1206 dependencies : [threads,
1211 link_depends : libsystemd_sym,
1213 install_dir : rootlibdir)
1215 ############################################################
1217 # binaries that have --help and are intended for use by humans,
1218 # usually, but not always, installed in /bin.
1219 public_programs = []
1221 subdir('src/libudev')
1222 subdir('src/shared')
1225 subdir('src/network')
1227 subdir('src/analyze')
1228 subdir('src/journal-remote')
1229 subdir('src/coredump')
1230 subdir('src/hostname')
1231 subdir('src/import')
1232 subdir('src/kernel-install')
1233 subdir('src/locale')
1234 subdir('src/machine')
1235 subdir('src/nspawn')
1236 subdir('src/resolve')
1237 subdir('src/timedate')
1238 subdir('src/timesync')
1239 subdir('src/vconsole')
1240 subdir('src/sulogin-shell')
1241 subdir('src/boot/efi')
1247 ############################################################
1249 # only static linking apart from libdl, to make sure that the
1250 # module is linked to all libraries that it uses.
1251 test_dlopen = executable(
1254 include_directories : includes,
1255 link_with : [libbasic],
1256 dependencies : [libdl])
1258 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1259 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1260 ['mymachines', 'ENABLE_MACHINED'],
1261 ['resolve', 'ENABLE_RESOLVE']]
1263 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1267 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1268 version_script_arg = join_paths(meson.current_source_dir(), sym)
1270 nss = shared_library(
1272 'src/nss-@0@/nss-@0@.c'.format(module),
1274 include_directories : includes,
1275 link_args : ['-shared',
1276 '-Wl,--version-script=' + version_script_arg,
1278 link_with : [libsystemd_internal,
1280 dependencies : [threads,
1284 install_dir : rootlibdir)
1286 # We cannot use shared_module because it does not support version suffix.
1287 # Unfortunately shared_library insists on creating the symlink…
1288 meson.add_install_script('sh', '-c',
1289 'rm $DESTDIR@0@/libnss_@1@.so'
1290 .format(rootlibdir, module))
1292 test('dlopen-nss_' + module,
1294 args : [nss.full_path()]) # path to dlopen must include a slash
1298 ############################################################
1300 executable('systemd',
1302 include_directories : includes,
1303 link_with : [libcore,
1305 dependencies : [threads,
1311 install_rpath : rootlibexecdir,
1313 install_dir : rootlibexecdir)
1315 exe = executable('systemd-analyze',
1316 systemd_analyze_sources,
1317 include_directories : includes,
1318 link_with : [libcore,
1320 dependencies : [threads,
1326 install_rpath : rootlibexecdir,
1328 public_programs += [exe]
1330 executable('systemd-journald',
1331 systemd_journald_sources,
1332 include_directories : includes,
1333 link_with : [libjournal_core,
1335 dependencies : [threads,
1339 install_rpath : rootlibexecdir,
1341 install_dir : rootlibexecdir)
1343 exe = executable('systemd-cat',
1344 systemd_cat_sources,
1345 include_directories : includes,
1346 link_with : [libjournal_core,
1348 dependencies : [threads],
1349 install_rpath : rootlibexecdir,
1351 public_programs += [exe]
1353 exe = executable('journalctl',
1355 include_directories : includes,
1356 link_with : [libshared],
1357 dependencies : [threads,
1361 install_rpath : rootlibexecdir,
1363 install_dir : rootbindir)
1364 public_programs += [exe]
1366 executable('systemd-getty-generator',
1367 'src/getty-generator/getty-generator.c',
1368 include_directories : includes,
1369 link_with : [libshared],
1370 install_rpath : rootlibexecdir,
1372 install_dir : systemgeneratordir)
1374 executable('systemd-debug-generator',
1375 'src/debug-generator/debug-generator.c',
1376 include_directories : includes,
1377 link_with : [libshared],
1378 install_rpath : rootlibexecdir,
1380 install_dir : systemgeneratordir)
1382 executable('systemd-fstab-generator',
1383 'src/fstab-generator/fstab-generator.c',
1384 'src/core/mount-setup.c',
1385 include_directories : includes,
1386 link_with : [libshared],
1387 install_rpath : rootlibexecdir,
1389 install_dir : systemgeneratordir)
1391 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1392 executable('30-systemd-environment-d-generator',
1393 'src/environment-d-generator/environment-d-generator.c',
1394 include_directories : includes,
1395 link_with : [libshared],
1396 install_rpath : rootlibexecdir,
1398 install_dir : userenvgeneratordir)
1400 meson.add_install_script(meson_make_symlink,
1401 join_paths(sysconfdir, 'environment'),
1402 join_paths(environmentdir, '99-environment.conf'))
1405 if conf.get('ENABLE_HIBERNATE') == 1
1406 executable('systemd-hibernate-resume-generator',
1407 'src/hibernate-resume/hibernate-resume-generator.c',
1408 include_directories : includes,
1409 link_with : [libshared],
1410 install_rpath : rootlibexecdir,
1412 install_dir : systemgeneratordir)
1414 executable('systemd-hibernate-resume',
1415 'src/hibernate-resume/hibernate-resume.c',
1416 include_directories : includes,
1417 link_with : [libshared],
1418 install_rpath : rootlibexecdir,
1420 install_dir : rootlibexecdir)
1423 if conf.get('HAVE_BLKID') == 1
1424 executable('systemd-gpt-auto-generator',
1425 'src/gpt-auto-generator/gpt-auto-generator.c',
1426 'src/basic/blkid-util.h',
1427 include_directories : includes,
1428 link_with : [libshared],
1429 dependencies : libblkid,
1430 install_rpath : rootlibexecdir,
1432 install_dir : systemgeneratordir)
1434 exe = executable('systemd-dissect',
1435 'src/dissect/dissect.c',
1436 include_directories : includes,
1437 link_with : [libshared],
1438 install_rpath : rootlibexecdir,
1440 install_dir : rootlibexecdir)
1441 public_programs += [exe]
1444 if conf.get('ENABLE_RESOLVE') == 1
1445 executable('systemd-resolved',
1446 systemd_resolved_sources,
1447 gcrypt_util_sources,
1448 include_directories : includes,
1449 link_with : [libshared],
1450 dependencies : [threads,
1455 install_rpath : rootlibexecdir,
1457 install_dir : rootlibexecdir)
1459 exe = executable('systemd-resolve',
1460 systemd_resolve_sources,
1461 gcrypt_util_sources,
1462 include_directories : includes,
1463 link_with : [libshared],
1464 dependencies : [threads,
1469 install_rpath : rootlibexecdir,
1471 public_programs += [exe]
1474 if conf.get('ENABLE_LOGIND') == 1
1475 executable('systemd-logind',
1476 systemd_logind_sources,
1477 include_directories : includes,
1478 link_with : [liblogind_core,
1480 dependencies : [threads,
1482 install_rpath : rootlibexecdir,
1484 install_dir : rootlibexecdir)
1486 exe = executable('loginctl',
1488 include_directories : includes,
1489 link_with : [libshared],
1490 dependencies : [threads,
1493 install_rpath : rootlibexecdir,
1495 install_dir : rootbindir)
1496 public_programs += [exe]
1498 exe = executable('systemd-inhibit',
1499 'src/login/inhibit.c',
1500 include_directories : includes,
1501 link_with : [libshared],
1502 install_rpath : rootlibexecdir,
1504 install_dir : rootbindir)
1505 public_programs += [exe]
1507 if conf.get('HAVE_PAM') == 1
1508 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1509 pam_systemd = shared_library(
1513 include_directories : includes,
1514 link_args : ['-shared',
1515 '-Wl,--version-script=' + version_script_arg],
1516 link_with : [libsystemd_internal,
1518 dependencies : [threads,
1521 link_depends : pam_systemd_sym,
1523 install_dir : pamlibdir)
1525 test('dlopen-pam_systemd',
1527 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1531 if conf.get('HAVE_PAM') == 1
1532 executable('systemd-user-sessions',
1533 'src/user-sessions/user-sessions.c',
1534 include_directories : includes,
1535 link_with : [libshared],
1536 install_rpath : rootlibexecdir,
1538 install_dir : rootlibexecdir)
1541 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1542 exe = executable('bootctl',
1543 'src/boot/bootctl.c',
1544 include_directories : includes,
1545 link_with : [libshared],
1546 dependencies : [libblkid],
1547 install_rpath : rootlibexecdir,
1549 public_programs += [exe]
1552 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1553 include_directories : includes,
1554 link_with : [libshared],
1555 dependencies : [threads],
1556 install_rpath : rootlibexecdir,
1558 public_programs += [exe]
1560 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1561 include_directories : includes,
1562 link_with : [libshared],
1563 dependencies : [threads,
1568 install_rpath : rootlibexecdir,
1570 install_dir : rootbindir)
1571 public_programs += [exe]
1573 if conf.get('ENABLE_BACKLIGHT') == 1
1574 executable('systemd-backlight',
1575 'src/backlight/backlight.c',
1576 include_directories : includes,
1577 link_with : [libshared],
1578 install_rpath : rootlibexecdir,
1580 install_dir : rootlibexecdir)
1583 if conf.get('ENABLE_RFKILL') == 1
1584 executable('systemd-rfkill',
1585 'src/rfkill/rfkill.c',
1586 include_directories : includes,
1587 link_with : [libshared],
1588 install_rpath : rootlibexecdir,
1590 install_dir : rootlibexecdir)
1593 executable('systemd-system-update-generator',
1594 'src/system-update-generator/system-update-generator.c',
1595 include_directories : includes,
1596 link_with : [libshared],
1597 install_rpath : rootlibexecdir,
1599 install_dir : systemgeneratordir)
1601 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1602 executable('systemd-cryptsetup',
1603 'src/cryptsetup/cryptsetup.c',
1604 include_directories : includes,
1605 link_with : [libshared],
1606 dependencies : [libcryptsetup],
1607 install_rpath : rootlibexecdir,
1609 install_dir : rootlibexecdir)
1611 executable('systemd-cryptsetup-generator',
1612 'src/cryptsetup/cryptsetup-generator.c',
1613 include_directories : includes,
1614 link_with : [libshared],
1615 dependencies : [libcryptsetup],
1616 install_rpath : rootlibexecdir,
1618 install_dir : systemgeneratordir)
1620 executable('systemd-veritysetup',
1621 'src/veritysetup/veritysetup.c',
1622 include_directories : includes,
1623 link_with : [libshared],
1624 dependencies : [libcryptsetup],
1625 install_rpath : rootlibexecdir,
1627 install_dir : rootlibexecdir)
1629 executable('systemd-veritysetup-generator',
1630 'src/veritysetup/veritysetup-generator.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 dependencies : [libcryptsetup],
1634 install_rpath : rootlibexecdir,
1636 install_dir : systemgeneratordir)
1639 if conf.get('HAVE_SYSV_COMPAT') == 1
1640 executable('systemd-sysv-generator',
1641 'src/sysv-generator/sysv-generator.c',
1642 include_directories : includes,
1643 link_with : [libshared],
1644 install_rpath : rootlibexecdir,
1646 install_dir : systemgeneratordir)
1648 executable('systemd-rc-local-generator',
1649 'src/rc-local-generator/rc-local-generator.c',
1650 include_directories : includes,
1651 link_with : [libshared],
1652 install_rpath : rootlibexecdir,
1654 install_dir : systemgeneratordir)
1657 if conf.get('ENABLE_HOSTNAMED') == 1
1658 executable('systemd-hostnamed',
1659 'src/hostname/hostnamed.c',
1660 include_directories : includes,
1661 link_with : [libshared],
1662 install_rpath : rootlibexecdir,
1664 install_dir : rootlibexecdir)
1666 exe = executable('hostnamectl',
1667 'src/hostname/hostnamectl.c',
1668 include_directories : includes,
1669 link_with : [libshared],
1670 install_rpath : rootlibexecdir,
1672 public_programs += [exe]
1675 if conf.get('ENABLE_LOCALED') == 1
1676 if conf.get('HAVE_XKBCOMMON') == 1
1677 # logind will load libxkbcommon.so dynamically on its own
1683 executable('systemd-localed',
1684 systemd_localed_sources,
1685 include_directories : includes,
1686 link_with : [libshared],
1687 dependencies : deps,
1688 install_rpath : rootlibexecdir,
1690 install_dir : rootlibexecdir)
1692 exe = executable('localectl',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 install_rpath : rootlibexecdir,
1698 public_programs += [exe]
1701 if conf.get('ENABLE_TIMEDATED') == 1
1702 executable('systemd-timedated',
1703 'src/timedate/timedated.c',
1704 include_directories : includes,
1705 link_with : [libshared],
1706 install_rpath : rootlibexecdir,
1708 install_dir : rootlibexecdir)
1710 exe = executable('timedatectl',
1711 'src/timedate/timedatectl.c',
1712 include_directories : includes,
1713 install_rpath : rootlibexecdir,
1714 link_with : [libshared],
1716 public_programs += [exe]
1719 if conf.get('ENABLE_TIMESYNCD') == 1
1720 executable('systemd-timesyncd',
1721 systemd_timesyncd_sources,
1722 include_directories : includes,
1723 link_with : [libshared],
1724 dependencies : [threads,
1726 install_rpath : rootlibexecdir,
1728 install_dir : rootlibexecdir)
1731 if conf.get('ENABLE_MACHINED') == 1
1732 executable('systemd-machined',
1733 systemd_machined_sources,
1734 include_directories : includes,
1735 link_with : [libmachine_core,
1737 install_rpath : rootlibexecdir,
1739 install_dir : rootlibexecdir)
1741 exe = executable('machinectl',
1742 'src/machine/machinectl.c',
1743 include_directories : includes,
1744 link_with : [libshared],
1745 dependencies : [threads,
1748 install_rpath : rootlibexecdir,
1750 install_dir : rootbindir)
1751 public_programs += [exe]
1754 if conf.get('ENABLE_IMPORTD') == 1
1755 executable('systemd-importd',
1756 systemd_importd_sources,
1757 include_directories : includes,
1758 link_with : [libshared],
1759 dependencies : [threads],
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootlibexecdir)
1764 systemd_pull = executable('systemd-pull',
1765 systemd_pull_sources,
1766 include_directories : includes,
1767 link_with : [libshared],
1768 dependencies : [libcurl,
1773 install_rpath : rootlibexecdir,
1775 install_dir : rootlibexecdir)
1777 systemd_import = executable('systemd-import',
1778 systemd_import_sources,
1779 include_directories : includes,
1780 link_with : [libshared],
1781 dependencies : [libcurl,
1785 install_rpath : rootlibexecdir,
1787 install_dir : rootlibexecdir)
1789 systemd_export = executable('systemd-export',
1790 systemd_export_sources,
1791 include_directories : includes,
1792 link_with : [libshared],
1793 dependencies : [libcurl,
1797 install_rpath : rootlibexecdir,
1799 install_dir : rootlibexecdir)
1800 public_programs += [systemd_pull, systemd_import, systemd_export]
1803 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1804 exe = executable('systemd-journal-upload',
1805 systemd_journal_upload_sources,
1806 include_directories : includes,
1807 link_with : [libshared],
1808 dependencies : [threads,
1813 install_rpath : rootlibexecdir,
1815 install_dir : rootlibexecdir)
1816 public_programs += [exe]
1819 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1820 s_j_remote = executable('systemd-journal-remote',
1821 systemd_journal_remote_sources,
1822 include_directories : includes,
1823 link_with : [libshared],
1824 dependencies : [threads,
1829 install_rpath : rootlibexecdir,
1831 install_dir : rootlibexecdir)
1833 s_j_gatewayd = executable('systemd-journal-gatewayd',
1834 systemd_journal_gatewayd_sources,
1835 include_directories : includes,
1836 link_with : [libshared],
1837 dependencies : [threads,
1842 install_rpath : rootlibexecdir,
1844 install_dir : rootlibexecdir)
1845 public_programs += [s_j_remote, s_j_gatewayd]
1848 if conf.get('ENABLE_COREDUMP') == 1
1849 executable('systemd-coredump',
1850 systemd_coredump_sources,
1851 include_directories : includes,
1852 link_with : [libshared],
1853 dependencies : [threads,
1858 install_rpath : rootlibexecdir,
1860 install_dir : rootlibexecdir)
1862 exe = executable('coredumpctl',
1863 coredumpctl_sources,
1864 include_directories : includes,
1865 link_with : [libshared],
1866 dependencies : [threads,
1869 install_rpath : rootlibexecdir,
1871 public_programs += [exe]
1874 if conf.get('ENABLE_BINFMT') == 1
1875 exe = executable('systemd-binfmt',
1876 'src/binfmt/binfmt.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 install_rpath : rootlibexecdir,
1881 install_dir : rootlibexecdir)
1882 public_programs += [exe]
1884 meson.add_install_script('sh', '-c',
1885 mkdir_p.format(binfmtdir))
1886 meson.add_install_script('sh', '-c',
1887 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1890 if conf.get('ENABLE_VCONSOLE') == 1
1891 executable('systemd-vconsole-setup',
1892 'src/vconsole/vconsole-setup.c',
1893 include_directories : includes,
1894 link_with : [libshared],
1895 install_rpath : rootlibexecdir,
1897 install_dir : rootlibexecdir)
1900 if conf.get('ENABLE_RANDOMSEED') == 1
1901 executable('systemd-random-seed',
1902 'src/random-seed/random-seed.c',
1903 include_directories : includes,
1904 link_with : [libshared],
1905 install_rpath : rootlibexecdir,
1907 install_dir : rootlibexecdir)
1910 if conf.get('ENABLE_FIRSTBOOT') == 1
1911 executable('systemd-firstboot',
1912 'src/firstboot/firstboot.c',
1913 include_directories : includes,
1914 link_with : [libshared],
1915 dependencies : [libcrypt],
1916 install_rpath : rootlibexecdir,
1918 install_dir : rootbindir)
1921 executable('systemd-remount-fs',
1922 'src/remount-fs/remount-fs.c',
1923 'src/core/mount-setup.c',
1924 'src/core/mount-setup.h',
1925 include_directories : includes,
1926 link_with : [libshared],
1927 install_rpath : rootlibexecdir,
1929 install_dir : rootlibexecdir)
1931 executable('systemd-machine-id-setup',
1932 'src/machine-id-setup/machine-id-setup-main.c',
1933 'src/core/machine-id-setup.c',
1934 'src/core/machine-id-setup.h',
1935 include_directories : includes,
1936 link_with : [libshared],
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootbindir)
1941 executable('systemd-fsck',
1943 include_directories : includes,
1944 link_with : [libshared],
1945 install_rpath : rootlibexecdir,
1947 install_dir : rootlibexecdir)
1949 executable('systemd-growfs',
1950 'src/partition/growfs.c',
1951 include_directories : includes,
1952 link_with : [libshared],
1953 dependencies : [libcryptsetup],
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootlibexecdir)
1958 executable('systemd-makefs',
1959 'src/partition/makefs.c',
1960 include_directories : includes,
1961 link_with : [libshared],
1962 install_rpath : rootlibexecdir,
1964 install_dir : rootlibexecdir)
1966 executable('systemd-sleep',
1967 'src/sleep/sleep.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootlibexecdir)
1974 exe = executable('systemd-sysctl',
1975 'src/sysctl/sysctl.c',
1976 include_directories : includes,
1977 link_with : [libshared],
1978 install_rpath : rootlibexecdir,
1980 install_dir : rootlibexecdir)
1981 public_programs += [exe]
1983 executable('systemd-ac-power',
1984 'src/ac-power/ac-power.c',
1985 include_directories : includes,
1986 link_with : [libshared],
1987 install_rpath : rootlibexecdir,
1989 install_dir : rootlibexecdir)
1991 exe = executable('systemd-detect-virt',
1992 'src/detect-virt/detect-virt.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 install_rpath : rootlibexecdir,
1997 public_programs += [exe]
1999 exe = executable('systemd-delta',
2000 'src/delta/delta.c',
2001 include_directories : includes,
2002 link_with : [libshared],
2003 install_rpath : rootlibexecdir,
2005 public_programs += [exe]
2007 exe = executable('systemd-escape',
2008 'src/escape/escape.c',
2009 include_directories : includes,
2010 link_with : [libshared],
2011 install_rpath : rootlibexecdir,
2013 install_dir : rootbindir)
2014 public_programs += [exe]
2016 exe = executable('systemd-notify',
2017 'src/notify/notify.c',
2018 include_directories : includes,
2019 link_with : [libshared],
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootbindir)
2023 public_programs += [exe]
2025 executable('systemd-volatile-root',
2026 'src/volatile-root/volatile-root.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 install_rpath : rootlibexecdir,
2031 install_dir : rootlibexecdir)
2033 executable('systemd-cgroups-agent',
2034 'src/cgroups-agent/cgroups-agent.c',
2035 include_directories : includes,
2036 link_with : [libshared],
2037 install_rpath : rootlibexecdir,
2039 install_dir : rootlibexecdir)
2041 exe = executable('systemd-path',
2043 include_directories : includes,
2044 link_with : [libshared],
2045 install_rpath : rootlibexecdir,
2047 public_programs += [exe]
2049 exe = executable('systemd-ask-password',
2050 'src/ask-password/ask-password.c',
2051 include_directories : includes,
2052 link_with : [libshared],
2053 install_rpath : rootlibexecdir,
2055 install_dir : rootbindir)
2056 public_programs += [exe]
2058 executable('systemd-reply-password',
2059 'src/reply-password/reply-password.c',
2060 include_directories : includes,
2061 link_with : [libshared],
2062 install_rpath : rootlibexecdir,
2064 install_dir : rootlibexecdir)
2066 exe = executable('systemd-tty-ask-password-agent',
2067 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2068 include_directories : includes,
2069 link_with : [libshared],
2070 install_rpath : rootlibexecdir,
2072 install_dir : rootbindir)
2073 public_programs += [exe]
2075 exe = executable('systemd-cgls',
2077 include_directories : includes,
2078 link_with : [libshared],
2079 install_rpath : rootlibexecdir,
2081 public_programs += [exe]
2083 exe = executable('systemd-cgtop',
2084 'src/cgtop/cgtop.c',
2085 include_directories : includes,
2086 link_with : [libshared],
2087 install_rpath : rootlibexecdir,
2089 public_programs += [exe]
2091 executable('systemd-initctl',
2092 'src/initctl/initctl.c',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 install_rpath : rootlibexecdir,
2097 install_dir : rootlibexecdir)
2099 exe = executable('systemd-mount',
2100 'src/mount/mount-tool.c',
2101 include_directories : includes,
2102 link_with : [libshared],
2103 install_rpath : rootlibexecdir,
2105 public_programs += [exe]
2107 meson.add_install_script(meson_make_symlink,
2108 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2110 exe = executable('systemd-run',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 install_rpath : rootlibexecdir,
2116 public_programs += [exe]
2118 exe = executable('systemd-stdio-bridge',
2119 'src/stdio-bridge/stdio-bridge.c',
2120 include_directories : includes,
2121 link_with : [libshared],
2122 install_rpath : rootlibexecdir,
2124 public_programs += [exe]
2126 exe = executable('busctl',
2127 'src/busctl/busctl.c',
2128 'src/busctl/busctl-introspect.c',
2129 'src/busctl/busctl-introspect.h',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 install_rpath : rootlibexecdir,
2134 public_programs += [exe]
2136 if conf.get('ENABLE_SYSUSERS') == 1
2137 exe = executable('systemd-sysusers',
2138 'src/sysusers/sysusers.c',
2139 include_directories : includes,
2140 link_with : [libshared],
2141 install_rpath : rootlibexecdir,
2143 install_dir : rootbindir)
2144 public_programs += [exe]
2147 if conf.get('ENABLE_TMPFILES') == 1
2148 exe = executable('systemd-tmpfiles',
2149 'src/tmpfiles/tmpfiles.c',
2150 include_directories : includes,
2151 link_with : [libshared],
2152 dependencies : [libacl],
2153 install_rpath : rootlibexecdir,
2155 install_dir : rootbindir)
2156 public_programs += [exe]
2159 if conf.get('ENABLE_HWDB') == 1
2160 exe = executable('systemd-hwdb',
2162 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2163 include_directories : includes,
2164 link_with : [libudev_internal],
2165 install_rpath : udev_rpath,
2167 install_dir : rootbindir)
2168 public_programs += [exe]
2171 if conf.get('ENABLE_QUOTACHECK') == 1
2172 executable('systemd-quotacheck',
2173 'src/quotacheck/quotacheck.c',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2178 install_dir : rootlibexecdir)
2181 exe = executable('systemd-socket-proxyd',
2182 'src/socket-proxy/socket-proxyd.c',
2183 include_directories : includes,
2184 link_with : [libshared],
2185 dependencies : [threads],
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootlibexecdir)
2189 public_programs += [exe]
2191 exe = executable('systemd-udevd',
2192 systemd_udevd_sources,
2193 include_directories : includes,
2194 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2195 link_with : [libudev_core,
2198 dependencies : [threads,
2203 install_rpath : udev_rpath,
2205 install_dir : rootlibexecdir)
2206 public_programs += [exe]
2208 exe = executable('udevadm',
2210 include_directories : includes,
2211 link_with : [libudev_core,
2214 dependencies : [threads,
2219 install_rpath : udev_rpath,
2221 install_dir : rootbindir)
2222 public_programs += [exe]
2224 executable('systemd-shutdown',
2225 systemd_shutdown_sources,
2226 include_directories : includes,
2227 link_with : [libshared],
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootlibexecdir)
2232 executable('systemd-update-done',
2233 'src/update-done/update-done.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 install_rpath : rootlibexecdir,
2238 install_dir : rootlibexecdir)
2240 executable('systemd-update-utmp',
2241 'src/update-utmp/update-utmp.c',
2242 include_directories : includes,
2243 link_with : [libshared],
2244 dependencies : [libaudit],
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootlibexecdir)
2249 if conf.get('HAVE_KMOD') == 1
2250 executable('systemd-modules-load',
2251 'src/modules-load/modules-load.c',
2252 include_directories : includes,
2253 link_with : [libshared],
2254 dependencies : [libkmod],
2255 install_rpath : rootlibexecdir,
2257 install_dir : rootlibexecdir)
2259 meson.add_install_script('sh', '-c',
2260 mkdir_p.format(modulesloaddir))
2261 meson.add_install_script('sh', '-c',
2262 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2265 exe = executable('systemd-nspawn',
2266 systemd_nspawn_sources,
2267 'src/core/mount-setup.c', # FIXME: use a variable?
2268 'src/core/mount-setup.h',
2269 'src/core/loopback-setup.c',
2270 'src/core/loopback-setup.h',
2271 include_directories : [includes, include_directories('src/nspawn')],
2272 link_with : [libshared],
2273 dependencies : [libacl,
2277 install_rpath : rootlibexecdir,
2279 public_programs += [exe]
2281 if conf.get('ENABLE_NETWORKD') == 1
2282 executable('systemd-networkd',
2283 systemd_networkd_sources,
2284 include_directories : includes,
2285 link_with : [libnetworkd_core,
2289 dependencies : [threads],
2290 install_rpath : rootlibexecdir,
2292 install_dir : rootlibexecdir)
2294 executable('systemd-networkd-wait-online',
2295 systemd_networkd_wait_online_sources,
2296 include_directories : includes,
2297 link_with : [libnetworkd_core,
2299 install_rpath : rootlibexecdir,
2301 install_dir : rootlibexecdir)
2303 exe = executable('networkctl',
2305 include_directories : includes,
2306 link_with : [libsystemd_network,
2308 install_rpath : rootlibexecdir,
2310 install_dir : rootbindir)
2311 public_programs += [exe]
2313 ############################################################
2315 foreach tuple : tests
2317 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2318 dependencies = tuple[2]
2319 condition = tuple.length() >= 4 ? tuple[3] : ''
2320 type = tuple.length() >= 5 ? tuple[4] : ''
2321 defs = tuple.length() >= 6 ? tuple[5] : []
2322 incs = tuple.length() >= 7 ? tuple[6] : includes
2325 name = sources[0].split('/')[-1].split('.')[0]
2326 if type.startswith('timeout=')
2327 timeout = type.split('=')[1].to_int()
2331 if condition == '' or conf.get(condition) == 1
2335 include_directories : incs,
2336 link_with : link_with,
2337 dependencies : dependencies,
2339 install_rpath : rootlibexecdir,
2340 install : install_tests,
2341 install_dir : join_paths(testsdir, type))
2344 message('@0@ is a manual test'.format(name))
2345 elif type == 'unsafe' and want_tests != 'unsafe'
2346 message('@0@ is an unsafe test'.format(name))
2353 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2357 test_libsystemd_sym = executable(
2358 'test-libsystemd-sym',
2359 test_libsystemd_sym_c,
2360 include_directories : includes,
2361 link_with : [libsystemd],
2362 install : install_tests,
2363 install_dir : testsdir)
2364 test('test-libsystemd-sym',
2365 test_libsystemd_sym)
2367 test_libudev_sym = executable(
2370 include_directories : includes,
2371 c_args : ['-Wno-deprecated-declarations'],
2372 link_with : [libudev],
2373 install : install_tests,
2374 install_dir : testsdir)
2375 test('test-libudev-sym',
2378 ############################################################
2380 make_directive_index_py = find_program('tools/make-directive-index.py')
2381 make_man_index_py = find_program('tools/make-man-index.py')
2382 xml_helper_py = find_program('tools/xml_helper.py')
2383 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2387 subdir('sysusers.d')
2388 subdir('tmpfiles.d')
2392 subdir('shell-completion/bash')
2393 subdir('shell-completion/zsh')
2394 subdir('docs/sysvinit')
2395 subdir('docs/var-log')
2397 # FIXME: figure out if the warning is true:
2398 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2399 install_subdir('factory/etc',
2400 install_dir : factorydir)
2403 install_data('xorg/50-systemd-user.sh',
2404 install_dir : xinitrcdir)
2405 install_data('system-preset/90-systemd.preset',
2406 install_dir : systempresetdir)
2407 install_data('modprobe.d/systemd.conf',
2408 install_dir : modprobedir)
2409 install_data('README',
2416 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2417 install_dir : docdir)
2419 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2420 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2422 ############################################################
2424 meson_check_help = find_program('tools/meson-check-help.sh')
2426 foreach exec : public_programs
2427 name = exec.full_path().split('/')[-1]
2428 test('check-help-' + name,
2430 args : [exec.full_path()])
2433 ############################################################
2436 all_files = run_command(
2438 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2441 all_files = files(all_files.stdout().split())
2446 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2450 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2454 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2457 command : [meson_git_contrib_sh])
2461 git_head = run_command(
2463 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2464 'rev-parse', 'HEAD']).stdout().strip()
2465 git_head_short = run_command(
2467 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2468 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2472 command : ['git', 'archive',
2473 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2475 '--prefix', 'systemd-@0@/'.format(git_head),
2479 ############################################################
2482 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2484 'prefix directory: @0@'.format(prefixdir),
2485 'rootprefix directory: @0@'.format(rootprefixdir),
2486 'sysconf directory: @0@'.format(sysconfdir),
2487 'include directory: @0@'.format(includedir),
2488 'lib directory: @0@'.format(libdir),
2489 'rootlib directory: @0@'.format(rootlibdir),
2490 'SysV init scripts: @0@'.format(sysvinit_path),
2491 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2492 'PAM modules directory: @0@'.format(pamlibdir),
2493 'PAM configuration directory: @0@'.format(pamconfdir),
2494 'RPM macros directory: @0@'.format(rpmmacrosdir),
2495 'modprobe.d directory: @0@'.format(modprobedir),
2496 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2497 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2498 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2499 'bash completions directory: @0@'.format(bashcompletiondir),
2500 'zsh completions directory: @0@'.format(zshcompletiondir),
2501 'extra start script: @0@'.format(get_option('rc-local')),
2502 'extra stop script: @0@'.format(get_option('halt-local')),
2503 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2504 get_option('debug-tty')),
2505 'TTY GID: @0@'.format(tty_gid),
2506 'users GID: @0@'.format(users_gid),
2507 'maximum system UID: @0@'.format(system_uid_max),
2508 'maximum system GID: @0@'.format(system_gid_max),
2509 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2510 'render group access mode: @0@'.format(get_option('group-render-mode')),
2511 'certificate root directory: @0@'.format(get_option('certificate-root')),
2512 'support URL: @0@'.format(support_url),
2513 'nobody user name: @0@'.format(get_option('nobody-user')),
2514 'nobody group name: @0@'.format(get_option('nobody-group')),
2515 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2516 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2518 'default DNSSEC mode: @0@'.format(default_dnssec),
2519 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2520 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2522 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2523 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2525 'default DNS servers: @0@'.format(alt_dns_servers),
2526 'default NTP servers: @0@'.format(alt_ntp_servers)]
2528 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2529 '@@0@'.format(time_epoch)).stdout().strip()
2531 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2534 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2535 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2536 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2538 if conf.get('ENABLE_EFI') == 1
2540 'efi arch: @0@'.format(efi_arch)]
2544 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2545 'EFI CC @0@'.format(efi_cc),
2546 'EFI lib directory: @0@'.format(efi_libdir),
2547 'EFI lds directory: @0@'.format(efi_ldsdir),
2548 'EFI include directory: @0@'.format(efi_incdir)]
2601 ['legacy pkla', install_polkit_pkla],
2603 ['gnu-efi', have_gnu_efi],
2609 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2612 ['man pages', want_man],
2613 ['html pages', want_html],
2614 ['man page indices', want_man and have_lxml],
2615 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2620 ['adm group', get_option('adm-group')],
2621 ['wheel group', get_option('wheel-group')],
2624 ['debug mmap cache'],
2627 cond = tuple.get(1, '')
2629 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2630 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2631 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2636 missing += [tuple[0]]
2642 'enabled features: @0@'.format(', '.join(found)),
2644 'disabled features: @0@'.format(', '.join(missing)),
2646 message('\n '.join(status))
2648 if rootprefixdir != rootprefix_default
2649 message('WARNING:\n' +
2650 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2651 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2652 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))