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