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