]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
tools: move generate-gperfs.py to tools/
[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 generate_gperfs = find_program('tools/generate-gperfs.py')
1392
1393 subdir('po')
1394 subdir('catalog')
1395 subdir('src/systemd')
1396 subdir('src/basic')
1397 subdir('src/libsystemd')
1398 subdir('src/libsystemd-network')
1399 subdir('src/journal')
1400 subdir('src/login')
1401
1402 libjournal_core = static_library(
1403 'journal-core',
1404 libjournal_core_sources,
1405 journald_gperf_c,
1406 include_directories : includes,
1407 install : false)
1408
1409 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1410 libsystemd = shared_library(
1411 'systemd',
1412 disable_mempool_c,
1413 version : libsystemd_version,
1414 include_directories : includes,
1415 link_args : ['-shared',
1416 '-Wl,--version-script=' + libsystemd_sym_path],
1417 link_with : [libbasic,
1418 libbasic_gcrypt],
1419 link_whole : [libsystemd_static,
1420 libjournal_client],
1421 dependencies : [threads,
1422 librt,
1423 libxz,
1424 liblz4],
1425 link_depends : libsystemd_sym,
1426 install : true,
1427 install_dir : rootlibdir)
1428
1429 static_libsystemd = get_option('static-libsystemd')
1430 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1431
1432 install_libsystemd_static = static_library(
1433 'systemd',
1434 libsystemd_sources,
1435 journal_client_sources,
1436 basic_sources,
1437 basic_gcrypt_sources,
1438 disable_mempool_c,
1439 include_directories : includes,
1440 build_by_default : static_libsystemd != 'false',
1441 install : static_libsystemd != 'false',
1442 install_dir : rootlibdir,
1443 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1444 dependencies : [threads,
1445 librt,
1446 libxz,
1447 liblz4,
1448 libcap,
1449 libblkid,
1450 libmount,
1451 libselinux,
1452 libgcrypt],
1453 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1454
1455 ############################################################
1456
1457 # binaries that have --help and are intended for use by humans,
1458 # usually, but not always, installed in /bin.
1459 public_programs = []
1460
1461 subdir('src/libudev')
1462 subdir('src/shared')
1463 subdir('src/core')
1464 subdir('src/udev')
1465 subdir('src/network')
1466
1467 subdir('src/analyze')
1468 subdir('src/journal-remote')
1469 subdir('src/coredump')
1470 subdir('src/hostname')
1471 subdir('src/import')
1472 subdir('src/kernel-install')
1473 subdir('src/locale')
1474 subdir('src/machine')
1475 subdir('src/portable')
1476 subdir('src/nspawn')
1477 subdir('src/resolve')
1478 subdir('src/timedate')
1479 subdir('src/timesync')
1480 subdir('src/vconsole')
1481 subdir('src/boot/efi')
1482
1483 subdir('src/test')
1484 subdir('src/fuzz')
1485 subdir('rules')
1486 subdir('test')
1487
1488 ############################################################
1489
1490 # only static linking apart from libdl, to make sure that the
1491 # module is linked to all libraries that it uses.
1492 test_dlopen = executable(
1493 'test-dlopen',
1494 test_dlopen_c,
1495 disable_mempool_c,
1496 include_directories : includes,
1497 link_with : [libbasic],
1498 dependencies : [libdl],
1499 build_by_default : want_tests != 'false')
1500
1501 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1502 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1503 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1504 ['resolve', 'ENABLE_NSS_RESOLVE']]
1505
1506 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1507 if condition
1508 module = tuple[0]
1509
1510 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1511 version_script_arg = join_paths(meson.source_root(), sym)
1512
1513 nss = shared_library(
1514 'nss_' + module,
1515 'src/nss-@0@/nss-@0@.c'.format(module),
1516 disable_mempool_c,
1517 version : '2',
1518 include_directories : includes,
1519 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1520 link_args : ['-Wl,-z,nodelete',
1521 '-shared',
1522 '-Wl,--version-script=' + version_script_arg,
1523 '-Wl,--undefined'],
1524 link_with : [libsystemd_static,
1525 libbasic],
1526 dependencies : [threads,
1527 librt],
1528 link_depends : sym,
1529 install : true,
1530 install_dir : rootlibdir)
1531
1532 # We cannot use shared_module because it does not support version suffix.
1533 # Unfortunately shared_library insists on creating the symlink…
1534 meson.add_install_script('sh', '-c',
1535 'rm $DESTDIR@0@/libnss_@1@.so'
1536 .format(rootlibdir, module))
1537
1538 if want_tests != 'false'
1539 test('dlopen-nss_' + module,
1540 test_dlopen,
1541 # path to dlopen must include a slash
1542 args : nss.full_path())
1543 endif
1544 endif
1545 endforeach
1546
1547 ############################################################
1548
1549 executable('systemd',
1550 systemd_sources,
1551 include_directories : includes,
1552 link_with : [libcore,
1553 libshared],
1554 dependencies : [threads,
1555 librt,
1556 libseccomp,
1557 libselinux,
1558 libmount,
1559 libblkid],
1560 install_rpath : rootlibexecdir,
1561 install : true,
1562 install_dir : rootlibexecdir)
1563
1564 meson.add_install_script(meson_make_symlink,
1565 join_paths(rootlibexecdir, 'systemd'),
1566 join_paths(rootsbindir, 'init'))
1567
1568 exe = executable('systemd-analyze',
1569 systemd_analyze_sources,
1570 include_directories : includes,
1571 link_with : [libcore,
1572 libshared],
1573 dependencies : [threads,
1574 librt,
1575 libseccomp,
1576 libselinux,
1577 libmount,
1578 libblkid],
1579 install_rpath : rootlibexecdir,
1580 install : true)
1581 public_programs += exe
1582
1583 executable('systemd-journald',
1584 systemd_journald_sources,
1585 include_directories : includes,
1586 link_with : [libjournal_core,
1587 libshared],
1588 dependencies : [threads,
1589 libxz,
1590 liblz4,
1591 libselinux],
1592 install_rpath : rootlibexecdir,
1593 install : true,
1594 install_dir : rootlibexecdir)
1595
1596 exe = executable('systemd-cat',
1597 systemd_cat_sources,
1598 include_directories : includes,
1599 link_with : [libjournal_core,
1600 libshared],
1601 dependencies : [threads],
1602 install_rpath : rootlibexecdir,
1603 install : true)
1604 public_programs += exe
1605
1606 exe = executable('journalctl',
1607 journalctl_sources,
1608 include_directories : includes,
1609 link_with : [libshared],
1610 dependencies : [threads,
1611 libqrencode,
1612 libxz,
1613 liblz4,
1614 libpcre2],
1615 install_rpath : rootlibexecdir,
1616 install : true,
1617 install_dir : rootbindir)
1618 public_programs += exe
1619
1620 executable('systemd-getty-generator',
1621 'src/getty-generator/getty-generator.c',
1622 include_directories : includes,
1623 link_with : [libshared],
1624 install_rpath : rootlibexecdir,
1625 install : true,
1626 install_dir : systemgeneratordir)
1627
1628 executable('systemd-debug-generator',
1629 'src/debug-generator/debug-generator.c',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 install_rpath : rootlibexecdir,
1633 install : true,
1634 install_dir : systemgeneratordir)
1635
1636 executable('systemd-fstab-generator',
1637 'src/fstab-generator/fstab-generator.c',
1638 'src/core/mount-setup.c',
1639 include_directories : includes,
1640 link_with : [libshared],
1641 install_rpath : rootlibexecdir,
1642 install : true,
1643 install_dir : systemgeneratordir)
1644
1645 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1646 executable('30-systemd-environment-d-generator',
1647 'src/environment-d-generator/environment-d-generator.c',
1648 include_directories : includes,
1649 link_with : [libshared],
1650 install_rpath : rootlibexecdir,
1651 install : true,
1652 install_dir : userenvgeneratordir)
1653
1654 meson.add_install_script(meson_make_symlink,
1655 join_paths(sysconfdir, 'environment'),
1656 join_paths(environmentdir, '99-environment.conf'))
1657 endif
1658
1659 if conf.get('ENABLE_HIBERNATE') == 1
1660 executable('systemd-hibernate-resume-generator',
1661 'src/hibernate-resume/hibernate-resume-generator.c',
1662 include_directories : includes,
1663 link_with : [libshared],
1664 install_rpath : rootlibexecdir,
1665 install : true,
1666 install_dir : systemgeneratordir)
1667
1668 executable('systemd-hibernate-resume',
1669 'src/hibernate-resume/hibernate-resume.c',
1670 include_directories : includes,
1671 link_with : [libshared],
1672 install_rpath : rootlibexecdir,
1673 install : true,
1674 install_dir : rootlibexecdir)
1675 endif
1676
1677 if conf.get('HAVE_BLKID') == 1
1678 executable('systemd-gpt-auto-generator',
1679 'src/gpt-auto-generator/gpt-auto-generator.c',
1680 'src/shared/blkid-util.h',
1681 include_directories : includes,
1682 link_with : [libshared],
1683 dependencies : libblkid,
1684 install_rpath : rootlibexecdir,
1685 install : true,
1686 install_dir : systemgeneratordir)
1687
1688 exe = executable('systemd-dissect',
1689 'src/dissect/dissect.c',
1690 include_directories : includes,
1691 link_with : [libshared],
1692 install_rpath : rootlibexecdir,
1693 install : true,
1694 install_dir : rootlibexecdir)
1695 public_programs += exe
1696 endif
1697
1698 if conf.get('ENABLE_RESOLVE') == 1
1699 executable('systemd-resolved',
1700 systemd_resolved_sources,
1701 include_directories : includes,
1702 link_with : [libshared,
1703 libbasic_gcrypt,
1704 libsystemd_resolve_core],
1705 dependencies : systemd_resolved_dependencies,
1706 install_rpath : rootlibexecdir,
1707 install : true,
1708 install_dir : rootlibexecdir)
1709
1710 exe = executable('resolvectl',
1711 resolvectl_sources,
1712 include_directories : includes,
1713 link_with : [libshared,
1714 libbasic_gcrypt,
1715 libsystemd_resolve_core],
1716 dependencies : [threads,
1717 libgpg_error,
1718 libm,
1719 libidn],
1720 install_rpath : rootlibexecdir,
1721 install : true)
1722 public_programs += exe
1723
1724 meson.add_install_script(meson_make_symlink,
1725 join_paths(bindir, 'resolvectl'),
1726 join_paths(rootsbindir, 'resolvconf'))
1727
1728 meson.add_install_script(meson_make_symlink,
1729 join_paths(bindir, 'resolvectl'),
1730 join_paths(bindir, 'systemd-resolve'))
1731 endif
1732
1733 if conf.get('ENABLE_LOGIND') == 1
1734 executable('systemd-logind',
1735 systemd_logind_sources,
1736 include_directories : includes,
1737 link_with : [liblogind_core,
1738 libshared],
1739 dependencies : [threads,
1740 libacl],
1741 install_rpath : rootlibexecdir,
1742 install : true,
1743 install_dir : rootlibexecdir)
1744
1745 exe = executable('loginctl',
1746 loginctl_sources,
1747 include_directories : includes,
1748 link_with : [libshared],
1749 dependencies : [threads,
1750 liblz4,
1751 libxz],
1752 install_rpath : rootlibexecdir,
1753 install : true,
1754 install_dir : rootbindir)
1755 public_programs += exe
1756
1757 exe = executable('systemd-inhibit',
1758 'src/login/inhibit.c',
1759 include_directories : includes,
1760 link_with : [libshared],
1761 install_rpath : rootlibexecdir,
1762 install : true,
1763 install_dir : rootbindir)
1764 public_programs += exe
1765
1766 if conf.get('HAVE_PAM') == 1
1767 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1768 pam_systemd = shared_library(
1769 'pam_systemd',
1770 pam_systemd_c,
1771 name_prefix : '',
1772 include_directories : includes,
1773 link_args : ['-shared',
1774 '-Wl,--version-script=' + version_script_arg],
1775 link_with : [libsystemd_static,
1776 libshared_static],
1777 dependencies : [threads,
1778 libpam,
1779 libpam_misc],
1780 link_depends : pam_systemd_sym,
1781 install : true,
1782 install_dir : pamlibdir)
1783
1784 if want_tests != 'false'
1785 test('dlopen-pam_systemd',
1786 test_dlopen,
1787 # path to dlopen must include a slash
1788 args : pam_systemd.full_path())
1789 endif
1790 endif
1791
1792 executable('systemd-user-runtime-dir',
1793 user_runtime_dir_sources,
1794 include_directories : includes,
1795 link_with : [libshared],
1796 install_rpath : rootlibexecdir,
1797 install : true,
1798 install_dir : rootlibexecdir)
1799 endif
1800
1801 if conf.get('HAVE_PAM') == 1
1802 executable('systemd-user-sessions',
1803 'src/user-sessions/user-sessions.c',
1804 include_directories : includes,
1805 link_with : [libshared],
1806 install_rpath : rootlibexecdir,
1807 install : true,
1808 install_dir : rootlibexecdir)
1809 endif
1810
1811 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1812 exe = executable('bootctl',
1813 'src/boot/bootctl.c',
1814 include_directories : includes,
1815 link_with : [libshared],
1816 dependencies : [libblkid],
1817 install_rpath : rootlibexecdir,
1818 install : true)
1819 public_programs += exe
1820
1821 executable('systemd-bless-boot',
1822 'src/boot/bless-boot.c',
1823 include_directories : includes,
1824 link_with : [libshared],
1825 dependencies : [libblkid],
1826 install_rpath : rootlibexecdir,
1827 install : true,
1828 install_dir : rootlibexecdir)
1829
1830 executable('systemd-bless-boot-generator',
1831 'src/boot/bless-boot-generator.c',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 install_rpath : rootlibexecdir,
1835 install : true,
1836 install_dir : systemgeneratordir)
1837 endif
1838
1839 executable('systemd-boot-check-no-failures',
1840 'src/boot/boot-check-no-failures.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 dependencies : [libblkid],
1844 install_rpath : rootlibexecdir,
1845 install : true,
1846 install_dir : rootlibexecdir)
1847
1848 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 dependencies : [threads],
1852 install_rpath : rootlibexecdir,
1853 install : true)
1854 public_programs += exe
1855
1856
1857 if get_option('link-systemctl-shared')
1858 systemctl_link_with = [libshared]
1859 else
1860 systemctl_link_with = [libsystemd_static,
1861 libshared_static,
1862 libjournal_client,
1863 libbasic_gcrypt]
1864 endif
1865
1866 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1867 include_directories : includes,
1868 link_with : systemctl_link_with,
1869 dependencies : [threads,
1870 libcap,
1871 libselinux,
1872 libxz,
1873 liblz4],
1874 install_rpath : rootlibexecdir,
1875 install : true,
1876 install_dir : rootbindir)
1877 public_programs += exe
1878
1879 if conf.get('ENABLE_PORTABLED') == 1
1880 executable('systemd-portabled',
1881 systemd_portabled_sources,
1882 include_directories : includes,
1883 link_with : [libshared],
1884 dependencies : [threads],
1885 install_rpath : rootlibexecdir,
1886 install : true,
1887 install_dir : rootlibexecdir)
1888
1889 exe = executable('portablectl', 'src/portable/portablectl.c',
1890 include_directories : includes,
1891 link_with : [libshared],
1892 dependencies : [threads],
1893 install_rpath : rootlibexecdir,
1894 install : true,
1895 install_dir : rootbindir)
1896 public_programs += exe
1897 endif
1898
1899 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1900 meson.add_install_script(meson_make_symlink,
1901 join_paths(rootbindir, 'systemctl'),
1902 join_paths(rootsbindir, alias))
1903 endforeach
1904
1905 if conf.get('ENABLE_BACKLIGHT') == 1
1906 executable('systemd-backlight',
1907 'src/backlight/backlight.c',
1908 include_directories : includes,
1909 link_with : [libshared],
1910 install_rpath : rootlibexecdir,
1911 install : true,
1912 install_dir : rootlibexecdir)
1913 endif
1914
1915 if conf.get('ENABLE_RFKILL') == 1
1916 executable('systemd-rfkill',
1917 'src/rfkill/rfkill.c',
1918 include_directories : includes,
1919 link_with : [libshared],
1920 install_rpath : rootlibexecdir,
1921 install : true,
1922 install_dir : rootlibexecdir)
1923 endif
1924
1925 executable('systemd-system-update-generator',
1926 'src/system-update-generator/system-update-generator.c',
1927 include_directories : includes,
1928 link_with : [libshared],
1929 install_rpath : rootlibexecdir,
1930 install : true,
1931 install_dir : systemgeneratordir)
1932
1933 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1934 executable('systemd-cryptsetup',
1935 'src/cryptsetup/cryptsetup.c',
1936 include_directories : includes,
1937 link_with : [libshared],
1938 dependencies : [libcryptsetup],
1939 install_rpath : rootlibexecdir,
1940 install : true,
1941 install_dir : rootlibexecdir)
1942
1943 executable('systemd-cryptsetup-generator',
1944 'src/cryptsetup/cryptsetup-generator.c',
1945 include_directories : includes,
1946 link_with : [libshared],
1947 dependencies : [libcryptsetup],
1948 install_rpath : rootlibexecdir,
1949 install : true,
1950 install_dir : systemgeneratordir)
1951
1952 executable('systemd-veritysetup',
1953 'src/veritysetup/veritysetup.c',
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [libcryptsetup],
1957 install_rpath : rootlibexecdir,
1958 install : true,
1959 install_dir : rootlibexecdir)
1960
1961 executable('systemd-veritysetup-generator',
1962 'src/veritysetup/veritysetup-generator.c',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [libcryptsetup],
1966 install_rpath : rootlibexecdir,
1967 install : true,
1968 install_dir : systemgeneratordir)
1969 endif
1970
1971 if conf.get('HAVE_SYSV_COMPAT') == 1
1972 executable('systemd-sysv-generator',
1973 'src/sysv-generator/sysv-generator.c',
1974 include_directories : includes,
1975 link_with : [libshared],
1976 install_rpath : rootlibexecdir,
1977 install : true,
1978 install_dir : systemgeneratordir)
1979
1980 executable('systemd-rc-local-generator',
1981 'src/rc-local-generator/rc-local-generator.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 install_rpath : rootlibexecdir,
1985 install : true,
1986 install_dir : systemgeneratordir)
1987 endif
1988
1989 if conf.get('ENABLE_HOSTNAMED') == 1
1990 executable('systemd-hostnamed',
1991 'src/hostname/hostnamed.c',
1992 include_directories : includes,
1993 link_with : [libshared],
1994 install_rpath : rootlibexecdir,
1995 install : true,
1996 install_dir : rootlibexecdir)
1997
1998 exe = executable('hostnamectl',
1999 'src/hostname/hostnamectl.c',
2000 include_directories : includes,
2001 link_with : [libshared],
2002 install_rpath : rootlibexecdir,
2003 install : true)
2004 public_programs += exe
2005 endif
2006
2007 if conf.get('ENABLE_LOCALED') == 1
2008 if conf.get('HAVE_XKBCOMMON') == 1
2009 # logind will load libxkbcommon.so dynamically on its own
2010 deps = [libdl]
2011 else
2012 deps = []
2013 endif
2014
2015 executable('systemd-localed',
2016 systemd_localed_sources,
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : deps,
2020 install_rpath : rootlibexecdir,
2021 install : true,
2022 install_dir : rootlibexecdir)
2023
2024 exe = executable('localectl',
2025 localectl_sources,
2026 include_directories : includes,
2027 link_with : [libshared],
2028 install_rpath : rootlibexecdir,
2029 install : true)
2030 public_programs += exe
2031 endif
2032
2033 if conf.get('ENABLE_TIMEDATED') == 1
2034 executable('systemd-timedated',
2035 'src/timedate/timedated.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 install_rpath : rootlibexecdir,
2039 install : true,
2040 install_dir : rootlibexecdir)
2041 endif
2042
2043 if conf.get('ENABLE_TIMEDATECTL') == 1
2044 exe = executable('timedatectl',
2045 'src/timedate/timedatectl.c',
2046 include_directories : includes,
2047 install_rpath : rootlibexecdir,
2048 link_with : [libshared],
2049 dependencies : [libm],
2050 install : true)
2051 public_programs += exe
2052 endif
2053
2054 if conf.get('ENABLE_TIMESYNCD') == 1
2055 executable('systemd-timesyncd',
2056 systemd_timesyncd_sources,
2057 include_directories : includes,
2058 link_with : [libshared],
2059 dependencies : [threads,
2060 libm],
2061 install_rpath : rootlibexecdir,
2062 install : true,
2063 install_dir : rootlibexecdir)
2064
2065 executable('systemd-time-wait-sync',
2066 'src/time-wait-sync/time-wait-sync.c',
2067 include_directories : includes,
2068 link_with : [libshared],
2069 install_rpath : rootlibexecdir,
2070 install : true,
2071 install_dir : rootlibexecdir)
2072 endif
2073
2074 if conf.get('ENABLE_MACHINED') == 1
2075 executable('systemd-machined',
2076 systemd_machined_sources,
2077 include_directories : includes,
2078 link_with : [libmachine_core,
2079 libshared],
2080 install_rpath : rootlibexecdir,
2081 install : true,
2082 install_dir : rootlibexecdir)
2083
2084 exe = executable('machinectl',
2085 'src/machine/machinectl.c',
2086 include_directories : includes,
2087 link_with : [libshared],
2088 dependencies : [threads,
2089 libxz,
2090 liblz4],
2091 install_rpath : rootlibexecdir,
2092 install : true,
2093 install_dir : rootbindir)
2094 public_programs += exe
2095 endif
2096
2097 if conf.get('ENABLE_IMPORTD') == 1
2098 executable('systemd-importd',
2099 systemd_importd_sources,
2100 include_directories : includes,
2101 link_with : [libshared],
2102 dependencies : [threads],
2103 install_rpath : rootlibexecdir,
2104 install : true,
2105 install_dir : rootlibexecdir)
2106
2107 systemd_pull = executable('systemd-pull',
2108 systemd_pull_sources,
2109 include_directories : includes,
2110 link_with : [libshared],
2111 dependencies : [libcurl,
2112 libz,
2113 libbzip2,
2114 libxz,
2115 libgcrypt],
2116 install_rpath : rootlibexecdir,
2117 install : true,
2118 install_dir : rootlibexecdir)
2119
2120 systemd_import = executable('systemd-import',
2121 systemd_import_sources,
2122 include_directories : includes,
2123 link_with : [libshared],
2124 dependencies : [libcurl,
2125 libz,
2126 libbzip2,
2127 libxz],
2128 install_rpath : rootlibexecdir,
2129 install : true,
2130 install_dir : rootlibexecdir)
2131
2132 systemd_export = executable('systemd-export',
2133 systemd_export_sources,
2134 include_directories : includes,
2135 link_with : [libshared],
2136 dependencies : [libcurl,
2137 libz,
2138 libbzip2,
2139 libxz],
2140 install_rpath : rootlibexecdir,
2141 install : true,
2142 install_dir : rootlibexecdir)
2143 public_programs += [systemd_pull, systemd_import, systemd_export]
2144 endif
2145
2146 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2147 exe = executable('systemd-journal-upload',
2148 systemd_journal_upload_sources,
2149 include_directories : includes,
2150 link_with : [libshared],
2151 dependencies : [threads,
2152 libcurl,
2153 libgnutls,
2154 libxz,
2155 liblz4],
2156 install_rpath : rootlibexecdir,
2157 install : true,
2158 install_dir : rootlibexecdir)
2159 public_programs += exe
2160 endif
2161
2162 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2163 s_j_remote = executable('systemd-journal-remote',
2164 systemd_journal_remote_sources,
2165 include_directories : includes,
2166 link_with : [libshared,
2167 libsystemd_journal_remote],
2168 dependencies : [threads,
2169 libmicrohttpd,
2170 libgnutls,
2171 libxz,
2172 liblz4],
2173 install_rpath : rootlibexecdir,
2174 install : true,
2175 install_dir : rootlibexecdir)
2176
2177 s_j_gatewayd = executable('systemd-journal-gatewayd',
2178 systemd_journal_gatewayd_sources,
2179 include_directories : includes,
2180 link_with : [libshared],
2181 dependencies : [threads,
2182 libmicrohttpd,
2183 libgnutls,
2184 libxz,
2185 liblz4],
2186 install_rpath : rootlibexecdir,
2187 install : true,
2188 install_dir : rootlibexecdir)
2189 public_programs += [s_j_remote, s_j_gatewayd]
2190 endif
2191
2192 if conf.get('ENABLE_COREDUMP') == 1
2193 executable('systemd-coredump',
2194 systemd_coredump_sources,
2195 include_directories : includes,
2196 link_with : [libshared],
2197 dependencies : [threads,
2198 libacl,
2199 libdw,
2200 libxz,
2201 liblz4],
2202 install_rpath : rootlibexecdir,
2203 install : true,
2204 install_dir : rootlibexecdir)
2205
2206 exe = executable('coredumpctl',
2207 coredumpctl_sources,
2208 include_directories : includes,
2209 link_with : [libshared],
2210 dependencies : [threads,
2211 libxz,
2212 liblz4],
2213 install_rpath : rootlibexecdir,
2214 install : true)
2215 public_programs += exe
2216 endif
2217
2218 if conf.get('ENABLE_BINFMT') == 1
2219 exe = executable('systemd-binfmt',
2220 'src/binfmt/binfmt.c',
2221 include_directories : includes,
2222 link_with : [libshared],
2223 install_rpath : rootlibexecdir,
2224 install : true,
2225 install_dir : rootlibexecdir)
2226 public_programs += exe
2227
2228 meson.add_install_script('sh', '-c',
2229 mkdir_p.format(binfmtdir))
2230 meson.add_install_script('sh', '-c',
2231 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2232 endif
2233
2234 if conf.get('ENABLE_VCONSOLE') == 1
2235 executable('systemd-vconsole-setup',
2236 'src/vconsole/vconsole-setup.c',
2237 include_directories : includes,
2238 link_with : [libshared],
2239 install_rpath : rootlibexecdir,
2240 install : true,
2241 install_dir : rootlibexecdir)
2242 endif
2243
2244 if conf.get('ENABLE_RANDOMSEED') == 1
2245 executable('systemd-random-seed',
2246 'src/random-seed/random-seed.c',
2247 include_directories : includes,
2248 link_with : [libshared],
2249 install_rpath : rootlibexecdir,
2250 install : true,
2251 install_dir : rootlibexecdir)
2252 endif
2253
2254 if conf.get('ENABLE_FIRSTBOOT') == 1
2255 executable('systemd-firstboot',
2256 'src/firstboot/firstboot.c',
2257 include_directories : includes,
2258 link_with : [libshared],
2259 dependencies : [libcrypt],
2260 install_rpath : rootlibexecdir,
2261 install : true,
2262 install_dir : rootbindir)
2263 endif
2264
2265 executable('systemd-remount-fs',
2266 'src/remount-fs/remount-fs.c',
2267 'src/core/mount-setup.c',
2268 'src/core/mount-setup.h',
2269 include_directories : includes,
2270 link_with : [libshared],
2271 install_rpath : rootlibexecdir,
2272 install : true,
2273 install_dir : rootlibexecdir)
2274
2275 executable('systemd-machine-id-setup',
2276 'src/machine-id-setup/machine-id-setup-main.c',
2277 'src/core/machine-id-setup.c',
2278 'src/core/machine-id-setup.h',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 install_rpath : rootlibexecdir,
2282 install : true,
2283 install_dir : rootbindir)
2284
2285 executable('systemd-fsck',
2286 'src/fsck/fsck.c',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2290 install : true,
2291 install_dir : rootlibexecdir)
2292
2293 executable('systemd-growfs',
2294 'src/partition/growfs.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 dependencies : [libcryptsetup],
2298 install_rpath : rootlibexecdir,
2299 install : true,
2300 install_dir : rootlibexecdir)
2301
2302 executable('systemd-makefs',
2303 'src/partition/makefs.c',
2304 include_directories : includes,
2305 link_with : [libshared],
2306 install_rpath : rootlibexecdir,
2307 install : true,
2308 install_dir : rootlibexecdir)
2309
2310 executable('systemd-sleep',
2311 'src/sleep/sleep.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2315 install : true,
2316 install_dir : rootlibexecdir)
2317
2318 exe = executable('systemd-sysctl',
2319 'src/sysctl/sysctl.c',
2320 include_directories : includes,
2321 link_with : [libshared],
2322 install_rpath : rootlibexecdir,
2323 install : true,
2324 install_dir : rootlibexecdir)
2325 public_programs += exe
2326
2327 executable('systemd-ac-power',
2328 'src/ac-power/ac-power.c',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 install_rpath : rootlibexecdir,
2332 install : true,
2333 install_dir : rootlibexecdir)
2334
2335 exe = executable('systemd-detect-virt',
2336 'src/detect-virt/detect-virt.c',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2340 install : true)
2341 public_programs += exe
2342
2343 exe = executable('systemd-delta',
2344 'src/delta/delta.c',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2348 install : true)
2349 public_programs += exe
2350
2351 exe = executable('systemd-escape',
2352 'src/escape/escape.c',
2353 include_directories : includes,
2354 link_with : [libshared],
2355 install_rpath : rootlibexecdir,
2356 install : true,
2357 install_dir : rootbindir)
2358 public_programs += exe
2359
2360 exe = executable('systemd-notify',
2361 'src/notify/notify.c',
2362 include_directories : includes,
2363 link_with : [libshared],
2364 install_rpath : rootlibexecdir,
2365 install : true,
2366 install_dir : rootbindir)
2367 public_programs += exe
2368
2369 executable('systemd-volatile-root',
2370 'src/volatile-root/volatile-root.c',
2371 include_directories : includes,
2372 link_with : [libshared],
2373 install_rpath : rootlibexecdir,
2374 install : true,
2375 install_dir : rootlibexecdir)
2376
2377 executable('systemd-cgroups-agent',
2378 'src/cgroups-agent/cgroups-agent.c',
2379 include_directories : includes,
2380 link_with : [libshared],
2381 install_rpath : rootlibexecdir,
2382 install : true,
2383 install_dir : rootlibexecdir)
2384
2385 exe = executable('systemd-id128',
2386 'src/id128/id128.c',
2387 include_directories : includes,
2388 link_with : [libshared],
2389 install_rpath : rootlibexecdir,
2390 install : true)
2391 public_programs += exe
2392
2393 exe = executable('systemd-path',
2394 'src/path/path.c',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2398 install : true)
2399 public_programs += exe
2400
2401 exe = executable('systemd-ask-password',
2402 'src/ask-password/ask-password.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 install_rpath : rootlibexecdir,
2406 install : true,
2407 install_dir : rootbindir)
2408 public_programs += exe
2409
2410 executable('systemd-reply-password',
2411 'src/reply-password/reply-password.c',
2412 include_directories : includes,
2413 link_with : [libshared],
2414 install_rpath : rootlibexecdir,
2415 install : true,
2416 install_dir : rootlibexecdir)
2417
2418 exe = executable('systemd-tty-ask-password-agent',
2419 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 install_rpath : rootlibexecdir,
2423 install : true,
2424 install_dir : rootbindir)
2425 public_programs += exe
2426
2427 exe = executable('systemd-cgls',
2428 'src/cgls/cgls.c',
2429 include_directories : includes,
2430 link_with : [libshared],
2431 install_rpath : rootlibexecdir,
2432 install : true)
2433 public_programs += exe
2434
2435 exe = executable('systemd-cgtop',
2436 'src/cgtop/cgtop.c',
2437 include_directories : includes,
2438 link_with : [libshared],
2439 install_rpath : rootlibexecdir,
2440 install : true)
2441 public_programs += exe
2442
2443 executable('systemd-initctl',
2444 'src/initctl/initctl.c',
2445 include_directories : includes,
2446 link_with : [libshared],
2447 install_rpath : rootlibexecdir,
2448 install : true,
2449 install_dir : rootlibexecdir)
2450
2451 exe = executable('systemd-mount',
2452 'src/mount/mount-tool.c',
2453 include_directories : includes,
2454 link_with : [libshared],
2455 install_rpath : rootlibexecdir,
2456 install : true)
2457 public_programs += exe
2458
2459 meson.add_install_script(meson_make_symlink,
2460 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2461
2462 exe = executable('systemd-run',
2463 'src/run/run.c',
2464 include_directories : includes,
2465 link_with : [libshared],
2466 install_rpath : rootlibexecdir,
2467 install : true)
2468 public_programs += exe
2469
2470 exe = executable('systemd-stdio-bridge',
2471 'src/stdio-bridge/stdio-bridge.c',
2472 include_directories : includes,
2473 link_with : [libshared],
2474 install_rpath : rootlibexecdir,
2475 install : true)
2476 public_programs += exe
2477
2478 exe = executable('busctl',
2479 'src/busctl/busctl.c',
2480 'src/busctl/busctl-introspect.c',
2481 'src/busctl/busctl-introspect.h',
2482 include_directories : includes,
2483 link_with : [libshared],
2484 install_rpath : rootlibexecdir,
2485 install : true)
2486 public_programs += exe
2487
2488 if conf.get('ENABLE_SYSUSERS') == 1
2489 exe = executable('systemd-sysusers',
2490 'src/sysusers/sysusers.c',
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2494 install : true,
2495 install_dir : rootbindir)
2496 public_programs += exe
2497 endif
2498
2499 if conf.get('ENABLE_TMPFILES') == 1
2500 exe = executable('systemd-tmpfiles',
2501 'src/tmpfiles/tmpfiles.c',
2502 include_directories : includes,
2503 link_with : [libshared],
2504 dependencies : [libacl],
2505 install_rpath : rootlibexecdir,
2506 install : true,
2507 install_dir : rootbindir)
2508 public_programs += exe
2509
2510 if want_tests != 'false'
2511 test('test-systemd-tmpfiles',
2512 test_systemd_tmpfiles_py,
2513 # https://github.com/mesonbuild/meson/issues/2681
2514 args : exe.full_path())
2515 endif
2516 endif
2517
2518 if conf.get('ENABLE_HWDB') == 1
2519 exe = executable('systemd-hwdb',
2520 'src/hwdb/hwdb.c',
2521 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2522 include_directories : includes,
2523 link_with : [libudev_static],
2524 install_rpath : udev_rpath,
2525 install : true,
2526 install_dir : rootbindir)
2527 public_programs += exe
2528 endif
2529
2530 if conf.get('ENABLE_QUOTACHECK') == 1
2531 executable('systemd-quotacheck',
2532 'src/quotacheck/quotacheck.c',
2533 include_directories : includes,
2534 link_with : [libshared],
2535 install_rpath : rootlibexecdir,
2536 install : true,
2537 install_dir : rootlibexecdir)
2538 endif
2539
2540 exe = executable('systemd-socket-proxyd',
2541 'src/socket-proxy/socket-proxyd.c',
2542 include_directories : includes,
2543 link_with : [libshared],
2544 dependencies : [threads],
2545 install_rpath : rootlibexecdir,
2546 install : true,
2547 install_dir : rootlibexecdir)
2548 public_programs += exe
2549
2550 exe = executable('systemd-udevd',
2551 systemd_udevd_sources,
2552 include_directories : includes,
2553 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2554 link_with : [libudev_core,
2555 libsystemd_network,
2556 libudev_static],
2557 dependencies : [threads,
2558 libkmod,
2559 libidn,
2560 libacl,
2561 libblkid],
2562 install_rpath : udev_rpath,
2563 install : true,
2564 install_dir : rootlibexecdir)
2565 public_programs += exe
2566
2567 exe = executable('udevadm',
2568 udevadm_sources,
2569 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2570 include_directories : includes,
2571 link_with : [libudev_core,
2572 libsystemd_network,
2573 libudev_static],
2574 dependencies : [threads,
2575 libkmod,
2576 libidn,
2577 libacl,
2578 libblkid],
2579 install_rpath : udev_rpath,
2580 install : true,
2581 install_dir : rootbindir)
2582 public_programs += exe
2583
2584 executable('systemd-shutdown',
2585 systemd_shutdown_sources,
2586 include_directories : includes,
2587 link_with : [libshared],
2588 dependencies : [libmount],
2589 install_rpath : rootlibexecdir,
2590 install : true,
2591 install_dir : rootlibexecdir)
2592
2593 executable('systemd-update-done',
2594 'src/update-done/update-done.c',
2595 include_directories : includes,
2596 link_with : [libshared],
2597 install_rpath : rootlibexecdir,
2598 install : true,
2599 install_dir : rootlibexecdir)
2600
2601 executable('systemd-update-utmp',
2602 'src/update-utmp/update-utmp.c',
2603 include_directories : includes,
2604 link_with : [libshared],
2605 dependencies : [libaudit],
2606 install_rpath : rootlibexecdir,
2607 install : true,
2608 install_dir : rootlibexecdir)
2609
2610 if conf.get('HAVE_KMOD') == 1
2611 executable('systemd-modules-load',
2612 'src/modules-load/modules-load.c',
2613 include_directories : includes,
2614 link_with : [libshared],
2615 dependencies : [libkmod],
2616 install_rpath : rootlibexecdir,
2617 install : true,
2618 install_dir : rootlibexecdir)
2619
2620 meson.add_install_script('sh', '-c',
2621 mkdir_p.format(modulesloaddir))
2622 meson.add_install_script('sh', '-c',
2623 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2624 endif
2625
2626 exe = executable('systemd-nspawn',
2627 systemd_nspawn_sources,
2628 'src/core/mount-setup.c', # FIXME: use a variable?
2629 'src/core/mount-setup.h',
2630 'src/core/loopback-setup.c',
2631 'src/core/loopback-setup.h',
2632 include_directories : includes,
2633 link_with : [libnspawn_core,
2634 libshared],
2635 dependencies : [libblkid],
2636 install_rpath : rootlibexecdir,
2637 install : true)
2638 public_programs += exe
2639
2640 if conf.get('ENABLE_NETWORKD') == 1
2641 executable('systemd-networkd',
2642 systemd_networkd_sources,
2643 include_directories : includes,
2644 link_with : [libnetworkd_core,
2645 libsystemd_network,
2646 libudev_static,
2647 libshared],
2648 dependencies : [threads],
2649 install_rpath : rootlibexecdir,
2650 install : true,
2651 install_dir : rootlibexecdir)
2652
2653 executable('systemd-networkd-wait-online',
2654 systemd_networkd_wait_online_sources,
2655 include_directories : includes,
2656 link_with : [libnetworkd_core,
2657 libshared],
2658 install_rpath : rootlibexecdir,
2659 install : true,
2660 install_dir : rootlibexecdir)
2661
2662 exe = executable('networkctl',
2663 networkctl_sources,
2664 include_directories : includes,
2665 link_with : [libsystemd_network,
2666 libshared],
2667 install_rpath : rootlibexecdir,
2668 install : true,
2669 install_dir : rootbindir)
2670 public_programs += exe
2671 endif
2672
2673 executable('systemd-sulogin-shell',
2674 ['src/sulogin-shell/sulogin-shell.c'],
2675 include_directories : includes,
2676 link_with : [libshared],
2677 install_rpath : rootlibexecdir,
2678 install : true,
2679 install_dir : rootlibexecdir)
2680
2681 ############################################################
2682
2683 custom_target(
2684 'systemd-runtest.env',
2685 output : 'systemd-runtest.env',
2686 command : ['sh', '-c', '{ ' +
2687 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2688 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2689 '} >@OUTPUT@'],
2690 build_by_default : true)
2691
2692 foreach tuple : tests
2693 sources = tuple[0]
2694 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2695 dependencies = tuple[2]
2696 condition = tuple.length() >= 4 ? tuple[3] : ''
2697 type = tuple.length() >= 5 ? tuple[4] : ''
2698 defs = tuple.length() >= 6 ? tuple[5] : []
2699 incs = tuple.length() >= 7 ? tuple[6] : includes
2700 timeout = 30
2701
2702 name = sources[0].split('/')[-1].split('.')[0]
2703 if type.startswith('timeout=')
2704 timeout = type.split('=')[1].to_int()
2705 type = ''
2706 endif
2707
2708 if condition == '' or conf.get(condition) == 1
2709 exe = executable(
2710 name,
2711 sources,
2712 include_directories : incs,
2713 link_with : link_with,
2714 dependencies : dependencies,
2715 c_args : defs,
2716 build_by_default : want_tests != 'false',
2717 install_rpath : rootlibexecdir,
2718 install : install_tests,
2719 install_dir : join_paths(testsdir, type))
2720
2721 if type == 'manual'
2722 message('@0@ is a manual test'.format(name))
2723 elif type == 'unsafe' and want_tests != 'unsafe'
2724 message('@0@ is an unsafe test'.format(name))
2725 elif want_tests != 'false'
2726 test(name, exe,
2727 env : test_env,
2728 timeout : timeout)
2729 endif
2730 else
2731 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2732 endif
2733 endforeach
2734
2735 exe = executable(
2736 'test-libsystemd-sym',
2737 test_libsystemd_sym_c,
2738 include_directories : includes,
2739 link_with : [libsystemd],
2740 build_by_default : want_tests != 'false',
2741 install : install_tests,
2742 install_dir : testsdir)
2743 if want_tests != 'false'
2744 test('test-libsystemd-sym', exe)
2745 endif
2746
2747 exe = executable(
2748 'test-libsystemd-static-sym',
2749 test_libsystemd_sym_c,
2750 include_directories : includes,
2751 link_with : [install_libsystemd_static],
2752 dependencies : [threads], # threads is already included in dependencies on the library,
2753 # but does not seem to get propagated. Add here as a work-around.
2754 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2755 install : install_tests and static_libsystemd_pic,
2756 install_dir : testsdir)
2757 if want_tests != 'false' and static_libsystemd_pic
2758 test('test-libsystemd-static-sym', exe)
2759 endif
2760
2761 exe = executable(
2762 'test-libudev-sym',
2763 test_libudev_sym_c,
2764 include_directories : includes,
2765 c_args : '-Wno-deprecated-declarations',
2766 link_with : [libudev],
2767 build_by_default : want_tests != 'false',
2768 install : install_tests,
2769 install_dir : testsdir)
2770 if want_tests != 'false'
2771 test('test-libudev-sym', exe)
2772 endif
2773
2774 exe = executable(
2775 'test-libudev-static-sym',
2776 test_libudev_sym_c,
2777 include_directories : includes,
2778 c_args : '-Wno-deprecated-declarations',
2779 link_with : [install_libudev_static],
2780 build_by_default : want_tests != 'false' and static_libudev_pic,
2781 install : install_tests and static_libudev_pic,
2782 install_dir : testsdir)
2783 if want_tests != 'false' and static_libudev_pic
2784 test('test-libudev-static-sym', exe)
2785 endif
2786
2787 ############################################################
2788
2789 fuzzer_exes = []
2790
2791 if get_option('tests') != 'false'
2792 foreach tuple : fuzzers
2793 sources = tuple[0]
2794 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2795 dependencies = tuple[2]
2796 defs = tuple.length() >= 4 ? tuple[3] : []
2797 incs = tuple.length() >= 5 ? tuple[4] : includes
2798
2799 if fuzzer_build
2800 dependencies += fuzzing_engine
2801 else
2802 sources += 'src/fuzz/fuzz-main.c'
2803 endif
2804
2805 name = sources[0].split('/')[-1].split('.')[0]
2806
2807 fuzzer_exes += executable(
2808 name,
2809 sources,
2810 include_directories : [incs, include_directories('src/fuzz')],
2811 link_with : link_with,
2812 dependencies : dependencies,
2813 c_args : defs,
2814 install : false)
2815 endforeach
2816 endif
2817
2818 run_target('fuzzers',
2819 depends : fuzzer_exes,
2820 command : ['true'])
2821
2822 ############################################################
2823
2824 make_directive_index_py = find_program('tools/make-directive-index.py')
2825 make_man_index_py = find_program('tools/make-man-index.py')
2826 xml_helper_py = find_program('tools/xml_helper.py')
2827 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2828
2829 subdir('units')
2830 subdir('sysctl.d')
2831 subdir('sysusers.d')
2832 subdir('tmpfiles.d')
2833 subdir('presets')
2834 subdir('hwdb')
2835 subdir('network')
2836 subdir('man')
2837 subdir('shell-completion/bash')
2838 subdir('shell-completion/zsh')
2839 subdir('docs/sysvinit')
2840 subdir('docs/var-log')
2841
2842 install_subdir('factory/etc',
2843 install_dir : factorydir)
2844
2845 install_data('xorg/50-systemd-user.sh',
2846 install_dir : xinitrcdir)
2847 install_data('modprobe.d/systemd.conf',
2848 install_dir : modprobedir)
2849 install_data('LICENSE.GPL2',
2850 'LICENSE.LGPL2.1',
2851 'NEWS',
2852 'README',
2853 'docs/CODING_STYLE.md',
2854 'docs/DISTRO_PORTING.md',
2855 'docs/ENVIRONMENT.md',
2856 'docs/HACKING.md',
2857 'docs/TRANSIENT-SETTINGS.md',
2858 'docs/TRANSLATORS.md',
2859 'docs/UIDS-GIDS.md',
2860 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2861 install_dir : docdir)
2862
2863 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2864 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2865
2866 ############################################################
2867
2868 meson_check_help = find_program('tools/meson-check-help.sh')
2869
2870 foreach exec : public_programs
2871 name = exec.full_path().split('/')[-1]
2872 if want_tests != 'false'
2873 test('check-help-' + name,
2874 meson_check_help,
2875 args : exec.full_path())
2876 endif
2877 endforeach
2878
2879 ############################################################
2880
2881 # Enable tests for all supported sanitizers
2882 foreach tuple : sanitizers
2883 sanitizer = tuple[0]
2884 build = tuple[1]
2885
2886 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2887 prev = ''
2888 foreach p : fuzz_regression_tests
2889 b = p.split('/')[-2]
2890 c = p.split('/')[-1]
2891
2892 name = '@0@:@1@'.format(b, sanitizer)
2893
2894 if name != prev
2895 if want_tests == 'false'
2896 message('Not compiling @0@ because tests is set to false'.format(name))
2897 elif slow_tests
2898 exe = custom_target(
2899 name,
2900 output : name,
2901 depends : build,
2902 command : [env, 'ln', '-fs',
2903 join_paths(build.full_path(), b),
2904 '@OUTPUT@'],
2905 build_by_default : true)
2906 else
2907 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2908 endif
2909 endif
2910 prev = name
2911
2912 if want_tests != 'false' and slow_tests
2913 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2914 env,
2915 args : [exe.full_path(),
2916 join_paths(meson.source_root(), p)])
2917 endif
2918 endforeach
2919 endif
2920 endforeach
2921
2922
2923 ############################################################
2924
2925 if git.found()
2926 all_files = run_command(
2927 git,
2928 ['--git-dir=@0@/.git'.format(meson.source_root()),
2929 'ls-files',
2930 ':/*.[ch]'])
2931 all_files = files(all_files.stdout().split())
2932
2933 custom_target(
2934 'tags',
2935 output : 'tags',
2936 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2937 run_target(
2938 'ctags',
2939 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2940 endif
2941
2942 if git.found()
2943 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2944 run_target(
2945 'git-contrib',
2946 command : [meson_git_contrib_sh])
2947 endif
2948
2949 if git.found()
2950 git_head = run_command(
2951 git,
2952 ['--git-dir=@0@/.git'.format(meson.source_root()),
2953 'rev-parse', 'HEAD']).stdout().strip()
2954 git_head_short = run_command(
2955 git,
2956 ['--git-dir=@0@/.git'.format(meson.source_root()),
2957 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2958
2959 run_target(
2960 'git-snapshot',
2961 command : ['git', 'archive',
2962 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2963 git_head_short),
2964 '--prefix', 'systemd-@0@/'.format(git_head),
2965 'HEAD'])
2966 endif
2967
2968 ############################################################
2969
2970 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2971 run_target(
2972 'check-api-docs',
2973 depends : [man, libsystemd, libudev],
2974 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2975
2976 run_target(
2977 'make-index-md',
2978 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2979
2980 ############################################################
2981
2982 status = [
2983 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2984
2985 'split /usr: @0@'.format(split_usr),
2986 'split bin-sbin: @0@'.format(split_bin),
2987 'prefix directory: @0@'.format(prefixdir),
2988 'rootprefix directory: @0@'.format(rootprefixdir),
2989 'sysconf directory: @0@'.format(sysconfdir),
2990 'include directory: @0@'.format(includedir),
2991 'lib directory: @0@'.format(libdir),
2992 'rootlib directory: @0@'.format(rootlibdir),
2993 'SysV init scripts: @0@'.format(sysvinit_path),
2994 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2995 'PAM modules directory: @0@'.format(pamlibdir),
2996 'PAM configuration directory: @0@'.format(pamconfdir),
2997 'RPM macros directory: @0@'.format(rpmmacrosdir),
2998 'modprobe.d directory: @0@'.format(modprobedir),
2999 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3000 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3001 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3002 'bash completions directory: @0@'.format(bashcompletiondir),
3003 'zsh completions directory: @0@'.format(zshcompletiondir),
3004 'extra start script: @0@'.format(get_option('rc-local')),
3005 'extra stop script: @0@'.format(get_option('halt-local')),
3006 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3007 get_option('debug-tty')),
3008 'TTY GID: @0@'.format(tty_gid),
3009 'users GID: @0@'.format(substs.get('USERS_GID')),
3010 'maximum system UID: @0@'.format(system_uid_max),
3011 'maximum system GID: @0@'.format(system_gid_max),
3012 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3013 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3014 'minimum container UID base: @0@'.format(container_uid_base_min),
3015 'maximum container UID base: @0@'.format(container_uid_base_max),
3016 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3017 'render group access mode: @0@'.format(get_option('group-render-mode')),
3018 'certificate root directory: @0@'.format(get_option('certificate-root')),
3019 'support URL: @0@'.format(support_url),
3020 'nobody user name: @0@'.format(nobody_user),
3021 'nobody group name: @0@'.format(nobody_group),
3022 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3023 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3024
3025 'default DNSSEC mode: @0@'.format(default_dnssec),
3026 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3027 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3028 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3029
3030 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3031 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3032 status += [
3033 'default DNS servers: @0@'.format(alt_dns_servers),
3034 'default NTP servers: @0@'.format(alt_ntp_servers)]
3035
3036 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3037 '@@0@'.format(time_epoch)).stdout().strip()
3038 status += [
3039 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3040
3041 status += [
3042 'static libsystemd: @0@'.format(static_libsystemd),
3043 'static libudev: @0@'.format(static_libudev)]
3044
3045 # TODO:
3046 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3047 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3048 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3049
3050 if conf.get('ENABLE_EFI') == 1
3051 status += 'efi arch: @0@'.format(efi_arch)
3052
3053 if have_gnu_efi
3054 status += [
3055 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3056 'EFI CC @0@'.format(efi_cc),
3057 'EFI lib directory: @0@'.format(efi_libdir),
3058 'EFI lds directory: @0@'.format(efi_ldsdir),
3059 'EFI include directory: @0@'.format(efi_incdir)]
3060 endif
3061 endif
3062
3063 found = []
3064 missing = []
3065
3066 foreach tuple : [
3067 ['libcryptsetup'],
3068 ['PAM'],
3069 ['AUDIT'],
3070 ['IMA'],
3071 ['AppArmor'],
3072 ['SELinux'],
3073 ['SECCOMP'],
3074 ['SMACK'],
3075 ['zlib'],
3076 ['xz'],
3077 ['lz4'],
3078 ['bzip2'],
3079 ['ACL'],
3080 ['gcrypt'],
3081 ['qrencode'],
3082 ['microhttpd'],
3083 ['gnutls'],
3084 ['openssl'],
3085 ['libcurl'],
3086 ['idn'],
3087 ['libidn2'],
3088 ['libidn'],
3089 ['libiptc'],
3090 ['elfutils'],
3091 ['binfmt'],
3092 ['vconsole'],
3093 ['quotacheck'],
3094 ['tmpfiles'],
3095 ['environment.d'],
3096 ['sysusers'],
3097 ['firstboot'],
3098 ['randomseed'],
3099 ['backlight'],
3100 ['rfkill'],
3101 ['logind'],
3102 ['machined'],
3103 ['portabled'],
3104 ['importd'],
3105 ['hostnamed'],
3106 ['timedated'],
3107 ['timesyncd'],
3108 ['localed'],
3109 ['networkd'],
3110 ['resolve'],
3111 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3112 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3113 ['coredump'],
3114 ['polkit'],
3115 ['legacy pkla', install_polkit_pkla],
3116 ['efi'],
3117 ['gnu-efi', have_gnu_efi],
3118 ['kmod'],
3119 ['xkbcommon'],
3120 ['pcre2'],
3121 ['blkid'],
3122 ['dbus'],
3123 ['glib'],
3124 ['nss-myhostname'],
3125 ['nss-mymachines'],
3126 ['nss-resolve'],
3127 ['nss-systemd'],
3128 ['hwdb'],
3129 ['tpm'],
3130 ['man pages', want_man],
3131 ['html pages', want_html],
3132 ['man page indices', want_man and have_lxml],
3133 ['SysV compat'],
3134 ['utmp'],
3135 ['ldconfig'],
3136 ['hibernate'],
3137 ['adm group', get_option('adm-group')],
3138 ['wheel group', get_option('wheel-group')],
3139 ['gshadow'],
3140 ['debug hashmap'],
3141 ['debug mmap cache'],
3142 ['debug siphash'],
3143 ['debug udev'],
3144 ['valgrind', conf.get('VALGRIND') == 1],
3145 ['trace logging', conf.get('LOG_TRACE') == 1],
3146 ['link-udev-shared', get_option('link-udev-shared')],
3147 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3148 ]
3149
3150 if tuple.length() >= 2
3151 cond = tuple[1]
3152 else
3153 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3154 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3155 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3156 endif
3157 if cond
3158 found += tuple[0]
3159 else
3160 missing += tuple[0]
3161 endif
3162 endforeach
3163
3164 status += [
3165 '',
3166 'enabled features: @0@'.format(', '.join(found)),
3167 '',
3168 'disabled features: @0@'.format(', '.join(missing)),
3169 '']
3170 message('\n '.join(status))
3171
3172 if rootprefixdir != rootprefix_default
3173 warning('\n' +
3174 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3175 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3176 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3177 endif