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