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