]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
meson: use get_supported_arguments()
[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.43',
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 message('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 message('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 message('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 message('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 message('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 debug = get_option('debug')
764 enable_debug_hashmap = false
765 enable_debug_mmap_cache = false
766 if debug != ''
767 foreach name : debug.split(',')
768 if name == 'hashmap'
769 enable_debug_hashmap = true
770 elif name == 'mmap-cache'
771 enable_debug_mmap_cache = true
772 else
773 message('unknown debug option "@0@", ignoring'.format(name))
774 endif
775 endforeach
776 endif
777 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
778 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
779
780 #####################################################################
781
782 threads = dependency('threads')
783 librt = cc.find_library('rt')
784 libm = cc.find_library('m')
785 libdl = cc.find_library('dl')
786 libcrypt = cc.find_library('crypt')
787
788 libcap = dependency('libcap', required : false)
789 if not libcap.found()
790 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
791 libcap = cc.find_library('cap')
792 endif
793
794 libmount = dependency('mount',
795 version : fuzzer_build ? '>= 0' : '>= 2.30')
796
797 want_seccomp = get_option('seccomp')
798 if want_seccomp != 'false' and not fuzzer_build
799 libseccomp = dependency('libseccomp',
800 version : '>= 2.3.1',
801 required : want_seccomp == 'true')
802 have = libseccomp.found()
803 else
804 have = false
805 libseccomp = []
806 endif
807 conf.set10('HAVE_SECCOMP', have)
808
809 want_selinux = get_option('selinux')
810 if want_selinux != 'false' and not fuzzer_build
811 libselinux = dependency('libselinux',
812 version : '>= 2.1.9',
813 required : want_selinux == 'true')
814 have = libselinux.found()
815 else
816 have = false
817 libselinux = []
818 endif
819 conf.set10('HAVE_SELINUX', have)
820
821 want_apparmor = get_option('apparmor')
822 if want_apparmor != 'false' and not fuzzer_build
823 libapparmor = dependency('libapparmor',
824 required : want_apparmor == 'true')
825 have = libapparmor.found()
826 else
827 have = false
828 libapparmor = []
829 endif
830 conf.set10('HAVE_APPARMOR', have)
831
832 smack_run_label = get_option('smack-run-label')
833 if smack_run_label != ''
834 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
835 endif
836
837 want_polkit = get_option('polkit')
838 install_polkit = false
839 install_polkit_pkla = false
840 if want_polkit != 'false' and not fuzzer_build
841 install_polkit = true
842
843 libpolkit = dependency('polkit-gobject-1',
844 required : false)
845 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
846 message('Old polkit detected, will install pkla files')
847 install_polkit_pkla = true
848 endif
849 endif
850 conf.set10('ENABLE_POLKIT', install_polkit)
851
852 want_acl = get_option('acl')
853 if want_acl != 'false' and not fuzzer_build
854 libacl = cc.find_library('acl', required : want_acl == 'true')
855 have = libacl.found()
856 else
857 have = false
858 libacl = []
859 endif
860 conf.set10('HAVE_ACL', have)
861
862 want_audit = get_option('audit')
863 if want_audit != 'false' and not fuzzer_build
864 libaudit = dependency('audit', required : want_audit == 'true')
865 have = libaudit.found()
866 else
867 have = false
868 libaudit = []
869 endif
870 conf.set10('HAVE_AUDIT', have)
871
872 want_blkid = get_option('blkid')
873 if want_blkid != 'false' and not fuzzer_build
874 libblkid = dependency('blkid', required : want_blkid == 'true')
875 have = libblkid.found()
876 else
877 have = false
878 libblkid = []
879 endif
880 conf.set10('HAVE_BLKID', have)
881
882 want_kmod = get_option('kmod')
883 if want_kmod != 'false' and not fuzzer_build
884 libkmod = dependency('libkmod',
885 version : '>= 15',
886 required : want_kmod == 'true')
887 have = libkmod.found()
888 else
889 have = false
890 libkmod = []
891 endif
892 conf.set10('HAVE_KMOD', have)
893
894 want_pam = get_option('pam')
895 if want_pam != 'false' and not fuzzer_build
896 libpam = cc.find_library('pam', required : want_pam == 'true')
897 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
898 have = libpam.found() and libpam_misc.found()
899 else
900 have = false
901 libpam = []
902 libpam_misc = []
903 endif
904 conf.set10('HAVE_PAM', have)
905
906 want_microhttpd = get_option('microhttpd')
907 if want_microhttpd != 'false' and not fuzzer_build
908 libmicrohttpd = dependency('libmicrohttpd',
909 version : '>= 0.9.33',
910 required : want_microhttpd == 'true')
911 have = libmicrohttpd.found()
912 else
913 have = false
914 libmicrohttpd = []
915 endif
916 conf.set10('HAVE_MICROHTTPD', have)
917
918 want_libcryptsetup = get_option('libcryptsetup')
919 if want_libcryptsetup != 'false' and not fuzzer_build
920 libcryptsetup = dependency('libcryptsetup',
921 version : '>= 1.6.0',
922 required : want_libcryptsetup == 'true')
923 have = libcryptsetup.found()
924 else
925 have = false
926 libcryptsetup = []
927 endif
928 conf.set10('HAVE_LIBCRYPTSETUP', have)
929
930 want_libcurl = get_option('libcurl')
931 if want_libcurl != 'false' and not fuzzer_build
932 libcurl = dependency('libcurl',
933 version : '>= 7.32.0',
934 required : want_libcurl == 'true')
935 have = libcurl.found()
936 else
937 have = false
938 libcurl = []
939 endif
940 conf.set10('HAVE_LIBCURL', have)
941
942 want_libidn = get_option('libidn')
943 want_libidn2 = get_option('libidn2')
944 if want_libidn == 'true' and want_libidn2 == 'true'
945 error('libidn and libidn2 cannot be requested simultaneously')
946 endif
947
948 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
949 libidn = dependency('libidn',
950 required : want_libidn == 'true')
951 have = libidn.found()
952 else
953 have = false
954 libidn = []
955 endif
956 conf.set10('HAVE_LIBIDN', have)
957 if not have and want_libidn2 != 'false' and not fuzzer_build
958 # libidn is used for both libidn and libidn2 objects
959 libidn = dependency('libidn2',
960 required : want_libidn2 == 'true')
961 have = libidn.found()
962 else
963 have = false
964 endif
965 conf.set10('HAVE_LIBIDN2', have)
966
967 want_libiptc = get_option('libiptc')
968 if want_libiptc != 'false' and not fuzzer_build
969 libiptc = dependency('libiptc',
970 required : want_libiptc == 'true')
971 have = libiptc.found()
972 else
973 have = false
974 libiptc = []
975 endif
976 conf.set10('HAVE_LIBIPTC', have)
977
978 want_qrencode = get_option('qrencode')
979 if want_qrencode != 'false' and not fuzzer_build
980 libqrencode = dependency('libqrencode',
981 required : want_qrencode == 'true')
982 have = libqrencode.found()
983 else
984 have = false
985 libqrencode = []
986 endif
987 conf.set10('HAVE_QRENCODE', have)
988
989 want_gcrypt = get_option('gcrypt')
990 if want_gcrypt != 'false' and not fuzzer_build
991 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
992 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
993 have = libgcrypt.found() and libgpg_error.found()
994 else
995 have = false
996 endif
997 if not have
998 # link to neither of the libs if one is not found
999 libgcrypt = []
1000 libgpg_error = []
1001 endif
1002 conf.set10('HAVE_GCRYPT', have)
1003
1004 want_gnutls = get_option('gnutls')
1005 if want_gnutls != 'false' and not fuzzer_build
1006 libgnutls = dependency('gnutls',
1007 version : '>= 3.1.4',
1008 required : want_gnutls == 'true')
1009 have = libgnutls.found()
1010 else
1011 have = false
1012 libgnutls = []
1013 endif
1014 conf.set10('HAVE_GNUTLS', have)
1015
1016 want_elfutils = get_option('elfutils')
1017 if want_elfutils != 'false' and not fuzzer_build
1018 libdw = dependency('libdw',
1019 required : want_elfutils == 'true')
1020 have = libdw.found()
1021 else
1022 have = false
1023 libdw = []
1024 endif
1025 conf.set10('HAVE_ELFUTILS', have)
1026
1027 want_zlib = get_option('zlib')
1028 if want_zlib != 'false' and not fuzzer_build
1029 libz = dependency('zlib',
1030 required : want_zlib == 'true')
1031 have = libz.found()
1032 else
1033 have = false
1034 libz = []
1035 endif
1036 conf.set10('HAVE_ZLIB', have)
1037
1038 want_bzip2 = get_option('bzip2')
1039 if want_bzip2 != 'false' and not fuzzer_build
1040 libbzip2 = cc.find_library('bz2',
1041 required : want_bzip2 == 'true')
1042 have = libbzip2.found()
1043 else
1044 have = false
1045 libbzip2 = []
1046 endif
1047 conf.set10('HAVE_BZIP2', have)
1048
1049 want_xz = get_option('xz')
1050 if want_xz != 'false' and not fuzzer_build
1051 libxz = dependency('liblzma',
1052 required : want_xz == 'true')
1053 have = libxz.found()
1054 else
1055 have = false
1056 libxz = []
1057 endif
1058 conf.set10('HAVE_XZ', have)
1059
1060 want_lz4 = get_option('lz4')
1061 if want_lz4 != 'false' and not fuzzer_build
1062 liblz4 = dependency('liblz4',
1063 required : want_lz4 == 'true')
1064 have = liblz4.found()
1065 else
1066 have = false
1067 liblz4 = []
1068 endif
1069 conf.set10('HAVE_LZ4', have)
1070
1071 want_xkbcommon = get_option('xkbcommon')
1072 if want_xkbcommon != 'false' and not fuzzer_build
1073 libxkbcommon = dependency('xkbcommon',
1074 version : '>= 0.3.0',
1075 required : want_xkbcommon == 'true')
1076 have = libxkbcommon.found()
1077 else
1078 have = false
1079 libxkbcommon = []
1080 endif
1081 conf.set10('HAVE_XKBCOMMON', have)
1082
1083 want_pcre2 = get_option('pcre2')
1084 if want_pcre2 != 'false'
1085 libpcre2 = dependency('libpcre2-8',
1086 required : want_pcre2 == 'true')
1087 have = libpcre2.found()
1088 else
1089 have = false
1090 libpcre2 = []
1091 endif
1092 conf.set10('HAVE_PCRE2', have)
1093
1094 want_glib = get_option('glib')
1095 if want_glib != 'false' and not fuzzer_build
1096 libglib = dependency('glib-2.0',
1097 version : '>= 2.22.0',
1098 required : want_glib == 'true')
1099 libgobject = dependency('gobject-2.0',
1100 version : '>= 2.22.0',
1101 required : want_glib == 'true')
1102 libgio = dependency('gio-2.0',
1103 required : want_glib == 'true')
1104 have = libglib.found() and libgobject.found() and libgio.found()
1105 else
1106 have = false
1107 libglib = []
1108 libgobject = []
1109 libgio = []
1110 endif
1111 conf.set10('HAVE_GLIB', have)
1112
1113 want_dbus = get_option('dbus')
1114 if want_dbus != 'false' and not fuzzer_build
1115 libdbus = dependency('dbus-1',
1116 version : '>= 1.3.2',
1117 required : want_dbus == 'true')
1118 have = libdbus.found()
1119 else
1120 have = false
1121 libdbus = []
1122 endif
1123 conf.set10('HAVE_DBUS', have)
1124
1125 default_dnssec = get_option('default-dnssec')
1126 if fuzzer_build
1127 default_dnssec = 'no'
1128 endif
1129 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1130 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1131 default_dnssec = 'no'
1132 endif
1133 conf.set('DEFAULT_DNSSEC_MODE',
1134 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1135 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1136
1137 want_importd = get_option('importd')
1138 if want_importd != 'false'
1139 have = (conf.get('HAVE_LIBCURL') == 1 and
1140 conf.get('HAVE_ZLIB') == 1 and
1141 conf.get('HAVE_BZIP2') == 1 and
1142 conf.get('HAVE_XZ') == 1 and
1143 conf.get('HAVE_GCRYPT') == 1)
1144 if want_importd == 'true' and not have
1145 error('importd support was requested, but dependencies are not available')
1146 endif
1147 else
1148 have = false
1149 endif
1150 conf.set10('ENABLE_IMPORTD', have)
1151
1152 want_remote = get_option('remote')
1153 if want_remote != 'false'
1154 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1155 conf.get('HAVE_LIBCURL') == 1]
1156 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1157 # it's possible to build one without the other. Complain only if
1158 # support was explictly requested. The auxiliary files like sysusers
1159 # config should be installed when any of the programs are built.
1160 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1161 error('remote support was requested, but dependencies are not available')
1162 endif
1163 have = have_deps[0] or have_deps[1]
1164 else
1165 have = false
1166 endif
1167 conf.set10('ENABLE_REMOTE', have)
1168
1169 foreach term : ['utmp',
1170 'hibernate',
1171 'environment-d',
1172 'binfmt',
1173 'coredump',
1174 'resolve',
1175 'logind',
1176 'hostnamed',
1177 'localed',
1178 'machined',
1179 'networkd',
1180 'timedated',
1181 'timesyncd',
1182 'myhostname',
1183 'firstboot',
1184 'randomseed',
1185 'backlight',
1186 'vconsole',
1187 'quotacheck',
1188 'sysusers',
1189 'tmpfiles',
1190 'hwdb',
1191 'rfkill',
1192 'ldconfig',
1193 'efi',
1194 'tpm',
1195 'ima',
1196 'smack',
1197 'gshadow',
1198 'idn',
1199 'nss-systemd']
1200 have = get_option(term)
1201 name = 'ENABLE_' + term.underscorify().to_upper()
1202 conf.set10(name, have)
1203 endforeach
1204
1205 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1206
1207 want_tests = get_option('tests')
1208 install_tests = get_option('install-tests')
1209 slow_tests = get_option('slow-tests')
1210 tests = []
1211 fuzzers = []
1212
1213 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1214
1215 #####################################################################
1216
1217 if get_option('efi')
1218 efi_arch = host_machine.cpu_family()
1219
1220 if efi_arch == 'x86'
1221 EFI_MACHINE_TYPE_NAME = 'ia32'
1222 gnu_efi_arch = 'ia32'
1223 elif efi_arch == 'x86_64'
1224 EFI_MACHINE_TYPE_NAME = 'x64'
1225 gnu_efi_arch = 'x86_64'
1226 elif efi_arch == 'arm'
1227 EFI_MACHINE_TYPE_NAME = 'arm'
1228 gnu_efi_arch = 'arm'
1229 elif efi_arch == 'aarch64'
1230 EFI_MACHINE_TYPE_NAME = 'aa64'
1231 gnu_efi_arch = 'aarch64'
1232 else
1233 EFI_MACHINE_TYPE_NAME = ''
1234 gnu_efi_arch = ''
1235 endif
1236
1237 have = true
1238 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1239
1240 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1241 else
1242 have = false
1243 endif
1244 conf.set10('ENABLE_EFI', have)
1245
1246 #####################################################################
1247
1248 config_h = configure_file(
1249 output : 'config.h',
1250 configuration : conf)
1251
1252 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1253
1254 includes = include_directories('src/basic',
1255 'src/shared',
1256 'src/systemd',
1257 'src/journal',
1258 'src/resolve',
1259 'src/timesync',
1260 'src/time-wait-sync',
1261 'src/login',
1262 'src/udev',
1263 'src/libudev',
1264 'src/core',
1265 'src/libsystemd/sd-bus',
1266 'src/libsystemd/sd-device',
1267 'src/libsystemd/sd-hwdb',
1268 'src/libsystemd/sd-id128',
1269 'src/libsystemd/sd-netlink',
1270 'src/libsystemd/sd-network',
1271 'src/libsystemd-network',
1272 '.')
1273
1274 add_project_arguments('-include', 'config.h', language : 'c')
1275
1276 subdir('po')
1277 subdir('catalog')
1278 subdir('src/systemd')
1279 subdir('src/basic')
1280 subdir('src/libsystemd')
1281 subdir('src/libsystemd-network')
1282 subdir('src/journal')
1283 subdir('src/login')
1284
1285 libjournal_core = static_library(
1286 'journal-core',
1287 libjournal_core_sources,
1288 journald_gperf_c,
1289 include_directories : includes,
1290 install : false)
1291
1292 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1293 libsystemd = shared_library(
1294 'systemd',
1295 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1296 version : libsystemd_version,
1297 include_directories : includes,
1298 link_args : ['-shared',
1299 '-Wl,--version-script=' + libsystemd_sym_path],
1300 link_with : [libbasic,
1301 libbasic_gcrypt],
1302 link_whole : [libsystemd_static,
1303 libjournal_client],
1304 dependencies : [threads,
1305 librt,
1306 libxz,
1307 liblz4],
1308 link_depends : libsystemd_sym,
1309 install : true,
1310 install_dir : rootlibdir)
1311
1312 static_libsystemd = get_option('static-libsystemd')
1313 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1314
1315 install_libsystemd_static = static_library(
1316 'systemd',
1317 libsystemd_sources,
1318 journal_client_sources,
1319 basic_sources,
1320 basic_gcrypt_sources,
1321 include_directories : includes,
1322 build_by_default : static_libsystemd != 'false',
1323 install : static_libsystemd != 'false',
1324 install_dir : rootlibdir,
1325 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1326 dependencies : [threads,
1327 librt,
1328 libxz,
1329 liblz4,
1330 libcap,
1331 libblkid,
1332 libmount,
1333 libselinux,
1334 libgcrypt],
1335 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1336
1337 ############################################################
1338
1339 # binaries that have --help and are intended for use by humans,
1340 # usually, but not always, installed in /bin.
1341 public_programs = []
1342
1343 subdir('src/libudev')
1344 subdir('src/shared')
1345 subdir('src/core')
1346 subdir('src/udev')
1347 subdir('src/network')
1348
1349 subdir('src/analyze')
1350 subdir('src/journal-remote')
1351 subdir('src/coredump')
1352 subdir('src/hostname')
1353 subdir('src/import')
1354 subdir('src/kernel-install')
1355 subdir('src/locale')
1356 subdir('src/machine')
1357 subdir('src/nspawn')
1358 subdir('src/resolve')
1359 subdir('src/timedate')
1360 subdir('src/timesync')
1361 subdir('src/vconsole')
1362 subdir('src/boot/efi')
1363
1364 subdir('src/test')
1365 subdir('src/fuzz')
1366 subdir('rules')
1367 subdir('test')
1368
1369 ############################################################
1370
1371 # only static linking apart from libdl, to make sure that the
1372 # module is linked to all libraries that it uses.
1373 test_dlopen = executable(
1374 'test-dlopen',
1375 test_dlopen_c,
1376 include_directories : includes,
1377 link_with : [libbasic],
1378 dependencies : [libdl])
1379
1380 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1381 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1382 ['mymachines', 'ENABLE_MACHINED'],
1383 ['resolve', 'ENABLE_RESOLVE']]
1384
1385 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1386 if condition
1387 module = tuple[0]
1388
1389 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1390 version_script_arg = join_paths(meson.current_source_dir(), sym)
1391
1392 nss = shared_library(
1393 'nss_' + module,
1394 'src/nss-@0@/nss-@0@.c'.format(module),
1395 version : '2',
1396 include_directories : includes,
1397 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1398 link_args : ['-Wl,-z,nodelete',
1399 '-shared',
1400 '-Wl,--version-script=' + version_script_arg,
1401 '-Wl,--undefined'],
1402 link_with : [libsystemd_static,
1403 libbasic],
1404 dependencies : [threads,
1405 librt],
1406 link_depends : sym,
1407 install : true,
1408 install_dir : rootlibdir)
1409
1410 # We cannot use shared_module because it does not support version suffix.
1411 # Unfortunately shared_library insists on creating the symlink…
1412 meson.add_install_script('sh', '-c',
1413 'rm $DESTDIR@0@/libnss_@1@.so'
1414 .format(rootlibdir, module))
1415
1416 test('dlopen-nss_' + module,
1417 test_dlopen,
1418 args : [nss.full_path()]) # path to dlopen must include a slash
1419 endif
1420 endforeach
1421
1422 ############################################################
1423
1424 executable('systemd',
1425 systemd_sources,
1426 include_directories : includes,
1427 link_with : [libcore,
1428 libshared],
1429 dependencies : [threads,
1430 librt,
1431 libseccomp,
1432 libselinux,
1433 libmount,
1434 libblkid],
1435 install_rpath : rootlibexecdir,
1436 install : true,
1437 install_dir : rootlibexecdir)
1438
1439 meson.add_install_script(meson_make_symlink,
1440 join_paths(rootlibexecdir, 'systemd'),
1441 join_paths(rootsbindir, 'init'))
1442
1443 exe = executable('systemd-analyze',
1444 systemd_analyze_sources,
1445 include_directories : includes,
1446 link_with : [libcore,
1447 libshared],
1448 dependencies : [threads,
1449 librt,
1450 libseccomp,
1451 libselinux,
1452 libmount,
1453 libblkid],
1454 install_rpath : rootlibexecdir,
1455 install : true)
1456 public_programs += [exe]
1457
1458 executable('systemd-journald',
1459 systemd_journald_sources,
1460 include_directories : includes,
1461 link_with : [libjournal_core,
1462 libshared],
1463 dependencies : [threads,
1464 libxz,
1465 liblz4,
1466 libselinux],
1467 install_rpath : rootlibexecdir,
1468 install : true,
1469 install_dir : rootlibexecdir)
1470
1471 exe = executable('systemd-cat',
1472 systemd_cat_sources,
1473 include_directories : includes,
1474 link_with : [libjournal_core,
1475 libshared],
1476 dependencies : [threads],
1477 install_rpath : rootlibexecdir,
1478 install : true)
1479 public_programs += [exe]
1480
1481 exe = executable('journalctl',
1482 journalctl_sources,
1483 include_directories : includes,
1484 link_with : [libshared],
1485 dependencies : [threads,
1486 libqrencode,
1487 libxz,
1488 liblz4,
1489 libpcre2],
1490 install_rpath : rootlibexecdir,
1491 install : true,
1492 install_dir : rootbindir)
1493 public_programs += [exe]
1494
1495 executable('systemd-getty-generator',
1496 'src/getty-generator/getty-generator.c',
1497 include_directories : includes,
1498 link_with : [libshared],
1499 install_rpath : rootlibexecdir,
1500 install : true,
1501 install_dir : systemgeneratordir)
1502
1503 executable('systemd-debug-generator',
1504 'src/debug-generator/debug-generator.c',
1505 include_directories : includes,
1506 link_with : [libshared],
1507 install_rpath : rootlibexecdir,
1508 install : true,
1509 install_dir : systemgeneratordir)
1510
1511 executable('systemd-fstab-generator',
1512 'src/fstab-generator/fstab-generator.c',
1513 'src/core/mount-setup.c',
1514 include_directories : includes,
1515 link_with : [libshared],
1516 install_rpath : rootlibexecdir,
1517 install : true,
1518 install_dir : systemgeneratordir)
1519
1520 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1521 executable('30-systemd-environment-d-generator',
1522 'src/environment-d-generator/environment-d-generator.c',
1523 include_directories : includes,
1524 link_with : [libshared],
1525 install_rpath : rootlibexecdir,
1526 install : true,
1527 install_dir : userenvgeneratordir)
1528
1529 meson.add_install_script(meson_make_symlink,
1530 join_paths(sysconfdir, 'environment'),
1531 join_paths(environmentdir, '99-environment.conf'))
1532 endif
1533
1534 if conf.get('ENABLE_HIBERNATE') == 1
1535 executable('systemd-hibernate-resume-generator',
1536 'src/hibernate-resume/hibernate-resume-generator.c',
1537 include_directories : includes,
1538 link_with : [libshared],
1539 install_rpath : rootlibexecdir,
1540 install : true,
1541 install_dir : systemgeneratordir)
1542
1543 executable('systemd-hibernate-resume',
1544 'src/hibernate-resume/hibernate-resume.c',
1545 include_directories : includes,
1546 link_with : [libshared],
1547 install_rpath : rootlibexecdir,
1548 install : true,
1549 install_dir : rootlibexecdir)
1550 endif
1551
1552 if conf.get('HAVE_BLKID') == 1
1553 executable('systemd-gpt-auto-generator',
1554 'src/gpt-auto-generator/gpt-auto-generator.c',
1555 'src/basic/blkid-util.h',
1556 include_directories : includes,
1557 link_with : [libshared],
1558 dependencies : libblkid,
1559 install_rpath : rootlibexecdir,
1560 install : true,
1561 install_dir : systemgeneratordir)
1562
1563 exe = executable('systemd-dissect',
1564 'src/dissect/dissect.c',
1565 include_directories : includes,
1566 link_with : [libshared],
1567 install_rpath : rootlibexecdir,
1568 install : true,
1569 install_dir : rootlibexecdir)
1570 public_programs += [exe]
1571 endif
1572
1573 if conf.get('ENABLE_RESOLVE') == 1
1574 executable('systemd-resolved',
1575 systemd_resolved_sources,
1576 include_directories : includes,
1577 link_with : [libshared,
1578 libbasic_gcrypt,
1579 libsystemd_resolve_core],
1580 dependencies : [threads,
1581 libgpg_error,
1582 libm,
1583 libidn],
1584 install_rpath : rootlibexecdir,
1585 install : true,
1586 install_dir : rootlibexecdir)
1587
1588 exe = executable('resolvectl',
1589 resolvectl_sources,
1590 include_directories : includes,
1591 link_with : [libshared,
1592 libbasic_gcrypt,
1593 libsystemd_resolve_core],
1594 dependencies : [threads,
1595 libgpg_error,
1596 libm,
1597 libidn],
1598 install_rpath : rootlibexecdir,
1599 install : true)
1600 public_programs += [exe]
1601
1602 meson.add_install_script(meson_make_symlink,
1603 join_paths(bindir, 'resolvectl'),
1604 join_paths(rootsbindir, 'resolvconf'))
1605
1606 meson.add_install_script(meson_make_symlink,
1607 join_paths(bindir, 'resolvectl'),
1608 join_paths(bindir, 'systemd-resolve'))
1609 endif
1610
1611 if conf.get('ENABLE_LOGIND') == 1
1612 executable('systemd-logind',
1613 systemd_logind_sources,
1614 include_directories : includes,
1615 link_with : [liblogind_core,
1616 libshared],
1617 dependencies : [threads,
1618 libacl],
1619 install_rpath : rootlibexecdir,
1620 install : true,
1621 install_dir : rootlibexecdir)
1622
1623 exe = executable('loginctl',
1624 loginctl_sources,
1625 include_directories : includes,
1626 link_with : [libshared],
1627 dependencies : [threads,
1628 liblz4,
1629 libxz],
1630 install_rpath : rootlibexecdir,
1631 install : true,
1632 install_dir : rootbindir)
1633 public_programs += [exe]
1634
1635 exe = executable('systemd-inhibit',
1636 'src/login/inhibit.c',
1637 include_directories : includes,
1638 link_with : [libshared],
1639 install_rpath : rootlibexecdir,
1640 install : true,
1641 install_dir : rootbindir)
1642 public_programs += [exe]
1643
1644 if conf.get('HAVE_PAM') == 1
1645 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1646 pam_systemd = shared_library(
1647 'pam_systemd',
1648 pam_systemd_c,
1649 name_prefix : '',
1650 include_directories : includes,
1651 link_args : ['-shared',
1652 '-Wl,--version-script=' + version_script_arg],
1653 link_with : [libsystemd_static,
1654 libshared_static],
1655 dependencies : [threads,
1656 libpam,
1657 libpam_misc],
1658 link_depends : pam_systemd_sym,
1659 install : true,
1660 install_dir : pamlibdir)
1661
1662 test('dlopen-pam_systemd',
1663 test_dlopen,
1664 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1665 endif
1666 endif
1667
1668 executable('systemd-user-runtime-dir',
1669 user_runtime_dir_sources,
1670 include_directories : includes,
1671 link_with : [libshared, liblogind_core],
1672 install_rpath : rootlibexecdir,
1673 install : true,
1674 install_dir : rootlibexecdir)
1675
1676 if conf.get('HAVE_PAM') == 1
1677 executable('systemd-user-sessions',
1678 'src/user-sessions/user-sessions.c',
1679 include_directories : includes,
1680 link_with : [libshared],
1681 install_rpath : rootlibexecdir,
1682 install : true,
1683 install_dir : rootlibexecdir)
1684 endif
1685
1686 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1687 exe = executable('bootctl',
1688 'src/boot/bootctl.c',
1689 include_directories : includes,
1690 link_with : [libshared],
1691 dependencies : [libblkid],
1692 install_rpath : rootlibexecdir,
1693 install : true)
1694 public_programs += [exe]
1695 endif
1696
1697 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1698 include_directories : includes,
1699 link_with : [libshared],
1700 dependencies : [threads],
1701 install_rpath : rootlibexecdir,
1702 install : true)
1703 public_programs += [exe]
1704
1705 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1706 include_directories : includes,
1707 link_with : [libshared],
1708 dependencies : [threads,
1709 libcap,
1710 libselinux,
1711 libxz,
1712 liblz4],
1713 install_rpath : rootlibexecdir,
1714 install : true,
1715 install_dir : rootbindir)
1716 public_programs += [exe]
1717
1718 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1719 meson.add_install_script(meson_make_symlink,
1720 join_paths(rootbindir, 'systemctl'),
1721 join_paths(rootsbindir, alias))
1722 endforeach
1723
1724 if conf.get('ENABLE_BACKLIGHT') == 1
1725 executable('systemd-backlight',
1726 'src/backlight/backlight.c',
1727 include_directories : includes,
1728 link_with : [libshared],
1729 install_rpath : rootlibexecdir,
1730 install : true,
1731 install_dir : rootlibexecdir)
1732 endif
1733
1734 if conf.get('ENABLE_RFKILL') == 1
1735 executable('systemd-rfkill',
1736 'src/rfkill/rfkill.c',
1737 include_directories : includes,
1738 link_with : [libshared],
1739 install_rpath : rootlibexecdir,
1740 install : true,
1741 install_dir : rootlibexecdir)
1742 endif
1743
1744 executable('systemd-system-update-generator',
1745 'src/system-update-generator/system-update-generator.c',
1746 include_directories : includes,
1747 link_with : [libshared],
1748 install_rpath : rootlibexecdir,
1749 install : true,
1750 install_dir : systemgeneratordir)
1751
1752 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1753 executable('systemd-cryptsetup',
1754 'src/cryptsetup/cryptsetup.c',
1755 include_directories : includes,
1756 link_with : [libshared],
1757 dependencies : [libcryptsetup],
1758 install_rpath : rootlibexecdir,
1759 install : true,
1760 install_dir : rootlibexecdir)
1761
1762 executable('systemd-cryptsetup-generator',
1763 'src/cryptsetup/cryptsetup-generator.c',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 dependencies : [libcryptsetup],
1767 install_rpath : rootlibexecdir,
1768 install : true,
1769 install_dir : systemgeneratordir)
1770
1771 executable('systemd-veritysetup',
1772 'src/veritysetup/veritysetup.c',
1773 include_directories : includes,
1774 link_with : [libshared],
1775 dependencies : [libcryptsetup],
1776 install_rpath : rootlibexecdir,
1777 install : true,
1778 install_dir : rootlibexecdir)
1779
1780 executable('systemd-veritysetup-generator',
1781 'src/veritysetup/veritysetup-generator.c',
1782 include_directories : includes,
1783 link_with : [libshared],
1784 dependencies : [libcryptsetup],
1785 install_rpath : rootlibexecdir,
1786 install : true,
1787 install_dir : systemgeneratordir)
1788 endif
1789
1790 if conf.get('HAVE_SYSV_COMPAT') == 1
1791 executable('systemd-sysv-generator',
1792 'src/sysv-generator/sysv-generator.c',
1793 include_directories : includes,
1794 link_with : [libshared],
1795 install_rpath : rootlibexecdir,
1796 install : true,
1797 install_dir : systemgeneratordir)
1798
1799 executable('systemd-rc-local-generator',
1800 'src/rc-local-generator/rc-local-generator.c',
1801 include_directories : includes,
1802 link_with : [libshared],
1803 install_rpath : rootlibexecdir,
1804 install : true,
1805 install_dir : systemgeneratordir)
1806 endif
1807
1808 if conf.get('ENABLE_HOSTNAMED') == 1
1809 executable('systemd-hostnamed',
1810 'src/hostname/hostnamed.c',
1811 include_directories : includes,
1812 link_with : [libshared],
1813 install_rpath : rootlibexecdir,
1814 install : true,
1815 install_dir : rootlibexecdir)
1816
1817 exe = executable('hostnamectl',
1818 'src/hostname/hostnamectl.c',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 install_rpath : rootlibexecdir,
1822 install : true)
1823 public_programs += [exe]
1824 endif
1825
1826 if conf.get('ENABLE_LOCALED') == 1
1827 if conf.get('HAVE_XKBCOMMON') == 1
1828 # logind will load libxkbcommon.so dynamically on its own
1829 deps = [libdl]
1830 else
1831 deps = []
1832 endif
1833
1834 executable('systemd-localed',
1835 systemd_localed_sources,
1836 include_directories : includes,
1837 link_with : [libshared],
1838 dependencies : deps,
1839 install_rpath : rootlibexecdir,
1840 install : true,
1841 install_dir : rootlibexecdir)
1842
1843 exe = executable('localectl',
1844 localectl_sources,
1845 include_directories : includes,
1846 link_with : [libshared],
1847 install_rpath : rootlibexecdir,
1848 install : true)
1849 public_programs += [exe]
1850 endif
1851
1852 if conf.get('ENABLE_TIMEDATED') == 1
1853 executable('systemd-timedated',
1854 'src/timedate/timedated.c',
1855 include_directories : includes,
1856 link_with : [libshared],
1857 install_rpath : rootlibexecdir,
1858 install : true,
1859 install_dir : rootlibexecdir)
1860 endif
1861
1862 if conf.get('ENABLE_TIMEDATECTL') == 1
1863 exe = executable('timedatectl',
1864 'src/timedate/timedatectl.c',
1865 include_directories : includes,
1866 install_rpath : rootlibexecdir,
1867 link_with : [libshared],
1868 dependencies : [libm],
1869 install : true)
1870 public_programs += [exe]
1871 endif
1872
1873 if conf.get('ENABLE_TIMESYNCD') == 1
1874 executable('systemd-timesyncd',
1875 systemd_timesyncd_sources,
1876 include_directories : includes,
1877 link_with : [libshared],
1878 dependencies : [threads,
1879 libm],
1880 install_rpath : rootlibexecdir,
1881 install : true,
1882 install_dir : rootlibexecdir)
1883
1884 executable('systemd-time-wait-sync',
1885 'src/time-wait-sync/time-wait-sync.c',
1886 include_directories : includes,
1887 link_with : [libshared],
1888 install_rpath : rootlibexecdir,
1889 install : true,
1890 install_dir : rootlibexecdir)
1891 endif
1892
1893 if conf.get('ENABLE_MACHINED') == 1
1894 executable('systemd-machined',
1895 systemd_machined_sources,
1896 include_directories : includes,
1897 link_with : [libmachine_core,
1898 libshared],
1899 install_rpath : rootlibexecdir,
1900 install : true,
1901 install_dir : rootlibexecdir)
1902
1903 exe = executable('machinectl',
1904 'src/machine/machinectl.c',
1905 include_directories : includes,
1906 link_with : [libshared],
1907 dependencies : [threads,
1908 libxz,
1909 liblz4],
1910 install_rpath : rootlibexecdir,
1911 install : true,
1912 install_dir : rootbindir)
1913 public_programs += [exe]
1914 endif
1915
1916 if conf.get('ENABLE_IMPORTD') == 1
1917 executable('systemd-importd',
1918 systemd_importd_sources,
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [threads],
1922 install_rpath : rootlibexecdir,
1923 install : true,
1924 install_dir : rootlibexecdir)
1925
1926 systemd_pull = executable('systemd-pull',
1927 systemd_pull_sources,
1928 include_directories : includes,
1929 link_with : [libshared],
1930 dependencies : [libcurl,
1931 libz,
1932 libbzip2,
1933 libxz,
1934 libgcrypt],
1935 install_rpath : rootlibexecdir,
1936 install : true,
1937 install_dir : rootlibexecdir)
1938
1939 systemd_import = executable('systemd-import',
1940 systemd_import_sources,
1941 include_directories : includes,
1942 link_with : [libshared],
1943 dependencies : [libcurl,
1944 libz,
1945 libbzip2,
1946 libxz],
1947 install_rpath : rootlibexecdir,
1948 install : true,
1949 install_dir : rootlibexecdir)
1950
1951 systemd_export = executable('systemd-export',
1952 systemd_export_sources,
1953 include_directories : includes,
1954 link_with : [libshared],
1955 dependencies : [libcurl,
1956 libz,
1957 libbzip2,
1958 libxz],
1959 install_rpath : rootlibexecdir,
1960 install : true,
1961 install_dir : rootlibexecdir)
1962 public_programs += [systemd_pull, systemd_import, systemd_export]
1963 endif
1964
1965 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1966 exe = executable('systemd-journal-upload',
1967 systemd_journal_upload_sources,
1968 include_directories : includes,
1969 link_with : [libshared],
1970 dependencies : [threads,
1971 libcurl,
1972 libgnutls,
1973 libxz,
1974 liblz4],
1975 install_rpath : rootlibexecdir,
1976 install : true,
1977 install_dir : rootlibexecdir)
1978 public_programs += [exe]
1979 endif
1980
1981 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1982 s_j_remote = executable('systemd-journal-remote',
1983 systemd_journal_remote_sources,
1984 include_directories : includes,
1985 link_with : [libshared],
1986 dependencies : [threads,
1987 libmicrohttpd,
1988 libgnutls,
1989 libxz,
1990 liblz4],
1991 install_rpath : rootlibexecdir,
1992 install : true,
1993 install_dir : rootlibexecdir)
1994
1995 s_j_gatewayd = executable('systemd-journal-gatewayd',
1996 systemd_journal_gatewayd_sources,
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : [threads,
2000 libmicrohttpd,
2001 libgnutls,
2002 libxz,
2003 liblz4],
2004 install_rpath : rootlibexecdir,
2005 install : true,
2006 install_dir : rootlibexecdir)
2007 public_programs += [s_j_remote, s_j_gatewayd]
2008 endif
2009
2010 if conf.get('ENABLE_COREDUMP') == 1
2011 executable('systemd-coredump',
2012 systemd_coredump_sources,
2013 include_directories : includes,
2014 link_with : [libshared],
2015 dependencies : [threads,
2016 libacl,
2017 libdw,
2018 libxz,
2019 liblz4],
2020 install_rpath : rootlibexecdir,
2021 install : true,
2022 install_dir : rootlibexecdir)
2023
2024 exe = executable('coredumpctl',
2025 coredumpctl_sources,
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [threads,
2029 libxz,
2030 liblz4],
2031 install_rpath : rootlibexecdir,
2032 install : true)
2033 public_programs += [exe]
2034 endif
2035
2036 if conf.get('ENABLE_BINFMT') == 1
2037 exe = executable('systemd-binfmt',
2038 'src/binfmt/binfmt.c',
2039 include_directories : includes,
2040 link_with : [libshared],
2041 install_rpath : rootlibexecdir,
2042 install : true,
2043 install_dir : rootlibexecdir)
2044 public_programs += [exe]
2045
2046 meson.add_install_script('sh', '-c',
2047 mkdir_p.format(binfmtdir))
2048 meson.add_install_script('sh', '-c',
2049 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2050 endif
2051
2052 if conf.get('ENABLE_VCONSOLE') == 1
2053 executable('systemd-vconsole-setup',
2054 'src/vconsole/vconsole-setup.c',
2055 include_directories : includes,
2056 link_with : [libshared],
2057 install_rpath : rootlibexecdir,
2058 install : true,
2059 install_dir : rootlibexecdir)
2060 endif
2061
2062 if conf.get('ENABLE_RANDOMSEED') == 1
2063 executable('systemd-random-seed',
2064 'src/random-seed/random-seed.c',
2065 include_directories : includes,
2066 link_with : [libshared],
2067 install_rpath : rootlibexecdir,
2068 install : true,
2069 install_dir : rootlibexecdir)
2070 endif
2071
2072 if conf.get('ENABLE_FIRSTBOOT') == 1
2073 executable('systemd-firstboot',
2074 'src/firstboot/firstboot.c',
2075 include_directories : includes,
2076 link_with : [libshared],
2077 dependencies : [libcrypt],
2078 install_rpath : rootlibexecdir,
2079 install : true,
2080 install_dir : rootbindir)
2081 endif
2082
2083 executable('systemd-remount-fs',
2084 'src/remount-fs/remount-fs.c',
2085 'src/core/mount-setup.c',
2086 'src/core/mount-setup.h',
2087 include_directories : includes,
2088 link_with : [libshared],
2089 install_rpath : rootlibexecdir,
2090 install : true,
2091 install_dir : rootlibexecdir)
2092
2093 executable('systemd-machine-id-setup',
2094 'src/machine-id-setup/machine-id-setup-main.c',
2095 'src/core/machine-id-setup.c',
2096 'src/core/machine-id-setup.h',
2097 include_directories : includes,
2098 link_with : [libshared],
2099 install_rpath : rootlibexecdir,
2100 install : true,
2101 install_dir : rootbindir)
2102
2103 executable('systemd-fsck',
2104 'src/fsck/fsck.c',
2105 include_directories : includes,
2106 link_with : [libshared],
2107 install_rpath : rootlibexecdir,
2108 install : true,
2109 install_dir : rootlibexecdir)
2110
2111 executable('systemd-growfs',
2112 'src/partition/growfs.c',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 dependencies : [libcryptsetup],
2116 install_rpath : rootlibexecdir,
2117 install : true,
2118 install_dir : rootlibexecdir)
2119
2120 executable('systemd-makefs',
2121 'src/partition/makefs.c',
2122 include_directories : includes,
2123 link_with : [libshared],
2124 install_rpath : rootlibexecdir,
2125 install : true,
2126 install_dir : rootlibexecdir)
2127
2128 executable('systemd-sleep',
2129 'src/sleep/sleep.c',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 install_rpath : rootlibexecdir,
2133 install : true,
2134 install_dir : rootlibexecdir)
2135
2136 exe = executable('systemd-sysctl',
2137 'src/sysctl/sysctl.c',
2138 include_directories : includes,
2139 link_with : [libshared],
2140 install_rpath : rootlibexecdir,
2141 install : true,
2142 install_dir : rootlibexecdir)
2143 public_programs += [exe]
2144
2145 executable('systemd-ac-power',
2146 'src/ac-power/ac-power.c',
2147 include_directories : includes,
2148 link_with : [libshared],
2149 install_rpath : rootlibexecdir,
2150 install : true,
2151 install_dir : rootlibexecdir)
2152
2153 exe = executable('systemd-detect-virt',
2154 'src/detect-virt/detect-virt.c',
2155 include_directories : includes,
2156 link_with : [libshared],
2157 install_rpath : rootlibexecdir,
2158 install : true)
2159 public_programs += [exe]
2160
2161 exe = executable('systemd-delta',
2162 'src/delta/delta.c',
2163 include_directories : includes,
2164 link_with : [libshared],
2165 install_rpath : rootlibexecdir,
2166 install : true)
2167 public_programs += [exe]
2168
2169 exe = executable('systemd-escape',
2170 'src/escape/escape.c',
2171 include_directories : includes,
2172 link_with : [libshared],
2173 install_rpath : rootlibexecdir,
2174 install : true,
2175 install_dir : rootbindir)
2176 public_programs += [exe]
2177
2178 exe = executable('systemd-notify',
2179 'src/notify/notify.c',
2180 include_directories : includes,
2181 link_with : [libshared],
2182 install_rpath : rootlibexecdir,
2183 install : true,
2184 install_dir : rootbindir)
2185 public_programs += [exe]
2186
2187 executable('systemd-volatile-root',
2188 'src/volatile-root/volatile-root.c',
2189 include_directories : includes,
2190 link_with : [libshared],
2191 install_rpath : rootlibexecdir,
2192 install : true,
2193 install_dir : rootlibexecdir)
2194
2195 executable('systemd-cgroups-agent',
2196 'src/cgroups-agent/cgroups-agent.c',
2197 include_directories : includes,
2198 link_with : [libshared],
2199 install_rpath : rootlibexecdir,
2200 install : true,
2201 install_dir : rootlibexecdir)
2202
2203 exe = executable('systemd-path',
2204 'src/path/path.c',
2205 include_directories : includes,
2206 link_with : [libshared],
2207 install_rpath : rootlibexecdir,
2208 install : true)
2209 public_programs += [exe]
2210
2211 exe = executable('systemd-ask-password',
2212 'src/ask-password/ask-password.c',
2213 include_directories : includes,
2214 link_with : [libshared],
2215 install_rpath : rootlibexecdir,
2216 install : true,
2217 install_dir : rootbindir)
2218 public_programs += [exe]
2219
2220 executable('systemd-reply-password',
2221 'src/reply-password/reply-password.c',
2222 include_directories : includes,
2223 link_with : [libshared],
2224 install_rpath : rootlibexecdir,
2225 install : true,
2226 install_dir : rootlibexecdir)
2227
2228 exe = executable('systemd-tty-ask-password-agent',
2229 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2230 include_directories : includes,
2231 link_with : [libshared],
2232 install_rpath : rootlibexecdir,
2233 install : true,
2234 install_dir : rootbindir)
2235 public_programs += [exe]
2236
2237 exe = executable('systemd-cgls',
2238 'src/cgls/cgls.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 install_rpath : rootlibexecdir,
2242 install : true)
2243 public_programs += [exe]
2244
2245 exe = executable('systemd-cgtop',
2246 'src/cgtop/cgtop.c',
2247 include_directories : includes,
2248 link_with : [libshared],
2249 install_rpath : rootlibexecdir,
2250 install : true)
2251 public_programs += [exe]
2252
2253 executable('systemd-initctl',
2254 'src/initctl/initctl.c',
2255 include_directories : includes,
2256 link_with : [libshared],
2257 install_rpath : rootlibexecdir,
2258 install : true,
2259 install_dir : rootlibexecdir)
2260
2261 exe = executable('systemd-mount',
2262 'src/mount/mount-tool.c',
2263 include_directories : includes,
2264 link_with : [libshared],
2265 install_rpath : rootlibexecdir,
2266 install : true)
2267 public_programs += [exe]
2268
2269 meson.add_install_script(meson_make_symlink,
2270 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2271
2272 exe = executable('systemd-run',
2273 'src/run/run.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2277 install : true)
2278 public_programs += [exe]
2279
2280 exe = executable('systemd-stdio-bridge',
2281 'src/stdio-bridge/stdio-bridge.c',
2282 include_directories : includes,
2283 link_with : [libshared],
2284 install_rpath : rootlibexecdir,
2285 install : true)
2286 public_programs += [exe]
2287
2288 exe = executable('busctl',
2289 'src/busctl/busctl.c',
2290 'src/busctl/busctl-introspect.c',
2291 'src/busctl/busctl-introspect.h',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 install_rpath : rootlibexecdir,
2295 install : true)
2296 public_programs += [exe]
2297
2298 if conf.get('ENABLE_SYSUSERS') == 1
2299 exe = executable('systemd-sysusers',
2300 'src/sysusers/sysusers.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2304 install : true,
2305 install_dir : rootbindir)
2306 public_programs += [exe]
2307 endif
2308
2309 if conf.get('ENABLE_TMPFILES') == 1
2310 exe = executable('systemd-tmpfiles',
2311 'src/tmpfiles/tmpfiles.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 dependencies : [libacl],
2315 install_rpath : rootlibexecdir,
2316 install : true,
2317 install_dir : rootbindir)
2318 public_programs += [exe]
2319
2320 test('test-systemd-tmpfiles',
2321 test_systemd_tmpfiles_py,
2322 args : exe.full_path())
2323 # https://github.com/mesonbuild/meson/issues/2681
2324 endif
2325
2326 if conf.get('ENABLE_HWDB') == 1
2327 exe = executable('systemd-hwdb',
2328 'src/hwdb/hwdb.c',
2329 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2330 include_directories : includes,
2331 link_with : [libudev_static],
2332 install_rpath : udev_rpath,
2333 install : true,
2334 install_dir : rootbindir)
2335 public_programs += [exe]
2336 endif
2337
2338 if conf.get('ENABLE_QUOTACHECK') == 1
2339 executable('systemd-quotacheck',
2340 'src/quotacheck/quotacheck.c',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2344 install : true,
2345 install_dir : rootlibexecdir)
2346 endif
2347
2348 exe = executable('systemd-socket-proxyd',
2349 'src/socket-proxy/socket-proxyd.c',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 dependencies : [threads],
2353 install_rpath : rootlibexecdir,
2354 install : true,
2355 install_dir : rootlibexecdir)
2356 public_programs += [exe]
2357
2358 exe = executable('systemd-udevd',
2359 systemd_udevd_sources,
2360 include_directories : includes,
2361 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2362 link_with : [libudev_core,
2363 libsystemd_network,
2364 libudev_static],
2365 dependencies : [threads,
2366 libkmod,
2367 libidn,
2368 libacl,
2369 libblkid],
2370 install_rpath : udev_rpath,
2371 install : true,
2372 install_dir : rootlibexecdir)
2373 public_programs += [exe]
2374
2375 exe = executable('udevadm',
2376 udevadm_sources,
2377 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2378 include_directories : includes,
2379 link_with : [libudev_core,
2380 libsystemd_network,
2381 libudev_static],
2382 dependencies : [threads,
2383 libkmod,
2384 libidn,
2385 libacl,
2386 libblkid],
2387 install_rpath : udev_rpath,
2388 install : true,
2389 install_dir : rootbindir)
2390 public_programs += [exe]
2391
2392 executable('systemd-shutdown',
2393 systemd_shutdown_sources,
2394 include_directories : includes,
2395 link_with : [libshared],
2396 dependencies : [libmount],
2397 install_rpath : rootlibexecdir,
2398 install : true,
2399 install_dir : rootlibexecdir)
2400
2401 executable('systemd-update-done',
2402 'src/update-done/update-done.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 install_rpath : rootlibexecdir,
2406 install : true,
2407 install_dir : rootlibexecdir)
2408
2409 executable('systemd-update-utmp',
2410 'src/update-utmp/update-utmp.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 dependencies : [libaudit],
2414 install_rpath : rootlibexecdir,
2415 install : true,
2416 install_dir : rootlibexecdir)
2417
2418 if conf.get('HAVE_KMOD') == 1
2419 executable('systemd-modules-load',
2420 'src/modules-load/modules-load.c',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 dependencies : [libkmod],
2424 install_rpath : rootlibexecdir,
2425 install : true,
2426 install_dir : rootlibexecdir)
2427
2428 meson.add_install_script('sh', '-c',
2429 mkdir_p.format(modulesloaddir))
2430 meson.add_install_script('sh', '-c',
2431 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2432 endif
2433
2434 exe = executable('systemd-nspawn',
2435 systemd_nspawn_sources,
2436 'src/core/mount-setup.c', # FIXME: use a variable?
2437 'src/core/mount-setup.h',
2438 'src/core/loopback-setup.c',
2439 'src/core/loopback-setup.h',
2440 include_directories : [includes, include_directories('src/nspawn')],
2441 link_with : [libshared],
2442 dependencies : [libacl,
2443 libblkid,
2444 libseccomp,
2445 libselinux],
2446 install_rpath : rootlibexecdir,
2447 install : true)
2448 public_programs += [exe]
2449
2450 if conf.get('ENABLE_NETWORKD') == 1
2451 executable('systemd-networkd',
2452 systemd_networkd_sources,
2453 include_directories : includes,
2454 link_with : [libnetworkd_core,
2455 libsystemd_network,
2456 libudev_static,
2457 libshared],
2458 dependencies : [threads],
2459 install_rpath : rootlibexecdir,
2460 install : true,
2461 install_dir : rootlibexecdir)
2462
2463 executable('systemd-networkd-wait-online',
2464 systemd_networkd_wait_online_sources,
2465 include_directories : includes,
2466 link_with : [libnetworkd_core,
2467 libshared],
2468 install_rpath : rootlibexecdir,
2469 install : true,
2470 install_dir : rootlibexecdir)
2471
2472 exe = executable('networkctl',
2473 networkctl_sources,
2474 include_directories : includes,
2475 link_with : [libsystemd_network,
2476 libshared],
2477 install_rpath : rootlibexecdir,
2478 install : true,
2479 install_dir : rootbindir)
2480 public_programs += [exe]
2481 endif
2482
2483 executable('systemd-sulogin-shell',
2484 ['src/sulogin-shell/sulogin-shell.c'],
2485 include_directories : includes,
2486 link_with : [libshared],
2487 install_rpath : rootlibexecdir,
2488 install : true,
2489 install_dir : rootlibexecdir)
2490
2491 ############################################################
2492
2493 foreach tuple : tests
2494 sources = tuple[0]
2495 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2496 dependencies = tuple[2]
2497 condition = tuple.length() >= 4 ? tuple[3] : ''
2498 type = tuple.length() >= 5 ? tuple[4] : ''
2499 defs = tuple.length() >= 6 ? tuple[5] : []
2500 incs = tuple.length() >= 7 ? tuple[6] : includes
2501 timeout = 30
2502
2503 name = sources[0].split('/')[-1].split('.')[0]
2504 if type.startswith('timeout=')
2505 timeout = type.split('=')[1].to_int()
2506 type = ''
2507 endif
2508 if want_tests == 'false'
2509 message('Not compiling @0@ because tests is set to false'.format(name))
2510 elif condition == '' or conf.get(condition) == 1
2511 exe = executable(
2512 name,
2513 sources,
2514 include_directories : incs,
2515 link_with : link_with,
2516 dependencies : dependencies,
2517 c_args : defs,
2518 install_rpath : rootlibexecdir,
2519 install : install_tests,
2520 install_dir : join_paths(testsdir, type))
2521
2522 if type == 'manual'
2523 message('@0@ is a manual test'.format(name))
2524 elif type == 'unsafe' and want_tests != 'unsafe'
2525 message('@0@ is an unsafe test'.format(name))
2526 else
2527 test(name, exe,
2528 env : test_env,
2529 timeout : timeout)
2530 endif
2531 else
2532 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2533 endif
2534 endforeach
2535
2536 exe = executable(
2537 'test-libsystemd-sym',
2538 test_libsystemd_sym_c,
2539 include_directories : includes,
2540 link_with : [libsystemd],
2541 install : install_tests,
2542 install_dir : testsdir)
2543 test('test-libsystemd-sym', exe)
2544
2545 exe = executable(
2546 'test-libsystemd-static-sym',
2547 test_libsystemd_sym_c,
2548 include_directories : includes,
2549 link_with : [install_libsystemd_static],
2550 dependencies : [threads], # threads is already included in dependencies on the library,
2551 # but does not seem to get propagated. Add here as a work-around.
2552 build_by_default : static_libsystemd_pic,
2553 install : install_tests and static_libsystemd_pic,
2554 install_dir : testsdir)
2555 if static_libsystemd_pic
2556 test('test-libsystemd-static-sym', exe)
2557 endif
2558
2559 exe = executable(
2560 'test-libudev-sym',
2561 test_libudev_sym_c,
2562 include_directories : includes,
2563 c_args : ['-Wno-deprecated-declarations'],
2564 link_with : [libudev],
2565 install : install_tests,
2566 install_dir : testsdir)
2567 test('test-libudev-sym', exe)
2568
2569 exe = executable(
2570 'test-libudev-static-sym',
2571 test_libudev_sym_c,
2572 include_directories : includes,
2573 c_args : ['-Wno-deprecated-declarations'],
2574 link_with : [install_libudev_static],
2575 build_by_default : static_libudev_pic,
2576 install : install_tests and static_libudev_pic,
2577 install_dir : testsdir)
2578 if static_libudev_pic
2579 test('test-libudev-static-sym', exe)
2580 endif
2581
2582 ############################################################
2583
2584 fuzzer_exes = []
2585
2586 foreach tuple : fuzzers
2587 sources = tuple[0]
2588 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2589 dependencies = tuple[2]
2590 defs = tuple.length() >= 4 ? tuple[3] : []
2591 incs = tuple.length() >= 5 ? tuple[4] : includes
2592
2593 if fuzzer_build
2594 dependencies += fuzzing_engine
2595 else
2596 sources += 'src/fuzz/fuzz-main.c'
2597 endif
2598
2599 name = sources[0].split('/')[-1].split('.')[0]
2600
2601 fuzzer_exes += executable(
2602 name,
2603 sources,
2604 include_directories : [incs, include_directories('src/fuzz')],
2605 link_with : link_with,
2606 dependencies : dependencies,
2607 c_args : defs,
2608 install : false)
2609 endforeach
2610
2611 run_target('fuzzers',
2612 depends : fuzzer_exes,
2613 command : ['true'])
2614
2615 ############################################################
2616
2617 make_directive_index_py = find_program('tools/make-directive-index.py')
2618 make_man_index_py = find_program('tools/make-man-index.py')
2619 xml_helper_py = find_program('tools/xml_helper.py')
2620 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2621
2622 subdir('units')
2623 subdir('sysctl.d')
2624 subdir('sysusers.d')
2625 subdir('tmpfiles.d')
2626 subdir('presets')
2627 subdir('hwdb')
2628 subdir('network')
2629 subdir('man')
2630 subdir('shell-completion/bash')
2631 subdir('shell-completion/zsh')
2632 subdir('doc/sysvinit')
2633 subdir('doc/var-log')
2634
2635 # FIXME: figure out if the warning is true:
2636 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2637 install_subdir('factory/etc',
2638 install_dir : factorydir)
2639
2640
2641 install_data('xorg/50-systemd-user.sh',
2642 install_dir : xinitrcdir)
2643 install_data('modprobe.d/systemd.conf',
2644 install_dir : modprobedir)
2645 install_data('LICENSE.GPL2',
2646 'LICENSE.LGPL2.1',
2647 'NEWS',
2648 'README',
2649 'doc/CODING_STYLE',
2650 'doc/DISTRO_PORTING',
2651 'doc/ENVIRONMENT.md',
2652 'doc/HACKING',
2653 'doc/TRANSIENT-SETTINGS.md',
2654 'doc/TRANSLATORS',
2655 'doc/UIDS-GIDS.md',
2656 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2657 install_dir : docdir)
2658
2659 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2660 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2661
2662 ############################################################
2663
2664 meson_check_help = find_program('tools/meson-check-help.sh')
2665
2666 foreach exec : public_programs
2667 name = exec.full_path().split('/')[-1]
2668 test('check-help-' + name,
2669 meson_check_help,
2670 args : [exec.full_path()])
2671 endforeach
2672
2673 ############################################################
2674
2675 # Enable tests for all supported sanitizers
2676 foreach tuple : sanitizers
2677 sanitizer = tuple[0]
2678 build = tuple[1]
2679
2680 have = run_command(check_compilation_sh,
2681 cc.cmd_array(), '-x', 'c',
2682 '-fsanitize=@0@'.format(sanitizer),
2683 '-include', link_test_c).returncode() == 0
2684 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2685
2686 if have
2687 prev = ''
2688 foreach p : fuzz_regression_tests
2689 b = p.split('/')[-2]
2690 c = p.split('/')[-1]
2691
2692 name = '@0@:@1@'.format(b, sanitizer)
2693
2694 if name != prev
2695 if want_tests == 'false'
2696 message('Not compiling @0@ because tests is set to false'.format(name))
2697 elif slow_tests
2698 exe = custom_target(
2699 name,
2700 output : name,
2701 depends : build,
2702 command : [env, 'ln', '-fs',
2703 join_paths(build.full_path(), b),
2704 '@OUTPUT@'],
2705 build_by_default : true)
2706 else
2707 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2708 endif
2709 endif
2710 prev = name
2711
2712 if want_tests != 'false' and slow_tests
2713 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2714 env,
2715 args : [exe.full_path(),
2716 join_paths(meson.source_root(),
2717 'test/fuzz-regressions',
2718 p)])
2719 endif
2720 endforeach
2721 endif
2722 endforeach
2723
2724
2725 ############################################################
2726
2727 if git.found()
2728 all_files = run_command(
2729 git,
2730 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2731 'ls-files',
2732 ':/*.[ch]'])
2733 all_files = files(all_files.stdout().split())
2734
2735 custom_target(
2736 'tags',
2737 output : 'tags',
2738 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2739 custom_target(
2740 'ctags',
2741 output : 'ctags',
2742 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2743 endif
2744
2745 if git.found()
2746 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2747 run_target(
2748 'git-contrib',
2749 command : [meson_git_contrib_sh])
2750 endif
2751
2752 if git.found()
2753 git_head = run_command(
2754 git,
2755 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2756 'rev-parse', 'HEAD']).stdout().strip()
2757 git_head_short = run_command(
2758 git,
2759 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2760 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2761
2762 run_target(
2763 'git-snapshot',
2764 command : ['git', 'archive',
2765 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2766 git_head_short),
2767 '--prefix', 'systemd-@0@/'.format(git_head),
2768 'HEAD'])
2769 endif
2770
2771 ############################################################
2772
2773 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2774 run_target(
2775 'check-api-docs',
2776 depends : [man, libsystemd, libudev],
2777 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2778
2779 ############################################################
2780
2781 status = [
2782 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2783
2784 'split /usr: @0@'.format(split_usr),
2785 'split bin-sbin: @0@'.format(split_bin),
2786 'prefix directory: @0@'.format(prefixdir),
2787 'rootprefix directory: @0@'.format(rootprefixdir),
2788 'sysconf directory: @0@'.format(sysconfdir),
2789 'include directory: @0@'.format(includedir),
2790 'lib directory: @0@'.format(libdir),
2791 'rootlib directory: @0@'.format(rootlibdir),
2792 'SysV init scripts: @0@'.format(sysvinit_path),
2793 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2794 'PAM modules directory: @0@'.format(pamlibdir),
2795 'PAM configuration directory: @0@'.format(pamconfdir),
2796 'RPM macros directory: @0@'.format(rpmmacrosdir),
2797 'modprobe.d directory: @0@'.format(modprobedir),
2798 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2799 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2800 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2801 'bash completions directory: @0@'.format(bashcompletiondir),
2802 'zsh completions directory: @0@'.format(zshcompletiondir),
2803 'extra start script: @0@'.format(get_option('rc-local')),
2804 'extra stop script: @0@'.format(get_option('halt-local')),
2805 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2806 get_option('debug-tty')),
2807 'TTY GID: @0@'.format(tty_gid),
2808 'users GID: @0@'.format(users_gid),
2809 'maximum system UID: @0@'.format(system_uid_max),
2810 'maximum system GID: @0@'.format(system_gid_max),
2811 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2812 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2813 'minimum container UID base: @0@'.format(container_uid_base_min),
2814 'maximum container UID base: @0@'.format(container_uid_base_max),
2815 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2816 'render group access mode: @0@'.format(get_option('group-render-mode')),
2817 'certificate root directory: @0@'.format(get_option('certificate-root')),
2818 'support URL: @0@'.format(support_url),
2819 'nobody user name: @0@'.format(nobody_user),
2820 'nobody group name: @0@'.format(nobody_group),
2821 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2822 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2823
2824 'default DNSSEC mode: @0@'.format(default_dnssec),
2825 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2826 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2827
2828 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2829 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2830 status += [
2831 'default DNS servers: @0@'.format(alt_dns_servers),
2832 'default NTP servers: @0@'.format(alt_ntp_servers)]
2833
2834 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2835 '@@0@'.format(time_epoch)).stdout().strip()
2836 status += [
2837 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2838
2839 # TODO:
2840 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2841 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2842 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2843
2844 if conf.get('ENABLE_EFI') == 1
2845 status += [
2846 'efi arch: @0@'.format(efi_arch)]
2847
2848 if have_gnu_efi
2849 status += [
2850 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2851 'EFI CC @0@'.format(efi_cc),
2852 'EFI lib directory: @0@'.format(efi_libdir),
2853 'EFI lds directory: @0@'.format(efi_ldsdir),
2854 'EFI include directory: @0@'.format(efi_incdir)]
2855 endif
2856 endif
2857
2858 found = []
2859 missing = []
2860
2861 foreach tuple : [
2862 ['libcryptsetup'],
2863 ['PAM'],
2864 ['AUDIT'],
2865 ['IMA'],
2866 ['AppArmor'],
2867 ['SELinux'],
2868 ['SECCOMP'],
2869 ['SMACK'],
2870 ['zlib'],
2871 ['xz'],
2872 ['lz4'],
2873 ['bzip2'],
2874 ['ACL'],
2875 ['gcrypt'],
2876 ['qrencode'],
2877 ['microhttpd'],
2878 ['gnutls'],
2879 ['libcurl'],
2880 ['idn'],
2881 ['libidn2'],
2882 ['libidn'],
2883 ['nss-systemd'],
2884 ['libiptc'],
2885 ['elfutils'],
2886 ['binfmt'],
2887 ['vconsole'],
2888 ['quotacheck'],
2889 ['tmpfiles'],
2890 ['environment.d'],
2891 ['sysusers'],
2892 ['firstboot'],
2893 ['randomseed'],
2894 ['backlight'],
2895 ['rfkill'],
2896 ['logind'],
2897 ['machined'],
2898 ['importd'],
2899 ['hostnamed'],
2900 ['timedated'],
2901 ['timesyncd'],
2902 ['localed'],
2903 ['networkd'],
2904 ['resolve'],
2905 ['coredump'],
2906 ['polkit'],
2907 ['legacy pkla', install_polkit_pkla],
2908 ['efi'],
2909 ['gnu-efi', have_gnu_efi],
2910 ['kmod'],
2911 ['xkbcommon'],
2912 ['pcre2'],
2913 ['blkid'],
2914 ['dbus'],
2915 ['glib'],
2916 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2917 ['hwdb'],
2918 ['tpm'],
2919 ['man pages', want_man],
2920 ['html pages', want_html],
2921 ['man page indices', want_man and have_lxml],
2922 ['SysV compat'],
2923 ['utmp'],
2924 ['ldconfig'],
2925 ['hibernate'],
2926 ['adm group', get_option('adm-group')],
2927 ['wheel group', get_option('wheel-group')],
2928 ['gshadow'],
2929 ['debug hashmap'],
2930 ['debug mmap cache'],
2931 ]
2932
2933 if tuple.length() >= 2
2934 cond = tuple[1]
2935 else
2936 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2937 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2938 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2939 endif
2940 if cond
2941 found += [tuple[0]]
2942 else
2943 missing += [tuple[0]]
2944 endif
2945 endforeach
2946
2947 status += [
2948 '',
2949 'enabled features: @0@'.format(', '.join(found)),
2950 '',
2951 'disabled features: @0@'.format(', '.join(missing)),
2952 '']
2953 message('\n '.join(status))
2954
2955 if rootprefixdir != rootprefix_default
2956 message('WARNING:\n' +
2957 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2958 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2959 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
2960 endif