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