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