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