]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
Merge pull request #4522 from lucaswerkmeister/unescape-template
[thirdparty/systemd.git] / meson.build
1 # SPDX-License-Identifier: LGPL-2.1+
2
3 project('systemd', 'c',
4 version : '239',
5 license : 'LGPLv2+',
6 default_options: [
7 'c_std=gnu99',
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
11 ],
12 meson_version : '>= 0.44',
13 )
14
15 libsystemd_version = '0.23.0'
16 libudev_version = '1.6.11'
17
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
21 # set. Ugh, ugh, ugh!
22 conf = configuration_data()
23 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
25
26 substs = configuration_data()
27 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PACKAGE_VERSION', meson.project_version())
29
30 #####################################################################
31
32 # Try to install the git pre-commit hook
33 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
34 if git_hook.returncode() == 0
35 message(git_hook.stdout().strip())
36 endif
37
38 #####################################################################
39
40 if get_option('split-usr') == 'auto'
41 split_usr = run_command('test', '-L', '/bin').returncode() != 0
42 else
43 split_usr = get_option('split-usr') == 'true'
44 endif
45 conf.set10('HAVE_SPLIT_USR', split_usr,
46 description : '/usr/bin and /bin directories are separate')
47
48 if get_option('split-bin') == 'auto'
49 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
50 else
51 split_bin = get_option('split-bin') == 'true'
52 endif
53 conf.set10('HAVE_SPLIT_BIN', split_bin,
54 description : 'bin and sbin directories are separate')
55
56 rootprefixdir = get_option('rootprefix')
57 # Unusual rootprefixdir values are used by some distros
58 # (see https://github.com/systemd/systemd/pull/7461).
59 rootprefix_default = split_usr ? '/' : '/usr'
60 if rootprefixdir == ''
61 rootprefixdir = rootprefix_default
62 endif
63
64 sysvinit_path = get_option('sysvinit-path')
65 sysvrcnd_path = get_option('sysvrcnd-path')
66 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
67 description : 'SysV init scripts and rcN.d links are supported')
68
69 # join_paths ignore the preceding arguments if an absolute component is
70 # encountered, so this should canonicalize various paths when they are
71 # absolute or relative.
72 prefixdir = get_option('prefix')
73 if not prefixdir.startswith('/')
74 error('Prefix is not absolute: "@0@"'.format(prefixdir))
75 endif
76 bindir = join_paths(prefixdir, get_option('bindir'))
77 libdir = join_paths(prefixdir, get_option('libdir'))
78 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
79 includedir = join_paths(prefixdir, get_option('includedir'))
80 datadir = join_paths(prefixdir, get_option('datadir'))
81 localstatedir = join_paths('/', get_option('localstatedir'))
82
83 rootbindir = join_paths(rootprefixdir, 'bin')
84 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
85 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
86
87 rootlibdir = get_option('rootlibdir')
88 if rootlibdir == ''
89 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
90 endif
91
92 # Dirs of external packages
93 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
94 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
95 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
96 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
97 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
98 varlogdir = join_paths(localstatedir, 'log')
99 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
100 rpmmacrosdir = get_option('rpmmacrosdir')
101 if rpmmacrosdir != 'no'
102 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
103 endif
104 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
105
106 # Our own paths
107 pkgdatadir = join_paths(datadir, 'systemd')
108 environmentdir = join_paths(prefixdir, 'lib/environment.d')
109 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
110 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
111 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
112 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
113 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
114 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
115 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
116 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
117 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
118 pkgincludedir = join_paths(includedir, 'systemd')
119 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
120 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
121 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
122 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
123 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
124 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
125 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
126 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
127 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
128 udevhomedir = udevlibexecdir
129 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
130 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
131 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
132 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
133 factorydir = join_paths(datadir, 'factory')
134 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
135 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
136 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
137 catalogstatedir = join_paths(systemdstatedir, 'catalog')
138 randomseeddir = join_paths(localstatedir, 'lib/systemd')
139 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
140
141 docdir = get_option('docdir')
142 if docdir == ''
143 docdir = join_paths(datadir, 'doc/systemd')
144 endif
145
146 dbuspolicydir = get_option('dbuspolicydir')
147 if dbuspolicydir == ''
148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
149 endif
150
151 dbussessionservicedir = get_option('dbussessionservicedir')
152 if dbussessionservicedir == ''
153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
154 endif
155
156 dbussystemservicedir = get_option('dbussystemservicedir')
157 if dbussystemservicedir == ''
158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
159 endif
160
161 pamlibdir = get_option('pamlibdir')
162 if pamlibdir == ''
163 pamlibdir = join_paths(rootlibdir, 'security')
164 endif
165
166 pamconfdir = get_option('pamconfdir')
167 if pamconfdir == ''
168 pamconfdir = join_paths(sysconfdir, 'pam.d')
169 endif
170
171 memory_accounting_default = get_option('memory-accounting-default')
172
173 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
174 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
175 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
176 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
177 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
178 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
179 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
180
181 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
182
183 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
184 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
185 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
186 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
187 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
188 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
189 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
190 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
191 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
192 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
193 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
194 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
195 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
196 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
197 conf.set_quoted('ROOTPREFIX', rootprefixdir)
198 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
199 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
200 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
201 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
202 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
203 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
204 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
205 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
206 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
207 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
208 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
209 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
210 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
211 conf.set_quoted('LIBDIR', libdir)
212 conf.set_quoted('ROOTLIBDIR', rootlibdir)
213 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
214 conf.set_quoted('BOOTLIBDIR', bootlibdir)
215 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
216 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
217 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
218 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
219 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
220 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
221 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
222 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
223
224 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
225 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
226
227 substs.set('prefix', prefixdir)
228 substs.set('exec_prefix', prefixdir)
229 substs.set('libdir', libdir)
230 substs.set('rootlibdir', rootlibdir)
231 substs.set('includedir', includedir)
232 substs.set('pkgsysconfdir', pkgsysconfdir)
233 substs.set('bindir', bindir)
234 substs.set('rootbindir', rootbindir)
235 substs.set('rootlibexecdir', rootlibexecdir)
236 substs.set('systemunitdir', systemunitdir)
237 substs.set('userunitdir', userunitdir)
238 substs.set('systempresetdir', systempresetdir)
239 substs.set('userpresetdir', userpresetdir)
240 substs.set('udevhwdbdir', udevhwdbdir)
241 substs.set('udevrulesdir', udevrulesdir)
242 substs.set('udevlibexecdir', udevlibexecdir)
243 substs.set('environmentdir', environmentdir)
244 substs.set('catalogdir', catalogdir)
245 substs.set('tmpfilesdir', tmpfilesdir)
246 substs.set('sysusersdir', sysusersdir)
247 substs.set('sysctldir', sysctldir)
248 substs.set('binfmtdir', binfmtdir)
249 substs.set('modulesloaddir', modulesloaddir)
250 substs.set('modprobedir', modprobedir)
251 substs.set('systemgeneratordir', systemgeneratordir)
252 substs.set('usergeneratordir', usergeneratordir)
253 substs.set('systemenvgeneratordir', systemenvgeneratordir)
254 substs.set('userenvgeneratordir', userenvgeneratordir)
255 substs.set('systemshutdowndir', systemshutdowndir)
256 substs.set('systemsleepdir', systemsleepdir)
257 substs.set('VARLOGDIR', varlogdir)
258 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
259 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
260 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
261 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
262 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
263 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
264 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
265 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
266
267 #####################################################################
268
269 cc = meson.get_compiler('c')
270 pkgconfig = import('pkgconfig')
271 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
272 meson_build_sh = find_program('tools/meson-build.sh')
273
274 if get_option('tests') != 'false'
275 cxx = find_program('c++', required : false)
276 if cxx.found()
277 # Used only for tests
278 add_languages('cpp')
279 endif
280 endif
281
282 want_ossfuzz = get_option('oss-fuzz')
283 want_libfuzzer = get_option('llvm-fuzz')
284 fuzzer_build = want_ossfuzz or want_libfuzzer
285 if want_ossfuzz and want_libfuzzer
286 error('only one of oss-fuzz and llvm-fuzz can be specified')
287 endif
288 if want_libfuzzer
289 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
290 endif
291 if want_ossfuzz
292 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
293 endif
294
295 possible_cc_flags = [
296 '-Wextra',
297 '-Werror=undef',
298 '-Wlogical-op',
299 '-Wmissing-include-dirs',
300 '-Wold-style-definition',
301 '-Wpointer-arith',
302 '-Winit-self',
303 '-Wfloat-equal',
304 '-Wsuggest-attribute=noreturn',
305 '-Werror=missing-prototypes',
306 '-Werror=implicit-function-declaration',
307 '-Werror=missing-declarations',
308 '-Werror=return-type',
309 '-Werror=incompatible-pointer-types',
310 '-Werror=format=2',
311 '-Wstrict-prototypes',
312 '-Wredundant-decls',
313 '-Wmissing-noreturn',
314 '-Wimplicit-fallthrough=5',
315 '-Wshadow',
316 '-Wendif-labels',
317 '-Wstrict-aliasing=2',
318 '-Wwrite-strings',
319 '-Werror=overflow',
320 '-Werror=shift-count-overflow',
321 '-Werror=shift-overflow=2',
322 '-Wdate-time',
323 '-Wnested-externs',
324 '-ffast-math',
325 '-fno-common',
326 '-fdiagnostics-show-option',
327 '-fno-strict-aliasing',
328 '-fvisibility=hidden',
329 '-fstack-protector',
330 '-fstack-protector-strong',
331 '--param=ssp-buffer-size=4',
332 ]
333
334 # --as-needed and --no-undefined are provided by meson by default,
335 # run mesonconf to see what is enabled
336 possible_link_flags = [
337 '-Wl,-z,relro',
338 '-Wl,-z,now',
339 ]
340
341 # the oss-fuzz fuzzers are not built with -fPIE, so don't
342 # enable it when we are linking against them
343 if not fuzzer_build
344 possible_cc_flags += '-fPIE'
345 possible_link_flags += '-pie'
346 endif
347
348 if cc.get_id() == 'clang'
349 possible_cc_flags += [
350 '-Wno-typedef-redefinition',
351 '-Wno-gnu-variable-sized-type-not-at-end',
352 ]
353 endif
354
355 if get_option('buildtype') != 'debug'
356 possible_cc_flags += [
357 '-ffunction-sections',
358 '-fdata-sections',
359 ]
360
361 possible_link_flags += '-Wl,--gc-sections'
362 endif
363
364 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
365
366 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
367 # arguments, just emits a warning. So test for the "positive" version instead.
368 foreach arg : ['unused-parameter',
369 'missing-field-initializers',
370 'unused-result',
371 'format-signedness',
372 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
373 ]
374 if cc.has_argument('-W' + arg)
375 add_project_arguments('-Wno-' + arg, language : 'c')
376 endif
377 endforeach
378
379 if cc.compiles('''
380 #include <time.h>
381 #include <inttypes.h>
382 typedef uint64_t usec_t;
383 usec_t now(clockid_t clock);
384 int main(void) {
385 struct timespec now;
386 return 0;
387 }
388 ''', name : '-Werror=shadow with local shadowing')
389 add_project_arguments('-Werror=shadow', language : 'c')
390 endif
391
392 link_test_c = files('tools/meson-link-test.c')
393
394 foreach arg : possible_link_flags
395 have = run_command(check_compilation_sh,
396 cc.cmd_array(), '-x', 'c', arg,
397 '-include', link_test_c).returncode() == 0
398 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
399 if have
400 add_project_link_arguments(arg, language : 'c')
401 endif
402 endforeach
403
404 cpp = ' '.join(cc.cmd_array()) + ' -E'
405
406 #####################################################################
407 # compilation result tests
408
409 conf.set('_GNU_SOURCE', true)
410 conf.set('__SANE_USERSPACE_TYPES__', true)
411
412 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
417 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
418 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
419
420 decl_headers = '''
421 #include <uchar.h>
422 #include <linux/ethtool.h>
423 #include <linux/fib_rules.h>
424 #include <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 dns_over_tls = get_option('dns-over-tls')
1139 if dns_over_tls != 'false'
1140 have = libgnutls != [] and libgnutls.version().version_compare('>=3.5.3')
1141 if dns_over_tls == 'true' and not have
1142 error('DNS-over-TLS support was requested, but dependencies are not available')
1143 endif
1144 else
1145 have = false
1146 endif
1147 conf.set10('ENABLE_DNS_OVER_TLS', have)
1148
1149 default_dns_over_tls = get_option('default-dns-over-tls')
1150 if fuzzer_build
1151 default_dns_over_tls = 'no'
1152 endif
1153 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1154 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1155 default_dns_over_tls = 'no'
1156 endif
1157 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1158 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1159 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1160
1161 want_importd = get_option('importd')
1162 if want_importd != 'false'
1163 have = (conf.get('HAVE_LIBCURL') == 1 and
1164 conf.get('HAVE_ZLIB') == 1 and
1165 conf.get('HAVE_BZIP2') == 1 and
1166 conf.get('HAVE_XZ') == 1 and
1167 conf.get('HAVE_GCRYPT') == 1)
1168 if want_importd == 'true' and not have
1169 error('importd support was requested, but dependencies are not available')
1170 endif
1171 else
1172 have = false
1173 endif
1174 conf.set10('ENABLE_IMPORTD', have)
1175
1176 want_remote = get_option('remote')
1177 if want_remote != 'false'
1178 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1179 conf.get('HAVE_LIBCURL') == 1]
1180 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1181 # it's possible to build one without the other. Complain only if
1182 # support was explictly requested. The auxiliary files like sysusers
1183 # config should be installed when any of the programs are built.
1184 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1185 error('remote support was requested, but dependencies are not available')
1186 endif
1187 have = have_deps[0] or have_deps[1]
1188 else
1189 have = false
1190 endif
1191 conf.set10('ENABLE_REMOTE', have)
1192
1193 foreach term : ['utmp',
1194 'hibernate',
1195 'environment-d',
1196 'binfmt',
1197 'coredump',
1198 'resolve',
1199 'logind',
1200 'hostnamed',
1201 'localed',
1202 'machined',
1203 'portabled',
1204 'networkd',
1205 'timedated',
1206 'timesyncd',
1207 'myhostname',
1208 'firstboot',
1209 'randomseed',
1210 'backlight',
1211 'vconsole',
1212 'quotacheck',
1213 'sysusers',
1214 'tmpfiles',
1215 'hwdb',
1216 'rfkill',
1217 'ldconfig',
1218 'efi',
1219 'tpm',
1220 'ima',
1221 'smack',
1222 'gshadow',
1223 'idn',
1224 'nss-systemd']
1225 have = get_option(term)
1226 name = 'ENABLE_' + term.underscorify().to_upper()
1227 conf.set10(name, have)
1228 endforeach
1229
1230 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1231
1232 want_tests = get_option('tests')
1233 install_tests = get_option('install-tests')
1234 slow_tests = get_option('slow-tests')
1235 tests = []
1236 fuzzers = []
1237
1238 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1239
1240 #####################################################################
1241
1242 if get_option('efi')
1243 efi_arch = host_machine.cpu_family()
1244
1245 if efi_arch == 'x86'
1246 EFI_MACHINE_TYPE_NAME = 'ia32'
1247 gnu_efi_arch = 'ia32'
1248 elif efi_arch == 'x86_64'
1249 EFI_MACHINE_TYPE_NAME = 'x64'
1250 gnu_efi_arch = 'x86_64'
1251 elif efi_arch == 'arm'
1252 EFI_MACHINE_TYPE_NAME = 'arm'
1253 gnu_efi_arch = 'arm'
1254 elif efi_arch == 'aarch64'
1255 EFI_MACHINE_TYPE_NAME = 'aa64'
1256 gnu_efi_arch = 'aarch64'
1257 else
1258 EFI_MACHINE_TYPE_NAME = ''
1259 gnu_efi_arch = ''
1260 endif
1261
1262 have = true
1263 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1264
1265 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1266 else
1267 have = false
1268 endif
1269 conf.set10('ENABLE_EFI', have)
1270
1271 #####################################################################
1272
1273 config_h = configure_file(
1274 output : 'config.h',
1275 configuration : conf)
1276
1277 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1278
1279 includes = include_directories('src/basic',
1280 'src/shared',
1281 'src/systemd',
1282 'src/journal',
1283 'src/journal-remote',
1284 'src/nspawn',
1285 'src/resolve',
1286 'src/timesync',
1287 'src/time-wait-sync',
1288 'src/login',
1289 'src/udev',
1290 'src/libudev',
1291 'src/core',
1292 'src/libsystemd/sd-bus',
1293 'src/libsystemd/sd-device',
1294 'src/libsystemd/sd-hwdb',
1295 'src/libsystemd/sd-id128',
1296 'src/libsystemd/sd-netlink',
1297 'src/libsystemd/sd-network',
1298 'src/libsystemd-network',
1299 '.')
1300
1301 add_project_arguments('-include', 'config.h', language : 'c')
1302
1303 subdir('po')
1304 subdir('catalog')
1305 subdir('src/systemd')
1306 subdir('src/basic')
1307 subdir('src/libsystemd')
1308 subdir('src/libsystemd-network')
1309 subdir('src/journal')
1310 subdir('src/login')
1311
1312 libjournal_core = static_library(
1313 'journal-core',
1314 libjournal_core_sources,
1315 journald_gperf_c,
1316 include_directories : includes,
1317 install : false)
1318
1319 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1320 libsystemd = shared_library(
1321 'systemd',
1322 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1323 version : libsystemd_version,
1324 include_directories : includes,
1325 link_args : ['-shared',
1326 '-Wl,--version-script=' + libsystemd_sym_path],
1327 link_with : [libbasic,
1328 libbasic_gcrypt],
1329 link_whole : [libsystemd_static,
1330 libjournal_client],
1331 dependencies : [threads,
1332 librt,
1333 libxz,
1334 liblz4],
1335 link_depends : libsystemd_sym,
1336 install : true,
1337 install_dir : rootlibdir)
1338
1339 static_libsystemd = get_option('static-libsystemd')
1340 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1341
1342 install_libsystemd_static = static_library(
1343 'systemd',
1344 libsystemd_sources,
1345 journal_client_sources,
1346 basic_sources,
1347 basic_gcrypt_sources,
1348 include_directories : includes,
1349 build_by_default : static_libsystemd != 'false',
1350 install : static_libsystemd != 'false',
1351 install_dir : rootlibdir,
1352 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1353 dependencies : [threads,
1354 librt,
1355 libxz,
1356 liblz4,
1357 libcap,
1358 libblkid,
1359 libmount,
1360 libselinux,
1361 libgcrypt],
1362 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1363
1364 ############################################################
1365
1366 # binaries that have --help and are intended for use by humans,
1367 # usually, but not always, installed in /bin.
1368 public_programs = []
1369
1370 subdir('src/libudev')
1371 subdir('src/shared')
1372 subdir('src/core')
1373 subdir('src/udev')
1374 subdir('src/network')
1375
1376 subdir('src/analyze')
1377 subdir('src/journal-remote')
1378 subdir('src/coredump')
1379 subdir('src/hostname')
1380 subdir('src/import')
1381 subdir('src/kernel-install')
1382 subdir('src/locale')
1383 subdir('src/machine')
1384 subdir('src/portable')
1385 subdir('src/nspawn')
1386 subdir('src/resolve')
1387 subdir('src/timedate')
1388 subdir('src/timesync')
1389 subdir('src/vconsole')
1390 subdir('src/boot/efi')
1391
1392 subdir('src/test')
1393 subdir('src/fuzz')
1394 subdir('rules')
1395 subdir('test')
1396
1397 ############################################################
1398
1399 # only static linking apart from libdl, to make sure that the
1400 # module is linked to all libraries that it uses.
1401 test_dlopen = executable(
1402 'test-dlopen',
1403 test_dlopen_c,
1404 include_directories : includes,
1405 link_with : [libbasic],
1406 dependencies : [libdl])
1407
1408 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1409 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1410 ['mymachines', 'ENABLE_MACHINED'],
1411 ['resolve', 'ENABLE_RESOLVE']]
1412
1413 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1414 if condition
1415 module = tuple[0]
1416
1417 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1418 version_script_arg = join_paths(meson.current_source_dir(), sym)
1419
1420 nss = shared_library(
1421 'nss_' + module,
1422 'src/nss-@0@/nss-@0@.c'.format(module),
1423 version : '2',
1424 include_directories : includes,
1425 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1426 link_args : ['-Wl,-z,nodelete',
1427 '-shared',
1428 '-Wl,--version-script=' + version_script_arg,
1429 '-Wl,--undefined'],
1430 link_with : [libsystemd_static,
1431 libbasic],
1432 dependencies : [threads,
1433 librt],
1434 link_depends : sym,
1435 install : true,
1436 install_dir : rootlibdir)
1437
1438 # We cannot use shared_module because it does not support version suffix.
1439 # Unfortunately shared_library insists on creating the symlink…
1440 meson.add_install_script('sh', '-c',
1441 'rm $DESTDIR@0@/libnss_@1@.so'
1442 .format(rootlibdir, module))
1443
1444 test('dlopen-nss_' + module,
1445 test_dlopen,
1446 args : [nss.full_path()]) # path to dlopen must include a slash
1447 endif
1448 endforeach
1449
1450 ############################################################
1451
1452 executable('systemd',
1453 systemd_sources,
1454 include_directories : includes,
1455 link_with : [libcore,
1456 libshared],
1457 dependencies : [threads,
1458 librt,
1459 libseccomp,
1460 libselinux,
1461 libmount,
1462 libblkid],
1463 install_rpath : rootlibexecdir,
1464 install : true,
1465 install_dir : rootlibexecdir)
1466
1467 meson.add_install_script(meson_make_symlink,
1468 join_paths(rootlibexecdir, 'systemd'),
1469 join_paths(rootsbindir, 'init'))
1470
1471 exe = executable('systemd-analyze',
1472 systemd_analyze_sources,
1473 include_directories : includes,
1474 link_with : [libcore,
1475 libshared],
1476 dependencies : [threads,
1477 librt,
1478 libseccomp,
1479 libselinux,
1480 libmount,
1481 libblkid],
1482 install_rpath : rootlibexecdir,
1483 install : true)
1484 public_programs += [exe]
1485
1486 executable('systemd-journald',
1487 systemd_journald_sources,
1488 include_directories : includes,
1489 link_with : [libjournal_core,
1490 libshared],
1491 dependencies : [threads,
1492 libxz,
1493 liblz4,
1494 libselinux],
1495 install_rpath : rootlibexecdir,
1496 install : true,
1497 install_dir : rootlibexecdir)
1498
1499 exe = executable('systemd-cat',
1500 systemd_cat_sources,
1501 include_directories : includes,
1502 link_with : [libjournal_core,
1503 libshared],
1504 dependencies : [threads],
1505 install_rpath : rootlibexecdir,
1506 install : true)
1507 public_programs += [exe]
1508
1509 exe = executable('journalctl',
1510 journalctl_sources,
1511 include_directories : includes,
1512 link_with : [libshared],
1513 dependencies : [threads,
1514 libqrencode,
1515 libxz,
1516 liblz4,
1517 libpcre2],
1518 install_rpath : rootlibexecdir,
1519 install : true,
1520 install_dir : rootbindir)
1521 public_programs += [exe]
1522
1523 executable('systemd-getty-generator',
1524 'src/getty-generator/getty-generator.c',
1525 include_directories : includes,
1526 link_with : [libshared],
1527 install_rpath : rootlibexecdir,
1528 install : true,
1529 install_dir : systemgeneratordir)
1530
1531 executable('systemd-debug-generator',
1532 'src/debug-generator/debug-generator.c',
1533 include_directories : includes,
1534 link_with : [libshared],
1535 install_rpath : rootlibexecdir,
1536 install : true,
1537 install_dir : systemgeneratordir)
1538
1539 executable('systemd-fstab-generator',
1540 'src/fstab-generator/fstab-generator.c',
1541 'src/core/mount-setup.c',
1542 include_directories : includes,
1543 link_with : [libshared],
1544 install_rpath : rootlibexecdir,
1545 install : true,
1546 install_dir : systemgeneratordir)
1547
1548 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1549 executable('30-systemd-environment-d-generator',
1550 'src/environment-d-generator/environment-d-generator.c',
1551 include_directories : includes,
1552 link_with : [libshared],
1553 install_rpath : rootlibexecdir,
1554 install : true,
1555 install_dir : userenvgeneratordir)
1556
1557 meson.add_install_script(meson_make_symlink,
1558 join_paths(sysconfdir, 'environment'),
1559 join_paths(environmentdir, '99-environment.conf'))
1560 endif
1561
1562 if conf.get('ENABLE_HIBERNATE') == 1
1563 executable('systemd-hibernate-resume-generator',
1564 'src/hibernate-resume/hibernate-resume-generator.c',
1565 include_directories : includes,
1566 link_with : [libshared],
1567 install_rpath : rootlibexecdir,
1568 install : true,
1569 install_dir : systemgeneratordir)
1570
1571 executable('systemd-hibernate-resume',
1572 'src/hibernate-resume/hibernate-resume.c',
1573 include_directories : includes,
1574 link_with : [libshared],
1575 install_rpath : rootlibexecdir,
1576 install : true,
1577 install_dir : rootlibexecdir)
1578 endif
1579
1580 if conf.get('HAVE_BLKID') == 1
1581 executable('systemd-gpt-auto-generator',
1582 'src/gpt-auto-generator/gpt-auto-generator.c',
1583 'src/basic/blkid-util.h',
1584 include_directories : includes,
1585 link_with : [libshared],
1586 dependencies : libblkid,
1587 install_rpath : rootlibexecdir,
1588 install : true,
1589 install_dir : systemgeneratordir)
1590
1591 exe = executable('systemd-dissect',
1592 'src/dissect/dissect.c',
1593 include_directories : includes,
1594 link_with : [libshared],
1595 install_rpath : rootlibexecdir,
1596 install : true,
1597 install_dir : rootlibexecdir)
1598 public_programs += [exe]
1599 endif
1600
1601 if conf.get('ENABLE_RESOLVE') == 1
1602 executable('systemd-resolved',
1603 systemd_resolved_sources,
1604 include_directories : includes,
1605 link_with : [libshared,
1606 libbasic_gcrypt,
1607 libsystemd_resolve_core],
1608 dependencies : systemd_resolved_dependencies,
1609 install_rpath : rootlibexecdir,
1610 install : true,
1611 install_dir : rootlibexecdir)
1612
1613 exe = executable('resolvectl',
1614 resolvectl_sources,
1615 include_directories : includes,
1616 link_with : [libshared,
1617 libbasic_gcrypt,
1618 libsystemd_resolve_core],
1619 dependencies : [threads,
1620 libgpg_error,
1621 libm,
1622 libidn],
1623 install_rpath : rootlibexecdir,
1624 install : true)
1625 public_programs += [exe]
1626
1627 meson.add_install_script(meson_make_symlink,
1628 join_paths(bindir, 'resolvectl'),
1629 join_paths(rootsbindir, 'resolvconf'))
1630
1631 meson.add_install_script(meson_make_symlink,
1632 join_paths(bindir, 'resolvectl'),
1633 join_paths(bindir, 'systemd-resolve'))
1634 endif
1635
1636 if conf.get('ENABLE_LOGIND') == 1
1637 executable('systemd-logind',
1638 systemd_logind_sources,
1639 include_directories : includes,
1640 link_with : [liblogind_core,
1641 libshared],
1642 dependencies : [threads,
1643 libacl],
1644 install_rpath : rootlibexecdir,
1645 install : true,
1646 install_dir : rootlibexecdir)
1647
1648 exe = executable('loginctl',
1649 loginctl_sources,
1650 include_directories : includes,
1651 link_with : [libshared],
1652 dependencies : [threads,
1653 liblz4,
1654 libxz],
1655 install_rpath : rootlibexecdir,
1656 install : true,
1657 install_dir : rootbindir)
1658 public_programs += [exe]
1659
1660 exe = executable('systemd-inhibit',
1661 'src/login/inhibit.c',
1662 include_directories : includes,
1663 link_with : [libshared],
1664 install_rpath : rootlibexecdir,
1665 install : true,
1666 install_dir : rootbindir)
1667 public_programs += [exe]
1668
1669 if conf.get('HAVE_PAM') == 1
1670 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1671 pam_systemd = shared_library(
1672 'pam_systemd',
1673 pam_systemd_c,
1674 name_prefix : '',
1675 include_directories : includes,
1676 link_args : ['-shared',
1677 '-Wl,--version-script=' + version_script_arg],
1678 link_with : [libsystemd_static,
1679 libshared_static],
1680 dependencies : [threads,
1681 libpam,
1682 libpam_misc],
1683 link_depends : pam_systemd_sym,
1684 install : true,
1685 install_dir : pamlibdir)
1686
1687 test('dlopen-pam_systemd',
1688 test_dlopen,
1689 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1690 endif
1691 endif
1692
1693 executable('systemd-user-runtime-dir',
1694 user_runtime_dir_sources,
1695 include_directories : includes,
1696 link_with : [libshared, liblogind_core],
1697 install_rpath : rootlibexecdir,
1698 install : true,
1699 install_dir : rootlibexecdir)
1700
1701 if conf.get('HAVE_PAM') == 1
1702 executable('systemd-user-sessions',
1703 'src/user-sessions/user-sessions.c',
1704 include_directories : includes,
1705 link_with : [libshared],
1706 install_rpath : rootlibexecdir,
1707 install : true,
1708 install_dir : rootlibexecdir)
1709 endif
1710
1711 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1712 exe = executable('bootctl',
1713 'src/boot/bootctl.c',
1714 include_directories : includes,
1715 link_with : [libshared],
1716 dependencies : [libblkid],
1717 install_rpath : rootlibexecdir,
1718 install : true)
1719 public_programs += [exe]
1720 endif
1721
1722 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1723 include_directories : includes,
1724 link_with : [libshared],
1725 dependencies : [threads],
1726 install_rpath : rootlibexecdir,
1727 install : true)
1728 public_programs += [exe]
1729
1730
1731 if get_option('link-systemctl-shared')
1732 systemctl_link_with = [libshared]
1733 else
1734 systemctl_link_with = [libsystemd_static,
1735 libshared_static,
1736 libjournal_client,
1737 libbasic_gcrypt]
1738 endif
1739
1740 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1741 include_directories : includes,
1742 link_with : systemctl_link_with,
1743 dependencies : [threads,
1744 libcap,
1745 libselinux,
1746 libxz,
1747 liblz4],
1748 install_rpath : rootlibexecdir,
1749 install : true,
1750 install_dir : rootbindir)
1751 public_programs += [exe]
1752
1753 if conf.get('ENABLE_PORTABLED') == 1
1754 executable('systemd-portabled',
1755 systemd_portabled_sources,
1756 include_directories : includes,
1757 link_with : [libshared],
1758 dependencies : [threads],
1759 install_rpath : rootlibexecdir,
1760 install : true,
1761 install_dir : rootlibexecdir)
1762
1763 exe = executable('portablectl', 'src/portable/portablectl.c',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 dependencies : [threads],
1767 install_rpath : rootlibexecdir,
1768 install : true,
1769 install_dir : rootlibexecdir)
1770 public_programs += [exe]
1771 endif
1772
1773 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1774 meson.add_install_script(meson_make_symlink,
1775 join_paths(rootbindir, 'systemctl'),
1776 join_paths(rootsbindir, alias))
1777 endforeach
1778
1779 if conf.get('ENABLE_BACKLIGHT') == 1
1780 executable('systemd-backlight',
1781 'src/backlight/backlight.c',
1782 include_directories : includes,
1783 link_with : [libshared],
1784 install_rpath : rootlibexecdir,
1785 install : true,
1786 install_dir : rootlibexecdir)
1787 endif
1788
1789 if conf.get('ENABLE_RFKILL') == 1
1790 executable('systemd-rfkill',
1791 'src/rfkill/rfkill.c',
1792 include_directories : includes,
1793 link_with : [libshared],
1794 install_rpath : rootlibexecdir,
1795 install : true,
1796 install_dir : rootlibexecdir)
1797 endif
1798
1799 executable('systemd-system-update-generator',
1800 'src/system-update-generator/system-update-generator.c',
1801 include_directories : includes,
1802 link_with : [libshared],
1803 install_rpath : rootlibexecdir,
1804 install : true,
1805 install_dir : systemgeneratordir)
1806
1807 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1808 executable('systemd-cryptsetup',
1809 'src/cryptsetup/cryptsetup.c',
1810 include_directories : includes,
1811 link_with : [libshared],
1812 dependencies : [libcryptsetup],
1813 install_rpath : rootlibexecdir,
1814 install : true,
1815 install_dir : rootlibexecdir)
1816
1817 executable('systemd-cryptsetup-generator',
1818 'src/cryptsetup/cryptsetup-generator.c',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 dependencies : [libcryptsetup],
1822 install_rpath : rootlibexecdir,
1823 install : true,
1824 install_dir : systemgeneratordir)
1825
1826 executable('systemd-veritysetup',
1827 'src/veritysetup/veritysetup.c',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 dependencies : [libcryptsetup],
1831 install_rpath : rootlibexecdir,
1832 install : true,
1833 install_dir : rootlibexecdir)
1834
1835 executable('systemd-veritysetup-generator',
1836 'src/veritysetup/veritysetup-generator.c',
1837 include_directories : includes,
1838 link_with : [libshared],
1839 dependencies : [libcryptsetup],
1840 install_rpath : rootlibexecdir,
1841 install : true,
1842 install_dir : systemgeneratordir)
1843 endif
1844
1845 if conf.get('HAVE_SYSV_COMPAT') == 1
1846 executable('systemd-sysv-generator',
1847 'src/sysv-generator/sysv-generator.c',
1848 include_directories : includes,
1849 link_with : [libshared],
1850 install_rpath : rootlibexecdir,
1851 install : true,
1852 install_dir : systemgeneratordir)
1853
1854 executable('systemd-rc-local-generator',
1855 'src/rc-local-generator/rc-local-generator.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1859 install : true,
1860 install_dir : systemgeneratordir)
1861 endif
1862
1863 if conf.get('ENABLE_HOSTNAMED') == 1
1864 executable('systemd-hostnamed',
1865 'src/hostname/hostnamed.c',
1866 include_directories : includes,
1867 link_with : [libshared],
1868 install_rpath : rootlibexecdir,
1869 install : true,
1870 install_dir : rootlibexecdir)
1871
1872 exe = executable('hostnamectl',
1873 'src/hostname/hostnamectl.c',
1874 include_directories : includes,
1875 link_with : [libshared],
1876 install_rpath : rootlibexecdir,
1877 install : true)
1878 public_programs += [exe]
1879 endif
1880
1881 if conf.get('ENABLE_LOCALED') == 1
1882 if conf.get('HAVE_XKBCOMMON') == 1
1883 # logind will load libxkbcommon.so dynamically on its own
1884 deps = [libdl]
1885 else
1886 deps = []
1887 endif
1888
1889 executable('systemd-localed',
1890 systemd_localed_sources,
1891 include_directories : includes,
1892 link_with : [libshared],
1893 dependencies : deps,
1894 install_rpath : rootlibexecdir,
1895 install : true,
1896 install_dir : rootlibexecdir)
1897
1898 exe = executable('localectl',
1899 localectl_sources,
1900 include_directories : includes,
1901 link_with : [libshared],
1902 install_rpath : rootlibexecdir,
1903 install : true)
1904 public_programs += [exe]
1905 endif
1906
1907 if conf.get('ENABLE_TIMEDATED') == 1
1908 executable('systemd-timedated',
1909 'src/timedate/timedated.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 install_rpath : rootlibexecdir,
1913 install : true,
1914 install_dir : rootlibexecdir)
1915 endif
1916
1917 if conf.get('ENABLE_TIMEDATECTL') == 1
1918 exe = executable('timedatectl',
1919 'src/timedate/timedatectl.c',
1920 include_directories : includes,
1921 install_rpath : rootlibexecdir,
1922 link_with : [libshared],
1923 dependencies : [libm],
1924 install : true)
1925 public_programs += [exe]
1926 endif
1927
1928 if conf.get('ENABLE_TIMESYNCD') == 1
1929 executable('systemd-timesyncd',
1930 systemd_timesyncd_sources,
1931 include_directories : includes,
1932 link_with : [libshared],
1933 dependencies : [threads,
1934 libm],
1935 install_rpath : rootlibexecdir,
1936 install : true,
1937 install_dir : rootlibexecdir)
1938
1939 executable('systemd-time-wait-sync',
1940 'src/time-wait-sync/time-wait-sync.c',
1941 include_directories : includes,
1942 link_with : [libshared],
1943 install_rpath : rootlibexecdir,
1944 install : true,
1945 install_dir : rootlibexecdir)
1946 endif
1947
1948 if conf.get('ENABLE_MACHINED') == 1
1949 executable('systemd-machined',
1950 systemd_machined_sources,
1951 include_directories : includes,
1952 link_with : [libmachine_core,
1953 libshared],
1954 install_rpath : rootlibexecdir,
1955 install : true,
1956 install_dir : rootlibexecdir)
1957
1958 exe = executable('machinectl',
1959 'src/machine/machinectl.c',
1960 include_directories : includes,
1961 link_with : [libshared],
1962 dependencies : [threads,
1963 libxz,
1964 liblz4],
1965 install_rpath : rootlibexecdir,
1966 install : true,
1967 install_dir : rootbindir)
1968 public_programs += [exe]
1969 endif
1970
1971 if conf.get('ENABLE_IMPORTD') == 1
1972 executable('systemd-importd',
1973 systemd_importd_sources,
1974 include_directories : includes,
1975 link_with : [libshared],
1976 dependencies : [threads],
1977 install_rpath : rootlibexecdir,
1978 install : true,
1979 install_dir : rootlibexecdir)
1980
1981 systemd_pull = executable('systemd-pull',
1982 systemd_pull_sources,
1983 include_directories : includes,
1984 link_with : [libshared],
1985 dependencies : [libcurl,
1986 libz,
1987 libbzip2,
1988 libxz,
1989 libgcrypt],
1990 install_rpath : rootlibexecdir,
1991 install : true,
1992 install_dir : rootlibexecdir)
1993
1994 systemd_import = executable('systemd-import',
1995 systemd_import_sources,
1996 include_directories : includes,
1997 link_with : [libshared],
1998 dependencies : [libcurl,
1999 libz,
2000 libbzip2,
2001 libxz],
2002 install_rpath : rootlibexecdir,
2003 install : true,
2004 install_dir : rootlibexecdir)
2005
2006 systemd_export = executable('systemd-export',
2007 systemd_export_sources,
2008 include_directories : includes,
2009 link_with : [libshared],
2010 dependencies : [libcurl,
2011 libz,
2012 libbzip2,
2013 libxz],
2014 install_rpath : rootlibexecdir,
2015 install : true,
2016 install_dir : rootlibexecdir)
2017 public_programs += [systemd_pull, systemd_import, systemd_export]
2018 endif
2019
2020 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2021 exe = executable('systemd-journal-upload',
2022 systemd_journal_upload_sources,
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [threads,
2026 libcurl,
2027 libgnutls,
2028 libxz,
2029 liblz4],
2030 install_rpath : rootlibexecdir,
2031 install : true,
2032 install_dir : rootlibexecdir)
2033 public_programs += [exe]
2034 endif
2035
2036 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2037 s_j_remote = executable('systemd-journal-remote',
2038 systemd_journal_remote_sources,
2039 include_directories : includes,
2040 link_with : [libshared,
2041 libsystemd_journal_remote],
2042 dependencies : [threads,
2043 libmicrohttpd,
2044 libgnutls,
2045 libxz,
2046 liblz4],
2047 install_rpath : rootlibexecdir,
2048 install : true,
2049 install_dir : rootlibexecdir)
2050
2051 s_j_gatewayd = executable('systemd-journal-gatewayd',
2052 systemd_journal_gatewayd_sources,
2053 include_directories : includes,
2054 link_with : [libshared],
2055 dependencies : [threads,
2056 libmicrohttpd,
2057 libgnutls,
2058 libxz,
2059 liblz4],
2060 install_rpath : rootlibexecdir,
2061 install : true,
2062 install_dir : rootlibexecdir)
2063 public_programs += [s_j_remote, s_j_gatewayd]
2064 endif
2065
2066 if conf.get('ENABLE_COREDUMP') == 1
2067 executable('systemd-coredump',
2068 systemd_coredump_sources,
2069 include_directories : includes,
2070 link_with : [libshared],
2071 dependencies : [threads,
2072 libacl,
2073 libdw,
2074 libxz,
2075 liblz4],
2076 install_rpath : rootlibexecdir,
2077 install : true,
2078 install_dir : rootlibexecdir)
2079
2080 exe = executable('coredumpctl',
2081 coredumpctl_sources,
2082 include_directories : includes,
2083 link_with : [libshared],
2084 dependencies : [threads,
2085 libxz,
2086 liblz4],
2087 install_rpath : rootlibexecdir,
2088 install : true)
2089 public_programs += [exe]
2090 endif
2091
2092 if conf.get('ENABLE_BINFMT') == 1
2093 exe = executable('systemd-binfmt',
2094 'src/binfmt/binfmt.c',
2095 include_directories : includes,
2096 link_with : [libshared],
2097 install_rpath : rootlibexecdir,
2098 install : true,
2099 install_dir : rootlibexecdir)
2100 public_programs += [exe]
2101
2102 meson.add_install_script('sh', '-c',
2103 mkdir_p.format(binfmtdir))
2104 meson.add_install_script('sh', '-c',
2105 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2106 endif
2107
2108 if conf.get('ENABLE_VCONSOLE') == 1
2109 executable('systemd-vconsole-setup',
2110 'src/vconsole/vconsole-setup.c',
2111 include_directories : includes,
2112 link_with : [libshared],
2113 install_rpath : rootlibexecdir,
2114 install : true,
2115 install_dir : rootlibexecdir)
2116 endif
2117
2118 if conf.get('ENABLE_RANDOMSEED') == 1
2119 executable('systemd-random-seed',
2120 'src/random-seed/random-seed.c',
2121 include_directories : includes,
2122 link_with : [libshared],
2123 install_rpath : rootlibexecdir,
2124 install : true,
2125 install_dir : rootlibexecdir)
2126 endif
2127
2128 if conf.get('ENABLE_FIRSTBOOT') == 1
2129 executable('systemd-firstboot',
2130 'src/firstboot/firstboot.c',
2131 include_directories : includes,
2132 link_with : [libshared],
2133 dependencies : [libcrypt],
2134 install_rpath : rootlibexecdir,
2135 install : true,
2136 install_dir : rootbindir)
2137 endif
2138
2139 executable('systemd-remount-fs',
2140 'src/remount-fs/remount-fs.c',
2141 'src/core/mount-setup.c',
2142 'src/core/mount-setup.h',
2143 include_directories : includes,
2144 link_with : [libshared],
2145 install_rpath : rootlibexecdir,
2146 install : true,
2147 install_dir : rootlibexecdir)
2148
2149 executable('systemd-machine-id-setup',
2150 'src/machine-id-setup/machine-id-setup-main.c',
2151 'src/core/machine-id-setup.c',
2152 'src/core/machine-id-setup.h',
2153 include_directories : includes,
2154 link_with : [libshared],
2155 install_rpath : rootlibexecdir,
2156 install : true,
2157 install_dir : rootbindir)
2158
2159 executable('systemd-fsck',
2160 'src/fsck/fsck.c',
2161 include_directories : includes,
2162 link_with : [libshared],
2163 install_rpath : rootlibexecdir,
2164 install : true,
2165 install_dir : rootlibexecdir)
2166
2167 executable('systemd-growfs',
2168 'src/partition/growfs.c',
2169 include_directories : includes,
2170 link_with : [libshared],
2171 dependencies : [libcryptsetup],
2172 install_rpath : rootlibexecdir,
2173 install : true,
2174 install_dir : rootlibexecdir)
2175
2176 executable('systemd-makefs',
2177 'src/partition/makefs.c',
2178 include_directories : includes,
2179 link_with : [libshared],
2180 install_rpath : rootlibexecdir,
2181 install : true,
2182 install_dir : rootlibexecdir)
2183
2184 executable('systemd-sleep',
2185 'src/sleep/sleep.c',
2186 include_directories : includes,
2187 link_with : [libshared],
2188 install_rpath : rootlibexecdir,
2189 install : true,
2190 install_dir : rootlibexecdir)
2191
2192 exe = executable('systemd-sysctl',
2193 'src/sysctl/sysctl.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 install_rpath : rootlibexecdir,
2197 install : true,
2198 install_dir : rootlibexecdir)
2199 public_programs += [exe]
2200
2201 executable('systemd-ac-power',
2202 'src/ac-power/ac-power.c',
2203 include_directories : includes,
2204 link_with : [libshared],
2205 install_rpath : rootlibexecdir,
2206 install : true,
2207 install_dir : rootlibexecdir)
2208
2209 exe = executable('systemd-detect-virt',
2210 'src/detect-virt/detect-virt.c',
2211 include_directories : includes,
2212 link_with : [libshared],
2213 install_rpath : rootlibexecdir,
2214 install : true)
2215 public_programs += [exe]
2216
2217 exe = executable('systemd-delta',
2218 'src/delta/delta.c',
2219 include_directories : includes,
2220 link_with : [libshared],
2221 install_rpath : rootlibexecdir,
2222 install : true)
2223 public_programs += [exe]
2224
2225 exe = executable('systemd-escape',
2226 'src/escape/escape.c',
2227 include_directories : includes,
2228 link_with : [libshared],
2229 install_rpath : rootlibexecdir,
2230 install : true,
2231 install_dir : rootbindir)
2232 public_programs += [exe]
2233
2234 exe = executable('systemd-notify',
2235 'src/notify/notify.c',
2236 include_directories : includes,
2237 link_with : [libshared],
2238 install_rpath : rootlibexecdir,
2239 install : true,
2240 install_dir : rootbindir)
2241 public_programs += [exe]
2242
2243 executable('systemd-volatile-root',
2244 'src/volatile-root/volatile-root.c',
2245 include_directories : includes,
2246 link_with : [libshared],
2247 install_rpath : rootlibexecdir,
2248 install : true,
2249 install_dir : rootlibexecdir)
2250
2251 executable('systemd-cgroups-agent',
2252 'src/cgroups-agent/cgroups-agent.c',
2253 include_directories : includes,
2254 link_with : [libshared],
2255 install_rpath : rootlibexecdir,
2256 install : true,
2257 install_dir : rootlibexecdir)
2258
2259 exe = executable('systemd-path',
2260 'src/path/path.c',
2261 include_directories : includes,
2262 link_with : [libshared],
2263 install_rpath : rootlibexecdir,
2264 install : true)
2265 public_programs += [exe]
2266
2267 exe = executable('systemd-ask-password',
2268 'src/ask-password/ask-password.c',
2269 include_directories : includes,
2270 link_with : [libshared],
2271 install_rpath : rootlibexecdir,
2272 install : true,
2273 install_dir : rootbindir)
2274 public_programs += [exe]
2275
2276 executable('systemd-reply-password',
2277 'src/reply-password/reply-password.c',
2278 include_directories : includes,
2279 link_with : [libshared],
2280 install_rpath : rootlibexecdir,
2281 install : true,
2282 install_dir : rootlibexecdir)
2283
2284 exe = executable('systemd-tty-ask-password-agent',
2285 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2286 include_directories : includes,
2287 link_with : [libshared],
2288 install_rpath : rootlibexecdir,
2289 install : true,
2290 install_dir : rootbindir)
2291 public_programs += [exe]
2292
2293 exe = executable('systemd-cgls',
2294 'src/cgls/cgls.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 install_rpath : rootlibexecdir,
2298 install : true)
2299 public_programs += [exe]
2300
2301 exe = executable('systemd-cgtop',
2302 'src/cgtop/cgtop.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 install_rpath : rootlibexecdir,
2306 install : true)
2307 public_programs += [exe]
2308
2309 executable('systemd-initctl',
2310 'src/initctl/initctl.c',
2311 include_directories : includes,
2312 link_with : [libshared],
2313 install_rpath : rootlibexecdir,
2314 install : true,
2315 install_dir : rootlibexecdir)
2316
2317 exe = executable('systemd-mount',
2318 'src/mount/mount-tool.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 install_rpath : rootlibexecdir,
2322 install : true)
2323 public_programs += [exe]
2324
2325 meson.add_install_script(meson_make_symlink,
2326 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2327
2328 exe = executable('systemd-run',
2329 'src/run/run.c',
2330 include_directories : includes,
2331 link_with : [libshared],
2332 install_rpath : rootlibexecdir,
2333 install : true)
2334 public_programs += [exe]
2335
2336 exe = executable('systemd-stdio-bridge',
2337 'src/stdio-bridge/stdio-bridge.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2341 install : true)
2342 public_programs += [exe]
2343
2344 exe = executable('busctl',
2345 'src/busctl/busctl.c',
2346 'src/busctl/busctl-introspect.c',
2347 'src/busctl/busctl-introspect.h',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2351 install : true)
2352 public_programs += [exe]
2353
2354 if conf.get('ENABLE_SYSUSERS') == 1
2355 exe = executable('systemd-sysusers',
2356 'src/sysusers/sysusers.c',
2357 include_directories : includes,
2358 link_with : [libshared],
2359 install_rpath : rootlibexecdir,
2360 install : true,
2361 install_dir : rootbindir)
2362 public_programs += [exe]
2363 endif
2364
2365 if conf.get('ENABLE_TMPFILES') == 1
2366 exe = executable('systemd-tmpfiles',
2367 'src/tmpfiles/tmpfiles.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 dependencies : [libacl],
2371 install_rpath : rootlibexecdir,
2372 install : true,
2373 install_dir : rootbindir)
2374 public_programs += [exe]
2375
2376 test('test-systemd-tmpfiles',
2377 test_systemd_tmpfiles_py,
2378 args : exe.full_path())
2379 # https://github.com/mesonbuild/meson/issues/2681
2380 endif
2381
2382 if conf.get('ENABLE_HWDB') == 1
2383 exe = executable('systemd-hwdb',
2384 'src/hwdb/hwdb.c',
2385 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2386 include_directories : includes,
2387 link_with : [libudev_static],
2388 install_rpath : udev_rpath,
2389 install : true,
2390 install_dir : rootbindir)
2391 public_programs += [exe]
2392 endif
2393
2394 if conf.get('ENABLE_QUOTACHECK') == 1
2395 executable('systemd-quotacheck',
2396 'src/quotacheck/quotacheck.c',
2397 include_directories : includes,
2398 link_with : [libshared],
2399 install_rpath : rootlibexecdir,
2400 install : true,
2401 install_dir : rootlibexecdir)
2402 endif
2403
2404 exe = executable('systemd-socket-proxyd',
2405 'src/socket-proxy/socket-proxyd.c',
2406 include_directories : includes,
2407 link_with : [libshared],
2408 dependencies : [threads],
2409 install_rpath : rootlibexecdir,
2410 install : true,
2411 install_dir : rootlibexecdir)
2412 public_programs += [exe]
2413
2414 exe = executable('systemd-udevd',
2415 systemd_udevd_sources,
2416 include_directories : includes,
2417 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2418 link_with : [libudev_core,
2419 libsystemd_network,
2420 libudev_static],
2421 dependencies : [threads,
2422 libkmod,
2423 libidn,
2424 libacl,
2425 libblkid],
2426 install_rpath : udev_rpath,
2427 install : true,
2428 install_dir : rootlibexecdir)
2429 public_programs += [exe]
2430
2431 exe = executable('udevadm',
2432 udevadm_sources,
2433 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2434 include_directories : includes,
2435 link_with : [libudev_core,
2436 libsystemd_network,
2437 libudev_static],
2438 dependencies : [threads,
2439 libkmod,
2440 libidn,
2441 libacl,
2442 libblkid],
2443 install_rpath : udev_rpath,
2444 install : true,
2445 install_dir : rootbindir)
2446 public_programs += [exe]
2447
2448 executable('systemd-shutdown',
2449 systemd_shutdown_sources,
2450 include_directories : includes,
2451 link_with : [libshared],
2452 dependencies : [libmount],
2453 install_rpath : rootlibexecdir,
2454 install : true,
2455 install_dir : rootlibexecdir)
2456
2457 executable('systemd-update-done',
2458 'src/update-done/update-done.c',
2459 include_directories : includes,
2460 link_with : [libshared],
2461 install_rpath : rootlibexecdir,
2462 install : true,
2463 install_dir : rootlibexecdir)
2464
2465 executable('systemd-update-utmp',
2466 'src/update-utmp/update-utmp.c',
2467 include_directories : includes,
2468 link_with : [libshared],
2469 dependencies : [libaudit],
2470 install_rpath : rootlibexecdir,
2471 install : true,
2472 install_dir : rootlibexecdir)
2473
2474 if conf.get('HAVE_KMOD') == 1
2475 executable('systemd-modules-load',
2476 'src/modules-load/modules-load.c',
2477 include_directories : includes,
2478 link_with : [libshared],
2479 dependencies : [libkmod],
2480 install_rpath : rootlibexecdir,
2481 install : true,
2482 install_dir : rootlibexecdir)
2483
2484 meson.add_install_script('sh', '-c',
2485 mkdir_p.format(modulesloaddir))
2486 meson.add_install_script('sh', '-c',
2487 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2488 endif
2489
2490 exe = executable('systemd-nspawn',
2491 systemd_nspawn_sources,
2492 'src/core/mount-setup.c', # FIXME: use a variable?
2493 'src/core/mount-setup.h',
2494 'src/core/loopback-setup.c',
2495 'src/core/loopback-setup.h',
2496 include_directories : includes,
2497 link_with : [libnspawn_core,
2498 libshared],
2499 dependencies : [libblkid],
2500 install_rpath : rootlibexecdir,
2501 install : true)
2502 public_programs += [exe]
2503
2504 if conf.get('ENABLE_NETWORKD') == 1
2505 executable('systemd-networkd',
2506 systemd_networkd_sources,
2507 include_directories : includes,
2508 link_with : [libnetworkd_core,
2509 libsystemd_network,
2510 libudev_static,
2511 libshared],
2512 dependencies : [threads],
2513 install_rpath : rootlibexecdir,
2514 install : true,
2515 install_dir : rootlibexecdir)
2516
2517 executable('systemd-networkd-wait-online',
2518 systemd_networkd_wait_online_sources,
2519 include_directories : includes,
2520 link_with : [libnetworkd_core,
2521 libshared],
2522 install_rpath : rootlibexecdir,
2523 install : true,
2524 install_dir : rootlibexecdir)
2525
2526 exe = executable('networkctl',
2527 networkctl_sources,
2528 include_directories : includes,
2529 link_with : [libsystemd_network,
2530 libshared],
2531 install_rpath : rootlibexecdir,
2532 install : true,
2533 install_dir : rootbindir)
2534 public_programs += [exe]
2535 endif
2536
2537 executable('systemd-sulogin-shell',
2538 ['src/sulogin-shell/sulogin-shell.c'],
2539 include_directories : includes,
2540 link_with : [libshared],
2541 install_rpath : rootlibexecdir,
2542 install : true,
2543 install_dir : rootlibexecdir)
2544
2545 ############################################################
2546
2547 foreach tuple : tests
2548 sources = tuple[0]
2549 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2550 dependencies = tuple[2]
2551 condition = tuple.length() >= 4 ? tuple[3] : ''
2552 type = tuple.length() >= 5 ? tuple[4] : ''
2553 defs = tuple.length() >= 6 ? tuple[5] : []
2554 incs = tuple.length() >= 7 ? tuple[6] : includes
2555 timeout = 30
2556
2557 name = sources[0].split('/')[-1].split('.')[0]
2558 if type.startswith('timeout=')
2559 timeout = type.split('=')[1].to_int()
2560 type = ''
2561 endif
2562 if want_tests == 'false'
2563 message('Not compiling @0@ because tests is set to false'.format(name))
2564 elif condition == '' or conf.get(condition) == 1
2565 exe = executable(
2566 name,
2567 sources,
2568 include_directories : incs,
2569 link_with : link_with,
2570 dependencies : dependencies,
2571 c_args : defs,
2572 install_rpath : rootlibexecdir,
2573 install : install_tests,
2574 install_dir : join_paths(testsdir, type))
2575
2576 if type == 'manual'
2577 message('@0@ is a manual test'.format(name))
2578 elif type == 'unsafe' and want_tests != 'unsafe'
2579 message('@0@ is an unsafe test'.format(name))
2580 else
2581 test(name, exe,
2582 env : test_env,
2583 timeout : timeout)
2584 endif
2585 else
2586 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2587 endif
2588 endforeach
2589
2590 exe = executable(
2591 'test-libsystemd-sym',
2592 test_libsystemd_sym_c,
2593 include_directories : includes,
2594 link_with : [libsystemd],
2595 install : install_tests,
2596 install_dir : testsdir)
2597 test('test-libsystemd-sym', exe)
2598
2599 exe = executable(
2600 'test-libsystemd-static-sym',
2601 test_libsystemd_sym_c,
2602 include_directories : includes,
2603 link_with : [install_libsystemd_static],
2604 dependencies : [threads], # threads is already included in dependencies on the library,
2605 # but does not seem to get propagated. Add here as a work-around.
2606 build_by_default : static_libsystemd_pic,
2607 install : install_tests and static_libsystemd_pic,
2608 install_dir : testsdir)
2609 if static_libsystemd_pic
2610 test('test-libsystemd-static-sym', exe)
2611 endif
2612
2613 exe = executable(
2614 'test-libudev-sym',
2615 test_libudev_sym_c,
2616 include_directories : includes,
2617 c_args : ['-Wno-deprecated-declarations'],
2618 link_with : [libudev],
2619 install : install_tests,
2620 install_dir : testsdir)
2621 test('test-libudev-sym', exe)
2622
2623 exe = executable(
2624 'test-libudev-static-sym',
2625 test_libudev_sym_c,
2626 include_directories : includes,
2627 c_args : ['-Wno-deprecated-declarations'],
2628 link_with : [install_libudev_static],
2629 build_by_default : static_libudev_pic,
2630 install : install_tests and static_libudev_pic,
2631 install_dir : testsdir)
2632 if static_libudev_pic
2633 test('test-libudev-static-sym', exe)
2634 endif
2635
2636 ############################################################
2637
2638 fuzzer_exes = []
2639
2640 foreach tuple : fuzzers
2641 sources = tuple[0]
2642 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2643 dependencies = tuple[2]
2644 defs = tuple.length() >= 4 ? tuple[3] : []
2645 incs = tuple.length() >= 5 ? tuple[4] : includes
2646
2647 if fuzzer_build
2648 dependencies += fuzzing_engine
2649 else
2650 sources += 'src/fuzz/fuzz-main.c'
2651 endif
2652
2653 name = sources[0].split('/')[-1].split('.')[0]
2654
2655 fuzzer_exes += executable(
2656 name,
2657 sources,
2658 include_directories : [incs, include_directories('src/fuzz')],
2659 link_with : link_with,
2660 dependencies : dependencies,
2661 c_args : defs,
2662 install : false)
2663 endforeach
2664
2665 run_target('fuzzers',
2666 depends : fuzzer_exes,
2667 command : ['true'])
2668
2669 ############################################################
2670
2671 make_directive_index_py = find_program('tools/make-directive-index.py')
2672 make_man_index_py = find_program('tools/make-man-index.py')
2673 xml_helper_py = find_program('tools/xml_helper.py')
2674 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2675
2676 subdir('units')
2677 subdir('sysctl.d')
2678 subdir('sysusers.d')
2679 subdir('tmpfiles.d')
2680 subdir('presets')
2681 subdir('hwdb')
2682 subdir('network')
2683 subdir('man')
2684 subdir('shell-completion/bash')
2685 subdir('shell-completion/zsh')
2686 subdir('doc/sysvinit')
2687 subdir('doc/var-log')
2688
2689 # FIXME: figure out if the warning is true:
2690 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2691 install_subdir('factory/etc',
2692 install_dir : factorydir)
2693
2694
2695 install_data('xorg/50-systemd-user.sh',
2696 install_dir : xinitrcdir)
2697 install_data('modprobe.d/systemd.conf',
2698 install_dir : modprobedir)
2699 install_data('LICENSE.GPL2',
2700 'LICENSE.LGPL2.1',
2701 'NEWS',
2702 'README',
2703 'doc/CODING_STYLE',
2704 'doc/DISTRO_PORTING',
2705 'doc/ENVIRONMENT.md',
2706 'doc/HACKING',
2707 'doc/TRANSIENT-SETTINGS.md',
2708 'doc/TRANSLATORS',
2709 'doc/UIDS-GIDS.md',
2710 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2711 install_dir : docdir)
2712
2713 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2714 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2715
2716 ############################################################
2717
2718 meson_check_help = find_program('tools/meson-check-help.sh')
2719
2720 foreach exec : public_programs
2721 name = exec.full_path().split('/')[-1]
2722 test('check-help-' + name,
2723 meson_check_help,
2724 args : [exec.full_path()])
2725 endforeach
2726
2727 ############################################################
2728
2729 # Enable tests for all supported sanitizers
2730 foreach tuple : sanitizers
2731 sanitizer = tuple[0]
2732 build = tuple[1]
2733
2734 have = run_command(check_compilation_sh,
2735 cc.cmd_array(), '-x', 'c',
2736 '-fsanitize=@0@'.format(sanitizer),
2737 '-include', link_test_c).returncode() == 0
2738 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2739
2740 if have
2741 prev = ''
2742 foreach p : fuzz_regression_tests
2743 b = p.split('/')[-2]
2744 c = p.split('/')[-1]
2745
2746 name = '@0@:@1@'.format(b, sanitizer)
2747
2748 if name != prev
2749 if want_tests == 'false'
2750 message('Not compiling @0@ because tests is set to false'.format(name))
2751 elif slow_tests
2752 exe = custom_target(
2753 name,
2754 output : name,
2755 depends : build,
2756 command : [env, 'ln', '-fs',
2757 join_paths(build.full_path(), b),
2758 '@OUTPUT@'],
2759 build_by_default : true)
2760 else
2761 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2762 endif
2763 endif
2764 prev = name
2765
2766 if want_tests != 'false' and slow_tests
2767 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2768 env,
2769 args : [exe.full_path(),
2770 join_paths(meson.source_root(),
2771 'test/fuzz-regressions',
2772 p)])
2773 endif
2774 endforeach
2775 endif
2776 endforeach
2777
2778
2779 ############################################################
2780
2781 if git.found()
2782 all_files = run_command(
2783 git,
2784 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2785 'ls-files',
2786 ':/*.[ch]'])
2787 all_files = files(all_files.stdout().split())
2788
2789 custom_target(
2790 'tags',
2791 output : 'tags',
2792 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2793 run_target(
2794 'ctags',
2795 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2796 endif
2797
2798 if git.found()
2799 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2800 run_target(
2801 'git-contrib',
2802 command : [meson_git_contrib_sh])
2803 endif
2804
2805 if git.found()
2806 git_head = run_command(
2807 git,
2808 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2809 'rev-parse', 'HEAD']).stdout().strip()
2810 git_head_short = run_command(
2811 git,
2812 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2813 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2814
2815 run_target(
2816 'git-snapshot',
2817 command : ['git', 'archive',
2818 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2819 git_head_short),
2820 '--prefix', 'systemd-@0@/'.format(git_head),
2821 'HEAD'])
2822 endif
2823
2824 ############################################################
2825
2826 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2827 run_target(
2828 'check-api-docs',
2829 depends : [man, libsystemd, libudev],
2830 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2831
2832 ############################################################
2833
2834 status = [
2835 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2836
2837 'split /usr: @0@'.format(split_usr),
2838 'split bin-sbin: @0@'.format(split_bin),
2839 'prefix directory: @0@'.format(prefixdir),
2840 'rootprefix directory: @0@'.format(rootprefixdir),
2841 'sysconf directory: @0@'.format(sysconfdir),
2842 'include directory: @0@'.format(includedir),
2843 'lib directory: @0@'.format(libdir),
2844 'rootlib directory: @0@'.format(rootlibdir),
2845 'SysV init scripts: @0@'.format(sysvinit_path),
2846 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2847 'PAM modules directory: @0@'.format(pamlibdir),
2848 'PAM configuration directory: @0@'.format(pamconfdir),
2849 'RPM macros directory: @0@'.format(rpmmacrosdir),
2850 'modprobe.d directory: @0@'.format(modprobedir),
2851 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2852 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2853 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2854 'bash completions directory: @0@'.format(bashcompletiondir),
2855 'zsh completions directory: @0@'.format(zshcompletiondir),
2856 'extra start script: @0@'.format(get_option('rc-local')),
2857 'extra stop script: @0@'.format(get_option('halt-local')),
2858 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2859 get_option('debug-tty')),
2860 'TTY GID: @0@'.format(tty_gid),
2861 'users GID: @0@'.format(users_gid),
2862 'maximum system UID: @0@'.format(system_uid_max),
2863 'maximum system GID: @0@'.format(system_gid_max),
2864 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2865 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2866 'minimum container UID base: @0@'.format(container_uid_base_min),
2867 'maximum container UID base: @0@'.format(container_uid_base_max),
2868 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2869 'render group access mode: @0@'.format(get_option('group-render-mode')),
2870 'certificate root directory: @0@'.format(get_option('certificate-root')),
2871 'support URL: @0@'.format(support_url),
2872 'nobody user name: @0@'.format(nobody_user),
2873 'nobody group name: @0@'.format(nobody_group),
2874 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2875 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2876
2877 'default DNSSEC mode: @0@'.format(default_dnssec),
2878 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2879 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2880 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2881
2882 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2883 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2884 status += [
2885 'default DNS servers: @0@'.format(alt_dns_servers),
2886 'default NTP servers: @0@'.format(alt_ntp_servers)]
2887
2888 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2889 '@@0@'.format(time_epoch)).stdout().strip()
2890 status += [
2891 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2892
2893 # TODO:
2894 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2895 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2896 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2897
2898 if conf.get('ENABLE_EFI') == 1
2899 status += [
2900 'efi arch: @0@'.format(efi_arch)]
2901
2902 if have_gnu_efi
2903 status += [
2904 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2905 'EFI CC @0@'.format(efi_cc),
2906 'EFI lib directory: @0@'.format(efi_libdir),
2907 'EFI lds directory: @0@'.format(efi_ldsdir),
2908 'EFI include directory: @0@'.format(efi_incdir)]
2909 endif
2910 endif
2911
2912 found = []
2913 missing = []
2914
2915 foreach tuple : [
2916 ['libcryptsetup'],
2917 ['PAM'],
2918 ['AUDIT'],
2919 ['IMA'],
2920 ['AppArmor'],
2921 ['SELinux'],
2922 ['SECCOMP'],
2923 ['SMACK'],
2924 ['zlib'],
2925 ['xz'],
2926 ['lz4'],
2927 ['bzip2'],
2928 ['ACL'],
2929 ['gcrypt'],
2930 ['qrencode'],
2931 ['microhttpd'],
2932 ['gnutls'],
2933 ['libcurl'],
2934 ['idn'],
2935 ['libidn2'],
2936 ['libidn'],
2937 ['nss-systemd'],
2938 ['libiptc'],
2939 ['elfutils'],
2940 ['binfmt'],
2941 ['vconsole'],
2942 ['quotacheck'],
2943 ['tmpfiles'],
2944 ['environment.d'],
2945 ['sysusers'],
2946 ['firstboot'],
2947 ['randomseed'],
2948 ['backlight'],
2949 ['rfkill'],
2950 ['logind'],
2951 ['machined'],
2952 ['portabled'],
2953 ['importd'],
2954 ['hostnamed'],
2955 ['timedated'],
2956 ['timesyncd'],
2957 ['localed'],
2958 ['networkd'],
2959 ['resolve'],
2960 ['DNS-over-TLS'],
2961 ['coredump'],
2962 ['polkit'],
2963 ['legacy pkla', install_polkit_pkla],
2964 ['efi'],
2965 ['gnu-efi', have_gnu_efi],
2966 ['kmod'],
2967 ['xkbcommon'],
2968 ['pcre2'],
2969 ['blkid'],
2970 ['dbus'],
2971 ['glib'],
2972 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2973 ['hwdb'],
2974 ['tpm'],
2975 ['man pages', want_man],
2976 ['html pages', want_html],
2977 ['man page indices', want_man and have_lxml],
2978 ['SysV compat'],
2979 ['utmp'],
2980 ['ldconfig'],
2981 ['hibernate'],
2982 ['adm group', get_option('adm-group')],
2983 ['wheel group', get_option('wheel-group')],
2984 ['gshadow'],
2985 ['debug hashmap'],
2986 ['debug mmap cache'],
2987 ['valgrind', conf.get('VALGRIND') == 1],
2988 ]
2989
2990 if tuple.length() >= 2
2991 cond = tuple[1]
2992 else
2993 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2994 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2995 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2996 endif
2997 if cond
2998 found += [tuple[0]]
2999 else
3000 missing += [tuple[0]]
3001 endif
3002 endforeach
3003
3004 status += [
3005 '',
3006 'enabled features: @0@'.format(', '.join(found)),
3007 '',
3008 'disabled features: @0@'.format(', '.join(missing)),
3009 '']
3010 message('\n '.join(status))
3011
3012 if rootprefixdir != rootprefix_default
3013 warning('\n' +
3014 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3015 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3016 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3017 endif