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