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