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