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