]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
Merge pull request #8817 from yuwata/cleanup-nsflags
[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
142 docdir = get_option('docdir')
143 if docdir == ''
144 docdir = join_paths(datadir, 'doc/systemd')
145 endif
146
147 dbuspolicydir = get_option('dbuspolicydir')
148 if dbuspolicydir == ''
149 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
150 endif
151
152 dbussessionservicedir = get_option('dbussessionservicedir')
153 if dbussessionservicedir == ''
154 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
155 endif
156
157 dbussystemservicedir = get_option('dbussystemservicedir')
158 if dbussystemservicedir == ''
159 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
160 endif
161
162 pamlibdir = get_option('pamlibdir')
163 if pamlibdir == ''
164 pamlibdir = join_paths(rootlibdir, 'security')
165 endif
166
167 pamconfdir = get_option('pamconfdir')
168 if pamconfdir == ''
169 pamconfdir = join_paths(sysconfdir, 'pam.d')
170 endif
171
172 memory_accounting_default = get_option('memory-accounting-default')
173
174 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
175 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
176 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
177 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
178 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
179 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
180 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
181
182 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
183
184 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
185 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
186 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
187 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
188 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
189 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
190 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
191 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
192 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
193 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
194 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
195 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
196 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
197 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
198 conf.set_quoted('ROOTPREFIX', rootprefixdir)
199 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
200 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
201 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
202 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
203 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
204 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
205 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
206 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
207 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
208 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
209 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
210 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
211 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
212 conf.set_quoted('LIBDIR', libdir)
213 conf.set_quoted('ROOTLIBDIR', rootlibdir)
214 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
215 conf.set_quoted('BOOTLIBDIR', bootlibdir)
216 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
217 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
218 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
219 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
220 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
221 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
222 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
223 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
224
225 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
226 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
227
228 substs.set('prefix', prefixdir)
229 substs.set('exec_prefix', prefixdir)
230 substs.set('libdir', libdir)
231 substs.set('rootlibdir', rootlibdir)
232 substs.set('includedir', includedir)
233 substs.set('pkgsysconfdir', pkgsysconfdir)
234 substs.set('bindir', bindir)
235 substs.set('rootbindir', rootbindir)
236 substs.set('rootlibexecdir', rootlibexecdir)
237 substs.set('systemunitdir', systemunitdir)
238 substs.set('userunitdir', userunitdir)
239 substs.set('systempresetdir', systempresetdir)
240 substs.set('userpresetdir', userpresetdir)
241 substs.set('udevhwdbdir', udevhwdbdir)
242 substs.set('udevrulesdir', udevrulesdir)
243 substs.set('udevlibexecdir', udevlibexecdir)
244 substs.set('environmentdir', environmentdir)
245 substs.set('catalogdir', catalogdir)
246 substs.set('tmpfilesdir', tmpfilesdir)
247 substs.set('sysusersdir', sysusersdir)
248 substs.set('sysctldir', sysctldir)
249 substs.set('binfmtdir', binfmtdir)
250 substs.set('modulesloaddir', modulesloaddir)
251 substs.set('modprobedir', modprobedir)
252 substs.set('systemgeneratordir', systemgeneratordir)
253 substs.set('usergeneratordir', usergeneratordir)
254 substs.set('systemenvgeneratordir', systemenvgeneratordir)
255 substs.set('userenvgeneratordir', userenvgeneratordir)
256 substs.set('systemshutdowndir', systemshutdowndir)
257 substs.set('systemsleepdir', systemsleepdir)
258 substs.set('VARLOGDIR', varlogdir)
259 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
260 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
261 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
262 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
263 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
264 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
265 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
266 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
267
268 #####################################################################
269
270 cc = meson.get_compiler('c')
271 pkgconfig = import('pkgconfig')
272 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
273 meson_build_sh = find_program('tools/meson-build.sh')
274
275 if get_option('tests') != 'false'
276 cxx = find_program('c++', required : false)
277 if cxx.found()
278 # Used only for tests
279 add_languages('cpp')
280 endif
281 endif
282
283 want_ossfuzz = get_option('oss-fuzz')
284 want_libfuzzer = get_option('llvm-fuzz')
285 fuzzer_build = want_ossfuzz or want_libfuzzer
286 if want_ossfuzz and want_libfuzzer
287 error('only one of oss-fuzz and llvm-fuzz can be specified')
288 endif
289 if want_libfuzzer
290 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
291 endif
292 if want_ossfuzz
293 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
294 endif
295
296 possible_cc_flags = [
297 '-Wextra',
298 '-Werror=undef',
299 '-Wlogical-op',
300 '-Wmissing-include-dirs',
301 '-Wold-style-definition',
302 '-Wpointer-arith',
303 '-Winit-self',
304 '-Wdeclaration-after-statement',
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 warnings. 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 'networkd',
1181 'timedated',
1182 'timesyncd',
1183 'myhostname',
1184 'firstboot',
1185 'randomseed',
1186 'backlight',
1187 'vconsole',
1188 'quotacheck',
1189 'sysusers',
1190 'tmpfiles',
1191 'hwdb',
1192 'rfkill',
1193 'ldconfig',
1194 'efi',
1195 'tpm',
1196 'ima',
1197 'smack',
1198 'gshadow',
1199 'idn',
1200 'nss-systemd']
1201 have = get_option(term)
1202 name = 'ENABLE_' + term.underscorify().to_upper()
1203 conf.set10(name, have)
1204 endforeach
1205
1206 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1207
1208 want_tests = get_option('tests')
1209 install_tests = get_option('install-tests')
1210 slow_tests = get_option('slow-tests')
1211 tests = []
1212 fuzzers = []
1213
1214 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1215
1216 #####################################################################
1217
1218 if get_option('efi')
1219 efi_arch = host_machine.cpu_family()
1220
1221 if efi_arch == 'x86'
1222 EFI_MACHINE_TYPE_NAME = 'ia32'
1223 gnu_efi_arch = 'ia32'
1224 elif efi_arch == 'x86_64'
1225 EFI_MACHINE_TYPE_NAME = 'x64'
1226 gnu_efi_arch = 'x86_64'
1227 elif efi_arch == 'arm'
1228 EFI_MACHINE_TYPE_NAME = 'arm'
1229 gnu_efi_arch = 'arm'
1230 elif efi_arch == 'aarch64'
1231 EFI_MACHINE_TYPE_NAME = 'aa64'
1232 gnu_efi_arch = 'aarch64'
1233 else
1234 EFI_MACHINE_TYPE_NAME = ''
1235 gnu_efi_arch = ''
1236 endif
1237
1238 have = true
1239 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1240
1241 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1242 else
1243 have = false
1244 endif
1245 conf.set10('ENABLE_EFI', have)
1246
1247 #####################################################################
1248
1249 config_h = configure_file(
1250 output : 'config.h',
1251 configuration : conf)
1252
1253 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1254
1255 includes = include_directories('src/basic',
1256 'src/shared',
1257 'src/systemd',
1258 'src/journal',
1259 'src/resolve',
1260 'src/timesync',
1261 'src/time-wait-sync',
1262 'src/login',
1263 'src/udev',
1264 'src/libudev',
1265 'src/core',
1266 'src/libsystemd/sd-bus',
1267 'src/libsystemd/sd-device',
1268 'src/libsystemd/sd-hwdb',
1269 'src/libsystemd/sd-id128',
1270 'src/libsystemd/sd-netlink',
1271 'src/libsystemd/sd-network',
1272 'src/libsystemd-network',
1273 '.')
1274
1275 add_project_arguments('-include', 'config.h', language : 'c')
1276
1277 subdir('po')
1278 subdir('catalog')
1279 subdir('src/systemd')
1280 subdir('src/basic')
1281 subdir('src/libsystemd')
1282 subdir('src/libsystemd-network')
1283 subdir('src/journal')
1284 subdir('src/login')
1285
1286 libjournal_core = static_library(
1287 'journal-core',
1288 libjournal_core_sources,
1289 journald_gperf_c,
1290 include_directories : includes,
1291 install : false)
1292
1293 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1294 libsystemd = shared_library(
1295 'systemd',
1296 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1297 version : libsystemd_version,
1298 include_directories : includes,
1299 link_args : ['-shared',
1300 '-Wl,--version-script=' + libsystemd_sym_path],
1301 link_with : [libbasic,
1302 libbasic_gcrypt],
1303 link_whole : [libsystemd_static,
1304 libjournal_client],
1305 dependencies : [threads,
1306 librt,
1307 libxz,
1308 liblz4],
1309 link_depends : libsystemd_sym,
1310 install : true,
1311 install_dir : rootlibdir)
1312
1313 static_libsystemd = get_option('static-libsystemd')
1314 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1315
1316 install_libsystemd_static = static_library(
1317 'systemd',
1318 libsystemd_sources,
1319 journal_client_sources,
1320 basic_sources,
1321 basic_gcrypt_sources,
1322 include_directories : includes,
1323 build_by_default : static_libsystemd != 'false',
1324 install : static_libsystemd != 'false',
1325 install_dir : rootlibdir,
1326 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1327 dependencies : [threads,
1328 librt,
1329 libxz,
1330 liblz4,
1331 libcap,
1332 libblkid,
1333 libmount,
1334 libselinux,
1335 libgcrypt],
1336 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1337
1338 ############################################################
1339
1340 # binaries that have --help and are intended for use by humans,
1341 # usually, but not always, installed in /bin.
1342 public_programs = []
1343
1344 subdir('src/libudev')
1345 subdir('src/shared')
1346 subdir('src/core')
1347 subdir('src/udev')
1348 subdir('src/network')
1349
1350 subdir('src/analyze')
1351 subdir('src/journal-remote')
1352 subdir('src/coredump')
1353 subdir('src/hostname')
1354 subdir('src/import')
1355 subdir('src/kernel-install')
1356 subdir('src/locale')
1357 subdir('src/machine')
1358 subdir('src/nspawn')
1359 subdir('src/resolve')
1360 subdir('src/timedate')
1361 subdir('src/timesync')
1362 subdir('src/vconsole')
1363 subdir('src/boot/efi')
1364
1365 subdir('src/test')
1366 subdir('src/fuzz')
1367 subdir('rules')
1368 subdir('test')
1369
1370 ############################################################
1371
1372 # only static linking apart from libdl, to make sure that the
1373 # module is linked to all libraries that it uses.
1374 test_dlopen = executable(
1375 'test-dlopen',
1376 test_dlopen_c,
1377 include_directories : includes,
1378 link_with : [libbasic],
1379 dependencies : [libdl])
1380
1381 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1382 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1383 ['mymachines', 'ENABLE_MACHINED'],
1384 ['resolve', 'ENABLE_RESOLVE']]
1385
1386 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1387 if condition
1388 module = tuple[0]
1389
1390 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1391 version_script_arg = join_paths(meson.current_source_dir(), sym)
1392
1393 nss = shared_library(
1394 'nss_' + module,
1395 'src/nss-@0@/nss-@0@.c'.format(module),
1396 version : '2',
1397 include_directories : includes,
1398 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1399 link_args : ['-Wl,-z,nodelete',
1400 '-shared',
1401 '-Wl,--version-script=' + version_script_arg,
1402 '-Wl,--undefined'],
1403 link_with : [libsystemd_static,
1404 libbasic],
1405 dependencies : [threads,
1406 librt],
1407 link_depends : sym,
1408 install : true,
1409 install_dir : rootlibdir)
1410
1411 # We cannot use shared_module because it does not support version suffix.
1412 # Unfortunately shared_library insists on creating the symlink…
1413 meson.add_install_script('sh', '-c',
1414 'rm $DESTDIR@0@/libnss_@1@.so'
1415 .format(rootlibdir, module))
1416
1417 test('dlopen-nss_' + module,
1418 test_dlopen,
1419 args : [nss.full_path()]) # path to dlopen must include a slash
1420 endif
1421 endforeach
1422
1423 ############################################################
1424
1425 executable('systemd',
1426 systemd_sources,
1427 include_directories : includes,
1428 link_with : [libcore,
1429 libshared],
1430 dependencies : [threads,
1431 librt,
1432 libseccomp,
1433 libselinux,
1434 libmount,
1435 libblkid],
1436 install_rpath : rootlibexecdir,
1437 install : true,
1438 install_dir : rootlibexecdir)
1439
1440 meson.add_install_script(meson_make_symlink,
1441 join_paths(rootlibexecdir, 'systemd'),
1442 join_paths(rootsbindir, 'init'))
1443
1444 exe = executable('systemd-analyze',
1445 systemd_analyze_sources,
1446 include_directories : includes,
1447 link_with : [libcore,
1448 libshared],
1449 dependencies : [threads,
1450 librt,
1451 libseccomp,
1452 libselinux,
1453 libmount,
1454 libblkid],
1455 install_rpath : rootlibexecdir,
1456 install : true)
1457 public_programs += [exe]
1458
1459 executable('systemd-journald',
1460 systemd_journald_sources,
1461 include_directories : includes,
1462 link_with : [libjournal_core,
1463 libshared],
1464 dependencies : [threads,
1465 libxz,
1466 liblz4,
1467 libselinux],
1468 install_rpath : rootlibexecdir,
1469 install : true,
1470 install_dir : rootlibexecdir)
1471
1472 exe = executable('systemd-cat',
1473 systemd_cat_sources,
1474 include_directories : includes,
1475 link_with : [libjournal_core,
1476 libshared],
1477 dependencies : [threads],
1478 install_rpath : rootlibexecdir,
1479 install : true)
1480 public_programs += [exe]
1481
1482 exe = executable('journalctl',
1483 journalctl_sources,
1484 include_directories : includes,
1485 link_with : [libshared],
1486 dependencies : [threads,
1487 libqrencode,
1488 libxz,
1489 liblz4,
1490 libpcre2],
1491 install_rpath : rootlibexecdir,
1492 install : true,
1493 install_dir : rootbindir)
1494 public_programs += [exe]
1495
1496 executable('systemd-getty-generator',
1497 'src/getty-generator/getty-generator.c',
1498 include_directories : includes,
1499 link_with : [libshared],
1500 install_rpath : rootlibexecdir,
1501 install : true,
1502 install_dir : systemgeneratordir)
1503
1504 executable('systemd-debug-generator',
1505 'src/debug-generator/debug-generator.c',
1506 include_directories : includes,
1507 link_with : [libshared],
1508 install_rpath : rootlibexecdir,
1509 install : true,
1510 install_dir : systemgeneratordir)
1511
1512 executable('systemd-fstab-generator',
1513 'src/fstab-generator/fstab-generator.c',
1514 'src/core/mount-setup.c',
1515 include_directories : includes,
1516 link_with : [libshared],
1517 install_rpath : rootlibexecdir,
1518 install : true,
1519 install_dir : systemgeneratordir)
1520
1521 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1522 executable('30-systemd-environment-d-generator',
1523 'src/environment-d-generator/environment-d-generator.c',
1524 include_directories : includes,
1525 link_with : [libshared],
1526 install_rpath : rootlibexecdir,
1527 install : true,
1528 install_dir : userenvgeneratordir)
1529
1530 meson.add_install_script(meson_make_symlink,
1531 join_paths(sysconfdir, 'environment'),
1532 join_paths(environmentdir, '99-environment.conf'))
1533 endif
1534
1535 if conf.get('ENABLE_HIBERNATE') == 1
1536 executable('systemd-hibernate-resume-generator',
1537 'src/hibernate-resume/hibernate-resume-generator.c',
1538 include_directories : includes,
1539 link_with : [libshared],
1540 install_rpath : rootlibexecdir,
1541 install : true,
1542 install_dir : systemgeneratordir)
1543
1544 executable('systemd-hibernate-resume',
1545 'src/hibernate-resume/hibernate-resume.c',
1546 include_directories : includes,
1547 link_with : [libshared],
1548 install_rpath : rootlibexecdir,
1549 install : true,
1550 install_dir : rootlibexecdir)
1551 endif
1552
1553 if conf.get('HAVE_BLKID') == 1
1554 executable('systemd-gpt-auto-generator',
1555 'src/gpt-auto-generator/gpt-auto-generator.c',
1556 'src/basic/blkid-util.h',
1557 include_directories : includes,
1558 link_with : [libshared],
1559 dependencies : libblkid,
1560 install_rpath : rootlibexecdir,
1561 install : true,
1562 install_dir : systemgeneratordir)
1563
1564 exe = executable('systemd-dissect',
1565 'src/dissect/dissect.c',
1566 include_directories : includes,
1567 link_with : [libshared],
1568 install_rpath : rootlibexecdir,
1569 install : true,
1570 install_dir : rootlibexecdir)
1571 public_programs += [exe]
1572 endif
1573
1574 if conf.get('ENABLE_RESOLVE') == 1
1575 executable('systemd-resolved',
1576 systemd_resolved_sources,
1577 include_directories : includes,
1578 link_with : [libshared,
1579 libbasic_gcrypt,
1580 libsystemd_resolve_core],
1581 dependencies : [threads,
1582 libgpg_error,
1583 libm,
1584 libidn],
1585 install_rpath : rootlibexecdir,
1586 install : true,
1587 install_dir : rootlibexecdir)
1588
1589 exe = executable('resolvectl',
1590 resolvectl_sources,
1591 include_directories : includes,
1592 link_with : [libshared,
1593 libbasic_gcrypt,
1594 libsystemd_resolve_core],
1595 dependencies : [threads,
1596 libgpg_error,
1597 libm,
1598 libidn],
1599 install_rpath : rootlibexecdir,
1600 install : true)
1601 public_programs += [exe]
1602
1603 meson.add_install_script(meson_make_symlink,
1604 join_paths(bindir, 'resolvectl'),
1605 join_paths(rootsbindir, 'resolvconf'))
1606
1607 meson.add_install_script(meson_make_symlink,
1608 join_paths(bindir, 'resolvectl'),
1609 join_paths(bindir, 'systemd-resolve'))
1610 endif
1611
1612 if conf.get('ENABLE_LOGIND') == 1
1613 executable('systemd-logind',
1614 systemd_logind_sources,
1615 include_directories : includes,
1616 link_with : [liblogind_core,
1617 libshared],
1618 dependencies : [threads,
1619 libacl],
1620 install_rpath : rootlibexecdir,
1621 install : true,
1622 install_dir : rootlibexecdir)
1623
1624 exe = executable('loginctl',
1625 loginctl_sources,
1626 include_directories : includes,
1627 link_with : [libshared],
1628 dependencies : [threads,
1629 liblz4,
1630 libxz],
1631 install_rpath : rootlibexecdir,
1632 install : true,
1633 install_dir : rootbindir)
1634 public_programs += [exe]
1635
1636 exe = executable('systemd-inhibit',
1637 'src/login/inhibit.c',
1638 include_directories : includes,
1639 link_with : [libshared],
1640 install_rpath : rootlibexecdir,
1641 install : true,
1642 install_dir : rootbindir)
1643 public_programs += [exe]
1644
1645 if conf.get('HAVE_PAM') == 1
1646 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1647 pam_systemd = shared_library(
1648 'pam_systemd',
1649 pam_systemd_c,
1650 name_prefix : '',
1651 include_directories : includes,
1652 link_args : ['-shared',
1653 '-Wl,--version-script=' + version_script_arg],
1654 link_with : [libsystemd_static,
1655 libshared_static],
1656 dependencies : [threads,
1657 libpam,
1658 libpam_misc],
1659 link_depends : pam_systemd_sym,
1660 install : true,
1661 install_dir : pamlibdir)
1662
1663 test('dlopen-pam_systemd',
1664 test_dlopen,
1665 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1666 endif
1667 endif
1668
1669 executable('systemd-user-runtime-dir',
1670 user_runtime_dir_sources,
1671 include_directories : includes,
1672 link_with : [libshared, liblogind_core],
1673 install_rpath : rootlibexecdir,
1674 install : true,
1675 install_dir : rootlibexecdir)
1676
1677 if conf.get('HAVE_PAM') == 1
1678 executable('systemd-user-sessions',
1679 'src/user-sessions/user-sessions.c',
1680 include_directories : includes,
1681 link_with : [libshared],
1682 install_rpath : rootlibexecdir,
1683 install : true,
1684 install_dir : rootlibexecdir)
1685 endif
1686
1687 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1688 exe = executable('bootctl',
1689 'src/boot/bootctl.c',
1690 include_directories : includes,
1691 link_with : [libshared],
1692 dependencies : [libblkid],
1693 install_rpath : rootlibexecdir,
1694 install : true)
1695 public_programs += [exe]
1696 endif
1697
1698 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1699 include_directories : includes,
1700 link_with : [libshared],
1701 dependencies : [threads],
1702 install_rpath : rootlibexecdir,
1703 install : true)
1704 public_programs += [exe]
1705
1706 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 dependencies : [threads,
1710 libcap,
1711 libselinux,
1712 libxz,
1713 liblz4],
1714 install_rpath : rootlibexecdir,
1715 install : true,
1716 install_dir : rootbindir)
1717 public_programs += [exe]
1718
1719 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1720 meson.add_install_script(meson_make_symlink,
1721 join_paths(rootbindir, 'systemctl'),
1722 join_paths(rootsbindir, alias))
1723 endforeach
1724
1725 if conf.get('ENABLE_BACKLIGHT') == 1
1726 executable('systemd-backlight',
1727 'src/backlight/backlight.c',
1728 include_directories : includes,
1729 link_with : [libshared],
1730 install_rpath : rootlibexecdir,
1731 install : true,
1732 install_dir : rootlibexecdir)
1733 endif
1734
1735 if conf.get('ENABLE_RFKILL') == 1
1736 executable('systemd-rfkill',
1737 'src/rfkill/rfkill.c',
1738 include_directories : includes,
1739 link_with : [libshared],
1740 install_rpath : rootlibexecdir,
1741 install : true,
1742 install_dir : rootlibexecdir)
1743 endif
1744
1745 executable('systemd-system-update-generator',
1746 'src/system-update-generator/system-update-generator.c',
1747 include_directories : includes,
1748 link_with : [libshared],
1749 install_rpath : rootlibexecdir,
1750 install : true,
1751 install_dir : systemgeneratordir)
1752
1753 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1754 executable('systemd-cryptsetup',
1755 'src/cryptsetup/cryptsetup.c',
1756 include_directories : includes,
1757 link_with : [libshared],
1758 dependencies : [libcryptsetup],
1759 install_rpath : rootlibexecdir,
1760 install : true,
1761 install_dir : rootlibexecdir)
1762
1763 executable('systemd-cryptsetup-generator',
1764 'src/cryptsetup/cryptsetup-generator.c',
1765 include_directories : includes,
1766 link_with : [libshared],
1767 dependencies : [libcryptsetup],
1768 install_rpath : rootlibexecdir,
1769 install : true,
1770 install_dir : systemgeneratordir)
1771
1772 executable('systemd-veritysetup',
1773 'src/veritysetup/veritysetup.c',
1774 include_directories : includes,
1775 link_with : [libshared],
1776 dependencies : [libcryptsetup],
1777 install_rpath : rootlibexecdir,
1778 install : true,
1779 install_dir : rootlibexecdir)
1780
1781 executable('systemd-veritysetup-generator',
1782 'src/veritysetup/veritysetup-generator.c',
1783 include_directories : includes,
1784 link_with : [libshared],
1785 dependencies : [libcryptsetup],
1786 install_rpath : rootlibexecdir,
1787 install : true,
1788 install_dir : systemgeneratordir)
1789 endif
1790
1791 if conf.get('HAVE_SYSV_COMPAT') == 1
1792 executable('systemd-sysv-generator',
1793 'src/sysv-generator/sysv-generator.c',
1794 include_directories : includes,
1795 link_with : [libshared],
1796 install_rpath : rootlibexecdir,
1797 install : true,
1798 install_dir : systemgeneratordir)
1799
1800 executable('systemd-rc-local-generator',
1801 'src/rc-local-generator/rc-local-generator.c',
1802 include_directories : includes,
1803 link_with : [libshared],
1804 install_rpath : rootlibexecdir,
1805 install : true,
1806 install_dir : systemgeneratordir)
1807 endif
1808
1809 if conf.get('ENABLE_HOSTNAMED') == 1
1810 executable('systemd-hostnamed',
1811 'src/hostname/hostnamed.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 install_rpath : rootlibexecdir,
1815 install : true,
1816 install_dir : rootlibexecdir)
1817
1818 exe = executable('hostnamectl',
1819 'src/hostname/hostnamectl.c',
1820 include_directories : includes,
1821 link_with : [libshared],
1822 install_rpath : rootlibexecdir,
1823 install : true)
1824 public_programs += [exe]
1825 endif
1826
1827 if conf.get('ENABLE_LOCALED') == 1
1828 if conf.get('HAVE_XKBCOMMON') == 1
1829 # logind will load libxkbcommon.so dynamically on its own
1830 deps = [libdl]
1831 else
1832 deps = []
1833 endif
1834
1835 executable('systemd-localed',
1836 systemd_localed_sources,
1837 include_directories : includes,
1838 link_with : [libshared],
1839 dependencies : deps,
1840 install_rpath : rootlibexecdir,
1841 install : true,
1842 install_dir : rootlibexecdir)
1843
1844 exe = executable('localectl',
1845 localectl_sources,
1846 include_directories : includes,
1847 link_with : [libshared],
1848 install_rpath : rootlibexecdir,
1849 install : true)
1850 public_programs += [exe]
1851 endif
1852
1853 if conf.get('ENABLE_TIMEDATED') == 1
1854 executable('systemd-timedated',
1855 'src/timedate/timedated.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1859 install : true,
1860 install_dir : rootlibexecdir)
1861 endif
1862
1863 if conf.get('ENABLE_TIMEDATECTL') == 1
1864 exe = executable('timedatectl',
1865 'src/timedate/timedatectl.c',
1866 include_directories : includes,
1867 install_rpath : rootlibexecdir,
1868 link_with : [libshared],
1869 dependencies : [libm],
1870 install : true)
1871 public_programs += [exe]
1872 endif
1873
1874 if conf.get('ENABLE_TIMESYNCD') == 1
1875 executable('systemd-timesyncd',
1876 systemd_timesyncd_sources,
1877 include_directories : includes,
1878 link_with : [libshared],
1879 dependencies : [threads,
1880 libm],
1881 install_rpath : rootlibexecdir,
1882 install : true,
1883 install_dir : rootlibexecdir)
1884
1885 executable('systemd-time-wait-sync',
1886 'src/time-wait-sync/time-wait-sync.c',
1887 include_directories : includes,
1888 link_with : [libshared],
1889 install_rpath : rootlibexecdir,
1890 install : true,
1891 install_dir : rootlibexecdir)
1892 endif
1893
1894 if conf.get('ENABLE_MACHINED') == 1
1895 executable('systemd-machined',
1896 systemd_machined_sources,
1897 include_directories : includes,
1898 link_with : [libmachine_core,
1899 libshared],
1900 install_rpath : rootlibexecdir,
1901 install : true,
1902 install_dir : rootlibexecdir)
1903
1904 exe = executable('machinectl',
1905 'src/machine/machinectl.c',
1906 include_directories : includes,
1907 link_with : [libshared],
1908 dependencies : [threads,
1909 libxz,
1910 liblz4],
1911 install_rpath : rootlibexecdir,
1912 install : true,
1913 install_dir : rootbindir)
1914 public_programs += [exe]
1915 endif
1916
1917 if conf.get('ENABLE_IMPORTD') == 1
1918 executable('systemd-importd',
1919 systemd_importd_sources,
1920 include_directories : includes,
1921 link_with : [libshared],
1922 dependencies : [threads],
1923 install_rpath : rootlibexecdir,
1924 install : true,
1925 install_dir : rootlibexecdir)
1926
1927 systemd_pull = executable('systemd-pull',
1928 systemd_pull_sources,
1929 include_directories : includes,
1930 link_with : [libshared],
1931 dependencies : [libcurl,
1932 libz,
1933 libbzip2,
1934 libxz,
1935 libgcrypt],
1936 install_rpath : rootlibexecdir,
1937 install : true,
1938 install_dir : rootlibexecdir)
1939
1940 systemd_import = executable('systemd-import',
1941 systemd_import_sources,
1942 include_directories : includes,
1943 link_with : [libshared],
1944 dependencies : [libcurl,
1945 libz,
1946 libbzip2,
1947 libxz],
1948 install_rpath : rootlibexecdir,
1949 install : true,
1950 install_dir : rootlibexecdir)
1951
1952 systemd_export = executable('systemd-export',
1953 systemd_export_sources,
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [libcurl,
1957 libz,
1958 libbzip2,
1959 libxz],
1960 install_rpath : rootlibexecdir,
1961 install : true,
1962 install_dir : rootlibexecdir)
1963 public_programs += [systemd_pull, systemd_import, systemd_export]
1964 endif
1965
1966 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1967 exe = executable('systemd-journal-upload',
1968 systemd_journal_upload_sources,
1969 include_directories : includes,
1970 link_with : [libshared],
1971 dependencies : [threads,
1972 libcurl,
1973 libgnutls,
1974 libxz,
1975 liblz4],
1976 install_rpath : rootlibexecdir,
1977 install : true,
1978 install_dir : rootlibexecdir)
1979 public_programs += [exe]
1980 endif
1981
1982 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1983 s_j_remote = executable('systemd-journal-remote',
1984 systemd_journal_remote_sources,
1985 include_directories : includes,
1986 link_with : [libshared],
1987 dependencies : [threads,
1988 libmicrohttpd,
1989 libgnutls,
1990 libxz,
1991 liblz4],
1992 install_rpath : rootlibexecdir,
1993 install : true,
1994 install_dir : rootlibexecdir)
1995
1996 s_j_gatewayd = executable('systemd-journal-gatewayd',
1997 systemd_journal_gatewayd_sources,
1998 include_directories : includes,
1999 link_with : [libshared],
2000 dependencies : [threads,
2001 libmicrohttpd,
2002 libgnutls,
2003 libxz,
2004 liblz4],
2005 install_rpath : rootlibexecdir,
2006 install : true,
2007 install_dir : rootlibexecdir)
2008 public_programs += [s_j_remote, s_j_gatewayd]
2009 endif
2010
2011 if conf.get('ENABLE_COREDUMP') == 1
2012 executable('systemd-coredump',
2013 systemd_coredump_sources,
2014 include_directories : includes,
2015 link_with : [libshared],
2016 dependencies : [threads,
2017 libacl,
2018 libdw,
2019 libxz,
2020 liblz4],
2021 install_rpath : rootlibexecdir,
2022 install : true,
2023 install_dir : rootlibexecdir)
2024
2025 exe = executable('coredumpctl',
2026 coredumpctl_sources,
2027 include_directories : includes,
2028 link_with : [libshared],
2029 dependencies : [threads,
2030 libxz,
2031 liblz4],
2032 install_rpath : rootlibexecdir,
2033 install : true)
2034 public_programs += [exe]
2035 endif
2036
2037 if conf.get('ENABLE_BINFMT') == 1
2038 exe = executable('systemd-binfmt',
2039 'src/binfmt/binfmt.c',
2040 include_directories : includes,
2041 link_with : [libshared],
2042 install_rpath : rootlibexecdir,
2043 install : true,
2044 install_dir : rootlibexecdir)
2045 public_programs += [exe]
2046
2047 meson.add_install_script('sh', '-c',
2048 mkdir_p.format(binfmtdir))
2049 meson.add_install_script('sh', '-c',
2050 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2051 endif
2052
2053 if conf.get('ENABLE_VCONSOLE') == 1
2054 executable('systemd-vconsole-setup',
2055 'src/vconsole/vconsole-setup.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2059 install : true,
2060 install_dir : rootlibexecdir)
2061 endif
2062
2063 if conf.get('ENABLE_RANDOMSEED') == 1
2064 executable('systemd-random-seed',
2065 'src/random-seed/random-seed.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 install_rpath : rootlibexecdir,
2069 install : true,
2070 install_dir : rootlibexecdir)
2071 endif
2072
2073 if conf.get('ENABLE_FIRSTBOOT') == 1
2074 executable('systemd-firstboot',
2075 'src/firstboot/firstboot.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : [libcrypt],
2079 install_rpath : rootlibexecdir,
2080 install : true,
2081 install_dir : rootbindir)
2082 endif
2083
2084 executable('systemd-remount-fs',
2085 'src/remount-fs/remount-fs.c',
2086 'src/core/mount-setup.c',
2087 'src/core/mount-setup.h',
2088 include_directories : includes,
2089 link_with : [libshared],
2090 install_rpath : rootlibexecdir,
2091 install : true,
2092 install_dir : rootlibexecdir)
2093
2094 executable('systemd-machine-id-setup',
2095 'src/machine-id-setup/machine-id-setup-main.c',
2096 'src/core/machine-id-setup.c',
2097 'src/core/machine-id-setup.h',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2101 install : true,
2102 install_dir : rootbindir)
2103
2104 executable('systemd-fsck',
2105 'src/fsck/fsck.c',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 install_rpath : rootlibexecdir,
2109 install : true,
2110 install_dir : rootlibexecdir)
2111
2112 executable('systemd-growfs',
2113 'src/partition/growfs.c',
2114 include_directories : includes,
2115 link_with : [libshared],
2116 dependencies : [libcryptsetup],
2117 install_rpath : rootlibexecdir,
2118 install : true,
2119 install_dir : rootlibexecdir)
2120
2121 executable('systemd-makefs',
2122 'src/partition/makefs.c',
2123 include_directories : includes,
2124 link_with : [libshared],
2125 install_rpath : rootlibexecdir,
2126 install : true,
2127 install_dir : rootlibexecdir)
2128
2129 executable('systemd-sleep',
2130 'src/sleep/sleep.c',
2131 include_directories : includes,
2132 link_with : [libshared],
2133 install_rpath : rootlibexecdir,
2134 install : true,
2135 install_dir : rootlibexecdir)
2136
2137 exe = executable('systemd-sysctl',
2138 'src/sysctl/sysctl.c',
2139 include_directories : includes,
2140 link_with : [libshared],
2141 install_rpath : rootlibexecdir,
2142 install : true,
2143 install_dir : rootlibexecdir)
2144 public_programs += [exe]
2145
2146 executable('systemd-ac-power',
2147 'src/ac-power/ac-power.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2151 install : true,
2152 install_dir : rootlibexecdir)
2153
2154 exe = executable('systemd-detect-virt',
2155 'src/detect-virt/detect-virt.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2159 install : true)
2160 public_programs += [exe]
2161
2162 exe = executable('systemd-delta',
2163 'src/delta/delta.c',
2164 include_directories : includes,
2165 link_with : [libshared],
2166 install_rpath : rootlibexecdir,
2167 install : true)
2168 public_programs += [exe]
2169
2170 exe = executable('systemd-escape',
2171 'src/escape/escape.c',
2172 include_directories : includes,
2173 link_with : [libshared],
2174 install_rpath : rootlibexecdir,
2175 install : true,
2176 install_dir : rootbindir)
2177 public_programs += [exe]
2178
2179 exe = executable('systemd-notify',
2180 'src/notify/notify.c',
2181 include_directories : includes,
2182 link_with : [libshared],
2183 install_rpath : rootlibexecdir,
2184 install : true,
2185 install_dir : rootbindir)
2186 public_programs += [exe]
2187
2188 executable('systemd-volatile-root',
2189 'src/volatile-root/volatile-root.c',
2190 include_directories : includes,
2191 link_with : [libshared],
2192 install_rpath : rootlibexecdir,
2193 install : true,
2194 install_dir : rootlibexecdir)
2195
2196 executable('systemd-cgroups-agent',
2197 'src/cgroups-agent/cgroups-agent.c',
2198 include_directories : includes,
2199 link_with : [libshared],
2200 install_rpath : rootlibexecdir,
2201 install : true,
2202 install_dir : rootlibexecdir)
2203
2204 exe = executable('systemd-path',
2205 'src/path/path.c',
2206 include_directories : includes,
2207 link_with : [libshared],
2208 install_rpath : rootlibexecdir,
2209 install : true)
2210 public_programs += [exe]
2211
2212 exe = executable('systemd-ask-password',
2213 'src/ask-password/ask-password.c',
2214 include_directories : includes,
2215 link_with : [libshared],
2216 install_rpath : rootlibexecdir,
2217 install : true,
2218 install_dir : rootbindir)
2219 public_programs += [exe]
2220
2221 executable('systemd-reply-password',
2222 'src/reply-password/reply-password.c',
2223 include_directories : includes,
2224 link_with : [libshared],
2225 install_rpath : rootlibexecdir,
2226 install : true,
2227 install_dir : rootlibexecdir)
2228
2229 exe = executable('systemd-tty-ask-password-agent',
2230 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2231 include_directories : includes,
2232 link_with : [libshared],
2233 install_rpath : rootlibexecdir,
2234 install : true,
2235 install_dir : rootbindir)
2236 public_programs += [exe]
2237
2238 exe = executable('systemd-cgls',
2239 'src/cgls/cgls.c',
2240 include_directories : includes,
2241 link_with : [libshared],
2242 install_rpath : rootlibexecdir,
2243 install : true)
2244 public_programs += [exe]
2245
2246 exe = executable('systemd-cgtop',
2247 'src/cgtop/cgtop.c',
2248 include_directories : includes,
2249 link_with : [libshared],
2250 install_rpath : rootlibexecdir,
2251 install : true)
2252 public_programs += [exe]
2253
2254 executable('systemd-initctl',
2255 'src/initctl/initctl.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 install_rpath : rootlibexecdir,
2259 install : true,
2260 install_dir : rootlibexecdir)
2261
2262 exe = executable('systemd-mount',
2263 'src/mount/mount-tool.c',
2264 include_directories : includes,
2265 link_with : [libshared],
2266 install_rpath : rootlibexecdir,
2267 install : true)
2268 public_programs += [exe]
2269
2270 meson.add_install_script(meson_make_symlink,
2271 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2272
2273 exe = executable('systemd-run',
2274 'src/run/run.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-stdio-bridge',
2282 'src/stdio-bridge/stdio-bridge.c',
2283 include_directories : includes,
2284 link_with : [libshared],
2285 install_rpath : rootlibexecdir,
2286 install : true)
2287 public_programs += [exe]
2288
2289 exe = executable('busctl',
2290 'src/busctl/busctl.c',
2291 'src/busctl/busctl-introspect.c',
2292 'src/busctl/busctl-introspect.h',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2296 install : true)
2297 public_programs += [exe]
2298
2299 if conf.get('ENABLE_SYSUSERS') == 1
2300 exe = executable('systemd-sysusers',
2301 'src/sysusers/sysusers.c',
2302 include_directories : includes,
2303 link_with : [libshared],
2304 install_rpath : rootlibexecdir,
2305 install : true,
2306 install_dir : rootbindir)
2307 public_programs += [exe]
2308 endif
2309
2310 if conf.get('ENABLE_TMPFILES') == 1
2311 exe = executable('systemd-tmpfiles',
2312 'src/tmpfiles/tmpfiles.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 dependencies : [libacl],
2316 install_rpath : rootlibexecdir,
2317 install : true,
2318 install_dir : rootbindir)
2319 public_programs += [exe]
2320
2321 test('test-systemd-tmpfiles',
2322 test_systemd_tmpfiles_py,
2323 args : exe.full_path())
2324 # https://github.com/mesonbuild/meson/issues/2681
2325 endif
2326
2327 if conf.get('ENABLE_HWDB') == 1
2328 exe = executable('systemd-hwdb',
2329 'src/hwdb/hwdb.c',
2330 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2331 include_directories : includes,
2332 link_with : [libudev_static],
2333 install_rpath : udev_rpath,
2334 install : true,
2335 install_dir : rootbindir)
2336 public_programs += [exe]
2337 endif
2338
2339 if conf.get('ENABLE_QUOTACHECK') == 1
2340 executable('systemd-quotacheck',
2341 'src/quotacheck/quotacheck.c',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2345 install : true,
2346 install_dir : rootlibexecdir)
2347 endif
2348
2349 exe = executable('systemd-socket-proxyd',
2350 'src/socket-proxy/socket-proxyd.c',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 dependencies : [threads],
2354 install_rpath : rootlibexecdir,
2355 install : true,
2356 install_dir : rootlibexecdir)
2357 public_programs += [exe]
2358
2359 exe = executable('systemd-udevd',
2360 systemd_udevd_sources,
2361 include_directories : includes,
2362 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2363 link_with : [libudev_core,
2364 libsystemd_network,
2365 libudev_static],
2366 dependencies : [threads,
2367 libkmod,
2368 libidn,
2369 libacl,
2370 libblkid],
2371 install_rpath : udev_rpath,
2372 install : true,
2373 install_dir : rootlibexecdir)
2374 public_programs += [exe]
2375
2376 exe = executable('udevadm',
2377 udevadm_sources,
2378 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2379 include_directories : includes,
2380 link_with : [libudev_core,
2381 libsystemd_network,
2382 libudev_static],
2383 dependencies : [threads,
2384 libkmod,
2385 libidn,
2386 libacl,
2387 libblkid],
2388 install_rpath : udev_rpath,
2389 install : true,
2390 install_dir : rootbindir)
2391 public_programs += [exe]
2392
2393 executable('systemd-shutdown',
2394 systemd_shutdown_sources,
2395 include_directories : includes,
2396 link_with : [libshared],
2397 dependencies : [libmount],
2398 install_rpath : rootlibexecdir,
2399 install : true,
2400 install_dir : rootlibexecdir)
2401
2402 executable('systemd-update-done',
2403 'src/update-done/update-done.c',
2404 include_directories : includes,
2405 link_with : [libshared],
2406 install_rpath : rootlibexecdir,
2407 install : true,
2408 install_dir : rootlibexecdir)
2409
2410 executable('systemd-update-utmp',
2411 'src/update-utmp/update-utmp.c',
2412 include_directories : includes,
2413 link_with : [libshared],
2414 dependencies : [libaudit],
2415 install_rpath : rootlibexecdir,
2416 install : true,
2417 install_dir : rootlibexecdir)
2418
2419 if conf.get('HAVE_KMOD') == 1
2420 executable('systemd-modules-load',
2421 'src/modules-load/modules-load.c',
2422 include_directories : includes,
2423 link_with : [libshared],
2424 dependencies : [libkmod],
2425 install_rpath : rootlibexecdir,
2426 install : true,
2427 install_dir : rootlibexecdir)
2428
2429 meson.add_install_script('sh', '-c',
2430 mkdir_p.format(modulesloaddir))
2431 meson.add_install_script('sh', '-c',
2432 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2433 endif
2434
2435 exe = executable('systemd-nspawn',
2436 systemd_nspawn_sources,
2437 'src/core/mount-setup.c', # FIXME: use a variable?
2438 'src/core/mount-setup.h',
2439 'src/core/loopback-setup.c',
2440 'src/core/loopback-setup.h',
2441 include_directories : [includes, include_directories('src/nspawn')],
2442 link_with : [libshared],
2443 dependencies : [libacl,
2444 libblkid,
2445 libseccomp,
2446 libselinux],
2447 install_rpath : rootlibexecdir,
2448 install : true)
2449 public_programs += [exe]
2450
2451 if conf.get('ENABLE_NETWORKD') == 1
2452 executable('systemd-networkd',
2453 systemd_networkd_sources,
2454 include_directories : includes,
2455 link_with : [libnetworkd_core,
2456 libsystemd_network,
2457 libudev_static,
2458 libshared],
2459 dependencies : [threads],
2460 install_rpath : rootlibexecdir,
2461 install : true,
2462 install_dir : rootlibexecdir)
2463
2464 executable('systemd-networkd-wait-online',
2465 systemd_networkd_wait_online_sources,
2466 include_directories : includes,
2467 link_with : [libnetworkd_core,
2468 libshared],
2469 install_rpath : rootlibexecdir,
2470 install : true,
2471 install_dir : rootlibexecdir)
2472
2473 exe = executable('networkctl',
2474 networkctl_sources,
2475 include_directories : includes,
2476 link_with : [libsystemd_network,
2477 libshared],
2478 install_rpath : rootlibexecdir,
2479 install : true,
2480 install_dir : rootbindir)
2481 public_programs += [exe]
2482 endif
2483
2484 executable('systemd-sulogin-shell',
2485 ['src/sulogin-shell/sulogin-shell.c'],
2486 include_directories : includes,
2487 link_with : [libshared],
2488 install_rpath : rootlibexecdir,
2489 install : true,
2490 install_dir : rootlibexecdir)
2491
2492 ############################################################
2493
2494 foreach tuple : tests
2495 sources = tuple[0]
2496 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2497 dependencies = tuple[2]
2498 condition = tuple.length() >= 4 ? tuple[3] : ''
2499 type = tuple.length() >= 5 ? tuple[4] : ''
2500 defs = tuple.length() >= 6 ? tuple[5] : []
2501 incs = tuple.length() >= 7 ? tuple[6] : includes
2502 timeout = 30
2503
2504 name = sources[0].split('/')[-1].split('.')[0]
2505 if type.startswith('timeout=')
2506 timeout = type.split('=')[1].to_int()
2507 type = ''
2508 endif
2509 if want_tests == 'false'
2510 message('Not compiling @0@ because tests is set to false'.format(name))
2511 elif condition == '' or conf.get(condition) == 1
2512 exe = executable(
2513 name,
2514 sources,
2515 include_directories : incs,
2516 link_with : link_with,
2517 dependencies : dependencies,
2518 c_args : defs,
2519 install_rpath : rootlibexecdir,
2520 install : install_tests,
2521 install_dir : join_paths(testsdir, type))
2522
2523 if type == 'manual'
2524 message('@0@ is a manual test'.format(name))
2525 elif type == 'unsafe' and want_tests != 'unsafe'
2526 message('@0@ is an unsafe test'.format(name))
2527 else
2528 test(name, exe,
2529 env : test_env,
2530 timeout : timeout)
2531 endif
2532 else
2533 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2534 endif
2535 endforeach
2536
2537 exe = executable(
2538 'test-libsystemd-sym',
2539 test_libsystemd_sym_c,
2540 include_directories : includes,
2541 link_with : [libsystemd],
2542 install : install_tests,
2543 install_dir : testsdir)
2544 test('test-libsystemd-sym', exe)
2545
2546 exe = executable(
2547 'test-libsystemd-static-sym',
2548 test_libsystemd_sym_c,
2549 include_directories : includes,
2550 link_with : [install_libsystemd_static],
2551 dependencies : [threads], # threads is already included in dependencies on the library,
2552 # but does not seem to get propagated. Add here as a work-around.
2553 build_by_default : static_libsystemd_pic,
2554 install : install_tests and static_libsystemd_pic,
2555 install_dir : testsdir)
2556 if static_libsystemd_pic
2557 test('test-libsystemd-static-sym', exe)
2558 endif
2559
2560 exe = executable(
2561 'test-libudev-sym',
2562 test_libudev_sym_c,
2563 include_directories : includes,
2564 c_args : ['-Wno-deprecated-declarations'],
2565 link_with : [libudev],
2566 install : install_tests,
2567 install_dir : testsdir)
2568 test('test-libudev-sym', exe)
2569
2570 exe = executable(
2571 'test-libudev-static-sym',
2572 test_libudev_sym_c,
2573 include_directories : includes,
2574 c_args : ['-Wno-deprecated-declarations'],
2575 link_with : [install_libudev_static],
2576 build_by_default : static_libudev_pic,
2577 install : install_tests and static_libudev_pic,
2578 install_dir : testsdir)
2579 if static_libudev_pic
2580 test('test-libudev-static-sym', exe)
2581 endif
2582
2583 ############################################################
2584
2585 fuzzer_exes = []
2586
2587 foreach tuple : fuzzers
2588 sources = tuple[0]
2589 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2590 dependencies = tuple[2]
2591 defs = tuple.length() >= 4 ? tuple[3] : []
2592 incs = tuple.length() >= 5 ? tuple[4] : includes
2593
2594 if fuzzer_build
2595 dependencies += fuzzing_engine
2596 else
2597 sources += 'src/fuzz/fuzz-main.c'
2598 endif
2599
2600 name = sources[0].split('/')[-1].split('.')[0]
2601
2602 fuzzer_exes += executable(
2603 name,
2604 sources,
2605 include_directories : [incs, include_directories('src/fuzz')],
2606 link_with : link_with,
2607 dependencies : dependencies,
2608 c_args : defs,
2609 install : false)
2610 endforeach
2611
2612 run_target('fuzzers',
2613 depends : fuzzer_exes,
2614 command : ['true'])
2615
2616 ############################################################
2617
2618 make_directive_index_py = find_program('tools/make-directive-index.py')
2619 make_man_index_py = find_program('tools/make-man-index.py')
2620 xml_helper_py = find_program('tools/xml_helper.py')
2621 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2622
2623 subdir('units')
2624 subdir('sysctl.d')
2625 subdir('sysusers.d')
2626 subdir('tmpfiles.d')
2627 subdir('presets')
2628 subdir('hwdb')
2629 subdir('network')
2630 subdir('man')
2631 subdir('shell-completion/bash')
2632 subdir('shell-completion/zsh')
2633 subdir('doc/sysvinit')
2634 subdir('doc/var-log')
2635
2636 # FIXME: figure out if the warning is true:
2637 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2638 install_subdir('factory/etc',
2639 install_dir : factorydir)
2640
2641
2642 install_data('xorg/50-systemd-user.sh',
2643 install_dir : xinitrcdir)
2644 install_data('modprobe.d/systemd.conf',
2645 install_dir : modprobedir)
2646 install_data('LICENSE.GPL2',
2647 'LICENSE.LGPL2.1',
2648 'NEWS',
2649 'README',
2650 'doc/CODING_STYLE',
2651 'doc/DISTRO_PORTING',
2652 'doc/ENVIRONMENT.md',
2653 'doc/HACKING',
2654 'doc/TRANSIENT-SETTINGS.md',
2655 'doc/TRANSLATORS',
2656 'doc/UIDS-GIDS.md',
2657 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2658 install_dir : docdir)
2659
2660 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2661 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2662
2663 ############################################################
2664
2665 meson_check_help = find_program('tools/meson-check-help.sh')
2666
2667 foreach exec : public_programs
2668 name = exec.full_path().split('/')[-1]
2669 test('check-help-' + name,
2670 meson_check_help,
2671 args : [exec.full_path()])
2672 endforeach
2673
2674 ############################################################
2675
2676 # Enable tests for all supported sanitizers
2677 foreach tuple : sanitizers
2678 sanitizer = tuple[0]
2679 build = tuple[1]
2680
2681 have = run_command(check_compilation_sh,
2682 cc.cmd_array(), '-x', 'c',
2683 '-fsanitize=@0@'.format(sanitizer),
2684 '-include', link_test_c).returncode() == 0
2685 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2686
2687 if have
2688 prev = ''
2689 foreach p : fuzz_regression_tests
2690 b = p.split('/')[-2]
2691 c = p.split('/')[-1]
2692
2693 name = '@0@:@1@'.format(b, sanitizer)
2694
2695 if name != prev
2696 if want_tests == 'false'
2697 message('Not compiling @0@ because tests is set to false'.format(name))
2698 elif slow_tests
2699 exe = custom_target(
2700 name,
2701 output : name,
2702 depends : build,
2703 command : [env, 'ln', '-fs',
2704 join_paths(build.full_path(), b),
2705 '@OUTPUT@'],
2706 build_by_default : true)
2707 else
2708 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2709 endif
2710 endif
2711 prev = name
2712
2713 if want_tests != 'false' and slow_tests
2714 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2715 env,
2716 args : [exe.full_path(),
2717 join_paths(meson.source_root(),
2718 'test/fuzz-regressions',
2719 p)])
2720 endif
2721 endforeach
2722 endif
2723 endforeach
2724
2725
2726 ############################################################
2727
2728 if git.found()
2729 all_files = run_command(
2730 git,
2731 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2732 'ls-files',
2733 ':/*.[ch]'])
2734 all_files = files(all_files.stdout().split())
2735
2736 custom_target(
2737 'tags',
2738 output : 'tags',
2739 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2740 run_target(
2741 'ctags',
2742 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2743 endif
2744
2745 if git.found()
2746 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2747 run_target(
2748 'git-contrib',
2749 command : [meson_git_contrib_sh])
2750 endif
2751
2752 if git.found()
2753 git_head = run_command(
2754 git,
2755 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2756 'rev-parse', 'HEAD']).stdout().strip()
2757 git_head_short = run_command(
2758 git,
2759 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2760 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2761
2762 run_target(
2763 'git-snapshot',
2764 command : ['git', 'archive',
2765 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2766 git_head_short),
2767 '--prefix', 'systemd-@0@/'.format(git_head),
2768 'HEAD'])
2769 endif
2770
2771 ############################################################
2772
2773 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2774 run_target(
2775 'check-api-docs',
2776 depends : [man, libsystemd, libudev],
2777 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2778
2779 ############################################################
2780
2781 status = [
2782 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2783
2784 'split /usr: @0@'.format(split_usr),
2785 'split bin-sbin: @0@'.format(split_bin),
2786 'prefix directory: @0@'.format(prefixdir),
2787 'rootprefix directory: @0@'.format(rootprefixdir),
2788 'sysconf directory: @0@'.format(sysconfdir),
2789 'include directory: @0@'.format(includedir),
2790 'lib directory: @0@'.format(libdir),
2791 'rootlib directory: @0@'.format(rootlibdir),
2792 'SysV init scripts: @0@'.format(sysvinit_path),
2793 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2794 'PAM modules directory: @0@'.format(pamlibdir),
2795 'PAM configuration directory: @0@'.format(pamconfdir),
2796 'RPM macros directory: @0@'.format(rpmmacrosdir),
2797 'modprobe.d directory: @0@'.format(modprobedir),
2798 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2799 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2800 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2801 'bash completions directory: @0@'.format(bashcompletiondir),
2802 'zsh completions directory: @0@'.format(zshcompletiondir),
2803 'extra start script: @0@'.format(get_option('rc-local')),
2804 'extra stop script: @0@'.format(get_option('halt-local')),
2805 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2806 get_option('debug-tty')),
2807 'TTY GID: @0@'.format(tty_gid),
2808 'users GID: @0@'.format(users_gid),
2809 'maximum system UID: @0@'.format(system_uid_max),
2810 'maximum system GID: @0@'.format(system_gid_max),
2811 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2812 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2813 'minimum container UID base: @0@'.format(container_uid_base_min),
2814 'maximum container UID base: @0@'.format(container_uid_base_max),
2815 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2816 'render group access mode: @0@'.format(get_option('group-render-mode')),
2817 'certificate root directory: @0@'.format(get_option('certificate-root')),
2818 'support URL: @0@'.format(support_url),
2819 'nobody user name: @0@'.format(nobody_user),
2820 'nobody group name: @0@'.format(nobody_group),
2821 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2822 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2823
2824 'default DNSSEC mode: @0@'.format(default_dnssec),
2825 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2826 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2827
2828 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2829 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2830 status += [
2831 'default DNS servers: @0@'.format(alt_dns_servers),
2832 'default NTP servers: @0@'.format(alt_ntp_servers)]
2833
2834 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2835 '@@0@'.format(time_epoch)).stdout().strip()
2836 status += [
2837 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2838
2839 # TODO:
2840 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2841 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2842 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2843
2844 if conf.get('ENABLE_EFI') == 1
2845 status += [
2846 'efi arch: @0@'.format(efi_arch)]
2847
2848 if have_gnu_efi
2849 status += [
2850 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2851 'EFI CC @0@'.format(efi_cc),
2852 'EFI lib directory: @0@'.format(efi_libdir),
2853 'EFI lds directory: @0@'.format(efi_ldsdir),
2854 'EFI include directory: @0@'.format(efi_incdir)]
2855 endif
2856 endif
2857
2858 found = []
2859 missing = []
2860
2861 foreach tuple : [
2862 ['libcryptsetup'],
2863 ['PAM'],
2864 ['AUDIT'],
2865 ['IMA'],
2866 ['AppArmor'],
2867 ['SELinux'],
2868 ['SECCOMP'],
2869 ['SMACK'],
2870 ['zlib'],
2871 ['xz'],
2872 ['lz4'],
2873 ['bzip2'],
2874 ['ACL'],
2875 ['gcrypt'],
2876 ['qrencode'],
2877 ['microhttpd'],
2878 ['gnutls'],
2879 ['libcurl'],
2880 ['idn'],
2881 ['libidn2'],
2882 ['libidn'],
2883 ['nss-systemd'],
2884 ['libiptc'],
2885 ['elfutils'],
2886 ['binfmt'],
2887 ['vconsole'],
2888 ['quotacheck'],
2889 ['tmpfiles'],
2890 ['environment.d'],
2891 ['sysusers'],
2892 ['firstboot'],
2893 ['randomseed'],
2894 ['backlight'],
2895 ['rfkill'],
2896 ['logind'],
2897 ['machined'],
2898 ['importd'],
2899 ['hostnamed'],
2900 ['timedated'],
2901 ['timesyncd'],
2902 ['localed'],
2903 ['networkd'],
2904 ['resolve'],
2905 ['coredump'],
2906 ['polkit'],
2907 ['legacy pkla', install_polkit_pkla],
2908 ['efi'],
2909 ['gnu-efi', have_gnu_efi],
2910 ['kmod'],
2911 ['xkbcommon'],
2912 ['pcre2'],
2913 ['blkid'],
2914 ['dbus'],
2915 ['glib'],
2916 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2917 ['hwdb'],
2918 ['tpm'],
2919 ['man pages', want_man],
2920 ['html pages', want_html],
2921 ['man page indices', want_man and have_lxml],
2922 ['SysV compat'],
2923 ['utmp'],
2924 ['ldconfig'],
2925 ['hibernate'],
2926 ['adm group', get_option('adm-group')],
2927 ['wheel group', get_option('wheel-group')],
2928 ['gshadow'],
2929 ['debug hashmap'],
2930 ['debug mmap cache'],
2931 ['valgrind', conf.get('VALGRIND') == 1],
2932 ]
2933
2934 if tuple.length() >= 2
2935 cond = tuple[1]
2936 else
2937 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2938 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2939 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2940 endif
2941 if cond
2942 found += [tuple[0]]
2943 else
2944 missing += [tuple[0]]
2945 endif
2946 endforeach
2947
2948 status += [
2949 '',
2950 'enabled features: @0@'.format(', '.join(found)),
2951 '',
2952 'disabled features: @0@'.format(', '.join(missing)),
2953 '']
2954 message('\n '.join(status))
2955
2956 if rootprefixdir != rootprefix_default
2957 warning('\n' +
2958 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2959 'systemd used fixed names for unit file directories and other paths, so anything\n' +
2960 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
2961 endif