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