]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
man: there's no point in referenceing systemd.unit(5) from itself (#8338)
[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 : '237',
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.21.0'
31 libudev_version = '1.6.9'
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_ON_OFF', memory_accounting_default ? 'on' : 'off')
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 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
800
801 dns_servers = get_option('dns-servers')
802 conf.set_quoted('DNS_SERVERS', dns_servers)
803 substs.set('DNS_SERVERS', dns_servers)
804
805 ntp_servers = get_option('ntp-servers')
806 conf.set_quoted('NTP_SERVERS', ntp_servers)
807 substs.set('NTP_SERVERS', ntp_servers)
808
809 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
810
811 substs.set('SUSHELL', get_option('debug-shell'))
812 substs.set('DEBUGTTY', get_option('debug-tty'))
813
814 debug = get_option('debug')
815 enable_debug_hashmap = false
816 enable_debug_mmap_cache = false
817 if debug != ''
818 foreach name : debug.split(',')
819 if name == 'hashmap'
820 enable_debug_hashmap = true
821 elif name == 'mmap-cache'
822 enable_debug_mmap_cache = true
823 else
824 message('unknown debug option "@0@", ignoring'.format(name))
825 endif
826 endforeach
827 endif
828 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
829 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
830
831 #####################################################################
832
833 threads = dependency('threads')
834 librt = cc.find_library('rt')
835 libm = cc.find_library('m')
836 libdl = cc.find_library('dl')
837 libcrypt = cc.find_library('crypt')
838
839 libcap = dependency('libcap', required : false)
840 if not libcap.found()
841 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
842 libcap = cc.find_library('cap')
843 endif
844
845 libmount = dependency('mount',
846 version : '>= 2.30',
847 required : not fuzzer_build)
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 endif
1636
1637 if conf.get('ENABLE_LOGIND') == 1
1638 executable('systemd-logind',
1639 systemd_logind_sources,
1640 include_directories : includes,
1641 link_with : [liblogind_core,
1642 libshared],
1643 dependencies : [threads,
1644 libacl],
1645 install_rpath : rootlibexecdir,
1646 install : true,
1647 install_dir : rootlibexecdir)
1648
1649 exe = executable('loginctl',
1650 loginctl_sources,
1651 include_directories : includes,
1652 link_with : [libshared],
1653 dependencies : [threads,
1654 liblz4,
1655 libxz],
1656 install_rpath : rootlibexecdir,
1657 install : true,
1658 install_dir : rootbindir)
1659 public_programs += [exe]
1660
1661 exe = executable('systemd-inhibit',
1662 'src/login/inhibit.c',
1663 include_directories : includes,
1664 link_with : [libshared],
1665 install_rpath : rootlibexecdir,
1666 install : true,
1667 install_dir : rootbindir)
1668 public_programs += [exe]
1669
1670 if conf.get('HAVE_PAM') == 1
1671 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1672 pam_systemd = shared_library(
1673 'pam_systemd',
1674 pam_systemd_c,
1675 name_prefix : '',
1676 include_directories : includes,
1677 link_args : ['-shared',
1678 '-Wl,--version-script=' + version_script_arg],
1679 link_with : [libsystemd_static,
1680 libshared_static],
1681 dependencies : [threads,
1682 libpam,
1683 libpam_misc],
1684 link_depends : pam_systemd_sym,
1685 install : true,
1686 install_dir : pamlibdir)
1687
1688 test('dlopen-pam_systemd',
1689 test_dlopen,
1690 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1691 endif
1692 endif
1693
1694 if conf.get('HAVE_PAM') == 1
1695 executable('systemd-user-sessions',
1696 'src/user-sessions/user-sessions.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 install_rpath : rootlibexecdir,
1700 install : true,
1701 install_dir : rootlibexecdir)
1702 endif
1703
1704 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1705 exe = executable('bootctl',
1706 'src/boot/bootctl.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 dependencies : [libblkid],
1710 install_rpath : rootlibexecdir,
1711 install : true)
1712 public_programs += [exe]
1713 endif
1714
1715 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1716 include_directories : includes,
1717 link_with : [libshared],
1718 dependencies : [threads],
1719 install_rpath : rootlibexecdir,
1720 install : true)
1721 public_programs += [exe]
1722
1723 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1724 include_directories : includes,
1725 link_with : [libshared],
1726 dependencies : [threads,
1727 libcap,
1728 libselinux,
1729 libxz,
1730 liblz4],
1731 install_rpath : rootlibexecdir,
1732 install : true,
1733 install_dir : rootbindir)
1734 public_programs += [exe]
1735
1736 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1737 meson.add_install_script(meson_make_symlink,
1738 join_paths(rootbindir, 'systemctl'),
1739 join_paths(rootsbindir, alias))
1740 endforeach
1741
1742 if conf.get('ENABLE_BACKLIGHT') == 1
1743 executable('systemd-backlight',
1744 'src/backlight/backlight.c',
1745 include_directories : includes,
1746 link_with : [libshared],
1747 install_rpath : rootlibexecdir,
1748 install : true,
1749 install_dir : rootlibexecdir)
1750 endif
1751
1752 if conf.get('ENABLE_RFKILL') == 1
1753 executable('systemd-rfkill',
1754 'src/rfkill/rfkill.c',
1755 include_directories : includes,
1756 link_with : [libshared],
1757 install_rpath : rootlibexecdir,
1758 install : true,
1759 install_dir : rootlibexecdir)
1760 endif
1761
1762 executable('systemd-system-update-generator',
1763 'src/system-update-generator/system-update-generator.c',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 install_rpath : rootlibexecdir,
1767 install : true,
1768 install_dir : systemgeneratordir)
1769
1770 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1771 executable('systemd-cryptsetup',
1772 'src/cryptsetup/cryptsetup.c',
1773 include_directories : includes,
1774 link_with : [libshared],
1775 dependencies : [libcryptsetup],
1776 install_rpath : rootlibexecdir,
1777 install : true,
1778 install_dir : rootlibexecdir)
1779
1780 executable('systemd-cryptsetup-generator',
1781 'src/cryptsetup/cryptsetup-generator.c',
1782 include_directories : includes,
1783 link_with : [libshared],
1784 dependencies : [libcryptsetup],
1785 install_rpath : rootlibexecdir,
1786 install : true,
1787 install_dir : systemgeneratordir)
1788
1789 executable('systemd-veritysetup',
1790 'src/veritysetup/veritysetup.c',
1791 include_directories : includes,
1792 link_with : [libshared],
1793 dependencies : [libcryptsetup],
1794 install_rpath : rootlibexecdir,
1795 install : true,
1796 install_dir : rootlibexecdir)
1797
1798 executable('systemd-veritysetup-generator',
1799 'src/veritysetup/veritysetup-generator.c',
1800 include_directories : includes,
1801 link_with : [libshared],
1802 dependencies : [libcryptsetup],
1803 install_rpath : rootlibexecdir,
1804 install : true,
1805 install_dir : systemgeneratordir)
1806 endif
1807
1808 if conf.get('HAVE_SYSV_COMPAT') == 1
1809 executable('systemd-sysv-generator',
1810 'src/sysv-generator/sysv-generator.c',
1811 include_directories : includes,
1812 link_with : [libshared],
1813 install_rpath : rootlibexecdir,
1814 install : true,
1815 install_dir : systemgeneratordir)
1816
1817 executable('systemd-rc-local-generator',
1818 'src/rc-local-generator/rc-local-generator.c',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 install_rpath : rootlibexecdir,
1822 install : true,
1823 install_dir : systemgeneratordir)
1824 endif
1825
1826 if conf.get('ENABLE_HOSTNAMED') == 1
1827 executable('systemd-hostnamed',
1828 'src/hostname/hostnamed.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 install_rpath : rootlibexecdir,
1832 install : true,
1833 install_dir : rootlibexecdir)
1834
1835 exe = executable('hostnamectl',
1836 'src/hostname/hostnamectl.c',
1837 include_directories : includes,
1838 link_with : [libshared],
1839 install_rpath : rootlibexecdir,
1840 install : true)
1841 public_programs += [exe]
1842 endif
1843
1844 if conf.get('ENABLE_LOCALED') == 1
1845 if conf.get('HAVE_XKBCOMMON') == 1
1846 # logind will load libxkbcommon.so dynamically on its own
1847 deps = [libdl]
1848 else
1849 deps = []
1850 endif
1851
1852 executable('systemd-localed',
1853 systemd_localed_sources,
1854 include_directories : includes,
1855 link_with : [libshared],
1856 dependencies : deps,
1857 install_rpath : rootlibexecdir,
1858 install : true,
1859 install_dir : rootlibexecdir)
1860
1861 exe = executable('localectl',
1862 localectl_sources,
1863 include_directories : includes,
1864 link_with : [libshared],
1865 install_rpath : rootlibexecdir,
1866 install : true)
1867 public_programs += [exe]
1868 endif
1869
1870 if conf.get('ENABLE_TIMEDATED') == 1
1871 executable('systemd-timedated',
1872 'src/timedate/timedated.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 install_rpath : rootlibexecdir,
1876 install : true,
1877 install_dir : rootlibexecdir)
1878
1879 exe = executable('timedatectl',
1880 'src/timedate/timedatectl.c',
1881 include_directories : includes,
1882 install_rpath : rootlibexecdir,
1883 link_with : [libshared],
1884 install : true)
1885 public_programs += [exe]
1886 endif
1887
1888 if conf.get('ENABLE_TIMESYNCD') == 1
1889 executable('systemd-timesyncd',
1890 systemd_timesyncd_sources,
1891 include_directories : includes,
1892 link_with : [libshared],
1893 dependencies : [threads,
1894 libm],
1895 install_rpath : rootlibexecdir,
1896 install : true,
1897 install_dir : rootlibexecdir)
1898 endif
1899
1900 if conf.get('ENABLE_MACHINED') == 1
1901 executable('systemd-machined',
1902 systemd_machined_sources,
1903 include_directories : includes,
1904 link_with : [libmachine_core,
1905 libshared],
1906 install_rpath : rootlibexecdir,
1907 install : true,
1908 install_dir : rootlibexecdir)
1909
1910 exe = executable('machinectl',
1911 'src/machine/machinectl.c',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 dependencies : [threads,
1915 libxz,
1916 liblz4],
1917 install_rpath : rootlibexecdir,
1918 install : true,
1919 install_dir : rootbindir)
1920 public_programs += [exe]
1921 endif
1922
1923 if conf.get('ENABLE_IMPORTD') == 1
1924 executable('systemd-importd',
1925 systemd_importd_sources,
1926 include_directories : includes,
1927 link_with : [libshared],
1928 dependencies : [threads],
1929 install_rpath : rootlibexecdir,
1930 install : true,
1931 install_dir : rootlibexecdir)
1932
1933 systemd_pull = executable('systemd-pull',
1934 systemd_pull_sources,
1935 include_directories : includes,
1936 link_with : [libshared],
1937 dependencies : [libcurl,
1938 libz,
1939 libbzip2,
1940 libxz,
1941 libgcrypt],
1942 install_rpath : rootlibexecdir,
1943 install : true,
1944 install_dir : rootlibexecdir)
1945
1946 systemd_import = executable('systemd-import',
1947 systemd_import_sources,
1948 include_directories : includes,
1949 link_with : [libshared],
1950 dependencies : [libcurl,
1951 libz,
1952 libbzip2,
1953 libxz],
1954 install_rpath : rootlibexecdir,
1955 install : true,
1956 install_dir : rootlibexecdir)
1957
1958 systemd_export = executable('systemd-export',
1959 systemd_export_sources,
1960 include_directories : includes,
1961 link_with : [libshared],
1962 dependencies : [libcurl,
1963 libz,
1964 libbzip2,
1965 libxz],
1966 install_rpath : rootlibexecdir,
1967 install : true,
1968 install_dir : rootlibexecdir)
1969 public_programs += [systemd_pull, systemd_import, systemd_export]
1970 endif
1971
1972 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1973 exe = executable('systemd-journal-upload',
1974 systemd_journal_upload_sources,
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [threads,
1978 libcurl,
1979 libgnutls,
1980 libxz,
1981 liblz4],
1982 install_rpath : rootlibexecdir,
1983 install : true,
1984 install_dir : rootlibexecdir)
1985 public_programs += [exe]
1986 endif
1987
1988 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1989 s_j_remote = executable('systemd-journal-remote',
1990 systemd_journal_remote_sources,
1991 include_directories : includes,
1992 link_with : [libshared],
1993 dependencies : [threads,
1994 libmicrohttpd,
1995 libgnutls,
1996 libxz,
1997 liblz4],
1998 install_rpath : rootlibexecdir,
1999 install : true,
2000 install_dir : rootlibexecdir)
2001
2002 s_j_gatewayd = executable('systemd-journal-gatewayd',
2003 systemd_journal_gatewayd_sources,
2004 include_directories : includes,
2005 link_with : [libshared],
2006 dependencies : [threads,
2007 libmicrohttpd,
2008 libgnutls,
2009 libxz,
2010 liblz4],
2011 install_rpath : rootlibexecdir,
2012 install : true,
2013 install_dir : rootlibexecdir)
2014 public_programs += [s_j_remote, s_j_gatewayd]
2015 endif
2016
2017 if conf.get('ENABLE_COREDUMP') == 1
2018 executable('systemd-coredump',
2019 systemd_coredump_sources,
2020 include_directories : includes,
2021 link_with : [libshared],
2022 dependencies : [threads,
2023 libacl,
2024 libdw,
2025 libxz,
2026 liblz4],
2027 install_rpath : rootlibexecdir,
2028 install : true,
2029 install_dir : rootlibexecdir)
2030
2031 exe = executable('coredumpctl',
2032 coredumpctl_sources,
2033 include_directories : includes,
2034 link_with : [libshared],
2035 dependencies : [threads,
2036 libxz,
2037 liblz4],
2038 install_rpath : rootlibexecdir,
2039 install : true)
2040 public_programs += [exe]
2041 endif
2042
2043 if conf.get('ENABLE_BINFMT') == 1
2044 exe = executable('systemd-binfmt',
2045 'src/binfmt/binfmt.c',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2049 install : true,
2050 install_dir : rootlibexecdir)
2051 public_programs += [exe]
2052
2053 meson.add_install_script('sh', '-c',
2054 mkdir_p.format(binfmtdir))
2055 meson.add_install_script('sh', '-c',
2056 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2057 endif
2058
2059 if conf.get('ENABLE_VCONSOLE') == 1
2060 executable('systemd-vconsole-setup',
2061 'src/vconsole/vconsole-setup.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 install_rpath : rootlibexecdir,
2065 install : true,
2066 install_dir : rootlibexecdir)
2067 endif
2068
2069 if conf.get('ENABLE_RANDOMSEED') == 1
2070 executable('systemd-random-seed',
2071 'src/random-seed/random-seed.c',
2072 include_directories : includes,
2073 link_with : [libshared],
2074 install_rpath : rootlibexecdir,
2075 install : true,
2076 install_dir : rootlibexecdir)
2077 endif
2078
2079 if conf.get('ENABLE_FIRSTBOOT') == 1
2080 executable('systemd-firstboot',
2081 'src/firstboot/firstboot.c',
2082 include_directories : includes,
2083 link_with : [libshared],
2084 dependencies : [libcrypt],
2085 install_rpath : rootlibexecdir,
2086 install : true,
2087 install_dir : rootbindir)
2088 endif
2089
2090 executable('systemd-remount-fs',
2091 'src/remount-fs/remount-fs.c',
2092 'src/core/mount-setup.c',
2093 'src/core/mount-setup.h',
2094 include_directories : includes,
2095 link_with : [libshared],
2096 install_rpath : rootlibexecdir,
2097 install : true,
2098 install_dir : rootlibexecdir)
2099
2100 executable('systemd-machine-id-setup',
2101 'src/machine-id-setup/machine-id-setup-main.c',
2102 'src/core/machine-id-setup.c',
2103 'src/core/machine-id-setup.h',
2104 include_directories : includes,
2105 link_with : [libshared],
2106 install_rpath : rootlibexecdir,
2107 install : true,
2108 install_dir : rootbindir)
2109
2110 executable('systemd-fsck',
2111 'src/fsck/fsck.c',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 install_rpath : rootlibexecdir,
2115 install : true,
2116 install_dir : rootlibexecdir)
2117
2118 executable('systemd-growfs',
2119 'src/partition/growfs.c',
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [libcryptsetup],
2123 install_rpath : rootlibexecdir,
2124 install : true,
2125 install_dir : rootlibexecdir)
2126
2127 executable('systemd-makefs',
2128 'src/partition/makefs.c',
2129 include_directories : includes,
2130 link_with : [libshared],
2131 install_rpath : rootlibexecdir,
2132 install : true,
2133 install_dir : rootlibexecdir)
2134
2135 executable('systemd-sleep',
2136 'src/sleep/sleep.c',
2137 include_directories : includes,
2138 link_with : [libshared],
2139 install_rpath : rootlibexecdir,
2140 install : true,
2141 install_dir : rootlibexecdir)
2142
2143 exe = executable('systemd-sysctl',
2144 'src/sysctl/sysctl.c',
2145 include_directories : includes,
2146 link_with : [libshared],
2147 install_rpath : rootlibexecdir,
2148 install : true,
2149 install_dir : rootlibexecdir)
2150 public_programs += [exe]
2151
2152 executable('systemd-ac-power',
2153 'src/ac-power/ac-power.c',
2154 include_directories : includes,
2155 link_with : [libshared],
2156 install_rpath : rootlibexecdir,
2157 install : true,
2158 install_dir : rootlibexecdir)
2159
2160 exe = executable('systemd-detect-virt',
2161 'src/detect-virt/detect-virt.c',
2162 include_directories : includes,
2163 link_with : [libshared],
2164 install_rpath : rootlibexecdir,
2165 install : true)
2166 public_programs += [exe]
2167
2168 exe = executable('systemd-delta',
2169 'src/delta/delta.c',
2170 include_directories : includes,
2171 link_with : [libshared],
2172 install_rpath : rootlibexecdir,
2173 install : true)
2174 public_programs += [exe]
2175
2176 exe = executable('systemd-escape',
2177 'src/escape/escape.c',
2178 include_directories : includes,
2179 link_with : [libshared],
2180 install_rpath : rootlibexecdir,
2181 install : true,
2182 install_dir : rootbindir)
2183 public_programs += [exe]
2184
2185 exe = executable('systemd-notify',
2186 'src/notify/notify.c',
2187 include_directories : includes,
2188 link_with : [libshared],
2189 install_rpath : rootlibexecdir,
2190 install : true,
2191 install_dir : rootbindir)
2192 public_programs += [exe]
2193
2194 executable('systemd-volatile-root',
2195 'src/volatile-root/volatile-root.c',
2196 include_directories : includes,
2197 link_with : [libshared],
2198 install_rpath : rootlibexecdir,
2199 install : true,
2200 install_dir : rootlibexecdir)
2201
2202 executable('systemd-cgroups-agent',
2203 'src/cgroups-agent/cgroups-agent.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2207 install : true,
2208 install_dir : rootlibexecdir)
2209
2210 exe = executable('systemd-path',
2211 'src/path/path.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2215 install : true)
2216 public_programs += [exe]
2217
2218 exe = executable('systemd-ask-password',
2219 'src/ask-password/ask-password.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2223 install : true,
2224 install_dir : rootbindir)
2225 public_programs += [exe]
2226
2227 executable('systemd-reply-password',
2228 'src/reply-password/reply-password.c',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2232 install : true,
2233 install_dir : rootlibexecdir)
2234
2235 exe = executable('systemd-tty-ask-password-agent',
2236 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2237 include_directories : includes,
2238 link_with : [libshared],
2239 install_rpath : rootlibexecdir,
2240 install : true,
2241 install_dir : rootbindir)
2242 public_programs += [exe]
2243
2244 exe = executable('systemd-cgls',
2245 'src/cgls/cgls.c',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 install_rpath : rootlibexecdir,
2249 install : true)
2250 public_programs += [exe]
2251
2252 exe = executable('systemd-cgtop',
2253 'src/cgtop/cgtop.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 install_rpath : rootlibexecdir,
2257 install : true)
2258 public_programs += [exe]
2259
2260 executable('systemd-initctl',
2261 'src/initctl/initctl.c',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 install_rpath : rootlibexecdir,
2265 install : true,
2266 install_dir : rootlibexecdir)
2267
2268 exe = executable('systemd-mount',
2269 'src/mount/mount-tool.c',
2270 include_directories : includes,
2271 link_with : [libshared],
2272 install_rpath : rootlibexecdir,
2273 install : true)
2274 public_programs += [exe]
2275
2276 meson.add_install_script(meson_make_symlink,
2277 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2278
2279 exe = executable('systemd-run',
2280 'src/run/run.c',
2281 include_directories : includes,
2282 link_with : [libshared],
2283 install_rpath : rootlibexecdir,
2284 install : true)
2285 public_programs += [exe]
2286
2287 exe = executable('systemd-stdio-bridge',
2288 'src/stdio-bridge/stdio-bridge.c',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 install_rpath : rootlibexecdir,
2292 install : true)
2293 public_programs += [exe]
2294
2295 exe = executable('busctl',
2296 'src/busctl/busctl.c',
2297 'src/busctl/busctl-introspect.c',
2298 'src/busctl/busctl-introspect.h',
2299 include_directories : includes,
2300 link_with : [libshared],
2301 install_rpath : rootlibexecdir,
2302 install : true)
2303 public_programs += [exe]
2304
2305 if conf.get('ENABLE_SYSUSERS') == 1
2306 exe = executable('systemd-sysusers',
2307 'src/sysusers/sysusers.c',
2308 include_directories : includes,
2309 link_with : [libshared],
2310 install_rpath : rootlibexecdir,
2311 install : true,
2312 install_dir : rootbindir)
2313 public_programs += [exe]
2314 endif
2315
2316 if conf.get('ENABLE_TMPFILES') == 1
2317 exe = executable('systemd-tmpfiles',
2318 'src/tmpfiles/tmpfiles.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 dependencies : [libacl],
2322 install_rpath : rootlibexecdir,
2323 install : true,
2324 install_dir : rootbindir)
2325 public_programs += [exe]
2326
2327 test('test-systemd-tmpfiles',
2328 test_systemd_tmpfiles_py,
2329 args : exe.full_path())
2330 # https://github.com/mesonbuild/meson/issues/2681
2331 endif
2332
2333 if conf.get('ENABLE_HWDB') == 1
2334 exe = executable('systemd-hwdb',
2335 'src/hwdb/hwdb.c',
2336 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2337 include_directories : includes,
2338 link_with : [libudev_static],
2339 install_rpath : udev_rpath,
2340 install : true,
2341 install_dir : rootbindir)
2342 public_programs += [exe]
2343 endif
2344
2345 if conf.get('ENABLE_QUOTACHECK') == 1
2346 executable('systemd-quotacheck',
2347 'src/quotacheck/quotacheck.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2351 install : true,
2352 install_dir : rootlibexecdir)
2353 endif
2354
2355 exe = executable('systemd-socket-proxyd',
2356 'src/socket-proxy/socket-proxyd.c',
2357 include_directories : includes,
2358 link_with : [libshared],
2359 dependencies : [threads],
2360 install_rpath : rootlibexecdir,
2361 install : true,
2362 install_dir : rootlibexecdir)
2363 public_programs += [exe]
2364
2365 exe = executable('systemd-udevd',
2366 systemd_udevd_sources,
2367 include_directories : includes,
2368 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2369 link_with : [libudev_core,
2370 libsystemd_network,
2371 libudev_static],
2372 dependencies : [threads,
2373 libkmod,
2374 libidn,
2375 libacl,
2376 libblkid],
2377 install_rpath : udev_rpath,
2378 install : true,
2379 install_dir : rootlibexecdir)
2380 public_programs += [exe]
2381
2382 exe = executable('udevadm',
2383 udevadm_sources,
2384 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2385 include_directories : includes,
2386 link_with : [libudev_core,
2387 libsystemd_network,
2388 libudev_static],
2389 dependencies : [threads,
2390 libkmod,
2391 libidn,
2392 libacl,
2393 libblkid],
2394 install_rpath : udev_rpath,
2395 install : true,
2396 install_dir : rootbindir)
2397 public_programs += [exe]
2398
2399 executable('systemd-shutdown',
2400 systemd_shutdown_sources,
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2404 install : true,
2405 install_dir : rootlibexecdir)
2406
2407 executable('systemd-update-done',
2408 'src/update-done/update-done.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2412 install : true,
2413 install_dir : rootlibexecdir)
2414
2415 executable('systemd-update-utmp',
2416 'src/update-utmp/update-utmp.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 dependencies : [libaudit],
2420 install_rpath : rootlibexecdir,
2421 install : true,
2422 install_dir : rootlibexecdir)
2423
2424 if conf.get('HAVE_KMOD') == 1
2425 executable('systemd-modules-load',
2426 'src/modules-load/modules-load.c',
2427 include_directories : includes,
2428 link_with : [libshared],
2429 dependencies : [libkmod],
2430 install_rpath : rootlibexecdir,
2431 install : true,
2432 install_dir : rootlibexecdir)
2433
2434 meson.add_install_script('sh', '-c',
2435 mkdir_p.format(modulesloaddir))
2436 meson.add_install_script('sh', '-c',
2437 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2438 endif
2439
2440 exe = executable('systemd-nspawn',
2441 systemd_nspawn_sources,
2442 'src/core/mount-setup.c', # FIXME: use a variable?
2443 'src/core/mount-setup.h',
2444 'src/core/loopback-setup.c',
2445 'src/core/loopback-setup.h',
2446 include_directories : [includes, include_directories('src/nspawn')],
2447 link_with : [libshared],
2448 dependencies : [libacl,
2449 libblkid,
2450 libseccomp,
2451 libselinux],
2452 install_rpath : rootlibexecdir,
2453 install : true)
2454 public_programs += [exe]
2455
2456 if conf.get('ENABLE_NETWORKD') == 1
2457 executable('systemd-networkd',
2458 systemd_networkd_sources,
2459 include_directories : includes,
2460 link_with : [libnetworkd_core,
2461 libsystemd_network,
2462 libudev_static,
2463 libshared],
2464 dependencies : [threads],
2465 install_rpath : rootlibexecdir,
2466 install : true,
2467 install_dir : rootlibexecdir)
2468
2469 executable('systemd-networkd-wait-online',
2470 systemd_networkd_wait_online_sources,
2471 include_directories : includes,
2472 link_with : [libnetworkd_core,
2473 libshared],
2474 install_rpath : rootlibexecdir,
2475 install : true,
2476 install_dir : rootlibexecdir)
2477
2478 exe = executable('networkctl',
2479 networkctl_sources,
2480 include_directories : includes,
2481 link_with : [libsystemd_network,
2482 libshared],
2483 install_rpath : rootlibexecdir,
2484 install : true,
2485 install_dir : rootbindir)
2486 public_programs += [exe]
2487 endif
2488
2489 executable('systemd-sulogin-shell',
2490 ['src/sulogin-shell/sulogin-shell.c'],
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2494 install : true,
2495 install_dir : rootlibexecdir)
2496
2497 ############################################################
2498
2499 foreach tuple : tests
2500 sources = tuple[0]
2501 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2502 dependencies = tuple[2]
2503 condition = tuple.length() >= 4 ? tuple[3] : ''
2504 type = tuple.length() >= 5 ? tuple[4] : ''
2505 defs = tuple.length() >= 6 ? tuple[5] : []
2506 incs = tuple.length() >= 7 ? tuple[6] : includes
2507 timeout = 30
2508
2509 name = sources[0].split('/')[-1].split('.')[0]
2510 if type.startswith('timeout=')
2511 timeout = type.split('=')[1].to_int()
2512 type = ''
2513 endif
2514 if want_tests == 'false'
2515 message('Not compiling @0@ because tests is set to false'.format(name))
2516 elif condition == '' or conf.get(condition) == 1
2517 exe = executable(
2518 name,
2519 sources,
2520 include_directories : incs,
2521 link_with : link_with,
2522 dependencies : dependencies,
2523 c_args : defs,
2524 install_rpath : rootlibexecdir,
2525 install : install_tests,
2526 install_dir : join_paths(testsdir, type))
2527
2528 if type == 'manual'
2529 message('@0@ is a manual test'.format(name))
2530 elif type == 'unsafe' and want_tests != 'unsafe'
2531 message('@0@ is an unsafe test'.format(name))
2532 else
2533 test(name, exe,
2534 env : test_env,
2535 timeout : timeout)
2536 endif
2537 else
2538 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2539 endif
2540 endforeach
2541
2542 test_libsystemd_sym = executable(
2543 'test-libsystemd-sym',
2544 test_libsystemd_sym_c,
2545 include_directories : includes,
2546 link_with : [libsystemd],
2547 install : install_tests,
2548 install_dir : testsdir)
2549 test('test-libsystemd-sym',
2550 test_libsystemd_sym)
2551
2552 test_libudev_sym = executable(
2553 'test-libudev-sym',
2554 test_libudev_sym_c,
2555 include_directories : includes,
2556 c_args : ['-Wno-deprecated-declarations'],
2557 link_with : [libudev],
2558 install : install_tests,
2559 install_dir : testsdir)
2560 test('test-libudev-sym',
2561 test_libudev_sym)
2562
2563 ############################################################
2564
2565 fuzzer_exes = []
2566
2567 foreach tuple : fuzzers
2568 sources = tuple[0]
2569 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2570 dependencies = tuple[2]
2571 defs = tuple.length() >= 4 ? tuple[3] : []
2572 incs = tuple.length() >= 5 ? tuple[4] : includes
2573
2574 if fuzzer_build
2575 dependencies += fuzzing_engine
2576 else
2577 sources += 'src/fuzz/fuzz-main.c'
2578 endif
2579
2580 name = sources[0].split('/')[-1].split('.')[0]
2581
2582 fuzzer_exes += executable(
2583 name,
2584 sources,
2585 include_directories : [incs, include_directories('src/fuzz')],
2586 link_with : link_with,
2587 dependencies : dependencies,
2588 c_args : defs,
2589 install : false)
2590 endforeach
2591
2592 run_target('fuzzers',
2593 depends : fuzzer_exes,
2594 command : ['true'])
2595
2596 ############################################################
2597
2598 make_directive_index_py = find_program('tools/make-directive-index.py')
2599 make_man_index_py = find_program('tools/make-man-index.py')
2600 xml_helper_py = find_program('tools/xml_helper.py')
2601 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2602
2603 subdir('units')
2604 subdir('sysctl.d')
2605 subdir('sysusers.d')
2606 subdir('tmpfiles.d')
2607 subdir('presets')
2608 subdir('hwdb')
2609 subdir('network')
2610 subdir('man')
2611 subdir('shell-completion/bash')
2612 subdir('shell-completion/zsh')
2613 subdir('docs/sysvinit')
2614 subdir('docs/var-log')
2615
2616 # FIXME: figure out if the warning is true:
2617 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2618 install_subdir('factory/etc',
2619 install_dir : factorydir)
2620
2621
2622 install_data('xorg/50-systemd-user.sh',
2623 install_dir : xinitrcdir)
2624 install_data('modprobe.d/systemd.conf',
2625 install_dir : modprobedir)
2626 install_data('LICENSE.GPL2',
2627 'LICENSE.LGPL2.1',
2628 'NEWS',
2629 'README',
2630 'doc/CODING_STYLE',
2631 'doc/DISTRO_PORTING',
2632 'doc/ENVIRONMENT.md',
2633 'doc/HACKING',
2634 'doc/TRANSIENT-SETTINGS.md',
2635 'doc/TRANSLATORS',
2636 'doc/UIDS-GIDS.md',
2637 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2638 install_dir : docdir)
2639
2640 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2641 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2642
2643 ############################################################
2644
2645 meson_check_help = find_program('tools/meson-check-help.sh')
2646
2647 foreach exec : public_programs
2648 name = exec.full_path().split('/')[-1]
2649 test('check-help-' + name,
2650 meson_check_help,
2651 args : [exec.full_path()])
2652 endforeach
2653
2654 ############################################################
2655
2656 prev = ''
2657 foreach p : fuzz_regression_tests
2658 a = p.split('/')[-3]
2659 b = p.split('/')[-2]
2660 c = p.split('/')[-1]
2661
2662 if a == 'address'
2663 build = sanitize_address
2664 else
2665 error('unknown sanitizer @0@'.format(a))
2666 endif
2667
2668 name = '@1@:@0@'.format(a, b)
2669
2670 if name != prev
2671 if want_tests == 'false'
2672 message('Not compiling @0@ because tests is set to false'.format(name))
2673 elif not sanitizers.contains(a)
2674 message('Not compiling @0@ because @1@ sanitizer is not available'.format(name, a))
2675 elif slow_tests
2676 exe = custom_target(
2677 name,
2678 output : name,
2679 depends : build,
2680 command : [env, 'ln', '-fs',
2681 join_paths(build.full_path(), b),
2682 '@OUTPUT@'],
2683 build_by_default : true)
2684 else
2685 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2686 endif
2687 endif
2688 prev = name
2689
2690 if want_tests != 'false' and slow_tests
2691 test(c, env, args : [exe.full_path(),
2692 join_paths(meson.source_root(),
2693 'test/fuzz-regressions',
2694 p)])
2695 endif
2696 endforeach
2697
2698 ############################################################
2699
2700 if git.found()
2701 all_files = run_command(
2702 git,
2703 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2704 'ls-files',
2705 ':/*.[ch]'])
2706 all_files = files(all_files.stdout().split())
2707
2708 custom_target(
2709 'tags',
2710 output : 'tags',
2711 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2712 custom_target(
2713 'ctags',
2714 output : 'ctags',
2715 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2716 endif
2717
2718 if git.found()
2719 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2720 run_target(
2721 'git-contrib',
2722 command : [meson_git_contrib_sh])
2723 endif
2724
2725 if git.found()
2726 git_head = run_command(
2727 git,
2728 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2729 'rev-parse', 'HEAD']).stdout().strip()
2730 git_head_short = run_command(
2731 git,
2732 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2733 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2734
2735 run_target(
2736 'git-snapshot',
2737 command : ['git', 'archive',
2738 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2739 git_head_short),
2740 '--prefix', 'systemd-@0@/'.format(git_head),
2741 'HEAD'])
2742 endif
2743
2744 ############################################################
2745
2746 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2747 run_target(
2748 'check-api-docs',
2749 depends : [man, libsystemd, libudev],
2750 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2751
2752 ############################################################
2753
2754 status = [
2755 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2756
2757 'split /usr: @0@'.format(split_usr),
2758 'split bin-sbin: @0@'.format(split_bin),
2759 'prefix directory: @0@'.format(prefixdir),
2760 'rootprefix directory: @0@'.format(rootprefixdir),
2761 'sysconf directory: @0@'.format(sysconfdir),
2762 'include directory: @0@'.format(includedir),
2763 'lib directory: @0@'.format(libdir),
2764 'rootlib directory: @0@'.format(rootlibdir),
2765 'SysV init scripts: @0@'.format(sysvinit_path),
2766 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2767 'PAM modules directory: @0@'.format(pamlibdir),
2768 'PAM configuration directory: @0@'.format(pamconfdir),
2769 'RPM macros directory: @0@'.format(rpmmacrosdir),
2770 'modprobe.d directory: @0@'.format(modprobedir),
2771 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2772 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2773 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2774 'bash completions directory: @0@'.format(bashcompletiondir),
2775 'zsh completions directory: @0@'.format(zshcompletiondir),
2776 'extra start script: @0@'.format(get_option('rc-local')),
2777 'extra stop script: @0@'.format(get_option('halt-local')),
2778 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2779 get_option('debug-tty')),
2780 'TTY GID: @0@'.format(tty_gid),
2781 'users GID: @0@'.format(users_gid),
2782 'maximum system UID: @0@'.format(system_uid_max),
2783 'maximum system GID: @0@'.format(system_gid_max),
2784 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2785 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2786 'minimum container UID base: @0@'.format(container_uid_base_min),
2787 'maximum container UID base: @0@'.format(container_uid_base_max),
2788 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2789 'render group access mode: @0@'.format(get_option('group-render-mode')),
2790 'certificate root directory: @0@'.format(get_option('certificate-root')),
2791 'support URL: @0@'.format(support_url),
2792 'nobody user name: @0@'.format(nobody_user),
2793 'nobody group name: @0@'.format(nobody_group),
2794 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2795 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2796
2797 'default DNSSEC mode: @0@'.format(default_dnssec),
2798 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2799 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2800
2801 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2802 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2803 status += [
2804 'default DNS servers: @0@'.format(alt_dns_servers),
2805 'default NTP servers: @0@'.format(alt_ntp_servers)]
2806
2807 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2808 '@@0@'.format(time_epoch)).stdout().strip()
2809 status += [
2810 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2811
2812 # TODO:
2813 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2814 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2815 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2816
2817 if conf.get('ENABLE_EFI') == 1
2818 status += [
2819 'efi arch: @0@'.format(efi_arch)]
2820
2821 if have_gnu_efi
2822 status += [
2823 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2824 'EFI CC @0@'.format(efi_cc),
2825 'EFI lib directory: @0@'.format(efi_libdir),
2826 'EFI lds directory: @0@'.format(efi_ldsdir),
2827 'EFI include directory: @0@'.format(efi_incdir)]
2828 endif
2829 endif
2830
2831 found = []
2832 missing = []
2833
2834 foreach tuple : [
2835 ['libcryptsetup'],
2836 ['PAM'],
2837 ['AUDIT'],
2838 ['IMA'],
2839 ['AppArmor'],
2840 ['SELinux'],
2841 ['SECCOMP'],
2842 ['SMACK'],
2843 ['zlib'],
2844 ['xz'],
2845 ['lz4'],
2846 ['bzip2'],
2847 ['ACL'],
2848 ['gcrypt'],
2849 ['qrencode'],
2850 ['microhttpd'],
2851 ['gnutls'],
2852 ['libcurl'],
2853 ['idn'],
2854 ['libidn2'],
2855 ['libidn'],
2856 ['nss-systemd'],
2857 ['libiptc'],
2858 ['elfutils'],
2859 ['binfmt'],
2860 ['vconsole'],
2861 ['quotacheck'],
2862 ['tmpfiles'],
2863 ['environment.d'],
2864 ['sysusers'],
2865 ['firstboot'],
2866 ['randomseed'],
2867 ['backlight'],
2868 ['rfkill'],
2869 ['logind'],
2870 ['machined'],
2871 ['importd'],
2872 ['hostnamed'],
2873 ['timedated'],
2874 ['timesyncd'],
2875 ['localed'],
2876 ['networkd'],
2877 ['resolve'],
2878 ['coredump'],
2879 ['polkit'],
2880 ['legacy pkla', install_polkit_pkla],
2881 ['efi'],
2882 ['gnu-efi', have_gnu_efi],
2883 ['kmod'],
2884 ['xkbcommon'],
2885 ['pcre2'],
2886 ['blkid'],
2887 ['dbus'],
2888 ['glib'],
2889 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2890 ['hwdb'],
2891 ['tpm'],
2892 ['man pages', want_man],
2893 ['html pages', want_html],
2894 ['man page indices', want_man and have_lxml],
2895 ['SysV compat'],
2896 ['utmp'],
2897 ['ldconfig'],
2898 ['hibernate'],
2899 ['adm group', get_option('adm-group')],
2900 ['wheel group', get_option('wheel-group')],
2901 ['gshadow'],
2902 ['debug hashmap'],
2903 ['debug mmap cache'],
2904 ]
2905
2906 cond = tuple.get(1, '')
2907 if cond == ''
2908 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2909 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2910 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2911 endif
2912 if cond
2913 found += [tuple[0]]
2914 else
2915 missing += [tuple[0]]
2916 endif
2917 endforeach
2918
2919 status += [
2920 '',
2921 'enabled features: @0@'.format(', '.join(found)),
2922 '',
2923 'disabled features: @0@'.format(', '.join(missing)),
2924 '']
2925 message('\n '.join(status))
2926
2927 if rootprefixdir != rootprefix_default
2928 message('WARNING:\n' +
2929 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2930 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2931 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
2932 endif