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