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