]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
Merge pull request #7554 from keszybz/autodetect-build
[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/sulogin-shell')
1296 subdir('src/boot/efi')
1297
1298 subdir('src/test')
1299 subdir('rules')
1300 subdir('test')
1301
1302 ############################################################
1303
1304 # only static linking apart from libdl, to make sure that the
1305 # module is linked to all libraries that it uses.
1306 test_dlopen = executable(
1307 'test-dlopen',
1308 test_dlopen_c,
1309 include_directories : includes,
1310 link_with : [libbasic],
1311 dependencies : [libdl])
1312
1313 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1314 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1315 ['mymachines', 'ENABLE_MACHINED'],
1316 ['resolve', 'ENABLE_RESOLVE']]
1317
1318 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1319 if condition
1320 module = tuple[0]
1321
1322 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1323 version_script_arg = join_paths(meson.current_source_dir(), sym)
1324
1325 nss = shared_library(
1326 'nss_' + module,
1327 'src/nss-@0@/nss-@0@.c'.format(module),
1328 version : '2',
1329 include_directories : includes,
1330 link_args : ['-shared',
1331 '-Wl,--version-script=' + version_script_arg,
1332 '-Wl,--undefined'],
1333 link_with : [libsystemd_internal,
1334 libbasic],
1335 dependencies : [threads,
1336 librt],
1337 link_depends : sym,
1338 install : true,
1339 install_dir : rootlibdir)
1340
1341 # We cannot use shared_module because it does not support version suffix.
1342 # Unfortunately shared_library insists on creating the symlink…
1343 meson.add_install_script('sh', '-c',
1344 'rm $DESTDIR@0@/libnss_@1@.so'
1345 .format(rootlibdir, module))
1346
1347 test('dlopen-nss_' + module,
1348 test_dlopen,
1349 args : [nss.full_path()]) # path to dlopen must include a slash
1350 endif
1351 endforeach
1352
1353 ############################################################
1354
1355 executable('systemd',
1356 systemd_sources,
1357 include_directories : includes,
1358 link_with : [libcore,
1359 libshared],
1360 dependencies : [threads,
1361 librt,
1362 libseccomp,
1363 libselinux,
1364 libmount,
1365 libblkid],
1366 install_rpath : rootlibexecdir,
1367 install : true,
1368 install_dir : rootlibexecdir)
1369
1370 exe = executable('systemd-analyze',
1371 systemd_analyze_sources,
1372 include_directories : includes,
1373 link_with : [libcore,
1374 libshared],
1375 dependencies : [threads,
1376 librt,
1377 libseccomp,
1378 libselinux,
1379 libmount,
1380 libblkid],
1381 install_rpath : rootlibexecdir,
1382 install : true)
1383 public_programs += [exe]
1384
1385 executable('systemd-journald',
1386 systemd_journald_sources,
1387 include_directories : includes,
1388 link_with : [libjournal_core,
1389 libshared],
1390 dependencies : [threads,
1391 libxz,
1392 liblz4,
1393 libselinux],
1394 install_rpath : rootlibexecdir,
1395 install : true,
1396 install_dir : rootlibexecdir)
1397
1398 exe = executable('systemd-cat',
1399 systemd_cat_sources,
1400 include_directories : includes,
1401 link_with : [libjournal_core,
1402 libshared],
1403 dependencies : [threads],
1404 install_rpath : rootlibexecdir,
1405 install : true)
1406 public_programs += [exe]
1407
1408 exe = executable('journalctl',
1409 journalctl_sources,
1410 include_directories : includes,
1411 link_with : [libshared],
1412 dependencies : [threads,
1413 libqrencode,
1414 libxz,
1415 liblz4],
1416 install_rpath : rootlibexecdir,
1417 install : true,
1418 install_dir : rootbindir)
1419 public_programs += [exe]
1420
1421 executable('systemd-getty-generator',
1422 'src/getty-generator/getty-generator.c',
1423 include_directories : includes,
1424 link_with : [libshared],
1425 install_rpath : rootlibexecdir,
1426 install : true,
1427 install_dir : systemgeneratordir)
1428
1429 executable('systemd-debug-generator',
1430 'src/debug-generator/debug-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-fstab-generator',
1438 'src/fstab-generator/fstab-generator.c',
1439 'src/core/mount-setup.c',
1440 include_directories : includes,
1441 link_with : [libshared],
1442 install_rpath : rootlibexecdir,
1443 install : true,
1444 install_dir : systemgeneratordir)
1445
1446 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1447 executable('30-systemd-environment-d-generator',
1448 'src/environment-d-generator/environment-d-generator.c',
1449 include_directories : includes,
1450 link_with : [libshared],
1451 install_rpath : rootlibexecdir,
1452 install : true,
1453 install_dir : userenvgeneratordir)
1454
1455 meson.add_install_script(meson_make_symlink,
1456 join_paths(sysconfdir, 'environment'),
1457 join_paths(environmentdir, '99-environment.conf'))
1458 endif
1459
1460 if conf.get('ENABLE_HIBERNATE') == 1
1461 executable('systemd-hibernate-resume-generator',
1462 'src/hibernate-resume/hibernate-resume-generator.c',
1463 include_directories : includes,
1464 link_with : [libshared],
1465 install_rpath : rootlibexecdir,
1466 install : true,
1467 install_dir : systemgeneratordir)
1468
1469 executable('systemd-hibernate-resume',
1470 'src/hibernate-resume/hibernate-resume.c',
1471 include_directories : includes,
1472 link_with : [libshared],
1473 install_rpath : rootlibexecdir,
1474 install : true,
1475 install_dir : rootlibexecdir)
1476 endif
1477
1478 if conf.get('HAVE_BLKID') == 1
1479 executable('systemd-gpt-auto-generator',
1480 'src/gpt-auto-generator/gpt-auto-generator.c',
1481 'src/basic/blkid-util.h',
1482 include_directories : includes,
1483 link_with : [libshared],
1484 dependencies : libblkid,
1485 install_rpath : rootlibexecdir,
1486 install : true,
1487 install_dir : systemgeneratordir)
1488
1489 exe = executable('systemd-dissect',
1490 'src/dissect/dissect.c',
1491 include_directories : includes,
1492 link_with : [libshared],
1493 install_rpath : rootlibexecdir,
1494 install : true,
1495 install_dir : rootlibexecdir)
1496 public_programs += [exe]
1497 endif
1498
1499 if conf.get('ENABLE_RESOLVE') == 1
1500 executable('systemd-resolved',
1501 systemd_resolved_sources,
1502 gcrypt_util_sources,
1503 include_directories : includes,
1504 link_with : [libshared],
1505 dependencies : [threads,
1506 libgcrypt,
1507 libgpg_error,
1508 libm,
1509 libidn],
1510 install_rpath : rootlibexecdir,
1511 install : true,
1512 install_dir : rootlibexecdir)
1513
1514 exe = executable('systemd-resolve',
1515 systemd_resolve_sources,
1516 gcrypt_util_sources,
1517 include_directories : includes,
1518 link_with : [libshared],
1519 dependencies : [threads,
1520 libgcrypt,
1521 libgpg_error,
1522 libm,
1523 libidn],
1524 install_rpath : rootlibexecdir,
1525 install : true)
1526 public_programs += [exe]
1527 endif
1528
1529 if conf.get('ENABLE_LOGIND') == 1
1530 executable('systemd-logind',
1531 systemd_logind_sources,
1532 include_directories : includes,
1533 link_with : [liblogind_core,
1534 libshared],
1535 dependencies : [threads,
1536 libacl],
1537 install_rpath : rootlibexecdir,
1538 install : true,
1539 install_dir : rootlibexecdir)
1540
1541 exe = executable('loginctl',
1542 loginctl_sources,
1543 include_directories : includes,
1544 link_with : [libshared],
1545 dependencies : [threads,
1546 liblz4,
1547 libxz],
1548 install_rpath : rootlibexecdir,
1549 install : true,
1550 install_dir : rootbindir)
1551 public_programs += [exe]
1552
1553 exe = executable('systemd-inhibit',
1554 'src/login/inhibit.c',
1555 include_directories : includes,
1556 link_with : [libshared],
1557 install_rpath : rootlibexecdir,
1558 install : true,
1559 install_dir : rootbindir)
1560 public_programs += [exe]
1561
1562 if conf.get('HAVE_PAM') == 1
1563 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1564 pam_systemd = shared_library(
1565 'pam_systemd',
1566 pam_systemd_c,
1567 name_prefix : '',
1568 include_directories : includes,
1569 link_args : ['-shared',
1570 '-Wl,--version-script=' + version_script_arg],
1571 link_with : [libsystemd_internal,
1572 libshared_static],
1573 dependencies : [threads,
1574 libpam,
1575 libpam_misc],
1576 link_depends : pam_systemd_sym,
1577 install : true,
1578 install_dir : pamlibdir)
1579
1580 test('dlopen-pam_systemd',
1581 test_dlopen,
1582 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1583 endif
1584 endif
1585
1586 if conf.get('HAVE_PAM') == 1
1587 executable('systemd-user-sessions',
1588 'src/user-sessions/user-sessions.c',
1589 include_directories : includes,
1590 link_with : [libshared],
1591 install_rpath : rootlibexecdir,
1592 install : true,
1593 install_dir : rootlibexecdir)
1594 endif
1595
1596 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1597 exe = executable('bootctl',
1598 'src/boot/bootctl.c',
1599 include_directories : includes,
1600 link_with : [libshared],
1601 dependencies : [libblkid],
1602 install_rpath : rootlibexecdir,
1603 install : true)
1604 public_programs += [exe]
1605 endif
1606
1607 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1608 include_directories : includes,
1609 link_with : [libshared],
1610 dependencies : [threads],
1611 install_rpath : rootlibexecdir,
1612 install : true)
1613 public_programs += [exe]
1614
1615 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1616 include_directories : includes,
1617 link_with : [libshared],
1618 dependencies : [threads,
1619 libcap,
1620 libselinux,
1621 libxz,
1622 liblz4],
1623 install_rpath : rootlibexecdir,
1624 install : true,
1625 install_dir : rootbindir)
1626 public_programs += [exe]
1627
1628 if conf.get('ENABLE_BACKLIGHT') == 1
1629 executable('systemd-backlight',
1630 'src/backlight/backlight.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 install_rpath : rootlibexecdir,
1634 install : true,
1635 install_dir : rootlibexecdir)
1636 endif
1637
1638 if conf.get('ENABLE_RFKILL') == 1
1639 executable('systemd-rfkill',
1640 'src/rfkill/rfkill.c',
1641 include_directories : includes,
1642 link_with : [libshared],
1643 install_rpath : rootlibexecdir,
1644 install : true,
1645 install_dir : rootlibexecdir)
1646 endif
1647
1648 executable('systemd-system-update-generator',
1649 'src/system-update-generator/system-update-generator.c',
1650 include_directories : includes,
1651 link_with : [libshared],
1652 install_rpath : rootlibexecdir,
1653 install : true,
1654 install_dir : systemgeneratordir)
1655
1656 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1657 executable('systemd-cryptsetup',
1658 'src/cryptsetup/cryptsetup.c',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 dependencies : [libcryptsetup],
1662 install_rpath : rootlibexecdir,
1663 install : true,
1664 install_dir : rootlibexecdir)
1665
1666 executable('systemd-cryptsetup-generator',
1667 'src/cryptsetup/cryptsetup-generator.c',
1668 include_directories : includes,
1669 link_with : [libshared],
1670 dependencies : [libcryptsetup],
1671 install_rpath : rootlibexecdir,
1672 install : true,
1673 install_dir : systemgeneratordir)
1674
1675 executable('systemd-veritysetup',
1676 'src/veritysetup/veritysetup.c',
1677 include_directories : includes,
1678 link_with : [libshared],
1679 dependencies : [libcryptsetup],
1680 install_rpath : rootlibexecdir,
1681 install : true,
1682 install_dir : rootlibexecdir)
1683
1684 executable('systemd-veritysetup-generator',
1685 'src/veritysetup/veritysetup-generator.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 dependencies : [libcryptsetup],
1689 install_rpath : rootlibexecdir,
1690 install : true,
1691 install_dir : systemgeneratordir)
1692 endif
1693
1694 if conf.get('HAVE_SYSV_COMPAT') == 1
1695 executable('systemd-sysv-generator',
1696 'src/sysv-generator/sysv-generator.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 install_rpath : rootlibexecdir,
1700 install : true,
1701 install_dir : systemgeneratordir)
1702
1703 executable('systemd-rc-local-generator',
1704 'src/rc-local-generator/rc-local-generator.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 install_rpath : rootlibexecdir,
1708 install : true,
1709 install_dir : systemgeneratordir)
1710 endif
1711
1712 if conf.get('ENABLE_HOSTNAMED') == 1
1713 executable('systemd-hostnamed',
1714 'src/hostname/hostnamed.c',
1715 include_directories : includes,
1716 link_with : [libshared],
1717 install_rpath : rootlibexecdir,
1718 install : true,
1719 install_dir : rootlibexecdir)
1720
1721 exe = executable('hostnamectl',
1722 'src/hostname/hostnamectl.c',
1723 include_directories : includes,
1724 link_with : [libshared],
1725 install_rpath : rootlibexecdir,
1726 install : true)
1727 public_programs += [exe]
1728 endif
1729
1730 if conf.get('ENABLE_LOCALED') == 1
1731 if conf.get('HAVE_XKBCOMMON') == 1
1732 # logind will load libxkbcommon.so dynamically on its own
1733 deps = [libdl]
1734 else
1735 deps = []
1736 endif
1737
1738 executable('systemd-localed',
1739 systemd_localed_sources,
1740 include_directories : includes,
1741 link_with : [libshared],
1742 dependencies : deps,
1743 install_rpath : rootlibexecdir,
1744 install : true,
1745 install_dir : rootlibexecdir)
1746
1747 exe = executable('localectl',
1748 localectl_sources,
1749 include_directories : includes,
1750 link_with : [libshared],
1751 install_rpath : rootlibexecdir,
1752 install : true)
1753 public_programs += [exe]
1754 endif
1755
1756 if conf.get('ENABLE_TIMEDATED') == 1
1757 executable('systemd-timedated',
1758 'src/timedate/timedated.c',
1759 include_directories : includes,
1760 link_with : [libshared],
1761 install_rpath : rootlibexecdir,
1762 install : true,
1763 install_dir : rootlibexecdir)
1764
1765 exe = executable('timedatectl',
1766 'src/timedate/timedatectl.c',
1767 include_directories : includes,
1768 install_rpath : rootlibexecdir,
1769 link_with : [libshared],
1770 install : true)
1771 public_programs += [exe]
1772 endif
1773
1774 if conf.get('ENABLE_TIMESYNCD') == 1
1775 executable('systemd-timesyncd',
1776 systemd_timesyncd_sources,
1777 include_directories : includes,
1778 link_with : [libshared],
1779 dependencies : [threads,
1780 libm],
1781 install_rpath : rootlibexecdir,
1782 install : true,
1783 install_dir : rootlibexecdir)
1784 endif
1785
1786 if conf.get('ENABLE_MACHINED') == 1
1787 executable('systemd-machined',
1788 systemd_machined_sources,
1789 include_directories : includes,
1790 link_with : [libmachine_core,
1791 libshared],
1792 install_rpath : rootlibexecdir,
1793 install : true,
1794 install_dir : rootlibexecdir)
1795
1796 exe = executable('machinectl',
1797 'src/machine/machinectl.c',
1798 include_directories : includes,
1799 link_with : [libshared],
1800 dependencies : [threads,
1801 libxz,
1802 liblz4],
1803 install_rpath : rootlibexecdir,
1804 install : true,
1805 install_dir : rootbindir)
1806 public_programs += [exe]
1807 endif
1808
1809 if conf.get('ENABLE_IMPORTD') == 1
1810 executable('systemd-importd',
1811 systemd_importd_sources,
1812 include_directories : includes,
1813 link_with : [libshared],
1814 dependencies : [threads],
1815 install_rpath : rootlibexecdir,
1816 install : true,
1817 install_dir : rootlibexecdir)
1818
1819 systemd_pull = executable('systemd-pull',
1820 systemd_pull_sources,
1821 include_directories : includes,
1822 link_with : [libshared],
1823 dependencies : [libcurl,
1824 libz,
1825 libbzip2,
1826 libxz,
1827 libgcrypt],
1828 install_rpath : rootlibexecdir,
1829 install : true,
1830 install_dir : rootlibexecdir)
1831
1832 systemd_import = executable('systemd-import',
1833 systemd_import_sources,
1834 include_directories : includes,
1835 link_with : [libshared],
1836 dependencies : [libcurl,
1837 libz,
1838 libbzip2,
1839 libxz],
1840 install_rpath : rootlibexecdir,
1841 install : true,
1842 install_dir : rootlibexecdir)
1843
1844 systemd_export = executable('systemd-export',
1845 systemd_export_sources,
1846 include_directories : includes,
1847 link_with : [libshared],
1848 dependencies : [libcurl,
1849 libz,
1850 libbzip2,
1851 libxz],
1852 install_rpath : rootlibexecdir,
1853 install : true,
1854 install_dir : rootlibexecdir)
1855 public_programs += [systemd_pull, systemd_import, systemd_export]
1856 endif
1857
1858 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1859 exe = executable('systemd-journal-upload',
1860 systemd_journal_upload_sources,
1861 include_directories : includes,
1862 link_with : [libshared],
1863 dependencies : [threads,
1864 libcurl,
1865 libgnutls,
1866 libxz,
1867 liblz4],
1868 install_rpath : rootlibexecdir,
1869 install : true,
1870 install_dir : rootlibexecdir)
1871 public_programs += [exe]
1872 endif
1873
1874 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1875 s_j_remote = executable('systemd-journal-remote',
1876 systemd_journal_remote_sources,
1877 include_directories : includes,
1878 link_with : [libshared],
1879 dependencies : [threads,
1880 libmicrohttpd,
1881 libgnutls,
1882 libxz,
1883 liblz4],
1884 install_rpath : rootlibexecdir,
1885 install : true,
1886 install_dir : rootlibexecdir)
1887
1888 s_j_gatewayd = executable('systemd-journal-gatewayd',
1889 systemd_journal_gatewayd_sources,
1890 include_directories : includes,
1891 link_with : [libshared],
1892 dependencies : [threads,
1893 libmicrohttpd,
1894 libgnutls,
1895 libxz,
1896 liblz4],
1897 install_rpath : rootlibexecdir,
1898 install : true,
1899 install_dir : rootlibexecdir)
1900 public_programs += [s_j_remote, s_j_gatewayd]
1901 endif
1902
1903 if conf.get('ENABLE_COREDUMP') == 1
1904 executable('systemd-coredump',
1905 systemd_coredump_sources,
1906 include_directories : includes,
1907 link_with : [libshared],
1908 dependencies : [threads,
1909 libacl,
1910 libdw,
1911 libxz,
1912 liblz4],
1913 install_rpath : rootlibexecdir,
1914 install : true,
1915 install_dir : rootlibexecdir)
1916
1917 exe = executable('coredumpctl',
1918 coredumpctl_sources,
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [threads,
1922 libxz,
1923 liblz4],
1924 install_rpath : rootlibexecdir,
1925 install : true)
1926 public_programs += [exe]
1927 endif
1928
1929 if conf.get('ENABLE_BINFMT') == 1
1930 exe = executable('systemd-binfmt',
1931 'src/binfmt/binfmt.c',
1932 include_directories : includes,
1933 link_with : [libshared],
1934 install_rpath : rootlibexecdir,
1935 install : true,
1936 install_dir : rootlibexecdir)
1937 public_programs += [exe]
1938
1939 meson.add_install_script('sh', '-c',
1940 mkdir_p.format(binfmtdir))
1941 meson.add_install_script('sh', '-c',
1942 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1943 endif
1944
1945 if conf.get('ENABLE_VCONSOLE') == 1
1946 executable('systemd-vconsole-setup',
1947 'src/vconsole/vconsole-setup.c',
1948 include_directories : includes,
1949 link_with : [libshared],
1950 install_rpath : rootlibexecdir,
1951 install : true,
1952 install_dir : rootlibexecdir)
1953 endif
1954
1955 if conf.get('ENABLE_RANDOMSEED') == 1
1956 executable('systemd-random-seed',
1957 'src/random-seed/random-seed.c',
1958 include_directories : includes,
1959 link_with : [libshared],
1960 install_rpath : rootlibexecdir,
1961 install : true,
1962 install_dir : rootlibexecdir)
1963 endif
1964
1965 if conf.get('ENABLE_FIRSTBOOT') == 1
1966 executable('systemd-firstboot',
1967 'src/firstboot/firstboot.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 dependencies : [libcrypt],
1971 install_rpath : rootlibexecdir,
1972 install : true,
1973 install_dir : rootbindir)
1974 endif
1975
1976 executable('systemd-remount-fs',
1977 'src/remount-fs/remount-fs.c',
1978 'src/core/mount-setup.c',
1979 'src/core/mount-setup.h',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 install_rpath : rootlibexecdir,
1983 install : true,
1984 install_dir : rootlibexecdir)
1985
1986 executable('systemd-machine-id-setup',
1987 'src/machine-id-setup/machine-id-setup-main.c',
1988 'src/core/machine-id-setup.c',
1989 'src/core/machine-id-setup.h',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1993 install : true,
1994 install_dir : rootbindir)
1995
1996 executable('systemd-fsck',
1997 'src/fsck/fsck.c',
1998 include_directories : includes,
1999 link_with : [libshared],
2000 install_rpath : rootlibexecdir,
2001 install : true,
2002 install_dir : rootlibexecdir)
2003
2004 executable('systemd-growfs',
2005 'src/partition/growfs.c',
2006 include_directories : includes,
2007 link_with : [libshared],
2008 dependencies : [libcryptsetup],
2009 install_rpath : rootlibexecdir,
2010 install : true,
2011 install_dir : rootlibexecdir)
2012
2013 executable('systemd-makefs',
2014 'src/partition/makefs.c',
2015 include_directories : includes,
2016 link_with : [libshared],
2017 install_rpath : rootlibexecdir,
2018 install : true,
2019 install_dir : rootlibexecdir)
2020
2021 executable('systemd-sleep',
2022 'src/sleep/sleep.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 install_rpath : rootlibexecdir,
2026 install : true,
2027 install_dir : rootlibexecdir)
2028
2029 exe = executable('systemd-sysctl',
2030 'src/sysctl/sysctl.c',
2031 include_directories : includes,
2032 link_with : [libshared],
2033 install_rpath : rootlibexecdir,
2034 install : true,
2035 install_dir : rootlibexecdir)
2036 public_programs += [exe]
2037
2038 executable('systemd-ac-power',
2039 'src/ac-power/ac-power.c',
2040 include_directories : includes,
2041 link_with : [libshared],
2042 install_rpath : rootlibexecdir,
2043 install : true,
2044 install_dir : rootlibexecdir)
2045
2046 exe = executable('systemd-detect-virt',
2047 'src/detect-virt/detect-virt.c',
2048 include_directories : includes,
2049 link_with : [libshared],
2050 install_rpath : rootlibexecdir,
2051 install : true)
2052 public_programs += [exe]
2053
2054 exe = executable('systemd-delta',
2055 'src/delta/delta.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-escape',
2063 'src/escape/escape.c',
2064 include_directories : includes,
2065 link_with : [libshared],
2066 install_rpath : rootlibexecdir,
2067 install : true,
2068 install_dir : rootbindir)
2069 public_programs += [exe]
2070
2071 exe = executable('systemd-notify',
2072 'src/notify/notify.c',
2073 include_directories : includes,
2074 link_with : [libshared],
2075 install_rpath : rootlibexecdir,
2076 install : true,
2077 install_dir : rootbindir)
2078 public_programs += [exe]
2079
2080 executable('systemd-volatile-root',
2081 'src/volatile-root/volatile-root.c',
2082 include_directories : includes,
2083 link_with : [libshared],
2084 install_rpath : rootlibexecdir,
2085 install : true,
2086 install_dir : rootlibexecdir)
2087
2088 executable('systemd-cgroups-agent',
2089 'src/cgroups-agent/cgroups-agent.c',
2090 include_directories : includes,
2091 link_with : [libshared],
2092 install_rpath : rootlibexecdir,
2093 install : true,
2094 install_dir : rootlibexecdir)
2095
2096 exe = executable('systemd-path',
2097 'src/path/path.c',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2101 install : true)
2102 public_programs += [exe]
2103
2104 exe = executable('systemd-ask-password',
2105 'src/ask-password/ask-password.c',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 install_rpath : rootlibexecdir,
2109 install : true,
2110 install_dir : rootbindir)
2111 public_programs += [exe]
2112
2113 executable('systemd-reply-password',
2114 'src/reply-password/reply-password.c',
2115 include_directories : includes,
2116 link_with : [libshared],
2117 install_rpath : rootlibexecdir,
2118 install : true,
2119 install_dir : rootlibexecdir)
2120
2121 exe = executable('systemd-tty-ask-password-agent',
2122 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2123 include_directories : includes,
2124 link_with : [libshared],
2125 install_rpath : rootlibexecdir,
2126 install : true,
2127 install_dir : rootbindir)
2128 public_programs += [exe]
2129
2130 exe = executable('systemd-cgls',
2131 'src/cgls/cgls.c',
2132 include_directories : includes,
2133 link_with : [libshared],
2134 install_rpath : rootlibexecdir,
2135 install : true)
2136 public_programs += [exe]
2137
2138 exe = executable('systemd-cgtop',
2139 'src/cgtop/cgtop.c',
2140 include_directories : includes,
2141 link_with : [libshared],
2142 install_rpath : rootlibexecdir,
2143 install : true)
2144 public_programs += [exe]
2145
2146 executable('systemd-initctl',
2147 'src/initctl/initctl.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2151 install : true,
2152 install_dir : rootlibexecdir)
2153
2154 exe = executable('systemd-mount',
2155 'src/mount/mount-tool.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2159 install : true)
2160 public_programs += [exe]
2161
2162 meson.add_install_script(meson_make_symlink,
2163 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2164
2165 exe = executable('systemd-run',
2166 'src/run/run.c',
2167 include_directories : includes,
2168 link_with : [libshared],
2169 install_rpath : rootlibexecdir,
2170 install : true)
2171 public_programs += [exe]
2172
2173 exe = executable('systemd-stdio-bridge',
2174 'src/stdio-bridge/stdio-bridge.c',
2175 include_directories : includes,
2176 link_with : [libshared],
2177 install_rpath : rootlibexecdir,
2178 install : true)
2179 public_programs += [exe]
2180
2181 exe = executable('busctl',
2182 'src/busctl/busctl.c',
2183 'src/busctl/busctl-introspect.c',
2184 'src/busctl/busctl-introspect.h',
2185 include_directories : includes,
2186 link_with : [libshared],
2187 install_rpath : rootlibexecdir,
2188 install : true)
2189 public_programs += [exe]
2190
2191 if conf.get('ENABLE_SYSUSERS') == 1
2192 exe = executable('systemd-sysusers',
2193 'src/sysusers/sysusers.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 install_rpath : rootlibexecdir,
2197 install : true,
2198 install_dir : rootbindir)
2199 public_programs += [exe]
2200 endif
2201
2202 if conf.get('ENABLE_TMPFILES') == 1
2203 exe = executable('systemd-tmpfiles',
2204 'src/tmpfiles/tmpfiles.c',
2205 include_directories : includes,
2206 link_with : [libshared],
2207 dependencies : [libacl],
2208 install_rpath : rootlibexecdir,
2209 install : true,
2210 install_dir : rootbindir)
2211 public_programs += [exe]
2212
2213 test('test-systemd-tmpfiles',
2214 test_systemd_tmpfiles_py,
2215 args : exe.full_path())
2216 # https://github.com/mesonbuild/meson/issues/2681
2217 endif
2218
2219 if conf.get('ENABLE_HWDB') == 1
2220 exe = executable('systemd-hwdb',
2221 'src/hwdb/hwdb.c',
2222 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2223 include_directories : includes,
2224 link_with : [libudev_internal],
2225 install_rpath : udev_rpath,
2226 install : true,
2227 install_dir : rootbindir)
2228 public_programs += [exe]
2229 endif
2230
2231 if conf.get('ENABLE_QUOTACHECK') == 1
2232 executable('systemd-quotacheck',
2233 'src/quotacheck/quotacheck.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 install_rpath : rootlibexecdir,
2237 install : true,
2238 install_dir : rootlibexecdir)
2239 endif
2240
2241 exe = executable('systemd-socket-proxyd',
2242 'src/socket-proxy/socket-proxyd.c',
2243 include_directories : includes,
2244 link_with : [libshared],
2245 dependencies : [threads],
2246 install_rpath : rootlibexecdir,
2247 install : true,
2248 install_dir : rootlibexecdir)
2249 public_programs += [exe]
2250
2251 exe = executable('systemd-udevd',
2252 systemd_udevd_sources,
2253 include_directories : includes,
2254 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2255 link_with : [libudev_core,
2256 libsystemd_network,
2257 libudev_internal],
2258 dependencies : [threads,
2259 libkmod,
2260 libidn,
2261 libacl,
2262 libblkid],
2263 install_rpath : udev_rpath,
2264 install : true,
2265 install_dir : rootlibexecdir)
2266 public_programs += [exe]
2267
2268 exe = executable('udevadm',
2269 udevadm_sources,
2270 include_directories : includes,
2271 link_with : [libudev_core,
2272 libsystemd_network,
2273 libudev_internal],
2274 dependencies : [threads,
2275 libkmod,
2276 libidn,
2277 libacl,
2278 libblkid],
2279 install_rpath : udev_rpath,
2280 install : true,
2281 install_dir : rootbindir)
2282 public_programs += [exe]
2283
2284 executable('systemd-shutdown',
2285 systemd_shutdown_sources,
2286 include_directories : includes,
2287 link_with : [libshared],
2288 install_rpath : rootlibexecdir,
2289 install : true,
2290 install_dir : rootlibexecdir)
2291
2292 executable('systemd-update-done',
2293 'src/update-done/update-done.c',
2294 include_directories : includes,
2295 link_with : [libshared],
2296 install_rpath : rootlibexecdir,
2297 install : true,
2298 install_dir : rootlibexecdir)
2299
2300 executable('systemd-update-utmp',
2301 'src/update-utmp/update-utmp.c',
2302 include_directories : includes,
2303 link_with : [libshared],
2304 dependencies : [libaudit],
2305 install_rpath : rootlibexecdir,
2306 install : true,
2307 install_dir : rootlibexecdir)
2308
2309 if conf.get('HAVE_KMOD') == 1
2310 executable('systemd-modules-load',
2311 'src/modules-load/modules-load.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 dependencies : [libkmod],
2315 install_rpath : rootlibexecdir,
2316 install : true,
2317 install_dir : rootlibexecdir)
2318
2319 meson.add_install_script('sh', '-c',
2320 mkdir_p.format(modulesloaddir))
2321 meson.add_install_script('sh', '-c',
2322 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2323 endif
2324
2325 exe = executable('systemd-nspawn',
2326 systemd_nspawn_sources,
2327 'src/core/mount-setup.c', # FIXME: use a variable?
2328 'src/core/mount-setup.h',
2329 'src/core/loopback-setup.c',
2330 'src/core/loopback-setup.h',
2331 include_directories : [includes, include_directories('src/nspawn')],
2332 link_with : [libshared],
2333 dependencies : [libacl,
2334 libblkid,
2335 libseccomp,
2336 libselinux],
2337 install_rpath : rootlibexecdir,
2338 install : true)
2339 public_programs += [exe]
2340
2341 if conf.get('ENABLE_NETWORKD') == 1
2342 executable('systemd-networkd',
2343 systemd_networkd_sources,
2344 include_directories : includes,
2345 link_with : [libnetworkd_core,
2346 libsystemd_network,
2347 libudev_internal,
2348 libshared],
2349 dependencies : [threads],
2350 install_rpath : rootlibexecdir,
2351 install : true,
2352 install_dir : rootlibexecdir)
2353
2354 executable('systemd-networkd-wait-online',
2355 systemd_networkd_wait_online_sources,
2356 include_directories : includes,
2357 link_with : [libnetworkd_core,
2358 libshared],
2359 install_rpath : rootlibexecdir,
2360 install : true,
2361 install_dir : rootlibexecdir)
2362
2363 exe = executable('networkctl',
2364 networkctl_sources,
2365 include_directories : includes,
2366 link_with : [libsystemd_network,
2367 libshared],
2368 install_rpath : rootlibexecdir,
2369 install : true,
2370 install_dir : rootbindir)
2371 public_programs += [exe]
2372 endif
2373 ############################################################
2374
2375 foreach tuple : tests
2376 sources = tuple[0]
2377 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2378 dependencies = tuple[2]
2379 condition = tuple.length() >= 4 ? tuple[3] : ''
2380 type = tuple.length() >= 5 ? tuple[4] : ''
2381 defs = tuple.length() >= 6 ? tuple[5] : []
2382 incs = tuple.length() >= 7 ? tuple[6] : includes
2383 timeout = 30
2384
2385 name = sources[0].split('/')[-1].split('.')[0]
2386 if type.startswith('timeout=')
2387 timeout = type.split('=')[1].to_int()
2388 type = ''
2389 endif
2390
2391 if condition == '' or conf.get(condition) == 1
2392 exe = executable(
2393 name,
2394 sources,
2395 include_directories : incs,
2396 link_with : link_with,
2397 dependencies : dependencies,
2398 c_args : defs,
2399 install_rpath : rootlibexecdir,
2400 install : install_tests,
2401 install_dir : join_paths(testsdir, type))
2402
2403 if type == 'manual'
2404 message('@0@ is a manual test'.format(name))
2405 elif type == 'unsafe' and want_tests != 'unsafe'
2406 message('@0@ is an unsafe test'.format(name))
2407 else
2408 test(name, exe,
2409 env : test_env,
2410 timeout : timeout)
2411 endif
2412 else
2413 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2414 endif
2415 endforeach
2416
2417 test_libsystemd_sym = executable(
2418 'test-libsystemd-sym',
2419 test_libsystemd_sym_c,
2420 include_directories : includes,
2421 link_with : [libsystemd],
2422 install : install_tests,
2423 install_dir : testsdir)
2424 test('test-libsystemd-sym',
2425 test_libsystemd_sym)
2426
2427 test_libudev_sym = executable(
2428 'test-libudev-sym',
2429 test_libudev_sym_c,
2430 include_directories : includes,
2431 c_args : ['-Wno-deprecated-declarations'],
2432 link_with : [libudev],
2433 install : install_tests,
2434 install_dir : testsdir)
2435 test('test-libudev-sym',
2436 test_libudev_sym)
2437
2438 ############################################################
2439
2440 make_directive_index_py = find_program('tools/make-directive-index.py')
2441 make_man_index_py = find_program('tools/make-man-index.py')
2442 xml_helper_py = find_program('tools/xml_helper.py')
2443 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2444
2445 subdir('units')
2446 subdir('sysctl.d')
2447 subdir('sysusers.d')
2448 subdir('tmpfiles.d')
2449 subdir('presets')
2450 subdir('hwdb')
2451 subdir('network')
2452 subdir('man')
2453 subdir('shell-completion/bash')
2454 subdir('shell-completion/zsh')
2455 subdir('docs/sysvinit')
2456 subdir('docs/var-log')
2457
2458 # FIXME: figure out if the warning is true:
2459 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2460 install_subdir('factory/etc',
2461 install_dir : factorydir)
2462
2463
2464 install_data('xorg/50-systemd-user.sh',
2465 install_dir : xinitrcdir)
2466 install_data('modprobe.d/systemd.conf',
2467 install_dir : modprobedir)
2468 install_data('README',
2469 'NEWS',
2470 'CODING_STYLE',
2471 'DISTRO_PORTING',
2472 'ENVIRONMENT.md',
2473 'LICENSE.GPL2',
2474 'LICENSE.LGPL2.1',
2475 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2476 install_dir : docdir)
2477
2478 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2479 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2480
2481 ############################################################
2482
2483 meson_check_help = find_program('tools/meson-check-help.sh')
2484
2485 foreach exec : public_programs
2486 name = exec.full_path().split('/')[-1]
2487 test('check-help-' + name,
2488 meson_check_help,
2489 args : [exec.full_path()])
2490 endforeach
2491
2492 ############################################################
2493
2494 if git.found()
2495 all_files = run_command(
2496 git,
2497 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2498 'ls-files',
2499 ':/*.[ch]'])
2500 all_files = files(all_files.stdout().split())
2501
2502 custom_target(
2503 'tags',
2504 output : 'tags',
2505 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2506 custom_target(
2507 'ctags',
2508 output : 'ctags',
2509 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2510 endif
2511
2512 if git.found()
2513 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2514 run_target(
2515 'git-contrib',
2516 command : [meson_git_contrib_sh])
2517 endif
2518
2519 if git.found()
2520 git_head = run_command(
2521 git,
2522 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2523 'rev-parse', 'HEAD']).stdout().strip()
2524 git_head_short = run_command(
2525 git,
2526 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2527 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2528
2529 run_target(
2530 'git-snapshot',
2531 command : ['git', 'archive',
2532 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2533 git_head_short),
2534 '--prefix', 'systemd-@0@/'.format(git_head),
2535 'HEAD'])
2536 endif
2537
2538 ############################################################
2539
2540 status = [
2541 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2542
2543 'prefix directory: @0@'.format(prefixdir),
2544 'rootprefix directory: @0@'.format(rootprefixdir),
2545 'sysconf directory: @0@'.format(sysconfdir),
2546 'include directory: @0@'.format(includedir),
2547 'lib directory: @0@'.format(libdir),
2548 'rootlib directory: @0@'.format(rootlibdir),
2549 'SysV init scripts: @0@'.format(sysvinit_path),
2550 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2551 'PAM modules directory: @0@'.format(pamlibdir),
2552 'PAM configuration directory: @0@'.format(pamconfdir),
2553 'RPM macros directory: @0@'.format(rpmmacrosdir),
2554 'modprobe.d directory: @0@'.format(modprobedir),
2555 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2556 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2557 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2558 'bash completions directory: @0@'.format(bashcompletiondir),
2559 'zsh completions directory: @0@'.format(zshcompletiondir),
2560 'extra start script: @0@'.format(get_option('rc-local')),
2561 'extra stop script: @0@'.format(get_option('halt-local')),
2562 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2563 get_option('debug-tty')),
2564 'TTY GID: @0@'.format(tty_gid),
2565 'users GID: @0@'.format(users_gid),
2566 'maximum system UID: @0@'.format(system_uid_max),
2567 'maximum system GID: @0@'.format(system_gid_max),
2568 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2569 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2570 'minimum container UID base: @0@'.format(container_uid_base_min),
2571 'maximum container UID base: @0@'.format(container_uid_base_max),
2572 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2573 'render group access mode: @0@'.format(get_option('group-render-mode')),
2574 'certificate root directory: @0@'.format(get_option('certificate-root')),
2575 'support URL: @0@'.format(support_url),
2576 'nobody user name: @0@'.format(nobody_user),
2577 'nobody group name: @0@'.format(nobody_group),
2578 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2579 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2580
2581 'default DNSSEC mode: @0@'.format(default_dnssec),
2582 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2583 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2584
2585 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2586 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2587 status += [
2588 'default DNS servers: @0@'.format(alt_dns_servers),
2589 'default NTP servers: @0@'.format(alt_ntp_servers)]
2590
2591 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2592 '@@0@'.format(time_epoch)).stdout().strip()
2593 status += [
2594 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2595
2596 # TODO:
2597 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2598 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2599 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2600
2601 if conf.get('ENABLE_EFI') == 1
2602 status += [
2603 'efi arch: @0@'.format(efi_arch)]
2604
2605 if have_gnu_efi
2606 status += [
2607 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2608 'EFI CC @0@'.format(efi_cc),
2609 'EFI lib directory: @0@'.format(efi_libdir),
2610 'EFI lds directory: @0@'.format(efi_ldsdir),
2611 'EFI include directory: @0@'.format(efi_incdir)]
2612 endif
2613 endif
2614
2615 found = []
2616 missing = []
2617
2618 foreach tuple : [
2619 ['libcryptsetup'],
2620 ['PAM'],
2621 ['AUDIT'],
2622 ['IMA'],
2623 ['AppArmor'],
2624 ['SELinux'],
2625 ['SECCOMP'],
2626 ['SMACK'],
2627 ['zlib'],
2628 ['xz'],
2629 ['lz4'],
2630 ['bzip2'],
2631 ['ACL'],
2632 ['gcrypt'],
2633 ['qrencode'],
2634 ['microhttpd'],
2635 ['gnutls'],
2636 ['libcurl'],
2637 ['idn'],
2638 ['libidn2'],
2639 ['libidn'],
2640 ['nss-systemd'],
2641 ['libiptc'],
2642 ['elfutils'],
2643 ['binfmt'],
2644 ['vconsole'],
2645 ['quotacheck'],
2646 ['tmpfiles'],
2647 ['environment.d'],
2648 ['sysusers'],
2649 ['firstboot'],
2650 ['randomseed'],
2651 ['backlight'],
2652 ['rfkill'],
2653 ['logind'],
2654 ['machined'],
2655 ['importd'],
2656 ['hostnamed'],
2657 ['timedated'],
2658 ['timesyncd'],
2659 ['localed'],
2660 ['networkd'],
2661 ['resolve'],
2662 ['coredump'],
2663 ['polkit'],
2664 ['legacy pkla', install_polkit_pkla],
2665 ['efi'],
2666 ['gnu-efi', have_gnu_efi],
2667 ['kmod'],
2668 ['xkbcommon'],
2669 ['blkid'],
2670 ['dbus'],
2671 ['glib'],
2672 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2673 ['hwdb'],
2674 ['tpm'],
2675 ['man pages', want_man],
2676 ['html pages', want_html],
2677 ['man page indices', want_man and have_lxml],
2678 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2679 ['SysV compat'],
2680 ['utmp'],
2681 ['ldconfig'],
2682 ['hibernate'],
2683 ['adm group', get_option('adm-group')],
2684 ['wheel group', get_option('wheel-group')],
2685 ['gshadow'],
2686 ['debug hashmap'],
2687 ['debug mmap cache'],
2688 ]
2689
2690 cond = tuple.get(1, '')
2691 if cond == ''
2692 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2693 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2694 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2695 endif
2696 if cond
2697 found += [tuple[0]]
2698 else
2699 missing += [tuple[0]]
2700 endif
2701 endforeach
2702
2703 status += [
2704 '',
2705 'enabled features: @0@'.format(', '.join(found)),
2706 '',
2707 'disabled features: @0@'.format(', '.join(missing)),
2708 '']
2709 message('\n '.join(status))
2710
2711 if rootprefixdir != rootprefix_default
2712 message('WARNING:\n' +
2713 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2714 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2715 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
2716 endif