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