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