]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
Merge pull request #7560 from poettering/refactor-main
[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')
1295subdir('src/sulogin-shell')
1296subdir('src/boot/efi')
1297
1298subdir('src/test')
6b97bf22 1299subdir('rules')
83b6af36
ZJS
1300subdir('test')
1301
1302############################################################
1303
1304# only static linking apart from libdl, to make sure that the
1305# module is linked to all libraries that it uses.
1306test_dlopen = executable(
37efbbd8
ZJS
1307 'test-dlopen',
1308 test_dlopen_c,
1309 include_directories : includes,
1310 link_with : [libbasic],
1311 dependencies : [libdl])
83b6af36 1312
08cf5b8d 1313foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
e7e11bbf 1314 ['systemd', 'ENABLE_NSS_SYSTEMD'],
5486a31d 1315 ['mymachines', 'ENABLE_MACHINED'],
1ec57f33 1316 ['resolve', 'ENABLE_RESOLVE']]
5c23128d 1317
349cc4a5 1318 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1319 if condition
1320 module = tuple[0]
37efbbd8
ZJS
1321
1322 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1323 version_script_arg = join_paths(meson.current_source_dir(), sym)
1324
1325 nss = shared_library(
1326 'nss_' + module,
1327 'src/nss-@0@/nss-@0@.c'.format(module),
1328 version : '2',
1329 include_directories : includes,
1330 link_args : ['-shared',
1331 '-Wl,--version-script=' + version_script_arg,
1332 '-Wl,--undefined'],
1333 link_with : [libsystemd_internal,
1334 libbasic],
1335 dependencies : [threads,
5486a31d 1336 librt],
37efbbd8
ZJS
1337 link_depends : sym,
1338 install : true,
1339 install_dir : rootlibdir)
1340
1341 # We cannot use shared_module because it does not support version suffix.
1342 # Unfortunately shared_library insists on creating the symlink…
1343 meson.add_install_script('sh', '-c',
1344 'rm $DESTDIR@0@/libnss_@1@.so'
1345 .format(rootlibdir, module))
1346
1347 test('dlopen-nss_' + module,
1348 test_dlopen,
1349 args : [nss.full_path()]) # path to dlopen must include a slash
1350 endif
5c23128d
ZJS
1351endforeach
1352
1353############################################################
1354
5c23128d
ZJS
1355executable('systemd',
1356 systemd_sources,
1357 include_directories : includes,
1358 link_with : [libcore,
34ce0a52 1359 libshared],
5c23128d
ZJS
1360 dependencies : [threads,
1361 librt,
1362 libseccomp,
1363 libselinux,
f4ee10a2
ZJS
1364 libmount,
1365 libblkid],
421f0012 1366 install_rpath : rootlibexecdir,
5c23128d
ZJS
1367 install : true,
1368 install_dir : rootlibexecdir)
1369
005a29f2
ZJS
1370exe = executable('systemd-analyze',
1371 systemd_analyze_sources,
1372 include_directories : includes,
1373 link_with : [libcore,
005a29f2
ZJS
1374 libshared],
1375 dependencies : [threads,
1376 librt,
1377 libseccomp,
1378 libselinux,
1379 libmount,
1380 libblkid],
1381 install_rpath : rootlibexecdir,
1382 install : true)
1383public_programs += [exe]
5c23128d
ZJS
1384
1385executable('systemd-journald',
1386 systemd_journald_sources,
1387 include_directories : includes,
aac26058 1388 link_with : [libjournal_core,
34ce0a52 1389 libshared],
5c23128d
ZJS
1390 dependencies : [threads,
1391 libxz,
aac26058
ZJS
1392 liblz4,
1393 libselinux],
421f0012 1394 install_rpath : rootlibexecdir,
5c23128d
ZJS
1395 install : true,
1396 install_dir : rootlibexecdir)
1397
005a29f2
ZJS
1398exe = executable('systemd-cat',
1399 systemd_cat_sources,
1400 include_directories : includes,
1401 link_with : [libjournal_core,
34ce0a52 1402 libshared],
005a29f2
ZJS
1403 dependencies : [threads],
1404 install_rpath : rootlibexecdir,
1405 install : true)
1406public_programs += [exe]
1407
1408exe = executable('journalctl',
1409 journalctl_sources,
1410 include_directories : includes,
34ce0a52 1411 link_with : [libshared],
005a29f2
ZJS
1412 dependencies : [threads,
1413 libqrencode,
1414 libxz,
1415 liblz4],
1416 install_rpath : rootlibexecdir,
1417 install : true,
1418 install_dir : rootbindir)
1419public_programs += [exe]
5c23128d
ZJS
1420
1421executable('systemd-getty-generator',
1422 'src/getty-generator/getty-generator.c',
5c23128d 1423 include_directories : includes,
b2fc5836
ZJS
1424 link_with : [libshared],
1425 install_rpath : rootlibexecdir,
1426 install : true,
1427 install_dir : systemgeneratordir)
5c23128d
ZJS
1428
1429executable('systemd-debug-generator',
1430 'src/debug-generator/debug-generator.c',
5c23128d 1431 include_directories : includes,
b2fc5836
ZJS
1432 link_with : [libshared],
1433 install_rpath : rootlibexecdir,
1434 install : true,
1435 install_dir : systemgeneratordir)
5c23128d
ZJS
1436
1437executable('systemd-fstab-generator',
1438 'src/fstab-generator/fstab-generator.c',
1439 'src/core/mount-setup.c',
5c23128d 1440 include_directories : includes,
b2fc5836
ZJS
1441 link_with : [libshared],
1442 install_rpath : rootlibexecdir,
1443 install : true,
1444 install_dir : systemgeneratordir)
5c23128d 1445
349cc4a5 1446if conf.get('ENABLE_ENVIRONMENT_D') == 1
37efbbd8
ZJS
1447 executable('30-systemd-environment-d-generator',
1448 'src/environment-d-generator/environment-d-generator.c',
1449 include_directories : includes,
1450 link_with : [libshared],
1451 install_rpath : rootlibexecdir,
1452 install : true,
1453 install_dir : userenvgeneratordir)
7b76fce1 1454
37efbbd8
ZJS
1455 meson.add_install_script(meson_make_symlink,
1456 join_paths(sysconfdir, 'environment'),
1457 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1458endif
1459
349cc4a5 1460if conf.get('ENABLE_HIBERNATE') == 1
37efbbd8
ZJS
1461 executable('systemd-hibernate-resume-generator',
1462 'src/hibernate-resume/hibernate-resume-generator.c',
1463 include_directories : includes,
1464 link_with : [libshared],
1465 install_rpath : rootlibexecdir,
1466 install : true,
1467 install_dir : systemgeneratordir)
5c23128d 1468
37efbbd8
ZJS
1469 executable('systemd-hibernate-resume',
1470 'src/hibernate-resume/hibernate-resume.c',
005a29f2
ZJS
1471 include_directories : includes,
1472 link_with : [libshared],
1473 install_rpath : rootlibexecdir,
1474 install : true,
1475 install_dir : rootlibexecdir)
37efbbd8
ZJS
1476endif
1477
349cc4a5 1478if conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1479 executable('systemd-gpt-auto-generator',
1480 'src/gpt-auto-generator/gpt-auto-generator.c',
1481 'src/basic/blkid-util.h',
1482 include_directories : includes,
34ce0a52 1483 link_with : [libshared],
37efbbd8
ZJS
1484 dependencies : libblkid,
1485 install_rpath : rootlibexecdir,
1486 install : true,
1487 install_dir : systemgeneratordir)
1488
1489 exe = executable('systemd-dissect',
1490 'src/dissect/dissect.c',
1491 include_directories : includes,
1492 link_with : [libshared],
1493 install_rpath : rootlibexecdir,
1494 install : true,
1495 install_dir : rootlibexecdir)
1496 public_programs += [exe]
5c23128d
ZJS
1497endif
1498
1ec57f33 1499if conf.get('ENABLE_RESOLVE') == 1
37efbbd8
ZJS
1500 executable('systemd-resolved',
1501 systemd_resolved_sources,
76c87410 1502 gcrypt_util_sources,
005a29f2 1503 include_directories : includes,
aac26058 1504 link_with : [libshared],
005a29f2 1505 dependencies : [threads,
76c87410
MB
1506 libgcrypt,
1507 libgpg_error,
005a29f2
ZJS
1508 libm,
1509 libidn],
1510 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1511 install : true,
1512 install_dir : rootlibexecdir)
1513
1514 exe = executable('systemd-resolve',
1515 systemd_resolve_sources,
76c87410 1516 gcrypt_util_sources,
37efbbd8
ZJS
1517 include_directories : includes,
1518 link_with : [libshared],
1519 dependencies : [threads,
76c87410
MB
1520 libgcrypt,
1521 libgpg_error,
37efbbd8
ZJS
1522 libm,
1523 libidn],
1524 install_rpath : rootlibexecdir,
1525 install : true)
1526 public_programs += [exe]
5c23128d
ZJS
1527endif
1528
349cc4a5 1529if conf.get('ENABLE_LOGIND') == 1
37efbbd8
ZJS
1530 executable('systemd-logind',
1531 systemd_logind_sources,
005a29f2 1532 include_directories : includes,
37efbbd8 1533 link_with : [liblogind_core,
34ce0a52 1534 libshared],
005a29f2 1535 dependencies : [threads,
37efbbd8 1536 libacl],
005a29f2
ZJS
1537 install_rpath : rootlibexecdir,
1538 install : true,
37efbbd8
ZJS
1539 install_dir : rootlibexecdir)
1540
1541 exe = executable('loginctl',
1542 loginctl_sources,
1543 include_directories : includes,
34ce0a52 1544 link_with : [libshared],
37efbbd8
ZJS
1545 dependencies : [threads,
1546 liblz4,
1547 libxz],
1548 install_rpath : rootlibexecdir,
1549 install : true,
1550 install_dir : rootbindir)
1551 public_programs += [exe]
1552
1553 exe = executable('systemd-inhibit',
1554 'src/login/inhibit.c',
1555 include_directories : includes,
1556 link_with : [libshared],
1557 install_rpath : rootlibexecdir,
1558 install : true,
1559 install_dir : rootbindir)
1560 public_programs += [exe]
1561
349cc4a5 1562 if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1563 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1564 pam_systemd = shared_library(
1565 'pam_systemd',
1566 pam_systemd_c,
1567 name_prefix : '',
1568 include_directories : includes,
1569 link_args : ['-shared',
1570 '-Wl,--version-script=' + version_script_arg],
1571 link_with : [libsystemd_internal,
1572 libshared_static],
1573 dependencies : [threads,
1574 libpam,
1575 libpam_misc],
1576 link_depends : pam_systemd_sym,
1577 install : true,
1578 install_dir : pamlibdir)
1579
1580 test('dlopen-pam_systemd',
1581 test_dlopen,
1582 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1583 endif
1584endif
005a29f2 1585
349cc4a5 1586if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1587 executable('systemd-user-sessions',
1588 'src/user-sessions/user-sessions.c',
005a29f2 1589 include_directories : includes,
aac26058 1590 link_with : [libshared],
005a29f2
ZJS
1591 install_rpath : rootlibexecdir,
1592 install : true,
37efbbd8 1593 install_dir : rootlibexecdir)
5c23128d
ZJS
1594endif
1595
349cc4a5 1596if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1597 exe = executable('bootctl',
1598 'src/boot/bootctl.c',
1599 include_directories : includes,
1600 link_with : [libshared],
1601 dependencies : [libblkid],
1602 install_rpath : rootlibexecdir,
1603 install : true)
1604 public_programs += [exe]
005a29f2
ZJS
1605endif
1606
1607exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1608 include_directories : includes,
1609 link_with : [libshared],
1610 dependencies : [threads],
1611 install_rpath : rootlibexecdir,
1612 install : true)
1613public_programs += [exe]
1614
1615exe = executable('systemctl', 'src/systemctl/systemctl.c',
1616 include_directories : includes,
aac26058 1617 link_with : [libshared],
005a29f2
ZJS
1618 dependencies : [threads,
1619 libcap,
1620 libselinux,
1621 libxz,
1622 liblz4],
1623 install_rpath : rootlibexecdir,
1624 install : true,
1625 install_dir : rootbindir)
1626public_programs += [exe]
5c23128d 1627
349cc4a5 1628if conf.get('ENABLE_BACKLIGHT') == 1
37efbbd8
ZJS
1629 executable('systemd-backlight',
1630 'src/backlight/backlight.c',
1631 include_directories : includes,
34ce0a52 1632 link_with : [libshared],
37efbbd8
ZJS
1633 install_rpath : rootlibexecdir,
1634 install : true,
1635 install_dir : rootlibexecdir)
5c23128d
ZJS
1636endif
1637
349cc4a5 1638if conf.get('ENABLE_RFKILL') == 1
37efbbd8
ZJS
1639 executable('systemd-rfkill',
1640 'src/rfkill/rfkill.c',
1641 include_directories : includes,
34ce0a52 1642 link_with : [libshared],
37efbbd8
ZJS
1643 install_rpath : rootlibexecdir,
1644 install : true,
1645 install_dir : rootlibexecdir)
5c23128d
ZJS
1646endif
1647
1648executable('systemd-system-update-generator',
1649 'src/system-update-generator/system-update-generator.c',
1650 include_directories : includes,
1651 link_with : [libshared],
b2fc5836 1652 install_rpath : rootlibexecdir,
5c23128d
ZJS
1653 install : true,
1654 install_dir : systemgeneratordir)
1655
349cc4a5 1656if conf.get('HAVE_LIBCRYPTSETUP') == 1
37efbbd8
ZJS
1657 executable('systemd-cryptsetup',
1658 'src/cryptsetup/cryptsetup.c',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 dependencies : [libcryptsetup],
1662 install_rpath : rootlibexecdir,
1663 install : true,
1664 install_dir : rootlibexecdir)
1665
1666 executable('systemd-cryptsetup-generator',
1667 'src/cryptsetup/cryptsetup-generator.c',
1668 include_directories : includes,
1669 link_with : [libshared],
1670 dependencies : [libcryptsetup],
1671 install_rpath : rootlibexecdir,
1672 install : true,
1673 install_dir : systemgeneratordir)
1674
1675 executable('systemd-veritysetup',
1676 'src/veritysetup/veritysetup.c',
1677 include_directories : includes,
1678 link_with : [libshared],
1679 dependencies : [libcryptsetup],
1680 install_rpath : rootlibexecdir,
1681 install : true,
1682 install_dir : rootlibexecdir)
1683
1684 executable('systemd-veritysetup-generator',
1685 'src/veritysetup/veritysetup-generator.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 dependencies : [libcryptsetup],
1689 install_rpath : rootlibexecdir,
1690 install : true,
1691 install_dir : systemgeneratordir)
5c23128d
ZJS
1692endif
1693
349cc4a5 1694if conf.get('HAVE_SYSV_COMPAT') == 1
37efbbd8
ZJS
1695 executable('systemd-sysv-generator',
1696 'src/sysv-generator/sysv-generator.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 install_rpath : rootlibexecdir,
1700 install : true,
1701 install_dir : systemgeneratordir)
1702
1703 executable('systemd-rc-local-generator',
1704 'src/rc-local-generator/rc-local-generator.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 install_rpath : rootlibexecdir,
1708 install : true,
1709 install_dir : systemgeneratordir)
5c23128d
ZJS
1710endif
1711
349cc4a5 1712if conf.get('ENABLE_HOSTNAMED') == 1
37efbbd8
ZJS
1713 executable('systemd-hostnamed',
1714 'src/hostname/hostnamed.c',
005a29f2 1715 include_directories : includes,
aac26058 1716 link_with : [libshared],
005a29f2 1717 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1718 install : true,
1719 install_dir : rootlibexecdir)
1720
1721 exe = executable('hostnamectl',
1722 'src/hostname/hostnamectl.c',
1723 include_directories : includes,
1724 link_with : [libshared],
1725 install_rpath : rootlibexecdir,
1726 install : true)
1727 public_programs += [exe]
5c23128d
ZJS
1728endif
1729
349cc4a5
ZJS
1730if conf.get('ENABLE_LOCALED') == 1
1731 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
1732 # logind will load libxkbcommon.so dynamically on its own
1733 deps = [libdl]
1734 else
1735 deps = []
1736 endif
1737
1738 executable('systemd-localed',
1739 systemd_localed_sources,
005a29f2 1740 include_directories : includes,
aac26058 1741 link_with : [libshared],
37efbbd8 1742 dependencies : deps,
005a29f2 1743 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1744 install : true,
1745 install_dir : rootlibexecdir)
1746
1747 exe = executable('localectl',
1748 localectl_sources,
1749 include_directories : includes,
1750 link_with : [libshared],
1751 install_rpath : rootlibexecdir,
1752 install : true)
1753 public_programs += [exe]
5c23128d
ZJS
1754endif
1755
349cc4a5 1756if conf.get('ENABLE_TIMEDATED') == 1
37efbbd8
ZJS
1757 executable('systemd-timedated',
1758 'src/timedate/timedated.c',
005a29f2 1759 include_directories : includes,
aac26058 1760 link_with : [libshared],
37efbbd8
ZJS
1761 install_rpath : rootlibexecdir,
1762 install : true,
1763 install_dir : rootlibexecdir)
5c23128d 1764
37efbbd8
ZJS
1765 exe = executable('timedatectl',
1766 'src/timedate/timedatectl.c',
1767 include_directories : includes,
1768 install_rpath : rootlibexecdir,
1769 link_with : [libshared],
1770 install : true)
1771 public_programs += [exe]
5c23128d
ZJS
1772endif
1773
349cc4a5 1774if conf.get('ENABLE_TIMESYNCD') == 1
37efbbd8
ZJS
1775 executable('systemd-timesyncd',
1776 systemd_timesyncd_sources,
005a29f2 1777 include_directories : includes,
aac26058 1778 link_with : [libshared],
005a29f2 1779 dependencies : [threads,
37efbbd8 1780 libm],
005a29f2
ZJS
1781 install_rpath : rootlibexecdir,
1782 install : true,
37efbbd8 1783 install_dir : rootlibexecdir)
5c23128d
ZJS
1784endif
1785
349cc4a5 1786if conf.get('ENABLE_MACHINED') == 1
37efbbd8
ZJS
1787 executable('systemd-machined',
1788 systemd_machined_sources,
1789 include_directories : includes,
1790 link_with : [libmachine_core,
1791 libshared],
1792 install_rpath : rootlibexecdir,
1793 install : true,
1794 install_dir : rootlibexecdir)
1795
1796 exe = executable('machinectl',
1797 'src/machine/machinectl.c',
1798 include_directories : includes,
1799 link_with : [libshared],
1800 dependencies : [threads,
1801 libxz,
1802 liblz4],
1803 install_rpath : rootlibexecdir,
1804 install : true,
1805 install_dir : rootbindir)
1806 public_programs += [exe]
5c23128d
ZJS
1807endif
1808
349cc4a5 1809if conf.get('ENABLE_IMPORTD') == 1
37efbbd8
ZJS
1810 executable('systemd-importd',
1811 systemd_importd_sources,
005a29f2 1812 include_directories : includes,
aac26058 1813 link_with : [libshared],
37efbbd8 1814 dependencies : [threads],
005a29f2
ZJS
1815 install_rpath : rootlibexecdir,
1816 install : true,
1817 install_dir : rootlibexecdir)
37efbbd8
ZJS
1818
1819 systemd_pull = executable('systemd-pull',
1820 systemd_pull_sources,
1821 include_directories : includes,
1822 link_with : [libshared],
1823 dependencies : [libcurl,
1824 libz,
1825 libbzip2,
1826 libxz,
1827 libgcrypt],
1828 install_rpath : rootlibexecdir,
1829 install : true,
1830 install_dir : rootlibexecdir)
1831
1832 systemd_import = executable('systemd-import',
1833 systemd_import_sources,
1834 include_directories : includes,
1835 link_with : [libshared],
1836 dependencies : [libcurl,
1837 libz,
1838 libbzip2,
1839 libxz],
1840 install_rpath : rootlibexecdir,
1841 install : true,
1842 install_dir : rootlibexecdir)
1843
1844 systemd_export = executable('systemd-export',
1845 systemd_export_sources,
1846 include_directories : includes,
1847 link_with : [libshared],
1848 dependencies : [libcurl,
1849 libz,
1850 libbzip2,
1851 libxz],
1852 install_rpath : rootlibexecdir,
1853 install : true,
1854 install_dir : rootlibexecdir)
1855 public_programs += [systemd_pull, systemd_import, systemd_export]
1856endif
1857
349cc4a5 1858if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
37efbbd8
ZJS
1859 exe = executable('systemd-journal-upload',
1860 systemd_journal_upload_sources,
1861 include_directories : includes,
1862 link_with : [libshared],
1863 dependencies : [threads,
1864 libcurl,
1865 libgnutls,
1866 libxz,
1867 liblz4],
1868 install_rpath : rootlibexecdir,
1869 install : true,
1870 install_dir : rootlibexecdir)
1871 public_programs += [exe]
5c23128d
ZJS
1872endif
1873
349cc4a5 1874if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
37efbbd8
ZJS
1875 s_j_remote = executable('systemd-journal-remote',
1876 systemd_journal_remote_sources,
1877 include_directories : includes,
1878 link_with : [libshared],
1879 dependencies : [threads,
1880 libmicrohttpd,
1881 libgnutls,
1882 libxz,
1883 liblz4],
1884 install_rpath : rootlibexecdir,
1885 install : true,
1886 install_dir : rootlibexecdir)
1887
1888 s_j_gatewayd = executable('systemd-journal-gatewayd',
1889 systemd_journal_gatewayd_sources,
1890 include_directories : includes,
1891 link_with : [libshared],
1892 dependencies : [threads,
1893 libmicrohttpd,
1894 libgnutls,
1895 libxz,
1896 liblz4],
1897 install_rpath : rootlibexecdir,
1898 install : true,
1899 install_dir : rootlibexecdir)
1900 public_programs += [s_j_remote, s_j_gatewayd]
5c23128d
ZJS
1901endif
1902
349cc4a5 1903if conf.get('ENABLE_COREDUMP') == 1
37efbbd8
ZJS
1904 executable('systemd-coredump',
1905 systemd_coredump_sources,
005a29f2 1906 include_directories : includes,
aac26058 1907 link_with : [libshared],
005a29f2 1908 dependencies : [threads,
37efbbd8
ZJS
1909 libacl,
1910 libdw,
005a29f2
ZJS
1911 libxz,
1912 liblz4],
1913 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1914 install : true,
1915 install_dir : rootlibexecdir)
1916
1917 exe = executable('coredumpctl',
1918 coredumpctl_sources,
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [threads,
1922 libxz,
1923 liblz4],
1924 install_rpath : rootlibexecdir,
1925 install : true)
1926 public_programs += [exe]
5c23128d
ZJS
1927endif
1928
349cc4a5 1929if conf.get('ENABLE_BINFMT') == 1
37efbbd8
ZJS
1930 exe = executable('systemd-binfmt',
1931 'src/binfmt/binfmt.c',
1932 include_directories : includes,
1933 link_with : [libshared],
1934 install_rpath : rootlibexecdir,
1935 install : true,
1936 install_dir : rootlibexecdir)
1937 public_programs += [exe]
1938
1939 meson.add_install_script('sh', '-c',
1940 mkdir_p.format(binfmtdir))
1941 meson.add_install_script('sh', '-c',
1942 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1943endif
1944
349cc4a5 1945if conf.get('ENABLE_VCONSOLE') == 1
37efbbd8
ZJS
1946 executable('systemd-vconsole-setup',
1947 'src/vconsole/vconsole-setup.c',
005a29f2
ZJS
1948 include_directories : includes,
1949 link_with : [libshared],
1950 install_rpath : rootlibexecdir,
1951 install : true,
1952 install_dir : rootlibexecdir)
5c23128d
ZJS
1953endif
1954
349cc4a5 1955if conf.get('ENABLE_RANDOMSEED') == 1
37efbbd8
ZJS
1956 executable('systemd-random-seed',
1957 'src/random-seed/random-seed.c',
1958 include_directories : includes,
1959 link_with : [libshared],
1960 install_rpath : rootlibexecdir,
1961 install : true,
1962 install_dir : rootlibexecdir)
5c23128d
ZJS
1963endif
1964
349cc4a5 1965if conf.get('ENABLE_FIRSTBOOT') == 1
37efbbd8
ZJS
1966 executable('systemd-firstboot',
1967 'src/firstboot/firstboot.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 dependencies : [libcrypt],
1971 install_rpath : rootlibexecdir,
1972 install : true,
1973 install_dir : rootbindir)
5c23128d
ZJS
1974endif
1975
1976executable('systemd-remount-fs',
1977 'src/remount-fs/remount-fs.c',
1978 'src/core/mount-setup.c',
1979 'src/core/mount-setup.h',
1980 include_directories : includes,
1981 link_with : [libshared],
b2fc5836 1982 install_rpath : rootlibexecdir,
5c23128d
ZJS
1983 install : true,
1984 install_dir : rootlibexecdir)
1985
1986executable('systemd-machine-id-setup',
1987 'src/machine-id-setup/machine-id-setup-main.c',
1988 'src/core/machine-id-setup.c',
1989 'src/core/machine-id-setup.h',
1990 include_directories : includes,
aac26058 1991 link_with : [libshared],
b2fc5836 1992 install_rpath : rootlibexecdir,
5c23128d
ZJS
1993 install : true,
1994 install_dir : rootbindir)
1995
1996executable('systemd-fsck',
1997 'src/fsck/fsck.c',
1998 include_directories : includes,
aac26058 1999 link_with : [libshared],
421f0012 2000 install_rpath : rootlibexecdir,
5c23128d
ZJS
2001 install : true,
2002 install_dir : rootlibexecdir)
2003
80750adb
ZJS
2004executable('systemd-growfs',
2005 'src/partition/growfs.c',
2006 include_directories : includes,
2007 link_with : [libshared],
c34b75a1 2008 dependencies : [libcryptsetup],
80750adb
ZJS
2009 install_rpath : rootlibexecdir,
2010 install : true,
2011 install_dir : rootlibexecdir)
2012
b7f28ac5
ZJS
2013executable('systemd-makefs',
2014 'src/partition/makefs.c',
2015 include_directories : includes,
2016 link_with : [libshared],
2017 install_rpath : rootlibexecdir,
2018 install : true,
2019 install_dir : rootlibexecdir)
2020
5c23128d
ZJS
2021executable('systemd-sleep',
2022 'src/sleep/sleep.c',
2023 include_directories : includes,
2024 link_with : [libshared],
421f0012 2025 install_rpath : rootlibexecdir,
5c23128d
ZJS
2026 install : true,
2027 install_dir : rootlibexecdir)
2028
005a29f2
ZJS
2029exe = executable('systemd-sysctl',
2030 'src/sysctl/sysctl.c',
2031 include_directories : includes,
2032 link_with : [libshared],
2033 install_rpath : rootlibexecdir,
2034 install : true,
2035 install_dir : rootlibexecdir)
2036public_programs += [exe]
5c23128d
ZJS
2037
2038executable('systemd-ac-power',
2039 'src/ac-power/ac-power.c',
2040 include_directories : includes,
2041 link_with : [libshared],
421f0012 2042 install_rpath : rootlibexecdir,
5c23128d
ZJS
2043 install : true,
2044 install_dir : rootlibexecdir)
2045
005a29f2
ZJS
2046exe = executable('systemd-detect-virt',
2047 'src/detect-virt/detect-virt.c',
2048 include_directories : includes,
2049 link_with : [libshared],
2050 install_rpath : rootlibexecdir,
2051 install : true)
2052public_programs += [exe]
2053
2054exe = executable('systemd-delta',
2055 'src/delta/delta.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2059 install : true)
2060public_programs += [exe]
2061
2062exe = executable('systemd-escape',
2063 'src/escape/escape.c',
2064 include_directories : includes,
2065 link_with : [libshared],
2066 install_rpath : rootlibexecdir,
2067 install : true,
2068 install_dir : rootbindir)
2069public_programs += [exe]
2070
2071exe = executable('systemd-notify',
2072 'src/notify/notify.c',
2073 include_directories : includes,
2074 link_with : [libshared],
2075 install_rpath : rootlibexecdir,
2076 install : true,
2077 install_dir : rootbindir)
2078public_programs += [exe]
5c23128d
ZJS
2079
2080executable('systemd-volatile-root',
2081 'src/volatile-root/volatile-root.c',
2082 include_directories : includes,
2083 link_with : [libshared],
421f0012 2084 install_rpath : rootlibexecdir,
5c23128d
ZJS
2085 install : true,
2086 install_dir : rootlibexecdir)
2087
2088executable('systemd-cgroups-agent',
2089 'src/cgroups-agent/cgroups-agent.c',
2090 include_directories : includes,
2091 link_with : [libshared],
421f0012 2092 install_rpath : rootlibexecdir,
5c23128d
ZJS
2093 install : true,
2094 install_dir : rootlibexecdir)
2095
005a29f2
ZJS
2096exe = executable('systemd-path',
2097 'src/path/path.c',
2098 include_directories : includes,
aac26058 2099 link_with : [libshared],
005a29f2
ZJS
2100 install_rpath : rootlibexecdir,
2101 install : true)
2102public_programs += [exe]
2103
2104exe = executable('systemd-ask-password',
2105 'src/ask-password/ask-password.c',
2106 include_directories : includes,
aac26058 2107 link_with : [libshared],
005a29f2
ZJS
2108 install_rpath : rootlibexecdir,
2109 install : true,
2110 install_dir : rootbindir)
2111public_programs += [exe]
5c23128d
ZJS
2112
2113executable('systemd-reply-password',
2114 'src/reply-password/reply-password.c',
2115 include_directories : includes,
aac26058 2116 link_with : [libshared],
421f0012 2117 install_rpath : rootlibexecdir,
5c23128d
ZJS
2118 install : true,
2119 install_dir : rootlibexecdir)
2120
005a29f2
ZJS
2121exe = executable('systemd-tty-ask-password-agent',
2122 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2123 include_directories : includes,
aac26058 2124 link_with : [libshared],
005a29f2
ZJS
2125 install_rpath : rootlibexecdir,
2126 install : true,
2127 install_dir : rootbindir)
2128public_programs += [exe]
2129
2130exe = executable('systemd-cgls',
2131 'src/cgls/cgls.c',
2132 include_directories : includes,
aac26058 2133 link_with : [libshared],
005a29f2
ZJS
2134 install_rpath : rootlibexecdir,
2135 install : true)
2136public_programs += [exe]
2137
2138exe = executable('systemd-cgtop',
2139 'src/cgtop/cgtop.c',
2140 include_directories : includes,
aac26058 2141 link_with : [libshared],
005a29f2
ZJS
2142 install_rpath : rootlibexecdir,
2143 install : true)
2144public_programs += [exe]
5c23128d
ZJS
2145
2146executable('systemd-initctl',
2147 'src/initctl/initctl.c',
2148 include_directories : includes,
aac26058 2149 link_with : [libshared],
421f0012 2150 install_rpath : rootlibexecdir,
5c23128d
ZJS
2151 install : true,
2152 install_dir : rootlibexecdir)
2153
005a29f2
ZJS
2154exe = executable('systemd-mount',
2155 'src/mount/mount-tool.c',
2156 include_directories : includes,
34ce0a52 2157 link_with : [libshared],
005a29f2
ZJS
2158 install_rpath : rootlibexecdir,
2159 install : true)
2160public_programs += [exe]
5c23128d 2161
7b76fce1 2162meson.add_install_script(meson_make_symlink,
e17e5ba9 2163 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 2164
005a29f2
ZJS
2165exe = executable('systemd-run',
2166 'src/run/run.c',
2167 include_directories : includes,
aac26058 2168 link_with : [libshared],
005a29f2
ZJS
2169 install_rpath : rootlibexecdir,
2170 install : true)
2171public_programs += [exe]
2172
2173exe = executable('systemd-stdio-bridge',
2174 'src/stdio-bridge/stdio-bridge.c',
2175 include_directories : includes,
aac26058 2176 link_with : [libshared],
005a29f2
ZJS
2177 install_rpath : rootlibexecdir,
2178 install : true)
2179public_programs += [exe]
2180
2181exe = executable('busctl',
2182 'src/busctl/busctl.c',
2183 'src/busctl/busctl-introspect.c',
2184 'src/busctl/busctl-introspect.h',
2185 include_directories : includes,
aac26058 2186 link_with : [libshared],
005a29f2
ZJS
2187 install_rpath : rootlibexecdir,
2188 install : true)
2189public_programs += [exe]
5c23128d 2190
349cc4a5 2191if conf.get('ENABLE_SYSUSERS') == 1
37efbbd8
ZJS
2192 exe = executable('systemd-sysusers',
2193 'src/sysusers/sysusers.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 install_rpath : rootlibexecdir,
2197 install : true,
2198 install_dir : rootbindir)
2199 public_programs += [exe]
5c23128d
ZJS
2200endif
2201
349cc4a5 2202if conf.get('ENABLE_TMPFILES') == 1
37efbbd8
ZJS
2203 exe = executable('systemd-tmpfiles',
2204 'src/tmpfiles/tmpfiles.c',
2205 include_directories : includes,
2206 link_with : [libshared],
2207 dependencies : [libacl],
2208 install_rpath : rootlibexecdir,
2209 install : true,
2210 install_dir : rootbindir)
2211 public_programs += [exe]
d9daae55
ZJS
2212
2213 test('test-systemd-tmpfiles',
2214 test_systemd_tmpfiles_py,
2215 args : exe.full_path())
2216 # https://github.com/mesonbuild/meson/issues/2681
5c23128d
ZJS
2217endif
2218
349cc4a5 2219if conf.get('ENABLE_HWDB') == 1
37efbbd8
ZJS
2220 exe = executable('systemd-hwdb',
2221 'src/hwdb/hwdb.c',
2222 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2223 include_directories : includes,
0da6f396
MB
2224 link_with : [libudev_internal],
2225 install_rpath : udev_rpath,
37efbbd8
ZJS
2226 install : true,
2227 install_dir : rootbindir)
2228 public_programs += [exe]
2229endif
2230
349cc4a5 2231if conf.get('ENABLE_QUOTACHECK') == 1
37efbbd8
ZJS
2232 executable('systemd-quotacheck',
2233 'src/quotacheck/quotacheck.c',
005a29f2 2234 include_directories : includes,
aac26058 2235 link_with : [libshared],
005a29f2
ZJS
2236 install_rpath : rootlibexecdir,
2237 install : true,
37efbbd8 2238 install_dir : rootlibexecdir)
5c23128d
ZJS
2239endif
2240
005a29f2
ZJS
2241exe = executable('systemd-socket-proxyd',
2242 'src/socket-proxy/socket-proxyd.c',
2243 include_directories : includes,
aac26058 2244 link_with : [libshared],
005a29f2
ZJS
2245 dependencies : [threads],
2246 install_rpath : rootlibexecdir,
2247 install : true,
2248 install_dir : rootlibexecdir)
2249public_programs += [exe]
2250
2251exe = executable('systemd-udevd',
2252 systemd_udevd_sources,
2253 include_directories : includes,
5c72049f 2254 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
005a29f2 2255 link_with : [libudev_core,
005a29f2 2256 libsystemd_network,
1aec3ed9 2257 libudev_internal],
3a30f21f
ZJS
2258 dependencies : [threads,
2259 libkmod,
005a29f2 2260 libidn,
aac26058
ZJS
2261 libacl,
2262 libblkid],
1aec3ed9 2263 install_rpath : udev_rpath,
005a29f2
ZJS
2264 install : true,
2265 install_dir : rootlibexecdir)
2266public_programs += [exe]
2267
2268exe = executable('udevadm',
2269 udevadm_sources,
2270 include_directories : includes,
2271 link_with : [libudev_core,
005a29f2 2272 libsystemd_network,
1aec3ed9 2273 libudev_internal],
3a30f21f
ZJS
2274 dependencies : [threads,
2275 libkmod,
005a29f2 2276 libidn,
aac26058
ZJS
2277 libacl,
2278 libblkid],
1aec3ed9 2279 install_rpath : udev_rpath,
005a29f2
ZJS
2280 install : true,
2281 install_dir : rootbindir)
2282public_programs += [exe]
5c23128d
ZJS
2283
2284executable('systemd-shutdown',
2285 systemd_shutdown_sources,
2286 include_directories : includes,
34ce0a52 2287 link_with : [libshared],
421f0012 2288 install_rpath : rootlibexecdir,
5c23128d
ZJS
2289 install : true,
2290 install_dir : rootlibexecdir)
2291
2292executable('systemd-update-done',
2293 'src/update-done/update-done.c',
2294 include_directories : includes,
2295 link_with : [libshared],
421f0012 2296 install_rpath : rootlibexecdir,
5c23128d
ZJS
2297 install : true,
2298 install_dir : rootlibexecdir)
2299
2300executable('systemd-update-utmp',
2301 'src/update-utmp/update-utmp.c',
2302 include_directories : includes,
aac26058 2303 link_with : [libshared],
5c23128d 2304 dependencies : [libaudit],
421f0012 2305 install_rpath : rootlibexecdir,
5c23128d
ZJS
2306 install : true,
2307 install_dir : rootlibexecdir)
2308
349cc4a5 2309if conf.get('HAVE_KMOD') == 1
37efbbd8
ZJS
2310 executable('systemd-modules-load',
2311 'src/modules-load/modules-load.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 dependencies : [libkmod],
2315 install_rpath : rootlibexecdir,
2316 install : true,
2317 install_dir : rootlibexecdir)
94e75a54 2318
37efbbd8
ZJS
2319 meson.add_install_script('sh', '-c',
2320 mkdir_p.format(modulesloaddir))
2321 meson.add_install_script('sh', '-c',
2322 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
2323endif
2324
005a29f2
ZJS
2325exe = executable('systemd-nspawn',
2326 systemd_nspawn_sources,
2327 'src/core/mount-setup.c', # FIXME: use a variable?
2328 'src/core/mount-setup.h',
2329 'src/core/loopback-setup.c',
2330 'src/core/loopback-setup.h',
2331 include_directories : [includes, include_directories('src/nspawn')],
0bc91152 2332 link_with : [libshared],
005a29f2
ZJS
2333 dependencies : [libacl,
2334 libblkid,
2335 libseccomp,
2336 libselinux],
2337 install_rpath : rootlibexecdir,
2338 install : true)
2339public_programs += [exe]
5c23128d 2340
349cc4a5 2341if conf.get('ENABLE_NETWORKD') == 1
37efbbd8
ZJS
2342 executable('systemd-networkd',
2343 systemd_networkd_sources,
2344 include_directories : includes,
2345 link_with : [libnetworkd_core,
37efbbd8
ZJS
2346 libsystemd_network,
2347 libudev_internal,
2348 libshared],
4b57a272 2349 dependencies : [threads],
37efbbd8
ZJS
2350 install_rpath : rootlibexecdir,
2351 install : true,
2352 install_dir : rootlibexecdir)
2353
2354 executable('systemd-networkd-wait-online',
2355 systemd_networkd_wait_online_sources,
2356 include_directories : includes,
2357 link_with : [libnetworkd_core,
2358 libshared],
2359 install_rpath : rootlibexecdir,
2360 install : true,
2361 install_dir : rootlibexecdir)
5c23128d 2362
dcfe072a
FS
2363 exe = executable('networkctl',
2364 networkctl_sources,
2365 include_directories : includes,
2366 link_with : [libsystemd_network,
aac26058 2367 libshared],
dcfe072a
FS
2368 install_rpath : rootlibexecdir,
2369 install : true,
2370 install_dir : rootbindir)
2371 public_programs += [exe]
2372endif
69e96427
ZJS
2373############################################################
2374
2375foreach tuple : tests
37efbbd8
ZJS
2376 sources = tuple[0]
2377 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2378 dependencies = tuple[2]
2379 condition = tuple.length() >= 4 ? tuple[3] : ''
2380 type = tuple.length() >= 5 ? tuple[4] : ''
2381 defs = tuple.length() >= 6 ? tuple[5] : []
2382 incs = tuple.length() >= 7 ? tuple[6] : includes
2383 timeout = 30
2384
2385 name = sources[0].split('/')[-1].split('.')[0]
2386 if type.startswith('timeout=')
2387 timeout = type.split('=')[1].to_int()
2388 type = ''
2389 endif
2390
349cc4a5 2391 if condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
2392 exe = executable(
2393 name,
2394 sources,
2395 include_directories : incs,
2396 link_with : link_with,
2397 dependencies : dependencies,
2398 c_args : defs,
2399 install_rpath : rootlibexecdir,
7cdd9783
MB
2400 install : install_tests,
2401 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
2402
2403 if type == 'manual'
2404 message('@0@ is a manual test'.format(name))
2405 elif type == 'unsafe' and want_tests != 'unsafe'
2406 message('@0@ is an unsafe test'.format(name))
2407 else
2408 test(name, exe,
2409 env : test_env,
2410 timeout : timeout)
2411 endif
2412 else
2413 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2414 endif
69e96427
ZJS
2415endforeach
2416
37ab1a25 2417test_libsystemd_sym = executable(
37efbbd8
ZJS
2418 'test-libsystemd-sym',
2419 test_libsystemd_sym_c,
2420 include_directories : includes,
2421 link_with : [libsystemd],
2422 install : install_tests,
2423 install_dir : testsdir)
37ab1a25
ZJS
2424test('test-libsystemd-sym',
2425 test_libsystemd_sym)
2426
e0bec52f 2427test_libudev_sym = executable(
37efbbd8
ZJS
2428 'test-libudev-sym',
2429 test_libudev_sym_c,
2430 include_directories : includes,
2431 c_args : ['-Wno-deprecated-declarations'],
2432 link_with : [libudev],
2433 install : install_tests,
2434 install_dir : testsdir)
e0bec52f
ZJS
2435test('test-libudev-sym',
2436 test_libudev_sym)
2437
69e96427 2438############################################################
5c23128d
ZJS
2439
2440make_directive_index_py = find_program('tools/make-directive-index.py')
2441make_man_index_py = find_program('tools/make-man-index.py')
b184e8fe 2442xml_helper_py = find_program('tools/xml_helper.py')
abba22c5 2443hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
5c23128d
ZJS
2444
2445subdir('units')
2446subdir('sysctl.d')
2447subdir('sysusers.d')
2448subdir('tmpfiles.d')
e783f957 2449subdir('presets')
5c23128d
ZJS
2450subdir('hwdb')
2451subdir('network')
2452subdir('man')
2453subdir('shell-completion/bash')
2454subdir('shell-completion/zsh')
2455subdir('docs/sysvinit')
2456subdir('docs/var-log')
2457
2458# FIXME: figure out if the warning is true:
2459# https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2460install_subdir('factory/etc',
2461 install_dir : factorydir)
2462
2463
2464install_data('xorg/50-systemd-user.sh',
2465 install_dir : xinitrcdir)
582faeb4
DJL
2466install_data('modprobe.d/systemd.conf',
2467 install_dir : modprobedir)
5c23128d
ZJS
2468install_data('README',
2469 'NEWS',
2470 'CODING_STYLE',
2471 'DISTRO_PORTING',
2472 'ENVIRONMENT.md',
2473 'LICENSE.GPL2',
2474 'LICENSE.LGPL2.1',
2475 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2476 install_dir : docdir)
d68b342b 2477
94e75a54
ZJS
2478meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2479meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2480
d68b342b
ZJS
2481############################################################
2482
005a29f2
ZJS
2483meson_check_help = find_program('tools/meson-check-help.sh')
2484
2485foreach exec : public_programs
37efbbd8
ZJS
2486 name = exec.full_path().split('/')[-1]
2487 test('check-help-' + name,
2488 meson_check_help,
2489 args : [exec.full_path()])
005a29f2
ZJS
2490endforeach
2491
2492############################################################
2493
0700e8ba 2494if git.found()
37efbbd8
ZJS
2495 all_files = run_command(
2496 git,
450b60ba 2497 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
37efbbd8
ZJS
2498 'ls-files',
2499 ':/*.[ch]'])
2500 all_files = files(all_files.stdout().split())
d68b342b 2501
e85a690b 2502 custom_target(
0700e8ba 2503 'tags',
e85a690b 2504 output : 'tags',
450b60ba 2505 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
e85a690b 2506 custom_target(
0700e8ba 2507 'ctags',
e85a690b 2508 output : 'ctags',
450b60ba 2509 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
d68b342b 2510endif
177929c2
ZJS
2511
2512if git.found()
37efbbd8 2513 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
a923e085 2514 run_target(
37efbbd8 2515 'git-contrib',
37efbbd8 2516 command : [meson_git_contrib_sh])
177929c2 2517endif
dd6ab3df
ZJS
2518
2519if git.found()
2520 git_head = run_command(
2521 git,
450b60ba 2522 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
dd6ab3df
ZJS
2523 'rev-parse', 'HEAD']).stdout().strip()
2524 git_head_short = run_command(
2525 git,
450b60ba 2526 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
dd6ab3df
ZJS
2527 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2528
2529 run_target(
2530 'git-snapshot',
2531 command : ['git', 'archive',
450b60ba 2532 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
dd6ab3df
ZJS
2533 git_head_short),
2534 '--prefix', 'systemd-@0@/'.format(git_head),
2535 'HEAD'])
2536endif
829257d1
ZJS
2537
2538############################################################
2539
2540status = [
2541 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2542
359b496f
YW
2543 'prefix directory: @0@'.format(prefixdir),
2544 'rootprefix directory: @0@'.format(rootprefixdir),
2545 'sysconf directory: @0@'.format(sysconfdir),
2546 'include directory: @0@'.format(includedir),
2547 'lib directory: @0@'.format(libdir),
2548 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
2549 'SysV init scripts: @0@'.format(sysvinit_path),
2550 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
2551 'PAM modules directory: @0@'.format(pamlibdir),
2552 'PAM configuration directory: @0@'.format(pamconfdir),
2553 'RPM macros directory: @0@'.format(rpmmacrosdir),
2554 'modprobe.d directory: @0@'.format(modprobedir),
2555 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2556 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2557 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2558 'bash completions directory: @0@'.format(bashcompletiondir),
2559 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1
ZJS
2560 'extra start script: @0@'.format(get_option('rc-local')),
2561 'extra stop script: @0@'.format(get_option('halt-local')),
2562 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2563 get_option('debug-tty')),
2564 'TTY GID: @0@'.format(tty_gid),
84786b8e 2565 'users GID: @0@'.format(users_gid),
829257d1
ZJS
2566 'maximum system UID: @0@'.format(system_uid_max),
2567 'maximum system GID: @0@'.format(system_gid_max),
87d5e4f2
LP
2568 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2569 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2570 'minimum container UID base: @0@'.format(container_uid_base_min),
2571 'maximum container UID base: @0@'.format(container_uid_base_max),
829257d1 2572 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 2573 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 2574 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 2575 'support URL: @0@'.format(support_url),
afde4574
LP
2576 'nobody user name: @0@'.format(nobody_user),
2577 'nobody group name: @0@'.format(nobody_group),
829257d1 2578 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 2579 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
2580
2581 'default DNSSEC mode: @0@'.format(default_dnssec),
2582 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2583 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2584
2585alt_dns_servers = '\n '.join(dns_servers.split(' '))
2586alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2587status += [
2588 'default DNS servers: @0@'.format(alt_dns_servers),
2589 'default NTP servers: @0@'.format(alt_ntp_servers)]
2590
2591alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2592 '@@0@'.format(time_epoch)).stdout().strip()
2593status += [
2594 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2595
2596# TODO:
2597# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2598# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2599# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2600
349cc4a5 2601if conf.get('ENABLE_EFI') == 1
829257d1
ZJS
2602 status += [
2603 'efi arch: @0@'.format(efi_arch)]
2604
2605 if have_gnu_efi
2606 status += [
2607 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2608 'EFI CC @0@'.format(efi_cc),
359b496f
YW
2609 'EFI lib directory: @0@'.format(efi_libdir),
2610 'EFI lds directory: @0@'.format(efi_ldsdir),
2611 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
2612 endif
2613endif
2614
2615found = []
2616missing = []
2617
2618foreach tuple : [
2619 ['libcryptsetup'],
2620 ['PAM'],
2621 ['AUDIT'],
2622 ['IMA'],
2623 ['AppArmor'],
2624 ['SELinux'],
2625 ['SECCOMP'],
2626 ['SMACK'],
2627 ['zlib'],
2628 ['xz'],
2629 ['lz4'],
2630 ['bzip2'],
2631 ['ACL'],
2632 ['gcrypt'],
2633 ['qrencode'],
2634 ['microhttpd'],
2635 ['gnutls'],
2636 ['libcurl'],
d1bf5675 2637 ['idn'],
87057e24 2638 ['libidn2'],
829257d1 2639 ['libidn'],
e7e11bbf 2640 ['nss-systemd'],
829257d1
ZJS
2641 ['libiptc'],
2642 ['elfutils'],
2643 ['binfmt'],
2644 ['vconsole'],
2645 ['quotacheck'],
2646 ['tmpfiles'],
2647 ['environment.d'],
2648 ['sysusers'],
2649 ['firstboot'],
2650 ['randomseed'],
2651 ['backlight'],
2652 ['rfkill'],
2653 ['logind'],
2654 ['machined'],
2655 ['importd'],
2656 ['hostnamed'],
2657 ['timedated'],
2658 ['timesyncd'],
2659 ['localed'],
2660 ['networkd'],
a7456af5 2661 ['resolve'],
829257d1
ZJS
2662 ['coredump'],
2663 ['polkit'],
2664 ['legacy pkla', install_polkit_pkla],
2665 ['efi'],
2666 ['gnu-efi', have_gnu_efi],
2667 ['kmod'],
2668 ['xkbcommon'],
2669 ['blkid'],
2670 ['dbus'],
2671 ['glib'],
08cf5b8d 2672 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
829257d1
ZJS
2673 ['hwdb'],
2674 ['tpm'],
2675 ['man pages', want_man],
2676 ['html pages', want_html],
2677 ['man page indices', want_man and have_lxml],
349cc4a5 2678 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
829257d1
ZJS
2679 ['SysV compat'],
2680 ['utmp'],
2681 ['ldconfig'],
2682 ['hibernate'],
2683 ['adm group', get_option('adm-group')],
2684 ['wheel group', get_option('wheel-group')],
b14e1b43 2685 ['gshadow'],
829257d1
ZJS
2686 ['debug hashmap'],
2687 ['debug mmap cache'],
2688]
2689
2690 cond = tuple.get(1, '')
2691 if cond == ''
2692 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2693 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 2694 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
2695 endif
2696 if cond
2697 found += [tuple[0]]
2698 else
2699 missing += [tuple[0]]
2700 endif
2701endforeach
2702
2703status += [
9d39c1bf 2704 '',
829257d1 2705 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
2706 '',
2707 'disabled features: @0@'.format(', '.join(missing)),
2708 '']
829257d1 2709message('\n '.join(status))
9a8e64b0
ZJS
2710
2711if rootprefixdir != rootprefix_default
2712 message('WARNING:\n' +
2713 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2714 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2715 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
2716endif