]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
fstab-generator: port some code to strextend_with_separator()
[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 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
637 if get_option('users-gid') != ''
638 users_gid = get_option('users-gid').to_int()
639 else
640 users_gid = '-'
641 endif
642 substs.set('USERS_GID', users_gid)
643
644 if get_option('adm-group')
645 m4_defines += ['-DENABLE_ADM_GROUP']
646 endif
647
648 if get_option('wheel-group')
649 m4_defines += ['-DENABLE_WHEEL_GROUP']
650 endif
651
652 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
653 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
654
655 kill_user_processes = get_option('default-kill-user-processes')
656 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
657 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
658
659 dns_servers = get_option('dns-servers')
660 conf.set_quoted('DNS_SERVERS', dns_servers)
661 substs.set('DNS_SERVERS', dns_servers)
662
663 ntp_servers = get_option('ntp-servers')
664 conf.set_quoted('NTP_SERVERS', ntp_servers)
665 substs.set('NTP_SERVERS', ntp_servers)
666
667 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
668
669 substs.set('SUSHELL', get_option('debug-shell'))
670 substs.set('DEBUGTTY', get_option('debug-tty'))
671
672 debug = get_option('debug')
673 enable_debug_hashmap = false
674 enable_debug_mmap_cache = false
675 if debug != ''
676 foreach name : debug.split(',')
677 if name == 'hashmap'
678 enable_debug_hashmap = true
679 elif name == 'mmap-cache'
680 enable_debug_mmap_cache = true
681 else
682 message('unknown debug option "@0@", ignoring'.format(name))
683 endif
684 endforeach
685 endif
686 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
687 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
688
689 #####################################################################
690
691 threads = dependency('threads')
692 librt = cc.find_library('rt')
693 libm = cc.find_library('m')
694 libdl = cc.find_library('dl')
695 libcrypt = cc.find_library('crypt')
696
697 libcap = dependency('libcap', required : false)
698 if not libcap.found()
699 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
700 libcap = cc.find_library('cap')
701 endif
702
703 libmount = dependency('mount',
704 version : '>= 2.30')
705
706 want_seccomp = get_option('seccomp')
707 if want_seccomp != 'false'
708 libseccomp = dependency('libseccomp',
709 version : '>= 2.3.1',
710 required : want_seccomp == 'true')
711 have = libseccomp.found()
712 else
713 have = false
714 libseccomp = []
715 endif
716 conf.set10('HAVE_SECCOMP', have)
717 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
718
719 want_selinux = get_option('selinux')
720 if want_selinux != 'false'
721 libselinux = dependency('libselinux',
722 version : '>= 2.1.9',
723 required : want_selinux == 'true')
724 have = libselinux.found()
725 else
726 have = false
727 libselinux = []
728 endif
729 conf.set10('HAVE_SELINUX', have)
730 m4_defines += have ? ['-DHAVE_SELINUX'] : []
731
732 want_apparmor = get_option('apparmor')
733 if want_apparmor != 'false'
734 libapparmor = dependency('libapparmor',
735 required : want_apparmor == 'true')
736 have = libapparmor.found()
737 else
738 have = false
739 libapparmor = []
740 endif
741 conf.set10('HAVE_APPARMOR', have)
742 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
743
744 smack_run_label = get_option('smack-run-label')
745 if smack_run_label != ''
746 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
747 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
748 endif
749
750 want_polkit = get_option('polkit')
751 install_polkit = false
752 install_polkit_pkla = false
753 if want_polkit != 'false'
754 install_polkit = true
755
756 libpolkit = dependency('polkit-gobject-1',
757 required : false)
758 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
759 message('Old polkit detected, will install pkla files')
760 install_polkit_pkla = true
761 endif
762 endif
763 conf.set10('ENABLE_POLKIT', install_polkit)
764
765 want_acl = get_option('acl')
766 if want_acl != 'false'
767 libacl = cc.find_library('acl', required : want_acl == 'true')
768 have = libacl.found()
769 else
770 have = false
771 libacl = []
772 endif
773 conf.set10('HAVE_ACL', have)
774 m4_defines += have ? ['-DHAVE_ACL'] : []
775
776 want_audit = get_option('audit')
777 if want_audit != 'false'
778 libaudit = dependency('audit', required : want_audit == 'true')
779 have = libaudit.found()
780 else
781 have = false
782 libaudit = []
783 endif
784 conf.set10('HAVE_AUDIT', have)
785
786 want_blkid = get_option('blkid')
787 if want_blkid != 'false'
788 libblkid = dependency('blkid', required : want_blkid == 'true')
789 have = libblkid.found()
790 else
791 have = false
792 libblkid = []
793 endif
794 conf.set10('HAVE_BLKID', have)
795
796 want_kmod = get_option('kmod')
797 if want_kmod != 'false'
798 libkmod = dependency('libkmod',
799 version : '>= 15',
800 required : want_kmod == 'true')
801 have = libkmod.found()
802 else
803 have = false
804 libkmod = []
805 endif
806 conf.set10('HAVE_KMOD', have)
807
808 want_pam = get_option('pam')
809 if want_pam != 'false'
810 libpam = cc.find_library('pam', required : want_pam == 'true')
811 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
812 have = libpam.found() and libpam_misc.found()
813 else
814 have = false
815 libpam = []
816 libpam_misc = []
817 endif
818 conf.set10('HAVE_PAM', have)
819 m4_defines += have ? ['-DHAVE_PAM'] : []
820
821 want_microhttpd = get_option('microhttpd')
822 if want_microhttpd != 'false'
823 libmicrohttpd = dependency('libmicrohttpd',
824 version : '>= 0.9.33',
825 required : want_microhttpd == 'true')
826 have = libmicrohttpd.found()
827 else
828 have = false
829 libmicrohttpd = []
830 endif
831 conf.set10('HAVE_MICROHTTPD', have)
832 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
833
834 want_libcryptsetup = get_option('libcryptsetup')
835 if want_libcryptsetup != 'false'
836 libcryptsetup = dependency('libcryptsetup',
837 version : '>= 1.6.0',
838 required : want_libcryptsetup == 'true')
839 have = libcryptsetup.found()
840 else
841 have = false
842 libcryptsetup = []
843 endif
844 conf.set10('HAVE_LIBCRYPTSETUP', have)
845
846 want_libcurl = get_option('libcurl')
847 if want_libcurl != 'false'
848 libcurl = dependency('libcurl',
849 version : '>= 7.32.0',
850 required : want_libcurl == 'true')
851 have = libcurl.found()
852 else
853 have = false
854 libcurl = []
855 endif
856 conf.set10('HAVE_LIBCURL', have)
857 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
858
859 want_libidn = get_option('libidn')
860 want_libidn2 = get_option('libidn2')
861 if want_libidn == 'true' and want_libidn2 == 'true'
862 error('libidn and libidn2 cannot be requested simultaneously')
863 endif
864
865 if want_libidn != 'false' and want_libidn2 != 'true'
866 libidn = dependency('libidn',
867 required : want_libidn == 'true')
868 have = libidn.found()
869 else
870 have = false
871 libidn = []
872 endif
873 conf.set10('HAVE_LIBIDN', have)
874 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
875 if not have and want_libidn2 != 'false'
876 # libidn is used for both libidn and libidn2 objects
877 libidn = dependency('libidn2',
878 required : want_libidn2 == 'true')
879 have = libidn.found()
880 else
881 have = false
882 endif
883 conf.set10('HAVE_LIBIDN2', have)
884 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
885
886 want_libiptc = get_option('libiptc')
887 if want_libiptc != 'false'
888 libiptc = dependency('libiptc',
889 required : want_libiptc == 'true')
890 have = libiptc.found()
891 else
892 have = false
893 libiptc = []
894 endif
895 conf.set10('HAVE_LIBIPTC', have)
896 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
897
898 want_qrencode = get_option('qrencode')
899 if want_qrencode != 'false'
900 libqrencode = dependency('libqrencode',
901 required : want_qrencode == 'true')
902 have = libqrencode.found()
903 else
904 have = false
905 libqrencode = []
906 endif
907 conf.set10('HAVE_QRENCODE', have)
908
909 want_gcrypt = get_option('gcrypt')
910 if want_gcrypt != 'false'
911 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
912 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
913 have = libgcrypt.found() and libgpg_error.found()
914 else
915 have = false
916 endif
917 if not have
918 # link to neither of the libs if one is not found
919 libgcrypt = []
920 libgpg_error = []
921 endif
922 conf.set10('HAVE_GCRYPT', have)
923
924 want_gnutls = get_option('gnutls')
925 if want_gnutls != 'false'
926 libgnutls = dependency('gnutls',
927 version : '>= 3.1.4',
928 required : want_gnutls == 'true')
929 have = libgnutls.found()
930 else
931 have = false
932 libgnutls = []
933 endif
934 conf.set10('HAVE_GNUTLS', have)
935
936 want_elfutils = get_option('elfutils')
937 if want_elfutils != 'false'
938 libdw = dependency('libdw',
939 required : want_elfutils == 'true')
940 have = libdw.found()
941 else
942 have = false
943 libdw = []
944 endif
945 conf.set10('HAVE_ELFUTILS', have)
946
947 want_zlib = get_option('zlib')
948 if want_zlib != 'false'
949 libz = dependency('zlib',
950 required : want_zlib == 'true')
951 have = libz.found()
952 else
953 have = false
954 libz = []
955 endif
956 conf.set10('HAVE_ZLIB', have)
957
958 want_bzip2 = get_option('bzip2')
959 if want_bzip2 != 'false'
960 libbzip2 = cc.find_library('bz2',
961 required : want_bzip2 == 'true')
962 have = libbzip2.found()
963 else
964 have = false
965 libbzip2 = []
966 endif
967 conf.set10('HAVE_BZIP2', have)
968
969 want_xz = get_option('xz')
970 if want_xz != 'false'
971 libxz = dependency('liblzma',
972 required : want_xz == 'true')
973 have = libxz.found()
974 else
975 have = false
976 libxz = []
977 endif
978 conf.set10('HAVE_XZ', have)
979
980 want_lz4 = get_option('lz4')
981 if want_lz4 != 'false'
982 liblz4 = dependency('liblz4',
983 required : want_lz4 == 'true')
984 have = liblz4.found()
985 else
986 have = false
987 liblz4 = []
988 endif
989 conf.set10('HAVE_LZ4', have)
990
991 want_xkbcommon = get_option('xkbcommon')
992 if want_xkbcommon != 'false'
993 libxkbcommon = dependency('xkbcommon',
994 version : '>= 0.3.0',
995 required : want_xkbcommon == 'true')
996 have = libxkbcommon.found()
997 else
998 have = false
999 libxkbcommon = []
1000 endif
1001 conf.set10('HAVE_XKBCOMMON', have)
1002
1003 want_glib = get_option('glib')
1004 if want_glib != 'false'
1005 libglib = dependency('glib-2.0',
1006 version : '>= 2.22.0',
1007 required : want_glib == 'true')
1008 libgobject = dependency('gobject-2.0',
1009 version : '>= 2.22.0',
1010 required : want_glib == 'true')
1011 libgio = dependency('gio-2.0',
1012 required : want_glib == 'true')
1013 have = libglib.found() and libgobject.found() and libgio.found()
1014 else
1015 have = false
1016 libglib = []
1017 libgobject = []
1018 libgio = []
1019 endif
1020 conf.set10('HAVE_GLIB', have)
1021
1022 want_dbus = get_option('dbus')
1023 if want_dbus != 'false'
1024 libdbus = dependency('dbus-1',
1025 version : '>= 1.3.2',
1026 required : want_dbus == 'true')
1027 have = libdbus.found()
1028 else
1029 have = false
1030 libdbus = []
1031 endif
1032 conf.set10('HAVE_DBUS', have)
1033
1034 default_dnssec = get_option('default-dnssec')
1035 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1036 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1037 default_dnssec = 'no'
1038 endif
1039 conf.set('DEFAULT_DNSSEC_MODE',
1040 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1041 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1042
1043 want_importd = get_option('importd')
1044 if want_importd != 'false'
1045 have = (conf.get('HAVE_LIBCURL') == 1 and
1046 conf.get('HAVE_ZLIB') == 1 and
1047 conf.get('HAVE_BZIP2') == 1 and
1048 conf.get('HAVE_XZ') == 1 and
1049 conf.get('HAVE_GCRYPT') == 1)
1050 if want_importd == 'true' and not have
1051 error('importd support was requested, but dependencies are not available')
1052 endif
1053 else
1054 have = false
1055 endif
1056 conf.set10('ENABLE_IMPORTD', have)
1057
1058 want_remote = get_option('remote')
1059 if want_remote != 'false'
1060 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1061 conf.get('HAVE_LIBCURL') == 1]
1062 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1063 # it's possible to build one without the other. Complain only if
1064 # support was explictly requested. The auxiliary files like sysusers
1065 # config should be installed when any of the programs are built.
1066 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1067 error('remote support was requested, but dependencies are not available')
1068 endif
1069 have = have_deps[0] or have_deps[1]
1070 else
1071 have = false
1072 endif
1073 conf.set10('ENABLE_REMOTE', have)
1074
1075 foreach term : ['utmp',
1076 'hibernate',
1077 'environment-d',
1078 'binfmt',
1079 'coredump',
1080 'resolve',
1081 'logind',
1082 'hostnamed',
1083 'localed',
1084 'machined',
1085 'networkd',
1086 'timedated',
1087 'timesyncd',
1088 'myhostname',
1089 'firstboot',
1090 'randomseed',
1091 'backlight',
1092 'vconsole',
1093 'quotacheck',
1094 'sysusers',
1095 'tmpfiles',
1096 'hwdb',
1097 'rfkill',
1098 'ldconfig',
1099 'efi',
1100 'tpm',
1101 'ima',
1102 'smack',
1103 'gshadow',
1104 'idn',
1105 'nss-systemd']
1106 have = get_option(term)
1107 name = 'ENABLE_' + term.underscorify().to_upper()
1108 conf.set10(name, have)
1109 m4_defines += have ? ['-D' + name] : []
1110 endforeach
1111
1112 want_tests = get_option('tests')
1113 install_tests = get_option('install-tests')
1114 tests = []
1115
1116 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1117
1118 #####################################################################
1119
1120 if get_option('efi')
1121 efi_arch = host_machine.cpu_family()
1122
1123 if efi_arch == 'x86'
1124 EFI_MACHINE_TYPE_NAME = 'ia32'
1125 gnu_efi_arch = 'ia32'
1126 elif efi_arch == 'x86_64'
1127 EFI_MACHINE_TYPE_NAME = 'x64'
1128 gnu_efi_arch = 'x86_64'
1129 elif efi_arch == 'arm'
1130 EFI_MACHINE_TYPE_NAME = 'arm'
1131 gnu_efi_arch = 'arm'
1132 elif efi_arch == 'aarch64'
1133 EFI_MACHINE_TYPE_NAME = 'aa64'
1134 gnu_efi_arch = 'aarch64'
1135 else
1136 EFI_MACHINE_TYPE_NAME = ''
1137 gnu_efi_arch = ''
1138 endif
1139
1140 have = true
1141 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1142
1143 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1144 else
1145 have = false
1146 endif
1147 conf.set10('ENABLE_EFI', have)
1148
1149 #####################################################################
1150
1151 config_h = configure_file(
1152 output : 'config.h',
1153 configuration : conf)
1154
1155 includes = include_directories('src/basic',
1156 'src/shared',
1157 'src/systemd',
1158 'src/journal',
1159 'src/resolve',
1160 'src/timesync',
1161 'src/login',
1162 'src/udev',
1163 'src/libudev',
1164 'src/core',
1165 'src/libsystemd/sd-bus',
1166 'src/libsystemd/sd-device',
1167 'src/libsystemd/sd-hwdb',
1168 'src/libsystemd/sd-id128',
1169 'src/libsystemd/sd-netlink',
1170 'src/libsystemd/sd-network',
1171 'src/libsystemd-network',
1172 '.',
1173 )
1174
1175 add_project_arguments('-include', 'config.h', language : 'c')
1176
1177 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1178 'src/shared/gcrypt-util.c')
1179
1180 subdir('po')
1181 subdir('catalog')
1182 subdir('src/systemd')
1183 subdir('src/basic')
1184 subdir('src/libsystemd')
1185 subdir('src/libsystemd-network')
1186 subdir('src/journal')
1187 subdir('src/login')
1188
1189 libjournal_core = static_library(
1190 'journal-core',
1191 libjournal_core_sources,
1192 journald_gperf_c,
1193 include_directories : includes,
1194 install : false)
1195
1196 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1197 libsystemd = shared_library(
1198 'systemd',
1199 libsystemd_internal_sources,
1200 journal_internal_sources,
1201 version : libsystemd_version,
1202 include_directories : includes,
1203 link_args : ['-shared',
1204 '-Wl,--version-script=' + libsystemd_sym_path],
1205 link_with : [libbasic],
1206 dependencies : [threads,
1207 libgcrypt,
1208 librt,
1209 libxz,
1210 liblz4],
1211 link_depends : libsystemd_sym,
1212 install : true,
1213 install_dir : rootlibdir)
1214
1215 ############################################################
1216
1217 # binaries that have --help and are intended for use by humans,
1218 # usually, but not always, installed in /bin.
1219 public_programs = []
1220
1221 subdir('src/libudev')
1222 subdir('src/shared')
1223 subdir('src/core')
1224 subdir('src/udev')
1225 subdir('src/network')
1226
1227 subdir('src/analyze')
1228 subdir('src/journal-remote')
1229 subdir('src/coredump')
1230 subdir('src/hostname')
1231 subdir('src/import')
1232 subdir('src/kernel-install')
1233 subdir('src/locale')
1234 subdir('src/machine')
1235 subdir('src/nspawn')
1236 subdir('src/resolve')
1237 subdir('src/timedate')
1238 subdir('src/timesync')
1239 subdir('src/vconsole')
1240 subdir('src/sulogin-shell')
1241 subdir('src/boot/efi')
1242
1243 subdir('src/test')
1244 subdir('rules')
1245 subdir('test')
1246
1247 ############################################################
1248
1249 # only static linking apart from libdl, to make sure that the
1250 # module is linked to all libraries that it uses.
1251 test_dlopen = executable(
1252 'test-dlopen',
1253 test_dlopen_c,
1254 include_directories : includes,
1255 link_with : [libbasic],
1256 dependencies : [libdl])
1257
1258 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1259 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1260 ['mymachines', 'ENABLE_MACHINED'],
1261 ['resolve', 'ENABLE_RESOLVE']]
1262
1263 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1264 if condition
1265 module = tuple[0]
1266
1267 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1268 version_script_arg = join_paths(meson.current_source_dir(), sym)
1269
1270 nss = shared_library(
1271 'nss_' + module,
1272 'src/nss-@0@/nss-@0@.c'.format(module),
1273 version : '2',
1274 include_directories : includes,
1275 link_args : ['-shared',
1276 '-Wl,--version-script=' + version_script_arg,
1277 '-Wl,--undefined'],
1278 link_with : [libsystemd_internal,
1279 libbasic],
1280 dependencies : [threads,
1281 librt],
1282 link_depends : sym,
1283 install : true,
1284 install_dir : rootlibdir)
1285
1286 # We cannot use shared_module because it does not support version suffix.
1287 # Unfortunately shared_library insists on creating the symlink…
1288 meson.add_install_script('sh', '-c',
1289 'rm $DESTDIR@0@/libnss_@1@.so'
1290 .format(rootlibdir, module))
1291
1292 test('dlopen-nss_' + module,
1293 test_dlopen,
1294 args : [nss.full_path()]) # path to dlopen must include a slash
1295 endif
1296 endforeach
1297
1298 ############################################################
1299
1300 executable('systemd',
1301 systemd_sources,
1302 include_directories : includes,
1303 link_with : [libcore,
1304 libshared],
1305 dependencies : [threads,
1306 librt,
1307 libseccomp,
1308 libselinux,
1309 libmount,
1310 libblkid],
1311 install_rpath : rootlibexecdir,
1312 install : true,
1313 install_dir : rootlibexecdir)
1314
1315 exe = executable('systemd-analyze',
1316 systemd_analyze_sources,
1317 include_directories : includes,
1318 link_with : [libcore,
1319 libshared],
1320 dependencies : [threads,
1321 librt,
1322 libseccomp,
1323 libselinux,
1324 libmount,
1325 libblkid],
1326 install_rpath : rootlibexecdir,
1327 install : true)
1328 public_programs += [exe]
1329
1330 executable('systemd-journald',
1331 systemd_journald_sources,
1332 include_directories : includes,
1333 link_with : [libjournal_core,
1334 libshared],
1335 dependencies : [threads,
1336 libxz,
1337 liblz4,
1338 libselinux],
1339 install_rpath : rootlibexecdir,
1340 install : true,
1341 install_dir : rootlibexecdir)
1342
1343 exe = executable('systemd-cat',
1344 systemd_cat_sources,
1345 include_directories : includes,
1346 link_with : [libjournal_core,
1347 libshared],
1348 dependencies : [threads],
1349 install_rpath : rootlibexecdir,
1350 install : true)
1351 public_programs += [exe]
1352
1353 exe = executable('journalctl',
1354 journalctl_sources,
1355 include_directories : includes,
1356 link_with : [libshared],
1357 dependencies : [threads,
1358 libqrencode,
1359 libxz,
1360 liblz4],
1361 install_rpath : rootlibexecdir,
1362 install : true,
1363 install_dir : rootbindir)
1364 public_programs += [exe]
1365
1366 executable('systemd-getty-generator',
1367 'src/getty-generator/getty-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-debug-generator',
1375 'src/debug-generator/debug-generator.c',
1376 include_directories : includes,
1377 link_with : [libshared],
1378 install_rpath : rootlibexecdir,
1379 install : true,
1380 install_dir : systemgeneratordir)
1381
1382 executable('systemd-fstab-generator',
1383 'src/fstab-generator/fstab-generator.c',
1384 'src/core/mount-setup.c',
1385 include_directories : includes,
1386 link_with : [libshared],
1387 install_rpath : rootlibexecdir,
1388 install : true,
1389 install_dir : systemgeneratordir)
1390
1391 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1392 executable('30-systemd-environment-d-generator',
1393 'src/environment-d-generator/environment-d-generator.c',
1394 include_directories : includes,
1395 link_with : [libshared],
1396 install_rpath : rootlibexecdir,
1397 install : true,
1398 install_dir : userenvgeneratordir)
1399
1400 meson.add_install_script(meson_make_symlink,
1401 join_paths(sysconfdir, 'environment'),
1402 join_paths(environmentdir, '99-environment.conf'))
1403 endif
1404
1405 if conf.get('ENABLE_HIBERNATE') == 1
1406 executable('systemd-hibernate-resume-generator',
1407 'src/hibernate-resume/hibernate-resume-generator.c',
1408 include_directories : includes,
1409 link_with : [libshared],
1410 install_rpath : rootlibexecdir,
1411 install : true,
1412 install_dir : systemgeneratordir)
1413
1414 executable('systemd-hibernate-resume',
1415 'src/hibernate-resume/hibernate-resume.c',
1416 include_directories : includes,
1417 link_with : [libshared],
1418 install_rpath : rootlibexecdir,
1419 install : true,
1420 install_dir : rootlibexecdir)
1421 endif
1422
1423 if conf.get('HAVE_BLKID') == 1
1424 executable('systemd-gpt-auto-generator',
1425 'src/gpt-auto-generator/gpt-auto-generator.c',
1426 'src/basic/blkid-util.h',
1427 include_directories : includes,
1428 link_with : [libshared],
1429 dependencies : libblkid,
1430 install_rpath : rootlibexecdir,
1431 install : true,
1432 install_dir : systemgeneratordir)
1433
1434 exe = executable('systemd-dissect',
1435 'src/dissect/dissect.c',
1436 include_directories : includes,
1437 link_with : [libshared],
1438 install_rpath : rootlibexecdir,
1439 install : true,
1440 install_dir : rootlibexecdir)
1441 public_programs += [exe]
1442 endif
1443
1444 if conf.get('ENABLE_RESOLVE') == 1
1445 executable('systemd-resolved',
1446 systemd_resolved_sources,
1447 gcrypt_util_sources,
1448 include_directories : includes,
1449 link_with : [libshared],
1450 dependencies : [threads,
1451 libgcrypt,
1452 libgpg_error,
1453 libm,
1454 libidn],
1455 install_rpath : rootlibexecdir,
1456 install : true,
1457 install_dir : rootlibexecdir)
1458
1459 exe = executable('systemd-resolve',
1460 systemd_resolve_sources,
1461 gcrypt_util_sources,
1462 include_directories : includes,
1463 link_with : [libshared],
1464 dependencies : [threads,
1465 libgcrypt,
1466 libgpg_error,
1467 libm,
1468 libidn],
1469 install_rpath : rootlibexecdir,
1470 install : true)
1471 public_programs += [exe]
1472 endif
1473
1474 if conf.get('ENABLE_LOGIND') == 1
1475 executable('systemd-logind',
1476 systemd_logind_sources,
1477 include_directories : includes,
1478 link_with : [liblogind_core,
1479 libshared],
1480 dependencies : [threads,
1481 libacl],
1482 install_rpath : rootlibexecdir,
1483 install : true,
1484 install_dir : rootlibexecdir)
1485
1486 exe = executable('loginctl',
1487 loginctl_sources,
1488 include_directories : includes,
1489 link_with : [libshared],
1490 dependencies : [threads,
1491 liblz4,
1492 libxz],
1493 install_rpath : rootlibexecdir,
1494 install : true,
1495 install_dir : rootbindir)
1496 public_programs += [exe]
1497
1498 exe = executable('systemd-inhibit',
1499 'src/login/inhibit.c',
1500 include_directories : includes,
1501 link_with : [libshared],
1502 install_rpath : rootlibexecdir,
1503 install : true,
1504 install_dir : rootbindir)
1505 public_programs += [exe]
1506
1507 if conf.get('HAVE_PAM') == 1
1508 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1509 pam_systemd = shared_library(
1510 'pam_systemd',
1511 pam_systemd_c,
1512 name_prefix : '',
1513 include_directories : includes,
1514 link_args : ['-shared',
1515 '-Wl,--version-script=' + version_script_arg],
1516 link_with : [libsystemd_internal,
1517 libshared_static],
1518 dependencies : [threads,
1519 libpam,
1520 libpam_misc],
1521 link_depends : pam_systemd_sym,
1522 install : true,
1523 install_dir : pamlibdir)
1524
1525 test('dlopen-pam_systemd',
1526 test_dlopen,
1527 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1528 endif
1529 endif
1530
1531 if conf.get('HAVE_PAM') == 1
1532 executable('systemd-user-sessions',
1533 'src/user-sessions/user-sessions.c',
1534 include_directories : includes,
1535 link_with : [libshared],
1536 install_rpath : rootlibexecdir,
1537 install : true,
1538 install_dir : rootlibexecdir)
1539 endif
1540
1541 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1542 exe = executable('bootctl',
1543 'src/boot/bootctl.c',
1544 include_directories : includes,
1545 link_with : [libshared],
1546 dependencies : [libblkid],
1547 install_rpath : rootlibexecdir,
1548 install : true)
1549 public_programs += [exe]
1550 endif
1551
1552 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1553 include_directories : includes,
1554 link_with : [libshared],
1555 dependencies : [threads],
1556 install_rpath : rootlibexecdir,
1557 install : true)
1558 public_programs += [exe]
1559
1560 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1561 include_directories : includes,
1562 link_with : [libshared],
1563 dependencies : [threads,
1564 libcap,
1565 libselinux,
1566 libxz,
1567 liblz4],
1568 install_rpath : rootlibexecdir,
1569 install : true,
1570 install_dir : rootbindir)
1571 public_programs += [exe]
1572
1573 if conf.get('ENABLE_BACKLIGHT') == 1
1574 executable('systemd-backlight',
1575 'src/backlight/backlight.c',
1576 include_directories : includes,
1577 link_with : [libshared],
1578 install_rpath : rootlibexecdir,
1579 install : true,
1580 install_dir : rootlibexecdir)
1581 endif
1582
1583 if conf.get('ENABLE_RFKILL') == 1
1584 executable('systemd-rfkill',
1585 'src/rfkill/rfkill.c',
1586 include_directories : includes,
1587 link_with : [libshared],
1588 install_rpath : rootlibexecdir,
1589 install : true,
1590 install_dir : rootlibexecdir)
1591 endif
1592
1593 executable('systemd-system-update-generator',
1594 'src/system-update-generator/system-update-generator.c',
1595 include_directories : includes,
1596 link_with : [libshared],
1597 install_rpath : rootlibexecdir,
1598 install : true,
1599 install_dir : systemgeneratordir)
1600
1601 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1602 executable('systemd-cryptsetup',
1603 'src/cryptsetup/cryptsetup.c',
1604 include_directories : includes,
1605 link_with : [libshared],
1606 dependencies : [libcryptsetup],
1607 install_rpath : rootlibexecdir,
1608 install : true,
1609 install_dir : rootlibexecdir)
1610
1611 executable('systemd-cryptsetup-generator',
1612 'src/cryptsetup/cryptsetup-generator.c',
1613 include_directories : includes,
1614 link_with : [libshared],
1615 dependencies : [libcryptsetup],
1616 install_rpath : rootlibexecdir,
1617 install : true,
1618 install_dir : systemgeneratordir)
1619
1620 executable('systemd-veritysetup',
1621 'src/veritysetup/veritysetup.c',
1622 include_directories : includes,
1623 link_with : [libshared],
1624 dependencies : [libcryptsetup],
1625 install_rpath : rootlibexecdir,
1626 install : true,
1627 install_dir : rootlibexecdir)
1628
1629 executable('systemd-veritysetup-generator',
1630 'src/veritysetup/veritysetup-generator.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 dependencies : [libcryptsetup],
1634 install_rpath : rootlibexecdir,
1635 install : true,
1636 install_dir : systemgeneratordir)
1637 endif
1638
1639 if conf.get('HAVE_SYSV_COMPAT') == 1
1640 executable('systemd-sysv-generator',
1641 'src/sysv-generator/sysv-generator.c',
1642 include_directories : includes,
1643 link_with : [libshared],
1644 install_rpath : rootlibexecdir,
1645 install : true,
1646 install_dir : systemgeneratordir)
1647
1648 executable('systemd-rc-local-generator',
1649 'src/rc-local-generator/rc-local-generator.c',
1650 include_directories : includes,
1651 link_with : [libshared],
1652 install_rpath : rootlibexecdir,
1653 install : true,
1654 install_dir : systemgeneratordir)
1655 endif
1656
1657 if conf.get('ENABLE_HOSTNAMED') == 1
1658 executable('systemd-hostnamed',
1659 'src/hostname/hostnamed.c',
1660 include_directories : includes,
1661 link_with : [libshared],
1662 install_rpath : rootlibexecdir,
1663 install : true,
1664 install_dir : rootlibexecdir)
1665
1666 exe = executable('hostnamectl',
1667 'src/hostname/hostnamectl.c',
1668 include_directories : includes,
1669 link_with : [libshared],
1670 install_rpath : rootlibexecdir,
1671 install : true)
1672 public_programs += [exe]
1673 endif
1674
1675 if conf.get('ENABLE_LOCALED') == 1
1676 if conf.get('HAVE_XKBCOMMON') == 1
1677 # logind will load libxkbcommon.so dynamically on its own
1678 deps = [libdl]
1679 else
1680 deps = []
1681 endif
1682
1683 executable('systemd-localed',
1684 systemd_localed_sources,
1685 include_directories : includes,
1686 link_with : [libshared],
1687 dependencies : deps,
1688 install_rpath : rootlibexecdir,
1689 install : true,
1690 install_dir : rootlibexecdir)
1691
1692 exe = executable('localectl',
1693 localectl_sources,
1694 include_directories : includes,
1695 link_with : [libshared],
1696 install_rpath : rootlibexecdir,
1697 install : true)
1698 public_programs += [exe]
1699 endif
1700
1701 if conf.get('ENABLE_TIMEDATED') == 1
1702 executable('systemd-timedated',
1703 'src/timedate/timedated.c',
1704 include_directories : includes,
1705 link_with : [libshared],
1706 install_rpath : rootlibexecdir,
1707 install : true,
1708 install_dir : rootlibexecdir)
1709
1710 exe = executable('timedatectl',
1711 'src/timedate/timedatectl.c',
1712 include_directories : includes,
1713 install_rpath : rootlibexecdir,
1714 link_with : [libshared],
1715 install : true)
1716 public_programs += [exe]
1717 endif
1718
1719 if conf.get('ENABLE_TIMESYNCD') == 1
1720 executable('systemd-timesyncd',
1721 systemd_timesyncd_sources,
1722 include_directories : includes,
1723 link_with : [libshared],
1724 dependencies : [threads,
1725 libm],
1726 install_rpath : rootlibexecdir,
1727 install : true,
1728 install_dir : rootlibexecdir)
1729 endif
1730
1731 if conf.get('ENABLE_MACHINED') == 1
1732 executable('systemd-machined',
1733 systemd_machined_sources,
1734 include_directories : includes,
1735 link_with : [libmachine_core,
1736 libshared],
1737 install_rpath : rootlibexecdir,
1738 install : true,
1739 install_dir : rootlibexecdir)
1740
1741 exe = executable('machinectl',
1742 'src/machine/machinectl.c',
1743 include_directories : includes,
1744 link_with : [libshared],
1745 dependencies : [threads,
1746 libxz,
1747 liblz4],
1748 install_rpath : rootlibexecdir,
1749 install : true,
1750 install_dir : rootbindir)
1751 public_programs += [exe]
1752 endif
1753
1754 if conf.get('ENABLE_IMPORTD') == 1
1755 executable('systemd-importd',
1756 systemd_importd_sources,
1757 include_directories : includes,
1758 link_with : [libshared],
1759 dependencies : [threads],
1760 install_rpath : rootlibexecdir,
1761 install : true,
1762 install_dir : rootlibexecdir)
1763
1764 systemd_pull = executable('systemd-pull',
1765 systemd_pull_sources,
1766 include_directories : includes,
1767 link_with : [libshared],
1768 dependencies : [libcurl,
1769 libz,
1770 libbzip2,
1771 libxz,
1772 libgcrypt],
1773 install_rpath : rootlibexecdir,
1774 install : true,
1775 install_dir : rootlibexecdir)
1776
1777 systemd_import = executable('systemd-import',
1778 systemd_import_sources,
1779 include_directories : includes,
1780 link_with : [libshared],
1781 dependencies : [libcurl,
1782 libz,
1783 libbzip2,
1784 libxz],
1785 install_rpath : rootlibexecdir,
1786 install : true,
1787 install_dir : rootlibexecdir)
1788
1789 systemd_export = executable('systemd-export',
1790 systemd_export_sources,
1791 include_directories : includes,
1792 link_with : [libshared],
1793 dependencies : [libcurl,
1794 libz,
1795 libbzip2,
1796 libxz],
1797 install_rpath : rootlibexecdir,
1798 install : true,
1799 install_dir : rootlibexecdir)
1800 public_programs += [systemd_pull, systemd_import, systemd_export]
1801 endif
1802
1803 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1804 exe = executable('systemd-journal-upload',
1805 systemd_journal_upload_sources,
1806 include_directories : includes,
1807 link_with : [libshared],
1808 dependencies : [threads,
1809 libcurl,
1810 libgnutls,
1811 libxz,
1812 liblz4],
1813 install_rpath : rootlibexecdir,
1814 install : true,
1815 install_dir : rootlibexecdir)
1816 public_programs += [exe]
1817 endif
1818
1819 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1820 s_j_remote = executable('systemd-journal-remote',
1821 systemd_journal_remote_sources,
1822 include_directories : includes,
1823 link_with : [libshared],
1824 dependencies : [threads,
1825 libmicrohttpd,
1826 libgnutls,
1827 libxz,
1828 liblz4],
1829 install_rpath : rootlibexecdir,
1830 install : true,
1831 install_dir : rootlibexecdir)
1832
1833 s_j_gatewayd = executable('systemd-journal-gatewayd',
1834 systemd_journal_gatewayd_sources,
1835 include_directories : includes,
1836 link_with : [libshared],
1837 dependencies : [threads,
1838 libmicrohttpd,
1839 libgnutls,
1840 libxz,
1841 liblz4],
1842 install_rpath : rootlibexecdir,
1843 install : true,
1844 install_dir : rootlibexecdir)
1845 public_programs += [s_j_remote, s_j_gatewayd]
1846 endif
1847
1848 if conf.get('ENABLE_COREDUMP') == 1
1849 executable('systemd-coredump',
1850 systemd_coredump_sources,
1851 include_directories : includes,
1852 link_with : [libshared],
1853 dependencies : [threads,
1854 libacl,
1855 libdw,
1856 libxz,
1857 liblz4],
1858 install_rpath : rootlibexecdir,
1859 install : true,
1860 install_dir : rootlibexecdir)
1861
1862 exe = executable('coredumpctl',
1863 coredumpctl_sources,
1864 include_directories : includes,
1865 link_with : [libshared],
1866 dependencies : [threads,
1867 libxz,
1868 liblz4],
1869 install_rpath : rootlibexecdir,
1870 install : true)
1871 public_programs += [exe]
1872 endif
1873
1874 if conf.get('ENABLE_BINFMT') == 1
1875 exe = executable('systemd-binfmt',
1876 'src/binfmt/binfmt.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 install_rpath : rootlibexecdir,
1880 install : true,
1881 install_dir : rootlibexecdir)
1882 public_programs += [exe]
1883
1884 meson.add_install_script('sh', '-c',
1885 mkdir_p.format(binfmtdir))
1886 meson.add_install_script('sh', '-c',
1887 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1888 endif
1889
1890 if conf.get('ENABLE_VCONSOLE') == 1
1891 executable('systemd-vconsole-setup',
1892 'src/vconsole/vconsole-setup.c',
1893 include_directories : includes,
1894 link_with : [libshared],
1895 install_rpath : rootlibexecdir,
1896 install : true,
1897 install_dir : rootlibexecdir)
1898 endif
1899
1900 if conf.get('ENABLE_RANDOMSEED') == 1
1901 executable('systemd-random-seed',
1902 'src/random-seed/random-seed.c',
1903 include_directories : includes,
1904 link_with : [libshared],
1905 install_rpath : rootlibexecdir,
1906 install : true,
1907 install_dir : rootlibexecdir)
1908 endif
1909
1910 if conf.get('ENABLE_FIRSTBOOT') == 1
1911 executable('systemd-firstboot',
1912 'src/firstboot/firstboot.c',
1913 include_directories : includes,
1914 link_with : [libshared],
1915 dependencies : [libcrypt],
1916 install_rpath : rootlibexecdir,
1917 install : true,
1918 install_dir : rootbindir)
1919 endif
1920
1921 executable('systemd-remount-fs',
1922 'src/remount-fs/remount-fs.c',
1923 'src/core/mount-setup.c',
1924 'src/core/mount-setup.h',
1925 include_directories : includes,
1926 link_with : [libshared],
1927 install_rpath : rootlibexecdir,
1928 install : true,
1929 install_dir : rootlibexecdir)
1930
1931 executable('systemd-machine-id-setup',
1932 'src/machine-id-setup/machine-id-setup-main.c',
1933 'src/core/machine-id-setup.c',
1934 'src/core/machine-id-setup.h',
1935 include_directories : includes,
1936 link_with : [libshared],
1937 install_rpath : rootlibexecdir,
1938 install : true,
1939 install_dir : rootbindir)
1940
1941 executable('systemd-fsck',
1942 'src/fsck/fsck.c',
1943 include_directories : includes,
1944 link_with : [libshared],
1945 install_rpath : rootlibexecdir,
1946 install : true,
1947 install_dir : rootlibexecdir)
1948
1949 executable('systemd-growfs',
1950 'src/partition/growfs.c',
1951 include_directories : includes,
1952 link_with : [libshared],
1953 dependencies : [libcryptsetup],
1954 install_rpath : rootlibexecdir,
1955 install : true,
1956 install_dir : rootlibexecdir)
1957
1958 executable('systemd-makefs',
1959 'src/partition/makefs.c',
1960 include_directories : includes,
1961 link_with : [libshared],
1962 install_rpath : rootlibexecdir,
1963 install : true,
1964 install_dir : rootlibexecdir)
1965
1966 executable('systemd-sleep',
1967 'src/sleep/sleep.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 install_rpath : rootlibexecdir,
1971 install : true,
1972 install_dir : rootlibexecdir)
1973
1974 exe = executable('systemd-sysctl',
1975 'src/sysctl/sysctl.c',
1976 include_directories : includes,
1977 link_with : [libshared],
1978 install_rpath : rootlibexecdir,
1979 install : true,
1980 install_dir : rootlibexecdir)
1981 public_programs += [exe]
1982
1983 executable('systemd-ac-power',
1984 'src/ac-power/ac-power.c',
1985 include_directories : includes,
1986 link_with : [libshared],
1987 install_rpath : rootlibexecdir,
1988 install : true,
1989 install_dir : rootlibexecdir)
1990
1991 exe = executable('systemd-detect-virt',
1992 'src/detect-virt/detect-virt.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-delta',
2000 'src/delta/delta.c',
2001 include_directories : includes,
2002 link_with : [libshared],
2003 install_rpath : rootlibexecdir,
2004 install : true)
2005 public_programs += [exe]
2006
2007 exe = executable('systemd-escape',
2008 'src/escape/escape.c',
2009 include_directories : includes,
2010 link_with : [libshared],
2011 install_rpath : rootlibexecdir,
2012 install : true,
2013 install_dir : rootbindir)
2014 public_programs += [exe]
2015
2016 exe = executable('systemd-notify',
2017 'src/notify/notify.c',
2018 include_directories : includes,
2019 link_with : [libshared],
2020 install_rpath : rootlibexecdir,
2021 install : true,
2022 install_dir : rootbindir)
2023 public_programs += [exe]
2024
2025 executable('systemd-volatile-root',
2026 'src/volatile-root/volatile-root.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 install_rpath : rootlibexecdir,
2030 install : true,
2031 install_dir : rootlibexecdir)
2032
2033 executable('systemd-cgroups-agent',
2034 'src/cgroups-agent/cgroups-agent.c',
2035 include_directories : includes,
2036 link_with : [libshared],
2037 install_rpath : rootlibexecdir,
2038 install : true,
2039 install_dir : rootlibexecdir)
2040
2041 exe = executable('systemd-path',
2042 'src/path/path.c',
2043 include_directories : includes,
2044 link_with : [libshared],
2045 install_rpath : rootlibexecdir,
2046 install : true)
2047 public_programs += [exe]
2048
2049 exe = executable('systemd-ask-password',
2050 'src/ask-password/ask-password.c',
2051 include_directories : includes,
2052 link_with : [libshared],
2053 install_rpath : rootlibexecdir,
2054 install : true,
2055 install_dir : rootbindir)
2056 public_programs += [exe]
2057
2058 executable('systemd-reply-password',
2059 'src/reply-password/reply-password.c',
2060 include_directories : includes,
2061 link_with : [libshared],
2062 install_rpath : rootlibexecdir,
2063 install : true,
2064 install_dir : rootlibexecdir)
2065
2066 exe = executable('systemd-tty-ask-password-agent',
2067 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2068 include_directories : includes,
2069 link_with : [libshared],
2070 install_rpath : rootlibexecdir,
2071 install : true,
2072 install_dir : rootbindir)
2073 public_programs += [exe]
2074
2075 exe = executable('systemd-cgls',
2076 'src/cgls/cgls.c',
2077 include_directories : includes,
2078 link_with : [libshared],
2079 install_rpath : rootlibexecdir,
2080 install : true)
2081 public_programs += [exe]
2082
2083 exe = executable('systemd-cgtop',
2084 'src/cgtop/cgtop.c',
2085 include_directories : includes,
2086 link_with : [libshared],
2087 install_rpath : rootlibexecdir,
2088 install : true)
2089 public_programs += [exe]
2090
2091 executable('systemd-initctl',
2092 'src/initctl/initctl.c',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 install_rpath : rootlibexecdir,
2096 install : true,
2097 install_dir : rootlibexecdir)
2098
2099 exe = executable('systemd-mount',
2100 'src/mount/mount-tool.c',
2101 include_directories : includes,
2102 link_with : [libshared],
2103 install_rpath : rootlibexecdir,
2104 install : true)
2105 public_programs += [exe]
2106
2107 meson.add_install_script(meson_make_symlink,
2108 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2109
2110 exe = executable('systemd-run',
2111 'src/run/run.c',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 install_rpath : rootlibexecdir,
2115 install : true)
2116 public_programs += [exe]
2117
2118 exe = executable('systemd-stdio-bridge',
2119 'src/stdio-bridge/stdio-bridge.c',
2120 include_directories : includes,
2121 link_with : [libshared],
2122 install_rpath : rootlibexecdir,
2123 install : true)
2124 public_programs += [exe]
2125
2126 exe = executable('busctl',
2127 'src/busctl/busctl.c',
2128 'src/busctl/busctl-introspect.c',
2129 'src/busctl/busctl-introspect.h',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 install_rpath : rootlibexecdir,
2133 install : true)
2134 public_programs += [exe]
2135
2136 if conf.get('ENABLE_SYSUSERS') == 1
2137 exe = executable('systemd-sysusers',
2138 'src/sysusers/sysusers.c',
2139 include_directories : includes,
2140 link_with : [libshared],
2141 install_rpath : rootlibexecdir,
2142 install : true,
2143 install_dir : rootbindir)
2144 public_programs += [exe]
2145 endif
2146
2147 if conf.get('ENABLE_TMPFILES') == 1
2148 exe = executable('systemd-tmpfiles',
2149 'src/tmpfiles/tmpfiles.c',
2150 include_directories : includes,
2151 link_with : [libshared],
2152 dependencies : [libacl],
2153 install_rpath : rootlibexecdir,
2154 install : true,
2155 install_dir : rootbindir)
2156 public_programs += [exe]
2157 endif
2158
2159 if conf.get('ENABLE_HWDB') == 1
2160 exe = executable('systemd-hwdb',
2161 'src/hwdb/hwdb.c',
2162 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2163 include_directories : includes,
2164 link_with : [libudev_internal],
2165 install_rpath : udev_rpath,
2166 install : true,
2167 install_dir : rootbindir)
2168 public_programs += [exe]
2169 endif
2170
2171 if conf.get('ENABLE_QUOTACHECK') == 1
2172 executable('systemd-quotacheck',
2173 'src/quotacheck/quotacheck.c',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2177 install : true,
2178 install_dir : rootlibexecdir)
2179 endif
2180
2181 exe = executable('systemd-socket-proxyd',
2182 'src/socket-proxy/socket-proxyd.c',
2183 include_directories : includes,
2184 link_with : [libshared],
2185 dependencies : [threads],
2186 install_rpath : rootlibexecdir,
2187 install : true,
2188 install_dir : rootlibexecdir)
2189 public_programs += [exe]
2190
2191 exe = executable('systemd-udevd',
2192 systemd_udevd_sources,
2193 include_directories : includes,
2194 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2195 link_with : [libudev_core,
2196 libsystemd_network,
2197 libudev_internal],
2198 dependencies : [threads,
2199 libkmod,
2200 libidn,
2201 libacl,
2202 libblkid],
2203 install_rpath : udev_rpath,
2204 install : true,
2205 install_dir : rootlibexecdir)
2206 public_programs += [exe]
2207
2208 exe = executable('udevadm',
2209 udevadm_sources,
2210 include_directories : includes,
2211 link_with : [libudev_core,
2212 libsystemd_network,
2213 libudev_internal],
2214 dependencies : [threads,
2215 libkmod,
2216 libidn,
2217 libacl,
2218 libblkid],
2219 install_rpath : udev_rpath,
2220 install : true,
2221 install_dir : rootbindir)
2222 public_programs += [exe]
2223
2224 executable('systemd-shutdown',
2225 systemd_shutdown_sources,
2226 include_directories : includes,
2227 link_with : [libshared],
2228 install_rpath : rootlibexecdir,
2229 install : true,
2230 install_dir : rootlibexecdir)
2231
2232 executable('systemd-update-done',
2233 'src/update-done/update-done.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 install_rpath : rootlibexecdir,
2237 install : true,
2238 install_dir : rootlibexecdir)
2239
2240 executable('systemd-update-utmp',
2241 'src/update-utmp/update-utmp.c',
2242 include_directories : includes,
2243 link_with : [libshared],
2244 dependencies : [libaudit],
2245 install_rpath : rootlibexecdir,
2246 install : true,
2247 install_dir : rootlibexecdir)
2248
2249 if conf.get('HAVE_KMOD') == 1
2250 executable('systemd-modules-load',
2251 'src/modules-load/modules-load.c',
2252 include_directories : includes,
2253 link_with : [libshared],
2254 dependencies : [libkmod],
2255 install_rpath : rootlibexecdir,
2256 install : true,
2257 install_dir : rootlibexecdir)
2258
2259 meson.add_install_script('sh', '-c',
2260 mkdir_p.format(modulesloaddir))
2261 meson.add_install_script('sh', '-c',
2262 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2263 endif
2264
2265 exe = executable('systemd-nspawn',
2266 systemd_nspawn_sources,
2267 'src/core/mount-setup.c', # FIXME: use a variable?
2268 'src/core/mount-setup.h',
2269 'src/core/loopback-setup.c',
2270 'src/core/loopback-setup.h',
2271 include_directories : [includes, include_directories('src/nspawn')],
2272 link_with : [libshared],
2273 dependencies : [libacl,
2274 libblkid,
2275 libseccomp,
2276 libselinux],
2277 install_rpath : rootlibexecdir,
2278 install : true)
2279 public_programs += [exe]
2280
2281 if conf.get('ENABLE_NETWORKD') == 1
2282 executable('systemd-networkd',
2283 systemd_networkd_sources,
2284 include_directories : includes,
2285 link_with : [libnetworkd_core,
2286 libsystemd_network,
2287 libudev_internal,
2288 libshared],
2289 dependencies : [threads],
2290 install_rpath : rootlibexecdir,
2291 install : true,
2292 install_dir : rootlibexecdir)
2293
2294 executable('systemd-networkd-wait-online',
2295 systemd_networkd_wait_online_sources,
2296 include_directories : includes,
2297 link_with : [libnetworkd_core,
2298 libshared],
2299 install_rpath : rootlibexecdir,
2300 install : true,
2301 install_dir : rootlibexecdir)
2302
2303 exe = executable('networkctl',
2304 networkctl_sources,
2305 include_directories : includes,
2306 link_with : [libsystemd_network,
2307 libshared],
2308 install_rpath : rootlibexecdir,
2309 install : true,
2310 install_dir : rootbindir)
2311 public_programs += [exe]
2312 endif
2313 ############################################################
2314
2315 foreach tuple : tests
2316 sources = tuple[0]
2317 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2318 dependencies = tuple[2]
2319 condition = tuple.length() >= 4 ? tuple[3] : ''
2320 type = tuple.length() >= 5 ? tuple[4] : ''
2321 defs = tuple.length() >= 6 ? tuple[5] : []
2322 incs = tuple.length() >= 7 ? tuple[6] : includes
2323 timeout = 30
2324
2325 name = sources[0].split('/')[-1].split('.')[0]
2326 if type.startswith('timeout=')
2327 timeout = type.split('=')[1].to_int()
2328 type = ''
2329 endif
2330
2331 if condition == '' or conf.get(condition) == 1
2332 exe = executable(
2333 name,
2334 sources,
2335 include_directories : incs,
2336 link_with : link_with,
2337 dependencies : dependencies,
2338 c_args : defs,
2339 install_rpath : rootlibexecdir,
2340 install : install_tests,
2341 install_dir : join_paths(testsdir, type))
2342
2343 if type == 'manual'
2344 message('@0@ is a manual test'.format(name))
2345 elif type == 'unsafe' and want_tests != 'unsafe'
2346 message('@0@ is an unsafe test'.format(name))
2347 else
2348 test(name, exe,
2349 env : test_env,
2350 timeout : timeout)
2351 endif
2352 else
2353 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2354 endif
2355 endforeach
2356
2357 test_libsystemd_sym = executable(
2358 'test-libsystemd-sym',
2359 test_libsystemd_sym_c,
2360 include_directories : includes,
2361 link_with : [libsystemd],
2362 install : install_tests,
2363 install_dir : testsdir)
2364 test('test-libsystemd-sym',
2365 test_libsystemd_sym)
2366
2367 test_libudev_sym = executable(
2368 'test-libudev-sym',
2369 test_libudev_sym_c,
2370 include_directories : includes,
2371 c_args : ['-Wno-deprecated-declarations'],
2372 link_with : [libudev],
2373 install : install_tests,
2374 install_dir : testsdir)
2375 test('test-libudev-sym',
2376 test_libudev_sym)
2377
2378 ############################################################
2379
2380 make_directive_index_py = find_program('tools/make-directive-index.py')
2381 make_man_index_py = find_program('tools/make-man-index.py')
2382 xml_helper_py = find_program('tools/xml_helper.py')
2383 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2384
2385 subdir('units')
2386 subdir('sysctl.d')
2387 subdir('sysusers.d')
2388 subdir('tmpfiles.d')
2389 subdir('hwdb')
2390 subdir('network')
2391 subdir('man')
2392 subdir('shell-completion/bash')
2393 subdir('shell-completion/zsh')
2394 subdir('docs/sysvinit')
2395 subdir('docs/var-log')
2396
2397 # FIXME: figure out if the warning is true:
2398 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2399 install_subdir('factory/etc',
2400 install_dir : factorydir)
2401
2402
2403 install_data('xorg/50-systemd-user.sh',
2404 install_dir : xinitrcdir)
2405 install_data('system-preset/90-systemd.preset',
2406 install_dir : systempresetdir)
2407 install_data('modprobe.d/systemd.conf',
2408 install_dir : modprobedir)
2409 install_data('README',
2410 'NEWS',
2411 'CODING_STYLE',
2412 'DISTRO_PORTING',
2413 'ENVIRONMENT.md',
2414 'LICENSE.GPL2',
2415 'LICENSE.LGPL2.1',
2416 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2417 install_dir : docdir)
2418
2419 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2420 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2421
2422 ############################################################
2423
2424 meson_check_help = find_program('tools/meson-check-help.sh')
2425
2426 foreach exec : public_programs
2427 name = exec.full_path().split('/')[-1]
2428 test('check-help-' + name,
2429 meson_check_help,
2430 args : [exec.full_path()])
2431 endforeach
2432
2433 ############################################################
2434
2435 if git.found()
2436 all_files = run_command(
2437 git,
2438 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2439 'ls-files',
2440 ':/*.[ch]'])
2441 all_files = files(all_files.stdout().split())
2442
2443 custom_target(
2444 'tags',
2445 output : 'tags',
2446 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2447 custom_target(
2448 'ctags',
2449 output : 'ctags',
2450 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2451 endif
2452
2453 if git.found()
2454 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2455 run_target(
2456 'git-contrib',
2457 command : [meson_git_contrib_sh])
2458 endif
2459
2460 if git.found()
2461 git_head = run_command(
2462 git,
2463 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2464 'rev-parse', 'HEAD']).stdout().strip()
2465 git_head_short = run_command(
2466 git,
2467 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2468 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2469
2470 run_target(
2471 'git-snapshot',
2472 command : ['git', 'archive',
2473 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2474 git_head_short),
2475 '--prefix', 'systemd-@0@/'.format(git_head),
2476 'HEAD'])
2477 endif
2478
2479 ############################################################
2480
2481 status = [
2482 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2483
2484 'prefix directory: @0@'.format(prefixdir),
2485 'rootprefix directory: @0@'.format(rootprefixdir),
2486 'sysconf directory: @0@'.format(sysconfdir),
2487 'include directory: @0@'.format(includedir),
2488 'lib directory: @0@'.format(libdir),
2489 'rootlib directory: @0@'.format(rootlibdir),
2490 'SysV init scripts: @0@'.format(sysvinit_path),
2491 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2492 'PAM modules directory: @0@'.format(pamlibdir),
2493 'PAM configuration directory: @0@'.format(pamconfdir),
2494 'RPM macros directory: @0@'.format(rpmmacrosdir),
2495 'modprobe.d directory: @0@'.format(modprobedir),
2496 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2497 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2498 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2499 'bash completions directory: @0@'.format(bashcompletiondir),
2500 'zsh completions directory: @0@'.format(zshcompletiondir),
2501 'extra start script: @0@'.format(get_option('rc-local')),
2502 'extra stop script: @0@'.format(get_option('halt-local')),
2503 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2504 get_option('debug-tty')),
2505 'TTY GID: @0@'.format(tty_gid),
2506 'users GID: @0@'.format(users_gid),
2507 'maximum system UID: @0@'.format(system_uid_max),
2508 'maximum system GID: @0@'.format(system_gid_max),
2509 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2510 'render group access mode: @0@'.format(get_option('group-render-mode')),
2511 'certificate root directory: @0@'.format(get_option('certificate-root')),
2512 'support URL: @0@'.format(support_url),
2513 'nobody user name: @0@'.format(get_option('nobody-user')),
2514 'nobody group name: @0@'.format(get_option('nobody-group')),
2515 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2516 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2517
2518 'default DNSSEC mode: @0@'.format(default_dnssec),
2519 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2520 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2521
2522 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2523 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2524 status += [
2525 'default DNS servers: @0@'.format(alt_dns_servers),
2526 'default NTP servers: @0@'.format(alt_ntp_servers)]
2527
2528 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2529 '@@0@'.format(time_epoch)).stdout().strip()
2530 status += [
2531 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2532
2533 # TODO:
2534 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2535 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2536 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2537
2538 if conf.get('ENABLE_EFI') == 1
2539 status += [
2540 'efi arch: @0@'.format(efi_arch)]
2541
2542 if have_gnu_efi
2543 status += [
2544 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2545 'EFI CC @0@'.format(efi_cc),
2546 'EFI lib directory: @0@'.format(efi_libdir),
2547 'EFI lds directory: @0@'.format(efi_ldsdir),
2548 'EFI include directory: @0@'.format(efi_incdir)]
2549 endif
2550 endif
2551
2552 found = []
2553 missing = []
2554
2555 foreach tuple : [
2556 ['libcryptsetup'],
2557 ['PAM'],
2558 ['AUDIT'],
2559 ['IMA'],
2560 ['AppArmor'],
2561 ['SELinux'],
2562 ['SECCOMP'],
2563 ['SMACK'],
2564 ['zlib'],
2565 ['xz'],
2566 ['lz4'],
2567 ['bzip2'],
2568 ['ACL'],
2569 ['gcrypt'],
2570 ['qrencode'],
2571 ['microhttpd'],
2572 ['gnutls'],
2573 ['libcurl'],
2574 ['idn'],
2575 ['libidn2'],
2576 ['libidn'],
2577 ['nss-systemd'],
2578 ['libiptc'],
2579 ['elfutils'],
2580 ['binfmt'],
2581 ['vconsole'],
2582 ['quotacheck'],
2583 ['tmpfiles'],
2584 ['environment.d'],
2585 ['sysusers'],
2586 ['firstboot'],
2587 ['randomseed'],
2588 ['backlight'],
2589 ['rfkill'],
2590 ['logind'],
2591 ['machined'],
2592 ['importd'],
2593 ['hostnamed'],
2594 ['timedated'],
2595 ['timesyncd'],
2596 ['localed'],
2597 ['networkd'],
2598 ['resolve'],
2599 ['coredump'],
2600 ['polkit'],
2601 ['legacy pkla', install_polkit_pkla],
2602 ['efi'],
2603 ['gnu-efi', have_gnu_efi],
2604 ['kmod'],
2605 ['xkbcommon'],
2606 ['blkid'],
2607 ['dbus'],
2608 ['glib'],
2609 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2610 ['hwdb'],
2611 ['tpm'],
2612 ['man pages', want_man],
2613 ['html pages', want_html],
2614 ['man page indices', want_man and have_lxml],
2615 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2616 ['SysV compat'],
2617 ['utmp'],
2618 ['ldconfig'],
2619 ['hibernate'],
2620 ['adm group', get_option('adm-group')],
2621 ['wheel group', get_option('wheel-group')],
2622 ['gshadow'],
2623 ['debug hashmap'],
2624 ['debug mmap cache'],
2625 ]
2626
2627 cond = tuple.get(1, '')
2628 if cond == ''
2629 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2630 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2631 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2632 endif
2633 if cond
2634 found += [tuple[0]]
2635 else
2636 missing += [tuple[0]]
2637 endif
2638 endforeach
2639
2640 status += [
2641 '',
2642 'enabled features: @0@'.format(', '.join(found)),
2643 '',
2644 'disabled features: @0@'.format(', '.join(missing)),
2645 '']
2646 message('\n '.join(status))
2647
2648 if rootprefixdir != rootprefix_default
2649 message('WARNING:\n' +
2650 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2651 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2652 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
2653 endif