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