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