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