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