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