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