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