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