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