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