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