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