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