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