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