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