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