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