]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
Merge pull request #9504 from poettering/nss-deadlock
[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_elfutils = get_option('elfutils')
1017 if want_elfutils != 'false' and not fuzzer_build
1018 libdw = dependency('libdw',
1019 required : want_elfutils == 'true')
1020 have = libdw.found()
1021 else
1022 have = false
1023 libdw = []
1024 endif
1025 conf.set10('HAVE_ELFUTILS', have)
1026
1027 want_zlib = get_option('zlib')
1028 if want_zlib != 'false' and not fuzzer_build
1029 libz = dependency('zlib',
1030 required : want_zlib == 'true')
1031 have = libz.found()
1032 else
1033 have = false
1034 libz = []
1035 endif
1036 conf.set10('HAVE_ZLIB', have)
1037
1038 want_bzip2 = get_option('bzip2')
1039 if want_bzip2 != 'false' and not fuzzer_build
1040 libbzip2 = cc.find_library('bz2',
1041 required : want_bzip2 == 'true')
1042 have = libbzip2.found()
1043 else
1044 have = false
1045 libbzip2 = []
1046 endif
1047 conf.set10('HAVE_BZIP2', have)
1048
1049 want_xz = get_option('xz')
1050 if want_xz != 'false' and not fuzzer_build
1051 libxz = dependency('liblzma',
1052 required : want_xz == 'true')
1053 have = libxz.found()
1054 else
1055 have = false
1056 libxz = []
1057 endif
1058 conf.set10('HAVE_XZ', have)
1059
1060 want_lz4 = get_option('lz4')
1061 if want_lz4 != 'false' and not fuzzer_build
1062 liblz4 = dependency('liblz4',
1063 required : want_lz4 == 'true')
1064 have = liblz4.found()
1065 else
1066 have = false
1067 liblz4 = []
1068 endif
1069 conf.set10('HAVE_LZ4', have)
1070
1071 want_xkbcommon = get_option('xkbcommon')
1072 if want_xkbcommon != 'false' and not fuzzer_build
1073 libxkbcommon = dependency('xkbcommon',
1074 version : '>= 0.3.0',
1075 required : want_xkbcommon == 'true')
1076 have = libxkbcommon.found()
1077 else
1078 have = false
1079 libxkbcommon = []
1080 endif
1081 conf.set10('HAVE_XKBCOMMON', have)
1082
1083 want_pcre2 = get_option('pcre2')
1084 if want_pcre2 != 'false'
1085 libpcre2 = dependency('libpcre2-8',
1086 required : want_pcre2 == 'true')
1087 have = libpcre2.found()
1088 else
1089 have = false
1090 libpcre2 = []
1091 endif
1092 conf.set10('HAVE_PCRE2', have)
1093
1094 want_glib = get_option('glib')
1095 if want_glib != 'false' and not fuzzer_build
1096 libglib = dependency('glib-2.0',
1097 version : '>= 2.22.0',
1098 required : want_glib == 'true')
1099 libgobject = dependency('gobject-2.0',
1100 version : '>= 2.22.0',
1101 required : want_glib == 'true')
1102 libgio = dependency('gio-2.0',
1103 required : want_glib == 'true')
1104 have = libglib.found() and libgobject.found() and libgio.found()
1105 else
1106 have = false
1107 libglib = []
1108 libgobject = []
1109 libgio = []
1110 endif
1111 conf.set10('HAVE_GLIB', have)
1112
1113 want_dbus = get_option('dbus')
1114 if want_dbus != 'false' and not fuzzer_build
1115 libdbus = dependency('dbus-1',
1116 version : '>= 1.3.2',
1117 required : want_dbus == 'true')
1118 have = libdbus.found()
1119 else
1120 have = false
1121 libdbus = []
1122 endif
1123 conf.set10('HAVE_DBUS', have)
1124
1125 default_dnssec = get_option('default-dnssec')
1126 if fuzzer_build
1127 default_dnssec = 'no'
1128 endif
1129 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1130 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1131 default_dnssec = 'no'
1132 endif
1133 conf.set('DEFAULT_DNSSEC_MODE',
1134 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1135 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1136
1137 dns_over_tls = get_option('dns-over-tls')
1138 if dns_over_tls != 'false'
1139 have = (conf.get('HAVE_GNUTLS') == 1 and
1140 libgnutls.version().version_compare('>=3.5.3'))
1141 if dns_over_tls == 'true' and not have
1142 error('DNS-over-TLS support was requested, but dependencies are not available')
1143 endif
1144 else
1145 have = false
1146 endif
1147 conf.set10('ENABLE_DNS_OVER_TLS', have)
1148
1149 default_dns_over_tls = get_option('default-dns-over-tls')
1150 if fuzzer_build
1151 default_dns_over_tls = 'no'
1152 endif
1153 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1154 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1155 default_dns_over_tls = 'no'
1156 endif
1157 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1158 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1159 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1160
1161 want_importd = get_option('importd')
1162 if want_importd != 'false'
1163 have = (conf.get('HAVE_LIBCURL') == 1 and
1164 conf.get('HAVE_ZLIB') == 1 and
1165 conf.get('HAVE_BZIP2') == 1 and
1166 conf.get('HAVE_XZ') == 1 and
1167 conf.get('HAVE_GCRYPT') == 1)
1168 if want_importd == 'true' and not have
1169 error('importd support was requested, but dependencies are not available')
1170 endif
1171 else
1172 have = false
1173 endif
1174 conf.set10('ENABLE_IMPORTD', have)
1175
1176 want_remote = get_option('remote')
1177 if want_remote != 'false'
1178 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1179 conf.get('HAVE_LIBCURL') == 1]
1180 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1181 # it's possible to build one without the other. Complain only if
1182 # support was explictly requested. The auxiliary files like sysusers
1183 # config should be installed when any of the programs are built.
1184 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1185 error('remote support was requested, but dependencies are not available')
1186 endif
1187 have = have_deps[0] or have_deps[1]
1188 else
1189 have = false
1190 endif
1191 conf.set10('ENABLE_REMOTE', have)
1192
1193 foreach term : ['utmp',
1194 'hibernate',
1195 'environment-d',
1196 'binfmt',
1197 'coredump',
1198 'resolve',
1199 'logind',
1200 'hostnamed',
1201 'localed',
1202 'machined',
1203 'portabled',
1204 'networkd',
1205 'timedated',
1206 'timesyncd',
1207 'firstboot',
1208 'randomseed',
1209 'backlight',
1210 'vconsole',
1211 'quotacheck',
1212 'sysusers',
1213 'tmpfiles',
1214 'hwdb',
1215 'rfkill',
1216 'ldconfig',
1217 'efi',
1218 'tpm',
1219 'ima',
1220 'smack',
1221 'gshadow',
1222 'idn',
1223 'nss-myhostname',
1224 'nss-systemd']
1225 have = get_option(term)
1226 name = 'ENABLE_' + term.underscorify().to_upper()
1227 conf.set10(name, have)
1228 endforeach
1229
1230 foreach tuple : [['nss-mymachines', 'machined'],
1231 ['nss-resolve', 'resolve']]
1232 want = get_option(tuple[0])
1233 if want != 'false'
1234 have = get_option(tuple[1])
1235 if want == 'true' and not have
1236 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1237 endif
1238 else
1239 have = false
1240 endif
1241 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1242 conf.set10(name, have)
1243 endforeach
1244
1245 enable_nss = false
1246 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1247 'ENABLE_NSS_MYMACHINES',
1248 'ENABLE_NSS_RESOLVE',
1249 'ENABLE_NSS_SYSTEMD']
1250 if conf.get(term) == 1
1251 enable_nss = true
1252 endif
1253 endforeach
1254 conf.set10('ENABLE_NSS', enable_nss)
1255
1256 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1257
1258 want_tests = get_option('tests')
1259 install_tests = get_option('install-tests')
1260 slow_tests = get_option('slow-tests')
1261 tests = []
1262 fuzzers = []
1263
1264 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1265
1266 #####################################################################
1267
1268 if get_option('efi')
1269 efi_arch = host_machine.cpu_family()
1270
1271 if efi_arch == 'x86'
1272 EFI_MACHINE_TYPE_NAME = 'ia32'
1273 gnu_efi_arch = 'ia32'
1274 elif efi_arch == 'x86_64'
1275 EFI_MACHINE_TYPE_NAME = 'x64'
1276 gnu_efi_arch = 'x86_64'
1277 elif efi_arch == 'arm'
1278 EFI_MACHINE_TYPE_NAME = 'arm'
1279 gnu_efi_arch = 'arm'
1280 elif efi_arch == 'aarch64'
1281 EFI_MACHINE_TYPE_NAME = 'aa64'
1282 gnu_efi_arch = 'aarch64'
1283 else
1284 EFI_MACHINE_TYPE_NAME = ''
1285 gnu_efi_arch = ''
1286 endif
1287
1288 have = true
1289 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1290
1291 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1292 else
1293 have = false
1294 endif
1295 conf.set10('ENABLE_EFI', have)
1296
1297 #####################################################################
1298
1299 config_h = configure_file(
1300 output : 'config.h',
1301 configuration : conf)
1302
1303 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1304
1305 includes = include_directories('src/basic',
1306 'src/shared',
1307 'src/systemd',
1308 'src/journal',
1309 'src/journal-remote',
1310 'src/nspawn',
1311 'src/resolve',
1312 'src/timesync',
1313 'src/time-wait-sync',
1314 'src/login',
1315 'src/udev',
1316 'src/libudev',
1317 'src/core',
1318 'src/libsystemd/sd-bus',
1319 'src/libsystemd/sd-device',
1320 'src/libsystemd/sd-hwdb',
1321 'src/libsystemd/sd-id128',
1322 'src/libsystemd/sd-netlink',
1323 'src/libsystemd/sd-network',
1324 'src/libsystemd-network',
1325 '.')
1326
1327 add_project_arguments('-include', 'config.h', language : 'c')
1328
1329 subdir('po')
1330 subdir('catalog')
1331 subdir('src/systemd')
1332 subdir('src/basic')
1333 subdir('src/libsystemd')
1334 subdir('src/libsystemd-network')
1335 subdir('src/journal')
1336 subdir('src/login')
1337
1338 libjournal_core = static_library(
1339 'journal-core',
1340 libjournal_core_sources,
1341 journald_gperf_c,
1342 include_directories : includes,
1343 install : false)
1344
1345 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1346 libsystemd = shared_library(
1347 'systemd',
1348 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1349 version : libsystemd_version,
1350 include_directories : includes,
1351 link_args : ['-shared',
1352 '-Wl,--version-script=' + libsystemd_sym_path],
1353 link_with : [libbasic,
1354 libbasic_gcrypt],
1355 link_whole : [libsystemd_static,
1356 libjournal_client],
1357 dependencies : [threads,
1358 librt,
1359 libxz,
1360 liblz4],
1361 link_depends : libsystemd_sym,
1362 install : true,
1363 install_dir : rootlibdir)
1364
1365 static_libsystemd = get_option('static-libsystemd')
1366 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1367
1368 install_libsystemd_static = static_library(
1369 'systemd',
1370 libsystemd_sources,
1371 journal_client_sources,
1372 basic_sources,
1373 basic_gcrypt_sources,
1374 include_directories : includes,
1375 build_by_default : static_libsystemd != 'false',
1376 install : static_libsystemd != 'false',
1377 install_dir : rootlibdir,
1378 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1379 dependencies : [threads,
1380 librt,
1381 libxz,
1382 liblz4,
1383 libcap,
1384 libblkid,
1385 libmount,
1386 libselinux,
1387 libgcrypt],
1388 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1389
1390 ############################################################
1391
1392 # binaries that have --help and are intended for use by humans,
1393 # usually, but not always, installed in /bin.
1394 public_programs = []
1395
1396 subdir('src/libudev')
1397 subdir('src/shared')
1398 subdir('src/core')
1399 subdir('src/udev')
1400 subdir('src/network')
1401
1402 subdir('src/analyze')
1403 subdir('src/journal-remote')
1404 subdir('src/coredump')
1405 subdir('src/hostname')
1406 subdir('src/import')
1407 subdir('src/kernel-install')
1408 subdir('src/locale')
1409 subdir('src/machine')
1410 subdir('src/portable')
1411 subdir('src/nspawn')
1412 subdir('src/resolve')
1413 subdir('src/timedate')
1414 subdir('src/timesync')
1415 subdir('src/vconsole')
1416 subdir('src/boot/efi')
1417
1418 subdir('src/test')
1419 subdir('src/fuzz')
1420 subdir('rules')
1421 subdir('test')
1422
1423 ############################################################
1424
1425 # only static linking apart from libdl, to make sure that the
1426 # module is linked to all libraries that it uses.
1427 test_dlopen = executable(
1428 'test-dlopen',
1429 test_dlopen_c,
1430 include_directories : includes,
1431 link_with : [libbasic],
1432 dependencies : [libdl])
1433
1434 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1435 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1436 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1437 ['resolve', 'ENABLE_NSS_RESOLVE']]
1438
1439 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1440 if condition
1441 module = tuple[0]
1442
1443 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1444 version_script_arg = join_paths(meson.current_source_dir(), sym)
1445
1446 nss = shared_library(
1447 'nss_' + module,
1448 'src/nss-@0@/nss-@0@.c'.format(module),
1449 version : '2',
1450 include_directories : includes,
1451 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1452 link_args : ['-Wl,-z,nodelete',
1453 '-shared',
1454 '-Wl,--version-script=' + version_script_arg,
1455 '-Wl,--undefined'],
1456 link_with : [libsystemd_static,
1457 libbasic],
1458 dependencies : [threads,
1459 librt],
1460 link_depends : sym,
1461 install : true,
1462 install_dir : rootlibdir)
1463
1464 # We cannot use shared_module because it does not support version suffix.
1465 # Unfortunately shared_library insists on creating the symlink…
1466 meson.add_install_script('sh', '-c',
1467 'rm $DESTDIR@0@/libnss_@1@.so'
1468 .format(rootlibdir, module))
1469
1470 test('dlopen-nss_' + module,
1471 test_dlopen,
1472 args : [nss.full_path()]) # path to dlopen must include a slash
1473 endif
1474 endforeach
1475
1476 ############################################################
1477
1478 executable('systemd',
1479 systemd_sources,
1480 include_directories : includes,
1481 link_with : [libcore,
1482 libshared],
1483 dependencies : [threads,
1484 librt,
1485 libseccomp,
1486 libselinux,
1487 libmount,
1488 libblkid],
1489 install_rpath : rootlibexecdir,
1490 install : true,
1491 install_dir : rootlibexecdir)
1492
1493 meson.add_install_script(meson_make_symlink,
1494 join_paths(rootlibexecdir, 'systemd'),
1495 join_paths(rootsbindir, 'init'))
1496
1497 exe = executable('systemd-analyze',
1498 systemd_analyze_sources,
1499 include_directories : includes,
1500 link_with : [libcore,
1501 libshared],
1502 dependencies : [threads,
1503 librt,
1504 libseccomp,
1505 libselinux,
1506 libmount,
1507 libblkid],
1508 install_rpath : rootlibexecdir,
1509 install : true)
1510 public_programs += [exe]
1511
1512 executable('systemd-journald',
1513 systemd_journald_sources,
1514 include_directories : includes,
1515 link_with : [libjournal_core,
1516 libshared],
1517 dependencies : [threads,
1518 libxz,
1519 liblz4,
1520 libselinux],
1521 install_rpath : rootlibexecdir,
1522 install : true,
1523 install_dir : rootlibexecdir)
1524
1525 exe = executable('systemd-cat',
1526 systemd_cat_sources,
1527 include_directories : includes,
1528 link_with : [libjournal_core,
1529 libshared],
1530 dependencies : [threads],
1531 install_rpath : rootlibexecdir,
1532 install : true)
1533 public_programs += [exe]
1534
1535 exe = executable('journalctl',
1536 journalctl_sources,
1537 include_directories : includes,
1538 link_with : [libshared],
1539 dependencies : [threads,
1540 libqrencode,
1541 libxz,
1542 liblz4,
1543 libpcre2],
1544 install_rpath : rootlibexecdir,
1545 install : true,
1546 install_dir : rootbindir)
1547 public_programs += [exe]
1548
1549 executable('systemd-getty-generator',
1550 'src/getty-generator/getty-generator.c',
1551 include_directories : includes,
1552 link_with : [libshared],
1553 install_rpath : rootlibexecdir,
1554 install : true,
1555 install_dir : systemgeneratordir)
1556
1557 executable('systemd-debug-generator',
1558 'src/debug-generator/debug-generator.c',
1559 include_directories : includes,
1560 link_with : [libshared],
1561 install_rpath : rootlibexecdir,
1562 install : true,
1563 install_dir : systemgeneratordir)
1564
1565 executable('systemd-fstab-generator',
1566 'src/fstab-generator/fstab-generator.c',
1567 'src/core/mount-setup.c',
1568 include_directories : includes,
1569 link_with : [libshared],
1570 install_rpath : rootlibexecdir,
1571 install : true,
1572 install_dir : systemgeneratordir)
1573
1574 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1575 executable('30-systemd-environment-d-generator',
1576 'src/environment-d-generator/environment-d-generator.c',
1577 include_directories : includes,
1578 link_with : [libshared],
1579 install_rpath : rootlibexecdir,
1580 install : true,
1581 install_dir : userenvgeneratordir)
1582
1583 meson.add_install_script(meson_make_symlink,
1584 join_paths(sysconfdir, 'environment'),
1585 join_paths(environmentdir, '99-environment.conf'))
1586 endif
1587
1588 if conf.get('ENABLE_HIBERNATE') == 1
1589 executable('systemd-hibernate-resume-generator',
1590 'src/hibernate-resume/hibernate-resume-generator.c',
1591 include_directories : includes,
1592 link_with : [libshared],
1593 install_rpath : rootlibexecdir,
1594 install : true,
1595 install_dir : systemgeneratordir)
1596
1597 executable('systemd-hibernate-resume',
1598 'src/hibernate-resume/hibernate-resume.c',
1599 include_directories : includes,
1600 link_with : [libshared],
1601 install_rpath : rootlibexecdir,
1602 install : true,
1603 install_dir : rootlibexecdir)
1604 endif
1605
1606 if conf.get('HAVE_BLKID') == 1
1607 executable('systemd-gpt-auto-generator',
1608 'src/gpt-auto-generator/gpt-auto-generator.c',
1609 'src/basic/blkid-util.h',
1610 include_directories : includes,
1611 link_with : [libshared],
1612 dependencies : libblkid,
1613 install_rpath : rootlibexecdir,
1614 install : true,
1615 install_dir : systemgeneratordir)
1616
1617 exe = executable('systemd-dissect',
1618 'src/dissect/dissect.c',
1619 include_directories : includes,
1620 link_with : [libshared],
1621 install_rpath : rootlibexecdir,
1622 install : true,
1623 install_dir : rootlibexecdir)
1624 public_programs += [exe]
1625 endif
1626
1627 if conf.get('ENABLE_RESOLVE') == 1
1628 executable('systemd-resolved',
1629 systemd_resolved_sources,
1630 include_directories : includes,
1631 link_with : [libshared,
1632 libbasic_gcrypt,
1633 libsystemd_resolve_core],
1634 dependencies : systemd_resolved_dependencies,
1635 install_rpath : rootlibexecdir,
1636 install : true,
1637 install_dir : rootlibexecdir)
1638
1639 exe = executable('resolvectl',
1640 resolvectl_sources,
1641 include_directories : includes,
1642 link_with : [libshared,
1643 libbasic_gcrypt,
1644 libsystemd_resolve_core],
1645 dependencies : [threads,
1646 libgpg_error,
1647 libm,
1648 libidn],
1649 install_rpath : rootlibexecdir,
1650 install : true)
1651 public_programs += [exe]
1652
1653 meson.add_install_script(meson_make_symlink,
1654 join_paths(bindir, 'resolvectl'),
1655 join_paths(rootsbindir, 'resolvconf'))
1656
1657 meson.add_install_script(meson_make_symlink,
1658 join_paths(bindir, 'resolvectl'),
1659 join_paths(bindir, 'systemd-resolve'))
1660 endif
1661
1662 if conf.get('ENABLE_LOGIND') == 1
1663 executable('systemd-logind',
1664 systemd_logind_sources,
1665 include_directories : includes,
1666 link_with : [liblogind_core,
1667 libshared],
1668 dependencies : [threads,
1669 libacl],
1670 install_rpath : rootlibexecdir,
1671 install : true,
1672 install_dir : rootlibexecdir)
1673
1674 exe = executable('loginctl',
1675 loginctl_sources,
1676 include_directories : includes,
1677 link_with : [libshared],
1678 dependencies : [threads,
1679 liblz4,
1680 libxz],
1681 install_rpath : rootlibexecdir,
1682 install : true,
1683 install_dir : rootbindir)
1684 public_programs += [exe]
1685
1686 exe = executable('systemd-inhibit',
1687 'src/login/inhibit.c',
1688 include_directories : includes,
1689 link_with : [libshared],
1690 install_rpath : rootlibexecdir,
1691 install : true,
1692 install_dir : rootbindir)
1693 public_programs += [exe]
1694
1695 if conf.get('HAVE_PAM') == 1
1696 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1697 pam_systemd = shared_library(
1698 'pam_systemd',
1699 pam_systemd_c,
1700 name_prefix : '',
1701 include_directories : includes,
1702 link_args : ['-shared',
1703 '-Wl,--version-script=' + version_script_arg],
1704 link_with : [libsystemd_static,
1705 libshared_static],
1706 dependencies : [threads,
1707 libpam,
1708 libpam_misc],
1709 link_depends : pam_systemd_sym,
1710 install : true,
1711 install_dir : pamlibdir)
1712
1713 test('dlopen-pam_systemd',
1714 test_dlopen,
1715 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1716 endif
1717 endif
1718
1719 executable('systemd-user-runtime-dir',
1720 user_runtime_dir_sources,
1721 include_directories : includes,
1722 link_with : [libshared, liblogind_core],
1723 install_rpath : rootlibexecdir,
1724 install : true,
1725 install_dir : rootlibexecdir)
1726
1727 if conf.get('HAVE_PAM') == 1
1728 executable('systemd-user-sessions',
1729 'src/user-sessions/user-sessions.c',
1730 include_directories : includes,
1731 link_with : [libshared],
1732 install_rpath : rootlibexecdir,
1733 install : true,
1734 install_dir : rootlibexecdir)
1735 endif
1736
1737 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1738 exe = executable('bootctl',
1739 'src/boot/bootctl.c',
1740 include_directories : includes,
1741 link_with : [libshared],
1742 dependencies : [libblkid],
1743 install_rpath : rootlibexecdir,
1744 install : true)
1745 public_programs += [exe]
1746 endif
1747
1748 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1749 include_directories : includes,
1750 link_with : [libshared],
1751 dependencies : [threads],
1752 install_rpath : rootlibexecdir,
1753 install : true)
1754 public_programs += [exe]
1755
1756
1757 if get_option('link-systemctl-shared')
1758 systemctl_link_with = [libshared]
1759 else
1760 systemctl_link_with = [libsystemd_static,
1761 libshared_static,
1762 libjournal_client,
1763 libbasic_gcrypt]
1764 endif
1765
1766 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1767 include_directories : includes,
1768 link_with : systemctl_link_with,
1769 dependencies : [threads,
1770 libcap,
1771 libselinux,
1772 libxz,
1773 liblz4],
1774 install_rpath : rootlibexecdir,
1775 install : true,
1776 install_dir : rootbindir)
1777 public_programs += [exe]
1778
1779 if conf.get('ENABLE_PORTABLED') == 1
1780 executable('systemd-portabled',
1781 systemd_portabled_sources,
1782 include_directories : includes,
1783 link_with : [libshared],
1784 dependencies : [threads],
1785 install_rpath : rootlibexecdir,
1786 install : true,
1787 install_dir : rootlibexecdir)
1788
1789 exe = executable('portablectl', 'src/portable/portablectl.c',
1790 include_directories : includes,
1791 link_with : [libshared],
1792 dependencies : [threads],
1793 install_rpath : rootlibexecdir,
1794 install : true,
1795 install_dir : rootlibexecdir)
1796 public_programs += [exe]
1797 endif
1798
1799 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1800 meson.add_install_script(meson_make_symlink,
1801 join_paths(rootbindir, 'systemctl'),
1802 join_paths(rootsbindir, alias))
1803 endforeach
1804
1805 if conf.get('ENABLE_BACKLIGHT') == 1
1806 executable('systemd-backlight',
1807 'src/backlight/backlight.c',
1808 include_directories : includes,
1809 link_with : [libshared],
1810 install_rpath : rootlibexecdir,
1811 install : true,
1812 install_dir : rootlibexecdir)
1813 endif
1814
1815 if conf.get('ENABLE_RFKILL') == 1
1816 executable('systemd-rfkill',
1817 'src/rfkill/rfkill.c',
1818 include_directories : includes,
1819 link_with : [libshared],
1820 install_rpath : rootlibexecdir,
1821 install : true,
1822 install_dir : rootlibexecdir)
1823 endif
1824
1825 executable('systemd-system-update-generator',
1826 'src/system-update-generator/system-update-generator.c',
1827 include_directories : includes,
1828 link_with : [libshared],
1829 install_rpath : rootlibexecdir,
1830 install : true,
1831 install_dir : systemgeneratordir)
1832
1833 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1834 executable('systemd-cryptsetup',
1835 'src/cryptsetup/cryptsetup.c',
1836 include_directories : includes,
1837 link_with : [libshared],
1838 dependencies : [libcryptsetup],
1839 install_rpath : rootlibexecdir,
1840 install : true,
1841 install_dir : rootlibexecdir)
1842
1843 executable('systemd-cryptsetup-generator',
1844 'src/cryptsetup/cryptsetup-generator.c',
1845 include_directories : includes,
1846 link_with : [libshared],
1847 dependencies : [libcryptsetup],
1848 install_rpath : rootlibexecdir,
1849 install : true,
1850 install_dir : systemgeneratordir)
1851
1852 executable('systemd-veritysetup',
1853 'src/veritysetup/veritysetup.c',
1854 include_directories : includes,
1855 link_with : [libshared],
1856 dependencies : [libcryptsetup],
1857 install_rpath : rootlibexecdir,
1858 install : true,
1859 install_dir : rootlibexecdir)
1860
1861 executable('systemd-veritysetup-generator',
1862 'src/veritysetup/veritysetup-generator.c',
1863 include_directories : includes,
1864 link_with : [libshared],
1865 dependencies : [libcryptsetup],
1866 install_rpath : rootlibexecdir,
1867 install : true,
1868 install_dir : systemgeneratordir)
1869 endif
1870
1871 if conf.get('HAVE_SYSV_COMPAT') == 1
1872 executable('systemd-sysv-generator',
1873 'src/sysv-generator/sysv-generator.c',
1874 include_directories : includes,
1875 link_with : [libshared],
1876 install_rpath : rootlibexecdir,
1877 install : true,
1878 install_dir : systemgeneratordir)
1879
1880 executable('systemd-rc-local-generator',
1881 'src/rc-local-generator/rc-local-generator.c',
1882 include_directories : includes,
1883 link_with : [libshared],
1884 install_rpath : rootlibexecdir,
1885 install : true,
1886 install_dir : systemgeneratordir)
1887 endif
1888
1889 if conf.get('ENABLE_HOSTNAMED') == 1
1890 executable('systemd-hostnamed',
1891 'src/hostname/hostnamed.c',
1892 include_directories : includes,
1893 link_with : [libshared],
1894 install_rpath : rootlibexecdir,
1895 install : true,
1896 install_dir : rootlibexecdir)
1897
1898 exe = executable('hostnamectl',
1899 'src/hostname/hostnamectl.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 install_rpath : rootlibexecdir,
1903 install : true)
1904 public_programs += [exe]
1905 endif
1906
1907 if conf.get('ENABLE_LOCALED') == 1
1908 if conf.get('HAVE_XKBCOMMON') == 1
1909 # logind will load libxkbcommon.so dynamically on its own
1910 deps = [libdl]
1911 else
1912 deps = []
1913 endif
1914
1915 executable('systemd-localed',
1916 systemd_localed_sources,
1917 include_directories : includes,
1918 link_with : [libshared],
1919 dependencies : deps,
1920 install_rpath : rootlibexecdir,
1921 install : true,
1922 install_dir : rootlibexecdir)
1923
1924 exe = executable('localectl',
1925 localectl_sources,
1926 include_directories : includes,
1927 link_with : [libshared],
1928 install_rpath : rootlibexecdir,
1929 install : true)
1930 public_programs += [exe]
1931 endif
1932
1933 if conf.get('ENABLE_TIMEDATED') == 1
1934 executable('systemd-timedated',
1935 'src/timedate/timedated.c',
1936 include_directories : includes,
1937 link_with : [libshared],
1938 install_rpath : rootlibexecdir,
1939 install : true,
1940 install_dir : rootlibexecdir)
1941 endif
1942
1943 if conf.get('ENABLE_TIMEDATECTL') == 1
1944 exe = executable('timedatectl',
1945 'src/timedate/timedatectl.c',
1946 include_directories : includes,
1947 install_rpath : rootlibexecdir,
1948 link_with : [libshared],
1949 dependencies : [libm],
1950 install : true)
1951 public_programs += [exe]
1952 endif
1953
1954 if conf.get('ENABLE_TIMESYNCD') == 1
1955 executable('systemd-timesyncd',
1956 systemd_timesyncd_sources,
1957 include_directories : includes,
1958 link_with : [libshared],
1959 dependencies : [threads,
1960 libm],
1961 install_rpath : rootlibexecdir,
1962 install : true,
1963 install_dir : rootlibexecdir)
1964
1965 executable('systemd-time-wait-sync',
1966 'src/time-wait-sync/time-wait-sync.c',
1967 include_directories : includes,
1968 link_with : [libshared],
1969 install_rpath : rootlibexecdir,
1970 install : true,
1971 install_dir : rootlibexecdir)
1972 endif
1973
1974 if conf.get('ENABLE_MACHINED') == 1
1975 executable('systemd-machined',
1976 systemd_machined_sources,
1977 include_directories : includes,
1978 link_with : [libmachine_core,
1979 libshared],
1980 install_rpath : rootlibexecdir,
1981 install : true,
1982 install_dir : rootlibexecdir)
1983
1984 exe = executable('machinectl',
1985 'src/machine/machinectl.c',
1986 include_directories : includes,
1987 link_with : [libshared],
1988 dependencies : [threads,
1989 libxz,
1990 liblz4],
1991 install_rpath : rootlibexecdir,
1992 install : true,
1993 install_dir : rootbindir)
1994 public_programs += [exe]
1995 endif
1996
1997 if conf.get('ENABLE_IMPORTD') == 1
1998 executable('systemd-importd',
1999 systemd_importd_sources,
2000 include_directories : includes,
2001 link_with : [libshared],
2002 dependencies : [threads],
2003 install_rpath : rootlibexecdir,
2004 install : true,
2005 install_dir : rootlibexecdir)
2006
2007 systemd_pull = executable('systemd-pull',
2008 systemd_pull_sources,
2009 include_directories : includes,
2010 link_with : [libshared],
2011 dependencies : [libcurl,
2012 libz,
2013 libbzip2,
2014 libxz,
2015 libgcrypt],
2016 install_rpath : rootlibexecdir,
2017 install : true,
2018 install_dir : rootlibexecdir)
2019
2020 systemd_import = executable('systemd-import',
2021 systemd_import_sources,
2022 include_directories : includes,
2023 link_with : [libshared],
2024 dependencies : [libcurl,
2025 libz,
2026 libbzip2,
2027 libxz],
2028 install_rpath : rootlibexecdir,
2029 install : true,
2030 install_dir : rootlibexecdir)
2031
2032 systemd_export = executable('systemd-export',
2033 systemd_export_sources,
2034 include_directories : includes,
2035 link_with : [libshared],
2036 dependencies : [libcurl,
2037 libz,
2038 libbzip2,
2039 libxz],
2040 install_rpath : rootlibexecdir,
2041 install : true,
2042 install_dir : rootlibexecdir)
2043 public_programs += [systemd_pull, systemd_import, systemd_export]
2044 endif
2045
2046 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2047 exe = executable('systemd-journal-upload',
2048 systemd_journal_upload_sources,
2049 include_directories : includes,
2050 link_with : [libshared],
2051 dependencies : [threads,
2052 libcurl,
2053 libgnutls,
2054 libxz,
2055 liblz4],
2056 install_rpath : rootlibexecdir,
2057 install : true,
2058 install_dir : rootlibexecdir)
2059 public_programs += [exe]
2060 endif
2061
2062 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2063 s_j_remote = executable('systemd-journal-remote',
2064 systemd_journal_remote_sources,
2065 include_directories : includes,
2066 link_with : [libshared,
2067 libsystemd_journal_remote],
2068 dependencies : [threads,
2069 libmicrohttpd,
2070 libgnutls,
2071 libxz,
2072 liblz4],
2073 install_rpath : rootlibexecdir,
2074 install : true,
2075 install_dir : rootlibexecdir)
2076
2077 s_j_gatewayd = executable('systemd-journal-gatewayd',
2078 systemd_journal_gatewayd_sources,
2079 include_directories : includes,
2080 link_with : [libshared],
2081 dependencies : [threads,
2082 libmicrohttpd,
2083 libgnutls,
2084 libxz,
2085 liblz4],
2086 install_rpath : rootlibexecdir,
2087 install : true,
2088 install_dir : rootlibexecdir)
2089 public_programs += [s_j_remote, s_j_gatewayd]
2090 endif
2091
2092 if conf.get('ENABLE_COREDUMP') == 1
2093 executable('systemd-coredump',
2094 systemd_coredump_sources,
2095 include_directories : includes,
2096 link_with : [libshared],
2097 dependencies : [threads,
2098 libacl,
2099 libdw,
2100 libxz,
2101 liblz4],
2102 install_rpath : rootlibexecdir,
2103 install : true,
2104 install_dir : rootlibexecdir)
2105
2106 exe = executable('coredumpctl',
2107 coredumpctl_sources,
2108 include_directories : includes,
2109 link_with : [libshared],
2110 dependencies : [threads,
2111 libxz,
2112 liblz4],
2113 install_rpath : rootlibexecdir,
2114 install : true)
2115 public_programs += [exe]
2116 endif
2117
2118 if conf.get('ENABLE_BINFMT') == 1
2119 exe = executable('systemd-binfmt',
2120 'src/binfmt/binfmt.c',
2121 include_directories : includes,
2122 link_with : [libshared],
2123 install_rpath : rootlibexecdir,
2124 install : true,
2125 install_dir : rootlibexecdir)
2126 public_programs += [exe]
2127
2128 meson.add_install_script('sh', '-c',
2129 mkdir_p.format(binfmtdir))
2130 meson.add_install_script('sh', '-c',
2131 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2132 endif
2133
2134 if conf.get('ENABLE_VCONSOLE') == 1
2135 executable('systemd-vconsole-setup',
2136 'src/vconsole/vconsole-setup.c',
2137 include_directories : includes,
2138 link_with : [libshared],
2139 install_rpath : rootlibexecdir,
2140 install : true,
2141 install_dir : rootlibexecdir)
2142 endif
2143
2144 if conf.get('ENABLE_RANDOMSEED') == 1
2145 executable('systemd-random-seed',
2146 'src/random-seed/random-seed.c',
2147 include_directories : includes,
2148 link_with : [libshared],
2149 install_rpath : rootlibexecdir,
2150 install : true,
2151 install_dir : rootlibexecdir)
2152 endif
2153
2154 if conf.get('ENABLE_FIRSTBOOT') == 1
2155 executable('systemd-firstboot',
2156 'src/firstboot/firstboot.c',
2157 include_directories : includes,
2158 link_with : [libshared],
2159 dependencies : [libcrypt],
2160 install_rpath : rootlibexecdir,
2161 install : true,
2162 install_dir : rootbindir)
2163 endif
2164
2165 executable('systemd-remount-fs',
2166 'src/remount-fs/remount-fs.c',
2167 'src/core/mount-setup.c',
2168 'src/core/mount-setup.h',
2169 include_directories : includes,
2170 link_with : [libshared],
2171 install_rpath : rootlibexecdir,
2172 install : true,
2173 install_dir : rootlibexecdir)
2174
2175 executable('systemd-machine-id-setup',
2176 'src/machine-id-setup/machine-id-setup-main.c',
2177 'src/core/machine-id-setup.c',
2178 'src/core/machine-id-setup.h',
2179 include_directories : includes,
2180 link_with : [libshared],
2181 install_rpath : rootlibexecdir,
2182 install : true,
2183 install_dir : rootbindir)
2184
2185 executable('systemd-fsck',
2186 'src/fsck/fsck.c',
2187 include_directories : includes,
2188 link_with : [libshared],
2189 install_rpath : rootlibexecdir,
2190 install : true,
2191 install_dir : rootlibexecdir)
2192
2193 executable('systemd-growfs',
2194 'src/partition/growfs.c',
2195 include_directories : includes,
2196 link_with : [libshared],
2197 dependencies : [libcryptsetup],
2198 install_rpath : rootlibexecdir,
2199 install : true,
2200 install_dir : rootlibexecdir)
2201
2202 executable('systemd-makefs',
2203 'src/partition/makefs.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2207 install : true,
2208 install_dir : rootlibexecdir)
2209
2210 executable('systemd-sleep',
2211 'src/sleep/sleep.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2215 install : true,
2216 install_dir : rootlibexecdir)
2217
2218 exe = executable('systemd-sysctl',
2219 'src/sysctl/sysctl.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2223 install : true,
2224 install_dir : rootlibexecdir)
2225 public_programs += [exe]
2226
2227 executable('systemd-ac-power',
2228 'src/ac-power/ac-power.c',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2232 install : true,
2233 install_dir : rootlibexecdir)
2234
2235 exe = executable('systemd-detect-virt',
2236 'src/detect-virt/detect-virt.c',
2237 include_directories : includes,
2238 link_with : [libshared],
2239 install_rpath : rootlibexecdir,
2240 install : true)
2241 public_programs += [exe]
2242
2243 exe = executable('systemd-delta',
2244 'src/delta/delta.c',
2245 include_directories : includes,
2246 link_with : [libshared],
2247 install_rpath : rootlibexecdir,
2248 install : true)
2249 public_programs += [exe]
2250
2251 exe = executable('systemd-escape',
2252 'src/escape/escape.c',
2253 include_directories : includes,
2254 link_with : [libshared],
2255 install_rpath : rootlibexecdir,
2256 install : true,
2257 install_dir : rootbindir)
2258 public_programs += [exe]
2259
2260 exe = executable('systemd-notify',
2261 'src/notify/notify.c',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 install_rpath : rootlibexecdir,
2265 install : true,
2266 install_dir : rootbindir)
2267 public_programs += [exe]
2268
2269 executable('systemd-volatile-root',
2270 'src/volatile-root/volatile-root.c',
2271 include_directories : includes,
2272 link_with : [libshared],
2273 install_rpath : rootlibexecdir,
2274 install : true,
2275 install_dir : rootlibexecdir)
2276
2277 executable('systemd-cgroups-agent',
2278 'src/cgroups-agent/cgroups-agent.c',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 install_rpath : rootlibexecdir,
2282 install : true,
2283 install_dir : rootlibexecdir)
2284
2285 exe = executable('systemd-path',
2286 'src/path/path.c',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2290 install : true)
2291 public_programs += [exe]
2292
2293 exe = executable('systemd-ask-password',
2294 'src/ask-password/ask-password.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 install_rpath : rootlibexecdir,
2298 install : true,
2299 install_dir : rootbindir)
2300 public_programs += [exe]
2301
2302 executable('systemd-reply-password',
2303 'src/reply-password/reply-password.c',
2304 include_directories : includes,
2305 link_with : [libshared],
2306 install_rpath : rootlibexecdir,
2307 install : true,
2308 install_dir : rootlibexecdir)
2309
2310 exe = executable('systemd-tty-ask-password-agent',
2311 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2315 install : true,
2316 install_dir : rootbindir)
2317 public_programs += [exe]
2318
2319 exe = executable('systemd-cgls',
2320 'src/cgls/cgls.c',
2321 include_directories : includes,
2322 link_with : [libshared],
2323 install_rpath : rootlibexecdir,
2324 install : true)
2325 public_programs += [exe]
2326
2327 exe = executable('systemd-cgtop',
2328 'src/cgtop/cgtop.c',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 install_rpath : rootlibexecdir,
2332 install : true)
2333 public_programs += [exe]
2334
2335 executable('systemd-initctl',
2336 'src/initctl/initctl.c',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2340 install : true,
2341 install_dir : rootlibexecdir)
2342
2343 exe = executable('systemd-mount',
2344 'src/mount/mount-tool.c',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2348 install : true)
2349 public_programs += [exe]
2350
2351 meson.add_install_script(meson_make_symlink,
2352 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2353
2354 exe = executable('systemd-run',
2355 'src/run/run.c',
2356 include_directories : includes,
2357 link_with : [libshared],
2358 install_rpath : rootlibexecdir,
2359 install : true)
2360 public_programs += [exe]
2361
2362 exe = executable('systemd-stdio-bridge',
2363 'src/stdio-bridge/stdio-bridge.c',
2364 include_directories : includes,
2365 link_with : [libshared],
2366 install_rpath : rootlibexecdir,
2367 install : true)
2368 public_programs += [exe]
2369
2370 exe = executable('busctl',
2371 'src/busctl/busctl.c',
2372 'src/busctl/busctl-introspect.c',
2373 'src/busctl/busctl-introspect.h',
2374 include_directories : includes,
2375 link_with : [libshared],
2376 install_rpath : rootlibexecdir,
2377 install : true)
2378 public_programs += [exe]
2379
2380 if conf.get('ENABLE_SYSUSERS') == 1
2381 exe = executable('systemd-sysusers',
2382 'src/sysusers/sysusers.c',
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2386 install : true,
2387 install_dir : rootbindir)
2388 public_programs += [exe]
2389 endif
2390
2391 if conf.get('ENABLE_TMPFILES') == 1
2392 exe = executable('systemd-tmpfiles',
2393 'src/tmpfiles/tmpfiles.c',
2394 include_directories : includes,
2395 link_with : [libshared],
2396 dependencies : [libacl],
2397 install_rpath : rootlibexecdir,
2398 install : true,
2399 install_dir : rootbindir)
2400 public_programs += [exe]
2401
2402 test('test-systemd-tmpfiles',
2403 test_systemd_tmpfiles_py,
2404 args : exe.full_path())
2405 # https://github.com/mesonbuild/meson/issues/2681
2406 endif
2407
2408 if conf.get('ENABLE_HWDB') == 1
2409 exe = executable('systemd-hwdb',
2410 'src/hwdb/hwdb.c',
2411 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2412 include_directories : includes,
2413 link_with : [libudev_static],
2414 install_rpath : udev_rpath,
2415 install : true,
2416 install_dir : rootbindir)
2417 public_programs += [exe]
2418 endif
2419
2420 if conf.get('ENABLE_QUOTACHECK') == 1
2421 executable('systemd-quotacheck',
2422 'src/quotacheck/quotacheck.c',
2423 include_directories : includes,
2424 link_with : [libshared],
2425 install_rpath : rootlibexecdir,
2426 install : true,
2427 install_dir : rootlibexecdir)
2428 endif
2429
2430 exe = executable('systemd-socket-proxyd',
2431 'src/socket-proxy/socket-proxyd.c',
2432 include_directories : includes,
2433 link_with : [libshared],
2434 dependencies : [threads],
2435 install_rpath : rootlibexecdir,
2436 install : true,
2437 install_dir : rootlibexecdir)
2438 public_programs += [exe]
2439
2440 exe = executable('systemd-udevd',
2441 systemd_udevd_sources,
2442 include_directories : includes,
2443 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2444 link_with : [libudev_core,
2445 libsystemd_network,
2446 libudev_static],
2447 dependencies : [threads,
2448 libkmod,
2449 libidn,
2450 libacl,
2451 libblkid],
2452 install_rpath : udev_rpath,
2453 install : true,
2454 install_dir : rootlibexecdir)
2455 public_programs += [exe]
2456
2457 exe = executable('udevadm',
2458 udevadm_sources,
2459 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2460 include_directories : includes,
2461 link_with : [libudev_core,
2462 libsystemd_network,
2463 libudev_static],
2464 dependencies : [threads,
2465 libkmod,
2466 libidn,
2467 libacl,
2468 libblkid],
2469 install_rpath : udev_rpath,
2470 install : true,
2471 install_dir : rootbindir)
2472 public_programs += [exe]
2473
2474 executable('systemd-shutdown',
2475 systemd_shutdown_sources,
2476 include_directories : includes,
2477 link_with : [libshared],
2478 dependencies : [libmount],
2479 install_rpath : rootlibexecdir,
2480 install : true,
2481 install_dir : rootlibexecdir)
2482
2483 executable('systemd-update-done',
2484 'src/update-done/update-done.c',
2485 include_directories : includes,
2486 link_with : [libshared],
2487 install_rpath : rootlibexecdir,
2488 install : true,
2489 install_dir : rootlibexecdir)
2490
2491 executable('systemd-update-utmp',
2492 'src/update-utmp/update-utmp.c',
2493 include_directories : includes,
2494 link_with : [libshared],
2495 dependencies : [libaudit],
2496 install_rpath : rootlibexecdir,
2497 install : true,
2498 install_dir : rootlibexecdir)
2499
2500 if conf.get('HAVE_KMOD') == 1
2501 executable('systemd-modules-load',
2502 'src/modules-load/modules-load.c',
2503 include_directories : includes,
2504 link_with : [libshared],
2505 dependencies : [libkmod],
2506 install_rpath : rootlibexecdir,
2507 install : true,
2508 install_dir : rootlibexecdir)
2509
2510 meson.add_install_script('sh', '-c',
2511 mkdir_p.format(modulesloaddir))
2512 meson.add_install_script('sh', '-c',
2513 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2514 endif
2515
2516 exe = executable('systemd-nspawn',
2517 systemd_nspawn_sources,
2518 'src/core/mount-setup.c', # FIXME: use a variable?
2519 'src/core/mount-setup.h',
2520 'src/core/loopback-setup.c',
2521 'src/core/loopback-setup.h',
2522 include_directories : includes,
2523 link_with : [libnspawn_core,
2524 libshared],
2525 dependencies : [libblkid],
2526 install_rpath : rootlibexecdir,
2527 install : true)
2528 public_programs += [exe]
2529
2530 if conf.get('ENABLE_NETWORKD') == 1
2531 executable('systemd-networkd',
2532 systemd_networkd_sources,
2533 include_directories : includes,
2534 link_with : [libnetworkd_core,
2535 libsystemd_network,
2536 libudev_static,
2537 libshared],
2538 dependencies : [threads],
2539 install_rpath : rootlibexecdir,
2540 install : true,
2541 install_dir : rootlibexecdir)
2542
2543 executable('systemd-networkd-wait-online',
2544 systemd_networkd_wait_online_sources,
2545 include_directories : includes,
2546 link_with : [libnetworkd_core,
2547 libshared],
2548 install_rpath : rootlibexecdir,
2549 install : true,
2550 install_dir : rootlibexecdir)
2551
2552 exe = executable('networkctl',
2553 networkctl_sources,
2554 include_directories : includes,
2555 link_with : [libsystemd_network,
2556 libshared],
2557 install_rpath : rootlibexecdir,
2558 install : true,
2559 install_dir : rootbindir)
2560 public_programs += [exe]
2561 endif
2562
2563 executable('systemd-sulogin-shell',
2564 ['src/sulogin-shell/sulogin-shell.c'],
2565 include_directories : includes,
2566 link_with : [libshared],
2567 install_rpath : rootlibexecdir,
2568 install : true,
2569 install_dir : rootlibexecdir)
2570
2571 ############################################################
2572
2573 foreach tuple : tests
2574 sources = tuple[0]
2575 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2576 dependencies = tuple[2]
2577 condition = tuple.length() >= 4 ? tuple[3] : ''
2578 type = tuple.length() >= 5 ? tuple[4] : ''
2579 defs = tuple.length() >= 6 ? tuple[5] : []
2580 incs = tuple.length() >= 7 ? tuple[6] : includes
2581 timeout = 30
2582
2583 name = sources[0].split('/')[-1].split('.')[0]
2584 if type.startswith('timeout=')
2585 timeout = type.split('=')[1].to_int()
2586 type = ''
2587 endif
2588 if want_tests == 'false'
2589 message('Not compiling @0@ because tests is set to false'.format(name))
2590 elif condition == '' or conf.get(condition) == 1
2591 exe = executable(
2592 name,
2593 sources,
2594 include_directories : incs,
2595 link_with : link_with,
2596 dependencies : dependencies,
2597 c_args : defs,
2598 install_rpath : rootlibexecdir,
2599 install : install_tests,
2600 install_dir : join_paths(testsdir, type))
2601
2602 if type == 'manual'
2603 message('@0@ is a manual test'.format(name))
2604 elif type == 'unsafe' and want_tests != 'unsafe'
2605 message('@0@ is an unsafe test'.format(name))
2606 else
2607 test(name, exe,
2608 env : test_env,
2609 timeout : timeout)
2610 endif
2611 else
2612 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2613 endif
2614 endforeach
2615
2616 exe = executable(
2617 'test-libsystemd-sym',
2618 test_libsystemd_sym_c,
2619 include_directories : includes,
2620 link_with : [libsystemd],
2621 install : install_tests,
2622 install_dir : testsdir)
2623 test('test-libsystemd-sym', exe)
2624
2625 exe = executable(
2626 'test-libsystemd-static-sym',
2627 test_libsystemd_sym_c,
2628 include_directories : includes,
2629 link_with : [install_libsystemd_static],
2630 dependencies : [threads], # threads is already included in dependencies on the library,
2631 # but does not seem to get propagated. Add here as a work-around.
2632 build_by_default : static_libsystemd_pic,
2633 install : install_tests and static_libsystemd_pic,
2634 install_dir : testsdir)
2635 if static_libsystemd_pic
2636 test('test-libsystemd-static-sym', exe)
2637 endif
2638
2639 exe = executable(
2640 'test-libudev-sym',
2641 test_libudev_sym_c,
2642 include_directories : includes,
2643 c_args : ['-Wno-deprecated-declarations'],
2644 link_with : [libudev],
2645 install : install_tests,
2646 install_dir : testsdir)
2647 test('test-libudev-sym', exe)
2648
2649 exe = executable(
2650 'test-libudev-static-sym',
2651 test_libudev_sym_c,
2652 include_directories : includes,
2653 c_args : ['-Wno-deprecated-declarations'],
2654 link_with : [install_libudev_static],
2655 build_by_default : static_libudev_pic,
2656 install : install_tests and static_libudev_pic,
2657 install_dir : testsdir)
2658 if static_libudev_pic
2659 test('test-libudev-static-sym', exe)
2660 endif
2661
2662 ############################################################
2663
2664 fuzzer_exes = []
2665
2666 foreach tuple : fuzzers
2667 sources = tuple[0]
2668 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2669 dependencies = tuple[2]
2670 defs = tuple.length() >= 4 ? tuple[3] : []
2671 incs = tuple.length() >= 5 ? tuple[4] : includes
2672
2673 if fuzzer_build
2674 dependencies += fuzzing_engine
2675 else
2676 sources += 'src/fuzz/fuzz-main.c'
2677 endif
2678
2679 name = sources[0].split('/')[-1].split('.')[0]
2680
2681 fuzzer_exes += executable(
2682 name,
2683 sources,
2684 include_directories : [incs, include_directories('src/fuzz')],
2685 link_with : link_with,
2686 dependencies : dependencies,
2687 c_args : defs,
2688 install : false)
2689 endforeach
2690
2691 run_target('fuzzers',
2692 depends : fuzzer_exes,
2693 command : ['true'])
2694
2695 ############################################################
2696
2697 make_directive_index_py = find_program('tools/make-directive-index.py')
2698 make_man_index_py = find_program('tools/make-man-index.py')
2699 xml_helper_py = find_program('tools/xml_helper.py')
2700 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2701
2702 subdir('units')
2703 subdir('sysctl.d')
2704 subdir('sysusers.d')
2705 subdir('tmpfiles.d')
2706 subdir('presets')
2707 subdir('hwdb')
2708 subdir('network')
2709 subdir('man')
2710 subdir('shell-completion/bash')
2711 subdir('shell-completion/zsh')
2712 subdir('doc/sysvinit')
2713 subdir('doc/var-log')
2714
2715 # FIXME: figure out if the warning is true:
2716 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2717 install_subdir('factory/etc',
2718 install_dir : factorydir)
2719
2720
2721 install_data('xorg/50-systemd-user.sh',
2722 install_dir : xinitrcdir)
2723 install_data('modprobe.d/systemd.conf',
2724 install_dir : modprobedir)
2725 install_data('LICENSE.GPL2',
2726 'LICENSE.LGPL2.1',
2727 'NEWS',
2728 'README',
2729 'doc/CODING_STYLE',
2730 'doc/DISTRO_PORTING',
2731 'doc/ENVIRONMENT.md',
2732 'doc/HACKING',
2733 'doc/TRANSIENT-SETTINGS.md',
2734 'doc/TRANSLATORS',
2735 'doc/UIDS-GIDS.md',
2736 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2737 install_dir : docdir)
2738
2739 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2740 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2741
2742 ############################################################
2743
2744 meson_check_help = find_program('tools/meson-check-help.sh')
2745
2746 foreach exec : public_programs
2747 name = exec.full_path().split('/')[-1]
2748 test('check-help-' + name,
2749 meson_check_help,
2750 args : [exec.full_path()])
2751 endforeach
2752
2753 ############################################################
2754
2755 # Enable tests for all supported sanitizers
2756 foreach tuple : sanitizers
2757 sanitizer = tuple[0]
2758 build = tuple[1]
2759
2760 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2761 prev = ''
2762 foreach p : fuzz_regression_tests
2763 b = p.split('/')[-2]
2764 c = p.split('/')[-1]
2765
2766 name = '@0@:@1@'.format(b, sanitizer)
2767
2768 if name != prev
2769 if want_tests == 'false'
2770 message('Not compiling @0@ because tests is set to false'.format(name))
2771 elif slow_tests
2772 exe = custom_target(
2773 name,
2774 output : name,
2775 depends : build,
2776 command : [env, 'ln', '-fs',
2777 join_paths(build.full_path(), b),
2778 '@OUTPUT@'],
2779 build_by_default : true)
2780 else
2781 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2782 endif
2783 endif
2784 prev = name
2785
2786 if want_tests != 'false' and slow_tests
2787 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2788 env,
2789 args : [exe.full_path(),
2790 join_paths(meson.source_root(),
2791 'test/fuzz-regressions',
2792 p)])
2793 endif
2794 endforeach
2795 endif
2796 endforeach
2797
2798
2799 ############################################################
2800
2801 if git.found()
2802 all_files = run_command(
2803 git,
2804 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2805 'ls-files',
2806 ':/*.[ch]'])
2807 all_files = files(all_files.stdout().split())
2808
2809 custom_target(
2810 'tags',
2811 output : 'tags',
2812 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2813 run_target(
2814 'ctags',
2815 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2816 endif
2817
2818 if git.found()
2819 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2820 run_target(
2821 'git-contrib',
2822 command : [meson_git_contrib_sh])
2823 endif
2824
2825 if git.found()
2826 git_head = run_command(
2827 git,
2828 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2829 'rev-parse', 'HEAD']).stdout().strip()
2830 git_head_short = run_command(
2831 git,
2832 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2833 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2834
2835 run_target(
2836 'git-snapshot',
2837 command : ['git', 'archive',
2838 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2839 git_head_short),
2840 '--prefix', 'systemd-@0@/'.format(git_head),
2841 'HEAD'])
2842 endif
2843
2844 ############################################################
2845
2846 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2847 run_target(
2848 'check-api-docs',
2849 depends : [man, libsystemd, libudev],
2850 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2851
2852 ############################################################
2853
2854 status = [
2855 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2856
2857 'split /usr: @0@'.format(split_usr),
2858 'split bin-sbin: @0@'.format(split_bin),
2859 'prefix directory: @0@'.format(prefixdir),
2860 'rootprefix directory: @0@'.format(rootprefixdir),
2861 'sysconf directory: @0@'.format(sysconfdir),
2862 'include directory: @0@'.format(includedir),
2863 'lib directory: @0@'.format(libdir),
2864 'rootlib directory: @0@'.format(rootlibdir),
2865 'SysV init scripts: @0@'.format(sysvinit_path),
2866 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2867 'PAM modules directory: @0@'.format(pamlibdir),
2868 'PAM configuration directory: @0@'.format(pamconfdir),
2869 'RPM macros directory: @0@'.format(rpmmacrosdir),
2870 'modprobe.d directory: @0@'.format(modprobedir),
2871 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2872 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2873 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2874 'bash completions directory: @0@'.format(bashcompletiondir),
2875 'zsh completions directory: @0@'.format(zshcompletiondir),
2876 'extra start script: @0@'.format(get_option('rc-local')),
2877 'extra stop script: @0@'.format(get_option('halt-local')),
2878 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2879 get_option('debug-tty')),
2880 'TTY GID: @0@'.format(tty_gid),
2881 'users GID: @0@'.format(substs.get('USERS_GID')),
2882 'maximum system UID: @0@'.format(system_uid_max),
2883 'maximum system GID: @0@'.format(system_gid_max),
2884 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2885 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2886 'minimum container UID base: @0@'.format(container_uid_base_min),
2887 'maximum container UID base: @0@'.format(container_uid_base_max),
2888 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2889 'render group access mode: @0@'.format(get_option('group-render-mode')),
2890 'certificate root directory: @0@'.format(get_option('certificate-root')),
2891 'support URL: @0@'.format(support_url),
2892 'nobody user name: @0@'.format(nobody_user),
2893 'nobody group name: @0@'.format(nobody_group),
2894 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2895 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2896
2897 'default DNSSEC mode: @0@'.format(default_dnssec),
2898 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2899 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2900 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2901
2902 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2903 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2904 status += [
2905 'default DNS servers: @0@'.format(alt_dns_servers),
2906 'default NTP servers: @0@'.format(alt_ntp_servers)]
2907
2908 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2909 '@@0@'.format(time_epoch)).stdout().strip()
2910 status += [
2911 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2912
2913 # TODO:
2914 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2915 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2916 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2917
2918 if conf.get('ENABLE_EFI') == 1
2919 status += [
2920 'efi arch: @0@'.format(efi_arch)]
2921
2922 if have_gnu_efi
2923 status += [
2924 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2925 'EFI CC @0@'.format(efi_cc),
2926 'EFI lib directory: @0@'.format(efi_libdir),
2927 'EFI lds directory: @0@'.format(efi_ldsdir),
2928 'EFI include directory: @0@'.format(efi_incdir)]
2929 endif
2930 endif
2931
2932 found = []
2933 missing = []
2934
2935 foreach tuple : [
2936 ['libcryptsetup'],
2937 ['PAM'],
2938 ['AUDIT'],
2939 ['IMA'],
2940 ['AppArmor'],
2941 ['SELinux'],
2942 ['SECCOMP'],
2943 ['SMACK'],
2944 ['zlib'],
2945 ['xz'],
2946 ['lz4'],
2947 ['bzip2'],
2948 ['ACL'],
2949 ['gcrypt'],
2950 ['qrencode'],
2951 ['microhttpd'],
2952 ['gnutls'],
2953 ['libcurl'],
2954 ['idn'],
2955 ['libidn2'],
2956 ['libidn'],
2957 ['libiptc'],
2958 ['elfutils'],
2959 ['binfmt'],
2960 ['vconsole'],
2961 ['quotacheck'],
2962 ['tmpfiles'],
2963 ['environment.d'],
2964 ['sysusers'],
2965 ['firstboot'],
2966 ['randomseed'],
2967 ['backlight'],
2968 ['rfkill'],
2969 ['logind'],
2970 ['machined'],
2971 ['portabled'],
2972 ['importd'],
2973 ['hostnamed'],
2974 ['timedated'],
2975 ['timesyncd'],
2976 ['localed'],
2977 ['networkd'],
2978 ['resolve'],
2979 ['DNS-over-TLS'],
2980 ['coredump'],
2981 ['polkit'],
2982 ['legacy pkla', install_polkit_pkla],
2983 ['efi'],
2984 ['gnu-efi', have_gnu_efi],
2985 ['kmod'],
2986 ['xkbcommon'],
2987 ['pcre2'],
2988 ['blkid'],
2989 ['dbus'],
2990 ['glib'],
2991 ['nss-myhostname', conf.get('ENABLE_NSS_MYHOSTNAME') == 1],
2992 ['nss-mymachines', conf.get('ENABLE_NSS_MYMACHINES') == 1],
2993 ['nss-resolve', conf.get('ENABLE_NSS_RESOLVE') == 1],
2994 ['nss-systemd', conf.get('ENABLE_NSS_SYSTEMD') == 1],
2995 ['hwdb'],
2996 ['tpm'],
2997 ['man pages', want_man],
2998 ['html pages', want_html],
2999 ['man page indices', want_man and have_lxml],
3000 ['SysV compat'],
3001 ['utmp'],
3002 ['ldconfig'],
3003 ['hibernate'],
3004 ['adm group', get_option('adm-group')],
3005 ['wheel group', get_option('wheel-group')],
3006 ['gshadow'],
3007 ['debug hashmap'],
3008 ['debug mmap cache'],
3009 ['valgrind', conf.get('VALGRIND') == 1],
3010 ]
3011
3012 if tuple.length() >= 2
3013 cond = tuple[1]
3014 else
3015 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3016 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3017 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3018 endif
3019 if cond
3020 found += [tuple[0]]
3021 else
3022 missing += [tuple[0]]
3023 endif
3024 endforeach
3025
3026 status += [
3027 '',
3028 'enabled features: @0@'.format(', '.join(found)),
3029 '',
3030 'disabled features: @0@'.format(', '.join(missing)),
3031 '']
3032 message('\n '.join(status))
3033
3034 if rootprefixdir != rootprefix_default
3035 warning('\n' +
3036 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3037 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3038 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3039 endif