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