]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
core: skip unit deserialization and move to the next one when unit_deserialize()...
[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_INFO', '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 = have_gnutls = have_openssl = false
1192 endif
1193 conf.set10('ENABLE_DNS_OVER_TLS', have)
1194 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1195 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1196
1197 default_dns_over_tls = get_option('default-dns-over-tls')
1198 if fuzzer_build
1199 default_dns_over_tls = 'no'
1200 endif
1201 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1202 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1203 default_dns_over_tls = 'no'
1204 endif
1205 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1206 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1207 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1208
1209 want_importd = get_option('importd')
1210 if want_importd != 'false'
1211 have = (conf.get('HAVE_LIBCURL') == 1 and
1212 conf.get('HAVE_ZLIB') == 1 and
1213 conf.get('HAVE_XZ') == 1 and
1214 conf.get('HAVE_GCRYPT') == 1)
1215 if want_importd == 'true' and not have
1216 error('importd support was requested, but dependencies are not available')
1217 endif
1218 else
1219 have = false
1220 endif
1221 conf.set10('ENABLE_IMPORTD', have)
1222
1223 want_remote = get_option('remote')
1224 if want_remote != 'false'
1225 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1226 conf.get('HAVE_LIBCURL') == 1]
1227 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1228 # it's possible to build one without the other. Complain only if
1229 # support was explictly requested. The auxiliary files like sysusers
1230 # config should be installed when any of the programs are built.
1231 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1232 error('remote support was requested, but dependencies are not available')
1233 endif
1234 have = have_deps[0] or have_deps[1]
1235 else
1236 have = false
1237 endif
1238 conf.set10('ENABLE_REMOTE', have)
1239
1240 foreach term : ['utmp',
1241 'hibernate',
1242 'environment-d',
1243 'binfmt',
1244 'coredump',
1245 'resolve',
1246 'logind',
1247 'hostnamed',
1248 'localed',
1249 'machined',
1250 'portabled',
1251 'networkd',
1252 'timedated',
1253 'timesyncd',
1254 'firstboot',
1255 'randomseed',
1256 'backlight',
1257 'vconsole',
1258 'quotacheck',
1259 'sysusers',
1260 'tmpfiles',
1261 'hwdb',
1262 'rfkill',
1263 'ldconfig',
1264 'efi',
1265 'tpm',
1266 'ima',
1267 'smack',
1268 'gshadow',
1269 'idn',
1270 'nss-myhostname',
1271 'nss-systemd']
1272 have = get_option(term)
1273 name = 'ENABLE_' + term.underscorify().to_upper()
1274 conf.set10(name, have)
1275 endforeach
1276
1277 foreach tuple : [['nss-mymachines', 'machined'],
1278 ['nss-resolve', 'resolve']]
1279 want = get_option(tuple[0])
1280 if want != 'false'
1281 have = get_option(tuple[1])
1282 if want == 'true' and not have
1283 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1284 endif
1285 else
1286 have = false
1287 endif
1288 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1289 conf.set10(name, have)
1290 endforeach
1291
1292 enable_nss = false
1293 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1294 'ENABLE_NSS_MYMACHINES',
1295 'ENABLE_NSS_RESOLVE',
1296 'ENABLE_NSS_SYSTEMD']
1297 if conf.get(term) == 1
1298 enable_nss = true
1299 endif
1300 endforeach
1301 conf.set10('ENABLE_NSS', enable_nss)
1302
1303 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1304
1305 tests = []
1306 fuzzers = []
1307
1308 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1309
1310 #####################################################################
1311
1312 if get_option('efi')
1313 efi_arch = host_machine.cpu_family()
1314
1315 if efi_arch == 'x86'
1316 EFI_MACHINE_TYPE_NAME = 'ia32'
1317 gnu_efi_arch = 'ia32'
1318 elif efi_arch == 'x86_64'
1319 EFI_MACHINE_TYPE_NAME = 'x64'
1320 gnu_efi_arch = 'x86_64'
1321 elif efi_arch == 'arm'
1322 EFI_MACHINE_TYPE_NAME = 'arm'
1323 gnu_efi_arch = 'arm'
1324 elif efi_arch == 'aarch64'
1325 EFI_MACHINE_TYPE_NAME = 'aa64'
1326 gnu_efi_arch = 'aarch64'
1327 else
1328 EFI_MACHINE_TYPE_NAME = ''
1329 gnu_efi_arch = ''
1330 endif
1331
1332 have = true
1333 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1334
1335 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1336 else
1337 have = false
1338 endif
1339 conf.set10('ENABLE_EFI', have)
1340
1341 #####################################################################
1342
1343 config_h = configure_file(
1344 output : 'config.h',
1345 configuration : conf)
1346
1347 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1348
1349 includes = include_directories('src/basic',
1350 'src/shared',
1351 'src/systemd',
1352 'src/journal',
1353 'src/journal-remote',
1354 'src/nspawn',
1355 'src/resolve',
1356 'src/timesync',
1357 'src/time-wait-sync',
1358 'src/login',
1359 'src/udev',
1360 'src/libudev',
1361 'src/core',
1362 'src/libsystemd/sd-bus',
1363 'src/libsystemd/sd-device',
1364 'src/libsystemd/sd-hwdb',
1365 'src/libsystemd/sd-id128',
1366 'src/libsystemd/sd-netlink',
1367 'src/libsystemd/sd-network',
1368 'src/libsystemd-network',
1369 '.')
1370
1371 add_project_arguments('-include', 'config.h', language : 'c')
1372
1373 subdir('po')
1374 subdir('catalog')
1375 subdir('src/systemd')
1376 subdir('src/basic')
1377 subdir('src/libsystemd')
1378 subdir('src/libsystemd-network')
1379 subdir('src/journal')
1380 subdir('src/login')
1381
1382 libjournal_core = static_library(
1383 'journal-core',
1384 libjournal_core_sources,
1385 journald_gperf_c,
1386 include_directories : includes,
1387 install : false)
1388
1389 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1390 libsystemd = shared_library(
1391 'systemd',
1392 disable_mempool_c,
1393 version : libsystemd_version,
1394 include_directories : includes,
1395 link_args : ['-shared',
1396 '-Wl,--version-script=' + libsystemd_sym_path],
1397 link_with : [libbasic,
1398 libbasic_gcrypt],
1399 link_whole : [libsystemd_static,
1400 libjournal_client],
1401 dependencies : [threads,
1402 librt,
1403 libxz,
1404 liblz4],
1405 link_depends : libsystemd_sym,
1406 install : true,
1407 install_dir : rootlibdir)
1408
1409 static_libsystemd = get_option('static-libsystemd')
1410 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1411
1412 install_libsystemd_static = static_library(
1413 'systemd',
1414 libsystemd_sources,
1415 journal_client_sources,
1416 basic_sources,
1417 basic_gcrypt_sources,
1418 disable_mempool_c,
1419 include_directories : includes,
1420 build_by_default : static_libsystemd != 'false',
1421 install : static_libsystemd != 'false',
1422 install_dir : rootlibdir,
1423 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1424 dependencies : [threads,
1425 librt,
1426 libxz,
1427 liblz4,
1428 libcap,
1429 libblkid,
1430 libmount,
1431 libselinux,
1432 libgcrypt],
1433 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1434
1435 ############################################################
1436
1437 # binaries that have --help and are intended for use by humans,
1438 # usually, but not always, installed in /bin.
1439 public_programs = []
1440
1441 subdir('src/libudev')
1442 subdir('src/shared')
1443 subdir('src/core')
1444 subdir('src/udev')
1445 subdir('src/network')
1446
1447 subdir('src/analyze')
1448 subdir('src/journal-remote')
1449 subdir('src/coredump')
1450 subdir('src/hostname')
1451 subdir('src/import')
1452 subdir('src/kernel-install')
1453 subdir('src/locale')
1454 subdir('src/machine')
1455 subdir('src/portable')
1456 subdir('src/nspawn')
1457 subdir('src/resolve')
1458 subdir('src/timedate')
1459 subdir('src/timesync')
1460 subdir('src/vconsole')
1461 subdir('src/boot/efi')
1462
1463 subdir('src/test')
1464 subdir('src/fuzz')
1465 subdir('rules')
1466 subdir('test')
1467
1468 ############################################################
1469
1470 # only static linking apart from libdl, to make sure that the
1471 # module is linked to all libraries that it uses.
1472 test_dlopen = executable(
1473 'test-dlopen',
1474 test_dlopen_c,
1475 disable_mempool_c,
1476 include_directories : includes,
1477 link_with : [libbasic],
1478 dependencies : [libdl],
1479 build_by_default : want_tests != 'false')
1480
1481 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1482 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1483 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1484 ['resolve', 'ENABLE_NSS_RESOLVE']]
1485
1486 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1487 if condition
1488 module = tuple[0]
1489
1490 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1491 version_script_arg = join_paths(meson.source_root(), sym)
1492
1493 nss = shared_library(
1494 'nss_' + module,
1495 'src/nss-@0@/nss-@0@.c'.format(module),
1496 disable_mempool_c,
1497 version : '2',
1498 include_directories : includes,
1499 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1500 link_args : ['-Wl,-z,nodelete',
1501 '-shared',
1502 '-Wl,--version-script=' + version_script_arg,
1503 '-Wl,--undefined'],
1504 link_with : [libsystemd_static,
1505 libbasic],
1506 dependencies : [threads,
1507 librt],
1508 link_depends : sym,
1509 install : true,
1510 install_dir : rootlibdir)
1511
1512 # We cannot use shared_module because it does not support version suffix.
1513 # Unfortunately shared_library insists on creating the symlink…
1514 meson.add_install_script('sh', '-c',
1515 'rm $DESTDIR@0@/libnss_@1@.so'
1516 .format(rootlibdir, module))
1517
1518 if want_tests != 'false'
1519 test('dlopen-nss_' + module,
1520 test_dlopen,
1521 # path to dlopen must include a slash
1522 args : nss.full_path())
1523 endif
1524 endif
1525 endforeach
1526
1527 ############################################################
1528
1529 executable('systemd',
1530 systemd_sources,
1531 include_directories : includes,
1532 link_with : [libcore,
1533 libshared],
1534 dependencies : [threads,
1535 librt,
1536 libseccomp,
1537 libselinux,
1538 libmount,
1539 libblkid],
1540 install_rpath : rootlibexecdir,
1541 install : true,
1542 install_dir : rootlibexecdir)
1543
1544 meson.add_install_script(meson_make_symlink,
1545 join_paths(rootlibexecdir, 'systemd'),
1546 join_paths(rootsbindir, 'init'))
1547
1548 exe = executable('systemd-analyze',
1549 systemd_analyze_sources,
1550 include_directories : includes,
1551 link_with : [libcore,
1552 libshared],
1553 dependencies : [threads,
1554 librt,
1555 libseccomp,
1556 libselinux,
1557 libmount,
1558 libblkid],
1559 install_rpath : rootlibexecdir,
1560 install : true)
1561 public_programs += exe
1562
1563 executable('systemd-journald',
1564 systemd_journald_sources,
1565 include_directories : includes,
1566 link_with : [libjournal_core,
1567 libshared],
1568 dependencies : [threads,
1569 libxz,
1570 liblz4,
1571 libselinux],
1572 install_rpath : rootlibexecdir,
1573 install : true,
1574 install_dir : rootlibexecdir)
1575
1576 exe = executable('systemd-cat',
1577 systemd_cat_sources,
1578 include_directories : includes,
1579 link_with : [libjournal_core,
1580 libshared],
1581 dependencies : [threads],
1582 install_rpath : rootlibexecdir,
1583 install : true)
1584 public_programs += exe
1585
1586 exe = executable('journalctl',
1587 journalctl_sources,
1588 include_directories : includes,
1589 link_with : [libshared],
1590 dependencies : [threads,
1591 libqrencode,
1592 libxz,
1593 liblz4,
1594 libpcre2],
1595 install_rpath : rootlibexecdir,
1596 install : true,
1597 install_dir : rootbindir)
1598 public_programs += exe
1599
1600 executable('systemd-getty-generator',
1601 'src/getty-generator/getty-generator.c',
1602 include_directories : includes,
1603 link_with : [libshared],
1604 install_rpath : rootlibexecdir,
1605 install : true,
1606 install_dir : systemgeneratordir)
1607
1608 executable('systemd-debug-generator',
1609 'src/debug-generator/debug-generator.c',
1610 include_directories : includes,
1611 link_with : [libshared],
1612 install_rpath : rootlibexecdir,
1613 install : true,
1614 install_dir : systemgeneratordir)
1615
1616 executable('systemd-fstab-generator',
1617 'src/fstab-generator/fstab-generator.c',
1618 'src/core/mount-setup.c',
1619 include_directories : includes,
1620 link_with : [libshared],
1621 install_rpath : rootlibexecdir,
1622 install : true,
1623 install_dir : systemgeneratordir)
1624
1625 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1626 executable('30-systemd-environment-d-generator',
1627 'src/environment-d-generator/environment-d-generator.c',
1628 include_directories : includes,
1629 link_with : [libshared],
1630 install_rpath : rootlibexecdir,
1631 install : true,
1632 install_dir : userenvgeneratordir)
1633
1634 meson.add_install_script(meson_make_symlink,
1635 join_paths(sysconfdir, 'environment'),
1636 join_paths(environmentdir, '99-environment.conf'))
1637 endif
1638
1639 if conf.get('ENABLE_HIBERNATE') == 1
1640 executable('systemd-hibernate-resume-generator',
1641 'src/hibernate-resume/hibernate-resume-generator.c',
1642 include_directories : includes,
1643 link_with : [libshared],
1644 install_rpath : rootlibexecdir,
1645 install : true,
1646 install_dir : systemgeneratordir)
1647
1648 executable('systemd-hibernate-resume',
1649 'src/hibernate-resume/hibernate-resume.c',
1650 include_directories : includes,
1651 link_with : [libshared],
1652 install_rpath : rootlibexecdir,
1653 install : true,
1654 install_dir : rootlibexecdir)
1655 endif
1656
1657 if conf.get('HAVE_BLKID') == 1
1658 executable('systemd-gpt-auto-generator',
1659 'src/gpt-auto-generator/gpt-auto-generator.c',
1660 'src/basic/blkid-util.h',
1661 include_directories : includes,
1662 link_with : [libshared],
1663 dependencies : libblkid,
1664 install_rpath : rootlibexecdir,
1665 install : true,
1666 install_dir : systemgeneratordir)
1667
1668 exe = executable('systemd-dissect',
1669 'src/dissect/dissect.c',
1670 include_directories : includes,
1671 link_with : [libshared],
1672 install_rpath : rootlibexecdir,
1673 install : true,
1674 install_dir : rootlibexecdir)
1675 public_programs += exe
1676 endif
1677
1678 if conf.get('ENABLE_RESOLVE') == 1
1679 executable('systemd-resolved',
1680 systemd_resolved_sources,
1681 include_directories : includes,
1682 link_with : [libshared,
1683 libbasic_gcrypt,
1684 libsystemd_resolve_core],
1685 dependencies : systemd_resolved_dependencies,
1686 install_rpath : rootlibexecdir,
1687 install : true,
1688 install_dir : rootlibexecdir)
1689
1690 exe = executable('resolvectl',
1691 resolvectl_sources,
1692 include_directories : includes,
1693 link_with : [libshared,
1694 libbasic_gcrypt,
1695 libsystemd_resolve_core],
1696 dependencies : [threads,
1697 libgpg_error,
1698 libm,
1699 libidn],
1700 install_rpath : rootlibexecdir,
1701 install : true)
1702 public_programs += exe
1703
1704 meson.add_install_script(meson_make_symlink,
1705 join_paths(bindir, 'resolvectl'),
1706 join_paths(rootsbindir, 'resolvconf'))
1707
1708 meson.add_install_script(meson_make_symlink,
1709 join_paths(bindir, 'resolvectl'),
1710 join_paths(bindir, 'systemd-resolve'))
1711 endif
1712
1713 if conf.get('ENABLE_LOGIND') == 1
1714 executable('systemd-logind',
1715 systemd_logind_sources,
1716 include_directories : includes,
1717 link_with : [liblogind_core,
1718 libshared],
1719 dependencies : [threads,
1720 libacl],
1721 install_rpath : rootlibexecdir,
1722 install : true,
1723 install_dir : rootlibexecdir)
1724
1725 exe = executable('loginctl',
1726 loginctl_sources,
1727 include_directories : includes,
1728 link_with : [libshared],
1729 dependencies : [threads,
1730 liblz4,
1731 libxz],
1732 install_rpath : rootlibexecdir,
1733 install : true,
1734 install_dir : rootbindir)
1735 public_programs += exe
1736
1737 exe = executable('systemd-inhibit',
1738 'src/login/inhibit.c',
1739 include_directories : includes,
1740 link_with : [libshared],
1741 install_rpath : rootlibexecdir,
1742 install : true,
1743 install_dir : rootbindir)
1744 public_programs += exe
1745
1746 if conf.get('HAVE_PAM') == 1
1747 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1748 pam_systemd = shared_library(
1749 'pam_systemd',
1750 pam_systemd_c,
1751 name_prefix : '',
1752 include_directories : includes,
1753 link_args : ['-shared',
1754 '-Wl,--version-script=' + version_script_arg],
1755 link_with : [libsystemd_static,
1756 libshared_static],
1757 dependencies : [threads,
1758 libpam,
1759 libpam_misc],
1760 link_depends : pam_systemd_sym,
1761 install : true,
1762 install_dir : pamlibdir)
1763
1764 if want_tests != 'false'
1765 test('dlopen-pam_systemd',
1766 test_dlopen,
1767 # path to dlopen must include a slash
1768 args : pam_systemd.full_path())
1769 endif
1770 endif
1771
1772 executable('systemd-user-runtime-dir',
1773 user_runtime_dir_sources,
1774 include_directories : includes,
1775 link_with : [libshared],
1776 install_rpath : rootlibexecdir,
1777 install : true,
1778 install_dir : rootlibexecdir)
1779 endif
1780
1781 if conf.get('HAVE_PAM') == 1
1782 executable('systemd-user-sessions',
1783 'src/user-sessions/user-sessions.c',
1784 include_directories : includes,
1785 link_with : [libshared],
1786 install_rpath : rootlibexecdir,
1787 install : true,
1788 install_dir : rootlibexecdir)
1789 endif
1790
1791 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1792 exe = executable('bootctl',
1793 'src/boot/bootctl.c',
1794 include_directories : includes,
1795 link_with : [libshared],
1796 dependencies : [libblkid],
1797 install_rpath : rootlibexecdir,
1798 install : true)
1799 public_programs += exe
1800
1801 executable('systemd-bless-boot',
1802 'src/boot/bless-boot.c',
1803 include_directories : includes,
1804 link_with : [libshared],
1805 dependencies : [libblkid],
1806 install_rpath : rootlibexecdir,
1807 install : true,
1808 install_dir : rootlibexecdir)
1809
1810 executable('systemd-bless-boot-generator',
1811 'src/boot/bless-boot-generator.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 install_rpath : rootlibexecdir,
1815 install : true,
1816 install_dir : systemgeneratordir)
1817 endif
1818
1819 executable('systemd-boot-check-no-failures',
1820 'src/boot/boot-check-no-failures.c',
1821 include_directories : includes,
1822 link_with : [libshared],
1823 dependencies : [libblkid],
1824 install_rpath : rootlibexecdir,
1825 install : true,
1826 install_dir : rootlibexecdir)
1827
1828 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 dependencies : [threads],
1832 install_rpath : rootlibexecdir,
1833 install : true)
1834 public_programs += exe
1835
1836
1837 if get_option('link-systemctl-shared')
1838 systemctl_link_with = [libshared]
1839 else
1840 systemctl_link_with = [libsystemd_static,
1841 libshared_static,
1842 libjournal_client,
1843 libbasic_gcrypt]
1844 endif
1845
1846 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1847 include_directories : includes,
1848 link_with : systemctl_link_with,
1849 dependencies : [threads,
1850 libcap,
1851 libselinux,
1852 libxz,
1853 liblz4],
1854 install_rpath : rootlibexecdir,
1855 install : true,
1856 install_dir : rootbindir)
1857 public_programs += exe
1858
1859 if conf.get('ENABLE_PORTABLED') == 1
1860 executable('systemd-portabled',
1861 systemd_portabled_sources,
1862 include_directories : includes,
1863 link_with : [libshared],
1864 dependencies : [threads],
1865 install_rpath : rootlibexecdir,
1866 install : true,
1867 install_dir : rootlibexecdir)
1868
1869 exe = executable('portablectl', 'src/portable/portablectl.c',
1870 include_directories : includes,
1871 link_with : [libshared],
1872 dependencies : [threads],
1873 install_rpath : rootlibexecdir,
1874 install : true,
1875 install_dir : rootbindir)
1876 public_programs += exe
1877 endif
1878
1879 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1880 meson.add_install_script(meson_make_symlink,
1881 join_paths(rootbindir, 'systemctl'),
1882 join_paths(rootsbindir, alias))
1883 endforeach
1884
1885 if conf.get('ENABLE_BACKLIGHT') == 1
1886 executable('systemd-backlight',
1887 'src/backlight/backlight.c',
1888 include_directories : includes,
1889 link_with : [libshared],
1890 install_rpath : rootlibexecdir,
1891 install : true,
1892 install_dir : rootlibexecdir)
1893 endif
1894
1895 if conf.get('ENABLE_RFKILL') == 1
1896 executable('systemd-rfkill',
1897 'src/rfkill/rfkill.c',
1898 include_directories : includes,
1899 link_with : [libshared],
1900 install_rpath : rootlibexecdir,
1901 install : true,
1902 install_dir : rootlibexecdir)
1903 endif
1904
1905 executable('systemd-system-update-generator',
1906 'src/system-update-generator/system-update-generator.c',
1907 include_directories : includes,
1908 link_with : [libshared],
1909 install_rpath : rootlibexecdir,
1910 install : true,
1911 install_dir : systemgeneratordir)
1912
1913 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1914 executable('systemd-cryptsetup',
1915 'src/cryptsetup/cryptsetup.c',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 dependencies : [libcryptsetup],
1919 install_rpath : rootlibexecdir,
1920 install : true,
1921 install_dir : rootlibexecdir)
1922
1923 executable('systemd-cryptsetup-generator',
1924 'src/cryptsetup/cryptsetup-generator.c',
1925 include_directories : includes,
1926 link_with : [libshared],
1927 dependencies : [libcryptsetup],
1928 install_rpath : rootlibexecdir,
1929 install : true,
1930 install_dir : systemgeneratordir)
1931
1932 executable('systemd-veritysetup',
1933 'src/veritysetup/veritysetup.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 dependencies : [libcryptsetup],
1937 install_rpath : rootlibexecdir,
1938 install : true,
1939 install_dir : rootlibexecdir)
1940
1941 executable('systemd-veritysetup-generator',
1942 'src/veritysetup/veritysetup-generator.c',
1943 include_directories : includes,
1944 link_with : [libshared],
1945 dependencies : [libcryptsetup],
1946 install_rpath : rootlibexecdir,
1947 install : true,
1948 install_dir : systemgeneratordir)
1949 endif
1950
1951 if conf.get('HAVE_SYSV_COMPAT') == 1
1952 executable('systemd-sysv-generator',
1953 'src/sysv-generator/sysv-generator.c',
1954 include_directories : includes,
1955 link_with : [libshared],
1956 install_rpath : rootlibexecdir,
1957 install : true,
1958 install_dir : systemgeneratordir)
1959
1960 executable('systemd-rc-local-generator',
1961 'src/rc-local-generator/rc-local-generator.c',
1962 include_directories : includes,
1963 link_with : [libshared],
1964 install_rpath : rootlibexecdir,
1965 install : true,
1966 install_dir : systemgeneratordir)
1967 endif
1968
1969 if conf.get('ENABLE_HOSTNAMED') == 1
1970 executable('systemd-hostnamed',
1971 'src/hostname/hostnamed.c',
1972 include_directories : includes,
1973 link_with : [libshared],
1974 install_rpath : rootlibexecdir,
1975 install : true,
1976 install_dir : rootlibexecdir)
1977
1978 exe = executable('hostnamectl',
1979 'src/hostname/hostnamectl.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 install_rpath : rootlibexecdir,
1983 install : true)
1984 public_programs += exe
1985 endif
1986
1987 if conf.get('ENABLE_LOCALED') == 1
1988 if conf.get('HAVE_XKBCOMMON') == 1
1989 # logind will load libxkbcommon.so dynamically on its own
1990 deps = [libdl]
1991 else
1992 deps = []
1993 endif
1994
1995 executable('systemd-localed',
1996 systemd_localed_sources,
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : deps,
2000 install_rpath : rootlibexecdir,
2001 install : true,
2002 install_dir : rootlibexecdir)
2003
2004 exe = executable('localectl',
2005 localectl_sources,
2006 include_directories : includes,
2007 link_with : [libshared],
2008 install_rpath : rootlibexecdir,
2009 install : true)
2010 public_programs += exe
2011 endif
2012
2013 if conf.get('ENABLE_TIMEDATED') == 1
2014 executable('systemd-timedated',
2015 'src/timedate/timedated.c',
2016 include_directories : includes,
2017 link_with : [libshared],
2018 install_rpath : rootlibexecdir,
2019 install : true,
2020 install_dir : rootlibexecdir)
2021 endif
2022
2023 if conf.get('ENABLE_TIMEDATECTL') == 1
2024 exe = executable('timedatectl',
2025 'src/timedate/timedatectl.c',
2026 include_directories : includes,
2027 install_rpath : rootlibexecdir,
2028 link_with : [libshared],
2029 dependencies : [libm],
2030 install : true)
2031 public_programs += exe
2032 endif
2033
2034 if conf.get('ENABLE_TIMESYNCD') == 1
2035 executable('systemd-timesyncd',
2036 systemd_timesyncd_sources,
2037 include_directories : includes,
2038 link_with : [libshared],
2039 dependencies : [threads,
2040 libm],
2041 install_rpath : rootlibexecdir,
2042 install : true,
2043 install_dir : rootlibexecdir)
2044
2045 executable('systemd-time-wait-sync',
2046 'src/time-wait-sync/time-wait-sync.c',
2047 include_directories : includes,
2048 link_with : [libshared],
2049 install_rpath : rootlibexecdir,
2050 install : true,
2051 install_dir : rootlibexecdir)
2052 endif
2053
2054 if conf.get('ENABLE_MACHINED') == 1
2055 executable('systemd-machined',
2056 systemd_machined_sources,
2057 include_directories : includes,
2058 link_with : [libmachine_core,
2059 libshared],
2060 install_rpath : rootlibexecdir,
2061 install : true,
2062 install_dir : rootlibexecdir)
2063
2064 exe = executable('machinectl',
2065 'src/machine/machinectl.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 dependencies : [threads,
2069 libxz,
2070 liblz4],
2071 install_rpath : rootlibexecdir,
2072 install : true,
2073 install_dir : rootbindir)
2074 public_programs += exe
2075 endif
2076
2077 if conf.get('ENABLE_IMPORTD') == 1
2078 executable('systemd-importd',
2079 systemd_importd_sources,
2080 include_directories : includes,
2081 link_with : [libshared],
2082 dependencies : [threads],
2083 install_rpath : rootlibexecdir,
2084 install : true,
2085 install_dir : rootlibexecdir)
2086
2087 systemd_pull = executable('systemd-pull',
2088 systemd_pull_sources,
2089 include_directories : includes,
2090 link_with : [libshared],
2091 dependencies : [libcurl,
2092 libz,
2093 libbzip2,
2094 libxz,
2095 libgcrypt],
2096 install_rpath : rootlibexecdir,
2097 install : true,
2098 install_dir : rootlibexecdir)
2099
2100 systemd_import = executable('systemd-import',
2101 systemd_import_sources,
2102 include_directories : includes,
2103 link_with : [libshared],
2104 dependencies : [libcurl,
2105 libz,
2106 libbzip2,
2107 libxz],
2108 install_rpath : rootlibexecdir,
2109 install : true,
2110 install_dir : rootlibexecdir)
2111
2112 systemd_export = executable('systemd-export',
2113 systemd_export_sources,
2114 include_directories : includes,
2115 link_with : [libshared],
2116 dependencies : [libcurl,
2117 libz,
2118 libbzip2,
2119 libxz],
2120 install_rpath : rootlibexecdir,
2121 install : true,
2122 install_dir : rootlibexecdir)
2123 public_programs += [systemd_pull, systemd_import, systemd_export]
2124 endif
2125
2126 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2127 exe = executable('systemd-journal-upload',
2128 systemd_journal_upload_sources,
2129 include_directories : includes,
2130 link_with : [libshared],
2131 dependencies : [threads,
2132 libcurl,
2133 libgnutls,
2134 libxz,
2135 liblz4],
2136 install_rpath : rootlibexecdir,
2137 install : true,
2138 install_dir : rootlibexecdir)
2139 public_programs += exe
2140 endif
2141
2142 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2143 s_j_remote = executable('systemd-journal-remote',
2144 systemd_journal_remote_sources,
2145 include_directories : includes,
2146 link_with : [libshared,
2147 libsystemd_journal_remote],
2148 dependencies : [threads,
2149 libmicrohttpd,
2150 libgnutls,
2151 libxz,
2152 liblz4],
2153 install_rpath : rootlibexecdir,
2154 install : true,
2155 install_dir : rootlibexecdir)
2156
2157 s_j_gatewayd = executable('systemd-journal-gatewayd',
2158 systemd_journal_gatewayd_sources,
2159 include_directories : includes,
2160 link_with : [libshared],
2161 dependencies : [threads,
2162 libmicrohttpd,
2163 libgnutls,
2164 libxz,
2165 liblz4],
2166 install_rpath : rootlibexecdir,
2167 install : true,
2168 install_dir : rootlibexecdir)
2169 public_programs += [s_j_remote, s_j_gatewayd]
2170 endif
2171
2172 if conf.get('ENABLE_COREDUMP') == 1
2173 executable('systemd-coredump',
2174 systemd_coredump_sources,
2175 include_directories : includes,
2176 link_with : [libshared],
2177 dependencies : [threads,
2178 libacl,
2179 libdw,
2180 libxz,
2181 liblz4],
2182 install_rpath : rootlibexecdir,
2183 install : true,
2184 install_dir : rootlibexecdir)
2185
2186 exe = executable('coredumpctl',
2187 coredumpctl_sources,
2188 include_directories : includes,
2189 link_with : [libshared],
2190 dependencies : [threads,
2191 libxz,
2192 liblz4],
2193 install_rpath : rootlibexecdir,
2194 install : true)
2195 public_programs += exe
2196 endif
2197
2198 if conf.get('ENABLE_BINFMT') == 1
2199 exe = executable('systemd-binfmt',
2200 'src/binfmt/binfmt.c',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 install_rpath : rootlibexecdir,
2204 install : true,
2205 install_dir : rootlibexecdir)
2206 public_programs += exe
2207
2208 meson.add_install_script('sh', '-c',
2209 mkdir_p.format(binfmtdir))
2210 meson.add_install_script('sh', '-c',
2211 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2212 endif
2213
2214 if conf.get('ENABLE_VCONSOLE') == 1
2215 executable('systemd-vconsole-setup',
2216 'src/vconsole/vconsole-setup.c',
2217 include_directories : includes,
2218 link_with : [libshared],
2219 install_rpath : rootlibexecdir,
2220 install : true,
2221 install_dir : rootlibexecdir)
2222 endif
2223
2224 if conf.get('ENABLE_RANDOMSEED') == 1
2225 executable('systemd-random-seed',
2226 'src/random-seed/random-seed.c',
2227 include_directories : includes,
2228 link_with : [libshared],
2229 install_rpath : rootlibexecdir,
2230 install : true,
2231 install_dir : rootlibexecdir)
2232 endif
2233
2234 if conf.get('ENABLE_FIRSTBOOT') == 1
2235 executable('systemd-firstboot',
2236 'src/firstboot/firstboot.c',
2237 include_directories : includes,
2238 link_with : [libshared],
2239 dependencies : [libcrypt],
2240 install_rpath : rootlibexecdir,
2241 install : true,
2242 install_dir : rootbindir)
2243 endif
2244
2245 executable('systemd-remount-fs',
2246 'src/remount-fs/remount-fs.c',
2247 'src/core/mount-setup.c',
2248 'src/core/mount-setup.h',
2249 include_directories : includes,
2250 link_with : [libshared],
2251 install_rpath : rootlibexecdir,
2252 install : true,
2253 install_dir : rootlibexecdir)
2254
2255 executable('systemd-machine-id-setup',
2256 'src/machine-id-setup/machine-id-setup-main.c',
2257 'src/core/machine-id-setup.c',
2258 'src/core/machine-id-setup.h',
2259 include_directories : includes,
2260 link_with : [libshared],
2261 install_rpath : rootlibexecdir,
2262 install : true,
2263 install_dir : rootbindir)
2264
2265 executable('systemd-fsck',
2266 'src/fsck/fsck.c',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2270 install : true,
2271 install_dir : rootlibexecdir)
2272
2273 executable('systemd-growfs',
2274 'src/partition/growfs.c',
2275 include_directories : includes,
2276 link_with : [libshared],
2277 dependencies : [libcryptsetup],
2278 install_rpath : rootlibexecdir,
2279 install : true,
2280 install_dir : rootlibexecdir)
2281
2282 executable('systemd-makefs',
2283 'src/partition/makefs.c',
2284 include_directories : includes,
2285 link_with : [libshared],
2286 install_rpath : rootlibexecdir,
2287 install : true,
2288 install_dir : rootlibexecdir)
2289
2290 executable('systemd-sleep',
2291 'src/sleep/sleep.c',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 install_rpath : rootlibexecdir,
2295 install : true,
2296 install_dir : rootlibexecdir)
2297
2298 exe = executable('systemd-sysctl',
2299 'src/sysctl/sysctl.c',
2300 include_directories : includes,
2301 link_with : [libshared],
2302 install_rpath : rootlibexecdir,
2303 install : true,
2304 install_dir : rootlibexecdir)
2305 public_programs += exe
2306
2307 executable('systemd-ac-power',
2308 'src/ac-power/ac-power.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2312 install : true,
2313 install_dir : rootlibexecdir)
2314
2315 exe = executable('systemd-detect-virt',
2316 'src/detect-virt/detect-virt.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2320 install : true)
2321 public_programs += exe
2322
2323 exe = executable('systemd-delta',
2324 'src/delta/delta.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 install_rpath : rootlibexecdir,
2328 install : true)
2329 public_programs += exe
2330
2331 exe = executable('systemd-escape',
2332 'src/escape/escape.c',
2333 include_directories : includes,
2334 link_with : [libshared],
2335 install_rpath : rootlibexecdir,
2336 install : true,
2337 install_dir : rootbindir)
2338 public_programs += exe
2339
2340 exe = executable('systemd-notify',
2341 'src/notify/notify.c',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2345 install : true,
2346 install_dir : rootbindir)
2347 public_programs += exe
2348
2349 executable('systemd-volatile-root',
2350 'src/volatile-root/volatile-root.c',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 install_rpath : rootlibexecdir,
2354 install : true,
2355 install_dir : rootlibexecdir)
2356
2357 executable('systemd-cgroups-agent',
2358 'src/cgroups-agent/cgroups-agent.c',
2359 include_directories : includes,
2360 link_with : [libshared],
2361 install_rpath : rootlibexecdir,
2362 install : true,
2363 install_dir : rootlibexecdir)
2364
2365 exe = executable('systemd-id128',
2366 'src/id128/id128.c',
2367 include_directories : includes,
2368 link_with : [libshared],
2369 install_rpath : rootlibexecdir,
2370 install : true)
2371 public_programs += exe
2372
2373 exe = executable('systemd-path',
2374 'src/path/path.c',
2375 include_directories : includes,
2376 link_with : [libshared],
2377 install_rpath : rootlibexecdir,
2378 install : true)
2379 public_programs += exe
2380
2381 exe = executable('systemd-ask-password',
2382 'src/ask-password/ask-password.c',
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2386 install : true,
2387 install_dir : rootbindir)
2388 public_programs += exe
2389
2390 executable('systemd-reply-password',
2391 'src/reply-password/reply-password.c',
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2395 install : true,
2396 install_dir : rootlibexecdir)
2397
2398 exe = executable('systemd-tty-ask-password-agent',
2399 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2403 install : true,
2404 install_dir : rootbindir)
2405 public_programs += exe
2406
2407 exe = executable('systemd-cgls',
2408 'src/cgls/cgls.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2412 install : true)
2413 public_programs += exe
2414
2415 exe = executable('systemd-cgtop',
2416 'src/cgtop/cgtop.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 install_rpath : rootlibexecdir,
2420 install : true)
2421 public_programs += exe
2422
2423 executable('systemd-initctl',
2424 'src/initctl/initctl.c',
2425 include_directories : includes,
2426 link_with : [libshared],
2427 install_rpath : rootlibexecdir,
2428 install : true,
2429 install_dir : rootlibexecdir)
2430
2431 exe = executable('systemd-mount',
2432 'src/mount/mount-tool.c',
2433 include_directories : includes,
2434 link_with : [libshared],
2435 install_rpath : rootlibexecdir,
2436 install : true)
2437 public_programs += exe
2438
2439 meson.add_install_script(meson_make_symlink,
2440 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2441
2442 exe = executable('systemd-run',
2443 'src/run/run.c',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 install_rpath : rootlibexecdir,
2447 install : true)
2448 public_programs += exe
2449
2450 exe = executable('systemd-stdio-bridge',
2451 'src/stdio-bridge/stdio-bridge.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2455 install : true)
2456 public_programs += exe
2457
2458 exe = executable('busctl',
2459 'src/busctl/busctl.c',
2460 'src/busctl/busctl-introspect.c',
2461 'src/busctl/busctl-introspect.h',
2462 include_directories : includes,
2463 link_with : [libshared],
2464 install_rpath : rootlibexecdir,
2465 install : true)
2466 public_programs += exe
2467
2468 if conf.get('ENABLE_SYSUSERS') == 1
2469 exe = executable('systemd-sysusers',
2470 'src/sysusers/sysusers.c',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2474 install : true,
2475 install_dir : rootbindir)
2476 public_programs += exe
2477 endif
2478
2479 if conf.get('ENABLE_TMPFILES') == 1
2480 exe = executable('systemd-tmpfiles',
2481 'src/tmpfiles/tmpfiles.c',
2482 include_directories : includes,
2483 link_with : [libshared],
2484 dependencies : [libacl],
2485 install_rpath : rootlibexecdir,
2486 install : true,
2487 install_dir : rootbindir)
2488 public_programs += exe
2489
2490 if want_tests != 'false'
2491 test('test-systemd-tmpfiles',
2492 test_systemd_tmpfiles_py,
2493 # https://github.com/mesonbuild/meson/issues/2681
2494 args : exe.full_path())
2495 endif
2496 endif
2497
2498 if conf.get('ENABLE_HWDB') == 1
2499 exe = executable('systemd-hwdb',
2500 'src/hwdb/hwdb.c',
2501 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2502 include_directories : includes,
2503 link_with : [libudev_static],
2504 install_rpath : udev_rpath,
2505 install : true,
2506 install_dir : rootbindir)
2507 public_programs += exe
2508 endif
2509
2510 if conf.get('ENABLE_QUOTACHECK') == 1
2511 executable('systemd-quotacheck',
2512 'src/quotacheck/quotacheck.c',
2513 include_directories : includes,
2514 link_with : [libshared],
2515 install_rpath : rootlibexecdir,
2516 install : true,
2517 install_dir : rootlibexecdir)
2518 endif
2519
2520 exe = executable('systemd-socket-proxyd',
2521 'src/socket-proxy/socket-proxyd.c',
2522 include_directories : includes,
2523 link_with : [libshared],
2524 dependencies : [threads],
2525 install_rpath : rootlibexecdir,
2526 install : true,
2527 install_dir : rootlibexecdir)
2528 public_programs += exe
2529
2530 exe = executable('systemd-udevd',
2531 systemd_udevd_sources,
2532 include_directories : includes,
2533 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2534 link_with : [libudev_core,
2535 libsystemd_network,
2536 libudev_static],
2537 dependencies : [threads,
2538 libkmod,
2539 libidn,
2540 libacl,
2541 libblkid],
2542 install_rpath : udev_rpath,
2543 install : true,
2544 install_dir : rootlibexecdir)
2545 public_programs += exe
2546
2547 exe = executable('udevadm',
2548 udevadm_sources,
2549 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2550 include_directories : includes,
2551 link_with : [libudev_core,
2552 libsystemd_network,
2553 libudev_static],
2554 dependencies : [threads,
2555 libkmod,
2556 libidn,
2557 libacl,
2558 libblkid],
2559 install_rpath : udev_rpath,
2560 install : true,
2561 install_dir : rootbindir)
2562 public_programs += exe
2563
2564 executable('systemd-shutdown',
2565 systemd_shutdown_sources,
2566 include_directories : includes,
2567 link_with : [libshared],
2568 dependencies : [libmount],
2569 install_rpath : rootlibexecdir,
2570 install : true,
2571 install_dir : rootlibexecdir)
2572
2573 executable('systemd-update-done',
2574 'src/update-done/update-done.c',
2575 include_directories : includes,
2576 link_with : [libshared],
2577 install_rpath : rootlibexecdir,
2578 install : true,
2579 install_dir : rootlibexecdir)
2580
2581 executable('systemd-update-utmp',
2582 'src/update-utmp/update-utmp.c',
2583 include_directories : includes,
2584 link_with : [libshared],
2585 dependencies : [libaudit],
2586 install_rpath : rootlibexecdir,
2587 install : true,
2588 install_dir : rootlibexecdir)
2589
2590 if conf.get('HAVE_KMOD') == 1
2591 executable('systemd-modules-load',
2592 'src/modules-load/modules-load.c',
2593 include_directories : includes,
2594 link_with : [libshared],
2595 dependencies : [libkmod],
2596 install_rpath : rootlibexecdir,
2597 install : true,
2598 install_dir : rootlibexecdir)
2599
2600 meson.add_install_script('sh', '-c',
2601 mkdir_p.format(modulesloaddir))
2602 meson.add_install_script('sh', '-c',
2603 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2604 endif
2605
2606 exe = executable('systemd-nspawn',
2607 systemd_nspawn_sources,
2608 'src/core/mount-setup.c', # FIXME: use a variable?
2609 'src/core/mount-setup.h',
2610 'src/core/loopback-setup.c',
2611 'src/core/loopback-setup.h',
2612 include_directories : includes,
2613 link_with : [libnspawn_core,
2614 libshared],
2615 dependencies : [libblkid],
2616 install_rpath : rootlibexecdir,
2617 install : true)
2618 public_programs += exe
2619
2620 if conf.get('ENABLE_NETWORKD') == 1
2621 executable('systemd-networkd',
2622 systemd_networkd_sources,
2623 include_directories : includes,
2624 link_with : [libnetworkd_core,
2625 libsystemd_network,
2626 libudev_static,
2627 libshared],
2628 dependencies : [threads],
2629 install_rpath : rootlibexecdir,
2630 install : true,
2631 install_dir : rootlibexecdir)
2632
2633 executable('systemd-networkd-wait-online',
2634 systemd_networkd_wait_online_sources,
2635 include_directories : includes,
2636 link_with : [libnetworkd_core,
2637 libshared],
2638 install_rpath : rootlibexecdir,
2639 install : true,
2640 install_dir : rootlibexecdir)
2641
2642 exe = executable('networkctl',
2643 networkctl_sources,
2644 include_directories : includes,
2645 link_with : [libsystemd_network,
2646 libshared],
2647 install_rpath : rootlibexecdir,
2648 install : true,
2649 install_dir : rootbindir)
2650 public_programs += exe
2651 endif
2652
2653 executable('systemd-sulogin-shell',
2654 ['src/sulogin-shell/sulogin-shell.c'],
2655 include_directories : includes,
2656 link_with : [libshared],
2657 install_rpath : rootlibexecdir,
2658 install : true,
2659 install_dir : rootlibexecdir)
2660
2661 ############################################################
2662
2663 custom_target(
2664 'systemd-runtest.env',
2665 output : 'systemd-runtest.env',
2666 command : ['sh', '-c', '{ ' +
2667 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2668 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2669 '} >@OUTPUT@'],
2670 build_by_default : true)
2671
2672 foreach tuple : tests
2673 sources = tuple[0]
2674 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2675 dependencies = tuple[2]
2676 condition = tuple.length() >= 4 ? tuple[3] : ''
2677 type = tuple.length() >= 5 ? tuple[4] : ''
2678 defs = tuple.length() >= 6 ? tuple[5] : []
2679 incs = tuple.length() >= 7 ? tuple[6] : includes
2680 timeout = 30
2681
2682 name = sources[0].split('/')[-1].split('.')[0]
2683 if type.startswith('timeout=')
2684 timeout = type.split('=')[1].to_int()
2685 type = ''
2686 endif
2687
2688 if condition == '' or conf.get(condition) == 1
2689 exe = executable(
2690 name,
2691 sources,
2692 include_directories : incs,
2693 link_with : link_with,
2694 dependencies : dependencies,
2695 c_args : defs,
2696 build_by_default : want_tests != 'false',
2697 install_rpath : rootlibexecdir,
2698 install : install_tests,
2699 install_dir : join_paths(testsdir, type))
2700
2701 if type == 'manual'
2702 message('@0@ is a manual test'.format(name))
2703 elif type == 'unsafe' and want_tests != 'unsafe'
2704 message('@0@ is an unsafe test'.format(name))
2705 elif want_tests != 'false'
2706 test(name, exe,
2707 env : test_env,
2708 timeout : timeout)
2709 endif
2710 else
2711 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2712 endif
2713 endforeach
2714
2715 exe = executable(
2716 'test-libsystemd-sym',
2717 test_libsystemd_sym_c,
2718 include_directories : includes,
2719 link_with : [libsystemd],
2720 build_by_default : want_tests != 'false',
2721 install : install_tests,
2722 install_dir : testsdir)
2723 if want_tests != 'false'
2724 test('test-libsystemd-sym', exe)
2725 endif
2726
2727 exe = executable(
2728 'test-libsystemd-static-sym',
2729 test_libsystemd_sym_c,
2730 include_directories : includes,
2731 link_with : [install_libsystemd_static],
2732 dependencies : [threads], # threads is already included in dependencies on the library,
2733 # but does not seem to get propagated. Add here as a work-around.
2734 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2735 install : install_tests and static_libsystemd_pic,
2736 install_dir : testsdir)
2737 if want_tests != 'false' and static_libsystemd_pic
2738 test('test-libsystemd-static-sym', exe)
2739 endif
2740
2741 exe = executable(
2742 'test-libudev-sym',
2743 test_libudev_sym_c,
2744 include_directories : includes,
2745 c_args : '-Wno-deprecated-declarations',
2746 link_with : [libudev],
2747 build_by_default : want_tests != 'false',
2748 install : install_tests,
2749 install_dir : testsdir)
2750 if want_tests != 'false'
2751 test('test-libudev-sym', exe)
2752 endif
2753
2754 exe = executable(
2755 'test-libudev-static-sym',
2756 test_libudev_sym_c,
2757 include_directories : includes,
2758 c_args : '-Wno-deprecated-declarations',
2759 link_with : [install_libudev_static],
2760 build_by_default : want_tests != 'false' and static_libudev_pic,
2761 install : install_tests and static_libudev_pic,
2762 install_dir : testsdir)
2763 if want_tests != 'false' and static_libudev_pic
2764 test('test-libudev-static-sym', exe)
2765 endif
2766
2767 ############################################################
2768
2769 fuzzer_exes = []
2770
2771 foreach tuple : fuzzers
2772 sources = tuple[0]
2773 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2774 dependencies = tuple[2]
2775 defs = tuple.length() >= 4 ? tuple[3] : []
2776 incs = tuple.length() >= 5 ? tuple[4] : includes
2777
2778 if fuzzer_build
2779 dependencies += fuzzing_engine
2780 else
2781 sources += 'src/fuzz/fuzz-main.c'
2782 endif
2783
2784 name = sources[0].split('/')[-1].split('.')[0]
2785
2786 fuzzer_exes += executable(
2787 name,
2788 sources,
2789 include_directories : [incs, include_directories('src/fuzz')],
2790 link_with : link_with,
2791 dependencies : dependencies,
2792 c_args : defs,
2793 install : false)
2794 endforeach
2795
2796 run_target('fuzzers',
2797 depends : fuzzer_exes,
2798 command : ['true'])
2799
2800 ############################################################
2801
2802 make_directive_index_py = find_program('tools/make-directive-index.py')
2803 make_man_index_py = find_program('tools/make-man-index.py')
2804 xml_helper_py = find_program('tools/xml_helper.py')
2805 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2806
2807 subdir('units')
2808 subdir('sysctl.d')
2809 subdir('sysusers.d')
2810 subdir('tmpfiles.d')
2811 subdir('presets')
2812 subdir('hwdb')
2813 subdir('network')
2814 subdir('man')
2815 subdir('shell-completion/bash')
2816 subdir('shell-completion/zsh')
2817 subdir('docs/sysvinit')
2818 subdir('docs/var-log')
2819
2820 install_subdir('factory/etc',
2821 install_dir : factorydir)
2822
2823 install_data('xorg/50-systemd-user.sh',
2824 install_dir : xinitrcdir)
2825 install_data('modprobe.d/systemd.conf',
2826 install_dir : modprobedir)
2827 install_data('LICENSE.GPL2',
2828 'LICENSE.LGPL2.1',
2829 'NEWS',
2830 'README',
2831 'docs/CODING_STYLE',
2832 'docs/DISTRO_PORTING.md',
2833 'docs/ENVIRONMENT.md',
2834 'docs/HACKING',
2835 'docs/TRANSIENT-SETTINGS.md',
2836 'docs/TRANSLATORS.md',
2837 'docs/UIDS-GIDS.md',
2838 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2839 install_dir : docdir)
2840
2841 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2842 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2843
2844 ############################################################
2845
2846 meson_check_help = find_program('tools/meson-check-help.sh')
2847
2848 foreach exec : public_programs
2849 name = exec.full_path().split('/')[-1]
2850 if want_tests != 'false'
2851 test('check-help-' + name,
2852 meson_check_help,
2853 args : exec.full_path())
2854 endif
2855 endforeach
2856
2857 ############################################################
2858
2859 # Enable tests for all supported sanitizers
2860 foreach tuple : sanitizers
2861 sanitizer = tuple[0]
2862 build = tuple[1]
2863
2864 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2865 prev = ''
2866 foreach p : fuzz_regression_tests
2867 b = p.split('/')[-2]
2868 c = p.split('/')[-1]
2869
2870 name = '@0@:@1@'.format(b, sanitizer)
2871
2872 if name != prev
2873 if want_tests == 'false'
2874 message('Not compiling @0@ because tests is set to false'.format(name))
2875 elif slow_tests
2876 exe = custom_target(
2877 name,
2878 output : name,
2879 depends : build,
2880 command : [env, 'ln', '-fs',
2881 join_paths(build.full_path(), b),
2882 '@OUTPUT@'],
2883 build_by_default : true)
2884 else
2885 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2886 endif
2887 endif
2888 prev = name
2889
2890 if want_tests != 'false' and slow_tests
2891 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2892 env,
2893 args : [exe.full_path(),
2894 join_paths(meson.source_root(), p)])
2895 endif
2896 endforeach
2897 endif
2898 endforeach
2899
2900
2901 ############################################################
2902
2903 if git.found()
2904 all_files = run_command(
2905 git,
2906 ['--git-dir=@0@/.git'.format(meson.source_root()),
2907 'ls-files',
2908 ':/*.[ch]'])
2909 all_files = files(all_files.stdout().split())
2910
2911 custom_target(
2912 'tags',
2913 output : 'tags',
2914 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2915 run_target(
2916 'ctags',
2917 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2918 endif
2919
2920 if git.found()
2921 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2922 run_target(
2923 'git-contrib',
2924 command : [meson_git_contrib_sh])
2925 endif
2926
2927 if git.found()
2928 git_head = run_command(
2929 git,
2930 ['--git-dir=@0@/.git'.format(meson.source_root()),
2931 'rev-parse', 'HEAD']).stdout().strip()
2932 git_head_short = run_command(
2933 git,
2934 ['--git-dir=@0@/.git'.format(meson.source_root()),
2935 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2936
2937 run_target(
2938 'git-snapshot',
2939 command : ['git', 'archive',
2940 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2941 git_head_short),
2942 '--prefix', 'systemd-@0@/'.format(git_head),
2943 'HEAD'])
2944 endif
2945
2946 ############################################################
2947
2948 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2949 run_target(
2950 'check-api-docs',
2951 depends : [man, libsystemd, libudev],
2952 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2953
2954 run_target(
2955 'make-index-md',
2956 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2957
2958 ############################################################
2959
2960 status = [
2961 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2962
2963 'split /usr: @0@'.format(split_usr),
2964 'split bin-sbin: @0@'.format(split_bin),
2965 'prefix directory: @0@'.format(prefixdir),
2966 'rootprefix directory: @0@'.format(rootprefixdir),
2967 'sysconf directory: @0@'.format(sysconfdir),
2968 'include directory: @0@'.format(includedir),
2969 'lib directory: @0@'.format(libdir),
2970 'rootlib directory: @0@'.format(rootlibdir),
2971 'SysV init scripts: @0@'.format(sysvinit_path),
2972 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2973 'PAM modules directory: @0@'.format(pamlibdir),
2974 'PAM configuration directory: @0@'.format(pamconfdir),
2975 'RPM macros directory: @0@'.format(rpmmacrosdir),
2976 'modprobe.d directory: @0@'.format(modprobedir),
2977 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2978 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2979 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2980 'bash completions directory: @0@'.format(bashcompletiondir),
2981 'zsh completions directory: @0@'.format(zshcompletiondir),
2982 'extra start script: @0@'.format(get_option('rc-local')),
2983 'extra stop script: @0@'.format(get_option('halt-local')),
2984 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2985 get_option('debug-tty')),
2986 'TTY GID: @0@'.format(tty_gid),
2987 'users GID: @0@'.format(substs.get('USERS_GID')),
2988 'maximum system UID: @0@'.format(system_uid_max),
2989 'maximum system GID: @0@'.format(system_gid_max),
2990 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2991 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2992 'minimum container UID base: @0@'.format(container_uid_base_min),
2993 'maximum container UID base: @0@'.format(container_uid_base_max),
2994 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2995 'render group access mode: @0@'.format(get_option('group-render-mode')),
2996 'certificate root directory: @0@'.format(get_option('certificate-root')),
2997 'support URL: @0@'.format(support_url),
2998 'nobody user name: @0@'.format(nobody_user),
2999 'nobody group name: @0@'.format(nobody_group),
3000 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3001 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3002
3003 'default DNSSEC mode: @0@'.format(default_dnssec),
3004 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3005 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3006 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3007
3008 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3009 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3010 status += [
3011 'default DNS servers: @0@'.format(alt_dns_servers),
3012 'default NTP servers: @0@'.format(alt_ntp_servers)]
3013
3014 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3015 '@@0@'.format(time_epoch)).stdout().strip()
3016 status += [
3017 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3018
3019 status += [
3020 'static libsystemd: @0@'.format(static_libsystemd),
3021 'static libudev: @0@'.format(static_libudev)]
3022
3023 # TODO:
3024 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3025 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3026 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3027
3028 if conf.get('ENABLE_EFI') == 1
3029 status += 'efi arch: @0@'.format(efi_arch)
3030
3031 if have_gnu_efi
3032 status += [
3033 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3034 'EFI CC @0@'.format(efi_cc),
3035 'EFI lib directory: @0@'.format(efi_libdir),
3036 'EFI lds directory: @0@'.format(efi_ldsdir),
3037 'EFI include directory: @0@'.format(efi_incdir)]
3038 endif
3039 endif
3040
3041 found = []
3042 missing = []
3043
3044 foreach tuple : [
3045 ['libcryptsetup'],
3046 ['PAM'],
3047 ['AUDIT'],
3048 ['IMA'],
3049 ['AppArmor'],
3050 ['SELinux'],
3051 ['SECCOMP'],
3052 ['SMACK'],
3053 ['zlib'],
3054 ['xz'],
3055 ['lz4'],
3056 ['bzip2'],
3057 ['ACL'],
3058 ['gcrypt'],
3059 ['qrencode'],
3060 ['microhttpd'],
3061 ['gnutls'],
3062 ['openssl'],
3063 ['libcurl'],
3064 ['idn'],
3065 ['libidn2'],
3066 ['libidn'],
3067 ['libiptc'],
3068 ['elfutils'],
3069 ['binfmt'],
3070 ['vconsole'],
3071 ['quotacheck'],
3072 ['tmpfiles'],
3073 ['environment.d'],
3074 ['sysusers'],
3075 ['firstboot'],
3076 ['randomseed'],
3077 ['backlight'],
3078 ['rfkill'],
3079 ['logind'],
3080 ['machined'],
3081 ['portabled'],
3082 ['importd'],
3083 ['hostnamed'],
3084 ['timedated'],
3085 ['timesyncd'],
3086 ['localed'],
3087 ['networkd'],
3088 ['resolve'],
3089 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3090 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3091 ['coredump'],
3092 ['polkit'],
3093 ['legacy pkla', install_polkit_pkla],
3094 ['efi'],
3095 ['gnu-efi', have_gnu_efi],
3096 ['kmod'],
3097 ['xkbcommon'],
3098 ['pcre2'],
3099 ['blkid'],
3100 ['dbus'],
3101 ['glib'],
3102 ['nss-myhostname'],
3103 ['nss-mymachines'],
3104 ['nss-resolve'],
3105 ['nss-systemd'],
3106 ['hwdb'],
3107 ['tpm'],
3108 ['man pages', want_man],
3109 ['html pages', want_html],
3110 ['man page indices', want_man and have_lxml],
3111 ['SysV compat'],
3112 ['utmp'],
3113 ['ldconfig'],
3114 ['hibernate'],
3115 ['adm group', get_option('adm-group')],
3116 ['wheel group', get_option('wheel-group')],
3117 ['gshadow'],
3118 ['debug hashmap'],
3119 ['debug mmap cache'],
3120 ['valgrind', conf.get('VALGRIND') == 1],
3121 ['trace logging', conf.get('LOG_TRACE') == 1],
3122 ['link-udev-shared', get_option('link-udev-shared')],
3123 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3124 ]
3125
3126 if tuple.length() >= 2
3127 cond = tuple[1]
3128 else
3129 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3130 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3131 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3132 endif
3133 if cond
3134 found += tuple[0]
3135 else
3136 missing += tuple[0]
3137 endif
3138 endforeach
3139
3140 status += [
3141 '',
3142 'enabled features: @0@'.format(', '.join(found)),
3143 '',
3144 'disabled features: @0@'.format(', '.join(missing)),
3145 '']
3146 message('\n '.join(status))
3147
3148 if rootprefixdir != rootprefix_default
3149 warning('\n' +
3150 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3151 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3152 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3153 endif