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