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