]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
tree-wide: drop license boilerplate
[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 ############################################################
1346
1347 # binaries that have --help and are intended for use by humans,
1348 # usually, but not always, installed in /bin.
1349 public_programs = []
1350
1351 subdir('src/libudev')
1352 subdir('src/shared')
1353 subdir('src/core')
1354 subdir('src/udev')
1355 subdir('src/network')
1356
1357 subdir('src/analyze')
1358 subdir('src/journal-remote')
1359 subdir('src/coredump')
1360 subdir('src/hostname')
1361 subdir('src/import')
1362 subdir('src/kernel-install')
1363 subdir('src/locale')
1364 subdir('src/machine')
1365 subdir('src/nspawn')
1366 subdir('src/resolve')
1367 subdir('src/timedate')
1368 subdir('src/timesync')
1369 subdir('src/vconsole')
1370 subdir('src/boot/efi')
1371
1372 subdir('src/test')
1373 subdir('src/fuzz')
1374 subdir('rules')
1375 subdir('test')
1376
1377 ############################################################
1378
1379 # only static linking apart from libdl, to make sure that the
1380 # module is linked to all libraries that it uses.
1381 test_dlopen = executable(
1382 'test-dlopen',
1383 test_dlopen_c,
1384 include_directories : includes,
1385 link_with : [libbasic],
1386 dependencies : [libdl])
1387
1388 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1389 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1390 ['mymachines', 'ENABLE_MACHINED'],
1391 ['resolve', 'ENABLE_RESOLVE']]
1392
1393 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1394 if condition
1395 module = tuple[0]
1396
1397 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1398 version_script_arg = join_paths(meson.current_source_dir(), sym)
1399
1400 nss = shared_library(
1401 'nss_' + module,
1402 'src/nss-@0@/nss-@0@.c'.format(module),
1403 version : '2',
1404 include_directories : includes,
1405 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1406 link_args : ['-Wl,-z,nodelete',
1407 '-shared',
1408 '-Wl,--version-script=' + version_script_arg,
1409 '-Wl,--undefined'],
1410 link_with : [libsystemd_static,
1411 libbasic],
1412 dependencies : [threads,
1413 librt],
1414 link_depends : sym,
1415 install : true,
1416 install_dir : rootlibdir)
1417
1418 # We cannot use shared_module because it does not support version suffix.
1419 # Unfortunately shared_library insists on creating the symlink…
1420 meson.add_install_script('sh', '-c',
1421 'rm $DESTDIR@0@/libnss_@1@.so'
1422 .format(rootlibdir, module))
1423
1424 test('dlopen-nss_' + module,
1425 test_dlopen,
1426 args : [nss.full_path()]) # path to dlopen must include a slash
1427 endif
1428 endforeach
1429
1430 ############################################################
1431
1432 executable('systemd',
1433 systemd_sources,
1434 include_directories : includes,
1435 link_with : [libcore,
1436 libshared],
1437 dependencies : [threads,
1438 librt,
1439 libseccomp,
1440 libselinux,
1441 libmount,
1442 libblkid],
1443 install_rpath : rootlibexecdir,
1444 install : true,
1445 install_dir : rootlibexecdir)
1446
1447 meson.add_install_script(meson_make_symlink,
1448 join_paths(rootlibexecdir, 'systemd'),
1449 join_paths(rootsbindir, 'init'))
1450
1451 exe = executable('systemd-analyze',
1452 systemd_analyze_sources,
1453 include_directories : includes,
1454 link_with : [libcore,
1455 libshared],
1456 dependencies : [threads,
1457 librt,
1458 libseccomp,
1459 libselinux,
1460 libmount,
1461 libblkid],
1462 install_rpath : rootlibexecdir,
1463 install : true)
1464 public_programs += [exe]
1465
1466 executable('systemd-journald',
1467 systemd_journald_sources,
1468 include_directories : includes,
1469 link_with : [libjournal_core,
1470 libshared],
1471 dependencies : [threads,
1472 libxz,
1473 liblz4,
1474 libselinux],
1475 install_rpath : rootlibexecdir,
1476 install : true,
1477 install_dir : rootlibexecdir)
1478
1479 exe = executable('systemd-cat',
1480 systemd_cat_sources,
1481 include_directories : includes,
1482 link_with : [libjournal_core,
1483 libshared],
1484 dependencies : [threads],
1485 install_rpath : rootlibexecdir,
1486 install : true)
1487 public_programs += [exe]
1488
1489 exe = executable('journalctl',
1490 journalctl_sources,
1491 include_directories : includes,
1492 link_with : [libshared],
1493 dependencies : [threads,
1494 libqrencode,
1495 libxz,
1496 liblz4,
1497 libpcre2],
1498 install_rpath : rootlibexecdir,
1499 install : true,
1500 install_dir : rootbindir)
1501 public_programs += [exe]
1502
1503 executable('systemd-getty-generator',
1504 'src/getty-generator/getty-generator.c',
1505 include_directories : includes,
1506 link_with : [libshared],
1507 install_rpath : rootlibexecdir,
1508 install : true,
1509 install_dir : systemgeneratordir)
1510
1511 executable('systemd-debug-generator',
1512 'src/debug-generator/debug-generator.c',
1513 include_directories : includes,
1514 link_with : [libshared],
1515 install_rpath : rootlibexecdir,
1516 install : true,
1517 install_dir : systemgeneratordir)
1518
1519 executable('systemd-fstab-generator',
1520 'src/fstab-generator/fstab-generator.c',
1521 'src/core/mount-setup.c',
1522 include_directories : includes,
1523 link_with : [libshared],
1524 install_rpath : rootlibexecdir,
1525 install : true,
1526 install_dir : systemgeneratordir)
1527
1528 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1529 executable('30-systemd-environment-d-generator',
1530 'src/environment-d-generator/environment-d-generator.c',
1531 include_directories : includes,
1532 link_with : [libshared],
1533 install_rpath : rootlibexecdir,
1534 install : true,
1535 install_dir : userenvgeneratordir)
1536
1537 meson.add_install_script(meson_make_symlink,
1538 join_paths(sysconfdir, 'environment'),
1539 join_paths(environmentdir, '99-environment.conf'))
1540 endif
1541
1542 if conf.get('ENABLE_HIBERNATE') == 1
1543 executable('systemd-hibernate-resume-generator',
1544 'src/hibernate-resume/hibernate-resume-generator.c',
1545 include_directories : includes,
1546 link_with : [libshared],
1547 install_rpath : rootlibexecdir,
1548 install : true,
1549 install_dir : systemgeneratordir)
1550
1551 executable('systemd-hibernate-resume',
1552 'src/hibernate-resume/hibernate-resume.c',
1553 include_directories : includes,
1554 link_with : [libshared],
1555 install_rpath : rootlibexecdir,
1556 install : true,
1557 install_dir : rootlibexecdir)
1558 endif
1559
1560 if conf.get('HAVE_BLKID') == 1
1561 executable('systemd-gpt-auto-generator',
1562 'src/gpt-auto-generator/gpt-auto-generator.c',
1563 'src/basic/blkid-util.h',
1564 include_directories : includes,
1565 link_with : [libshared],
1566 dependencies : libblkid,
1567 install_rpath : rootlibexecdir,
1568 install : true,
1569 install_dir : systemgeneratordir)
1570
1571 exe = executable('systemd-dissect',
1572 'src/dissect/dissect.c',
1573 include_directories : includes,
1574 link_with : [libshared],
1575 install_rpath : rootlibexecdir,
1576 install : true,
1577 install_dir : rootlibexecdir)
1578 public_programs += [exe]
1579 endif
1580
1581 if conf.get('ENABLE_RESOLVE') == 1
1582 executable('systemd-resolved',
1583 systemd_resolved_sources,
1584 include_directories : includes,
1585 link_with : [libshared,
1586 libbasic_gcrypt,
1587 libsystemd_resolve_core],
1588 dependencies : [threads,
1589 libgpg_error,
1590 libm,
1591 libidn],
1592 install_rpath : rootlibexecdir,
1593 install : true,
1594 install_dir : rootlibexecdir)
1595
1596 exe = executable('systemd-resolve',
1597 systemd_resolve_sources,
1598 include_directories : includes,
1599 link_with : [libshared,
1600 libbasic_gcrypt,
1601 libsystemd_resolve_core],
1602 dependencies : [threads,
1603 libgpg_error,
1604 libm,
1605 libidn],
1606 install_rpath : rootlibexecdir,
1607 install : true)
1608 public_programs += [exe]
1609
1610 meson.add_install_script(meson_make_symlink,
1611 join_paths(bindir, 'systemd-resolve'),
1612 join_paths(rootsbindir, 'resolvconf'))
1613 endif
1614
1615 if conf.get('ENABLE_LOGIND') == 1
1616 executable('systemd-logind',
1617 systemd_logind_sources,
1618 include_directories : includes,
1619 link_with : [liblogind_core,
1620 libshared],
1621 dependencies : [threads,
1622 libacl],
1623 install_rpath : rootlibexecdir,
1624 install : true,
1625 install_dir : rootlibexecdir)
1626
1627 exe = executable('loginctl',
1628 loginctl_sources,
1629 include_directories : includes,
1630 link_with : [libshared],
1631 dependencies : [threads,
1632 liblz4,
1633 libxz],
1634 install_rpath : rootlibexecdir,
1635 install : true,
1636 install_dir : rootbindir)
1637 public_programs += [exe]
1638
1639 exe = executable('systemd-inhibit',
1640 'src/login/inhibit.c',
1641 include_directories : includes,
1642 link_with : [libshared],
1643 install_rpath : rootlibexecdir,
1644 install : true,
1645 install_dir : rootbindir)
1646 public_programs += [exe]
1647
1648 if conf.get('HAVE_PAM') == 1
1649 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1650 pam_systemd = shared_library(
1651 'pam_systemd',
1652 pam_systemd_c,
1653 name_prefix : '',
1654 include_directories : includes,
1655 link_args : ['-shared',
1656 '-Wl,--version-script=' + version_script_arg],
1657 link_with : [libsystemd_static,
1658 libshared_static],
1659 dependencies : [threads,
1660 libpam,
1661 libpam_misc],
1662 link_depends : pam_systemd_sym,
1663 install : true,
1664 install_dir : pamlibdir)
1665
1666 test('dlopen-pam_systemd',
1667 test_dlopen,
1668 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1669 endif
1670 endif
1671
1672 if conf.get('HAVE_PAM') == 1
1673 executable('systemd-user-sessions',
1674 'src/user-sessions/user-sessions.c',
1675 include_directories : includes,
1676 link_with : [libshared],
1677 install_rpath : rootlibexecdir,
1678 install : true,
1679 install_dir : rootlibexecdir)
1680 endif
1681
1682 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1683 exe = executable('bootctl',
1684 'src/boot/bootctl.c',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 dependencies : [libblkid],
1688 install_rpath : rootlibexecdir,
1689 install : true)
1690 public_programs += [exe]
1691 endif
1692
1693 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 dependencies : [threads],
1697 install_rpath : rootlibexecdir,
1698 install : true)
1699 public_programs += [exe]
1700
1701 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1702 include_directories : includes,
1703 link_with : [libshared],
1704 dependencies : [threads,
1705 libcap,
1706 libselinux,
1707 libxz,
1708 liblz4],
1709 install_rpath : rootlibexecdir,
1710 install : true,
1711 install_dir : rootbindir)
1712 public_programs += [exe]
1713
1714 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1715 meson.add_install_script(meson_make_symlink,
1716 join_paths(rootbindir, 'systemctl'),
1717 join_paths(rootsbindir, alias))
1718 endforeach
1719
1720 if conf.get('ENABLE_BACKLIGHT') == 1
1721 executable('systemd-backlight',
1722 'src/backlight/backlight.c',
1723 include_directories : includes,
1724 link_with : [libshared],
1725 install_rpath : rootlibexecdir,
1726 install : true,
1727 install_dir : rootlibexecdir)
1728 endif
1729
1730 if conf.get('ENABLE_RFKILL') == 1
1731 executable('systemd-rfkill',
1732 'src/rfkill/rfkill.c',
1733 include_directories : includes,
1734 link_with : [libshared],
1735 install_rpath : rootlibexecdir,
1736 install : true,
1737 install_dir : rootlibexecdir)
1738 endif
1739
1740 executable('systemd-system-update-generator',
1741 'src/system-update-generator/system-update-generator.c',
1742 include_directories : includes,
1743 link_with : [libshared],
1744 install_rpath : rootlibexecdir,
1745 install : true,
1746 install_dir : systemgeneratordir)
1747
1748 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1749 executable('systemd-cryptsetup',
1750 'src/cryptsetup/cryptsetup.c',
1751 include_directories : includes,
1752 link_with : [libshared],
1753 dependencies : [libcryptsetup],
1754 install_rpath : rootlibexecdir,
1755 install : true,
1756 install_dir : rootlibexecdir)
1757
1758 executable('systemd-cryptsetup-generator',
1759 'src/cryptsetup/cryptsetup-generator.c',
1760 include_directories : includes,
1761 link_with : [libshared],
1762 dependencies : [libcryptsetup],
1763 install_rpath : rootlibexecdir,
1764 install : true,
1765 install_dir : systemgeneratordir)
1766
1767 executable('systemd-veritysetup',
1768 'src/veritysetup/veritysetup.c',
1769 include_directories : includes,
1770 link_with : [libshared],
1771 dependencies : [libcryptsetup],
1772 install_rpath : rootlibexecdir,
1773 install : true,
1774 install_dir : rootlibexecdir)
1775
1776 executable('systemd-veritysetup-generator',
1777 'src/veritysetup/veritysetup-generator.c',
1778 include_directories : includes,
1779 link_with : [libshared],
1780 dependencies : [libcryptsetup],
1781 install_rpath : rootlibexecdir,
1782 install : true,
1783 install_dir : systemgeneratordir)
1784 endif
1785
1786 if conf.get('HAVE_SYSV_COMPAT') == 1
1787 executable('systemd-sysv-generator',
1788 'src/sysv-generator/sysv-generator.c',
1789 include_directories : includes,
1790 link_with : [libshared],
1791 install_rpath : rootlibexecdir,
1792 install : true,
1793 install_dir : systemgeneratordir)
1794
1795 executable('systemd-rc-local-generator',
1796 'src/rc-local-generator/rc-local-generator.c',
1797 include_directories : includes,
1798 link_with : [libshared],
1799 install_rpath : rootlibexecdir,
1800 install : true,
1801 install_dir : systemgeneratordir)
1802 endif
1803
1804 if conf.get('ENABLE_HOSTNAMED') == 1
1805 executable('systemd-hostnamed',
1806 'src/hostname/hostnamed.c',
1807 include_directories : includes,
1808 link_with : [libshared],
1809 install_rpath : rootlibexecdir,
1810 install : true,
1811 install_dir : rootlibexecdir)
1812
1813 exe = executable('hostnamectl',
1814 'src/hostname/hostnamectl.c',
1815 include_directories : includes,
1816 link_with : [libshared],
1817 install_rpath : rootlibexecdir,
1818 install : true)
1819 public_programs += [exe]
1820 endif
1821
1822 if conf.get('ENABLE_LOCALED') == 1
1823 if conf.get('HAVE_XKBCOMMON') == 1
1824 # logind will load libxkbcommon.so dynamically on its own
1825 deps = [libdl]
1826 else
1827 deps = []
1828 endif
1829
1830 executable('systemd-localed',
1831 systemd_localed_sources,
1832 include_directories : includes,
1833 link_with : [libshared],
1834 dependencies : deps,
1835 install_rpath : rootlibexecdir,
1836 install : true,
1837 install_dir : rootlibexecdir)
1838
1839 exe = executable('localectl',
1840 localectl_sources,
1841 include_directories : includes,
1842 link_with : [libshared],
1843 install_rpath : rootlibexecdir,
1844 install : true)
1845 public_programs += [exe]
1846 endif
1847
1848 if conf.get('ENABLE_TIMEDATED') == 1
1849 executable('systemd-timedated',
1850 'src/timedate/timedated.c',
1851 include_directories : includes,
1852 link_with : [libshared],
1853 install_rpath : rootlibexecdir,
1854 install : true,
1855 install_dir : rootlibexecdir)
1856
1857 exe = executable('timedatectl',
1858 'src/timedate/timedatectl.c',
1859 include_directories : includes,
1860 install_rpath : rootlibexecdir,
1861 link_with : [libshared],
1862 install : true)
1863 public_programs += [exe]
1864 endif
1865
1866 if conf.get('ENABLE_TIMESYNCD') == 1
1867 executable('systemd-timesyncd',
1868 systemd_timesyncd_sources,
1869 include_directories : includes,
1870 link_with : [libshared],
1871 dependencies : [threads,
1872 libm],
1873 install_rpath : rootlibexecdir,
1874 install : true,
1875 install_dir : rootlibexecdir)
1876
1877 executable('systemd-time-wait-sync',
1878 'src/time-wait-sync/time-wait-sync.c',
1879 include_directories : includes,
1880 link_with : [libshared],
1881 install_rpath : rootlibexecdir,
1882 install : true,
1883 install_dir : rootlibexecdir)
1884 endif
1885
1886 if conf.get('ENABLE_MACHINED') == 1
1887 executable('systemd-machined',
1888 systemd_machined_sources,
1889 include_directories : includes,
1890 link_with : [libmachine_core,
1891 libshared],
1892 install_rpath : rootlibexecdir,
1893 install : true,
1894 install_dir : rootlibexecdir)
1895
1896 exe = executable('machinectl',
1897 'src/machine/machinectl.c',
1898 include_directories : includes,
1899 link_with : [libshared],
1900 dependencies : [threads,
1901 libxz,
1902 liblz4],
1903 install_rpath : rootlibexecdir,
1904 install : true,
1905 install_dir : rootbindir)
1906 public_programs += [exe]
1907 endif
1908
1909 if conf.get('ENABLE_IMPORTD') == 1
1910 executable('systemd-importd',
1911 systemd_importd_sources,
1912 include_directories : includes,
1913 link_with : [libshared],
1914 dependencies : [threads],
1915 install_rpath : rootlibexecdir,
1916 install : true,
1917 install_dir : rootlibexecdir)
1918
1919 systemd_pull = executable('systemd-pull',
1920 systemd_pull_sources,
1921 include_directories : includes,
1922 link_with : [libshared],
1923 dependencies : [libcurl,
1924 libz,
1925 libbzip2,
1926 libxz,
1927 libgcrypt],
1928 install_rpath : rootlibexecdir,
1929 install : true,
1930 install_dir : rootlibexecdir)
1931
1932 systemd_import = executable('systemd-import',
1933 systemd_import_sources,
1934 include_directories : includes,
1935 link_with : [libshared],
1936 dependencies : [libcurl,
1937 libz,
1938 libbzip2,
1939 libxz],
1940 install_rpath : rootlibexecdir,
1941 install : true,
1942 install_dir : rootlibexecdir)
1943
1944 systemd_export = executable('systemd-export',
1945 systemd_export_sources,
1946 include_directories : includes,
1947 link_with : [libshared],
1948 dependencies : [libcurl,
1949 libz,
1950 libbzip2,
1951 libxz],
1952 install_rpath : rootlibexecdir,
1953 install : true,
1954 install_dir : rootlibexecdir)
1955 public_programs += [systemd_pull, systemd_import, systemd_export]
1956 endif
1957
1958 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1959 exe = executable('systemd-journal-upload',
1960 systemd_journal_upload_sources,
1961 include_directories : includes,
1962 link_with : [libshared],
1963 dependencies : [threads,
1964 libcurl,
1965 libgnutls,
1966 libxz,
1967 liblz4],
1968 install_rpath : rootlibexecdir,
1969 install : true,
1970 install_dir : rootlibexecdir)
1971 public_programs += [exe]
1972 endif
1973
1974 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1975 s_j_remote = executable('systemd-journal-remote',
1976 systemd_journal_remote_sources,
1977 include_directories : includes,
1978 link_with : [libshared],
1979 dependencies : [threads,
1980 libmicrohttpd,
1981 libgnutls,
1982 libxz,
1983 liblz4],
1984 install_rpath : rootlibexecdir,
1985 install : true,
1986 install_dir : rootlibexecdir)
1987
1988 s_j_gatewayd = executable('systemd-journal-gatewayd',
1989 systemd_journal_gatewayd_sources,
1990 include_directories : includes,
1991 link_with : [libshared],
1992 dependencies : [threads,
1993 libmicrohttpd,
1994 libgnutls,
1995 libxz,
1996 liblz4],
1997 install_rpath : rootlibexecdir,
1998 install : true,
1999 install_dir : rootlibexecdir)
2000 public_programs += [s_j_remote, s_j_gatewayd]
2001 endif
2002
2003 if conf.get('ENABLE_COREDUMP') == 1
2004 executable('systemd-coredump',
2005 systemd_coredump_sources,
2006 include_directories : includes,
2007 link_with : [libshared],
2008 dependencies : [threads,
2009 libacl,
2010 libdw,
2011 libxz,
2012 liblz4],
2013 install_rpath : rootlibexecdir,
2014 install : true,
2015 install_dir : rootlibexecdir)
2016
2017 exe = executable('coredumpctl',
2018 coredumpctl_sources,
2019 include_directories : includes,
2020 link_with : [libshared],
2021 dependencies : [threads,
2022 libxz,
2023 liblz4],
2024 install_rpath : rootlibexecdir,
2025 install : true)
2026 public_programs += [exe]
2027 endif
2028
2029 if conf.get('ENABLE_BINFMT') == 1
2030 exe = executable('systemd-binfmt',
2031 'src/binfmt/binfmt.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 install_rpath : rootlibexecdir,
2035 install : true,
2036 install_dir : rootlibexecdir)
2037 public_programs += [exe]
2038
2039 meson.add_install_script('sh', '-c',
2040 mkdir_p.format(binfmtdir))
2041 meson.add_install_script('sh', '-c',
2042 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2043 endif
2044
2045 if conf.get('ENABLE_VCONSOLE') == 1
2046 executable('systemd-vconsole-setup',
2047 'src/vconsole/vconsole-setup.c',
2048 include_directories : includes,
2049 link_with : [libshared],
2050 install_rpath : rootlibexecdir,
2051 install : true,
2052 install_dir : rootlibexecdir)
2053 endif
2054
2055 if conf.get('ENABLE_RANDOMSEED') == 1
2056 executable('systemd-random-seed',
2057 'src/random-seed/random-seed.c',
2058 include_directories : includes,
2059 link_with : [libshared],
2060 install_rpath : rootlibexecdir,
2061 install : true,
2062 install_dir : rootlibexecdir)
2063 endif
2064
2065 if conf.get('ENABLE_FIRSTBOOT') == 1
2066 executable('systemd-firstboot',
2067 'src/firstboot/firstboot.c',
2068 include_directories : includes,
2069 link_with : [libshared],
2070 dependencies : [libcrypt],
2071 install_rpath : rootlibexecdir,
2072 install : true,
2073 install_dir : rootbindir)
2074 endif
2075
2076 executable('systemd-remount-fs',
2077 'src/remount-fs/remount-fs.c',
2078 'src/core/mount-setup.c',
2079 'src/core/mount-setup.h',
2080 include_directories : includes,
2081 link_with : [libshared],
2082 install_rpath : rootlibexecdir,
2083 install : true,
2084 install_dir : rootlibexecdir)
2085
2086 executable('systemd-machine-id-setup',
2087 'src/machine-id-setup/machine-id-setup-main.c',
2088 'src/core/machine-id-setup.c',
2089 'src/core/machine-id-setup.h',
2090 include_directories : includes,
2091 link_with : [libshared],
2092 install_rpath : rootlibexecdir,
2093 install : true,
2094 install_dir : rootbindir)
2095
2096 executable('systemd-fsck',
2097 'src/fsck/fsck.c',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2101 install : true,
2102 install_dir : rootlibexecdir)
2103
2104 executable('systemd-growfs',
2105 'src/partition/growfs.c',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 dependencies : [libcryptsetup],
2109 install_rpath : rootlibexecdir,
2110 install : true,
2111 install_dir : rootlibexecdir)
2112
2113 executable('systemd-makefs',
2114 'src/partition/makefs.c',
2115 include_directories : includes,
2116 link_with : [libshared],
2117 install_rpath : rootlibexecdir,
2118 install : true,
2119 install_dir : rootlibexecdir)
2120
2121 executable('systemd-sleep',
2122 'src/sleep/sleep.c',
2123 include_directories : includes,
2124 link_with : [libshared],
2125 install_rpath : rootlibexecdir,
2126 install : true,
2127 install_dir : rootlibexecdir)
2128
2129 exe = executable('systemd-sysctl',
2130 'src/sysctl/sysctl.c',
2131 include_directories : includes,
2132 link_with : [libshared],
2133 install_rpath : rootlibexecdir,
2134 install : true,
2135 install_dir : rootlibexecdir)
2136 public_programs += [exe]
2137
2138 executable('systemd-ac-power',
2139 'src/ac-power/ac-power.c',
2140 include_directories : includes,
2141 link_with : [libshared],
2142 install_rpath : rootlibexecdir,
2143 install : true,
2144 install_dir : rootlibexecdir)
2145
2146 exe = executable('systemd-detect-virt',
2147 'src/detect-virt/detect-virt.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2151 install : true)
2152 public_programs += [exe]
2153
2154 exe = executable('systemd-delta',
2155 'src/delta/delta.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2159 install : true)
2160 public_programs += [exe]
2161
2162 exe = executable('systemd-escape',
2163 'src/escape/escape.c',
2164 include_directories : includes,
2165 link_with : [libshared],
2166 install_rpath : rootlibexecdir,
2167 install : true,
2168 install_dir : rootbindir)
2169 public_programs += [exe]
2170
2171 exe = executable('systemd-notify',
2172 'src/notify/notify.c',
2173 include_directories : includes,
2174 link_with : [libshared],
2175 install_rpath : rootlibexecdir,
2176 install : true,
2177 install_dir : rootbindir)
2178 public_programs += [exe]
2179
2180 executable('systemd-volatile-root',
2181 'src/volatile-root/volatile-root.c',
2182 include_directories : includes,
2183 link_with : [libshared],
2184 install_rpath : rootlibexecdir,
2185 install : true,
2186 install_dir : rootlibexecdir)
2187
2188 executable('systemd-cgroups-agent',
2189 'src/cgroups-agent/cgroups-agent.c',
2190 include_directories : includes,
2191 link_with : [libshared],
2192 install_rpath : rootlibexecdir,
2193 install : true,
2194 install_dir : rootlibexecdir)
2195
2196 exe = executable('systemd-path',
2197 'src/path/path.c',
2198 include_directories : includes,
2199 link_with : [libshared],
2200 install_rpath : rootlibexecdir,
2201 install : true)
2202 public_programs += [exe]
2203
2204 exe = executable('systemd-ask-password',
2205 'src/ask-password/ask-password.c',
2206 include_directories : includes,
2207 link_with : [libshared],
2208 install_rpath : rootlibexecdir,
2209 install : true,
2210 install_dir : rootbindir)
2211 public_programs += [exe]
2212
2213 executable('systemd-reply-password',
2214 'src/reply-password/reply-password.c',
2215 include_directories : includes,
2216 link_with : [libshared],
2217 install_rpath : rootlibexecdir,
2218 install : true,
2219 install_dir : rootlibexecdir)
2220
2221 exe = executable('systemd-tty-ask-password-agent',
2222 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2223 include_directories : includes,
2224 link_with : [libshared],
2225 install_rpath : rootlibexecdir,
2226 install : true,
2227 install_dir : rootbindir)
2228 public_programs += [exe]
2229
2230 exe = executable('systemd-cgls',
2231 'src/cgls/cgls.c',
2232 include_directories : includes,
2233 link_with : [libshared],
2234 install_rpath : rootlibexecdir,
2235 install : true)
2236 public_programs += [exe]
2237
2238 exe = executable('systemd-cgtop',
2239 'src/cgtop/cgtop.c',
2240 include_directories : includes,
2241 link_with : [libshared],
2242 install_rpath : rootlibexecdir,
2243 install : true)
2244 public_programs += [exe]
2245
2246 executable('systemd-initctl',
2247 'src/initctl/initctl.c',
2248 include_directories : includes,
2249 link_with : [libshared],
2250 install_rpath : rootlibexecdir,
2251 install : true,
2252 install_dir : rootlibexecdir)
2253
2254 exe = executable('systemd-mount',
2255 'src/mount/mount-tool.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 install_rpath : rootlibexecdir,
2259 install : true)
2260 public_programs += [exe]
2261
2262 meson.add_install_script(meson_make_symlink,
2263 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2264
2265 exe = executable('systemd-run',
2266 'src/run/run.c',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2270 install : true)
2271 public_programs += [exe]
2272
2273 exe = executable('systemd-stdio-bridge',
2274 'src/stdio-bridge/stdio-bridge.c',
2275 include_directories : includes,
2276 link_with : [libshared],
2277 install_rpath : rootlibexecdir,
2278 install : true)
2279 public_programs += [exe]
2280
2281 exe = executable('busctl',
2282 'src/busctl/busctl.c',
2283 'src/busctl/busctl-introspect.c',
2284 'src/busctl/busctl-introspect.h',
2285 include_directories : includes,
2286 link_with : [libshared],
2287 install_rpath : rootlibexecdir,
2288 install : true)
2289 public_programs += [exe]
2290
2291 if conf.get('ENABLE_SYSUSERS') == 1
2292 exe = executable('systemd-sysusers',
2293 'src/sysusers/sysusers.c',
2294 include_directories : includes,
2295 link_with : [libshared],
2296 install_rpath : rootlibexecdir,
2297 install : true,
2298 install_dir : rootbindir)
2299 public_programs += [exe]
2300 endif
2301
2302 if conf.get('ENABLE_TMPFILES') == 1
2303 exe = executable('systemd-tmpfiles',
2304 'src/tmpfiles/tmpfiles.c',
2305 include_directories : includes,
2306 link_with : [libshared],
2307 dependencies : [libacl],
2308 install_rpath : rootlibexecdir,
2309 install : true,
2310 install_dir : rootbindir)
2311 public_programs += [exe]
2312
2313 test('test-systemd-tmpfiles',
2314 test_systemd_tmpfiles_py,
2315 args : exe.full_path())
2316 # https://github.com/mesonbuild/meson/issues/2681
2317 endif
2318
2319 if conf.get('ENABLE_HWDB') == 1
2320 exe = executable('systemd-hwdb',
2321 'src/hwdb/hwdb.c',
2322 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2323 include_directories : includes,
2324 link_with : [libudev_static],
2325 install_rpath : udev_rpath,
2326 install : true,
2327 install_dir : rootbindir)
2328 public_programs += [exe]
2329 endif
2330
2331 if conf.get('ENABLE_QUOTACHECK') == 1
2332 executable('systemd-quotacheck',
2333 'src/quotacheck/quotacheck.c',
2334 include_directories : includes,
2335 link_with : [libshared],
2336 install_rpath : rootlibexecdir,
2337 install : true,
2338 install_dir : rootlibexecdir)
2339 endif
2340
2341 exe = executable('systemd-socket-proxyd',
2342 'src/socket-proxy/socket-proxyd.c',
2343 include_directories : includes,
2344 link_with : [libshared],
2345 dependencies : [threads],
2346 install_rpath : rootlibexecdir,
2347 install : true,
2348 install_dir : rootlibexecdir)
2349 public_programs += [exe]
2350
2351 exe = executable('systemd-udevd',
2352 systemd_udevd_sources,
2353 include_directories : includes,
2354 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2355 link_with : [libudev_core,
2356 libsystemd_network,
2357 libudev_static],
2358 dependencies : [threads,
2359 libkmod,
2360 libidn,
2361 libacl,
2362 libblkid],
2363 install_rpath : udev_rpath,
2364 install : true,
2365 install_dir : rootlibexecdir)
2366 public_programs += [exe]
2367
2368 exe = executable('udevadm',
2369 udevadm_sources,
2370 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2371 include_directories : includes,
2372 link_with : [libudev_core,
2373 libsystemd_network,
2374 libudev_static],
2375 dependencies : [threads,
2376 libkmod,
2377 libidn,
2378 libacl,
2379 libblkid],
2380 install_rpath : udev_rpath,
2381 install : true,
2382 install_dir : rootbindir)
2383 public_programs += [exe]
2384
2385 executable('systemd-shutdown',
2386 systemd_shutdown_sources,
2387 include_directories : includes,
2388 link_with : [libshared],
2389 dependencies : [libmount],
2390 install_rpath : rootlibexecdir,
2391 install : true,
2392 install_dir : rootlibexecdir)
2393
2394 executable('systemd-update-done',
2395 'src/update-done/update-done.c',
2396 include_directories : includes,
2397 link_with : [libshared],
2398 install_rpath : rootlibexecdir,
2399 install : true,
2400 install_dir : rootlibexecdir)
2401
2402 executable('systemd-update-utmp',
2403 'src/update-utmp/update-utmp.c',
2404 include_directories : includes,
2405 link_with : [libshared],
2406 dependencies : [libaudit],
2407 install_rpath : rootlibexecdir,
2408 install : true,
2409 install_dir : rootlibexecdir)
2410
2411 if conf.get('HAVE_KMOD') == 1
2412 executable('systemd-modules-load',
2413 'src/modules-load/modules-load.c',
2414 include_directories : includes,
2415 link_with : [libshared],
2416 dependencies : [libkmod],
2417 install_rpath : rootlibexecdir,
2418 install : true,
2419 install_dir : rootlibexecdir)
2420
2421 meson.add_install_script('sh', '-c',
2422 mkdir_p.format(modulesloaddir))
2423 meson.add_install_script('sh', '-c',
2424 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2425 endif
2426
2427 exe = executable('systemd-nspawn',
2428 systemd_nspawn_sources,
2429 'src/core/mount-setup.c', # FIXME: use a variable?
2430 'src/core/mount-setup.h',
2431 'src/core/loopback-setup.c',
2432 'src/core/loopback-setup.h',
2433 include_directories : [includes, include_directories('src/nspawn')],
2434 link_with : [libshared],
2435 dependencies : [libacl,
2436 libblkid,
2437 libseccomp,
2438 libselinux],
2439 install_rpath : rootlibexecdir,
2440 install : true)
2441 public_programs += [exe]
2442
2443 if conf.get('ENABLE_NETWORKD') == 1
2444 executable('systemd-networkd',
2445 systemd_networkd_sources,
2446 include_directories : includes,
2447 link_with : [libnetworkd_core,
2448 libsystemd_network,
2449 libudev_static,
2450 libshared],
2451 dependencies : [threads],
2452 install_rpath : rootlibexecdir,
2453 install : true,
2454 install_dir : rootlibexecdir)
2455
2456 executable('systemd-networkd-wait-online',
2457 systemd_networkd_wait_online_sources,
2458 include_directories : includes,
2459 link_with : [libnetworkd_core,
2460 libshared],
2461 install_rpath : rootlibexecdir,
2462 install : true,
2463 install_dir : rootlibexecdir)
2464
2465 exe = executable('networkctl',
2466 networkctl_sources,
2467 include_directories : includes,
2468 link_with : [libsystemd_network,
2469 libshared],
2470 install_rpath : rootlibexecdir,
2471 install : true,
2472 install_dir : rootbindir)
2473 public_programs += [exe]
2474 endif
2475
2476 executable('systemd-sulogin-shell',
2477 ['src/sulogin-shell/sulogin-shell.c'],
2478 include_directories : includes,
2479 link_with : [libshared],
2480 install_rpath : rootlibexecdir,
2481 install : true,
2482 install_dir : rootlibexecdir)
2483
2484 ############################################################
2485
2486 foreach tuple : tests
2487 sources = tuple[0]
2488 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2489 dependencies = tuple[2]
2490 condition = tuple.length() >= 4 ? tuple[3] : ''
2491 type = tuple.length() >= 5 ? tuple[4] : ''
2492 defs = tuple.length() >= 6 ? tuple[5] : []
2493 incs = tuple.length() >= 7 ? tuple[6] : includes
2494 timeout = 30
2495
2496 name = sources[0].split('/')[-1].split('.')[0]
2497 if type.startswith('timeout=')
2498 timeout = type.split('=')[1].to_int()
2499 type = ''
2500 endif
2501 if want_tests == 'false'
2502 message('Not compiling @0@ because tests is set to false'.format(name))
2503 elif condition == '' or conf.get(condition) == 1
2504 exe = executable(
2505 name,
2506 sources,
2507 include_directories : incs,
2508 link_with : link_with,
2509 dependencies : dependencies,
2510 c_args : defs,
2511 install_rpath : rootlibexecdir,
2512 install : install_tests,
2513 install_dir : join_paths(testsdir, type))
2514
2515 if type == 'manual'
2516 message('@0@ is a manual test'.format(name))
2517 elif type == 'unsafe' and want_tests != 'unsafe'
2518 message('@0@ is an unsafe test'.format(name))
2519 else
2520 test(name, exe,
2521 env : test_env,
2522 timeout : timeout)
2523 endif
2524 else
2525 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2526 endif
2527 endforeach
2528
2529 test_libsystemd_sym = executable(
2530 'test-libsystemd-sym',
2531 test_libsystemd_sym_c,
2532 include_directories : includes,
2533 link_with : [libsystemd],
2534 install : install_tests,
2535 install_dir : testsdir)
2536 test('test-libsystemd-sym',
2537 test_libsystemd_sym)
2538
2539 test_libudev_sym = executable(
2540 'test-libudev-sym',
2541 test_libudev_sym_c,
2542 include_directories : includes,
2543 c_args : ['-Wno-deprecated-declarations'],
2544 link_with : [libudev],
2545 install : install_tests,
2546 install_dir : testsdir)
2547 test('test-libudev-sym',
2548 test_libudev_sym)
2549
2550 ############################################################
2551
2552 fuzzer_exes = []
2553
2554 foreach tuple : fuzzers
2555 sources = tuple[0]
2556 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2557 dependencies = tuple[2]
2558 defs = tuple.length() >= 4 ? tuple[3] : []
2559 incs = tuple.length() >= 5 ? tuple[4] : includes
2560
2561 if fuzzer_build
2562 dependencies += fuzzing_engine
2563 else
2564 sources += 'src/fuzz/fuzz-main.c'
2565 endif
2566
2567 name = sources[0].split('/')[-1].split('.')[0]
2568
2569 fuzzer_exes += executable(
2570 name,
2571 sources,
2572 include_directories : [incs, include_directories('src/fuzz')],
2573 link_with : link_with,
2574 dependencies : dependencies,
2575 c_args : defs,
2576 install : false)
2577 endforeach
2578
2579 run_target('fuzzers',
2580 depends : fuzzer_exes,
2581 command : ['true'])
2582
2583 ############################################################
2584
2585 make_directive_index_py = find_program('tools/make-directive-index.py')
2586 make_man_index_py = find_program('tools/make-man-index.py')
2587 xml_helper_py = find_program('tools/xml_helper.py')
2588 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2589
2590 subdir('units')
2591 subdir('sysctl.d')
2592 subdir('sysusers.d')
2593 subdir('tmpfiles.d')
2594 subdir('presets')
2595 subdir('hwdb')
2596 subdir('network')
2597 subdir('man')
2598 subdir('shell-completion/bash')
2599 subdir('shell-completion/zsh')
2600 subdir('doc/sysvinit')
2601 subdir('doc/var-log')
2602
2603 # FIXME: figure out if the warning is true:
2604 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2605 install_subdir('factory/etc',
2606 install_dir : factorydir)
2607
2608
2609 install_data('xorg/50-systemd-user.sh',
2610 install_dir : xinitrcdir)
2611 install_data('modprobe.d/systemd.conf',
2612 install_dir : modprobedir)
2613 install_data('LICENSE.GPL2',
2614 'LICENSE.LGPL2.1',
2615 'NEWS',
2616 'README',
2617 'doc/CODING_STYLE',
2618 'doc/DISTRO_PORTING',
2619 'doc/ENVIRONMENT.md',
2620 'doc/HACKING',
2621 'doc/TRANSIENT-SETTINGS.md',
2622 'doc/TRANSLATORS',
2623 'doc/UIDS-GIDS.md',
2624 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2625 install_dir : docdir)
2626
2627 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2628 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2629
2630 ############################################################
2631
2632 meson_check_help = find_program('tools/meson-check-help.sh')
2633
2634 foreach exec : public_programs
2635 name = exec.full_path().split('/')[-1]
2636 test('check-help-' + name,
2637 meson_check_help,
2638 args : [exec.full_path()])
2639 endforeach
2640
2641 ############################################################
2642
2643 # Enable tests for all supported sanitizers
2644 foreach tuple : sanitizers
2645 sanitizer = tuple[0]
2646 build = tuple[1]
2647
2648 have = run_command(check_compilation_sh,
2649 cc.cmd_array(), '-x', 'c',
2650 '-fsanitize=@0@'.format(sanitizer),
2651 '-include', link_test_c).returncode() == 0
2652 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2653
2654 if have
2655 prev = ''
2656 foreach p : fuzz_regression_tests
2657 b = p.split('/')[-2]
2658 c = p.split('/')[-1]
2659
2660 name = '@0@:@1@'.format(b, sanitizer)
2661
2662 if name != prev
2663 if want_tests == 'false'
2664 message('Not compiling @0@ because tests is set to false'.format(name))
2665 elif slow_tests
2666 exe = custom_target(
2667 name,
2668 output : name,
2669 depends : build,
2670 command : [env, 'ln', '-fs',
2671 join_paths(build.full_path(), b),
2672 '@OUTPUT@'],
2673 build_by_default : true)
2674 else
2675 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2676 endif
2677 endif
2678 prev = name
2679
2680 if want_tests != 'false' and slow_tests
2681 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2682 env,
2683 args : [exe.full_path(),
2684 join_paths(meson.source_root(),
2685 'test/fuzz-regressions',
2686 p)])
2687 endif
2688 endforeach
2689 endif
2690 endforeach
2691
2692
2693 ############################################################
2694
2695 if git.found()
2696 all_files = run_command(
2697 git,
2698 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2699 'ls-files',
2700 ':/*.[ch]'])
2701 all_files = files(all_files.stdout().split())
2702
2703 custom_target(
2704 'tags',
2705 output : 'tags',
2706 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2707 custom_target(
2708 'ctags',
2709 output : 'ctags',
2710 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2711 endif
2712
2713 if git.found()
2714 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2715 run_target(
2716 'git-contrib',
2717 command : [meson_git_contrib_sh])
2718 endif
2719
2720 if git.found()
2721 git_head = run_command(
2722 git,
2723 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2724 'rev-parse', 'HEAD']).stdout().strip()
2725 git_head_short = run_command(
2726 git,
2727 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2728 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2729
2730 run_target(
2731 'git-snapshot',
2732 command : ['git', 'archive',
2733 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2734 git_head_short),
2735 '--prefix', 'systemd-@0@/'.format(git_head),
2736 'HEAD'])
2737 endif
2738
2739 ############################################################
2740
2741 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2742 run_target(
2743 'check-api-docs',
2744 depends : [man, libsystemd, libudev],
2745 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2746
2747 ############################################################
2748
2749 status = [
2750 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2751
2752 'split /usr: @0@'.format(split_usr),
2753 'split bin-sbin: @0@'.format(split_bin),
2754 'prefix directory: @0@'.format(prefixdir),
2755 'rootprefix directory: @0@'.format(rootprefixdir),
2756 'sysconf directory: @0@'.format(sysconfdir),
2757 'include directory: @0@'.format(includedir),
2758 'lib directory: @0@'.format(libdir),
2759 'rootlib directory: @0@'.format(rootlibdir),
2760 'SysV init scripts: @0@'.format(sysvinit_path),
2761 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2762 'PAM modules directory: @0@'.format(pamlibdir),
2763 'PAM configuration directory: @0@'.format(pamconfdir),
2764 'RPM macros directory: @0@'.format(rpmmacrosdir),
2765 'modprobe.d directory: @0@'.format(modprobedir),
2766 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2767 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2768 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2769 'bash completions directory: @0@'.format(bashcompletiondir),
2770 'zsh completions directory: @0@'.format(zshcompletiondir),
2771 'extra start script: @0@'.format(get_option('rc-local')),
2772 'extra stop script: @0@'.format(get_option('halt-local')),
2773 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2774 get_option('debug-tty')),
2775 'TTY GID: @0@'.format(tty_gid),
2776 'users GID: @0@'.format(users_gid),
2777 'maximum system UID: @0@'.format(system_uid_max),
2778 'maximum system GID: @0@'.format(system_gid_max),
2779 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2780 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2781 'minimum container UID base: @0@'.format(container_uid_base_min),
2782 'maximum container UID base: @0@'.format(container_uid_base_max),
2783 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2784 'render group access mode: @0@'.format(get_option('group-render-mode')),
2785 'certificate root directory: @0@'.format(get_option('certificate-root')),
2786 'support URL: @0@'.format(support_url),
2787 'nobody user name: @0@'.format(nobody_user),
2788 'nobody group name: @0@'.format(nobody_group),
2789 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2790 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2791
2792 'default DNSSEC mode: @0@'.format(default_dnssec),
2793 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2794 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2795
2796 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2797 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2798 status += [
2799 'default DNS servers: @0@'.format(alt_dns_servers),
2800 'default NTP servers: @0@'.format(alt_ntp_servers)]
2801
2802 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2803 '@@0@'.format(time_epoch)).stdout().strip()
2804 status += [
2805 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2806
2807 # TODO:
2808 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2809 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2810 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2811
2812 if conf.get('ENABLE_EFI') == 1
2813 status += [
2814 'efi arch: @0@'.format(efi_arch)]
2815
2816 if have_gnu_efi
2817 status += [
2818 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2819 'EFI CC @0@'.format(efi_cc),
2820 'EFI lib directory: @0@'.format(efi_libdir),
2821 'EFI lds directory: @0@'.format(efi_ldsdir),
2822 'EFI include directory: @0@'.format(efi_incdir)]
2823 endif
2824 endif
2825
2826 found = []
2827 missing = []
2828
2829 foreach tuple : [
2830 ['libcryptsetup'],
2831 ['PAM'],
2832 ['AUDIT'],
2833 ['IMA'],
2834 ['AppArmor'],
2835 ['SELinux'],
2836 ['SECCOMP'],
2837 ['SMACK'],
2838 ['zlib'],
2839 ['xz'],
2840 ['lz4'],
2841 ['bzip2'],
2842 ['ACL'],
2843 ['gcrypt'],
2844 ['qrencode'],
2845 ['microhttpd'],
2846 ['gnutls'],
2847 ['libcurl'],
2848 ['idn'],
2849 ['libidn2'],
2850 ['libidn'],
2851 ['nss-systemd'],
2852 ['libiptc'],
2853 ['elfutils'],
2854 ['binfmt'],
2855 ['vconsole'],
2856 ['quotacheck'],
2857 ['tmpfiles'],
2858 ['environment.d'],
2859 ['sysusers'],
2860 ['firstboot'],
2861 ['randomseed'],
2862 ['backlight'],
2863 ['rfkill'],
2864 ['logind'],
2865 ['machined'],
2866 ['importd'],
2867 ['hostnamed'],
2868 ['timedated'],
2869 ['timesyncd'],
2870 ['localed'],
2871 ['networkd'],
2872 ['resolve'],
2873 ['coredump'],
2874 ['polkit'],
2875 ['legacy pkla', install_polkit_pkla],
2876 ['efi'],
2877 ['gnu-efi', have_gnu_efi],
2878 ['kmod'],
2879 ['xkbcommon'],
2880 ['pcre2'],
2881 ['blkid'],
2882 ['dbus'],
2883 ['glib'],
2884 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2885 ['hwdb'],
2886 ['tpm'],
2887 ['man pages', want_man],
2888 ['html pages', want_html],
2889 ['man page indices', want_man and have_lxml],
2890 ['SysV compat'],
2891 ['utmp'],
2892 ['ldconfig'],
2893 ['hibernate'],
2894 ['adm group', get_option('adm-group')],
2895 ['wheel group', get_option('wheel-group')],
2896 ['gshadow'],
2897 ['debug hashmap'],
2898 ['debug mmap cache'],
2899 ]
2900
2901 if tuple.length() >= 2
2902 cond = tuple[1]
2903 else
2904 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2905 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2906 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2907 endif
2908 if cond
2909 found += [tuple[0]]
2910 else
2911 missing += [tuple[0]]
2912 endif
2913 endforeach
2914
2915 status += [
2916 '',
2917 'enabled features: @0@'.format(', '.join(found)),
2918 '',
2919 'disabled features: @0@'.format(', '.join(missing)),
2920 '']
2921 message('\n '.join(status))
2922
2923 if rootprefixdir != rootprefix_default
2924 message('WARNING:\n' +
2925 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2926 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2927 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
2928 endif