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