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