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