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