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