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