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