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