]> git.ipfire.org Git - thirdparty/systemd.git/blame_incremental - meson.build
travis: use systemd as PID1 in debian containers
[thirdparty/systemd.git] / meson.build
... / ...
CommitLineData
1# SPDX-License-Identifier: LGPL-2.1+
2
3project('systemd', 'c',
4 version : '239',
5 license : 'LGPLv2+',
6 default_options: [
7 'c_std=gnu99',
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
11 ],
12 meson_version : '>= 0.46',
13 )
14
15libsystemd_version = '0.23.0'
16libudev_version = '1.6.11'
17
18# We need the same data in two different formats, ugh!
19# Also, for hysterical reasons, we use different variable
20# names, sometimes. Not all variables are included in every
21# set. Ugh, ugh, ugh!
22conf = configuration_data()
23conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24conf.set_quoted('PACKAGE_VERSION', meson.project_version())
25
26substs = configuration_data()
27substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28substs.set('PACKAGE_VERSION', meson.project_version())
29
30want_ossfuzz = get_option('oss-fuzz')
31want_libfuzzer = get_option('llvm-fuzz')
32if want_ossfuzz and want_libfuzzer
33 error('only one of oss-fuzz and llvm-fuzz can be specified')
34endif
35fuzzer_build = want_ossfuzz or want_libfuzzer
36
37#####################################################################
38
39# Try to install the git pre-commit hook
40git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
41if git_hook.returncode() == 0
42 message(git_hook.stdout().strip())
43endif
44
45#####################################################################
46
47if get_option('split-usr') == 'auto'
48 split_usr = run_command('test', '-L', '/bin').returncode() != 0
49else
50 split_usr = get_option('split-usr') == 'true'
51endif
52conf.set10('HAVE_SPLIT_USR', split_usr,
53 description : '/usr/bin and /bin directories are separate')
54
55if get_option('split-bin') == 'auto'
56 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
57else
58 split_bin = get_option('split-bin') == 'true'
59endif
60conf.set10('HAVE_SPLIT_BIN', split_bin,
61 description : 'bin and sbin directories are separate')
62
63rootprefixdir = get_option('rootprefix')
64# Unusual rootprefixdir values are used by some distros
65# (see https://github.com/systemd/systemd/pull/7461).
66rootprefix_default = split_usr ? '/' : '/usr'
67if rootprefixdir == ''
68 rootprefixdir = rootprefix_default
69endif
70
71sysvinit_path = get_option('sysvinit-path')
72sysvrcnd_path = get_option('sysvrcnd-path')
73conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
74 description : 'SysV init scripts and rcN.d links are supported')
75
76conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
77conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
78conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
79
80# join_paths ignore the preceding arguments if an absolute component is
81# encountered, so this should canonicalize various paths when they are
82# absolute or relative.
83prefixdir = get_option('prefix')
84if not prefixdir.startswith('/')
85 error('Prefix is not absolute: "@0@"'.format(prefixdir))
86endif
87bindir = join_paths(prefixdir, get_option('bindir'))
88libdir = join_paths(prefixdir, get_option('libdir'))
89sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
90includedir = join_paths(prefixdir, get_option('includedir'))
91datadir = join_paths(prefixdir, get_option('datadir'))
92localstatedir = join_paths('/', get_option('localstatedir'))
93
94rootbindir = join_paths(rootprefixdir, 'bin')
95rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
96rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
97
98rootlibdir = get_option('rootlibdir')
99if rootlibdir == ''
100 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
101endif
102
103# Dirs of external packages
104pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
105pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
106polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
107polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
108polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
109varlogdir = join_paths(localstatedir, 'log')
110xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
111rpmmacrosdir = get_option('rpmmacrosdir')
112if rpmmacrosdir != 'no'
113 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
114endif
115modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
116
117# Our own paths
118pkgdatadir = join_paths(datadir, 'systemd')
119environmentdir = join_paths(prefixdir, 'lib/environment.d')
120pkgsysconfdir = join_paths(sysconfdir, 'systemd')
121userunitdir = join_paths(prefixdir, 'lib/systemd/user')
122userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
123tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
124sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
125sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
126binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
127modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
128networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
129pkgincludedir = join_paths(includedir, 'systemd')
130systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
131usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
132systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
133userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
134systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
135systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
136systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
137systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
138udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
139udevhomedir = udevlibexecdir
140udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
141udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
142catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
143kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
144factorydir = join_paths(datadir, 'factory')
145bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
146testsdir = join_paths(prefixdir, 'lib/systemd/tests')
147systemdstatedir = join_paths(localstatedir, 'lib/systemd')
148catalogstatedir = join_paths(systemdstatedir, 'catalog')
149randomseeddir = join_paths(localstatedir, 'lib/systemd')
150profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
151
152docdir = get_option('docdir')
153if docdir == ''
154 docdir = join_paths(datadir, 'doc/systemd')
155endif
156
157dbuspolicydir = get_option('dbuspolicydir')
158if dbuspolicydir == ''
159 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
160endif
161
162dbussessionservicedir = get_option('dbussessionservicedir')
163if dbussessionservicedir == ''
164 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
165endif
166
167dbussystemservicedir = get_option('dbussystemservicedir')
168if dbussystemservicedir == ''
169 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
170endif
171
172pamlibdir = get_option('pamlibdir')
173if pamlibdir == ''
174 pamlibdir = join_paths(rootlibdir, 'security')
175endif
176
177pamconfdir = get_option('pamconfdir')
178if pamconfdir == ''
179 pamconfdir = join_paths(sysconfdir, 'pam.d')
180endif
181
182memory_accounting_default = get_option('memory-accounting-default')
183
184conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
185conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
186conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
187conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
188conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
189conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
190conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
191
192conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
193
194conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
195conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
196conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
197conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
198conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
199conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
200conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
201conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
202conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
203conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
204conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
205conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
206conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
207conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
208conf.set_quoted('ROOTPREFIX', rootprefixdir)
209conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
210conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
211conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
212conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
213conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
214conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
215conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
216conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
217conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
218conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
219conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
220conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
221conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
222conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
223conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
224conf.set_quoted('LIBDIR', libdir)
225conf.set_quoted('ROOTLIBDIR', rootlibdir)
226conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
227conf.set_quoted('BOOTLIBDIR', bootlibdir)
228conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
229conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
230conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
231conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
232conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
233conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
234conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
235conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
236conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
237
238substs.set('prefix', prefixdir)
239substs.set('exec_prefix', prefixdir)
240substs.set('libdir', libdir)
241substs.set('rootlibdir', rootlibdir)
242substs.set('includedir', includedir)
243substs.set('pkgsysconfdir', pkgsysconfdir)
244substs.set('bindir', bindir)
245substs.set('rootbindir', rootbindir)
246substs.set('rootlibexecdir', rootlibexecdir)
247substs.set('systemunitdir', systemunitdir)
248substs.set('userunitdir', userunitdir)
249substs.set('systempresetdir', systempresetdir)
250substs.set('userpresetdir', userpresetdir)
251substs.set('udevhwdbdir', udevhwdbdir)
252substs.set('udevrulesdir', udevrulesdir)
253substs.set('udevlibexecdir', udevlibexecdir)
254substs.set('environmentdir', environmentdir)
255substs.set('catalogdir', catalogdir)
256substs.set('tmpfilesdir', tmpfilesdir)
257substs.set('sysusersdir', sysusersdir)
258substs.set('sysctldir', sysctldir)
259substs.set('binfmtdir', binfmtdir)
260substs.set('modulesloaddir', modulesloaddir)
261substs.set('modprobedir', modprobedir)
262substs.set('systemgeneratordir', systemgeneratordir)
263substs.set('usergeneratordir', usergeneratordir)
264substs.set('systemenvgeneratordir', systemenvgeneratordir)
265substs.set('userenvgeneratordir', userenvgeneratordir)
266substs.set('systemshutdowndir', systemshutdowndir)
267substs.set('systemsleepdir', systemsleepdir)
268substs.set('VARLOGDIR', varlogdir)
269substs.set('CERTIFICATEROOT', get_option('certificate-root'))
270substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
271substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
272substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
273substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
274substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
275substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
276substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
277substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
278
279#####################################################################
280
281cc = meson.get_compiler('c')
282pkgconfig = import('pkgconfig')
283check_compilation_sh = find_program('tools/meson-check-compilation.sh')
284meson_build_sh = find_program('tools/meson-build.sh')
285
286want_tests = get_option('tests')
287slow_tests = want_tests != 'false' and get_option('slow-tests')
288install_tests = get_option('install-tests')
289
290cxx = find_program('c++', required : fuzzer_build)
291if cxx.found()
292 # Used only for tests
293 add_languages('cpp')
294 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
295else
296 cxx_cmd = ''
297endif
298
299if want_libfuzzer
300 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
301elif want_ossfuzz
302 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
303endif
304
305possible_cc_flags = [
306 '-Wextra',
307 '-Werror=undef',
308 '-Wlogical-op',
309 '-Wmissing-include-dirs',
310 '-Wold-style-definition',
311 '-Wpointer-arith',
312 '-Winit-self',
313 '-Wfloat-equal',
314 '-Wsuggest-attribute=noreturn',
315 '-Werror=missing-prototypes',
316 '-Werror=implicit-function-declaration',
317 '-Werror=missing-declarations',
318 '-Werror=return-type',
319 '-Werror=incompatible-pointer-types',
320 '-Werror=format=2',
321 '-Wstrict-prototypes',
322 '-Wredundant-decls',
323 '-Wmissing-noreturn',
324 '-Wimplicit-fallthrough=5',
325 '-Wshadow',
326 '-Wendif-labels',
327 '-Wstrict-aliasing=2',
328 '-Wwrite-strings',
329 '-Werror=overflow',
330 '-Werror=shift-count-overflow',
331 '-Werror=shift-overflow=2',
332 '-Wdate-time',
333 '-Wnested-externs',
334
335 # negative arguments are correctly detected starting with meson 0.46.
336 '-Wno-unused-parameter',
337 '-Wno-missing-field-initializers',
338 '-Wno-unused-result',
339 '-Wno-format-signedness',
340
341 # work-around for gcc 7.1 turning this on on its own.
342 '-Wno-error=nonnull',
343
344 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
345 # optimizations enabled, producing essentially false positives.
346 '-Wno-maybe-uninitialized',
347
348 '-ffast-math',
349 '-fno-common',
350 '-fdiagnostics-show-option',
351 '-fno-strict-aliasing',
352 '-fvisibility=hidden',
353 '-fstack-protector',
354 '-fstack-protector-strong',
355 '--param=ssp-buffer-size=4',
356]
357
358# --as-needed and --no-undefined are provided by meson by default,
359# run mesonconf to see what is enabled
360possible_link_flags = [
361 '-Wl,-z,relro',
362 '-Wl,-z,now',
363]
364
365# the oss-fuzz fuzzers are not built with -fPIE, so don't
366# enable it when we are linking against them
367if not fuzzer_build
368 possible_cc_flags += '-fPIE'
369 possible_link_flags += '-pie'
370endif
371
372if cc.get_id() == 'clang'
373 possible_cc_flags += [
374 '-Wno-typedef-redefinition',
375 '-Wno-gnu-variable-sized-type-not-at-end',
376 ]
377endif
378
379if get_option('buildtype') != 'debug'
380 possible_cc_flags += [
381 '-ffunction-sections',
382 '-fdata-sections',
383 ]
384
385 possible_link_flags += '-Wl,--gc-sections'
386endif
387
388add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
389add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
390
391if cc.compiles('''
392 #include <time.h>
393 #include <inttypes.h>
394 typedef uint64_t usec_t;
395 usec_t now(clockid_t clock);
396 int main(void) {
397 struct timespec now;
398 return 0;
399 }
400''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
401 add_project_arguments('-Werror=shadow', language : 'c')
402endif
403
404cpp = ' '.join(cc.cmd_array()) + ' -E'
405
406#####################################################################
407# compilation result tests
408
409conf.set('_GNU_SOURCE', true)
410conf.set('__SANE_USERSPACE_TYPES__', true)
411
412conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
413conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
414conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
415conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
416conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
417conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
418conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
419
420decl_headers = '''
421#include <uchar.h>
422#include <linux/ethtool.h>
423#include <linux/fib_rules.h>
424#include <sys/stat.h>
425'''
426
427foreach decl : ['char16_t',
428 'char32_t',
429 'struct fib_rule_uid_range',
430 'struct fib_rule_port_range',
431 'struct statx',
432 ]
433
434 # We get -1 if the size cannot be determined
435 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
436
437 if decl == 'struct statx'
438 if have
439 want_linux_stat_h = false
440 else
441 have = cc.sizeof(decl,
442 prefix : decl_headers + '#include <linux/stat.h>',
443 args : '-D_GNU_SOURCE') > 0
444 want_linux_stat_h = have
445 endif
446 endif
447
448 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
449endforeach
450
451conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
452
453foreach decl : [['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
454 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
455 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
456 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
457 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
458 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
459 ['FRA_TUN_ID', 'linux/fib_rules.h'],
460 ['FRA_SUPPRESS_PREFIXLEN', 'linux/fib_rules.h'],
461 ['FRA_PAD', 'linux/fib_rules.h'],
462 ['FRA_L3MDEV', 'linux/fib_rules.h'],
463 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
464 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
465 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
466 ['FOU_CMD_GET', 'linux/fou.h'],
467 ['IFA_FLAGS', 'linux/if_addr.h'],
468 ['IFLA_BRIDGE_VLAN_TUNNEL_INFO', 'linux/if_bridge.h'],
469 ['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
470 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
471 ['IN6_ADDR_GEN_MODE_RANDOM', 'linux/if_link.h'],
472 ['IFLA_IPVLAN_MODE', 'linux/if_link.h'],
473 ['IPVLAN_MODE_L3S', 'linux/if_link.h'],
474 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
475 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
476 ['IFLA_CARRIER_CHANGES', 'linux/if_link.h'],
477 ['IFLA_PHYS_SWITCH_ID', 'linux/if_link.h'],
478 ['IFLA_LINK_NETNSID', 'linux/if_link.h'],
479 ['IFLA_PHYS_PORT_NAME', 'linux/if_link.h'],
480 ['IFLA_PROTO_DOWN', 'linux/if_link.h'],
481 ['IFLA_GSO_MAX_SIZE', 'linux/if_link.h'],
482 ['IFLA_PAD', 'linux/if_link.h'],
483 ['IFLA_XDP', 'linux/if_link.h'],
484 ['IFLA_EVENT', 'linux/if_link.h'],
485 ['IFLA_IF_NETNSID', 'linux/if_link.h'],
486 ['IFLA_TARGET_NETNSID', 'linux/if_link.h'],
487 ['IFLA_NEW_IFINDEX', 'linux/if_link.h'],
488 ['IFLA_MAX_MTU', 'linux/if_link.h'],
489 ['IFLA_BOND_ACTIVE_SLAVE', 'linux/if_link.h'],
490 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
491 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
492 ['IFLA_BOND_TLB_DYNAMIC_LB', 'linux/if_link.h'],
493 ['IFLA_VXLAN_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
494 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
495 ['IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h'],
496 ['IFLA_VXLAN_LABEL', 'linux/if_link.h'],
497 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
498 ['IFLA_VXLAN_TTL_INHERIT', 'linux/if_link.h'],
499 ['IFLA_GENEVE_TOS', 'linux/if_link.h'],
500 ['IFLA_GENEVE_COLLECT_METADATA', 'linux/if_link.h'],
501 ['IFLA_GENEVE_REMOTE6', 'linux/if_link.h'],
502 ['IFLA_GENEVE_UDP_ZERO_CSUM6_RX', 'linux/if_link.h'],
503 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
504 ['IFLA_GENEVE_TTL_INHERIT', 'linux/if_link.h'],
505 ['IFLA_BR_MAX_AGE', 'linux/if_link.h'],
506 ['IFLA_BR_PRIORITY', 'linux/if_link.h'],
507 ['IFLA_BR_VLAN_PROTOCOL', 'linux/if_link.h'],
508 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
509 ['IFLA_BR_VLAN_STATS_ENABLED', 'linux/if_link.h'],
510 ['IFLA_BR_MCAST_STATS_ENABLED', 'linux/if_link.h'],
511 ['IFLA_BR_MCAST_MLD_VERSION', 'linux/if_link.h'],
512 ['IFLA_BR_VLAN_STATS_PER_PORT', 'linux/if_link.h'],
513 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
514 ['IFLA_BRPORT_PROXYARP_WIFI', 'linux/if_link.h'],
515 ['IFLA_BRPORT_MULTICAST_ROUTER', 'linux/if_link.h'],
516 ['IFLA_BRPORT_PAD', 'linux/if_link.h'],
517 ['IFLA_BRPORT_MCAST_FLOOD', 'linux/if_link.h'],
518 ['IFLA_BRPORT_VLAN_TUNNEL', 'linux/if_link.h'],
519 ['IFLA_BRPORT_BCAST_FLOOD', 'linux/if_link.h'],
520 ['IFLA_BRPORT_NEIGH_SUPPRESS', 'linux/if_link.h'],
521 ['IFLA_BRPORT_ISOLATED', 'linux/if_link.h'],
522 ['IFLA_BRPORT_BACKUP_PORT', 'linux/if_link.h'],
523 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
524 # if_tunnel.h is buggy and cannot be included on its own
525 ['IFLA_VTI_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
526 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
527 ['IFLA_IPTUN_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
528 ['IFLA_IPTUN_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
529 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
530 ['IFLA_GRE_COLLECT_METADATA', 'linux/if_tunnel.h', '#include <net/if.h>'],
531 ['IFLA_GRE_IGNORE_DF', 'linux/if_tunnel.h', '#include <net/if.h>'],
532 ['IFLA_GRE_FWMARK', 'linux/if_tunnel.h', '#include <net/if.h>'],
533 ['IFLA_GRE_ERSPAN_INDEX', 'linux/if_tunnel.h', '#include <net/if.h>'],
534 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
535 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
536 ]
537 prefix = decl.length() > 2 ? decl[2] : ''
538 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
539 conf.set10('HAVE_' + decl[0], have)
540endforeach
541
542foreach ident : ['secure_getenv', '__secure_getenv']
543 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
544endforeach
545
546foreach ident : [
547 ['memfd_create', '''#include <sys/mman.h>'''],
548 ['gettid', '''#include <sys/types.h>
549 #include <unistd.h>'''],
550 ['pivot_root', '''#include <stdlib.h>
551 #include <unistd.h>'''], # no known header declares pivot_root
552 ['name_to_handle_at', '''#include <sys/types.h>
553 #include <sys/stat.h>
554 #include <fcntl.h>'''],
555 ['setns', '''#include <sched.h>'''],
556 ['renameat2', '''#include <stdio.h>
557 #include <fcntl.h>'''],
558 ['kcmp', '''#include <linux/kcmp.h>'''],
559 ['keyctl', '''#include <sys/types.h>
560 #include <keyutils.h>'''],
561 ['copy_file_range', '''#include <sys/syscall.h>
562 #include <unistd.h>'''],
563 ['bpf', '''#include <sys/syscall.h>
564 #include <unistd.h>'''],
565 ['statx', '''#include <sys/types.h>
566 #include <sys/stat.h>
567 #include <unistd.h>'''],
568 ['explicit_bzero' , '''#include <string.h>'''],
569 ['reallocarray', '''#include <malloc.h>'''],
570]
571
572 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
573 conf.set10('HAVE_' + ident[0].to_upper(), have)
574endforeach
575
576if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
577 conf.set10('USE_SYS_RANDOM_H', true)
578 conf.set10('HAVE_GETRANDOM', true)
579else
580 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
581 conf.set10('USE_SYS_RANDOM_H', false)
582 conf.set10('HAVE_GETRANDOM', have)
583endif
584
585#####################################################################
586
587sed = find_program('sed')
588awk = find_program('awk')
589m4 = find_program('m4')
590stat = find_program('stat')
591git = find_program('git', required : false)
592env = find_program('env')
593perl = find_program('perl', required : false)
594
595meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
596mkdir_p = 'mkdir -p $DESTDIR/@0@'
597test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
598splash_bmp = files('test/splash.bmp')
599
600# if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
601# /usr/sbin, /sbin, and fall back to the default from middle column.
602progs = [['quotaon', '/usr/sbin/quotaon' ],
603 ['quotacheck', '/usr/sbin/quotacheck' ],
604 ['kmod', '/usr/bin/kmod' ],
605 ['kexec', '/usr/sbin/kexec' ],
606 ['sulogin', '/usr/sbin/sulogin' ],
607 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
608 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
609 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
610 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
611 ]
612foreach prog : progs
613 path = get_option(prog[0] + '-path')
614 if path != ''
615 message('Using @1@ for @0@'.format(prog[0], path))
616 else
617 exe = find_program(prog[0],
618 '/usr/sbin/' + prog[0],
619 '/sbin/' + prog[0],
620 required: false)
621 path = exe.found() ? exe.path() : prog[1]
622 endif
623 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
624 conf.set_quoted(name, path)
625 substs.set(name, path)
626endforeach
627
628conf.set_quoted('TELINIT', get_option('telinit-path'))
629
630if run_command('ln', '--relative', '--help').returncode() != 0
631 error('ln does not support --relative (added in coreutils 8.16)')
632endif
633
634############################################################
635
636gperf = find_program('gperf')
637
638gperf_test_format = '''
639#include <string.h>
640const char * in_word_set(const char *, @0@);
641@1@
642'''
643gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
644gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
645gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
646if cc.compiles(gperf_test)
647 gperf_len_type = 'size_t'
648else
649 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
650 if cc.compiles(gperf_test)
651 gperf_len_type = 'unsigned'
652 else
653 error('unable to determine gperf len type')
654 endif
655endif
656message('gperf len type is @0@'.format(gperf_len_type))
657conf.set('GPERF_LEN_TYPE', gperf_len_type,
658 description : 'The type of gperf "len" parameter')
659
660############################################################
661
662if not cc.has_header('sys/capability.h')
663 error('POSIX caps headers not found')
664endif
665foreach header : ['crypt.h',
666 'linux/btrfs_tree.h',
667 'linux/fou.h',
668 'linux/memfd.h',
669 'linux/vm_sockets.h',
670 'linux/can/vxcan.h',
671 'sys/auxv.h',
672 'valgrind/memcheck.h',
673 'valgrind/valgrind.h',
674 ]
675
676 conf.set10('HAVE_' + header.underscorify().to_upper(),
677 cc.has_header(header))
678endforeach
679
680############################################################
681
682conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
683conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
684gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
685
686default_hierarchy = get_option('default-hierarchy')
687conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
688 description : 'default cgroup hierarchy as string')
689if default_hierarchy == 'legacy'
690 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
691elif default_hierarchy == 'hybrid'
692 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
693else
694 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
695endif
696
697time_epoch = get_option('time-epoch')
698if time_epoch == -1
699 NEWS = files('NEWS')
700 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
701endif
702conf.set('TIME_EPOCH', time_epoch)
703
704system_uid_max = get_option('system-uid-max')
705if system_uid_max == -1
706 system_uid_max = run_command(
707 awk,
708 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
709 '/etc/login.defs').stdout().strip()
710 if system_uid_max == ''
711 system_uid_max = 999
712 else
713 system_uid_max = system_uid_max.to_int()
714 endif
715endif
716conf.set('SYSTEM_UID_MAX', system_uid_max)
717substs.set('systemuidmax', system_uid_max)
718
719system_gid_max = get_option('system-gid-max')
720if system_gid_max == -1
721 system_gid_max = run_command(
722 awk,
723 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
724 '/etc/login.defs').stdout().strip()
725 if system_gid_max == ''
726 system_gid_max = 999
727 else
728 system_gid_max = system_gid_max.to_int()
729 endif
730endif
731conf.set('SYSTEM_GID_MAX', system_gid_max)
732substs.set('systemgidmax', system_gid_max)
733
734dynamic_uid_min = get_option('dynamic-uid-min')
735dynamic_uid_max = get_option('dynamic-uid-max')
736conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
737conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
738substs.set('dynamicuidmin', dynamic_uid_min)
739substs.set('dynamicuidmax', dynamic_uid_max)
740
741container_uid_base_min = get_option('container-uid-base-min')
742container_uid_base_max = get_option('container-uid-base-max')
743conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
744conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
745substs.set('containeruidbasemin', container_uid_base_min)
746substs.set('containeruidbasemax', container_uid_base_max)
747
748nobody_user = get_option('nobody-user')
749nobody_group = get_option('nobody-group')
750
751if not meson.is_cross_build()
752 getent_result = run_command('getent', 'passwd', '65534')
753 if getent_result.returncode() == 0
754 name = getent_result.stdout().split(':')[0]
755 if name != nobody_user
756 warning('\n' +
757 '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) +
758 'Your build will result in an user table setup that is incompatible with the local system.')
759 endif
760 endif
761 id_result = run_command('id', '-u', nobody_user)
762 if id_result.returncode() == 0
763 id = id_result.stdout().to_int()
764 if id != 65534
765 warning('\n' +
766 '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) +
767 'Your build will result in an user table setup that is incompatible with the local system.')
768 endif
769 endif
770
771 getent_result = run_command('getent', 'group', '65534')
772 if getent_result.returncode() == 0
773 name = getent_result.stdout().split(':')[0]
774 if name != nobody_group
775 warning('\n' +
776 '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) +
777 'Your build will result in an group table setup that is incompatible with the local system.')
778 endif
779 endif
780 id_result = run_command('id', '-g', nobody_group)
781 if id_result.returncode() == 0
782 id = id_result.stdout().to_int()
783 if id != 65534
784 warning('\n' +
785 '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) +
786 'Your build will result in an group table setup that is incompatible with the local system.')
787 endif
788 endif
789endif
790if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
791 warning('\n' +
792 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
793 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
794endif
795
796conf.set_quoted('NOBODY_USER_NAME', nobody_user)
797conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
798substs.set('NOBODY_USER_NAME', nobody_user)
799substs.set('NOBODY_GROUP_NAME', nobody_group)
800
801tty_gid = get_option('tty-gid')
802conf.set('TTY_GID', tty_gid)
803substs.set('TTY_GID', tty_gid)
804
805# Ensure provided GID argument is numeric, otherwise fallback to default assignment
806users_gid = get_option('users-gid')
807substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
808
809conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
810conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
811
812dev_kvm_mode = get_option('dev-kvm-mode')
813substs.set('DEV_KVM_MODE', dev_kvm_mode)
814conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
815substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
816
817kill_user_processes = get_option('default-kill-user-processes')
818conf.set10('KILL_USER_PROCESSES', kill_user_processes)
819conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
820substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
821
822dns_servers = get_option('dns-servers')
823conf.set_quoted('DNS_SERVERS', dns_servers)
824substs.set('DNS_SERVERS', dns_servers)
825
826ntp_servers = get_option('ntp-servers')
827conf.set_quoted('NTP_SERVERS', ntp_servers)
828substs.set('NTP_SERVERS', ntp_servers)
829
830conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
831
832substs.set('SUSHELL', get_option('debug-shell'))
833substs.set('DEBUGTTY', get_option('debug-tty'))
834
835enable_debug_hashmap = false
836enable_debug_mmap_cache = false
837enable_debug_siphash = false
838enable_debug_udev = false
839foreach name : get_option('debug-extra')
840 if name == 'hashmap'
841 enable_debug_hashmap = true
842 elif name == 'mmap-cache'
843 enable_debug_mmap_cache = true
844 elif name == 'siphash'
845 enable_debug_siphash = true
846 elif name == 'udev'
847 enable_debug_udev = true
848 else
849 message('unknown debug option "@0@", ignoring'.format(name))
850 endif
851endforeach
852conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
853conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
854conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
855conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
856
857conf.set10('VALGRIND', get_option('valgrind'))
858conf.set10('LOG_TRACE', get_option('log-trace'))
859
860#####################################################################
861
862threads = dependency('threads')
863librt = cc.find_library('rt')
864libm = cc.find_library('m')
865libdl = cc.find_library('dl')
866libcrypt = cc.find_library('crypt')
867
868libcap = dependency('libcap', required : false)
869if not libcap.found()
870 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
871 libcap = cc.find_library('cap')
872endif
873
874libmount = dependency('mount',
875 version : fuzzer_build ? '>= 0' : '>= 2.30')
876
877want_seccomp = get_option('seccomp')
878if want_seccomp != 'false' and not fuzzer_build
879 libseccomp = dependency('libseccomp',
880 version : '>= 2.3.1',
881 required : want_seccomp == 'true')
882 have = libseccomp.found()
883else
884 have = false
885 libseccomp = []
886endif
887conf.set10('HAVE_SECCOMP', have)
888
889want_selinux = get_option('selinux')
890if want_selinux != 'false' and not fuzzer_build
891 libselinux = dependency('libselinux',
892 version : '>= 2.1.9',
893 required : want_selinux == 'true')
894 have = libselinux.found()
895else
896 have = false
897 libselinux = []
898endif
899conf.set10('HAVE_SELINUX', have)
900
901want_apparmor = get_option('apparmor')
902if want_apparmor != 'false' and not fuzzer_build
903 libapparmor = dependency('libapparmor',
904 required : want_apparmor == 'true')
905 have = libapparmor.found()
906else
907 have = false
908 libapparmor = []
909endif
910conf.set10('HAVE_APPARMOR', have)
911
912smack_run_label = get_option('smack-run-label')
913if smack_run_label != ''
914 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
915endif
916
917want_polkit = get_option('polkit')
918install_polkit = false
919install_polkit_pkla = false
920if want_polkit != 'false' and not fuzzer_build
921 install_polkit = true
922
923 libpolkit = dependency('polkit-gobject-1',
924 required : false)
925 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
926 message('Old polkit detected, will install pkla files')
927 install_polkit_pkla = true
928 endif
929endif
930conf.set10('ENABLE_POLKIT', install_polkit)
931
932want_acl = get_option('acl')
933if want_acl != 'false' and not fuzzer_build
934 libacl = cc.find_library('acl', required : want_acl == 'true')
935 have = libacl.found()
936else
937 have = false
938 libacl = []
939endif
940conf.set10('HAVE_ACL', have)
941
942want_audit = get_option('audit')
943if want_audit != 'false' and not fuzzer_build
944 libaudit = dependency('audit', required : want_audit == 'true')
945 have = libaudit.found()
946else
947 have = false
948 libaudit = []
949endif
950conf.set10('HAVE_AUDIT', have)
951
952want_blkid = get_option('blkid')
953if want_blkid != 'false' and not fuzzer_build
954 libblkid = dependency('blkid', required : want_blkid == 'true')
955 have = libblkid.found()
956else
957 have = false
958 libblkid = []
959endif
960conf.set10('HAVE_BLKID', have)
961
962want_kmod = get_option('kmod')
963if want_kmod != 'false' and not fuzzer_build
964 libkmod = dependency('libkmod',
965 version : '>= 15',
966 required : want_kmod == 'true')
967 have = libkmod.found()
968else
969 have = false
970 libkmod = []
971endif
972conf.set10('HAVE_KMOD', have)
973
974want_pam = get_option('pam')
975if want_pam != 'false' and not fuzzer_build
976 libpam = cc.find_library('pam', required : want_pam == 'true')
977 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
978 have = libpam.found() and libpam_misc.found()
979else
980 have = false
981 libpam = []
982 libpam_misc = []
983endif
984conf.set10('HAVE_PAM', have)
985
986want_microhttpd = get_option('microhttpd')
987if want_microhttpd != 'false' and not fuzzer_build
988 libmicrohttpd = dependency('libmicrohttpd',
989 version : '>= 0.9.33',
990 required : want_microhttpd == 'true')
991 have = libmicrohttpd.found()
992else
993 have = false
994 libmicrohttpd = []
995endif
996conf.set10('HAVE_MICROHTTPD', have)
997
998want_libcryptsetup = get_option('libcryptsetup')
999if want_libcryptsetup != 'false' and not fuzzer_build
1000 libcryptsetup = dependency('libcryptsetup',
1001 version : '>= 1.6.0',
1002 required : want_libcryptsetup == 'true')
1003 have = libcryptsetup.found()
1004 have_sector = cc.has_member(
1005 'struct crypt_params_plain',
1006 'sector_size',
1007 prefix : '#include <libcryptsetup.h>')
1008else
1009 have = false
1010 have_sector = false
1011 libcryptsetup = []
1012endif
1013conf.set10('HAVE_LIBCRYPTSETUP', have)
1014conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
1015
1016want_libcurl = get_option('libcurl')
1017if want_libcurl != 'false' and not fuzzer_build
1018 libcurl = dependency('libcurl',
1019 version : '>= 7.32.0',
1020 required : want_libcurl == 'true')
1021 have = libcurl.found()
1022else
1023 have = false
1024 libcurl = []
1025endif
1026conf.set10('HAVE_LIBCURL', have)
1027
1028want_libidn = get_option('libidn')
1029want_libidn2 = get_option('libidn2')
1030if want_libidn == 'true' and want_libidn2 == 'true'
1031 error('libidn and libidn2 cannot be requested simultaneously')
1032endif
1033
1034if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1035 libidn = dependency('libidn',
1036 required : want_libidn == 'true')
1037 have = libidn.found()
1038else
1039 have = false
1040 libidn = []
1041endif
1042conf.set10('HAVE_LIBIDN', have)
1043if not have and want_libidn2 != 'false' and not fuzzer_build
1044 # libidn is used for both libidn and libidn2 objects
1045 libidn = dependency('libidn2',
1046 required : want_libidn2 == 'true')
1047 have = libidn.found()
1048else
1049 have = false
1050endif
1051conf.set10('HAVE_LIBIDN2', have)
1052
1053want_libiptc = get_option('libiptc')
1054if want_libiptc != 'false' and not fuzzer_build
1055 libiptc = dependency('libiptc',
1056 required : want_libiptc == 'true')
1057 have = libiptc.found()
1058else
1059 have = false
1060 libiptc = []
1061endif
1062conf.set10('HAVE_LIBIPTC', have)
1063
1064want_qrencode = get_option('qrencode')
1065if want_qrencode != 'false' and not fuzzer_build
1066 libqrencode = dependency('libqrencode',
1067 required : want_qrencode == 'true')
1068 have = libqrencode.found()
1069else
1070 have = false
1071 libqrencode = []
1072endif
1073conf.set10('HAVE_QRENCODE', have)
1074
1075want_gcrypt = get_option('gcrypt')
1076if want_gcrypt != 'false' and not fuzzer_build
1077 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1078 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1079 have = libgcrypt.found() and libgpg_error.found()
1080else
1081 have = false
1082endif
1083if not have
1084 # link to neither of the libs if one is not found
1085 libgcrypt = []
1086 libgpg_error = []
1087endif
1088conf.set10('HAVE_GCRYPT', have)
1089
1090want_gnutls = get_option('gnutls')
1091if want_gnutls != 'false' and not fuzzer_build
1092 libgnutls = dependency('gnutls',
1093 version : '>= 3.1.4',
1094 required : want_gnutls == 'true')
1095 have = libgnutls.found()
1096else
1097 have = false
1098 libgnutls = []
1099endif
1100conf.set10('HAVE_GNUTLS', have)
1101
1102want_openssl = get_option('openssl')
1103if want_openssl != 'false' and not fuzzer_build
1104 libopenssl = dependency('openssl',
1105 version : '>= 1.1.0',
1106 required : want_openssl == 'true')
1107 have = libopenssl.found()
1108else
1109 have = false
1110 libopenssl = []
1111endif
1112conf.set10('HAVE_OPENSSL', have)
1113
1114want_elfutils = get_option('elfutils')
1115if want_elfutils != 'false' and not fuzzer_build
1116 libdw = dependency('libdw',
1117 required : want_elfutils == 'true')
1118 have = libdw.found()
1119else
1120 have = false
1121 libdw = []
1122endif
1123conf.set10('HAVE_ELFUTILS', have)
1124
1125want_zlib = get_option('zlib')
1126if want_zlib != 'false' and not fuzzer_build
1127 libz = dependency('zlib',
1128 required : want_zlib == 'true')
1129 have = libz.found()
1130else
1131 have = false
1132 libz = []
1133endif
1134conf.set10('HAVE_ZLIB', have)
1135
1136want_bzip2 = get_option('bzip2')
1137if want_bzip2 != 'false' and not fuzzer_build
1138 libbzip2 = cc.find_library('bz2',
1139 required : want_bzip2 == 'true')
1140 have = libbzip2.found()
1141else
1142 have = false
1143 libbzip2 = []
1144endif
1145conf.set10('HAVE_BZIP2', have)
1146
1147want_xz = get_option('xz')
1148if want_xz != 'false' and not fuzzer_build
1149 libxz = dependency('liblzma',
1150 required : want_xz == 'true')
1151 have = libxz.found()
1152else
1153 have = false
1154 libxz = []
1155endif
1156conf.set10('HAVE_XZ', have)
1157
1158want_lz4 = get_option('lz4')
1159if want_lz4 != 'false' and not fuzzer_build
1160 liblz4 = dependency('liblz4',
1161 version : '>= 1.3.0',
1162 required : want_lz4 == 'true')
1163 have = liblz4.found()
1164else
1165 have = false
1166 liblz4 = []
1167endif
1168conf.set10('HAVE_LZ4', have)
1169
1170want_xkbcommon = get_option('xkbcommon')
1171if want_xkbcommon != 'false' and not fuzzer_build
1172 libxkbcommon = dependency('xkbcommon',
1173 version : '>= 0.3.0',
1174 required : want_xkbcommon == 'true')
1175 have = libxkbcommon.found()
1176else
1177 have = false
1178 libxkbcommon = []
1179endif
1180conf.set10('HAVE_XKBCOMMON', have)
1181
1182want_pcre2 = get_option('pcre2')
1183if want_pcre2 != 'false'
1184 libpcre2 = dependency('libpcre2-8',
1185 required : want_pcre2 == 'true')
1186 have = libpcre2.found()
1187else
1188 have = false
1189 libpcre2 = []
1190endif
1191conf.set10('HAVE_PCRE2', have)
1192
1193want_glib = get_option('glib')
1194if want_glib != 'false' and not fuzzer_build
1195 libglib = dependency('glib-2.0',
1196 version : '>= 2.22.0',
1197 required : want_glib == 'true')
1198 libgobject = dependency('gobject-2.0',
1199 version : '>= 2.22.0',
1200 required : want_glib == 'true')
1201 libgio = dependency('gio-2.0',
1202 required : want_glib == 'true')
1203 have = libglib.found() and libgobject.found() and libgio.found()
1204else
1205 have = false
1206 libglib = []
1207 libgobject = []
1208 libgio = []
1209endif
1210conf.set10('HAVE_GLIB', have)
1211
1212want_dbus = get_option('dbus')
1213if want_dbus != 'false' and not fuzzer_build
1214 libdbus = dependency('dbus-1',
1215 version : '>= 1.3.2',
1216 required : want_dbus == 'true')
1217 have = libdbus.found()
1218else
1219 have = false
1220 libdbus = []
1221endif
1222conf.set10('HAVE_DBUS', have)
1223
1224default_dnssec = get_option('default-dnssec')
1225if fuzzer_build
1226 default_dnssec = 'no'
1227endif
1228if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1229 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1230 default_dnssec = 'no'
1231endif
1232conf.set('DEFAULT_DNSSEC_MODE',
1233 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1234substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1235
1236dns_over_tls = get_option('dns-over-tls')
1237if dns_over_tls != 'false'
1238 if dns_over_tls == 'openssl'
1239 have_gnutls = false
1240 else
1241 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1242 if dns_over_tls == 'gnutls' and not have_gnutls
1243 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1244 endif
1245 endif
1246 if dns_over_tls == 'gnutls' or have_gnutls
1247 have_openssl = false
1248 else
1249 have_openssl = conf.get('HAVE_OPENSSL') == 1
1250 if dns_over_tls != 'auto' and not have_openssl
1251 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1252 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1253 endif
1254 endif
1255 have = have_gnutls or have_openssl
1256else
1257 have = false
1258 have_gnutls = false
1259 have_openssl = false
1260endif
1261conf.set10('ENABLE_DNS_OVER_TLS', have)
1262conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1263conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1264
1265default_dns_over_tls = get_option('default-dns-over-tls')
1266if fuzzer_build
1267 default_dns_over_tls = 'no'
1268endif
1269if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1270 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1271 default_dns_over_tls = 'no'
1272endif
1273conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1274 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1275substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1276
1277want_importd = get_option('importd')
1278if want_importd != 'false'
1279 have = (conf.get('HAVE_LIBCURL') == 1 and
1280 conf.get('HAVE_ZLIB') == 1 and
1281 conf.get('HAVE_XZ') == 1 and
1282 conf.get('HAVE_GCRYPT') == 1)
1283 if want_importd == 'true' and not have
1284 error('importd support was requested, but dependencies are not available')
1285 endif
1286else
1287 have = false
1288endif
1289conf.set10('ENABLE_IMPORTD', have)
1290
1291want_remote = get_option('remote')
1292if want_remote != 'false'
1293 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1294 conf.get('HAVE_LIBCURL') == 1]
1295 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1296 # it's possible to build one without the other. Complain only if
1297 # support was explictly requested. The auxiliary files like sysusers
1298 # config should be installed when any of the programs are built.
1299 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1300 error('remote support was requested, but dependencies are not available')
1301 endif
1302 have = have_deps[0] or have_deps[1]
1303else
1304 have = false
1305endif
1306conf.set10('ENABLE_REMOTE', have)
1307
1308foreach term : ['utmp',
1309 'hibernate',
1310 'environment-d',
1311 'binfmt',
1312 'coredump',
1313 'resolve',
1314 'logind',
1315 'hostnamed',
1316 'localed',
1317 'machined',
1318 'portabled',
1319 'networkd',
1320 'timedated',
1321 'timesyncd',
1322 'firstboot',
1323 'randomseed',
1324 'backlight',
1325 'vconsole',
1326 'quotacheck',
1327 'sysusers',
1328 'tmpfiles',
1329 'hwdb',
1330 'rfkill',
1331 'ldconfig',
1332 'efi',
1333 'tpm',
1334 'ima',
1335 'smack',
1336 'gshadow',
1337 'idn',
1338 'nss-myhostname',
1339 'nss-systemd']
1340 have = get_option(term)
1341 name = 'ENABLE_' + term.underscorify().to_upper()
1342 conf.set10(name, have)
1343endforeach
1344
1345foreach tuple : [['nss-mymachines', 'machined'],
1346 ['nss-resolve', 'resolve']]
1347 want = get_option(tuple[0])
1348 if want != 'false'
1349 have = get_option(tuple[1])
1350 if want == 'true' and not have
1351 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1352 endif
1353 else
1354 have = false
1355 endif
1356 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1357 conf.set10(name, have)
1358endforeach
1359
1360enable_nss = false
1361foreach term : ['ENABLE_NSS_MYHOSTNAME',
1362 'ENABLE_NSS_MYMACHINES',
1363 'ENABLE_NSS_RESOLVE',
1364 'ENABLE_NSS_SYSTEMD']
1365 if conf.get(term) == 1
1366 enable_nss = true
1367 endif
1368endforeach
1369conf.set10('ENABLE_NSS', enable_nss)
1370
1371conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1372
1373tests = []
1374fuzzers = []
1375
1376conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1377
1378#####################################################################
1379
1380if get_option('efi')
1381 efi_arch = host_machine.cpu_family()
1382
1383 if efi_arch == 'x86'
1384 EFI_MACHINE_TYPE_NAME = 'ia32'
1385 gnu_efi_arch = 'ia32'
1386 elif efi_arch == 'x86_64'
1387 EFI_MACHINE_TYPE_NAME = 'x64'
1388 gnu_efi_arch = 'x86_64'
1389 elif efi_arch == 'arm'
1390 EFI_MACHINE_TYPE_NAME = 'arm'
1391 gnu_efi_arch = 'arm'
1392 elif efi_arch == 'aarch64'
1393 EFI_MACHINE_TYPE_NAME = 'aa64'
1394 gnu_efi_arch = 'aarch64'
1395 else
1396 EFI_MACHINE_TYPE_NAME = ''
1397 gnu_efi_arch = ''
1398 endif
1399
1400 have = true
1401 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1402
1403 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1404else
1405 have = false
1406endif
1407conf.set10('ENABLE_EFI', have)
1408
1409#####################################################################
1410
1411config_h = configure_file(
1412 output : 'config.h',
1413 configuration : conf)
1414
1415meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1416
1417includes = include_directories('src/basic',
1418 'src/shared',
1419 'src/systemd',
1420 'src/journal',
1421 'src/journal-remote',
1422 'src/nspawn',
1423 'src/resolve',
1424 'src/timesync',
1425 'src/time-wait-sync',
1426 'src/login',
1427 'src/udev',
1428 'src/libudev',
1429 'src/core',
1430 'src/libsystemd/sd-bus',
1431 'src/libsystemd/sd-device',
1432 'src/libsystemd/sd-event',
1433 'src/libsystemd/sd-hwdb',
1434 'src/libsystemd/sd-id128',
1435 'src/libsystemd/sd-netlink',
1436 'src/libsystemd/sd-network',
1437 'src/libsystemd-network',
1438 '.')
1439
1440add_project_arguments('-include', 'config.h', language : 'c')
1441
1442generate_gperfs = find_program('tools/generate-gperfs.py')
1443
1444subdir('po')
1445subdir('catalog')
1446subdir('src/systemd')
1447subdir('src/basic')
1448subdir('src/libsystemd')
1449subdir('src/libsystemd-network')
1450subdir('src/journal')
1451subdir('src/login')
1452
1453libjournal_core = static_library(
1454 'journal-core',
1455 libjournal_core_sources,
1456 journald_gperf_c,
1457 include_directories : includes,
1458 install : false)
1459
1460libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1461libsystemd = shared_library(
1462 'systemd',
1463 disable_mempool_c,
1464 version : libsystemd_version,
1465 include_directories : includes,
1466 link_args : ['-shared',
1467 '-Wl,--version-script=' + libsystemd_sym_path],
1468 link_with : [libbasic,
1469 libbasic_gcrypt],
1470 link_whole : [libsystemd_static,
1471 libjournal_client],
1472 dependencies : [threads,
1473 librt,
1474 libxz,
1475 liblz4],
1476 link_depends : libsystemd_sym,
1477 install : true,
1478 install_dir : rootlibdir)
1479
1480static_libsystemd = get_option('static-libsystemd')
1481static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1482
1483install_libsystemd_static = static_library(
1484 'systemd',
1485 libsystemd_sources,
1486 journal_client_sources,
1487 basic_sources,
1488 basic_gcrypt_sources,
1489 disable_mempool_c,
1490 include_directories : includes,
1491 build_by_default : static_libsystemd != 'false',
1492 install : static_libsystemd != 'false',
1493 install_dir : rootlibdir,
1494 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1495 dependencies : [threads,
1496 librt,
1497 libxz,
1498 liblz4,
1499 libcap,
1500 libblkid,
1501 libmount,
1502 libselinux,
1503 libgcrypt],
1504 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1505
1506############################################################
1507
1508# binaries that have --help and are intended for use by humans,
1509# usually, but not always, installed in /bin.
1510public_programs = []
1511
1512subdir('src/libudev')
1513subdir('src/shared')
1514subdir('src/core')
1515subdir('src/udev')
1516subdir('src/network')
1517
1518subdir('src/analyze')
1519subdir('src/journal-remote')
1520subdir('src/coredump')
1521subdir('src/hostname')
1522subdir('src/import')
1523subdir('src/kernel-install')
1524subdir('src/locale')
1525subdir('src/machine')
1526subdir('src/portable')
1527subdir('src/nspawn')
1528subdir('src/resolve')
1529subdir('src/timedate')
1530subdir('src/timesync')
1531subdir('src/vconsole')
1532subdir('src/boot/efi')
1533
1534subdir('src/test')
1535subdir('src/fuzz')
1536subdir('rules')
1537subdir('test')
1538
1539############################################################
1540
1541# only static linking apart from libdl, to make sure that the
1542# module is linked to all libraries that it uses.
1543test_dlopen = executable(
1544 'test-dlopen',
1545 test_dlopen_c,
1546 disable_mempool_c,
1547 include_directories : includes,
1548 link_with : [libbasic],
1549 dependencies : [libdl],
1550 build_by_default : want_tests != 'false')
1551
1552foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1553 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1554 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1555 ['resolve', 'ENABLE_NSS_RESOLVE']]
1556
1557 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1558 if condition
1559 module = tuple[0]
1560
1561 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1562 version_script_arg = join_paths(meson.source_root(), sym)
1563
1564 nss = shared_library(
1565 'nss_' + module,
1566 'src/nss-@0@/nss-@0@.c'.format(module),
1567 disable_mempool_c,
1568 version : '2',
1569 include_directories : includes,
1570 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1571 link_args : ['-Wl,-z,nodelete',
1572 '-shared',
1573 '-Wl,--version-script=' + version_script_arg,
1574 '-Wl,--undefined'],
1575 link_with : [libsystemd_static,
1576 libbasic],
1577 dependencies : [threads,
1578 librt],
1579 link_depends : sym,
1580 install : true,
1581 install_dir : rootlibdir)
1582
1583 # We cannot use shared_module because it does not support version suffix.
1584 # Unfortunately shared_library insists on creating the symlink…
1585 meson.add_install_script('sh', '-c',
1586 'rm $DESTDIR@0@/libnss_@1@.so'
1587 .format(rootlibdir, module))
1588
1589 if want_tests != 'false'
1590 test('dlopen-nss_' + module,
1591 test_dlopen,
1592 # path to dlopen must include a slash
1593 args : nss.full_path())
1594 endif
1595 endif
1596endforeach
1597
1598############################################################
1599
1600executable('systemd',
1601 systemd_sources,
1602 include_directories : includes,
1603 link_with : [libcore,
1604 libshared],
1605 dependencies : [threads,
1606 librt,
1607 libseccomp,
1608 libselinux,
1609 libmount,
1610 libblkid],
1611 install_rpath : rootlibexecdir,
1612 install : true,
1613 install_dir : rootlibexecdir)
1614
1615meson.add_install_script(meson_make_symlink,
1616 join_paths(rootlibexecdir, 'systemd'),
1617 join_paths(rootsbindir, 'init'))
1618
1619exe = executable('systemd-analyze',
1620 systemd_analyze_sources,
1621 include_directories : includes,
1622 link_with : [libcore,
1623 libshared],
1624 dependencies : [threads,
1625 librt,
1626 libseccomp,
1627 libselinux,
1628 libmount,
1629 libblkid],
1630 install_rpath : rootlibexecdir,
1631 install : true)
1632public_programs += exe
1633
1634executable('systemd-journald',
1635 systemd_journald_sources,
1636 include_directories : includes,
1637 link_with : [libjournal_core,
1638 libshared],
1639 dependencies : [threads,
1640 libxz,
1641 liblz4,
1642 libselinux],
1643 install_rpath : rootlibexecdir,
1644 install : true,
1645 install_dir : rootlibexecdir)
1646
1647exe = executable('systemd-cat',
1648 systemd_cat_sources,
1649 include_directories : includes,
1650 link_with : [libjournal_core,
1651 libshared],
1652 dependencies : [threads],
1653 install_rpath : rootlibexecdir,
1654 install : true)
1655public_programs += exe
1656
1657exe = executable('journalctl',
1658 journalctl_sources,
1659 include_directories : includes,
1660 link_with : [libshared],
1661 dependencies : [threads,
1662 libqrencode,
1663 libxz,
1664 liblz4,
1665 libpcre2],
1666 install_rpath : rootlibexecdir,
1667 install : true,
1668 install_dir : rootbindir)
1669public_programs += exe
1670
1671executable('systemd-getty-generator',
1672 'src/getty-generator/getty-generator.c',
1673 include_directories : includes,
1674 link_with : [libshared],
1675 install_rpath : rootlibexecdir,
1676 install : true,
1677 install_dir : systemgeneratordir)
1678
1679executable('systemd-debug-generator',
1680 'src/debug-generator/debug-generator.c',
1681 include_directories : includes,
1682 link_with : [libshared],
1683 install_rpath : rootlibexecdir,
1684 install : true,
1685 install_dir : systemgeneratordir)
1686
1687executable('systemd-run-generator',
1688 'src/run-generator/run-generator.c',
1689 include_directories : includes,
1690 link_with : [libshared],
1691 install_rpath : rootlibexecdir,
1692 install : true,
1693 install_dir : systemgeneratordir)
1694
1695executable('systemd-fstab-generator',
1696 'src/fstab-generator/fstab-generator.c',
1697 'src/core/mount-setup.c',
1698 include_directories : includes,
1699 link_with : [libshared],
1700 install_rpath : rootlibexecdir,
1701 install : true,
1702 install_dir : systemgeneratordir)
1703
1704if conf.get('ENABLE_ENVIRONMENT_D') == 1
1705 executable('30-systemd-environment-d-generator',
1706 'src/environment-d-generator/environment-d-generator.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 install_rpath : rootlibexecdir,
1710 install : true,
1711 install_dir : userenvgeneratordir)
1712
1713 meson.add_install_script(meson_make_symlink,
1714 join_paths(sysconfdir, 'environment'),
1715 join_paths(environmentdir, '99-environment.conf'))
1716endif
1717
1718if conf.get('ENABLE_HIBERNATE') == 1
1719 executable('systemd-hibernate-resume-generator',
1720 'src/hibernate-resume/hibernate-resume-generator.c',
1721 include_directories : includes,
1722 link_with : [libshared],
1723 install_rpath : rootlibexecdir,
1724 install : true,
1725 install_dir : systemgeneratordir)
1726
1727 executable('systemd-hibernate-resume',
1728 'src/hibernate-resume/hibernate-resume.c',
1729 include_directories : includes,
1730 link_with : [libshared],
1731 install_rpath : rootlibexecdir,
1732 install : true,
1733 install_dir : rootlibexecdir)
1734endif
1735
1736if conf.get('HAVE_BLKID') == 1
1737 executable('systemd-gpt-auto-generator',
1738 'src/gpt-auto-generator/gpt-auto-generator.c',
1739 'src/shared/blkid-util.h',
1740 include_directories : includes,
1741 link_with : [libshared],
1742 dependencies : libblkid,
1743 install_rpath : rootlibexecdir,
1744 install : true,
1745 install_dir : systemgeneratordir)
1746
1747 exe = executable('systemd-dissect',
1748 'src/dissect/dissect.c',
1749 include_directories : includes,
1750 link_with : [libshared],
1751 install_rpath : rootlibexecdir,
1752 install : true,
1753 install_dir : rootlibexecdir)
1754 public_programs += exe
1755endif
1756
1757if conf.get('ENABLE_RESOLVE') == 1
1758 executable('systemd-resolved',
1759 systemd_resolved_sources,
1760 include_directories : includes,
1761 link_with : [libshared,
1762 libbasic_gcrypt,
1763 libsystemd_resolve_core],
1764 dependencies : systemd_resolved_dependencies,
1765 install_rpath : rootlibexecdir,
1766 install : true,
1767 install_dir : rootlibexecdir)
1768
1769 exe = executable('resolvectl',
1770 resolvectl_sources,
1771 include_directories : includes,
1772 link_with : [libshared,
1773 libbasic_gcrypt,
1774 libsystemd_resolve_core],
1775 dependencies : [threads,
1776 libgpg_error,
1777 libm,
1778 libidn],
1779 install_rpath : rootlibexecdir,
1780 install : true)
1781 public_programs += exe
1782
1783 meson.add_install_script(meson_make_symlink,
1784 join_paths(bindir, 'resolvectl'),
1785 join_paths(rootsbindir, 'resolvconf'))
1786
1787 meson.add_install_script(meson_make_symlink,
1788 join_paths(bindir, 'resolvectl'),
1789 join_paths(bindir, 'systemd-resolve'))
1790endif
1791
1792if conf.get('ENABLE_LOGIND') == 1
1793 executable('systemd-logind',
1794 systemd_logind_sources,
1795 include_directories : includes,
1796 link_with : [liblogind_core,
1797 libshared],
1798 dependencies : [threads,
1799 libacl],
1800 install_rpath : rootlibexecdir,
1801 install : true,
1802 install_dir : rootlibexecdir)
1803
1804 exe = executable('loginctl',
1805 loginctl_sources,
1806 include_directories : includes,
1807 link_with : [libshared],
1808 dependencies : [threads,
1809 liblz4,
1810 libxz],
1811 install_rpath : rootlibexecdir,
1812 install : true,
1813 install_dir : rootbindir)
1814 public_programs += exe
1815
1816 exe = executable('systemd-inhibit',
1817 'src/login/inhibit.c',
1818 include_directories : includes,
1819 link_with : [libshared],
1820 install_rpath : rootlibexecdir,
1821 install : true,
1822 install_dir : rootbindir)
1823 public_programs += exe
1824
1825 if conf.get('HAVE_PAM') == 1
1826 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1827 pam_systemd = shared_library(
1828 'pam_systemd',
1829 pam_systemd_c,
1830 name_prefix : '',
1831 include_directories : includes,
1832 link_args : ['-shared',
1833 '-Wl,--version-script=' + version_script_arg],
1834 link_with : [libsystemd_static,
1835 libshared_static],
1836 dependencies : [threads,
1837 libpam,
1838 libpam_misc],
1839 link_depends : pam_systemd_sym,
1840 install : true,
1841 install_dir : pamlibdir)
1842
1843 if want_tests != 'false'
1844 test('dlopen-pam_systemd',
1845 test_dlopen,
1846 # path to dlopen must include a slash
1847 args : pam_systemd.full_path())
1848 endif
1849 endif
1850
1851 executable('systemd-user-runtime-dir',
1852 user_runtime_dir_sources,
1853 include_directories : includes,
1854 link_with : [libshared],
1855 install_rpath : rootlibexecdir,
1856 install : true,
1857 install_dir : rootlibexecdir)
1858endif
1859
1860if conf.get('HAVE_PAM') == 1
1861 executable('systemd-user-sessions',
1862 'src/user-sessions/user-sessions.c',
1863 include_directories : includes,
1864 link_with : [libshared],
1865 install_rpath : rootlibexecdir,
1866 install : true,
1867 install_dir : rootlibexecdir)
1868endif
1869
1870if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1871 exe = executable('bootctl',
1872 'src/boot/bootctl.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 dependencies : [libblkid],
1876 install_rpath : rootlibexecdir,
1877 install : true)
1878 public_programs += exe
1879
1880 executable('systemd-bless-boot',
1881 'src/boot/bless-boot.c',
1882 include_directories : includes,
1883 link_with : [libshared],
1884 dependencies : [libblkid],
1885 install_rpath : rootlibexecdir,
1886 install : true,
1887 install_dir : rootlibexecdir)
1888
1889 executable('systemd-bless-boot-generator',
1890 'src/boot/bless-boot-generator.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 install_rpath : rootlibexecdir,
1894 install : true,
1895 install_dir : systemgeneratordir)
1896endif
1897
1898executable('systemd-boot-check-no-failures',
1899 'src/boot/boot-check-no-failures.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 dependencies : [libblkid],
1903 install_rpath : rootlibexecdir,
1904 install : true,
1905 install_dir : rootlibexecdir)
1906
1907exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1908 include_directories : includes,
1909 link_with : [libshared],
1910 dependencies : [threads],
1911 install_rpath : rootlibexecdir,
1912 install : true)
1913public_programs += exe
1914
1915
1916if get_option('link-systemctl-shared')
1917 systemctl_link_with = [libshared]
1918else
1919 systemctl_link_with = [libsystemd_static,
1920 libshared_static,
1921 libjournal_client,
1922 libbasic_gcrypt]
1923endif
1924
1925exe = executable('systemctl', 'src/systemctl/systemctl.c',
1926 include_directories : includes,
1927 link_with : systemctl_link_with,
1928 dependencies : [threads,
1929 libcap,
1930 libselinux,
1931 libxz,
1932 liblz4],
1933 install_rpath : rootlibexecdir,
1934 install : true,
1935 install_dir : rootbindir)
1936public_programs += exe
1937
1938if conf.get('ENABLE_PORTABLED') == 1
1939 executable('systemd-portabled',
1940 systemd_portabled_sources,
1941 include_directories : includes,
1942 link_with : [libshared],
1943 dependencies : [threads],
1944 install_rpath : rootlibexecdir,
1945 install : true,
1946 install_dir : rootlibexecdir)
1947
1948 exe = executable('portablectl', 'src/portable/portablectl.c',
1949 include_directories : includes,
1950 link_with : [libshared],
1951 dependencies : [threads],
1952 install_rpath : rootlibexecdir,
1953 install : true,
1954 install_dir : rootbindir)
1955 public_programs += exe
1956endif
1957
1958foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1959 meson.add_install_script(meson_make_symlink,
1960 join_paths(rootbindir, 'systemctl'),
1961 join_paths(rootsbindir, alias))
1962endforeach
1963
1964if conf.get('ENABLE_BACKLIGHT') == 1
1965 executable('systemd-backlight',
1966 'src/backlight/backlight.c',
1967 include_directories : includes,
1968 link_with : [libshared],
1969 install_rpath : rootlibexecdir,
1970 install : true,
1971 install_dir : rootlibexecdir)
1972endif
1973
1974if conf.get('ENABLE_RFKILL') == 1
1975 executable('systemd-rfkill',
1976 'src/rfkill/rfkill.c',
1977 include_directories : includes,
1978 link_with : [libshared],
1979 install_rpath : rootlibexecdir,
1980 install : true,
1981 install_dir : rootlibexecdir)
1982endif
1983
1984executable('systemd-system-update-generator',
1985 'src/system-update-generator/system-update-generator.c',
1986 include_directories : includes,
1987 link_with : [libshared],
1988 install_rpath : rootlibexecdir,
1989 install : true,
1990 install_dir : systemgeneratordir)
1991
1992if conf.get('HAVE_LIBCRYPTSETUP') == 1
1993 executable('systemd-cryptsetup',
1994 'src/cryptsetup/cryptsetup.c',
1995 include_directories : includes,
1996 link_with : [libshared],
1997 dependencies : [libcryptsetup],
1998 install_rpath : rootlibexecdir,
1999 install : true,
2000 install_dir : rootlibexecdir)
2001
2002 executable('systemd-cryptsetup-generator',
2003 'src/cryptsetup/cryptsetup-generator.c',
2004 include_directories : includes,
2005 link_with : [libshared],
2006 dependencies : [libcryptsetup],
2007 install_rpath : rootlibexecdir,
2008 install : true,
2009 install_dir : systemgeneratordir)
2010
2011 executable('systemd-veritysetup',
2012 'src/veritysetup/veritysetup.c',
2013 include_directories : includes,
2014 link_with : [libshared],
2015 dependencies : [libcryptsetup],
2016 install_rpath : rootlibexecdir,
2017 install : true,
2018 install_dir : rootlibexecdir)
2019
2020 executable('systemd-veritysetup-generator',
2021 'src/veritysetup/veritysetup-generator.c',
2022 include_directories : includes,
2023 link_with : [libshared],
2024 dependencies : [libcryptsetup],
2025 install_rpath : rootlibexecdir,
2026 install : true,
2027 install_dir : systemgeneratordir)
2028endif
2029
2030if conf.get('HAVE_SYSV_COMPAT') == 1
2031 executable('systemd-sysv-generator',
2032 'src/sysv-generator/sysv-generator.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 install_rpath : rootlibexecdir,
2036 install : true,
2037 install_dir : systemgeneratordir)
2038
2039 executable('systemd-rc-local-generator',
2040 'src/rc-local-generator/rc-local-generator.c',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 install_rpath : rootlibexecdir,
2044 install : true,
2045 install_dir : systemgeneratordir)
2046endif
2047
2048if conf.get('ENABLE_HOSTNAMED') == 1
2049 executable('systemd-hostnamed',
2050 'src/hostname/hostnamed.c',
2051 include_directories : includes,
2052 link_with : [libshared],
2053 install_rpath : rootlibexecdir,
2054 install : true,
2055 install_dir : rootlibexecdir)
2056
2057 exe = executable('hostnamectl',
2058 'src/hostname/hostnamectl.c',
2059 include_directories : includes,
2060 link_with : [libshared],
2061 install_rpath : rootlibexecdir,
2062 install : true)
2063 public_programs += exe
2064endif
2065
2066if conf.get('ENABLE_LOCALED') == 1
2067 if conf.get('HAVE_XKBCOMMON') == 1
2068 # logind will load libxkbcommon.so dynamically on its own
2069 deps = [libdl]
2070 else
2071 deps = []
2072 endif
2073
2074 executable('systemd-localed',
2075 systemd_localed_sources,
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : deps,
2079 install_rpath : rootlibexecdir,
2080 install : true,
2081 install_dir : rootlibexecdir)
2082
2083 exe = executable('localectl',
2084 localectl_sources,
2085 include_directories : includes,
2086 link_with : [libshared],
2087 install_rpath : rootlibexecdir,
2088 install : true)
2089 public_programs += exe
2090endif
2091
2092if conf.get('ENABLE_TIMEDATED') == 1
2093 executable('systemd-timedated',
2094 'src/timedate/timedated.c',
2095 include_directories : includes,
2096 link_with : [libshared],
2097 install_rpath : rootlibexecdir,
2098 install : true,
2099 install_dir : rootlibexecdir)
2100endif
2101
2102if conf.get('ENABLE_TIMEDATECTL') == 1
2103 exe = executable('timedatectl',
2104 'src/timedate/timedatectl.c',
2105 include_directories : includes,
2106 install_rpath : rootlibexecdir,
2107 link_with : [libshared],
2108 dependencies : [libm],
2109 install : true)
2110 public_programs += exe
2111endif
2112
2113if conf.get('ENABLE_TIMESYNCD') == 1
2114 executable('systemd-timesyncd',
2115 systemd_timesyncd_sources,
2116 include_directories : includes,
2117 link_with : [libshared],
2118 dependencies : [threads,
2119 libm],
2120 install_rpath : rootlibexecdir,
2121 install : true,
2122 install_dir : rootlibexecdir)
2123
2124 executable('systemd-time-wait-sync',
2125 'src/time-wait-sync/time-wait-sync.c',
2126 include_directories : includes,
2127 link_with : [libshared],
2128 install_rpath : rootlibexecdir,
2129 install : true,
2130 install_dir : rootlibexecdir)
2131endif
2132
2133if conf.get('ENABLE_MACHINED') == 1
2134 executable('systemd-machined',
2135 systemd_machined_sources,
2136 include_directories : includes,
2137 link_with : [libmachine_core,
2138 libshared],
2139 install_rpath : rootlibexecdir,
2140 install : true,
2141 install_dir : rootlibexecdir)
2142
2143 exe = executable('machinectl',
2144 'src/machine/machinectl.c',
2145 include_directories : includes,
2146 link_with : [libshared],
2147 dependencies : [threads,
2148 libxz,
2149 liblz4],
2150 install_rpath : rootlibexecdir,
2151 install : true,
2152 install_dir : rootbindir)
2153 public_programs += exe
2154endif
2155
2156if conf.get('ENABLE_IMPORTD') == 1
2157 executable('systemd-importd',
2158 systemd_importd_sources,
2159 include_directories : includes,
2160 link_with : [libshared],
2161 dependencies : [threads],
2162 install_rpath : rootlibexecdir,
2163 install : true,
2164 install_dir : rootlibexecdir)
2165
2166 systemd_pull = executable('systemd-pull',
2167 systemd_pull_sources,
2168 include_directories : includes,
2169 link_with : [libshared],
2170 dependencies : [libcurl,
2171 libz,
2172 libbzip2,
2173 libxz,
2174 libgcrypt],
2175 install_rpath : rootlibexecdir,
2176 install : true,
2177 install_dir : rootlibexecdir)
2178
2179 systemd_import = executable('systemd-import',
2180 systemd_import_sources,
2181 include_directories : includes,
2182 link_with : [libshared],
2183 dependencies : [libcurl,
2184 libz,
2185 libbzip2,
2186 libxz],
2187 install_rpath : rootlibexecdir,
2188 install : true,
2189 install_dir : rootlibexecdir)
2190
2191 systemd_import_fs = executable('systemd-import-fs',
2192 systemd_import_fs_sources,
2193 include_directories : includes,
2194 link_with : [libshared],
2195 install_rpath : rootlibexecdir,
2196 install : true,
2197 install_dir : rootlibexecdir)
2198
2199 systemd_export = executable('systemd-export',
2200 systemd_export_sources,
2201 include_directories : includes,
2202 link_with : [libshared],
2203 dependencies : [libcurl,
2204 libz,
2205 libbzip2,
2206 libxz],
2207 install_rpath : rootlibexecdir,
2208 install : true,
2209 install_dir : rootlibexecdir)
2210
2211 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2212endif
2213
2214if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2215 exe = executable('systemd-journal-upload',
2216 systemd_journal_upload_sources,
2217 include_directories : includes,
2218 link_with : [libshared],
2219 dependencies : [threads,
2220 libcurl,
2221 libgnutls,
2222 libxz,
2223 liblz4],
2224 install_rpath : rootlibexecdir,
2225 install : true,
2226 install_dir : rootlibexecdir)
2227 public_programs += exe
2228endif
2229
2230if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2231 s_j_remote = executable('systemd-journal-remote',
2232 systemd_journal_remote_sources,
2233 include_directories : includes,
2234 link_with : [libshared,
2235 libsystemd_journal_remote],
2236 dependencies : [threads,
2237 libmicrohttpd,
2238 libgnutls,
2239 libxz,
2240 liblz4],
2241 install_rpath : rootlibexecdir,
2242 install : true,
2243 install_dir : rootlibexecdir)
2244
2245 s_j_gatewayd = executable('systemd-journal-gatewayd',
2246 systemd_journal_gatewayd_sources,
2247 include_directories : includes,
2248 link_with : [libshared],
2249 dependencies : [threads,
2250 libmicrohttpd,
2251 libgnutls,
2252 libxz,
2253 liblz4],
2254 install_rpath : rootlibexecdir,
2255 install : true,
2256 install_dir : rootlibexecdir)
2257 public_programs += [s_j_remote, s_j_gatewayd]
2258endif
2259
2260if conf.get('ENABLE_COREDUMP') == 1
2261 executable('systemd-coredump',
2262 systemd_coredump_sources,
2263 include_directories : includes,
2264 link_with : [libshared],
2265 dependencies : [threads,
2266 libacl,
2267 libdw,
2268 libxz,
2269 liblz4],
2270 install_rpath : rootlibexecdir,
2271 install : true,
2272 install_dir : rootlibexecdir)
2273
2274 exe = executable('coredumpctl',
2275 coredumpctl_sources,
2276 include_directories : includes,
2277 link_with : [libshared],
2278 dependencies : [threads,
2279 libxz,
2280 liblz4],
2281 install_rpath : rootlibexecdir,
2282 install : true)
2283 public_programs += exe
2284endif
2285
2286if conf.get('ENABLE_BINFMT') == 1
2287 exe = executable('systemd-binfmt',
2288 'src/binfmt/binfmt.c',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 install_rpath : rootlibexecdir,
2292 install : true,
2293 install_dir : rootlibexecdir)
2294 public_programs += exe
2295
2296 meson.add_install_script('sh', '-c',
2297 mkdir_p.format(binfmtdir))
2298 meson.add_install_script('sh', '-c',
2299 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2300endif
2301
2302if conf.get('ENABLE_VCONSOLE') == 1
2303 executable('systemd-vconsole-setup',
2304 'src/vconsole/vconsole-setup.c',
2305 include_directories : includes,
2306 link_with : [libshared],
2307 install_rpath : rootlibexecdir,
2308 install : true,
2309 install_dir : rootlibexecdir)
2310endif
2311
2312if conf.get('ENABLE_RANDOMSEED') == 1
2313 executable('systemd-random-seed',
2314 'src/random-seed/random-seed.c',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 install_rpath : rootlibexecdir,
2318 install : true,
2319 install_dir : rootlibexecdir)
2320endif
2321
2322if conf.get('ENABLE_FIRSTBOOT') == 1
2323 executable('systemd-firstboot',
2324 'src/firstboot/firstboot.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 dependencies : [libcrypt],
2328 install_rpath : rootlibexecdir,
2329 install : true,
2330 install_dir : rootbindir)
2331endif
2332
2333executable('systemd-remount-fs',
2334 'src/remount-fs/remount-fs.c',
2335 'src/core/mount-setup.c',
2336 'src/core/mount-setup.h',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2340 install : true,
2341 install_dir : rootlibexecdir)
2342
2343executable('systemd-machine-id-setup',
2344 'src/machine-id-setup/machine-id-setup-main.c',
2345 'src/core/machine-id-setup.c',
2346 'src/core/machine-id-setup.h',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 install_rpath : rootlibexecdir,
2350 install : true,
2351 install_dir : rootbindir)
2352
2353executable('systemd-fsck',
2354 'src/fsck/fsck.c',
2355 include_directories : includes,
2356 link_with : [libshared],
2357 install_rpath : rootlibexecdir,
2358 install : true,
2359 install_dir : rootlibexecdir)
2360
2361executable('systemd-growfs',
2362 'src/partition/growfs.c',
2363 include_directories : includes,
2364 link_with : [libshared],
2365 dependencies : [libcryptsetup],
2366 install_rpath : rootlibexecdir,
2367 install : true,
2368 install_dir : rootlibexecdir)
2369
2370executable('systemd-makefs',
2371 'src/partition/makefs.c',
2372 include_directories : includes,
2373 link_with : [libshared],
2374 install_rpath : rootlibexecdir,
2375 install : true,
2376 install_dir : rootlibexecdir)
2377
2378executable('systemd-sleep',
2379 'src/sleep/sleep.c',
2380 include_directories : includes,
2381 link_with : [libshared],
2382 install_rpath : rootlibexecdir,
2383 install : true,
2384 install_dir : rootlibexecdir)
2385
2386exe = executable('systemd-sysctl',
2387 'src/sysctl/sysctl.c',
2388 include_directories : includes,
2389 link_with : [libshared],
2390 install_rpath : rootlibexecdir,
2391 install : true,
2392 install_dir : rootlibexecdir)
2393public_programs += exe
2394
2395executable('systemd-ac-power',
2396 'src/ac-power/ac-power.c',
2397 include_directories : includes,
2398 link_with : [libshared],
2399 install_rpath : rootlibexecdir,
2400 install : true,
2401 install_dir : rootlibexecdir)
2402
2403exe = executable('systemd-detect-virt',
2404 'src/detect-virt/detect-virt.c',
2405 include_directories : includes,
2406 link_with : [libshared],
2407 install_rpath : rootlibexecdir,
2408 install : true)
2409public_programs += exe
2410
2411exe = executable('systemd-delta',
2412 'src/delta/delta.c',
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2416 install : true)
2417public_programs += exe
2418
2419exe = executable('systemd-escape',
2420 'src/escape/escape.c',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 install_rpath : rootlibexecdir,
2424 install : true,
2425 install_dir : rootbindir)
2426public_programs += exe
2427
2428exe = executable('systemd-notify',
2429 'src/notify/notify.c',
2430 include_directories : includes,
2431 link_with : [libshared],
2432 install_rpath : rootlibexecdir,
2433 install : true,
2434 install_dir : rootbindir)
2435public_programs += exe
2436
2437executable('systemd-volatile-root',
2438 'src/volatile-root/volatile-root.c',
2439 include_directories : includes,
2440 link_with : [libshared],
2441 install_rpath : rootlibexecdir,
2442 install : true,
2443 install_dir : rootlibexecdir)
2444
2445executable('systemd-cgroups-agent',
2446 'src/cgroups-agent/cgroups-agent.c',
2447 include_directories : includes,
2448 link_with : [libshared],
2449 install_rpath : rootlibexecdir,
2450 install : true,
2451 install_dir : rootlibexecdir)
2452
2453exe = executable('systemd-id128',
2454 'src/id128/id128.c',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2458 install : true)
2459public_programs += exe
2460
2461exe = executable('systemd-path',
2462 'src/path/path.c',
2463 include_directories : includes,
2464 link_with : [libshared],
2465 install_rpath : rootlibexecdir,
2466 install : true)
2467public_programs += exe
2468
2469exe = executable('systemd-ask-password',
2470 'src/ask-password/ask-password.c',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2474 install : true,
2475 install_dir : rootbindir)
2476public_programs += exe
2477
2478executable('systemd-reply-password',
2479 'src/reply-password/reply-password.c',
2480 include_directories : includes,
2481 link_with : [libshared],
2482 install_rpath : rootlibexecdir,
2483 install : true,
2484 install_dir : rootlibexecdir)
2485
2486exe = executable('systemd-tty-ask-password-agent',
2487 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2491 install : true,
2492 install_dir : rootbindir)
2493public_programs += exe
2494
2495exe = executable('systemd-cgls',
2496 'src/cgls/cgls.c',
2497 include_directories : includes,
2498 link_with : [libshared],
2499 install_rpath : rootlibexecdir,
2500 install : true)
2501public_programs += exe
2502
2503exe = executable('systemd-cgtop',
2504 'src/cgtop/cgtop.c',
2505 include_directories : includes,
2506 link_with : [libshared],
2507 install_rpath : rootlibexecdir,
2508 install : true)
2509public_programs += exe
2510
2511executable('systemd-initctl',
2512 'src/initctl/initctl.c',
2513 include_directories : includes,
2514 link_with : [libshared],
2515 install_rpath : rootlibexecdir,
2516 install : true,
2517 install_dir : rootlibexecdir)
2518
2519exe = executable('systemd-mount',
2520 'src/mount/mount-tool.c',
2521 include_directories : includes,
2522 link_with : [libshared],
2523 install_rpath : rootlibexecdir,
2524 install : true)
2525public_programs += exe
2526
2527meson.add_install_script(meson_make_symlink,
2528 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2529
2530exe = executable('systemd-run',
2531 'src/run/run.c',
2532 include_directories : includes,
2533 link_with : [libshared],
2534 install_rpath : rootlibexecdir,
2535 install : true)
2536public_programs += exe
2537
2538exe = executable('systemd-stdio-bridge',
2539 'src/stdio-bridge/stdio-bridge.c',
2540 include_directories : includes,
2541 link_with : [libshared],
2542 install_rpath : rootlibexecdir,
2543 install : true)
2544public_programs += exe
2545
2546exe = executable('busctl',
2547 'src/busctl/busctl.c',
2548 'src/busctl/busctl-introspect.c',
2549 'src/busctl/busctl-introspect.h',
2550 include_directories : includes,
2551 link_with : [libshared],
2552 install_rpath : rootlibexecdir,
2553 install : true)
2554public_programs += exe
2555
2556if conf.get('ENABLE_SYSUSERS') == 1
2557 exe = executable('systemd-sysusers',
2558 'src/sysusers/sysusers.c',
2559 include_directories : includes,
2560 link_with : [libshared],
2561 install_rpath : rootlibexecdir,
2562 install : true,
2563 install_dir : rootbindir)
2564 public_programs += exe
2565endif
2566
2567if conf.get('ENABLE_TMPFILES') == 1
2568 exe = executable('systemd-tmpfiles',
2569 'src/tmpfiles/tmpfiles.c',
2570 include_directories : includes,
2571 link_with : [libshared],
2572 dependencies : [libacl],
2573 install_rpath : rootlibexecdir,
2574 install : true,
2575 install_dir : rootbindir)
2576 public_programs += exe
2577
2578 if want_tests != 'false'
2579 test('test-systemd-tmpfiles',
2580 test_systemd_tmpfiles_py,
2581 # https://github.com/mesonbuild/meson/issues/2681
2582 args : exe.full_path())
2583 endif
2584endif
2585
2586if conf.get('ENABLE_HWDB') == 1
2587 exe = executable('systemd-hwdb',
2588 'src/hwdb/hwdb.c',
2589 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2590 include_directories : includes,
2591 link_with : [libudev_static],
2592 install_rpath : udev_rpath,
2593 install : true,
2594 install_dir : rootbindir)
2595 public_programs += exe
2596endif
2597
2598if conf.get('ENABLE_QUOTACHECK') == 1
2599 executable('systemd-quotacheck',
2600 'src/quotacheck/quotacheck.c',
2601 include_directories : includes,
2602 link_with : [libshared],
2603 install_rpath : rootlibexecdir,
2604 install : true,
2605 install_dir : rootlibexecdir)
2606endif
2607
2608exe = executable('systemd-socket-proxyd',
2609 'src/socket-proxy/socket-proxyd.c',
2610 include_directories : includes,
2611 link_with : [libshared],
2612 dependencies : [threads],
2613 install_rpath : rootlibexecdir,
2614 install : true,
2615 install_dir : rootlibexecdir)
2616public_programs += exe
2617
2618exe = executable('systemd-udevd',
2619 systemd_udevd_sources,
2620 include_directories : includes,
2621 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2622 link_with : [libudev_core,
2623 libsystemd_network,
2624 libudev_static],
2625 dependencies : [threads,
2626 libkmod,
2627 libidn,
2628 libacl,
2629 libblkid],
2630 install_rpath : udev_rpath,
2631 install : true,
2632 install_dir : rootlibexecdir)
2633public_programs += exe
2634
2635exe = executable('udevadm',
2636 udevadm_sources,
2637 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2638 include_directories : includes,
2639 link_with : [libudev_core,
2640 libsystemd_network,
2641 libudev_static],
2642 dependencies : [threads,
2643 libkmod,
2644 libidn,
2645 libacl,
2646 libblkid],
2647 install_rpath : udev_rpath,
2648 install : true,
2649 install_dir : rootbindir)
2650public_programs += exe
2651
2652executable('systemd-shutdown',
2653 systemd_shutdown_sources,
2654 include_directories : includes,
2655 link_with : [libshared],
2656 dependencies : [libmount],
2657 install_rpath : rootlibexecdir,
2658 install : true,
2659 install_dir : rootlibexecdir)
2660
2661executable('systemd-update-done',
2662 'src/update-done/update-done.c',
2663 include_directories : includes,
2664 link_with : [libshared],
2665 install_rpath : rootlibexecdir,
2666 install : true,
2667 install_dir : rootlibexecdir)
2668
2669executable('systemd-update-utmp',
2670 'src/update-utmp/update-utmp.c',
2671 include_directories : includes,
2672 link_with : [libshared],
2673 dependencies : [libaudit],
2674 install_rpath : rootlibexecdir,
2675 install : true,
2676 install_dir : rootlibexecdir)
2677
2678if conf.get('HAVE_KMOD') == 1
2679 executable('systemd-modules-load',
2680 'src/modules-load/modules-load.c',
2681 include_directories : includes,
2682 link_with : [libshared],
2683 dependencies : [libkmod],
2684 install_rpath : rootlibexecdir,
2685 install : true,
2686 install_dir : rootlibexecdir)
2687
2688 meson.add_install_script('sh', '-c',
2689 mkdir_p.format(modulesloaddir))
2690 meson.add_install_script('sh', '-c',
2691 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2692endif
2693
2694exe = executable('systemd-nspawn',
2695 systemd_nspawn_sources,
2696 'src/core/mount-setup.c', # FIXME: use a variable?
2697 'src/core/mount-setup.h',
2698 'src/core/loopback-setup.c',
2699 'src/core/loopback-setup.h',
2700 include_directories : includes,
2701 link_with : [libnspawn_core,
2702 libshared],
2703 dependencies : [libblkid],
2704 install_rpath : rootlibexecdir,
2705 install : true)
2706public_programs += exe
2707
2708if conf.get('ENABLE_NETWORKD') == 1
2709 executable('systemd-networkd',
2710 systemd_networkd_sources,
2711 include_directories : includes,
2712 link_with : [libnetworkd_core,
2713 libsystemd_network,
2714 libudev_static,
2715 libshared],
2716 dependencies : [threads],
2717 install_rpath : rootlibexecdir,
2718 install : true,
2719 install_dir : rootlibexecdir)
2720
2721 executable('systemd-networkd-wait-online',
2722 systemd_networkd_wait_online_sources,
2723 include_directories : includes,
2724 link_with : [libnetworkd_core,
2725 libshared],
2726 install_rpath : rootlibexecdir,
2727 install : true,
2728 install_dir : rootlibexecdir)
2729
2730 exe = executable('networkctl',
2731 networkctl_sources,
2732 include_directories : includes,
2733 link_with : [libsystemd_network,
2734 libshared],
2735 install_rpath : rootlibexecdir,
2736 install : true,
2737 install_dir : rootbindir)
2738 public_programs += exe
2739endif
2740
2741executable('systemd-sulogin-shell',
2742 ['src/sulogin-shell/sulogin-shell.c'],
2743 include_directories : includes,
2744 link_with : [libshared],
2745 install_rpath : rootlibexecdir,
2746 install : true,
2747 install_dir : rootlibexecdir)
2748
2749############################################################
2750
2751custom_target(
2752 'systemd-runtest.env',
2753 output : 'systemd-runtest.env',
2754 command : ['sh', '-c', '{ ' +
2755 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2756 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2757 '} >@OUTPUT@'],
2758 build_by_default : true)
2759
2760foreach tuple : tests
2761 sources = tuple[0]
2762 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2763 dependencies = tuple[2]
2764 condition = tuple.length() >= 4 ? tuple[3] : ''
2765 type = tuple.length() >= 5 ? tuple[4] : ''
2766 defs = tuple.length() >= 6 ? tuple[5] : []
2767 incs = tuple.length() >= 7 ? tuple[6] : includes
2768 timeout = 30
2769
2770 name = sources[0].split('/')[-1].split('.')[0]
2771 if type.startswith('timeout=')
2772 timeout = type.split('=')[1].to_int()
2773 type = ''
2774 endif
2775
2776 if condition == '' or conf.get(condition) == 1
2777 exe = executable(
2778 name,
2779 sources,
2780 include_directories : incs,
2781 link_with : link_with,
2782 dependencies : dependencies,
2783 c_args : defs,
2784 build_by_default : want_tests != 'false',
2785 install_rpath : rootlibexecdir,
2786 install : install_tests,
2787 install_dir : join_paths(testsdir, type))
2788
2789 if type == 'manual'
2790 message('@0@ is a manual test'.format(name))
2791 elif type == 'unsafe' and want_tests != 'unsafe'
2792 message('@0@ is an unsafe test'.format(name))
2793 elif want_tests != 'false'
2794 test(name, exe,
2795 env : test_env,
2796 timeout : timeout)
2797 endif
2798 else
2799 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2800 endif
2801endforeach
2802
2803exe = executable(
2804 'test-libsystemd-sym',
2805 test_libsystemd_sym_c,
2806 include_directories : includes,
2807 link_with : [libsystemd],
2808 build_by_default : want_tests != 'false',
2809 install : install_tests,
2810 install_dir : testsdir)
2811if want_tests != 'false'
2812 test('test-libsystemd-sym', exe)
2813endif
2814
2815exe = executable(
2816 'test-libsystemd-static-sym',
2817 test_libsystemd_sym_c,
2818 include_directories : includes,
2819 link_with : [install_libsystemd_static],
2820 dependencies : [threads], # threads is already included in dependencies on the library,
2821 # but does not seem to get propagated. Add here as a work-around.
2822 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2823 install : install_tests and static_libsystemd_pic,
2824 install_dir : testsdir)
2825if want_tests != 'false' and static_libsystemd_pic
2826 test('test-libsystemd-static-sym', exe)
2827endif
2828
2829exe = executable(
2830 'test-libudev-sym',
2831 test_libudev_sym_c,
2832 include_directories : includes,
2833 c_args : '-Wno-deprecated-declarations',
2834 link_with : [libudev],
2835 build_by_default : want_tests != 'false',
2836 install : install_tests,
2837 install_dir : testsdir)
2838if want_tests != 'false'
2839 test('test-libudev-sym', exe)
2840endif
2841
2842exe = executable(
2843 'test-libudev-static-sym',
2844 test_libudev_sym_c,
2845 include_directories : includes,
2846 c_args : '-Wno-deprecated-declarations',
2847 link_with : [install_libudev_static],
2848 build_by_default : want_tests != 'false' and static_libudev_pic,
2849 install : install_tests and static_libudev_pic,
2850 install_dir : testsdir)
2851if want_tests != 'false' and static_libudev_pic
2852 test('test-libudev-static-sym', exe)
2853endif
2854
2855############################################################
2856
2857fuzzer_exes = []
2858
2859if get_option('tests') != 'false'
2860foreach tuple : fuzzers
2861 sources = tuple[0]
2862 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2863 dependencies = tuple[2]
2864 defs = tuple.length() >= 4 ? tuple[3] : []
2865 incs = tuple.length() >= 5 ? tuple[4] : includes
2866
2867 if fuzzer_build
2868 dependencies += fuzzing_engine
2869 else
2870 sources += 'src/fuzz/fuzz-main.c'
2871 endif
2872
2873 name = sources[0].split('/')[-1].split('.')[0]
2874
2875 fuzzer_exes += executable(
2876 name,
2877 sources,
2878 include_directories : [incs, include_directories('src/fuzz')],
2879 link_with : link_with,
2880 dependencies : dependencies,
2881 c_args : defs,
2882 install : false)
2883endforeach
2884endif
2885
2886run_target('fuzzers',
2887 depends : fuzzer_exes,
2888 command : ['true'])
2889
2890############################################################
2891
2892make_directive_index_py = find_program('tools/make-directive-index.py')
2893make_man_index_py = find_program('tools/make-man-index.py')
2894xml_helper_py = find_program('tools/xml_helper.py')
2895hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2896
2897subdir('units')
2898subdir('sysctl.d')
2899subdir('sysusers.d')
2900subdir('tmpfiles.d')
2901subdir('presets')
2902subdir('hwdb')
2903subdir('network')
2904subdir('man')
2905subdir('shell-completion/bash')
2906subdir('shell-completion/zsh')
2907subdir('docs/sysvinit')
2908subdir('docs/var-log')
2909
2910install_subdir('factory/etc',
2911 install_dir : factorydir)
2912
2913install_data('xorg/50-systemd-user.sh',
2914 install_dir : xinitrcdir)
2915install_data('modprobe.d/systemd.conf',
2916 install_dir : modprobedir)
2917install_data('LICENSE.GPL2',
2918 'LICENSE.LGPL2.1',
2919 'NEWS',
2920 'README',
2921 'docs/CODING_STYLE.md',
2922 'docs/DISTRO_PORTING.md',
2923 'docs/ENVIRONMENT.md',
2924 'docs/HACKING.md',
2925 'docs/TRANSIENT-SETTINGS.md',
2926 'docs/TRANSLATORS.md',
2927 'docs/UIDS-GIDS.md',
2928 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2929 install_dir : docdir)
2930
2931meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2932meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2933
2934############################################################
2935
2936meson_check_help = find_program('tools/meson-check-help.sh')
2937
2938foreach exec : public_programs
2939 name = exec.full_path().split('/')[-1]
2940 if want_tests != 'false'
2941 test('check-help-' + name,
2942 meson_check_help,
2943 args : exec.full_path())
2944 endif
2945endforeach
2946
2947############################################################
2948
2949# Enable tests for all supported sanitizers
2950foreach tuple : sanitizers
2951 sanitizer = tuple[0]
2952 build = tuple[1]
2953
2954 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2955 prev = ''
2956 foreach p : fuzz_regression_tests
2957 b = p.split('/')[-2]
2958 c = p.split('/')[-1]
2959
2960 name = '@0@:@1@'.format(b, sanitizer)
2961
2962 if name != prev
2963 if want_tests == 'false'
2964 message('Not compiling @0@ because tests is set to false'.format(name))
2965 elif slow_tests
2966 exe = custom_target(
2967 name,
2968 output : name,
2969 depends : build,
2970 command : [env, 'ln', '-fs',
2971 join_paths(build.full_path(), b),
2972 '@OUTPUT@'],
2973 build_by_default : true)
2974 else
2975 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2976 endif
2977 endif
2978 prev = name
2979
2980 if want_tests != 'false' and slow_tests
2981 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2982 env,
2983 args : [exe.full_path(),
2984 join_paths(meson.source_root(), p)])
2985 endif
2986 endforeach
2987 endif
2988endforeach
2989
2990
2991############################################################
2992
2993if git.found()
2994 all_files = run_command(
2995 git,
2996 ['--git-dir=@0@/.git'.format(meson.source_root()),
2997 'ls-files',
2998 ':/*.[ch]'])
2999 all_files = files(all_files.stdout().split())
3000
3001 custom_target(
3002 'tags',
3003 output : 'tags',
3004 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
3005 run_target(
3006 'ctags',
3007 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
3008endif
3009
3010if git.found()
3011 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3012 run_target(
3013 'git-contrib',
3014 command : [meson_git_contrib_sh])
3015endif
3016
3017if git.found()
3018 git_head = run_command(
3019 git,
3020 ['--git-dir=@0@/.git'.format(meson.source_root()),
3021 'rev-parse', 'HEAD']).stdout().strip()
3022 git_head_short = run_command(
3023 git,
3024 ['--git-dir=@0@/.git'.format(meson.source_root()),
3025 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3026
3027 run_target(
3028 'git-snapshot',
3029 command : ['git', 'archive',
3030 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
3031 git_head_short),
3032 '--prefix', 'systemd-@0@/'.format(git_head),
3033 'HEAD'])
3034endif
3035
3036############################################################
3037
3038meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3039run_target(
3040 'check-api-docs',
3041 depends : [man, libsystemd, libudev],
3042 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3043
3044run_target(
3045 'make-index-md',
3046 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
3047
3048############################################################
3049
3050status = [
3051 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3052
3053 'split /usr: @0@'.format(split_usr),
3054 'split bin-sbin: @0@'.format(split_bin),
3055 'prefix directory: @0@'.format(prefixdir),
3056 'rootprefix directory: @0@'.format(rootprefixdir),
3057 'sysconf directory: @0@'.format(sysconfdir),
3058 'include directory: @0@'.format(includedir),
3059 'lib directory: @0@'.format(libdir),
3060 'rootlib directory: @0@'.format(rootlibdir),
3061 'SysV init scripts: @0@'.format(sysvinit_path),
3062 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3063 'PAM modules directory: @0@'.format(pamlibdir),
3064 'PAM configuration directory: @0@'.format(pamconfdir),
3065 'RPM macros directory: @0@'.format(rpmmacrosdir),
3066 'modprobe.d directory: @0@'.format(modprobedir),
3067 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3068 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3069 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3070 'bash completions directory: @0@'.format(bashcompletiondir),
3071 'zsh completions directory: @0@'.format(zshcompletiondir),
3072 'extra start script: @0@'.format(get_option('rc-local')),
3073 'extra stop script: @0@'.format(get_option('halt-local')),
3074 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3075 get_option('debug-tty')),
3076 'TTY GID: @0@'.format(tty_gid),
3077 'users GID: @0@'.format(substs.get('USERS_GID')),
3078 'maximum system UID: @0@'.format(system_uid_max),
3079 'maximum system GID: @0@'.format(system_gid_max),
3080 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3081 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3082 'minimum container UID base: @0@'.format(container_uid_base_min),
3083 'maximum container UID base: @0@'.format(container_uid_base_max),
3084 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3085 'render group access mode: @0@'.format(get_option('group-render-mode')),
3086 'certificate root directory: @0@'.format(get_option('certificate-root')),
3087 'support URL: @0@'.format(support_url),
3088 'nobody user name: @0@'.format(nobody_user),
3089 'nobody group name: @0@'.format(nobody_group),
3090 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3091 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3092
3093 'default DNSSEC mode: @0@'.format(default_dnssec),
3094 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3095 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3096 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3097
3098alt_dns_servers = '\n '.join(dns_servers.split(' '))
3099alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3100status += [
3101 'default DNS servers: @0@'.format(alt_dns_servers),
3102 'default NTP servers: @0@'.format(alt_ntp_servers)]
3103
3104alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3105 '@@0@'.format(time_epoch)).stdout().strip()
3106status += [
3107 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3108
3109status += [
3110 'static libsystemd: @0@'.format(static_libsystemd),
3111 'static libudev: @0@'.format(static_libudev)]
3112
3113# TODO:
3114# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3115# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3116# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3117
3118if conf.get('ENABLE_EFI') == 1
3119 status += 'efi arch: @0@'.format(efi_arch)
3120
3121 if have_gnu_efi
3122 status += [
3123 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3124 'EFI CC @0@'.format(efi_cc),
3125 'EFI lib directory: @0@'.format(efi_libdir),
3126 'EFI lds directory: @0@'.format(efi_ldsdir),
3127 'EFI include directory: @0@'.format(efi_incdir)]
3128 endif
3129endif
3130
3131found = []
3132missing = []
3133
3134foreach tuple : [
3135 ['libcryptsetup'],
3136 ['PAM'],
3137 ['AUDIT'],
3138 ['IMA'],
3139 ['AppArmor'],
3140 ['SELinux'],
3141 ['SECCOMP'],
3142 ['SMACK'],
3143 ['zlib'],
3144 ['xz'],
3145 ['lz4'],
3146 ['bzip2'],
3147 ['ACL'],
3148 ['gcrypt'],
3149 ['qrencode'],
3150 ['microhttpd'],
3151 ['gnutls'],
3152 ['openssl'],
3153 ['libcurl'],
3154 ['idn'],
3155 ['libidn2'],
3156 ['libidn'],
3157 ['libiptc'],
3158 ['elfutils'],
3159 ['binfmt'],
3160 ['vconsole'],
3161 ['quotacheck'],
3162 ['tmpfiles'],
3163 ['environment.d'],
3164 ['sysusers'],
3165 ['firstboot'],
3166 ['randomseed'],
3167 ['backlight'],
3168 ['rfkill'],
3169 ['logind'],
3170 ['machined'],
3171 ['portabled'],
3172 ['importd'],
3173 ['hostnamed'],
3174 ['timedated'],
3175 ['timesyncd'],
3176 ['localed'],
3177 ['networkd'],
3178 ['resolve'],
3179 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3180 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3181 ['coredump'],
3182 ['polkit'],
3183 ['legacy pkla', install_polkit_pkla],
3184 ['efi'],
3185 ['gnu-efi', have_gnu_efi],
3186 ['kmod'],
3187 ['xkbcommon'],
3188 ['pcre2'],
3189 ['blkid'],
3190 ['dbus'],
3191 ['glib'],
3192 ['nss-myhostname'],
3193 ['nss-mymachines'],
3194 ['nss-resolve'],
3195 ['nss-systemd'],
3196 ['hwdb'],
3197 ['tpm'],
3198 ['man pages', want_man],
3199 ['html pages', want_html],
3200 ['man page indices', want_man and have_lxml],
3201 ['SysV compat'],
3202 ['utmp'],
3203 ['ldconfig'],
3204 ['hibernate'],
3205 ['adm group', get_option('adm-group')],
3206 ['wheel group', get_option('wheel-group')],
3207 ['gshadow'],
3208 ['debug hashmap'],
3209 ['debug mmap cache'],
3210 ['debug siphash'],
3211 ['debug udev'],
3212 ['valgrind', conf.get('VALGRIND') == 1],
3213 ['trace logging', conf.get('LOG_TRACE') == 1],
3214 ['link-udev-shared', get_option('link-udev-shared')],
3215 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3216]
3217
3218 if tuple.length() >= 2
3219 cond = tuple[1]
3220 else
3221 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3222 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3223 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3224 endif
3225 if cond
3226 found += tuple[0]
3227 else
3228 missing += tuple[0]
3229 endif
3230endforeach
3231
3232status += [
3233 '',
3234 'enabled features: @0@'.format(', '.join(found)),
3235 '',
3236 'disabled features: @0@'.format(', '.join(missing)),
3237 '']
3238message('\n '.join(status))
3239
3240if rootprefixdir != rootprefix_default
3241 warning('\n' +
3242 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3243 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3244 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3245endif