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