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