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