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