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