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