]> git.ipfire.org Git - thirdparty/systemd.git/blame_incremental - meson.build
meson: use "args" for setting _GNU_SOURCE when checking for functions
[thirdparty/systemd.git] / meson.build
... / ...
CommitLineData
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
18project('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
30libsystemd_version = '0.20.0'
31libudev_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!
37conf = configuration_data()
38conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
39conf.set_quoted('PACKAGE_VERSION', meson.project_version())
40
41substs = configuration_data()
42substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
43substs.set('PACKAGE_VERSION', meson.project_version())
44
45m4_defines = []
46
47#####################################################################
48
49# Try to install the git pre-commit hook
50git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
51if git_hook.returncode() == 0
52 message(git_hook.stdout().strip())
53endif
54
55#####################################################################
56
57split_usr = get_option('split-usr')
58conf.set10('HAVE_SPLIT_USR', split_usr)
59
60rootprefixdir = get_option('rootprefix')
61# Unusual rootprefixdir values are used by some distros
62# (see https://github.com/systemd/systemd/pull/7461).
63rootprefix_default = get_option('split-usr') ? '/' : '/usr'
64if rootprefixdir == ''
65 rootprefixdir = rootprefix_default
66endif
67
68sysvinit_path = get_option('sysvinit-path')
69sysvrcnd_path = get_option('sysvrcnd-path')
70have = sysvinit_path != '' and sysvrcnd_path != ''
71conf.set10('HAVE_SYSV_COMPAT', have,
72 description : 'SysV init scripts and rcN.d links are supported')
73m4_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.
78prefixdir = get_option('prefix')
79if not prefixdir.startswith('/')
80 error('Prefix is not absolute: "@0@"'.format(prefixdir))
81endif
82bindir = join_paths(prefixdir, get_option('bindir'))
83libdir = join_paths(prefixdir, get_option('libdir'))
84sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
85includedir = join_paths(prefixdir, get_option('includedir'))
86datadir = join_paths(prefixdir, get_option('datadir'))
87localstatedir = join_paths('/', get_option('localstatedir'))
88
89rootbindir = join_paths(rootprefixdir, 'bin')
90rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
91
92rootlibdir = get_option('rootlibdir')
93if rootlibdir == ''
94 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
95endif
96
97# Dirs of external packages
98pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
99pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
100polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
101polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
102polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
103varlogdir = join_paths(localstatedir, 'log')
104xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
105rpmmacrosdir = get_option('rpmmacrosdir')
106if rpmmacrosdir != 'no'
107 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
108endif
109modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
110
111# Our own paths
112pkgdatadir = join_paths(datadir, 'systemd')
113environmentdir = join_paths(prefixdir, 'lib/environment.d')
114pkgsysconfdir = join_paths(sysconfdir, 'systemd')
115userunitdir = join_paths(prefixdir, 'lib/systemd/user')
116userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
117tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
118sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
119sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
120binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
121modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
122networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
123pkgincludedir = join_paths(includedir, 'systemd')
124systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
125usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
126systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
127userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
128systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
129systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
130systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
131systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
132udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
133udevhomedir = udevlibexecdir
134udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
135udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
136catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
137kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
138factorydir = join_paths(datadir, 'factory')
139docdir = join_paths(datadir, 'doc/systemd')
140bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
141testsdir = join_paths(prefixdir, 'lib/systemd/tests')
142systemdstatedir = join_paths(localstatedir, 'lib/systemd')
143catalogstatedir = join_paths(systemdstatedir, 'catalog')
144randomseeddir = join_paths(localstatedir, 'lib/systemd')
145
146dbuspolicydir = get_option('dbuspolicydir')
147if dbuspolicydir == ''
148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
149endif
150
151dbussessionservicedir = get_option('dbussessionservicedir')
152if dbussessionservicedir == ''
153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
154endif
155
156dbussystemservicedir = get_option('dbussystemservicedir')
157if dbussystemservicedir == ''
158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
159endif
160
161pamlibdir = get_option('pamlibdir')
162if pamlibdir == ''
163 pamlibdir = join_paths(rootlibdir, 'security')
164endif
165
166pamconfdir = get_option('pamconfdir')
167if pamconfdir == ''
168 pamconfdir = join_paths(sysconfdir, 'pam.d')
169endif
170
171conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
172conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
173conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
174conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
175conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
176conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
177conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
178conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
179conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
180conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
181conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
182conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
183conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
184conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
185conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
186conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
187conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
188conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
189conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
190conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
191conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
192conf.set_quoted('ROOTPREFIX', rootprefixdir)
193conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
194conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
195conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
196conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
197conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
198conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
199conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
200conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
201conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
202conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
203conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
204conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
205conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
206conf.set_quoted('LIBDIR', libdir)
207conf.set_quoted('ROOTLIBDIR', rootlibdir)
208conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
209conf.set_quoted('BOOTLIBDIR', bootlibdir)
210conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
211conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
212conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
213conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
214conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
215conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
216
217conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
218conf.set_quoted('ABS_SRC_DIR', meson.source_root())
219
220substs.set('prefix', prefixdir)
221substs.set('exec_prefix', prefixdir)
222substs.set('libdir', libdir)
223substs.set('rootlibdir', rootlibdir)
224substs.set('includedir', includedir)
225substs.set('pkgsysconfdir', pkgsysconfdir)
226substs.set('bindir', bindir)
227substs.set('rootbindir', rootbindir)
228substs.set('rootlibexecdir', rootlibexecdir)
229substs.set('systemunitdir', systemunitdir)
230substs.set('userunitdir', userunitdir)
231substs.set('systempresetdir', systempresetdir)
232substs.set('userpresetdir', userpresetdir)
233substs.set('udevhwdbdir', udevhwdbdir)
234substs.set('udevrulesdir', udevrulesdir)
235substs.set('udevlibexecdir', udevlibexecdir)
236substs.set('catalogdir', catalogdir)
237substs.set('tmpfilesdir', tmpfilesdir)
238substs.set('sysusersdir', sysusersdir)
239substs.set('sysctldir', sysctldir)
240substs.set('binfmtdir', binfmtdir)
241substs.set('modulesloaddir', modulesloaddir)
242substs.set('systemgeneratordir', systemgeneratordir)
243substs.set('usergeneratordir', usergeneratordir)
244substs.set('systemenvgeneratordir', systemenvgeneratordir)
245substs.set('userenvgeneratordir', userenvgeneratordir)
246substs.set('systemshutdowndir', systemshutdowndir)
247substs.set('systemsleepdir', systemsleepdir)
248substs.set('VARLOGDIR', varlogdir)
249substs.set('CERTIFICATEROOT', get_option('certificate-root'))
250substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
251substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
252substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
253substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
254substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
255substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
256
257#####################################################################
258
259cc = meson.get_compiler('c')
260pkgconfig = import('pkgconfig')
261check_compilation_sh = find_program('tools/meson-check-compilation.sh')
262
263cxx = find_program('c++', required : false)
264if cxx.found()
265 # Used only for tests
266 add_languages('cpp')
267endif
268
269foreach 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
309endforeach
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.
313foreach 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
322endforeach
323
324if 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')
335endif
336
337if 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
346endif
347
348link_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
352foreach 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
364endforeach
365
366if 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
384endif
385
386cpp = ' '.join(cc.cmd_array()) + ' -E'
387
388#####################################################################
389# compilation result tests
390
391conf.set('_GNU_SOURCE', true)
392conf.set('__SANE_USERSPACE_TYPES__', true)
393
394conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
395conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
396conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
397conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
398conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
399conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
400conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
401
402decl_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
409foreach 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)
419endforeach
420
421foreach 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)
450endforeach
451
452foreach ident : ['secure_getenv', '__secure_getenv']
453 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
454endforeach
455
456foreach ident : [
457 ['memfd_create', '''#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', '''#include <sys/types.h>
461 #include <sys/stat.h>
462 #include <fcntl.h>'''],
463 ['setns', '''#include <sched.h>'''],
464 ['renameat2', '''#include <stdio.h>'''],
465 ['kcmp', '''#include <linux/kcmp.h>'''],
466 ['keyctl', '''#include <sys/types.h>
467 #include <keyutils.h>'''],
468 ['copy_file_range', '''#include <sys/syscall.h>
469 #include <unistd.h>'''],
470 ['bpf', '''#include <sys/syscall.h>
471 #include <unistd.h>'''],
472 ['explicit_bzero' , '''#include <string.h>'''],
473]
474
475 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
476 conf.set10('HAVE_' + ident[0].to_upper(), have)
477endforeach
478
479if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
480 conf.set10('USE_SYS_RANDOM_H', true)
481 conf.set10('HAVE_GETRANDOM', true)
482else
483 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
484 conf.set10('USE_SYS_RANDOM_H', false)
485 conf.set10('HAVE_GETRANDOM', have)
486endif
487
488#####################################################################
489
490sed = find_program('sed')
491awk = find_program('awk')
492m4 = find_program('m4')
493stat = find_program('stat')
494git = find_program('git', required : false)
495
496meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
497mkdir_p = 'mkdir -p $DESTDIR/@0@'
498test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
499splash_bmp = files('test/splash.bmp')
500
501# if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
502# /usr/sbin, /sbin, and fall back to the default from middle column.
503progs = [['telinit', '/lib/sysvinit/telinit'],
504 ['quotaon', '/usr/sbin/quotaon' ],
505 ['quotacheck', '/usr/sbin/quotacheck' ],
506 ['kill', '/usr/bin/kill' ],
507 ['kmod', '/usr/bin/kmod' ],
508 ['kexec', '/usr/sbin/kexec' ],
509 ['sulogin', '/usr/sbin/sulogin' ],
510 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
511 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
512 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
513 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
514 ]
515foreach prog : progs
516 path = get_option(prog[0] + '-path')
517 if path != ''
518 message('Using @1@ for @0@'.format(prog[0], path))
519 else
520 exe = find_program(prog[0],
521 '/usr/sbin/' + prog[0],
522 '/sbin/' + prog[0],
523 required: false)
524 path = exe.found() ? exe.path() : prog[1]
525 endif
526 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
527 conf.set_quoted(name, path)
528 substs.set(name, path)
529endforeach
530
531if run_command('ln', '--relative', '--help').returncode() != 0
532 error('ln does not support --relative')
533endif
534
535############################################################
536
537gperf = find_program('gperf')
538
539gperf_test_format = '''
540#include <string.h>
541const char * in_word_set(const char *, @0@);
542@1@
543'''
544gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
545gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
546gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
547if cc.compiles(gperf_test)
548 gperf_len_type = 'size_t'
549else
550 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
551 if cc.compiles(gperf_test)
552 gperf_len_type = 'unsigned'
553 else
554 error('unable to determine gperf len type')
555 endif
556endif
557message('gperf len type is @0@'.format(gperf_len_type))
558conf.set('GPERF_LEN_TYPE', gperf_len_type,
559 description : 'The type of gperf "len" parameter')
560
561############################################################
562
563if not cc.has_header('sys/capability.h')
564 error('POSIX caps headers not found')
565endif
566foreach header : ['linux/btrfs.h',
567 'linux/memfd.h',
568 'linux/vm_sockets.h',
569 'sys/auxv.h',
570 'valgrind/memcheck.h',
571 'valgrind/valgrind.h',
572 ]
573
574 conf.set10('HAVE_' + header.underscorify().to_upper(),
575 cc.has_header(header))
576endforeach
577
578############################################################
579
580conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
581conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
582gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
583
584default_hierarchy = get_option('default-hierarchy')
585conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
586 description : 'default cgroup hierarchy as string')
587if default_hierarchy == 'legacy'
588 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
589elif default_hierarchy == 'hybrid'
590 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
591else
592 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
593endif
594
595time_epoch = get_option('time-epoch')
596if time_epoch == ''
597 NEWS = files('NEWS')
598 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
599endif
600time_epoch = time_epoch.to_int()
601conf.set('TIME_EPOCH', time_epoch)
602
603system_uid_max = get_option('system-uid-max')
604if system_uid_max == ''
605 system_uid_max = run_command(
606 awk,
607 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
608 '/etc/login.defs').stdout()
609endif
610system_uid_max = system_uid_max.to_int()
611conf.set('SYSTEM_UID_MAX', system_uid_max)
612substs.set('systemuidmax', system_uid_max)
613message('maximum system UID is @0@'.format(system_uid_max))
614
615system_gid_max = get_option('system-gid-max')
616if system_gid_max == ''
617 system_gid_max = run_command(
618 awk,
619 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
620 '/etc/login.defs').stdout()
621endif
622system_gid_max = system_gid_max.to_int()
623conf.set('SYSTEM_GID_MAX', system_gid_max)
624substs.set('systemgidmax', system_gid_max)
625message('maximum system GID is @0@'.format(system_gid_max))
626
627dynamic_uid_min = get_option('dynamic-uid-min').to_int()
628dynamic_uid_max = get_option('dynamic-uid-max').to_int()
629conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
630conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
631substs.set('dynamicuidmin', dynamic_uid_min)
632substs.set('dynamicuidmax', dynamic_uid_max)
633
634container_uid_base_min = get_option('container-uid-base-min').to_int()
635container_uid_base_max = get_option('container-uid-base-max').to_int()
636conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
637conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
638substs.set('containeruidbasemin', container_uid_base_min)
639substs.set('containeruidbasemax', container_uid_base_max)
640
641nobody_user = get_option('nobody-user')
642nobody_group = get_option('nobody-group')
643
644getent_result = run_command('getent', 'passwd', '65534')
645if getent_result.returncode() == 0
646 name = getent_result.stdout().split(':')[0]
647 if name != nobody_user
648 message('WARNING:\n' +
649 ' 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) +
650 ' Your build will result in an user table setup that is incompatible with the local system.')
651 endif
652endif
653id_result = run_command('id', '-u', nobody_user)
654if id_result.returncode() == 0
655 id = id_result.stdout().to_int()
656 if id != 65534
657 message('WARNING:\n' +
658 ' 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) +
659 ' Your build will result in an user table setup that is incompatible with the local system.')
660 endif
661endif
662
663getent_result = run_command('getent', 'group', '65534')
664if getent_result.returncode() == 0
665 name = getent_result.stdout().split(':')[0]
666 if name != nobody_group
667 message('WARNING:\n' +
668 ' 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) +
669 ' Your build will result in an group table setup that is incompatible with the local system.')
670 endif
671endif
672id_result = run_command('id', '-g', nobody_group)
673if id_result.returncode() == 0
674 id = id_result.stdout().to_int()
675 if id != 65534
676 message('WARNING:\n' +
677 ' 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) +
678 ' Your build will result in an group table setup that is incompatible with the local system.')
679 endif
680endif
681if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
682 message('WARNING:\n' +
683 ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
684 ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
685endif
686
687conf.set_quoted('NOBODY_USER_NAME', nobody_user)
688conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
689substs.set('NOBODY_USER_NAME', nobody_user)
690substs.set('NOBODY_GROUP_NAME', nobody_group)
691
692tty_gid = get_option('tty-gid')
693conf.set('TTY_GID', tty_gid)
694substs.set('TTY_GID', tty_gid)
695
696# Ensure provided GID argument is numeric, otherwise fallback to default assignment
697if get_option('users-gid') != ''
698 users_gid = get_option('users-gid').to_int()
699else
700 users_gid = '-'
701endif
702substs.set('USERS_GID', users_gid)
703
704if get_option('adm-group')
705 m4_defines += ['-DENABLE_ADM_GROUP']
706endif
707
708if get_option('wheel-group')
709 m4_defines += ['-DENABLE_WHEEL_GROUP']
710endif
711
712substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
713substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
714
715kill_user_processes = get_option('default-kill-user-processes')
716conf.set10('KILL_USER_PROCESSES', kill_user_processes)
717substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
718
719dns_servers = get_option('dns-servers')
720conf.set_quoted('DNS_SERVERS', dns_servers)
721substs.set('DNS_SERVERS', dns_servers)
722
723ntp_servers = get_option('ntp-servers')
724conf.set_quoted('NTP_SERVERS', ntp_servers)
725substs.set('NTP_SERVERS', ntp_servers)
726
727conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
728
729substs.set('SUSHELL', get_option('debug-shell'))
730substs.set('DEBUGTTY', get_option('debug-tty'))
731
732debug = get_option('debug')
733enable_debug_hashmap = false
734enable_debug_mmap_cache = false
735if debug != ''
736 foreach name : debug.split(',')
737 if name == 'hashmap'
738 enable_debug_hashmap = true
739 elif name == 'mmap-cache'
740 enable_debug_mmap_cache = true
741 else
742 message('unknown debug option "@0@", ignoring'.format(name))
743 endif
744 endforeach
745endif
746conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
747conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
748
749#####################################################################
750
751threads = dependency('threads')
752librt = cc.find_library('rt')
753libm = cc.find_library('m')
754libdl = cc.find_library('dl')
755libcrypt = cc.find_library('crypt')
756
757libcap = dependency('libcap', required : false)
758if not libcap.found()
759 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
760 libcap = cc.find_library('cap')
761endif
762
763libmount = dependency('mount',
764 version : '>= 2.30')
765
766want_seccomp = get_option('seccomp')
767if want_seccomp != 'false'
768 libseccomp = dependency('libseccomp',
769 version : '>= 2.3.1',
770 required : want_seccomp == 'true')
771 have = libseccomp.found()
772else
773 have = false
774 libseccomp = []
775endif
776conf.set10('HAVE_SECCOMP', have)
777m4_defines += have ? ['-DHAVE_SECCOMP'] : []
778
779want_selinux = get_option('selinux')
780if want_selinux != 'false'
781 libselinux = dependency('libselinux',
782 version : '>= 2.1.9',
783 required : want_selinux == 'true')
784 have = libselinux.found()
785else
786 have = false
787 libselinux = []
788endif
789conf.set10('HAVE_SELINUX', have)
790m4_defines += have ? ['-DHAVE_SELINUX'] : []
791
792want_apparmor = get_option('apparmor')
793if want_apparmor != 'false'
794 libapparmor = dependency('libapparmor',
795 required : want_apparmor == 'true')
796 have = libapparmor.found()
797else
798 have = false
799 libapparmor = []
800endif
801conf.set10('HAVE_APPARMOR', have)
802m4_defines += have ? ['-DHAVE_APPARMOR'] : []
803
804smack_run_label = get_option('smack-run-label')
805if smack_run_label != ''
806 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
807 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
808endif
809
810want_polkit = get_option('polkit')
811install_polkit = false
812install_polkit_pkla = false
813if want_polkit != 'false'
814 install_polkit = true
815
816 libpolkit = dependency('polkit-gobject-1',
817 required : false)
818 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
819 message('Old polkit detected, will install pkla files')
820 install_polkit_pkla = true
821 endif
822endif
823conf.set10('ENABLE_POLKIT', install_polkit)
824
825want_acl = get_option('acl')
826if want_acl != 'false'
827 libacl = cc.find_library('acl', required : want_acl == 'true')
828 have = libacl.found()
829else
830 have = false
831 libacl = []
832endif
833conf.set10('HAVE_ACL', have)
834m4_defines += have ? ['-DHAVE_ACL'] : []
835
836want_audit = get_option('audit')
837if want_audit != 'false'
838 libaudit = dependency('audit', required : want_audit == 'true')
839 have = libaudit.found()
840else
841 have = false
842 libaudit = []
843endif
844conf.set10('HAVE_AUDIT', have)
845
846want_blkid = get_option('blkid')
847if want_blkid != 'false'
848 libblkid = dependency('blkid', required : want_blkid == 'true')
849 have = libblkid.found()
850else
851 have = false
852 libblkid = []
853endif
854conf.set10('HAVE_BLKID', have)
855
856want_kmod = get_option('kmod')
857if want_kmod != 'false'
858 libkmod = dependency('libkmod',
859 version : '>= 15',
860 required : want_kmod == 'true')
861 have = libkmod.found()
862else
863 have = false
864 libkmod = []
865endif
866conf.set10('HAVE_KMOD', have)
867
868want_pam = get_option('pam')
869if want_pam != 'false'
870 libpam = cc.find_library('pam', required : want_pam == 'true')
871 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
872 have = libpam.found() and libpam_misc.found()
873else
874 have = false
875 libpam = []
876 libpam_misc = []
877endif
878conf.set10('HAVE_PAM', have)
879m4_defines += have ? ['-DHAVE_PAM'] : []
880
881want_microhttpd = get_option('microhttpd')
882if want_microhttpd != 'false'
883 libmicrohttpd = dependency('libmicrohttpd',
884 version : '>= 0.9.33',
885 required : want_microhttpd == 'true')
886 have = libmicrohttpd.found()
887else
888 have = false
889 libmicrohttpd = []
890endif
891conf.set10('HAVE_MICROHTTPD', have)
892m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
893
894want_libcryptsetup = get_option('libcryptsetup')
895if want_libcryptsetup != 'false'
896 libcryptsetup = dependency('libcryptsetup',
897 version : '>= 1.6.0',
898 required : want_libcryptsetup == 'true')
899 have = libcryptsetup.found()
900else
901 have = false
902 libcryptsetup = []
903endif
904conf.set10('HAVE_LIBCRYPTSETUP', have)
905
906want_libcurl = get_option('libcurl')
907if want_libcurl != 'false'
908 libcurl = dependency('libcurl',
909 version : '>= 7.32.0',
910 required : want_libcurl == 'true')
911 have = libcurl.found()
912else
913 have = false
914 libcurl = []
915endif
916conf.set10('HAVE_LIBCURL', have)
917m4_defines += have ? ['-DHAVE_LIBCURL'] : []
918
919want_libidn = get_option('libidn')
920want_libidn2 = get_option('libidn2')
921if want_libidn == 'true' and want_libidn2 == 'true'
922 error('libidn and libidn2 cannot be requested simultaneously')
923endif
924
925if want_libidn != 'false' and want_libidn2 != 'true'
926 libidn = dependency('libidn',
927 required : want_libidn == 'true')
928 have = libidn.found()
929else
930 have = false
931 libidn = []
932endif
933conf.set10('HAVE_LIBIDN', have)
934m4_defines += have ? ['-DHAVE_LIBIDN'] : []
935if not have and want_libidn2 != 'false'
936 # libidn is used for both libidn and libidn2 objects
937 libidn = dependency('libidn2',
938 required : want_libidn2 == 'true')
939 have = libidn.found()
940else
941 have = false
942endif
943conf.set10('HAVE_LIBIDN2', have)
944m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
945
946want_libiptc = get_option('libiptc')
947if want_libiptc != 'false'
948 libiptc = dependency('libiptc',
949 required : want_libiptc == 'true')
950 have = libiptc.found()
951else
952 have = false
953 libiptc = []
954endif
955conf.set10('HAVE_LIBIPTC', have)
956m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
957
958want_qrencode = get_option('qrencode')
959if want_qrencode != 'false'
960 libqrencode = dependency('libqrencode',
961 required : want_qrencode == 'true')
962 have = libqrencode.found()
963else
964 have = false
965 libqrencode = []
966endif
967conf.set10('HAVE_QRENCODE', have)
968
969want_gcrypt = get_option('gcrypt')
970if want_gcrypt != 'false'
971 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
972 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
973 have = libgcrypt.found() and libgpg_error.found()
974else
975 have = false
976endif
977if not have
978 # link to neither of the libs if one is not found
979 libgcrypt = []
980 libgpg_error = []
981endif
982conf.set10('HAVE_GCRYPT', have)
983
984want_gnutls = get_option('gnutls')
985if want_gnutls != 'false'
986 libgnutls = dependency('gnutls',
987 version : '>= 3.1.4',
988 required : want_gnutls == 'true')
989 have = libgnutls.found()
990else
991 have = false
992 libgnutls = []
993endif
994conf.set10('HAVE_GNUTLS', have)
995
996want_elfutils = get_option('elfutils')
997if want_elfutils != 'false'
998 libdw = dependency('libdw',
999 required : want_elfutils == 'true')
1000 have = libdw.found()
1001else
1002 have = false
1003 libdw = []
1004endif
1005conf.set10('HAVE_ELFUTILS', have)
1006
1007want_zlib = get_option('zlib')
1008if want_zlib != 'false'
1009 libz = dependency('zlib',
1010 required : want_zlib == 'true')
1011 have = libz.found()
1012else
1013 have = false
1014 libz = []
1015endif
1016conf.set10('HAVE_ZLIB', have)
1017
1018want_bzip2 = get_option('bzip2')
1019if want_bzip2 != 'false'
1020 libbzip2 = cc.find_library('bz2',
1021 required : want_bzip2 == 'true')
1022 have = libbzip2.found()
1023else
1024 have = false
1025 libbzip2 = []
1026endif
1027conf.set10('HAVE_BZIP2', have)
1028
1029want_xz = get_option('xz')
1030if want_xz != 'false'
1031 libxz = dependency('liblzma',
1032 required : want_xz == 'true')
1033 have = libxz.found()
1034else
1035 have = false
1036 libxz = []
1037endif
1038conf.set10('HAVE_XZ', have)
1039
1040want_lz4 = get_option('lz4')
1041if want_lz4 != 'false'
1042 liblz4 = dependency('liblz4',
1043 required : want_lz4 == 'true')
1044 have = liblz4.found()
1045else
1046 have = false
1047 liblz4 = []
1048endif
1049conf.set10('HAVE_LZ4', have)
1050
1051want_xkbcommon = get_option('xkbcommon')
1052if want_xkbcommon != 'false'
1053 libxkbcommon = dependency('xkbcommon',
1054 version : '>= 0.3.0',
1055 required : want_xkbcommon == 'true')
1056 have = libxkbcommon.found()
1057else
1058 have = false
1059 libxkbcommon = []
1060endif
1061conf.set10('HAVE_XKBCOMMON', have)
1062
1063want_glib = get_option('glib')
1064if want_glib != 'false'
1065 libglib = dependency('glib-2.0',
1066 version : '>= 2.22.0',
1067 required : want_glib == 'true')
1068 libgobject = dependency('gobject-2.0',
1069 version : '>= 2.22.0',
1070 required : want_glib == 'true')
1071 libgio = dependency('gio-2.0',
1072 required : want_glib == 'true')
1073 have = libglib.found() and libgobject.found() and libgio.found()
1074else
1075 have = false
1076 libglib = []
1077 libgobject = []
1078 libgio = []
1079endif
1080conf.set10('HAVE_GLIB', have)
1081
1082want_dbus = get_option('dbus')
1083if want_dbus != 'false'
1084 libdbus = dependency('dbus-1',
1085 version : '>= 1.3.2',
1086 required : want_dbus == 'true')
1087 have = libdbus.found()
1088else
1089 have = false
1090 libdbus = []
1091endif
1092conf.set10('HAVE_DBUS', have)
1093
1094default_dnssec = get_option('default-dnssec')
1095if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1096 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1097 default_dnssec = 'no'
1098endif
1099conf.set('DEFAULT_DNSSEC_MODE',
1100 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1101substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1102
1103want_importd = get_option('importd')
1104if want_importd != 'false'
1105 have = (conf.get('HAVE_LIBCURL') == 1 and
1106 conf.get('HAVE_ZLIB') == 1 and
1107 conf.get('HAVE_BZIP2') == 1 and
1108 conf.get('HAVE_XZ') == 1 and
1109 conf.get('HAVE_GCRYPT') == 1)
1110 if want_importd == 'true' and not have
1111 error('importd support was requested, but dependencies are not available')
1112 endif
1113else
1114 have = false
1115endif
1116conf.set10('ENABLE_IMPORTD', have)
1117
1118want_remote = get_option('remote')
1119if want_remote != 'false'
1120 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1121 conf.get('HAVE_LIBCURL') == 1]
1122 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1123 # it's possible to build one without the other. Complain only if
1124 # support was explictly requested. The auxiliary files like sysusers
1125 # config should be installed when any of the programs are built.
1126 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1127 error('remote support was requested, but dependencies are not available')
1128 endif
1129 have = have_deps[0] or have_deps[1]
1130else
1131 have = false
1132endif
1133conf.set10('ENABLE_REMOTE', have)
1134
1135foreach term : ['utmp',
1136 'hibernate',
1137 'environment-d',
1138 'binfmt',
1139 'coredump',
1140 'resolve',
1141 'logind',
1142 'hostnamed',
1143 'localed',
1144 'machined',
1145 'networkd',
1146 'timedated',
1147 'timesyncd',
1148 'myhostname',
1149 'firstboot',
1150 'randomseed',
1151 'backlight',
1152 'vconsole',
1153 'quotacheck',
1154 'sysusers',
1155 'tmpfiles',
1156 'hwdb',
1157 'rfkill',
1158 'ldconfig',
1159 'efi',
1160 'tpm',
1161 'ima',
1162 'smack',
1163 'gshadow',
1164 'idn',
1165 'nss-systemd']
1166 have = get_option(term)
1167 name = 'ENABLE_' + term.underscorify().to_upper()
1168 conf.set10(name, have)
1169 m4_defines += have ? ['-D' + name] : []
1170endforeach
1171
1172want_tests = get_option('tests')
1173install_tests = get_option('install-tests')
1174tests = []
1175
1176conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1177
1178#####################################################################
1179
1180if get_option('efi')
1181 efi_arch = host_machine.cpu_family()
1182
1183 if efi_arch == 'x86'
1184 EFI_MACHINE_TYPE_NAME = 'ia32'
1185 gnu_efi_arch = 'ia32'
1186 elif efi_arch == 'x86_64'
1187 EFI_MACHINE_TYPE_NAME = 'x64'
1188 gnu_efi_arch = 'x86_64'
1189 elif efi_arch == 'arm'
1190 EFI_MACHINE_TYPE_NAME = 'arm'
1191 gnu_efi_arch = 'arm'
1192 elif efi_arch == 'aarch64'
1193 EFI_MACHINE_TYPE_NAME = 'aa64'
1194 gnu_efi_arch = 'aarch64'
1195 else
1196 EFI_MACHINE_TYPE_NAME = ''
1197 gnu_efi_arch = ''
1198 endif
1199
1200 have = true
1201 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1202
1203 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1204else
1205 have = false
1206endif
1207conf.set10('ENABLE_EFI', have)
1208
1209#####################################################################
1210
1211config_h = configure_file(
1212 output : 'config.h',
1213 configuration : conf)
1214
1215includes = include_directories('src/basic',
1216 'src/shared',
1217 'src/systemd',
1218 'src/journal',
1219 'src/resolve',
1220 'src/timesync',
1221 'src/login',
1222 'src/udev',
1223 'src/libudev',
1224 'src/core',
1225 'src/libsystemd/sd-bus',
1226 'src/libsystemd/sd-device',
1227 'src/libsystemd/sd-hwdb',
1228 'src/libsystemd/sd-id128',
1229 'src/libsystemd/sd-netlink',
1230 'src/libsystemd/sd-network',
1231 'src/libsystemd-network',
1232 '.',
1233 )
1234
1235add_project_arguments('-include', 'config.h', language : 'c')
1236
1237gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1238 'src/shared/gcrypt-util.c')
1239
1240subdir('po')
1241subdir('catalog')
1242subdir('src/systemd')
1243subdir('src/basic')
1244subdir('src/libsystemd')
1245subdir('src/libsystemd-network')
1246subdir('src/journal')
1247subdir('src/login')
1248
1249libjournal_core = static_library(
1250 'journal-core',
1251 libjournal_core_sources,
1252 journald_gperf_c,
1253 include_directories : includes,
1254 install : false)
1255
1256libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1257libsystemd = shared_library(
1258 'systemd',
1259 libsystemd_internal_sources,
1260 journal_internal_sources,
1261 version : libsystemd_version,
1262 include_directories : includes,
1263 link_args : ['-shared',
1264 '-Wl,--version-script=' + libsystemd_sym_path],
1265 link_with : [libbasic],
1266 dependencies : [threads,
1267 libgcrypt,
1268 librt,
1269 libxz,
1270 liblz4],
1271 link_depends : libsystemd_sym,
1272 install : true,
1273 install_dir : rootlibdir)
1274
1275############################################################
1276
1277# binaries that have --help and are intended for use by humans,
1278# usually, but not always, installed in /bin.
1279public_programs = []
1280
1281subdir('src/libudev')
1282subdir('src/shared')
1283subdir('src/core')
1284subdir('src/udev')
1285subdir('src/network')
1286
1287subdir('src/analyze')
1288subdir('src/journal-remote')
1289subdir('src/coredump')
1290subdir('src/hostname')
1291subdir('src/import')
1292subdir('src/kernel-install')
1293subdir('src/locale')
1294subdir('src/machine')
1295subdir('src/nspawn')
1296subdir('src/resolve')
1297subdir('src/timedate')
1298subdir('src/timesync')
1299subdir('src/vconsole')
1300subdir('src/boot/efi')
1301
1302subdir('src/test')
1303subdir('rules')
1304subdir('test')
1305
1306############################################################
1307
1308# only static linking apart from libdl, to make sure that the
1309# module is linked to all libraries that it uses.
1310test_dlopen = executable(
1311 'test-dlopen',
1312 test_dlopen_c,
1313 include_directories : includes,
1314 link_with : [libbasic],
1315 dependencies : [libdl])
1316
1317foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1318 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1319 ['mymachines', 'ENABLE_MACHINED'],
1320 ['resolve', 'ENABLE_RESOLVE']]
1321
1322 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1323 if condition
1324 module = tuple[0]
1325
1326 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1327 version_script_arg = join_paths(meson.current_source_dir(), sym)
1328
1329 nss = shared_library(
1330 'nss_' + module,
1331 'src/nss-@0@/nss-@0@.c'.format(module),
1332 version : '2',
1333 include_directories : includes,
1334 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1335 link_args : ['-Wl,-z,nodelete',
1336 '-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
1357endforeach
1358
1359############################################################
1360
1361executable('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
1376exe = 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)
1389public_programs += [exe]
1390
1391executable('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
1404exe = 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)
1412public_programs += [exe]
1413
1414exe = 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)
1425public_programs += [exe]
1426
1427executable('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
1435executable('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
1443executable('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
1452if 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'))
1464endif
1465
1466if 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)
1482endif
1483
1484if 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]
1503endif
1504
1505if 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]
1533endif
1534
1535if 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
1590endif
1591
1592if 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)
1600endif
1601
1602if 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]
1611endif
1612
1613exe = 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)
1619public_programs += [exe]
1620
1621exe = 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)
1632public_programs += [exe]
1633
1634if 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)
1642endif
1643
1644if 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)
1652endif
1653
1654executable('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
1662if 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)
1698endif
1699
1700if 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)
1716endif
1717
1718if 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]
1734endif
1735
1736if 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]
1760endif
1761
1762if 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]
1778endif
1779
1780if 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)
1790endif
1791
1792if 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]
1813endif
1814
1815if 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]
1862endif
1863
1864if 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]
1878endif
1879
1880if 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]
1907endif
1908
1909if 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]
1933endif
1934
1935if 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')))
1949endif
1950
1951if 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)
1959endif
1960
1961if 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)
1969endif
1970
1971if 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)
1980endif
1981
1982executable('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
1992executable('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
2002executable('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
2010executable('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
2019executable('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
2027executable('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
2035exe = 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)
2042public_programs += [exe]
2043
2044executable('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
2052exe = 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)
2058public_programs += [exe]
2059
2060exe = executable('systemd-delta',
2061 'src/delta/delta.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 install_rpath : rootlibexecdir,
2065 install : true)
2066public_programs += [exe]
2067
2068exe = 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)
2075public_programs += [exe]
2076
2077exe = 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)
2084public_programs += [exe]
2085
2086executable('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
2094executable('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
2102exe = executable('systemd-path',
2103 'src/path/path.c',
2104 include_directories : includes,
2105 link_with : [libshared],
2106 install_rpath : rootlibexecdir,
2107 install : true)
2108public_programs += [exe]
2109
2110exe = 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)
2117public_programs += [exe]
2118
2119executable('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
2127exe = 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)
2134public_programs += [exe]
2135
2136exe = executable('systemd-cgls',
2137 'src/cgls/cgls.c',
2138 include_directories : includes,
2139 link_with : [libshared],
2140 install_rpath : rootlibexecdir,
2141 install : true)
2142public_programs += [exe]
2143
2144exe = executable('systemd-cgtop',
2145 'src/cgtop/cgtop.c',
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2149 install : true)
2150public_programs += [exe]
2151
2152executable('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
2160exe = executable('systemd-mount',
2161 'src/mount/mount-tool.c',
2162 include_directories : includes,
2163 link_with : [libshared],
2164 install_rpath : rootlibexecdir,
2165 install : true)
2166public_programs += [exe]
2167
2168meson.add_install_script(meson_make_symlink,
2169 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2170
2171exe = executable('systemd-run',
2172 'src/run/run.c',
2173 include_directories : includes,
2174 link_with : [libshared],
2175 install_rpath : rootlibexecdir,
2176 install : true)
2177public_programs += [exe]
2178
2179exe = 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)
2185public_programs += [exe]
2186
2187exe = 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)
2195public_programs += [exe]
2196
2197if 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]
2206endif
2207
2208if 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
2223endif
2224
2225if 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]
2235endif
2236
2237if 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)
2245endif
2246
2247exe = 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)
2255public_programs += [exe]
2256
2257exe = 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)
2272public_programs += [exe]
2273
2274exe = executable('udevadm',
2275 udevadm_sources,
2276 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2277 include_directories : includes,
2278 link_with : [libudev_core,
2279 libsystemd_network,
2280 libudev_internal],
2281 dependencies : [threads,
2282 libkmod,
2283 libidn,
2284 libacl,
2285 libblkid],
2286 install_rpath : udev_rpath,
2287 install : true,
2288 install_dir : rootbindir)
2289public_programs += [exe]
2290
2291executable('systemd-shutdown',
2292 systemd_shutdown_sources,
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2296 install : true,
2297 install_dir : rootlibexecdir)
2298
2299executable('systemd-update-done',
2300 'src/update-done/update-done.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2304 install : true,
2305 install_dir : rootlibexecdir)
2306
2307executable('systemd-update-utmp',
2308 'src/update-utmp/update-utmp.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 dependencies : [libaudit],
2312 install_rpath : rootlibexecdir,
2313 install : true,
2314 install_dir : rootlibexecdir)
2315
2316if conf.get('HAVE_KMOD') == 1
2317 executable('systemd-modules-load',
2318 'src/modules-load/modules-load.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 dependencies : [libkmod],
2322 install_rpath : rootlibexecdir,
2323 install : true,
2324 install_dir : rootlibexecdir)
2325
2326 meson.add_install_script('sh', '-c',
2327 mkdir_p.format(modulesloaddir))
2328 meson.add_install_script('sh', '-c',
2329 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2330endif
2331
2332exe = executable('systemd-nspawn',
2333 systemd_nspawn_sources,
2334 'src/core/mount-setup.c', # FIXME: use a variable?
2335 'src/core/mount-setup.h',
2336 'src/core/loopback-setup.c',
2337 'src/core/loopback-setup.h',
2338 include_directories : [includes, include_directories('src/nspawn')],
2339 link_with : [libshared],
2340 dependencies : [libacl,
2341 libblkid,
2342 libseccomp,
2343 libselinux],
2344 install_rpath : rootlibexecdir,
2345 install : true)
2346public_programs += [exe]
2347
2348if conf.get('ENABLE_NETWORKD') == 1
2349 executable('systemd-networkd',
2350 systemd_networkd_sources,
2351 include_directories : includes,
2352 link_with : [libnetworkd_core,
2353 libsystemd_network,
2354 libudev_internal,
2355 libshared],
2356 dependencies : [threads],
2357 install_rpath : rootlibexecdir,
2358 install : true,
2359 install_dir : rootlibexecdir)
2360
2361 executable('systemd-networkd-wait-online',
2362 systemd_networkd_wait_online_sources,
2363 include_directories : includes,
2364 link_with : [libnetworkd_core,
2365 libshared],
2366 install_rpath : rootlibexecdir,
2367 install : true,
2368 install_dir : rootlibexecdir)
2369
2370 exe = executable('networkctl',
2371 networkctl_sources,
2372 include_directories : includes,
2373 link_with : [libsystemd_network,
2374 libshared],
2375 install_rpath : rootlibexecdir,
2376 install : true,
2377 install_dir : rootbindir)
2378 public_programs += [exe]
2379endif
2380
2381executable('systemd-sulogin-shell',
2382 ['src/sulogin-shell/sulogin-shell.c'],
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2386 install : true,
2387 install_dir : rootlibexecdir)
2388
2389############################################################
2390
2391foreach tuple : tests
2392 sources = tuple[0]
2393 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2394 dependencies = tuple[2]
2395 condition = tuple.length() >= 4 ? tuple[3] : ''
2396 type = tuple.length() >= 5 ? tuple[4] : ''
2397 defs = tuple.length() >= 6 ? tuple[5] : []
2398 incs = tuple.length() >= 7 ? tuple[6] : includes
2399 timeout = 30
2400
2401 name = sources[0].split('/')[-1].split('.')[0]
2402 if type.startswith('timeout=')
2403 timeout = type.split('=')[1].to_int()
2404 type = ''
2405 endif
2406
2407 if condition == '' or conf.get(condition) == 1
2408 exe = executable(
2409 name,
2410 sources,
2411 include_directories : incs,
2412 link_with : link_with,
2413 dependencies : dependencies,
2414 c_args : defs,
2415 install_rpath : rootlibexecdir,
2416 install : install_tests,
2417 install_dir : join_paths(testsdir, type))
2418
2419 if type == 'manual'
2420 message('@0@ is a manual test'.format(name))
2421 elif type == 'unsafe' and want_tests != 'unsafe'
2422 message('@0@ is an unsafe test'.format(name))
2423 else
2424 test(name, exe,
2425 env : test_env,
2426 timeout : timeout)
2427 endif
2428 else
2429 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2430 endif
2431endforeach
2432
2433test_libsystemd_sym = executable(
2434 'test-libsystemd-sym',
2435 test_libsystemd_sym_c,
2436 include_directories : includes,
2437 link_with : [libsystemd],
2438 install : install_tests,
2439 install_dir : testsdir)
2440test('test-libsystemd-sym',
2441 test_libsystemd_sym)
2442
2443test_libudev_sym = executable(
2444 'test-libudev-sym',
2445 test_libudev_sym_c,
2446 include_directories : includes,
2447 c_args : ['-Wno-deprecated-declarations'],
2448 link_with : [libudev],
2449 install : install_tests,
2450 install_dir : testsdir)
2451test('test-libudev-sym',
2452 test_libudev_sym)
2453
2454############################################################
2455
2456make_directive_index_py = find_program('tools/make-directive-index.py')
2457make_man_index_py = find_program('tools/make-man-index.py')
2458xml_helper_py = find_program('tools/xml_helper.py')
2459hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2460
2461subdir('units')
2462subdir('sysctl.d')
2463subdir('sysusers.d')
2464subdir('tmpfiles.d')
2465subdir('presets')
2466subdir('hwdb')
2467subdir('network')
2468subdir('man')
2469subdir('shell-completion/bash')
2470subdir('shell-completion/zsh')
2471subdir('docs/sysvinit')
2472subdir('docs/var-log')
2473
2474# FIXME: figure out if the warning is true:
2475# https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2476install_subdir('factory/etc',
2477 install_dir : factorydir)
2478
2479
2480install_data('xorg/50-systemd-user.sh',
2481 install_dir : xinitrcdir)
2482install_data('modprobe.d/systemd.conf',
2483 install_dir : modprobedir)
2484install_data('README',
2485 'NEWS',
2486 'CODING_STYLE',
2487 'DISTRO_PORTING',
2488 'ENVIRONMENT.md',
2489 'LICENSE.GPL2',
2490 'LICENSE.LGPL2.1',
2491 'TRANSIENT-SETTINGS.md',
2492 'UIDS-GIDS.md',
2493 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2494 install_dir : docdir)
2495
2496meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2497meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2498
2499############################################################
2500
2501meson_check_help = find_program('tools/meson-check-help.sh')
2502
2503foreach exec : public_programs
2504 name = exec.full_path().split('/')[-1]
2505 test('check-help-' + name,
2506 meson_check_help,
2507 args : [exec.full_path()])
2508endforeach
2509
2510############################################################
2511
2512if git.found()
2513 all_files = run_command(
2514 git,
2515 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2516 'ls-files',
2517 ':/*.[ch]'])
2518 all_files = files(all_files.stdout().split())
2519
2520 custom_target(
2521 'tags',
2522 output : 'tags',
2523 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2524 custom_target(
2525 'ctags',
2526 output : 'ctags',
2527 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2528endif
2529
2530if git.found()
2531 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2532 run_target(
2533 'git-contrib',
2534 command : [meson_git_contrib_sh])
2535endif
2536
2537if git.found()
2538 git_head = run_command(
2539 git,
2540 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2541 'rev-parse', 'HEAD']).stdout().strip()
2542 git_head_short = run_command(
2543 git,
2544 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2545 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2546
2547 run_target(
2548 'git-snapshot',
2549 command : ['git', 'archive',
2550 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2551 git_head_short),
2552 '--prefix', 'systemd-@0@/'.format(git_head),
2553 'HEAD'])
2554endif
2555
2556############################################################
2557
2558status = [
2559 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2560
2561 'prefix directory: @0@'.format(prefixdir),
2562 'rootprefix directory: @0@'.format(rootprefixdir),
2563 'sysconf directory: @0@'.format(sysconfdir),
2564 'include directory: @0@'.format(includedir),
2565 'lib directory: @0@'.format(libdir),
2566 'rootlib directory: @0@'.format(rootlibdir),
2567 'SysV init scripts: @0@'.format(sysvinit_path),
2568 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2569 'PAM modules directory: @0@'.format(pamlibdir),
2570 'PAM configuration directory: @0@'.format(pamconfdir),
2571 'RPM macros directory: @0@'.format(rpmmacrosdir),
2572 'modprobe.d directory: @0@'.format(modprobedir),
2573 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2574 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2575 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2576 'bash completions directory: @0@'.format(bashcompletiondir),
2577 'zsh completions directory: @0@'.format(zshcompletiondir),
2578 'extra start script: @0@'.format(get_option('rc-local')),
2579 'extra stop script: @0@'.format(get_option('halt-local')),
2580 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2581 get_option('debug-tty')),
2582 'TTY GID: @0@'.format(tty_gid),
2583 'users GID: @0@'.format(users_gid),
2584 'maximum system UID: @0@'.format(system_uid_max),
2585 'maximum system GID: @0@'.format(system_gid_max),
2586 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2587 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2588 'minimum container UID base: @0@'.format(container_uid_base_min),
2589 'maximum container UID base: @0@'.format(container_uid_base_max),
2590 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2591 'render group access mode: @0@'.format(get_option('group-render-mode')),
2592 'certificate root directory: @0@'.format(get_option('certificate-root')),
2593 'support URL: @0@'.format(support_url),
2594 'nobody user name: @0@'.format(nobody_user),
2595 'nobody group name: @0@'.format(nobody_group),
2596 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2597 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2598
2599 'default DNSSEC mode: @0@'.format(default_dnssec),
2600 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2601 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2602
2603alt_dns_servers = '\n '.join(dns_servers.split(' '))
2604alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2605status += [
2606 'default DNS servers: @0@'.format(alt_dns_servers),
2607 'default NTP servers: @0@'.format(alt_ntp_servers)]
2608
2609alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2610 '@@0@'.format(time_epoch)).stdout().strip()
2611status += [
2612 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2613
2614# TODO:
2615# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2616# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2617# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2618
2619if conf.get('ENABLE_EFI') == 1
2620 status += [
2621 'efi arch: @0@'.format(efi_arch)]
2622
2623 if have_gnu_efi
2624 status += [
2625 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2626 'EFI CC @0@'.format(efi_cc),
2627 'EFI lib directory: @0@'.format(efi_libdir),
2628 'EFI lds directory: @0@'.format(efi_ldsdir),
2629 'EFI include directory: @0@'.format(efi_incdir)]
2630 endif
2631endif
2632
2633found = []
2634missing = []
2635
2636foreach tuple : [
2637 ['libcryptsetup'],
2638 ['PAM'],
2639 ['AUDIT'],
2640 ['IMA'],
2641 ['AppArmor'],
2642 ['SELinux'],
2643 ['SECCOMP'],
2644 ['SMACK'],
2645 ['zlib'],
2646 ['xz'],
2647 ['lz4'],
2648 ['bzip2'],
2649 ['ACL'],
2650 ['gcrypt'],
2651 ['qrencode'],
2652 ['microhttpd'],
2653 ['gnutls'],
2654 ['libcurl'],
2655 ['idn'],
2656 ['libidn2'],
2657 ['libidn'],
2658 ['nss-systemd'],
2659 ['libiptc'],
2660 ['elfutils'],
2661 ['binfmt'],
2662 ['vconsole'],
2663 ['quotacheck'],
2664 ['tmpfiles'],
2665 ['environment.d'],
2666 ['sysusers'],
2667 ['firstboot'],
2668 ['randomseed'],
2669 ['backlight'],
2670 ['rfkill'],
2671 ['logind'],
2672 ['machined'],
2673 ['importd'],
2674 ['hostnamed'],
2675 ['timedated'],
2676 ['timesyncd'],
2677 ['localed'],
2678 ['networkd'],
2679 ['resolve'],
2680 ['coredump'],
2681 ['polkit'],
2682 ['legacy pkla', install_polkit_pkla],
2683 ['efi'],
2684 ['gnu-efi', have_gnu_efi],
2685 ['kmod'],
2686 ['xkbcommon'],
2687 ['blkid'],
2688 ['dbus'],
2689 ['glib'],
2690 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2691 ['hwdb'],
2692 ['tpm'],
2693 ['man pages', want_man],
2694 ['html pages', want_html],
2695 ['man page indices', want_man and have_lxml],
2696 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2697 ['SysV compat'],
2698 ['utmp'],
2699 ['ldconfig'],
2700 ['hibernate'],
2701 ['adm group', get_option('adm-group')],
2702 ['wheel group', get_option('wheel-group')],
2703 ['gshadow'],
2704 ['debug hashmap'],
2705 ['debug mmap cache'],
2706]
2707
2708 cond = tuple.get(1, '')
2709 if cond == ''
2710 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2711 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2712 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2713 endif
2714 if cond
2715 found += [tuple[0]]
2716 else
2717 missing += [tuple[0]]
2718 endif
2719endforeach
2720
2721status += [
2722 '',
2723 'enabled features: @0@'.format(', '.join(found)),
2724 '',
2725 'disabled features: @0@'.format(', '.join(missing)),
2726 '']
2727message('\n '.join(status))
2728
2729if rootprefixdir != rootprefix_default
2730 message('WARNING:\n' +
2731 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2732 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2733 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
2734endif