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