]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
test-tables,test-network-tables: add a few more tests
[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',
1261 'src/resolve',
1262 'src/timesync',
5c3376ef 1263 'src/time-wait-sync',
5c23128d
ZJS
1264 'src/login',
1265 'src/udev',
1266 'src/libudev',
1267 'src/core',
1268 'src/libsystemd/sd-bus',
1269 'src/libsystemd/sd-device',
1270 'src/libsystemd/sd-hwdb',
1271 'src/libsystemd/sd-id128',
1272 'src/libsystemd/sd-netlink',
1273 'src/libsystemd/sd-network',
1274 'src/libsystemd-network',
2d4ceca8 1275 '.')
5c23128d
ZJS
1276
1277add_project_arguments('-include', 'config.h', language : 'c')
1278
5c23128d
ZJS
1279subdir('po')
1280subdir('catalog')
1281subdir('src/systemd')
1282subdir('src/basic')
1283subdir('src/libsystemd')
1284subdir('src/libsystemd-network')
5c23128d 1285subdir('src/journal')
5c23128d 1286subdir('src/login')
5c23128d
ZJS
1287
1288libjournal_core = static_library(
37efbbd8
ZJS
1289 'journal-core',
1290 libjournal_core_sources,
1291 journald_gperf_c,
1292 include_directories : includes,
1293 install : false)
5c23128d 1294
37ab1a25 1295libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
5c23128d 1296libsystemd = shared_library(
37efbbd8 1297 'systemd',
7f1ea2cc 1298 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
56d50ab1 1299 version : libsystemd_version,
37efbbd8
ZJS
1300 include_directories : includes,
1301 link_args : ['-shared',
1302 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5
ZJS
1303 link_with : [libbasic,
1304 libbasic_gcrypt],
5e3cec87
ZJS
1305 link_whole : [libsystemd_static,
1306 libjournal_client],
37efbbd8
ZJS
1307 dependencies : [threads,
1308 librt,
1309 libxz,
1310 liblz4],
1311 link_depends : libsystemd_sym,
1312 install : true,
1313 install_dir : rootlibdir)
5c23128d 1314
70848ecf
DC
1315static_libsystemd = get_option('static-libsystemd')
1316static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1317
1318install_libsystemd_static = static_library(
1319 'systemd',
1320 libsystemd_sources,
1321 journal_client_sources,
975464e0
ZJS
1322 basic_sources,
1323 basic_gcrypt_sources,
70848ecf 1324 include_directories : includes,
70848ecf
DC
1325 build_by_default : static_libsystemd != 'false',
1326 install : static_libsystemd != 'false',
1327 install_dir : rootlibdir,
1328 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1329 dependencies : [threads,
1330 librt,
1331 libxz,
1332 liblz4,
975464e0
ZJS
1333 libcap,
1334 libblkid,
1335 libmount,
1336 libselinux,
70848ecf
DC
1337 libgcrypt],
1338 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1339
5c23128d
ZJS
1340############################################################
1341
83b6af36
ZJS
1342# binaries that have --help and are intended for use by humans,
1343# usually, but not always, installed in /bin.
1344public_programs = []
1345
1346subdir('src/libudev')
1347subdir('src/shared')
1348subdir('src/core')
1349subdir('src/udev')
1350subdir('src/network')
1351
1352subdir('src/analyze')
1353subdir('src/journal-remote')
1354subdir('src/coredump')
1355subdir('src/hostname')
1356subdir('src/import')
1357subdir('src/kernel-install')
1358subdir('src/locale')
1359subdir('src/machine')
61d0578b 1360subdir('src/portable')
83b6af36
ZJS
1361subdir('src/nspawn')
1362subdir('src/resolve')
1363subdir('src/timedate')
1364subdir('src/timesync')
1365subdir('src/vconsole')
83b6af36
ZJS
1366subdir('src/boot/efi')
1367
1368subdir('src/test')
7db7d5b7 1369subdir('src/fuzz')
6b97bf22 1370subdir('rules')
83b6af36
ZJS
1371subdir('test')
1372
1373############################################################
1374
1375# only static linking apart from libdl, to make sure that the
1376# module is linked to all libraries that it uses.
1377test_dlopen = executable(
37efbbd8
ZJS
1378 'test-dlopen',
1379 test_dlopen_c,
1380 include_directories : includes,
1381 link_with : [libbasic],
1382 dependencies : [libdl])
83b6af36 1383
08cf5b8d 1384foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
e7e11bbf 1385 ['systemd', 'ENABLE_NSS_SYSTEMD'],
5486a31d 1386 ['mymachines', 'ENABLE_MACHINED'],
1ec57f33 1387 ['resolve', 'ENABLE_RESOLVE']]
5c23128d 1388
349cc4a5 1389 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1390 if condition
1391 module = tuple[0]
37efbbd8
ZJS
1392
1393 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1394 version_script_arg = join_paths(meson.current_source_dir(), sym)
1395
1396 nss = shared_library(
1397 'nss_' + module,
1398 'src/nss-@0@/nss-@0@.c'.format(module),
1399 version : '2',
1400 include_directories : includes,
b4b36f44
LP
1401 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1402 link_args : ['-Wl,-z,nodelete',
1403 '-shared',
37efbbd8
ZJS
1404 '-Wl,--version-script=' + version_script_arg,
1405 '-Wl,--undefined'],
37e4d7a8 1406 link_with : [libsystemd_static,
37efbbd8
ZJS
1407 libbasic],
1408 dependencies : [threads,
5486a31d 1409 librt],
37efbbd8
ZJS
1410 link_depends : sym,
1411 install : true,
1412 install_dir : rootlibdir)
1413
1414 # We cannot use shared_module because it does not support version suffix.
1415 # Unfortunately shared_library insists on creating the symlink…
1416 meson.add_install_script('sh', '-c',
1417 'rm $DESTDIR@0@/libnss_@1@.so'
1418 .format(rootlibdir, module))
1419
1420 test('dlopen-nss_' + module,
1421 test_dlopen,
1422 args : [nss.full_path()]) # path to dlopen must include a slash
1423 endif
5c23128d
ZJS
1424endforeach
1425
1426############################################################
1427
5c23128d
ZJS
1428executable('systemd',
1429 systemd_sources,
1430 include_directories : includes,
1431 link_with : [libcore,
34ce0a52 1432 libshared],
5c23128d
ZJS
1433 dependencies : [threads,
1434 librt,
1435 libseccomp,
1436 libselinux,
f4ee10a2
ZJS
1437 libmount,
1438 libblkid],
421f0012 1439 install_rpath : rootlibexecdir,
5c23128d
ZJS
1440 install : true,
1441 install_dir : rootlibexecdir)
1442
ba7f4ae6
ZJS
1443meson.add_install_script(meson_make_symlink,
1444 join_paths(rootlibexecdir, 'systemd'),
1445 join_paths(rootsbindir, 'init'))
1446
005a29f2
ZJS
1447exe = executable('systemd-analyze',
1448 systemd_analyze_sources,
1449 include_directories : includes,
1450 link_with : [libcore,
005a29f2
ZJS
1451 libshared],
1452 dependencies : [threads,
1453 librt,
1454 libseccomp,
1455 libselinux,
1456 libmount,
1457 libblkid],
1458 install_rpath : rootlibexecdir,
1459 install : true)
1460public_programs += [exe]
5c23128d
ZJS
1461
1462executable('systemd-journald',
1463 systemd_journald_sources,
1464 include_directories : includes,
aac26058 1465 link_with : [libjournal_core,
34ce0a52 1466 libshared],
5c23128d
ZJS
1467 dependencies : [threads,
1468 libxz,
aac26058
ZJS
1469 liblz4,
1470 libselinux],
421f0012 1471 install_rpath : rootlibexecdir,
5c23128d
ZJS
1472 install : true,
1473 install_dir : rootlibexecdir)
1474
005a29f2
ZJS
1475exe = executable('systemd-cat',
1476 systemd_cat_sources,
1477 include_directories : includes,
1478 link_with : [libjournal_core,
34ce0a52 1479 libshared],
005a29f2
ZJS
1480 dependencies : [threads],
1481 install_rpath : rootlibexecdir,
1482 install : true)
1483public_programs += [exe]
1484
1485exe = executable('journalctl',
1486 journalctl_sources,
1487 include_directories : includes,
34ce0a52 1488 link_with : [libshared],
005a29f2
ZJS
1489 dependencies : [threads,
1490 libqrencode,
1491 libxz,
6becf48c
ZJS
1492 liblz4,
1493 libpcre2],
005a29f2
ZJS
1494 install_rpath : rootlibexecdir,
1495 install : true,
1496 install_dir : rootbindir)
1497public_programs += [exe]
5c23128d
ZJS
1498
1499executable('systemd-getty-generator',
1500 'src/getty-generator/getty-generator.c',
5c23128d 1501 include_directories : includes,
b2fc5836
ZJS
1502 link_with : [libshared],
1503 install_rpath : rootlibexecdir,
1504 install : true,
1505 install_dir : systemgeneratordir)
5c23128d
ZJS
1506
1507executable('systemd-debug-generator',
1508 'src/debug-generator/debug-generator.c',
5c23128d 1509 include_directories : includes,
b2fc5836
ZJS
1510 link_with : [libshared],
1511 install_rpath : rootlibexecdir,
1512 install : true,
1513 install_dir : systemgeneratordir)
5c23128d
ZJS
1514
1515executable('systemd-fstab-generator',
1516 'src/fstab-generator/fstab-generator.c',
1517 'src/core/mount-setup.c',
5c23128d 1518 include_directories : includes,
b2fc5836
ZJS
1519 link_with : [libshared],
1520 install_rpath : rootlibexecdir,
1521 install : true,
1522 install_dir : systemgeneratordir)
5c23128d 1523
349cc4a5 1524if conf.get('ENABLE_ENVIRONMENT_D') == 1
37efbbd8
ZJS
1525 executable('30-systemd-environment-d-generator',
1526 'src/environment-d-generator/environment-d-generator.c',
1527 include_directories : includes,
1528 link_with : [libshared],
1529 install_rpath : rootlibexecdir,
1530 install : true,
1531 install_dir : userenvgeneratordir)
7b76fce1 1532
37efbbd8
ZJS
1533 meson.add_install_script(meson_make_symlink,
1534 join_paths(sysconfdir, 'environment'),
1535 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1536endif
1537
349cc4a5 1538if conf.get('ENABLE_HIBERNATE') == 1
37efbbd8
ZJS
1539 executable('systemd-hibernate-resume-generator',
1540 'src/hibernate-resume/hibernate-resume-generator.c',
1541 include_directories : includes,
1542 link_with : [libshared],
1543 install_rpath : rootlibexecdir,
1544 install : true,
1545 install_dir : systemgeneratordir)
5c23128d 1546
37efbbd8
ZJS
1547 executable('systemd-hibernate-resume',
1548 'src/hibernate-resume/hibernate-resume.c',
005a29f2
ZJS
1549 include_directories : includes,
1550 link_with : [libshared],
1551 install_rpath : rootlibexecdir,
1552 install : true,
1553 install_dir : rootlibexecdir)
37efbbd8
ZJS
1554endif
1555
349cc4a5 1556if conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1557 executable('systemd-gpt-auto-generator',
1558 'src/gpt-auto-generator/gpt-auto-generator.c',
1559 'src/basic/blkid-util.h',
1560 include_directories : includes,
34ce0a52 1561 link_with : [libshared],
37efbbd8
ZJS
1562 dependencies : libblkid,
1563 install_rpath : rootlibexecdir,
1564 install : true,
1565 install_dir : systemgeneratordir)
1566
1567 exe = executable('systemd-dissect',
1568 'src/dissect/dissect.c',
1569 include_directories : includes,
1570 link_with : [libshared],
1571 install_rpath : rootlibexecdir,
1572 install : true,
1573 install_dir : rootlibexecdir)
1574 public_programs += [exe]
5c23128d
ZJS
1575endif
1576
1ec57f33 1577if conf.get('ENABLE_RESOLVE') == 1
37efbbd8
ZJS
1578 executable('systemd-resolved',
1579 systemd_resolved_sources,
005a29f2 1580 include_directories : includes,
34e221a5 1581 link_with : [libshared,
568a4ff8
ZJS
1582 libbasic_gcrypt,
1583 libsystemd_resolve_core],
005a29f2 1584 dependencies : [threads,
76c87410 1585 libgpg_error,
005a29f2
ZJS
1586 libm,
1587 libidn],
1588 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1589 install : true,
1590 install_dir : rootlibexecdir)
1591
c2e84cab
YW
1592 exe = executable('resolvectl',
1593 resolvectl_sources,
37efbbd8 1594 include_directories : includes,
34e221a5 1595 link_with : [libshared,
568a4ff8
ZJS
1596 libbasic_gcrypt,
1597 libsystemd_resolve_core],
37efbbd8 1598 dependencies : [threads,
76c87410 1599 libgpg_error,
37efbbd8
ZJS
1600 libm,
1601 libidn],
1602 install_rpath : rootlibexecdir,
1603 install : true)
1604 public_programs += [exe]
088c1363
LP
1605
1606 meson.add_install_script(meson_make_symlink,
c2e84cab 1607 join_paths(bindir, 'resolvectl'),
088c1363 1608 join_paths(rootsbindir, 'resolvconf'))
c2e84cab
YW
1609
1610 meson.add_install_script(meson_make_symlink,
1611 join_paths(bindir, 'resolvectl'),
1612 join_paths(bindir, 'systemd-resolve'))
5c23128d
ZJS
1613endif
1614
349cc4a5 1615if conf.get('ENABLE_LOGIND') == 1
37efbbd8
ZJS
1616 executable('systemd-logind',
1617 systemd_logind_sources,
005a29f2 1618 include_directories : includes,
37efbbd8 1619 link_with : [liblogind_core,
34ce0a52 1620 libshared],
005a29f2 1621 dependencies : [threads,
37efbbd8 1622 libacl],
005a29f2
ZJS
1623 install_rpath : rootlibexecdir,
1624 install : true,
37efbbd8
ZJS
1625 install_dir : rootlibexecdir)
1626
1627 exe = executable('loginctl',
1628 loginctl_sources,
1629 include_directories : includes,
34ce0a52 1630 link_with : [libshared],
37efbbd8
ZJS
1631 dependencies : [threads,
1632 liblz4,
1633 libxz],
1634 install_rpath : rootlibexecdir,
1635 install : true,
1636 install_dir : rootbindir)
1637 public_programs += [exe]
1638
1639 exe = executable('systemd-inhibit',
1640 'src/login/inhibit.c',
1641 include_directories : includes,
1642 link_with : [libshared],
1643 install_rpath : rootlibexecdir,
1644 install : true,
1645 install_dir : rootbindir)
1646 public_programs += [exe]
1647
349cc4a5 1648 if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1649 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1650 pam_systemd = shared_library(
1651 'pam_systemd',
1652 pam_systemd_c,
1653 name_prefix : '',
1654 include_directories : includes,
1655 link_args : ['-shared',
1656 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 1657 link_with : [libsystemd_static,
37efbbd8
ZJS
1658 libshared_static],
1659 dependencies : [threads,
1660 libpam,
1661 libpam_misc],
1662 link_depends : pam_systemd_sym,
1663 install : true,
1664 install_dir : pamlibdir)
1665
1666 test('dlopen-pam_systemd',
1667 test_dlopen,
1668 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1669 endif
1670endif
005a29f2 1671
a9f0f5e5
ZJS
1672executable('systemd-user-runtime-dir',
1673 user_runtime_dir_sources,
1674 include_directories : includes,
1675 link_with : [libshared, liblogind_core],
1676 install_rpath : rootlibexecdir,
1677 install : true,
1678 install_dir : rootlibexecdir)
1679
349cc4a5 1680if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1681 executable('systemd-user-sessions',
1682 'src/user-sessions/user-sessions.c',
005a29f2 1683 include_directories : includes,
aac26058 1684 link_with : [libshared],
005a29f2
ZJS
1685 install_rpath : rootlibexecdir,
1686 install : true,
37efbbd8 1687 install_dir : rootlibexecdir)
5c23128d
ZJS
1688endif
1689
349cc4a5 1690if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1691 exe = executable('bootctl',
1692 'src/boot/bootctl.c',
1693 include_directories : includes,
1694 link_with : [libshared],
1695 dependencies : [libblkid],
1696 install_rpath : rootlibexecdir,
1697 install : true)
1698 public_programs += [exe]
005a29f2
ZJS
1699endif
1700
1701exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1702 include_directories : includes,
1703 link_with : [libshared],
1704 dependencies : [threads],
1705 install_rpath : rootlibexecdir,
1706 install : true)
1707public_programs += [exe]
1708
1709exe = executable('systemctl', 'src/systemctl/systemctl.c',
1710 include_directories : includes,
aac26058 1711 link_with : [libshared],
005a29f2
ZJS
1712 dependencies : [threads,
1713 libcap,
1714 libselinux,
1715 libxz,
1716 liblz4],
1717 install_rpath : rootlibexecdir,
1718 install : true,
1719 install_dir : rootbindir)
1720public_programs += [exe]
5c23128d 1721
61d0578b
LP
1722if conf.get('ENABLE_PORTABLED') == 1
1723 executable('systemd-portabled',
1724 systemd_portabled_sources,
1725 include_directories : includes,
1726 link_with : [libshared],
1727 dependencies : [threads],
1728 install_rpath : rootlibexecdir,
1729 install : true,
1730 install_dir : rootlibexecdir)
1731
1732 exe = executable('portablectl', 'src/portable/portablectl.c',
1733 include_directories : includes,
1734 link_with : [libshared],
1735 dependencies : [threads],
1736 install_rpath : rootlibexecdir,
1737 install : true,
1738 install_dir : rootlibexecdir)
1739 public_programs += [exe]
1740endif
1741
ba7f4ae6
ZJS
1742foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1743 meson.add_install_script(meson_make_symlink,
1744 join_paths(rootbindir, 'systemctl'),
1745 join_paths(rootsbindir, alias))
1746endforeach
1747
349cc4a5 1748if conf.get('ENABLE_BACKLIGHT') == 1
37efbbd8
ZJS
1749 executable('systemd-backlight',
1750 'src/backlight/backlight.c',
1751 include_directories : includes,
34ce0a52 1752 link_with : [libshared],
37efbbd8
ZJS
1753 install_rpath : rootlibexecdir,
1754 install : true,
1755 install_dir : rootlibexecdir)
5c23128d
ZJS
1756endif
1757
349cc4a5 1758if conf.get('ENABLE_RFKILL') == 1
37efbbd8
ZJS
1759 executable('systemd-rfkill',
1760 'src/rfkill/rfkill.c',
1761 include_directories : includes,
34ce0a52 1762 link_with : [libshared],
37efbbd8
ZJS
1763 install_rpath : rootlibexecdir,
1764 install : true,
1765 install_dir : rootlibexecdir)
5c23128d
ZJS
1766endif
1767
1768executable('systemd-system-update-generator',
1769 'src/system-update-generator/system-update-generator.c',
1770 include_directories : includes,
1771 link_with : [libshared],
b2fc5836 1772 install_rpath : rootlibexecdir,
5c23128d
ZJS
1773 install : true,
1774 install_dir : systemgeneratordir)
1775
349cc4a5 1776if conf.get('HAVE_LIBCRYPTSETUP') == 1
37efbbd8
ZJS
1777 executable('systemd-cryptsetup',
1778 'src/cryptsetup/cryptsetup.c',
1779 include_directories : includes,
1780 link_with : [libshared],
1781 dependencies : [libcryptsetup],
1782 install_rpath : rootlibexecdir,
1783 install : true,
1784 install_dir : rootlibexecdir)
1785
1786 executable('systemd-cryptsetup-generator',
1787 'src/cryptsetup/cryptsetup-generator.c',
1788 include_directories : includes,
1789 link_with : [libshared],
1790 dependencies : [libcryptsetup],
1791 install_rpath : rootlibexecdir,
1792 install : true,
1793 install_dir : systemgeneratordir)
1794
1795 executable('systemd-veritysetup',
1796 'src/veritysetup/veritysetup.c',
1797 include_directories : includes,
1798 link_with : [libshared],
1799 dependencies : [libcryptsetup],
1800 install_rpath : rootlibexecdir,
1801 install : true,
1802 install_dir : rootlibexecdir)
1803
1804 executable('systemd-veritysetup-generator',
1805 'src/veritysetup/veritysetup-generator.c',
1806 include_directories : includes,
1807 link_with : [libshared],
1808 dependencies : [libcryptsetup],
1809 install_rpath : rootlibexecdir,
1810 install : true,
1811 install_dir : systemgeneratordir)
5c23128d
ZJS
1812endif
1813
349cc4a5 1814if conf.get('HAVE_SYSV_COMPAT') == 1
37efbbd8
ZJS
1815 executable('systemd-sysv-generator',
1816 'src/sysv-generator/sysv-generator.c',
1817 include_directories : includes,
1818 link_with : [libshared],
1819 install_rpath : rootlibexecdir,
1820 install : true,
1821 install_dir : systemgeneratordir)
1822
1823 executable('systemd-rc-local-generator',
1824 'src/rc-local-generator/rc-local-generator.c',
1825 include_directories : includes,
1826 link_with : [libshared],
1827 install_rpath : rootlibexecdir,
1828 install : true,
1829 install_dir : systemgeneratordir)
5c23128d
ZJS
1830endif
1831
349cc4a5 1832if conf.get('ENABLE_HOSTNAMED') == 1
37efbbd8
ZJS
1833 executable('systemd-hostnamed',
1834 'src/hostname/hostnamed.c',
005a29f2 1835 include_directories : includes,
aac26058 1836 link_with : [libshared],
005a29f2 1837 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1838 install : true,
1839 install_dir : rootlibexecdir)
1840
1841 exe = executable('hostnamectl',
1842 'src/hostname/hostnamectl.c',
1843 include_directories : includes,
1844 link_with : [libshared],
1845 install_rpath : rootlibexecdir,
1846 install : true)
1847 public_programs += [exe]
5c23128d
ZJS
1848endif
1849
349cc4a5
ZJS
1850if conf.get('ENABLE_LOCALED') == 1
1851 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
1852 # logind will load libxkbcommon.so dynamically on its own
1853 deps = [libdl]
1854 else
1855 deps = []
1856 endif
1857
1858 executable('systemd-localed',
1859 systemd_localed_sources,
005a29f2 1860 include_directories : includes,
aac26058 1861 link_with : [libshared],
37efbbd8 1862 dependencies : deps,
005a29f2 1863 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1864 install : true,
1865 install_dir : rootlibexecdir)
1866
1867 exe = executable('localectl',
1868 localectl_sources,
1869 include_directories : includes,
1870 link_with : [libshared],
1871 install_rpath : rootlibexecdir,
1872 install : true)
1873 public_programs += [exe]
5c23128d
ZJS
1874endif
1875
349cc4a5 1876if conf.get('ENABLE_TIMEDATED') == 1
37efbbd8
ZJS
1877 executable('systemd-timedated',
1878 'src/timedate/timedated.c',
005a29f2 1879 include_directories : includes,
aac26058 1880 link_with : [libshared],
37efbbd8
ZJS
1881 install_rpath : rootlibexecdir,
1882 install : true,
1883 install_dir : rootlibexecdir)
6129ec85 1884endif
5c23128d 1885
6129ec85 1886if conf.get('ENABLE_TIMEDATECTL') == 1
37efbbd8
ZJS
1887 exe = executable('timedatectl',
1888 'src/timedate/timedatectl.c',
1889 include_directories : includes,
1890 install_rpath : rootlibexecdir,
1891 link_with : [libshared],
6129ec85 1892 dependencies : [libm],
37efbbd8
ZJS
1893 install : true)
1894 public_programs += [exe]
5c23128d
ZJS
1895endif
1896
349cc4a5 1897if conf.get('ENABLE_TIMESYNCD') == 1
37efbbd8
ZJS
1898 executable('systemd-timesyncd',
1899 systemd_timesyncd_sources,
005a29f2 1900 include_directories : includes,
aac26058 1901 link_with : [libshared],
005a29f2 1902 dependencies : [threads,
37efbbd8 1903 libm],
005a29f2
ZJS
1904 install_rpath : rootlibexecdir,
1905 install : true,
37efbbd8 1906 install_dir : rootlibexecdir)
5c3376ef
PB
1907
1908 executable('systemd-time-wait-sync',
1909 'src/time-wait-sync/time-wait-sync.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 install_rpath : rootlibexecdir,
1913 install : true,
1914 install_dir : rootlibexecdir)
5c23128d
ZJS
1915endif
1916
349cc4a5 1917if conf.get('ENABLE_MACHINED') == 1
37efbbd8
ZJS
1918 executable('systemd-machined',
1919 systemd_machined_sources,
1920 include_directories : includes,
1921 link_with : [libmachine_core,
1922 libshared],
1923 install_rpath : rootlibexecdir,
1924 install : true,
1925 install_dir : rootlibexecdir)
1926
1927 exe = executable('machinectl',
1928 'src/machine/machinectl.c',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 dependencies : [threads,
1932 libxz,
1933 liblz4],
1934 install_rpath : rootlibexecdir,
1935 install : true,
1936 install_dir : rootbindir)
1937 public_programs += [exe]
5c23128d
ZJS
1938endif
1939
349cc4a5 1940if conf.get('ENABLE_IMPORTD') == 1
37efbbd8
ZJS
1941 executable('systemd-importd',
1942 systemd_importd_sources,
005a29f2 1943 include_directories : includes,
aac26058 1944 link_with : [libshared],
37efbbd8 1945 dependencies : [threads],
005a29f2
ZJS
1946 install_rpath : rootlibexecdir,
1947 install : true,
1948 install_dir : rootlibexecdir)
37efbbd8
ZJS
1949
1950 systemd_pull = executable('systemd-pull',
1951 systemd_pull_sources,
1952 include_directories : includes,
1953 link_with : [libshared],
1954 dependencies : [libcurl,
1955 libz,
1956 libbzip2,
1957 libxz,
1958 libgcrypt],
1959 install_rpath : rootlibexecdir,
1960 install : true,
1961 install_dir : rootlibexecdir)
1962
1963 systemd_import = executable('systemd-import',
1964 systemd_import_sources,
1965 include_directories : includes,
1966 link_with : [libshared],
1967 dependencies : [libcurl,
1968 libz,
1969 libbzip2,
1970 libxz],
1971 install_rpath : rootlibexecdir,
1972 install : true,
1973 install_dir : rootlibexecdir)
1974
1975 systemd_export = executable('systemd-export',
1976 systemd_export_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 public_programs += [systemd_pull, systemd_import, systemd_export]
1987endif
1988
349cc4a5 1989if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
37efbbd8
ZJS
1990 exe = executable('systemd-journal-upload',
1991 systemd_journal_upload_sources,
1992 include_directories : includes,
1993 link_with : [libshared],
1994 dependencies : [threads,
1995 libcurl,
1996 libgnutls,
1997 libxz,
1998 liblz4],
1999 install_rpath : rootlibexecdir,
2000 install : true,
2001 install_dir : rootlibexecdir)
2002 public_programs += [exe]
5c23128d
ZJS
2003endif
2004
349cc4a5 2005if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
37efbbd8
ZJS
2006 s_j_remote = executable('systemd-journal-remote',
2007 systemd_journal_remote_sources,
2008 include_directories : includes,
2009 link_with : [libshared],
2010 dependencies : [threads,
2011 libmicrohttpd,
2012 libgnutls,
2013 libxz,
2014 liblz4],
2015 install_rpath : rootlibexecdir,
2016 install : true,
2017 install_dir : rootlibexecdir)
2018
2019 s_j_gatewayd = executable('systemd-journal-gatewayd',
2020 systemd_journal_gatewayd_sources,
2021 include_directories : includes,
2022 link_with : [libshared],
2023 dependencies : [threads,
2024 libmicrohttpd,
2025 libgnutls,
2026 libxz,
2027 liblz4],
2028 install_rpath : rootlibexecdir,
2029 install : true,
2030 install_dir : rootlibexecdir)
2031 public_programs += [s_j_remote, s_j_gatewayd]
5c23128d
ZJS
2032endif
2033
349cc4a5 2034if conf.get('ENABLE_COREDUMP') == 1
37efbbd8
ZJS
2035 executable('systemd-coredump',
2036 systemd_coredump_sources,
005a29f2 2037 include_directories : includes,
aac26058 2038 link_with : [libshared],
005a29f2 2039 dependencies : [threads,
37efbbd8
ZJS
2040 libacl,
2041 libdw,
005a29f2
ZJS
2042 libxz,
2043 liblz4],
2044 install_rpath : rootlibexecdir,
37efbbd8
ZJS
2045 install : true,
2046 install_dir : rootlibexecdir)
2047
2048 exe = executable('coredumpctl',
2049 coredumpctl_sources,
2050 include_directories : includes,
2051 link_with : [libshared],
2052 dependencies : [threads,
2053 libxz,
2054 liblz4],
2055 install_rpath : rootlibexecdir,
2056 install : true)
2057 public_programs += [exe]
5c23128d
ZJS
2058endif
2059
349cc4a5 2060if conf.get('ENABLE_BINFMT') == 1
37efbbd8
ZJS
2061 exe = executable('systemd-binfmt',
2062 'src/binfmt/binfmt.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 install_rpath : rootlibexecdir,
2066 install : true,
2067 install_dir : rootlibexecdir)
2068 public_programs += [exe]
2069
2070 meson.add_install_script('sh', '-c',
2071 mkdir_p.format(binfmtdir))
2072 meson.add_install_script('sh', '-c',
2073 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2074endif
2075
349cc4a5 2076if conf.get('ENABLE_VCONSOLE') == 1
37efbbd8
ZJS
2077 executable('systemd-vconsole-setup',
2078 'src/vconsole/vconsole-setup.c',
005a29f2
ZJS
2079 include_directories : includes,
2080 link_with : [libshared],
2081 install_rpath : rootlibexecdir,
2082 install : true,
2083 install_dir : rootlibexecdir)
5c23128d
ZJS
2084endif
2085
349cc4a5 2086if conf.get('ENABLE_RANDOMSEED') == 1
37efbbd8
ZJS
2087 executable('systemd-random-seed',
2088 'src/random-seed/random-seed.c',
2089 include_directories : includes,
2090 link_with : [libshared],
2091 install_rpath : rootlibexecdir,
2092 install : true,
2093 install_dir : rootlibexecdir)
5c23128d
ZJS
2094endif
2095
349cc4a5 2096if conf.get('ENABLE_FIRSTBOOT') == 1
37efbbd8
ZJS
2097 executable('systemd-firstboot',
2098 'src/firstboot/firstboot.c',
2099 include_directories : includes,
2100 link_with : [libshared],
2101 dependencies : [libcrypt],
2102 install_rpath : rootlibexecdir,
2103 install : true,
2104 install_dir : rootbindir)
5c23128d
ZJS
2105endif
2106
2107executable('systemd-remount-fs',
2108 'src/remount-fs/remount-fs.c',
2109 'src/core/mount-setup.c',
2110 'src/core/mount-setup.h',
2111 include_directories : includes,
2112 link_with : [libshared],
b2fc5836 2113 install_rpath : rootlibexecdir,
5c23128d
ZJS
2114 install : true,
2115 install_dir : rootlibexecdir)
2116
2117executable('systemd-machine-id-setup',
2118 'src/machine-id-setup/machine-id-setup-main.c',
2119 'src/core/machine-id-setup.c',
2120 'src/core/machine-id-setup.h',
2121 include_directories : includes,
aac26058 2122 link_with : [libshared],
b2fc5836 2123 install_rpath : rootlibexecdir,
5c23128d
ZJS
2124 install : true,
2125 install_dir : rootbindir)
2126
2127executable('systemd-fsck',
2128 'src/fsck/fsck.c',
2129 include_directories : includes,
aac26058 2130 link_with : [libshared],
421f0012 2131 install_rpath : rootlibexecdir,
5c23128d
ZJS
2132 install : true,
2133 install_dir : rootlibexecdir)
2134
80750adb
ZJS
2135executable('systemd-growfs',
2136 'src/partition/growfs.c',
2137 include_directories : includes,
2138 link_with : [libshared],
c34b75a1 2139 dependencies : [libcryptsetup],
80750adb
ZJS
2140 install_rpath : rootlibexecdir,
2141 install : true,
2142 install_dir : rootlibexecdir)
2143
b7f28ac5
ZJS
2144executable('systemd-makefs',
2145 'src/partition/makefs.c',
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2149 install : true,
2150 install_dir : rootlibexecdir)
2151
5c23128d
ZJS
2152executable('systemd-sleep',
2153 'src/sleep/sleep.c',
2154 include_directories : includes,
2155 link_with : [libshared],
421f0012 2156 install_rpath : rootlibexecdir,
5c23128d
ZJS
2157 install : true,
2158 install_dir : rootlibexecdir)
2159
005a29f2
ZJS
2160exe = executable('systemd-sysctl',
2161 'src/sysctl/sysctl.c',
2162 include_directories : includes,
2163 link_with : [libshared],
2164 install_rpath : rootlibexecdir,
2165 install : true,
2166 install_dir : rootlibexecdir)
2167public_programs += [exe]
5c23128d
ZJS
2168
2169executable('systemd-ac-power',
2170 'src/ac-power/ac-power.c',
2171 include_directories : includes,
2172 link_with : [libshared],
421f0012 2173 install_rpath : rootlibexecdir,
5c23128d
ZJS
2174 install : true,
2175 install_dir : rootlibexecdir)
2176
005a29f2
ZJS
2177exe = executable('systemd-detect-virt',
2178 'src/detect-virt/detect-virt.c',
2179 include_directories : includes,
2180 link_with : [libshared],
2181 install_rpath : rootlibexecdir,
2182 install : true)
2183public_programs += [exe]
2184
2185exe = executable('systemd-delta',
2186 'src/delta/delta.c',
2187 include_directories : includes,
2188 link_with : [libshared],
2189 install_rpath : rootlibexecdir,
2190 install : true)
2191public_programs += [exe]
2192
2193exe = executable('systemd-escape',
2194 'src/escape/escape.c',
2195 include_directories : includes,
2196 link_with : [libshared],
2197 install_rpath : rootlibexecdir,
2198 install : true,
2199 install_dir : rootbindir)
2200public_programs += [exe]
2201
2202exe = executable('systemd-notify',
2203 'src/notify/notify.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2207 install : true,
2208 install_dir : rootbindir)
2209public_programs += [exe]
5c23128d
ZJS
2210
2211executable('systemd-volatile-root',
2212 'src/volatile-root/volatile-root.c',
2213 include_directories : includes,
2214 link_with : [libshared],
421f0012 2215 install_rpath : rootlibexecdir,
5c23128d
ZJS
2216 install : true,
2217 install_dir : rootlibexecdir)
2218
2219executable('systemd-cgroups-agent',
2220 'src/cgroups-agent/cgroups-agent.c',
2221 include_directories : includes,
2222 link_with : [libshared],
421f0012 2223 install_rpath : rootlibexecdir,
5c23128d
ZJS
2224 install : true,
2225 install_dir : rootlibexecdir)
2226
005a29f2
ZJS
2227exe = executable('systemd-path',
2228 'src/path/path.c',
2229 include_directories : includes,
aac26058 2230 link_with : [libshared],
005a29f2
ZJS
2231 install_rpath : rootlibexecdir,
2232 install : true)
2233public_programs += [exe]
2234
2235exe = executable('systemd-ask-password',
2236 'src/ask-password/ask-password.c',
2237 include_directories : includes,
aac26058 2238 link_with : [libshared],
005a29f2
ZJS
2239 install_rpath : rootlibexecdir,
2240 install : true,
2241 install_dir : rootbindir)
2242public_programs += [exe]
5c23128d
ZJS
2243
2244executable('systemd-reply-password',
2245 'src/reply-password/reply-password.c',
2246 include_directories : includes,
aac26058 2247 link_with : [libshared],
421f0012 2248 install_rpath : rootlibexecdir,
5c23128d
ZJS
2249 install : true,
2250 install_dir : rootlibexecdir)
2251
005a29f2
ZJS
2252exe = executable('systemd-tty-ask-password-agent',
2253 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2254 include_directories : includes,
aac26058 2255 link_with : [libshared],
005a29f2
ZJS
2256 install_rpath : rootlibexecdir,
2257 install : true,
2258 install_dir : rootbindir)
2259public_programs += [exe]
2260
2261exe = executable('systemd-cgls',
2262 'src/cgls/cgls.c',
2263 include_directories : includes,
aac26058 2264 link_with : [libshared],
005a29f2
ZJS
2265 install_rpath : rootlibexecdir,
2266 install : true)
2267public_programs += [exe]
2268
2269exe = executable('systemd-cgtop',
2270 'src/cgtop/cgtop.c',
2271 include_directories : includes,
aac26058 2272 link_with : [libshared],
005a29f2
ZJS
2273 install_rpath : rootlibexecdir,
2274 install : true)
2275public_programs += [exe]
5c23128d
ZJS
2276
2277executable('systemd-initctl',
2278 'src/initctl/initctl.c',
2279 include_directories : includes,
aac26058 2280 link_with : [libshared],
421f0012 2281 install_rpath : rootlibexecdir,
5c23128d
ZJS
2282 install : true,
2283 install_dir : rootlibexecdir)
2284
005a29f2
ZJS
2285exe = executable('systemd-mount',
2286 'src/mount/mount-tool.c',
2287 include_directories : includes,
34ce0a52 2288 link_with : [libshared],
005a29f2
ZJS
2289 install_rpath : rootlibexecdir,
2290 install : true)
2291public_programs += [exe]
5c23128d 2292
7b76fce1 2293meson.add_install_script(meson_make_symlink,
e17e5ba9 2294 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 2295
005a29f2
ZJS
2296exe = executable('systemd-run',
2297 'src/run/run.c',
2298 include_directories : includes,
aac26058 2299 link_with : [libshared],
005a29f2
ZJS
2300 install_rpath : rootlibexecdir,
2301 install : true)
2302public_programs += [exe]
2303
2304exe = executable('systemd-stdio-bridge',
2305 'src/stdio-bridge/stdio-bridge.c',
2306 include_directories : includes,
aac26058 2307 link_with : [libshared],
005a29f2
ZJS
2308 install_rpath : rootlibexecdir,
2309 install : true)
2310public_programs += [exe]
2311
2312exe = executable('busctl',
2313 'src/busctl/busctl.c',
2314 'src/busctl/busctl-introspect.c',
2315 'src/busctl/busctl-introspect.h',
2316 include_directories : includes,
aac26058 2317 link_with : [libshared],
005a29f2
ZJS
2318 install_rpath : rootlibexecdir,
2319 install : true)
2320public_programs += [exe]
5c23128d 2321
349cc4a5 2322if conf.get('ENABLE_SYSUSERS') == 1
37efbbd8
ZJS
2323 exe = executable('systemd-sysusers',
2324 'src/sysusers/sysusers.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 install_rpath : rootlibexecdir,
2328 install : true,
2329 install_dir : rootbindir)
2330 public_programs += [exe]
5c23128d
ZJS
2331endif
2332
349cc4a5 2333if conf.get('ENABLE_TMPFILES') == 1
37efbbd8
ZJS
2334 exe = executable('systemd-tmpfiles',
2335 'src/tmpfiles/tmpfiles.c',
2336 include_directories : includes,
2337 link_with : [libshared],
2338 dependencies : [libacl],
2339 install_rpath : rootlibexecdir,
2340 install : true,
2341 install_dir : rootbindir)
2342 public_programs += [exe]
d9daae55
ZJS
2343
2344 test('test-systemd-tmpfiles',
2345 test_systemd_tmpfiles_py,
2346 args : exe.full_path())
2347 # https://github.com/mesonbuild/meson/issues/2681
5c23128d
ZJS
2348endif
2349
349cc4a5 2350if conf.get('ENABLE_HWDB') == 1
37efbbd8
ZJS
2351 exe = executable('systemd-hwdb',
2352 'src/hwdb/hwdb.c',
2353 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2354 include_directories : includes,
0c06b506 2355 link_with : [libudev_static],
0da6f396 2356 install_rpath : udev_rpath,
37efbbd8
ZJS
2357 install : true,
2358 install_dir : rootbindir)
2359 public_programs += [exe]
2360endif
2361
349cc4a5 2362if conf.get('ENABLE_QUOTACHECK') == 1
37efbbd8
ZJS
2363 executable('systemd-quotacheck',
2364 'src/quotacheck/quotacheck.c',
005a29f2 2365 include_directories : includes,
aac26058 2366 link_with : [libshared],
005a29f2
ZJS
2367 install_rpath : rootlibexecdir,
2368 install : true,
37efbbd8 2369 install_dir : rootlibexecdir)
5c23128d
ZJS
2370endif
2371
005a29f2
ZJS
2372exe = executable('systemd-socket-proxyd',
2373 'src/socket-proxy/socket-proxyd.c',
2374 include_directories : includes,
aac26058 2375 link_with : [libshared],
005a29f2
ZJS
2376 dependencies : [threads],
2377 install_rpath : rootlibexecdir,
2378 install : true,
2379 install_dir : rootlibexecdir)
2380public_programs += [exe]
2381
2382exe = executable('systemd-udevd',
2383 systemd_udevd_sources,
2384 include_directories : includes,
5c72049f 2385 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
005a29f2 2386 link_with : [libudev_core,
005a29f2 2387 libsystemd_network,
0c06b506 2388 libudev_static],
3a30f21f
ZJS
2389 dependencies : [threads,
2390 libkmod,
005a29f2 2391 libidn,
aac26058
ZJS
2392 libacl,
2393 libblkid],
1aec3ed9 2394 install_rpath : udev_rpath,
005a29f2
ZJS
2395 install : true,
2396 install_dir : rootlibexecdir)
2397public_programs += [exe]
2398
2399exe = executable('udevadm',
2400 udevadm_sources,
6671e818 2401 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
005a29f2
ZJS
2402 include_directories : includes,
2403 link_with : [libudev_core,
005a29f2 2404 libsystemd_network,
0c06b506 2405 libudev_static],
3a30f21f
ZJS
2406 dependencies : [threads,
2407 libkmod,
005a29f2 2408 libidn,
aac26058
ZJS
2409 libacl,
2410 libblkid],
1aec3ed9 2411 install_rpath : udev_rpath,
005a29f2
ZJS
2412 install : true,
2413 install_dir : rootbindir)
2414public_programs += [exe]
5c23128d
ZJS
2415
2416executable('systemd-shutdown',
2417 systemd_shutdown_sources,
2418 include_directories : includes,
34ce0a52 2419 link_with : [libshared],
95b862b0 2420 dependencies : [libmount],
421f0012 2421 install_rpath : rootlibexecdir,
5c23128d
ZJS
2422 install : true,
2423 install_dir : rootlibexecdir)
2424
2425executable('systemd-update-done',
2426 'src/update-done/update-done.c',
2427 include_directories : includes,
2428 link_with : [libshared],
421f0012 2429 install_rpath : rootlibexecdir,
5c23128d
ZJS
2430 install : true,
2431 install_dir : rootlibexecdir)
2432
2433executable('systemd-update-utmp',
2434 'src/update-utmp/update-utmp.c',
2435 include_directories : includes,
aac26058 2436 link_with : [libshared],
5c23128d 2437 dependencies : [libaudit],
421f0012 2438 install_rpath : rootlibexecdir,
5c23128d
ZJS
2439 install : true,
2440 install_dir : rootlibexecdir)
2441
349cc4a5 2442if conf.get('HAVE_KMOD') == 1
37efbbd8
ZJS
2443 executable('systemd-modules-load',
2444 'src/modules-load/modules-load.c',
2445 include_directories : includes,
2446 link_with : [libshared],
2447 dependencies : [libkmod],
2448 install_rpath : rootlibexecdir,
2449 install : true,
2450 install_dir : rootlibexecdir)
94e75a54 2451
37efbbd8
ZJS
2452 meson.add_install_script('sh', '-c',
2453 mkdir_p.format(modulesloaddir))
2454 meson.add_install_script('sh', '-c',
2455 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
2456endif
2457
005a29f2
ZJS
2458exe = executable('systemd-nspawn',
2459 systemd_nspawn_sources,
2460 'src/core/mount-setup.c', # FIXME: use a variable?
2461 'src/core/mount-setup.h',
2462 'src/core/loopback-setup.c',
2463 'src/core/loopback-setup.h',
2464 include_directories : [includes, include_directories('src/nspawn')],
0bc91152 2465 link_with : [libshared],
005a29f2
ZJS
2466 dependencies : [libacl,
2467 libblkid,
2468 libseccomp,
2469 libselinux],
2470 install_rpath : rootlibexecdir,
2471 install : true)
2472public_programs += [exe]
5c23128d 2473
349cc4a5 2474if conf.get('ENABLE_NETWORKD') == 1
37efbbd8
ZJS
2475 executable('systemd-networkd',
2476 systemd_networkd_sources,
2477 include_directories : includes,
2478 link_with : [libnetworkd_core,
37efbbd8 2479 libsystemd_network,
0c06b506 2480 libudev_static,
37efbbd8 2481 libshared],
4b57a272 2482 dependencies : [threads],
37efbbd8
ZJS
2483 install_rpath : rootlibexecdir,
2484 install : true,
2485 install_dir : rootlibexecdir)
2486
2487 executable('systemd-networkd-wait-online',
2488 systemd_networkd_wait_online_sources,
2489 include_directories : includes,
2490 link_with : [libnetworkd_core,
2491 libshared],
2492 install_rpath : rootlibexecdir,
2493 install : true,
2494 install_dir : rootlibexecdir)
5c23128d 2495
dcfe072a
FS
2496 exe = executable('networkctl',
2497 networkctl_sources,
2498 include_directories : includes,
2499 link_with : [libsystemd_network,
aac26058 2500 libshared],
dcfe072a
FS
2501 install_rpath : rootlibexecdir,
2502 install : true,
2503 install_dir : rootbindir)
2504 public_programs += [exe]
2505endif
e821f6a9
ZJS
2506
2507executable('systemd-sulogin-shell',
2508 ['src/sulogin-shell/sulogin-shell.c'],
2509 include_directories : includes,
2510 link_with : [libshared],
2511 install_rpath : rootlibexecdir,
2512 install : true,
2513 install_dir : rootlibexecdir)
2514
69e96427
ZJS
2515############################################################
2516
2517foreach tuple : tests
37efbbd8
ZJS
2518 sources = tuple[0]
2519 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2520 dependencies = tuple[2]
2521 condition = tuple.length() >= 4 ? tuple[3] : ''
2522 type = tuple.length() >= 5 ? tuple[4] : ''
2523 defs = tuple.length() >= 6 ? tuple[5] : []
2524 incs = tuple.length() >= 7 ? tuple[6] : includes
2525 timeout = 30
2526
2527 name = sources[0].split('/')[-1].split('.')[0]
2528 if type.startswith('timeout=')
2529 timeout = type.split('=')[1].to_int()
2530 type = ''
2531 endif
08318a2c
AD
2532 if want_tests == 'false'
2533 message('Not compiling @0@ because tests is set to false'.format(name))
2534 elif condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
2535 exe = executable(
2536 name,
2537 sources,
2538 include_directories : incs,
2539 link_with : link_with,
2540 dependencies : dependencies,
2541 c_args : defs,
2542 install_rpath : rootlibexecdir,
7cdd9783
MB
2543 install : install_tests,
2544 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
2545
2546 if type == 'manual'
2547 message('@0@ is a manual test'.format(name))
2548 elif type == 'unsafe' and want_tests != 'unsafe'
2549 message('@0@ is an unsafe test'.format(name))
2550 else
2551 test(name, exe,
2552 env : test_env,
2553 timeout : timeout)
2554 endif
2555 else
2556 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2557 endif
69e96427
ZJS
2558endforeach
2559
0632b4cd 2560exe = executable(
37efbbd8
ZJS
2561 'test-libsystemd-sym',
2562 test_libsystemd_sym_c,
2563 include_directories : includes,
2564 link_with : [libsystemd],
2565 install : install_tests,
2566 install_dir : testsdir)
0632b4cd 2567test('test-libsystemd-sym', exe)
37ab1a25 2568
0632b4cd
ZJS
2569exe = executable(
2570 'test-libsystemd-static-sym',
2571 test_libsystemd_sym_c,
2572 include_directories : includes,
0632b4cd
ZJS
2573 link_with : [install_libsystemd_static],
2574 dependencies : [threads], # threads is already included in dependencies on the library,
2575 # but does not seem to get propagated. Add here as a work-around.
20f3d32d
DC
2576 build_by_default : static_libsystemd_pic,
2577 install : install_tests and static_libsystemd_pic,
0632b4cd 2578 install_dir : testsdir)
20f3d32d 2579if static_libsystemd_pic
0632b4cd
ZJS
2580 test('test-libsystemd-static-sym', exe)
2581endif
37ab1a25 2582
0632b4cd 2583exe = executable(
37efbbd8
ZJS
2584 'test-libudev-sym',
2585 test_libudev_sym_c,
2586 include_directories : includes,
2587 c_args : ['-Wno-deprecated-declarations'],
2588 link_with : [libudev],
2589 install : install_tests,
2590 install_dir : testsdir)
0632b4cd
ZJS
2591test('test-libudev-sym', exe)
2592
2593exe = executable(
2594 'test-libudev-static-sym',
2595 test_libudev_sym_c,
2596 include_directories : includes,
20f3d32d 2597 c_args : ['-Wno-deprecated-declarations'],
0632b4cd 2598 link_with : [install_libudev_static],
20f3d32d
DC
2599 build_by_default : static_libudev_pic,
2600 install : install_tests and static_libudev_pic,
0632b4cd 2601 install_dir : testsdir)
20f3d32d 2602if static_libudev_pic
0632b4cd
ZJS
2603 test('test-libudev-static-sym', exe)
2604endif
e0bec52f 2605
69e96427 2606############################################################
5c23128d 2607
7db7d5b7
JR
2608fuzzer_exes = []
2609
2610foreach tuple : fuzzers
2611 sources = tuple[0]
2612 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2613 dependencies = tuple[2]
2614 defs = tuple.length() >= 4 ? tuple[3] : []
2615 incs = tuple.length() >= 5 ? tuple[4] : includes
2616
31e57a35 2617 if fuzzer_build
7db7d5b7
JR
2618 dependencies += fuzzing_engine
2619 else
2620 sources += 'src/fuzz/fuzz-main.c'
2621 endif
2622
2623 name = sources[0].split('/')[-1].split('.')[0]
2624
2625 fuzzer_exes += executable(
2626 name,
2627 sources,
2628 include_directories : [incs, include_directories('src/fuzz')],
2629 link_with : link_with,
2630 dependencies : dependencies,
2631 c_args : defs,
2632 install : false)
2633endforeach
2634
2635run_target('fuzzers',
2636 depends : fuzzer_exes,
2637 command : ['true'])
2638
2639############################################################
2640
5c23128d
ZJS
2641make_directive_index_py = find_program('tools/make-directive-index.py')
2642make_man_index_py = find_program('tools/make-man-index.py')
b184e8fe 2643xml_helper_py = find_program('tools/xml_helper.py')
abba22c5 2644hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
5c23128d
ZJS
2645
2646subdir('units')
2647subdir('sysctl.d')
2648subdir('sysusers.d')
2649subdir('tmpfiles.d')
e783f957 2650subdir('presets')
5c23128d
ZJS
2651subdir('hwdb')
2652subdir('network')
2653subdir('man')
2654subdir('shell-completion/bash')
2655subdir('shell-completion/zsh')
2d684e65
LP
2656subdir('doc/sysvinit')
2657subdir('doc/var-log')
5c23128d
ZJS
2658
2659# FIXME: figure out if the warning is true:
2660# https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2661install_subdir('factory/etc',
2662 install_dir : factorydir)
2663
2664
2665install_data('xorg/50-systemd-user.sh',
2666 install_dir : xinitrcdir)
582faeb4
DJL
2667install_data('modprobe.d/systemd.conf',
2668 install_dir : modprobedir)
f09eb768 2669install_data('LICENSE.GPL2',
5c23128d 2670 'LICENSE.LGPL2.1',
f09eb768
LP
2671 'NEWS',
2672 'README',
2673 'doc/CODING_STYLE',
2674 'doc/DISTRO_PORTING',
2675 'doc/ENVIRONMENT.md',
2676 'doc/HACKING',
2677 'doc/TRANSIENT-SETTINGS.md',
2678 'doc/TRANSLATORS',
2679 'doc/UIDS-GIDS.md',
5c23128d
ZJS
2680 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2681 install_dir : docdir)
d68b342b 2682
94e75a54
ZJS
2683meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2684meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2685
d68b342b
ZJS
2686############################################################
2687
005a29f2
ZJS
2688meson_check_help = find_program('tools/meson-check-help.sh')
2689
2690foreach exec : public_programs
37efbbd8
ZJS
2691 name = exec.full_path().split('/')[-1]
2692 test('check-help-' + name,
2693 meson_check_help,
2694 args : [exec.full_path()])
005a29f2
ZJS
2695endforeach
2696
2697############################################################
2698
52d4d1d3
ZJS
2699# Enable tests for all supported sanitizers
2700foreach tuple : sanitizers
2701 sanitizer = tuple[0]
2702 build = tuple[1]
b68dfb9e 2703
52d4d1d3
ZJS
2704 have = run_command(check_compilation_sh,
2705 cc.cmd_array(), '-x', 'c',
2706 '-fsanitize=@0@'.format(sanitizer),
2707 '-include', link_test_c).returncode() == 0
2708 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
b68dfb9e 2709
52d4d1d3
ZJS
2710 if have
2711 prev = ''
2712 foreach p : fuzz_regression_tests
2713 b = p.split('/')[-2]
2714 c = p.split('/')[-1]
2715
2716 name = '@0@:@1@'.format(b, sanitizer)
2717
2718 if name != prev
2719 if want_tests == 'false'
2720 message('Not compiling @0@ because tests is set to false'.format(name))
2721 elif slow_tests
2722 exe = custom_target(
2723 name,
2724 output : name,
2725 depends : build,
2726 command : [env, 'ln', '-fs',
2727 join_paths(build.full_path(), b),
2728 '@OUTPUT@'],
2729 build_by_default : true)
2730 else
2731 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2732 endif
2733 endif
2734 prev = name
2735
2736 if want_tests != 'false' and slow_tests
2737 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2738 env,
2739 args : [exe.full_path(),
2740 join_paths(meson.source_root(),
2741 'test/fuzz-regressions',
2742 p)])
2743 endif
2744 endforeach
b68dfb9e
ZJS
2745 endif
2746endforeach
2747
52d4d1d3 2748
b68dfb9e
ZJS
2749############################################################
2750
0700e8ba 2751if git.found()
37efbbd8
ZJS
2752 all_files = run_command(
2753 git,
450b60ba 2754 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
37efbbd8
ZJS
2755 'ls-files',
2756 ':/*.[ch]'])
2757 all_files = files(all_files.stdout().split())
d68b342b 2758
e85a690b 2759 custom_target(
0700e8ba 2760 'tags',
e85a690b 2761 output : 'tags',
25a82102 2762 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2f09974f 2763 run_target(
0700e8ba 2764 'ctags',
25a82102 2765 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
d68b342b 2766endif
177929c2
ZJS
2767
2768if git.found()
37efbbd8 2769 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
a923e085 2770 run_target(
37efbbd8 2771 'git-contrib',
37efbbd8 2772 command : [meson_git_contrib_sh])
177929c2 2773endif
dd6ab3df
ZJS
2774
2775if git.found()
2776 git_head = run_command(
2777 git,
450b60ba 2778 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
dd6ab3df
ZJS
2779 'rev-parse', 'HEAD']).stdout().strip()
2780 git_head_short = run_command(
2781 git,
450b60ba 2782 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
dd6ab3df
ZJS
2783 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2784
2785 run_target(
2786 'git-snapshot',
2787 command : ['git', 'archive',
450b60ba 2788 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
dd6ab3df
ZJS
2789 git_head_short),
2790 '--prefix', 'systemd-@0@/'.format(git_head),
2791 'HEAD'])
2792endif
829257d1
ZJS
2793
2794############################################################
2795
51b13863
LP
2796meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2797run_target(
2798 'check-api-docs',
2799 depends : [man, libsystemd, libudev],
2800 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2801
2802############################################################
2803
829257d1
ZJS
2804status = [
2805 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2806
2675413e 2807 'split /usr: @0@'.format(split_usr),
157baa87 2808 'split bin-sbin: @0@'.format(split_bin),
359b496f
YW
2809 'prefix directory: @0@'.format(prefixdir),
2810 'rootprefix directory: @0@'.format(rootprefixdir),
2811 'sysconf directory: @0@'.format(sysconfdir),
2812 'include directory: @0@'.format(includedir),
2813 'lib directory: @0@'.format(libdir),
2814 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
2815 'SysV init scripts: @0@'.format(sysvinit_path),
2816 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
2817 'PAM modules directory: @0@'.format(pamlibdir),
2818 'PAM configuration directory: @0@'.format(pamconfdir),
2819 'RPM macros directory: @0@'.format(rpmmacrosdir),
2820 'modprobe.d directory: @0@'.format(modprobedir),
2821 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2822 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2823 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2824 'bash completions directory: @0@'.format(bashcompletiondir),
2825 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1
ZJS
2826 'extra start script: @0@'.format(get_option('rc-local')),
2827 'extra stop script: @0@'.format(get_option('halt-local')),
2828 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2829 get_option('debug-tty')),
2830 'TTY GID: @0@'.format(tty_gid),
84786b8e 2831 'users GID: @0@'.format(users_gid),
829257d1
ZJS
2832 'maximum system UID: @0@'.format(system_uid_max),
2833 'maximum system GID: @0@'.format(system_gid_max),
87d5e4f2
LP
2834 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2835 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2836 'minimum container UID base: @0@'.format(container_uid_base_min),
2837 'maximum container UID base: @0@'.format(container_uid_base_max),
829257d1 2838 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 2839 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 2840 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 2841 'support URL: @0@'.format(support_url),
afde4574
LP
2842 'nobody user name: @0@'.format(nobody_user),
2843 'nobody group name: @0@'.format(nobody_group),
829257d1 2844 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 2845 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
2846
2847 'default DNSSEC mode: @0@'.format(default_dnssec),
2848 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2849 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2850
2851alt_dns_servers = '\n '.join(dns_servers.split(' '))
2852alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2853status += [
2854 'default DNS servers: @0@'.format(alt_dns_servers),
2855 'default NTP servers: @0@'.format(alt_ntp_servers)]
2856
2857alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2858 '@@0@'.format(time_epoch)).stdout().strip()
2859status += [
2860 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2861
2862# TODO:
2863# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2864# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2865# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2866
349cc4a5 2867if conf.get('ENABLE_EFI') == 1
829257d1
ZJS
2868 status += [
2869 'efi arch: @0@'.format(efi_arch)]
2870
2871 if have_gnu_efi
2872 status += [
2873 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2874 'EFI CC @0@'.format(efi_cc),
359b496f
YW
2875 'EFI lib directory: @0@'.format(efi_libdir),
2876 'EFI lds directory: @0@'.format(efi_ldsdir),
2877 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
2878 endif
2879endif
2880
2881found = []
2882missing = []
2883
2884foreach tuple : [
2885 ['libcryptsetup'],
2886 ['PAM'],
2887 ['AUDIT'],
2888 ['IMA'],
2889 ['AppArmor'],
2890 ['SELinux'],
2891 ['SECCOMP'],
2892 ['SMACK'],
2893 ['zlib'],
2894 ['xz'],
2895 ['lz4'],
2896 ['bzip2'],
2897 ['ACL'],
2898 ['gcrypt'],
2899 ['qrencode'],
2900 ['microhttpd'],
2901 ['gnutls'],
2902 ['libcurl'],
d1bf5675 2903 ['idn'],
87057e24 2904 ['libidn2'],
829257d1 2905 ['libidn'],
e7e11bbf 2906 ['nss-systemd'],
829257d1
ZJS
2907 ['libiptc'],
2908 ['elfutils'],
2909 ['binfmt'],
2910 ['vconsole'],
2911 ['quotacheck'],
2912 ['tmpfiles'],
2913 ['environment.d'],
2914 ['sysusers'],
2915 ['firstboot'],
2916 ['randomseed'],
2917 ['backlight'],
2918 ['rfkill'],
2919 ['logind'],
2920 ['machined'],
61d0578b 2921 ['portabled'],
829257d1
ZJS
2922 ['importd'],
2923 ['hostnamed'],
2924 ['timedated'],
2925 ['timesyncd'],
2926 ['localed'],
2927 ['networkd'],
a7456af5 2928 ['resolve'],
829257d1
ZJS
2929 ['coredump'],
2930 ['polkit'],
2931 ['legacy pkla', install_polkit_pkla],
2932 ['efi'],
2933 ['gnu-efi', have_gnu_efi],
2934 ['kmod'],
2935 ['xkbcommon'],
c4c978a0 2936 ['pcre2'],
829257d1
ZJS
2937 ['blkid'],
2938 ['dbus'],
2939 ['glib'],
08cf5b8d 2940 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
829257d1
ZJS
2941 ['hwdb'],
2942 ['tpm'],
2943 ['man pages', want_man],
2944 ['html pages', want_html],
2945 ['man page indices', want_man and have_lxml],
829257d1
ZJS
2946 ['SysV compat'],
2947 ['utmp'],
2948 ['ldconfig'],
2949 ['hibernate'],
2950 ['adm group', get_option('adm-group')],
2951 ['wheel group', get_option('wheel-group')],
b14e1b43 2952 ['gshadow'],
829257d1
ZJS
2953 ['debug hashmap'],
2954 ['debug mmap cache'],
d18cb393 2955 ['valgrind', conf.get('VALGRIND') == 1],
829257d1
ZJS
2956]
2957
af4d7860
ZJS
2958 if tuple.length() >= 2
2959 cond = tuple[1]
2960 else
829257d1
ZJS
2961 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2962 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 2963 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
2964 endif
2965 if cond
2966 found += [tuple[0]]
2967 else
2968 missing += [tuple[0]]
2969 endif
2970endforeach
2971
2972status += [
9d39c1bf 2973 '',
829257d1 2974 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
2975 '',
2976 'disabled features: @0@'.format(', '.join(missing)),
2977 '']
829257d1 2978message('\n '.join(status))
9a8e64b0
ZJS
2979
2980if rootprefixdir != rootprefix_default
8ea9fad7
YW
2981 warning('\n' +
2982 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2983 'systemd used fixed names for unit file directories and other paths, so anything\n' +
2984 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
9a8e64b0 2985endif