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