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