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