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