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