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