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