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