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