]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
Merge pull request #7237 from keszybz/growfs
[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 endif
2150
2151 if conf.get('ENABLE_HWDB') == 1
2152 exe = executable('systemd-hwdb',
2153 'src/hwdb/hwdb.c',
2154 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2155 include_directories : includes,
2156 link_with : [libudev_internal],
2157 install_rpath : udev_rpath,
2158 install : true,
2159 install_dir : rootbindir)
2160 public_programs += [exe]
2161 endif
2162
2163 if conf.get('ENABLE_QUOTACHECK') == 1
2164 executable('systemd-quotacheck',
2165 'src/quotacheck/quotacheck.c',
2166 include_directories : includes,
2167 link_with : [libshared],
2168 install_rpath : rootlibexecdir,
2169 install : true,
2170 install_dir : rootlibexecdir)
2171 endif
2172
2173 exe = executable('systemd-socket-proxyd',
2174 'src/socket-proxy/socket-proxyd.c',
2175 include_directories : includes,
2176 link_with : [libshared],
2177 dependencies : [threads],
2178 install_rpath : rootlibexecdir,
2179 install : true,
2180 install_dir : rootlibexecdir)
2181 public_programs += [exe]
2182
2183 exe = executable('systemd-udevd',
2184 systemd_udevd_sources,
2185 include_directories : includes,
2186 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2187 link_with : [libudev_core,
2188 libsystemd_network,
2189 libudev_internal],
2190 dependencies : [threads,
2191 libkmod,
2192 libidn,
2193 libacl,
2194 libblkid],
2195 install_rpath : udev_rpath,
2196 install : true,
2197 install_dir : rootlibexecdir)
2198 public_programs += [exe]
2199
2200 exe = executable('udevadm',
2201 udevadm_sources,
2202 include_directories : includes,
2203 link_with : [libudev_core,
2204 libsystemd_network,
2205 libudev_internal],
2206 dependencies : [threads,
2207 libkmod,
2208 libidn,
2209 libacl,
2210 libblkid],
2211 install_rpath : udev_rpath,
2212 install : true,
2213 install_dir : rootbindir)
2214 public_programs += [exe]
2215
2216 executable('systemd-shutdown',
2217 systemd_shutdown_sources,
2218 include_directories : includes,
2219 link_with : [libshared],
2220 install_rpath : rootlibexecdir,
2221 install : true,
2222 install_dir : rootlibexecdir)
2223
2224 executable('systemd-update-done',
2225 'src/update-done/update-done.c',
2226 include_directories : includes,
2227 link_with : [libshared],
2228 install_rpath : rootlibexecdir,
2229 install : true,
2230 install_dir : rootlibexecdir)
2231
2232 executable('systemd-update-utmp',
2233 'src/update-utmp/update-utmp.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 dependencies : [libaudit],
2237 install_rpath : rootlibexecdir,
2238 install : true,
2239 install_dir : rootlibexecdir)
2240
2241 if conf.get('HAVE_KMOD') == 1
2242 executable('systemd-modules-load',
2243 'src/modules-load/modules-load.c',
2244 include_directories : includes,
2245 link_with : [libshared],
2246 dependencies : [libkmod],
2247 install_rpath : rootlibexecdir,
2248 install : true,
2249 install_dir : rootlibexecdir)
2250
2251 meson.add_install_script('sh', '-c',
2252 mkdir_p.format(modulesloaddir))
2253 meson.add_install_script('sh', '-c',
2254 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2255 endif
2256
2257 exe = executable('systemd-nspawn',
2258 systemd_nspawn_sources,
2259 'src/core/mount-setup.c', # FIXME: use a variable?
2260 'src/core/mount-setup.h',
2261 'src/core/loopback-setup.c',
2262 'src/core/loopback-setup.h',
2263 include_directories : [includes, include_directories('src/nspawn')],
2264 link_with : [libshared],
2265 dependencies : [libacl,
2266 libblkid,
2267 libseccomp,
2268 libselinux],
2269 install_rpath : rootlibexecdir,
2270 install : true)
2271 public_programs += [exe]
2272
2273 if conf.get('ENABLE_NETWORKD') == 1
2274 executable('systemd-networkd',
2275 systemd_networkd_sources,
2276 include_directories : includes,
2277 link_with : [libnetworkd_core,
2278 libsystemd_network,
2279 libudev_internal,
2280 libshared],
2281 dependencies : [threads],
2282 install_rpath : rootlibexecdir,
2283 install : true,
2284 install_dir : rootlibexecdir)
2285
2286 executable('systemd-networkd-wait-online',
2287 systemd_networkd_wait_online_sources,
2288 include_directories : includes,
2289 link_with : [libnetworkd_core,
2290 libshared],
2291 install_rpath : rootlibexecdir,
2292 install : true,
2293 install_dir : rootlibexecdir)
2294
2295 exe = executable('networkctl',
2296 networkctl_sources,
2297 include_directories : includes,
2298 link_with : [libsystemd_network,
2299 libshared],
2300 install_rpath : rootlibexecdir,
2301 install : true,
2302 install_dir : rootbindir)
2303 public_programs += [exe]
2304 endif
2305 ############################################################
2306
2307 foreach tuple : tests
2308 sources = tuple[0]
2309 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2310 dependencies = tuple[2]
2311 condition = tuple.length() >= 4 ? tuple[3] : ''
2312 type = tuple.length() >= 5 ? tuple[4] : ''
2313 defs = tuple.length() >= 6 ? tuple[5] : []
2314 incs = tuple.length() >= 7 ? tuple[6] : includes
2315 timeout = 30
2316
2317 name = sources[0].split('/')[-1].split('.')[0]
2318 if type.startswith('timeout=')
2319 timeout = type.split('=')[1].to_int()
2320 type = ''
2321 endif
2322
2323 if condition == '' or conf.get(condition) == 1
2324 exe = executable(
2325 name,
2326 sources,
2327 include_directories : incs,
2328 link_with : link_with,
2329 dependencies : dependencies,
2330 c_args : defs,
2331 install_rpath : rootlibexecdir,
2332 install : install_tests,
2333 install_dir : join_paths(testsdir, type))
2334
2335 if type == 'manual'
2336 message('@0@ is a manual test'.format(name))
2337 elif type == 'unsafe' and want_tests != 'unsafe'
2338 message('@0@ is an unsafe test'.format(name))
2339 else
2340 test(name, exe,
2341 env : test_env,
2342 timeout : timeout)
2343 endif
2344 else
2345 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2346 endif
2347 endforeach
2348
2349 test_libsystemd_sym = executable(
2350 'test-libsystemd-sym',
2351 test_libsystemd_sym_c,
2352 include_directories : includes,
2353 link_with : [libsystemd],
2354 install : install_tests,
2355 install_dir : testsdir)
2356 test('test-libsystemd-sym',
2357 test_libsystemd_sym)
2358
2359 test_libudev_sym = executable(
2360 'test-libudev-sym',
2361 test_libudev_sym_c,
2362 include_directories : includes,
2363 c_args : ['-Wno-deprecated-declarations'],
2364 link_with : [libudev],
2365 install : install_tests,
2366 install_dir : testsdir)
2367 test('test-libudev-sym',
2368 test_libudev_sym)
2369
2370 ############################################################
2371
2372 make_directive_index_py = find_program('tools/make-directive-index.py')
2373 make_man_index_py = find_program('tools/make-man-index.py')
2374 xml_helper_py = find_program('tools/xml_helper.py')
2375 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2376
2377 subdir('units')
2378 subdir('sysctl.d')
2379 subdir('sysusers.d')
2380 subdir('tmpfiles.d')
2381 subdir('hwdb')
2382 subdir('network')
2383 subdir('man')
2384 subdir('shell-completion/bash')
2385 subdir('shell-completion/zsh')
2386 subdir('docs/sysvinit')
2387 subdir('docs/var-log')
2388
2389 # FIXME: figure out if the warning is true:
2390 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2391 install_subdir('factory/etc',
2392 install_dir : factorydir)
2393
2394
2395 install_data('xorg/50-systemd-user.sh',
2396 install_dir : xinitrcdir)
2397 install_data('system-preset/90-systemd.preset',
2398 install_dir : systempresetdir)
2399 install_data('modprobe.d/systemd.conf',
2400 install_dir : modprobedir)
2401 install_data('README',
2402 'NEWS',
2403 'CODING_STYLE',
2404 'DISTRO_PORTING',
2405 'ENVIRONMENT.md',
2406 'LICENSE.GPL2',
2407 'LICENSE.LGPL2.1',
2408 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2409 install_dir : docdir)
2410
2411 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2412 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2413
2414 ############################################################
2415
2416 meson_check_help = find_program('tools/meson-check-help.sh')
2417
2418 foreach exec : public_programs
2419 name = exec.full_path().split('/')[-1]
2420 test('check-help-' + name,
2421 meson_check_help,
2422 args : [exec.full_path()])
2423 endforeach
2424
2425 ############################################################
2426
2427 if git.found()
2428 all_files = run_command(
2429 git,
2430 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2431 'ls-files',
2432 ':/*.[ch]'])
2433 all_files = files(all_files.stdout().split())
2434
2435 custom_target(
2436 'tags',
2437 output : 'tags',
2438 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2439 custom_target(
2440 'ctags',
2441 output : 'ctags',
2442 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2443 endif
2444
2445 if git.found()
2446 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2447 run_target(
2448 'git-contrib',
2449 command : [meson_git_contrib_sh])
2450 endif
2451
2452 if git.found()
2453 git_head = run_command(
2454 git,
2455 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2456 'rev-parse', 'HEAD']).stdout().strip()
2457 git_head_short = run_command(
2458 git,
2459 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2460 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2461
2462 run_target(
2463 'git-snapshot',
2464 command : ['git', 'archive',
2465 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2466 git_head_short),
2467 '--prefix', 'systemd-@0@/'.format(git_head),
2468 'HEAD'])
2469 endif
2470
2471 ############################################################
2472
2473 status = [
2474 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2475
2476 'prefix directory: @0@'.format(prefixdir),
2477 'rootprefix directory: @0@'.format(rootprefixdir),
2478 'sysconf directory: @0@'.format(sysconfdir),
2479 'include directory: @0@'.format(includedir),
2480 'lib directory: @0@'.format(libdir),
2481 'rootlib directory: @0@'.format(rootlibdir),
2482 'SysV init scripts: @0@'.format(sysvinit_path),
2483 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2484 'PAM modules directory: @0@'.format(pamlibdir),
2485 'PAM configuration directory: @0@'.format(pamconfdir),
2486 'RPM macros directory: @0@'.format(rpmmacrosdir),
2487 'modprobe.d directory: @0@'.format(modprobedir),
2488 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2489 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2490 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2491 'bash completions directory: @0@'.format(bashcompletiondir),
2492 'zsh completions directory: @0@'.format(zshcompletiondir),
2493 'extra start script: @0@'.format(get_option('rc-local')),
2494 'extra stop script: @0@'.format(get_option('halt-local')),
2495 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2496 get_option('debug-tty')),
2497 'TTY GID: @0@'.format(tty_gid),
2498 'maximum system UID: @0@'.format(system_uid_max),
2499 'maximum system GID: @0@'.format(system_gid_max),
2500 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2501 'render group access mode: @0@'.format(get_option('group-render-mode')),
2502 'certificate root directory: @0@'.format(get_option('certificate-root')),
2503 'support URL: @0@'.format(support_url),
2504 'nobody user name: @0@'.format(get_option('nobody-user')),
2505 'nobody group name: @0@'.format(get_option('nobody-group')),
2506 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2507 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2508
2509 'default DNSSEC mode: @0@'.format(default_dnssec),
2510 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2511 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2512
2513 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2514 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2515 status += [
2516 'default DNS servers: @0@'.format(alt_dns_servers),
2517 'default NTP servers: @0@'.format(alt_ntp_servers)]
2518
2519 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2520 '@@0@'.format(time_epoch)).stdout().strip()
2521 status += [
2522 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2523
2524 # TODO:
2525 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2526 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2527 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2528
2529 if conf.get('ENABLE_EFI') == 1
2530 status += [
2531 'efi arch: @0@'.format(efi_arch)]
2532
2533 if have_gnu_efi
2534 status += [
2535 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2536 'EFI CC @0@'.format(efi_cc),
2537 'EFI lib directory: @0@'.format(efi_libdir),
2538 'EFI lds directory: @0@'.format(efi_ldsdir),
2539 'EFI include directory: @0@'.format(efi_incdir)]
2540 endif
2541 endif
2542
2543 found = []
2544 missing = []
2545
2546 foreach tuple : [
2547 ['libcryptsetup'],
2548 ['PAM'],
2549 ['AUDIT'],
2550 ['IMA'],
2551 ['AppArmor'],
2552 ['SELinux'],
2553 ['SECCOMP'],
2554 ['SMACK'],
2555 ['zlib'],
2556 ['xz'],
2557 ['lz4'],
2558 ['bzip2'],
2559 ['ACL'],
2560 ['gcrypt'],
2561 ['qrencode'],
2562 ['microhttpd'],
2563 ['gnutls'],
2564 ['libcurl'],
2565 ['idn'],
2566 ['libidn2'],
2567 ['libidn'],
2568 ['nss-systemd'],
2569 ['libiptc'],
2570 ['elfutils'],
2571 ['binfmt'],
2572 ['vconsole'],
2573 ['quotacheck'],
2574 ['tmpfiles'],
2575 ['environment.d'],
2576 ['sysusers'],
2577 ['firstboot'],
2578 ['randomseed'],
2579 ['backlight'],
2580 ['rfkill'],
2581 ['logind'],
2582 ['machined'],
2583 ['importd'],
2584 ['hostnamed'],
2585 ['timedated'],
2586 ['timesyncd'],
2587 ['localed'],
2588 ['networkd'],
2589 ['resolve'],
2590 ['coredump'],
2591 ['polkit'],
2592 ['legacy pkla', install_polkit_pkla],
2593 ['efi'],
2594 ['gnu-efi', have_gnu_efi],
2595 ['kmod'],
2596 ['xkbcommon'],
2597 ['blkid'],
2598 ['dbus'],
2599 ['glib'],
2600 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2601 ['hwdb'],
2602 ['tpm'],
2603 ['man pages', want_man],
2604 ['html pages', want_html],
2605 ['man page indices', want_man and have_lxml],
2606 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2607 ['SysV compat'],
2608 ['utmp'],
2609 ['ldconfig'],
2610 ['hibernate'],
2611 ['adm group', get_option('adm-group')],
2612 ['wheel group', get_option('wheel-group')],
2613 ['gshadow'],
2614 ['debug hashmap'],
2615 ['debug mmap cache'],
2616 ]
2617
2618 cond = tuple.get(1, '')
2619 if cond == ''
2620 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2621 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2622 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2623 endif
2624 if cond
2625 found += [tuple[0]]
2626 else
2627 missing += [tuple[0]]
2628 endif
2629 endforeach
2630
2631 status += [
2632 '',
2633 'enabled features: @0@'.format(', '.join(found)),
2634 '',
2635 'disabled features: @0@'.format(', '.join(missing)),
2636 '']
2637 message('\n '.join(status))
2638
2639 if rootprefixdir != rootprefix_default
2640 message('WARNING:\n' +
2641 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2642 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2643 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
2644 endif