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