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