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