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