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