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