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