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