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