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