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