1 # SPDX-License-Identifier: LGPL-2.1+
3 # Copyright 2017 Zbigniew Jędrzejewski-Szmek
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.
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.
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/>.
18 project('systemd', 'c',
27 meson_version : '>= 0.41',
30 libsystemd_version = '0.21.0'
31 libudev_version = '1.6.9'
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
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())
41 substs = configuration_data()
42 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
43 substs.set('PACKAGE_VERSION', meson.project_version())
47 #####################################################################
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())
55 #####################################################################
57 if get_option('split-usr') == 'auto'
58 split_usr = run_command('test', '-L', '/bin').returncode() != 0
60 split_usr = get_option('split-usr') == 'true'
62 conf.set10('HAVE_SPLIT_USR', split_usr,
63 description : '/usr/bin and /bin directories are separate')
65 if get_option('split-bin') == 'auto'
66 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
68 split_bin = get_option('split-bin') == 'true'
70 conf.set10('HAVE_SPLIT_BIN', split_bin,
71 description : 'bin and sbin directories are separate')
73 rootprefixdir = get_option('rootprefix')
74 # Unusual rootprefixdir values are used by some distros
75 # (see https://github.com/systemd/systemd/pull/7461).
76 rootprefix_default = split_usr ? '/' : '/usr'
77 if rootprefixdir == ''
78 rootprefixdir = rootprefix_default
81 sysvinit_path = get_option('sysvinit-path')
82 sysvrcnd_path = get_option('sysvrcnd-path')
83 have = sysvinit_path != '' and sysvrcnd_path != ''
84 conf.set10('HAVE_SYSV_COMPAT', have,
85 description : 'SysV init scripts and rcN.d links are supported')
86 m4_defines += have ? ['-DHAVE_SYSV_COMPAT'] : []
88 # join_paths ignore the preceding arguments if an absolute component is
89 # encountered, so this should canonicalize various paths when they are
90 # absolute or relative.
91 prefixdir = get_option('prefix')
92 if not prefixdir.startswith('/')
93 error('Prefix is not absolute: "@0@"'.format(prefixdir))
95 bindir = join_paths(prefixdir, get_option('bindir'))
96 libdir = join_paths(prefixdir, get_option('libdir'))
97 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
98 includedir = join_paths(prefixdir, get_option('includedir'))
99 datadir = join_paths(prefixdir, get_option('datadir'))
100 localstatedir = join_paths('/', get_option('localstatedir'))
102 rootbindir = join_paths(rootprefixdir, 'bin')
103 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
104 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
106 rootlibdir = get_option('rootlibdir')
108 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
111 # Dirs of external packages
112 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
113 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
114 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
115 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
116 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
117 varlogdir = join_paths(localstatedir, 'log')
118 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
119 rpmmacrosdir = get_option('rpmmacrosdir')
120 if rpmmacrosdir != 'no'
121 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
123 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
126 pkgdatadir = join_paths(datadir, 'systemd')
127 environmentdir = join_paths(prefixdir, 'lib/environment.d')
128 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
129 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
130 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
131 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
132 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
133 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
134 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
135 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
136 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
137 pkgincludedir = join_paths(includedir, 'systemd')
138 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
139 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
140 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
141 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
142 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
143 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
144 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
145 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
146 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
147 udevhomedir = udevlibexecdir
148 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
149 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
150 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
151 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
152 factorydir = join_paths(datadir, 'factory')
153 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
154 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
155 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
156 catalogstatedir = join_paths(systemdstatedir, 'catalog')
157 randomseeddir = join_paths(localstatedir, 'lib/systemd')
159 docdir = get_option('docdir')
161 docdir = join_paths(datadir, 'doc/systemd')
164 dbuspolicydir = get_option('dbuspolicydir')
165 if dbuspolicydir == ''
166 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
169 dbussessionservicedir = get_option('dbussessionservicedir')
170 if dbussessionservicedir == ''
171 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
174 dbussystemservicedir = get_option('dbussystemservicedir')
175 if dbussystemservicedir == ''
176 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
179 pamlibdir = get_option('pamlibdir')
181 pamlibdir = join_paths(rootlibdir, 'security')
184 pamconfdir = get_option('pamconfdir')
186 pamconfdir = join_paths(sysconfdir, 'pam.d')
189 memory_accounting_default = get_option('memory-accounting-default')
191 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
192 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
193 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
194 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
195 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
196 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
197 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
199 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
201 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
202 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
203 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
204 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
205 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
206 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
207 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
208 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
209 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
210 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
211 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
212 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
213 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
214 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
215 conf.set_quoted('ROOTPREFIX', rootprefixdir)
216 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
217 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
218 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
219 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
220 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
221 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
222 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
223 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
224 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
225 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
226 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
227 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
228 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
229 conf.set_quoted('LIBDIR', libdir)
230 conf.set_quoted('ROOTLIBDIR', rootlibdir)
231 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
232 conf.set_quoted('BOOTLIBDIR', bootlibdir)
233 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
234 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
235 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
236 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
237 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
238 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
239 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
240 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_ON_OFF', memory_accounting_default ? 'on' : 'off')
242 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
243 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
245 substs.set('prefix', prefixdir)
246 substs.set('exec_prefix', prefixdir)
247 substs.set('libdir', libdir)
248 substs.set('rootlibdir', rootlibdir)
249 substs.set('includedir', includedir)
250 substs.set('pkgsysconfdir', pkgsysconfdir)
251 substs.set('bindir', bindir)
252 substs.set('rootbindir', rootbindir)
253 substs.set('rootlibexecdir', rootlibexecdir)
254 substs.set('systemunitdir', systemunitdir)
255 substs.set('userunitdir', userunitdir)
256 substs.set('systempresetdir', systempresetdir)
257 substs.set('userpresetdir', userpresetdir)
258 substs.set('udevhwdbdir', udevhwdbdir)
259 substs.set('udevrulesdir', udevrulesdir)
260 substs.set('udevlibexecdir', udevlibexecdir)
261 substs.set('catalogdir', catalogdir)
262 substs.set('tmpfilesdir', tmpfilesdir)
263 substs.set('sysusersdir', sysusersdir)
264 substs.set('sysctldir', sysctldir)
265 substs.set('binfmtdir', binfmtdir)
266 substs.set('modulesloaddir', modulesloaddir)
267 substs.set('systemgeneratordir', systemgeneratordir)
268 substs.set('usergeneratordir', usergeneratordir)
269 substs.set('systemenvgeneratordir', systemenvgeneratordir)
270 substs.set('userenvgeneratordir', userenvgeneratordir)
271 substs.set('systemshutdowndir', systemshutdowndir)
272 substs.set('systemsleepdir', systemsleepdir)
273 substs.set('VARLOGDIR', varlogdir)
274 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
275 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
276 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
277 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
278 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
279 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
280 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
281 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
283 #####################################################################
285 cc = meson.get_compiler('c')
286 pkgconfig = import('pkgconfig')
287 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
288 meson_build_sh = find_program('tools/meson-build.sh')
290 if get_option('tests') != 'false'
291 cxx = find_program('c++', required : false)
293 # Used only for tests
298 want_ossfuzz = get_option('oss-fuzz')
299 want_libfuzzer = get_option('llvm-fuzz')
300 fuzzer_build = want_ossfuzz or want_libfuzzer
301 if want_ossfuzz and want_libfuzzer
302 error('only one of oss-fuzz and llvm-fuzz can be specified')
305 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
308 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
311 foreach arg : ['-Wextra',
314 '-Wmissing-include-dirs',
315 '-Wold-style-definition',
318 '-Wdeclaration-after-statement',
320 '-Wsuggest-attribute=noreturn',
321 '-Werror=missing-prototypes',
322 '-Werror=implicit-function-declaration',
323 '-Werror=missing-declarations',
324 '-Werror=return-type',
325 '-Werror=incompatible-pointer-types',
327 '-Wstrict-prototypes',
329 '-Wmissing-noreturn',
330 '-Wimplicit-fallthrough=5',
333 '-Wstrict-aliasing=2',
340 '-fdiagnostics-show-option',
341 '-fno-strict-aliasing',
342 '-fvisibility=hidden',
344 '-fstack-protector-strong',
345 '--param=ssp-buffer-size=4',
347 if cc.has_argument(arg)
348 add_project_arguments(arg, language : 'c')
352 # the oss-fuzz fuzzers are not built with -fPIE, so don't
353 # enable it when we are linking against them
355 if cc.has_argument('-fPIE')
356 add_project_arguments('-fPIE', language : 'c')
360 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
361 # arguments, just emits a warnings. So test for the "positive" version instead.
362 foreach arg : ['unused-parameter',
363 'missing-field-initializers',
366 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
368 if cc.has_argument('-W' + arg)
369 add_project_arguments('-Wno-' + arg, language : 'c')
375 #include <inttypes.h>
376 typedef uint64_t usec_t;
377 usec_t now(clockid_t clock);
382 ''', name : '-Werror=shadow with local shadowing')
383 add_project_arguments('-Werror=shadow', language : 'c')
386 if cc.get_id() == 'clang'
387 foreach arg : ['-Wno-typedef-redefinition',
388 '-Wno-gnu-variable-sized-type-not-at-end',
390 if cc.has_argument(arg,
391 name : '@0@ is supported'.format(arg))
392 add_project_arguments(arg, language : 'c')
397 link_test_c = files('tools/meson-link-test.c')
399 # --as-needed and --no-undefined are provided by meson by default,
400 # run mesonconf to see what is enabled
401 foreach arg : ['-Wl,-z,relro',
406 have = run_command(check_compilation_sh,
407 cc.cmd_array(), '-x', 'c', arg,
408 '-include', link_test_c).returncode() == 0
409 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
410 if have and (arg != '-pie' or not fuzzer_build)
411 add_project_link_arguments(arg, language : 'c')
415 # Check if various sanitizers are supported
417 foreach arg : ['address']
419 have = run_command(check_compilation_sh,
420 cc.cmd_array(), '-x', 'c',
421 '-fsanitize=@0@'.format(arg),
422 '-include', link_test_c).returncode() == 0
423 message('@0@ sanitizer supported: @1@'.format(arg, have ? 'yes' : 'no'))
429 if get_option('buildtype') != 'debug'
430 foreach arg : ['-ffunction-sections',
432 if cc.has_argument(arg,
433 name : '@0@ is supported'.format(arg))
434 add_project_arguments(arg, language : 'c')
438 foreach arg : ['-Wl,--gc-sections']
439 have = run_command(check_compilation_sh,
440 cc.cmd_array(), '-x', 'c', arg,
441 '-include', link_test_c).returncode() == 0
442 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
444 add_project_link_arguments(arg, language : 'c')
449 cpp = ' '.join(cc.cmd_array()) + ' -E'
451 #####################################################################
452 # compilation result tests
454 conf.set('_GNU_SOURCE', true)
455 conf.set('__SANE_USERSPACE_TYPES__', true)
457 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
458 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
459 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
460 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
461 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
462 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
463 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
467 #include <linux/ethtool.h>
468 #include <linux/fib_rules.h>
469 #include <linux/stat.h>
470 #include <sys/stat.h>
472 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
474 foreach decl : ['char16_t',
477 'struct ethtool_link_settings',
478 'struct fib_rule_uid_range',
482 # We get -1 if the size cannot be determined
483 have = cc.sizeof(decl, prefix : decl_headers) > 0
484 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
487 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
488 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
489 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
490 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
491 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
492 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
493 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
494 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
495 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
496 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
497 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
498 # if_tunnel.h is buggy and cannot be included on its own
499 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
500 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
501 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
502 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
503 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
504 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
505 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
506 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
507 ['NDA_IFINDEX', 'linux/neighbour.h'],
508 ['IFA_FLAGS', 'linux/if_addr.h'],
509 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
510 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
511 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
513 prefix = decl.length() > 2 ? decl[2] : ''
514 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
515 conf.set10('HAVE_' + decl[0], have)
518 foreach ident : ['secure_getenv', '__secure_getenv']
519 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
523 ['memfd_create', '''#include <sys/mman.h>'''],
524 ['gettid', '''#include <sys/types.h>
525 #include <unistd.h>'''],
526 ['pivot_root', '''#include <stdlib.h>
527 #include <unistd.h>'''], # no known header declares pivot_root
528 ['name_to_handle_at', '''#include <sys/types.h>
529 #include <sys/stat.h>
530 #include <fcntl.h>'''],
531 ['setns', '''#include <sched.h>'''],
532 ['renameat2', '''#include <stdio.h>
533 #include <fcntl.h>'''],
534 ['kcmp', '''#include <linux/kcmp.h>'''],
535 ['keyctl', '''#include <sys/types.h>
536 #include <keyutils.h>'''],
537 ['copy_file_range', '''#include <sys/syscall.h>
538 #include <unistd.h>'''],
539 ['bpf', '''#include <sys/syscall.h>
540 #include <unistd.h>'''],
541 ['statx', '''#include <sys/types.h>
542 #include <sys/stat.h>
543 #include <unistd.h>'''],
544 ['explicit_bzero' , '''#include <string.h>'''],
545 ['reallocarray', '''#include <malloc.h>'''],
548 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
549 conf.set10('HAVE_' + ident[0].to_upper(), have)
552 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
553 conf.set10('USE_SYS_RANDOM_H', true)
554 conf.set10('HAVE_GETRANDOM', true)
556 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
557 conf.set10('USE_SYS_RANDOM_H', false)
558 conf.set10('HAVE_GETRANDOM', have)
561 #####################################################################
563 sed = find_program('sed')
564 awk = find_program('awk')
565 m4 = find_program('m4')
566 stat = find_program('stat')
567 git = find_program('git', required : false)
568 env = find_program('env')
570 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
571 mkdir_p = 'mkdir -p $DESTDIR/@0@'
572 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
573 splash_bmp = files('test/splash.bmp')
575 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
576 # /usr/sbin, /sbin, and fall back to the default from middle column.
577 progs = [['quotaon', '/usr/sbin/quotaon' ],
578 ['quotacheck', '/usr/sbin/quotacheck' ],
579 ['kill', '/usr/bin/kill' ],
580 ['kmod', '/usr/bin/kmod' ],
581 ['kexec', '/usr/sbin/kexec' ],
582 ['sulogin', '/usr/sbin/sulogin' ],
583 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
584 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
585 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
586 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
589 path = get_option(prog[0] + '-path')
591 message('Using @1@ for @0@'.format(prog[0], path))
593 exe = find_program(prog[0],
594 '/usr/sbin/' + prog[0],
597 path = exe.found() ? exe.path() : prog[1]
599 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
600 conf.set_quoted(name, path)
601 substs.set(name, path)
604 conf.set_quoted('TELINIT', get_option('telinit-path'))
606 if run_command('ln', '--relative', '--help').returncode() != 0
607 error('ln does not support --relative')
610 ############################################################
612 gperf = find_program('gperf')
614 gperf_test_format = '''
616 const char * in_word_set(const char *, @0@);
619 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
620 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
621 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
622 if cc.compiles(gperf_test)
623 gperf_len_type = 'size_t'
625 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
626 if cc.compiles(gperf_test)
627 gperf_len_type = 'unsigned'
629 error('unable to determine gperf len type')
632 message('gperf len type is @0@'.format(gperf_len_type))
633 conf.set('GPERF_LEN_TYPE', gperf_len_type,
634 description : 'The type of gperf "len" parameter')
636 ############################################################
638 if not cc.has_header('sys/capability.h')
639 error('POSIX caps headers not found')
641 foreach header : ['crypt.h',
644 'linux/vm_sockets.h',
646 'valgrind/memcheck.h',
647 'valgrind/valgrind.h',
650 conf.set10('HAVE_' + header.underscorify().to_upper(),
651 cc.has_header(header))
654 ############################################################
656 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
657 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
658 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
660 default_hierarchy = get_option('default-hierarchy')
661 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
662 description : 'default cgroup hierarchy as string')
663 if default_hierarchy == 'legacy'
664 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
665 elif default_hierarchy == 'hybrid'
666 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
668 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
671 time_epoch = get_option('time-epoch')
674 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
676 time_epoch = time_epoch.to_int()
677 conf.set('TIME_EPOCH', time_epoch)
679 system_uid_max = get_option('system-uid-max')
680 if system_uid_max == ''
681 system_uid_max = run_command(
683 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
684 '/etc/login.defs').stdout().strip()
685 if system_uid_max == ''
686 system_uid_max = '999'
689 system_uid_max = system_uid_max.to_int()
690 conf.set('SYSTEM_UID_MAX', system_uid_max)
691 substs.set('systemuidmax', system_uid_max)
692 message('maximum system UID is @0@'.format(system_uid_max))
694 system_gid_max = get_option('system-gid-max')
695 if system_gid_max == ''
696 system_gid_max = run_command(
698 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
699 '/etc/login.defs').stdout().strip()
700 if system_gid_max == ''
701 system_gid_max = '999'
704 system_gid_max = system_gid_max.to_int()
705 conf.set('SYSTEM_GID_MAX', system_gid_max)
706 substs.set('systemgidmax', system_gid_max)
707 message('maximum system GID is @0@'.format(system_gid_max))
709 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
710 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
711 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
712 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
713 substs.set('dynamicuidmin', dynamic_uid_min)
714 substs.set('dynamicuidmax', dynamic_uid_max)
716 container_uid_base_min = get_option('container-uid-base-min').to_int()
717 container_uid_base_max = get_option('container-uid-base-max').to_int()
718 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
719 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
720 substs.set('containeruidbasemin', container_uid_base_min)
721 substs.set('containeruidbasemax', container_uid_base_max)
723 nobody_user = get_option('nobody-user')
724 nobody_group = get_option('nobody-group')
726 getent_result = run_command('getent', 'passwd', '65534')
727 if getent_result.returncode() == 0
728 name = getent_result.stdout().split(':')[0]
729 if name != nobody_user
730 message('WARNING:\n' +
731 ' 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) +
732 ' Your build will result in an user table setup that is incompatible with the local system.')
735 id_result = run_command('id', '-u', nobody_user)
736 if id_result.returncode() == 0
737 id = id_result.stdout().to_int()
739 message('WARNING:\n' +
740 ' 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) +
741 ' Your build will result in an user table setup that is incompatible with the local system.')
745 getent_result = run_command('getent', 'group', '65534')
746 if getent_result.returncode() == 0
747 name = getent_result.stdout().split(':')[0]
748 if name != nobody_group
749 message('WARNING:\n' +
750 ' 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) +
751 ' Your build will result in an group table setup that is incompatible with the local system.')
754 id_result = run_command('id', '-g', nobody_group)
755 if id_result.returncode() == 0
756 id = id_result.stdout().to_int()
758 message('WARNING:\n' +
759 ' 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) +
760 ' Your build will result in an group table setup that is incompatible with the local system.')
763 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
764 message('WARNING:\n' +
765 ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
766 ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
769 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
770 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
771 substs.set('NOBODY_USER_NAME', nobody_user)
772 substs.set('NOBODY_GROUP_NAME', nobody_group)
774 tty_gid = get_option('tty-gid')
775 conf.set('TTY_GID', tty_gid)
776 substs.set('TTY_GID', tty_gid)
778 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
779 if get_option('users-gid') != ''
780 users_gid = get_option('users-gid').to_int()
784 substs.set('USERS_GID', users_gid)
786 if get_option('adm-group')
787 m4_defines += ['-DENABLE_ADM_GROUP']
790 if get_option('wheel-group')
791 m4_defines += ['-DENABLE_WHEEL_GROUP']
794 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
795 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
797 kill_user_processes = get_option('default-kill-user-processes')
798 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
799 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
801 dns_servers = get_option('dns-servers')
802 conf.set_quoted('DNS_SERVERS', dns_servers)
803 substs.set('DNS_SERVERS', dns_servers)
805 ntp_servers = get_option('ntp-servers')
806 conf.set_quoted('NTP_SERVERS', ntp_servers)
807 substs.set('NTP_SERVERS', ntp_servers)
809 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
811 substs.set('SUSHELL', get_option('debug-shell'))
812 substs.set('DEBUGTTY', get_option('debug-tty'))
814 debug = get_option('debug')
815 enable_debug_hashmap = false
816 enable_debug_mmap_cache = false
818 foreach name : debug.split(',')
820 enable_debug_hashmap = true
821 elif name == 'mmap-cache'
822 enable_debug_mmap_cache = true
824 message('unknown debug option "@0@", ignoring'.format(name))
828 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
829 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
831 #####################################################################
833 threads = dependency('threads')
834 librt = cc.find_library('rt')
835 libm = cc.find_library('m')
836 libdl = cc.find_library('dl')
837 libcrypt = cc.find_library('crypt')
839 libcap = dependency('libcap', required : false)
840 if not libcap.found()
841 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
842 libcap = cc.find_library('cap')
845 libmount = dependency('mount',
847 required : not fuzzer_build)
849 want_seccomp = get_option('seccomp')
850 if want_seccomp != 'false' and not fuzzer_build
851 libseccomp = dependency('libseccomp',
852 version : '>= 2.3.1',
853 required : want_seccomp == 'true')
854 have = libseccomp.found()
859 conf.set10('HAVE_SECCOMP', have)
860 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
862 want_selinux = get_option('selinux')
863 if want_selinux != 'false' and not fuzzer_build
864 libselinux = dependency('libselinux',
865 version : '>= 2.1.9',
866 required : want_selinux == 'true')
867 have = libselinux.found()
872 conf.set10('HAVE_SELINUX', have)
873 m4_defines += have ? ['-DHAVE_SELINUX'] : []
875 want_apparmor = get_option('apparmor')
876 if want_apparmor != 'false' and not fuzzer_build
877 libapparmor = dependency('libapparmor',
878 required : want_apparmor == 'true')
879 have = libapparmor.found()
884 conf.set10('HAVE_APPARMOR', have)
885 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
887 smack_run_label = get_option('smack-run-label')
888 if smack_run_label != ''
889 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
890 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
893 want_polkit = get_option('polkit')
894 install_polkit = false
895 install_polkit_pkla = false
896 if want_polkit != 'false' and not fuzzer_build
897 install_polkit = true
899 libpolkit = dependency('polkit-gobject-1',
901 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
902 message('Old polkit detected, will install pkla files')
903 install_polkit_pkla = true
906 conf.set10('ENABLE_POLKIT', install_polkit)
908 want_acl = get_option('acl')
909 if want_acl != 'false' and not fuzzer_build
910 libacl = cc.find_library('acl', required : want_acl == 'true')
911 have = libacl.found()
916 conf.set10('HAVE_ACL', have)
917 m4_defines += have ? ['-DHAVE_ACL'] : []
919 want_audit = get_option('audit')
920 if want_audit != 'false' and not fuzzer_build
921 libaudit = dependency('audit', required : want_audit == 'true')
922 have = libaudit.found()
927 conf.set10('HAVE_AUDIT', have)
929 want_blkid = get_option('blkid')
930 if want_blkid != 'false' and not fuzzer_build
931 libblkid = dependency('blkid', required : want_blkid == 'true')
932 have = libblkid.found()
937 conf.set10('HAVE_BLKID', have)
939 want_kmod = get_option('kmod')
940 if want_kmod != 'false' and not fuzzer_build
941 libkmod = dependency('libkmod',
943 required : want_kmod == 'true')
944 have = libkmod.found()
949 conf.set10('HAVE_KMOD', have)
951 want_pam = get_option('pam')
952 if want_pam != 'false' and not fuzzer_build
953 libpam = cc.find_library('pam', required : want_pam == 'true')
954 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
955 have = libpam.found() and libpam_misc.found()
961 conf.set10('HAVE_PAM', have)
962 m4_defines += have ? ['-DHAVE_PAM'] : []
964 want_microhttpd = get_option('microhttpd')
965 if want_microhttpd != 'false' and not fuzzer_build
966 libmicrohttpd = dependency('libmicrohttpd',
967 version : '>= 0.9.33',
968 required : want_microhttpd == 'true')
969 have = libmicrohttpd.found()
974 conf.set10('HAVE_MICROHTTPD', have)
975 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
977 want_libcryptsetup = get_option('libcryptsetup')
978 if want_libcryptsetup != 'false' and not fuzzer_build
979 libcryptsetup = dependency('libcryptsetup',
980 version : '>= 1.6.0',
981 required : want_libcryptsetup == 'true')
982 have = libcryptsetup.found()
987 conf.set10('HAVE_LIBCRYPTSETUP', have)
989 want_libcurl = get_option('libcurl')
990 if want_libcurl != 'false' and not fuzzer_build
991 libcurl = dependency('libcurl',
992 version : '>= 7.32.0',
993 required : want_libcurl == 'true')
994 have = libcurl.found()
999 conf.set10('HAVE_LIBCURL', have)
1000 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
1002 want_libidn = get_option('libidn')
1003 want_libidn2 = get_option('libidn2')
1004 if want_libidn == 'true' and want_libidn2 == 'true'
1005 error('libidn and libidn2 cannot be requested simultaneously')
1008 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
1009 libidn = dependency('libidn',
1010 required : want_libidn == 'true')
1011 have = libidn.found()
1016 conf.set10('HAVE_LIBIDN', have)
1017 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
1018 if not have and want_libidn2 != 'false' and not fuzzer_build
1019 # libidn is used for both libidn and libidn2 objects
1020 libidn = dependency('libidn2',
1021 required : want_libidn2 == 'true')
1022 have = libidn.found()
1026 conf.set10('HAVE_LIBIDN2', have)
1027 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
1029 want_libiptc = get_option('libiptc')
1030 if want_libiptc != 'false' and not fuzzer_build
1031 libiptc = dependency('libiptc',
1032 required : want_libiptc == 'true')
1033 have = libiptc.found()
1038 conf.set10('HAVE_LIBIPTC', have)
1039 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
1041 want_qrencode = get_option('qrencode')
1042 if want_qrencode != 'false' and not fuzzer_build
1043 libqrencode = dependency('libqrencode',
1044 required : want_qrencode == 'true')
1045 have = libqrencode.found()
1050 conf.set10('HAVE_QRENCODE', have)
1052 want_gcrypt = get_option('gcrypt')
1053 if want_gcrypt != 'false' and not fuzzer_build
1054 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1055 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1056 have = libgcrypt.found() and libgpg_error.found()
1061 # link to neither of the libs if one is not found
1065 conf.set10('HAVE_GCRYPT', have)
1067 want_gnutls = get_option('gnutls')
1068 if want_gnutls != 'false' and not fuzzer_build
1069 libgnutls = dependency('gnutls',
1070 version : '>= 3.1.4',
1071 required : want_gnutls == 'true')
1072 have = libgnutls.found()
1077 conf.set10('HAVE_GNUTLS', have)
1079 want_elfutils = get_option('elfutils')
1080 if want_elfutils != 'false' and not fuzzer_build
1081 libdw = dependency('libdw',
1082 required : want_elfutils == 'true')
1083 have = libdw.found()
1088 conf.set10('HAVE_ELFUTILS', have)
1090 want_zlib = get_option('zlib')
1091 if want_zlib != 'false' and not fuzzer_build
1092 libz = dependency('zlib',
1093 required : want_zlib == 'true')
1099 conf.set10('HAVE_ZLIB', have)
1101 want_bzip2 = get_option('bzip2')
1102 if want_bzip2 != 'false' and not fuzzer_build
1103 libbzip2 = cc.find_library('bz2',
1104 required : want_bzip2 == 'true')
1105 have = libbzip2.found()
1110 conf.set10('HAVE_BZIP2', have)
1112 want_xz = get_option('xz')
1113 if want_xz != 'false' and not fuzzer_build
1114 libxz = dependency('liblzma',
1115 required : want_xz == 'true')
1116 have = libxz.found()
1121 conf.set10('HAVE_XZ', have)
1123 want_lz4 = get_option('lz4')
1124 if want_lz4 != 'false' and not fuzzer_build
1125 liblz4 = dependency('liblz4',
1126 required : want_lz4 == 'true')
1127 have = liblz4.found()
1132 conf.set10('HAVE_LZ4', have)
1134 want_xkbcommon = get_option('xkbcommon')
1135 if want_xkbcommon != 'false' and not fuzzer_build
1136 libxkbcommon = dependency('xkbcommon',
1137 version : '>= 0.3.0',
1138 required : want_xkbcommon == 'true')
1139 have = libxkbcommon.found()
1144 conf.set10('HAVE_XKBCOMMON', have)
1146 want_pcre2 = get_option('pcre2')
1147 if want_pcre2 != 'false'
1148 libpcre2 = dependency('libpcre2-8',
1149 required : want_pcre2 == 'true')
1150 have = libpcre2.found()
1155 conf.set10('HAVE_PCRE2', have)
1157 want_glib = get_option('glib')
1158 if want_glib != 'false' and not fuzzer_build
1159 libglib = dependency('glib-2.0',
1160 version : '>= 2.22.0',
1161 required : want_glib == 'true')
1162 libgobject = dependency('gobject-2.0',
1163 version : '>= 2.22.0',
1164 required : want_glib == 'true')
1165 libgio = dependency('gio-2.0',
1166 required : want_glib == 'true')
1167 have = libglib.found() and libgobject.found() and libgio.found()
1174 conf.set10('HAVE_GLIB', have)
1176 want_dbus = get_option('dbus')
1177 if want_dbus != 'false' and not fuzzer_build
1178 libdbus = dependency('dbus-1',
1179 version : '>= 1.3.2',
1180 required : want_dbus == 'true')
1181 have = libdbus.found()
1186 conf.set10('HAVE_DBUS', have)
1188 default_dnssec = get_option('default-dnssec')
1190 default_dnssec = 'no'
1192 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1193 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1194 default_dnssec = 'no'
1196 conf.set('DEFAULT_DNSSEC_MODE',
1197 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1198 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1200 want_importd = get_option('importd')
1201 if want_importd != 'false'
1202 have = (conf.get('HAVE_LIBCURL') == 1 and
1203 conf.get('HAVE_ZLIB') == 1 and
1204 conf.get('HAVE_BZIP2') == 1 and
1205 conf.get('HAVE_XZ') == 1 and
1206 conf.get('HAVE_GCRYPT') == 1)
1207 if want_importd == 'true' and not have
1208 error('importd support was requested, but dependencies are not available')
1213 conf.set10('ENABLE_IMPORTD', have)
1215 want_remote = get_option('remote')
1216 if want_remote != 'false'
1217 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1218 conf.get('HAVE_LIBCURL') == 1]
1219 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1220 # it's possible to build one without the other. Complain only if
1221 # support was explictly requested. The auxiliary files like sysusers
1222 # config should be installed when any of the programs are built.
1223 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1224 error('remote support was requested, but dependencies are not available')
1226 have = have_deps[0] or have_deps[1]
1230 conf.set10('ENABLE_REMOTE', have)
1232 foreach term : ['utmp',
1263 have = get_option(term)
1264 name = 'ENABLE_' + term.underscorify().to_upper()
1265 conf.set10(name, have)
1266 m4_defines += have ? ['-D' + name] : []
1269 want_tests = get_option('tests')
1270 install_tests = get_option('install-tests')
1271 slow_tests = get_option('slow-tests')
1275 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1277 #####################################################################
1279 if get_option('efi')
1280 efi_arch = host_machine.cpu_family()
1282 if efi_arch == 'x86'
1283 EFI_MACHINE_TYPE_NAME = 'ia32'
1284 gnu_efi_arch = 'ia32'
1285 elif efi_arch == 'x86_64'
1286 EFI_MACHINE_TYPE_NAME = 'x64'
1287 gnu_efi_arch = 'x86_64'
1288 elif efi_arch == 'arm'
1289 EFI_MACHINE_TYPE_NAME = 'arm'
1290 gnu_efi_arch = 'arm'
1291 elif efi_arch == 'aarch64'
1292 EFI_MACHINE_TYPE_NAME = 'aa64'
1293 gnu_efi_arch = 'aarch64'
1295 EFI_MACHINE_TYPE_NAME = ''
1300 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1302 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1306 conf.set10('ENABLE_EFI', have)
1308 #####################################################################
1310 config_h = configure_file(
1311 output : 'config.h',
1312 configuration : conf)
1314 includes = include_directories('src/basic',
1324 'src/libsystemd/sd-bus',
1325 'src/libsystemd/sd-device',
1326 'src/libsystemd/sd-hwdb',
1327 'src/libsystemd/sd-id128',
1328 'src/libsystemd/sd-netlink',
1329 'src/libsystemd/sd-network',
1330 'src/libsystemd-network',
1333 add_project_arguments('-include', 'config.h', language : 'c')
1337 subdir('src/systemd')
1339 subdir('src/libsystemd')
1340 subdir('src/libsystemd-network')
1341 subdir('src/journal')
1344 libjournal_core = static_library(
1346 libjournal_core_sources,
1348 include_directories : includes,
1351 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1352 libsystemd = shared_library(
1354 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1355 version : libsystemd_version,
1356 include_directories : includes,
1357 link_args : ['-shared',
1358 '-Wl,--version-script=' + libsystemd_sym_path],
1359 link_with : [libbasic,
1361 link_whole : [libsystemd_static,
1363 dependencies : [threads,
1367 link_depends : libsystemd_sym,
1369 install_dir : rootlibdir)
1371 ############################################################
1373 # binaries that have --help and are intended for use by humans,
1374 # usually, but not always, installed in /bin.
1375 public_programs = []
1377 subdir('src/libudev')
1378 subdir('src/shared')
1381 subdir('src/network')
1383 subdir('src/analyze')
1384 subdir('src/journal-remote')
1385 subdir('src/coredump')
1386 subdir('src/hostname')
1387 subdir('src/import')
1388 subdir('src/kernel-install')
1389 subdir('src/locale')
1390 subdir('src/machine')
1391 subdir('src/nspawn')
1392 subdir('src/resolve')
1393 subdir('src/timedate')
1394 subdir('src/timesync')
1395 subdir('src/vconsole')
1396 subdir('src/boot/efi')
1403 ############################################################
1405 # only static linking apart from libdl, to make sure that the
1406 # module is linked to all libraries that it uses.
1407 test_dlopen = executable(
1410 include_directories : includes,
1411 link_with : [libbasic],
1412 dependencies : [libdl])
1414 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1415 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1416 ['mymachines', 'ENABLE_MACHINED'],
1417 ['resolve', 'ENABLE_RESOLVE']]
1419 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1423 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1424 version_script_arg = join_paths(meson.current_source_dir(), sym)
1426 nss = shared_library(
1428 'src/nss-@0@/nss-@0@.c'.format(module),
1430 include_directories : includes,
1431 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1432 link_args : ['-Wl,-z,nodelete',
1434 '-Wl,--version-script=' + version_script_arg,
1436 link_with : [libsystemd_static,
1438 dependencies : [threads,
1442 install_dir : rootlibdir)
1444 # We cannot use shared_module because it does not support version suffix.
1445 # Unfortunately shared_library insists on creating the symlink…
1446 meson.add_install_script('sh', '-c',
1447 'rm $DESTDIR@0@/libnss_@1@.so'
1448 .format(rootlibdir, module))
1450 test('dlopen-nss_' + module,
1452 args : [nss.full_path()]) # path to dlopen must include a slash
1456 ############################################################
1458 executable('systemd',
1460 include_directories : includes,
1461 link_with : [libcore,
1463 dependencies : [threads,
1469 install_rpath : rootlibexecdir,
1471 install_dir : rootlibexecdir)
1473 meson.add_install_script(meson_make_symlink,
1474 join_paths(rootlibexecdir, 'systemd'),
1475 join_paths(rootsbindir, 'init'))
1477 exe = executable('systemd-analyze',
1478 systemd_analyze_sources,
1479 include_directories : includes,
1480 link_with : [libcore,
1482 dependencies : [threads,
1488 install_rpath : rootlibexecdir,
1490 public_programs += [exe]
1492 executable('systemd-journald',
1493 systemd_journald_sources,
1494 include_directories : includes,
1495 link_with : [libjournal_core,
1497 dependencies : [threads,
1501 install_rpath : rootlibexecdir,
1503 install_dir : rootlibexecdir)
1505 exe = executable('systemd-cat',
1506 systemd_cat_sources,
1507 include_directories : includes,
1508 link_with : [libjournal_core,
1510 dependencies : [threads],
1511 install_rpath : rootlibexecdir,
1513 public_programs += [exe]
1515 exe = executable('journalctl',
1517 include_directories : includes,
1518 link_with : [libshared],
1519 dependencies : [threads,
1524 install_rpath : rootlibexecdir,
1526 install_dir : rootbindir)
1527 public_programs += [exe]
1529 executable('systemd-getty-generator',
1530 'src/getty-generator/getty-generator.c',
1531 include_directories : includes,
1532 link_with : [libshared],
1533 install_rpath : rootlibexecdir,
1535 install_dir : systemgeneratordir)
1537 executable('systemd-debug-generator',
1538 'src/debug-generator/debug-generator.c',
1539 include_directories : includes,
1540 link_with : [libshared],
1541 install_rpath : rootlibexecdir,
1543 install_dir : systemgeneratordir)
1545 executable('systemd-fstab-generator',
1546 'src/fstab-generator/fstab-generator.c',
1547 'src/core/mount-setup.c',
1548 include_directories : includes,
1549 link_with : [libshared],
1550 install_rpath : rootlibexecdir,
1552 install_dir : systemgeneratordir)
1554 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1555 executable('30-systemd-environment-d-generator',
1556 'src/environment-d-generator/environment-d-generator.c',
1557 include_directories : includes,
1558 link_with : [libshared],
1559 install_rpath : rootlibexecdir,
1561 install_dir : userenvgeneratordir)
1563 meson.add_install_script(meson_make_symlink,
1564 join_paths(sysconfdir, 'environment'),
1565 join_paths(environmentdir, '99-environment.conf'))
1568 if conf.get('ENABLE_HIBERNATE') == 1
1569 executable('systemd-hibernate-resume-generator',
1570 'src/hibernate-resume/hibernate-resume-generator.c',
1571 include_directories : includes,
1572 link_with : [libshared],
1573 install_rpath : rootlibexecdir,
1575 install_dir : systemgeneratordir)
1577 executable('systemd-hibernate-resume',
1578 'src/hibernate-resume/hibernate-resume.c',
1579 include_directories : includes,
1580 link_with : [libshared],
1581 install_rpath : rootlibexecdir,
1583 install_dir : rootlibexecdir)
1586 if conf.get('HAVE_BLKID') == 1
1587 executable('systemd-gpt-auto-generator',
1588 'src/gpt-auto-generator/gpt-auto-generator.c',
1589 'src/basic/blkid-util.h',
1590 include_directories : includes,
1591 link_with : [libshared],
1592 dependencies : libblkid,
1593 install_rpath : rootlibexecdir,
1595 install_dir : systemgeneratordir)
1597 exe = executable('systemd-dissect',
1598 'src/dissect/dissect.c',
1599 include_directories : includes,
1600 link_with : [libshared],
1601 install_rpath : rootlibexecdir,
1603 install_dir : rootlibexecdir)
1604 public_programs += [exe]
1607 if conf.get('ENABLE_RESOLVE') == 1
1608 executable('systemd-resolved',
1609 systemd_resolved_sources,
1610 include_directories : includes,
1611 link_with : [libshared,
1613 libsystemd_resolve_core],
1614 dependencies : [threads,
1618 install_rpath : rootlibexecdir,
1620 install_dir : rootlibexecdir)
1622 exe = executable('systemd-resolve',
1623 systemd_resolve_sources,
1624 include_directories : includes,
1625 link_with : [libshared,
1627 libsystemd_resolve_core],
1628 dependencies : [threads,
1632 install_rpath : rootlibexecdir,
1634 public_programs += [exe]
1636 meson.add_install_script(meson_make_symlink,
1637 join_paths(bindir, 'systemd-resolve'),
1638 join_paths(rootsbindir, 'resolvconf'))
1641 if conf.get('ENABLE_LOGIND') == 1
1642 executable('systemd-logind',
1643 systemd_logind_sources,
1644 include_directories : includes,
1645 link_with : [liblogind_core,
1647 dependencies : [threads,
1649 install_rpath : rootlibexecdir,
1651 install_dir : rootlibexecdir)
1653 exe = executable('loginctl',
1655 include_directories : includes,
1656 link_with : [libshared],
1657 dependencies : [threads,
1660 install_rpath : rootlibexecdir,
1662 install_dir : rootbindir)
1663 public_programs += [exe]
1665 exe = executable('systemd-inhibit',
1666 'src/login/inhibit.c',
1667 include_directories : includes,
1668 link_with : [libshared],
1669 install_rpath : rootlibexecdir,
1671 install_dir : rootbindir)
1672 public_programs += [exe]
1674 if conf.get('HAVE_PAM') == 1
1675 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1676 pam_systemd = shared_library(
1680 include_directories : includes,
1681 link_args : ['-shared',
1682 '-Wl,--version-script=' + version_script_arg],
1683 link_with : [libsystemd_static,
1685 dependencies : [threads,
1688 link_depends : pam_systemd_sym,
1690 install_dir : pamlibdir)
1692 test('dlopen-pam_systemd',
1694 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1698 if conf.get('HAVE_PAM') == 1
1699 executable('systemd-user-sessions',
1700 'src/user-sessions/user-sessions.c',
1701 include_directories : includes,
1702 link_with : [libshared],
1703 install_rpath : rootlibexecdir,
1705 install_dir : rootlibexecdir)
1708 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1709 exe = executable('bootctl',
1710 'src/boot/bootctl.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 dependencies : [libblkid],
1714 install_rpath : rootlibexecdir,
1716 public_programs += [exe]
1719 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1720 include_directories : includes,
1721 link_with : [libshared],
1722 dependencies : [threads],
1723 install_rpath : rootlibexecdir,
1725 public_programs += [exe]
1727 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1728 include_directories : includes,
1729 link_with : [libshared],
1730 dependencies : [threads,
1735 install_rpath : rootlibexecdir,
1737 install_dir : rootbindir)
1738 public_programs += [exe]
1740 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1741 meson.add_install_script(meson_make_symlink,
1742 join_paths(rootbindir, 'systemctl'),
1743 join_paths(rootsbindir, alias))
1746 if conf.get('ENABLE_BACKLIGHT') == 1
1747 executable('systemd-backlight',
1748 'src/backlight/backlight.c',
1749 include_directories : includes,
1750 link_with : [libshared],
1751 install_rpath : rootlibexecdir,
1753 install_dir : rootlibexecdir)
1756 if conf.get('ENABLE_RFKILL') == 1
1757 executable('systemd-rfkill',
1758 'src/rfkill/rfkill.c',
1759 include_directories : includes,
1760 link_with : [libshared],
1761 install_rpath : rootlibexecdir,
1763 install_dir : rootlibexecdir)
1766 executable('systemd-system-update-generator',
1767 'src/system-update-generator/system-update-generator.c',
1768 include_directories : includes,
1769 link_with : [libshared],
1770 install_rpath : rootlibexecdir,
1772 install_dir : systemgeneratordir)
1774 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1775 executable('systemd-cryptsetup',
1776 'src/cryptsetup/cryptsetup.c',
1777 include_directories : includes,
1778 link_with : [libshared],
1779 dependencies : [libcryptsetup],
1780 install_rpath : rootlibexecdir,
1782 install_dir : rootlibexecdir)
1784 executable('systemd-cryptsetup-generator',
1785 'src/cryptsetup/cryptsetup-generator.c',
1786 include_directories : includes,
1787 link_with : [libshared],
1788 dependencies : [libcryptsetup],
1789 install_rpath : rootlibexecdir,
1791 install_dir : systemgeneratordir)
1793 executable('systemd-veritysetup',
1794 'src/veritysetup/veritysetup.c',
1795 include_directories : includes,
1796 link_with : [libshared],
1797 dependencies : [libcryptsetup],
1798 install_rpath : rootlibexecdir,
1800 install_dir : rootlibexecdir)
1802 executable('systemd-veritysetup-generator',
1803 'src/veritysetup/veritysetup-generator.c',
1804 include_directories : includes,
1805 link_with : [libshared],
1806 dependencies : [libcryptsetup],
1807 install_rpath : rootlibexecdir,
1809 install_dir : systemgeneratordir)
1812 if conf.get('HAVE_SYSV_COMPAT') == 1
1813 executable('systemd-sysv-generator',
1814 'src/sysv-generator/sysv-generator.c',
1815 include_directories : includes,
1816 link_with : [libshared],
1817 install_rpath : rootlibexecdir,
1819 install_dir : systemgeneratordir)
1821 executable('systemd-rc-local-generator',
1822 'src/rc-local-generator/rc-local-generator.c',
1823 include_directories : includes,
1824 link_with : [libshared],
1825 install_rpath : rootlibexecdir,
1827 install_dir : systemgeneratordir)
1830 if conf.get('ENABLE_HOSTNAMED') == 1
1831 executable('systemd-hostnamed',
1832 'src/hostname/hostnamed.c',
1833 include_directories : includes,
1834 link_with : [libshared],
1835 install_rpath : rootlibexecdir,
1837 install_dir : rootlibexecdir)
1839 exe = executable('hostnamectl',
1840 'src/hostname/hostnamectl.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 install_rpath : rootlibexecdir,
1845 public_programs += [exe]
1848 if conf.get('ENABLE_LOCALED') == 1
1849 if conf.get('HAVE_XKBCOMMON') == 1
1850 # logind will load libxkbcommon.so dynamically on its own
1856 executable('systemd-localed',
1857 systemd_localed_sources,
1858 include_directories : includes,
1859 link_with : [libshared],
1860 dependencies : deps,
1861 install_rpath : rootlibexecdir,
1863 install_dir : rootlibexecdir)
1865 exe = executable('localectl',
1867 include_directories : includes,
1868 link_with : [libshared],
1869 install_rpath : rootlibexecdir,
1871 public_programs += [exe]
1874 if conf.get('ENABLE_TIMEDATED') == 1
1875 executable('systemd-timedated',
1876 'src/timedate/timedated.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 install_rpath : rootlibexecdir,
1881 install_dir : rootlibexecdir)
1883 exe = executable('timedatectl',
1884 'src/timedate/timedatectl.c',
1885 include_directories : includes,
1886 install_rpath : rootlibexecdir,
1887 link_with : [libshared],
1889 public_programs += [exe]
1892 if conf.get('ENABLE_TIMESYNCD') == 1
1893 executable('systemd-timesyncd',
1894 systemd_timesyncd_sources,
1895 include_directories : includes,
1896 link_with : [libshared],
1897 dependencies : [threads,
1899 install_rpath : rootlibexecdir,
1901 install_dir : rootlibexecdir)
1904 if conf.get('ENABLE_MACHINED') == 1
1905 executable('systemd-machined',
1906 systemd_machined_sources,
1907 include_directories : includes,
1908 link_with : [libmachine_core,
1910 install_rpath : rootlibexecdir,
1912 install_dir : rootlibexecdir)
1914 exe = executable('machinectl',
1915 'src/machine/machinectl.c',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 dependencies : [threads,
1921 install_rpath : rootlibexecdir,
1923 install_dir : rootbindir)
1924 public_programs += [exe]
1927 if conf.get('ENABLE_IMPORTD') == 1
1928 executable('systemd-importd',
1929 systemd_importd_sources,
1930 include_directories : includes,
1931 link_with : [libshared],
1932 dependencies : [threads],
1933 install_rpath : rootlibexecdir,
1935 install_dir : rootlibexecdir)
1937 systemd_pull = executable('systemd-pull',
1938 systemd_pull_sources,
1939 include_directories : includes,
1940 link_with : [libshared],
1941 dependencies : [libcurl,
1946 install_rpath : rootlibexecdir,
1948 install_dir : rootlibexecdir)
1950 systemd_import = executable('systemd-import',
1951 systemd_import_sources,
1952 include_directories : includes,
1953 link_with : [libshared],
1954 dependencies : [libcurl,
1958 install_rpath : rootlibexecdir,
1960 install_dir : rootlibexecdir)
1962 systemd_export = executable('systemd-export',
1963 systemd_export_sources,
1964 include_directories : includes,
1965 link_with : [libshared],
1966 dependencies : [libcurl,
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootlibexecdir)
1973 public_programs += [systemd_pull, systemd_import, systemd_export]
1976 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1977 exe = executable('systemd-journal-upload',
1978 systemd_journal_upload_sources,
1979 include_directories : includes,
1980 link_with : [libshared],
1981 dependencies : [threads,
1986 install_rpath : rootlibexecdir,
1988 install_dir : rootlibexecdir)
1989 public_programs += [exe]
1992 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1993 s_j_remote = executable('systemd-journal-remote',
1994 systemd_journal_remote_sources,
1995 include_directories : includes,
1996 link_with : [libshared],
1997 dependencies : [threads,
2002 install_rpath : rootlibexecdir,
2004 install_dir : rootlibexecdir)
2006 s_j_gatewayd = executable('systemd-journal-gatewayd',
2007 systemd_journal_gatewayd_sources,
2008 include_directories : includes,
2009 link_with : [libshared],
2010 dependencies : [threads,
2015 install_rpath : rootlibexecdir,
2017 install_dir : rootlibexecdir)
2018 public_programs += [s_j_remote, s_j_gatewayd]
2021 if conf.get('ENABLE_COREDUMP') == 1
2022 executable('systemd-coredump',
2023 systemd_coredump_sources,
2024 include_directories : includes,
2025 link_with : [libshared],
2026 dependencies : [threads,
2031 install_rpath : rootlibexecdir,
2033 install_dir : rootlibexecdir)
2035 exe = executable('coredumpctl',
2036 coredumpctl_sources,
2037 include_directories : includes,
2038 link_with : [libshared],
2039 dependencies : [threads,
2042 install_rpath : rootlibexecdir,
2044 public_programs += [exe]
2047 if conf.get('ENABLE_BINFMT') == 1
2048 exe = executable('systemd-binfmt',
2049 'src/binfmt/binfmt.c',
2050 include_directories : includes,
2051 link_with : [libshared],
2052 install_rpath : rootlibexecdir,
2054 install_dir : rootlibexecdir)
2055 public_programs += [exe]
2057 meson.add_install_script('sh', '-c',
2058 mkdir_p.format(binfmtdir))
2059 meson.add_install_script('sh', '-c',
2060 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2063 if conf.get('ENABLE_VCONSOLE') == 1
2064 executable('systemd-vconsole-setup',
2065 'src/vconsole/vconsole-setup.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 install_rpath : rootlibexecdir,
2070 install_dir : rootlibexecdir)
2073 if conf.get('ENABLE_RANDOMSEED') == 1
2074 executable('systemd-random-seed',
2075 'src/random-seed/random-seed.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 install_rpath : rootlibexecdir,
2080 install_dir : rootlibexecdir)
2083 if conf.get('ENABLE_FIRSTBOOT') == 1
2084 executable('systemd-firstboot',
2085 'src/firstboot/firstboot.c',
2086 include_directories : includes,
2087 link_with : [libshared],
2088 dependencies : [libcrypt],
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootbindir)
2094 executable('systemd-remount-fs',
2095 'src/remount-fs/remount-fs.c',
2096 'src/core/mount-setup.c',
2097 'src/core/mount-setup.h',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2102 install_dir : rootlibexecdir)
2104 executable('systemd-machine-id-setup',
2105 'src/machine-id-setup/machine-id-setup-main.c',
2106 'src/core/machine-id-setup.c',
2107 'src/core/machine-id-setup.h',
2108 include_directories : includes,
2109 link_with : [libshared],
2110 install_rpath : rootlibexecdir,
2112 install_dir : rootbindir)
2114 executable('systemd-fsck',
2116 include_directories : includes,
2117 link_with : [libshared],
2118 install_rpath : rootlibexecdir,
2120 install_dir : rootlibexecdir)
2122 executable('systemd-growfs',
2123 'src/partition/growfs.c',
2124 include_directories : includes,
2125 link_with : [libshared],
2126 dependencies : [libcryptsetup],
2127 install_rpath : rootlibexecdir,
2129 install_dir : rootlibexecdir)
2131 executable('systemd-makefs',
2132 'src/partition/makefs.c',
2133 include_directories : includes,
2134 link_with : [libshared],
2135 install_rpath : rootlibexecdir,
2137 install_dir : rootlibexecdir)
2139 executable('systemd-sleep',
2140 'src/sleep/sleep.c',
2141 include_directories : includes,
2142 link_with : [libshared],
2143 install_rpath : rootlibexecdir,
2145 install_dir : rootlibexecdir)
2147 exe = executable('systemd-sysctl',
2148 'src/sysctl/sysctl.c',
2149 include_directories : includes,
2150 link_with : [libshared],
2151 install_rpath : rootlibexecdir,
2153 install_dir : rootlibexecdir)
2154 public_programs += [exe]
2156 executable('systemd-ac-power',
2157 'src/ac-power/ac-power.c',
2158 include_directories : includes,
2159 link_with : [libshared],
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootlibexecdir)
2164 exe = executable('systemd-detect-virt',
2165 'src/detect-virt/detect-virt.c',
2166 include_directories : includes,
2167 link_with : [libshared],
2168 install_rpath : rootlibexecdir,
2170 public_programs += [exe]
2172 exe = executable('systemd-delta',
2173 'src/delta/delta.c',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2178 public_programs += [exe]
2180 exe = executable('systemd-escape',
2181 'src/escape/escape.c',
2182 include_directories : includes,
2183 link_with : [libshared],
2184 install_rpath : rootlibexecdir,
2186 install_dir : rootbindir)
2187 public_programs += [exe]
2189 exe = executable('systemd-notify',
2190 'src/notify/notify.c',
2191 include_directories : includes,
2192 link_with : [libshared],
2193 install_rpath : rootlibexecdir,
2195 install_dir : rootbindir)
2196 public_programs += [exe]
2198 executable('systemd-volatile-root',
2199 'src/volatile-root/volatile-root.c',
2200 include_directories : includes,
2201 link_with : [libshared],
2202 install_rpath : rootlibexecdir,
2204 install_dir : rootlibexecdir)
2206 executable('systemd-cgroups-agent',
2207 'src/cgroups-agent/cgroups-agent.c',
2208 include_directories : includes,
2209 link_with : [libshared],
2210 install_rpath : rootlibexecdir,
2212 install_dir : rootlibexecdir)
2214 exe = executable('systemd-path',
2216 include_directories : includes,
2217 link_with : [libshared],
2218 install_rpath : rootlibexecdir,
2220 public_programs += [exe]
2222 exe = executable('systemd-ask-password',
2223 'src/ask-password/ask-password.c',
2224 include_directories : includes,
2225 link_with : [libshared],
2226 install_rpath : rootlibexecdir,
2228 install_dir : rootbindir)
2229 public_programs += [exe]
2231 executable('systemd-reply-password',
2232 'src/reply-password/reply-password.c',
2233 include_directories : includes,
2234 link_with : [libshared],
2235 install_rpath : rootlibexecdir,
2237 install_dir : rootlibexecdir)
2239 exe = executable('systemd-tty-ask-password-agent',
2240 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2241 include_directories : includes,
2242 link_with : [libshared],
2243 install_rpath : rootlibexecdir,
2245 install_dir : rootbindir)
2246 public_programs += [exe]
2248 exe = executable('systemd-cgls',
2250 include_directories : includes,
2251 link_with : [libshared],
2252 install_rpath : rootlibexecdir,
2254 public_programs += [exe]
2256 exe = executable('systemd-cgtop',
2257 'src/cgtop/cgtop.c',
2258 include_directories : includes,
2259 link_with : [libshared],
2260 install_rpath : rootlibexecdir,
2262 public_programs += [exe]
2264 executable('systemd-initctl',
2265 'src/initctl/initctl.c',
2266 include_directories : includes,
2267 link_with : [libshared],
2268 install_rpath : rootlibexecdir,
2270 install_dir : rootlibexecdir)
2272 exe = executable('systemd-mount',
2273 'src/mount/mount-tool.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2278 public_programs += [exe]
2280 meson.add_install_script(meson_make_symlink,
2281 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2283 exe = executable('systemd-run',
2285 include_directories : includes,
2286 link_with : [libshared],
2287 install_rpath : rootlibexecdir,
2289 public_programs += [exe]
2291 exe = executable('systemd-stdio-bridge',
2292 'src/stdio-bridge/stdio-bridge.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2297 public_programs += [exe]
2299 exe = executable('busctl',
2300 'src/busctl/busctl.c',
2301 'src/busctl/busctl-introspect.c',
2302 'src/busctl/busctl-introspect.h',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 install_rpath : rootlibexecdir,
2307 public_programs += [exe]
2309 if conf.get('ENABLE_SYSUSERS') == 1
2310 exe = executable('systemd-sysusers',
2311 'src/sysusers/sysusers.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2316 install_dir : rootbindir)
2317 public_programs += [exe]
2320 if conf.get('ENABLE_TMPFILES') == 1
2321 exe = executable('systemd-tmpfiles',
2322 'src/tmpfiles/tmpfiles.c',
2323 include_directories : includes,
2324 link_with : [libshared],
2325 dependencies : [libacl],
2326 install_rpath : rootlibexecdir,
2328 install_dir : rootbindir)
2329 public_programs += [exe]
2331 test('test-systemd-tmpfiles',
2332 test_systemd_tmpfiles_py,
2333 args : exe.full_path())
2334 # https://github.com/mesonbuild/meson/issues/2681
2337 if conf.get('ENABLE_HWDB') == 1
2338 exe = executable('systemd-hwdb',
2340 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2341 include_directories : includes,
2342 link_with : [libudev_static],
2343 install_rpath : udev_rpath,
2345 install_dir : rootbindir)
2346 public_programs += [exe]
2349 if conf.get('ENABLE_QUOTACHECK') == 1
2350 executable('systemd-quotacheck',
2351 'src/quotacheck/quotacheck.c',
2352 include_directories : includes,
2353 link_with : [libshared],
2354 install_rpath : rootlibexecdir,
2356 install_dir : rootlibexecdir)
2359 exe = executable('systemd-socket-proxyd',
2360 'src/socket-proxy/socket-proxyd.c',
2361 include_directories : includes,
2362 link_with : [libshared],
2363 dependencies : [threads],
2364 install_rpath : rootlibexecdir,
2366 install_dir : rootlibexecdir)
2367 public_programs += [exe]
2369 exe = executable('systemd-udevd',
2370 systemd_udevd_sources,
2371 include_directories : includes,
2372 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2373 link_with : [libudev_core,
2376 dependencies : [threads,
2381 install_rpath : udev_rpath,
2383 install_dir : rootlibexecdir)
2384 public_programs += [exe]
2386 exe = executable('udevadm',
2388 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2389 include_directories : includes,
2390 link_with : [libudev_core,
2393 dependencies : [threads,
2398 install_rpath : udev_rpath,
2400 install_dir : rootbindir)
2401 public_programs += [exe]
2403 executable('systemd-shutdown',
2404 systemd_shutdown_sources,
2405 include_directories : includes,
2406 link_with : [libshared],
2407 install_rpath : rootlibexecdir,
2409 install_dir : rootlibexecdir)
2411 executable('systemd-update-done',
2412 'src/update-done/update-done.c',
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2417 install_dir : rootlibexecdir)
2419 executable('systemd-update-utmp',
2420 'src/update-utmp/update-utmp.c',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 dependencies : [libaudit],
2424 install_rpath : rootlibexecdir,
2426 install_dir : rootlibexecdir)
2428 if conf.get('HAVE_KMOD') == 1
2429 executable('systemd-modules-load',
2430 'src/modules-load/modules-load.c',
2431 include_directories : includes,
2432 link_with : [libshared],
2433 dependencies : [libkmod],
2434 install_rpath : rootlibexecdir,
2436 install_dir : rootlibexecdir)
2438 meson.add_install_script('sh', '-c',
2439 mkdir_p.format(modulesloaddir))
2440 meson.add_install_script('sh', '-c',
2441 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2444 exe = executable('systemd-nspawn',
2445 systemd_nspawn_sources,
2446 'src/core/mount-setup.c', # FIXME: use a variable?
2447 'src/core/mount-setup.h',
2448 'src/core/loopback-setup.c',
2449 'src/core/loopback-setup.h',
2450 include_directories : [includes, include_directories('src/nspawn')],
2451 link_with : [libshared],
2452 dependencies : [libacl,
2456 install_rpath : rootlibexecdir,
2458 public_programs += [exe]
2460 if conf.get('ENABLE_NETWORKD') == 1
2461 executable('systemd-networkd',
2462 systemd_networkd_sources,
2463 include_directories : includes,
2464 link_with : [libnetworkd_core,
2468 dependencies : [threads],
2469 install_rpath : rootlibexecdir,
2471 install_dir : rootlibexecdir)
2473 executable('systemd-networkd-wait-online',
2474 systemd_networkd_wait_online_sources,
2475 include_directories : includes,
2476 link_with : [libnetworkd_core,
2478 install_rpath : rootlibexecdir,
2480 install_dir : rootlibexecdir)
2482 exe = executable('networkctl',
2484 include_directories : includes,
2485 link_with : [libsystemd_network,
2487 install_rpath : rootlibexecdir,
2489 install_dir : rootbindir)
2490 public_programs += [exe]
2493 executable('systemd-sulogin-shell',
2494 ['src/sulogin-shell/sulogin-shell.c'],
2495 include_directories : includes,
2496 link_with : [libshared],
2497 install_rpath : rootlibexecdir,
2499 install_dir : rootlibexecdir)
2501 ############################################################
2503 foreach tuple : tests
2505 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2506 dependencies = tuple[2]
2507 condition = tuple.length() >= 4 ? tuple[3] : ''
2508 type = tuple.length() >= 5 ? tuple[4] : ''
2509 defs = tuple.length() >= 6 ? tuple[5] : []
2510 incs = tuple.length() >= 7 ? tuple[6] : includes
2513 name = sources[0].split('/')[-1].split('.')[0]
2514 if type.startswith('timeout=')
2515 timeout = type.split('=')[1].to_int()
2518 if want_tests == 'false'
2519 message('Not compiling @0@ because tests is set to false'.format(name))
2520 elif condition == '' or conf.get(condition) == 1
2524 include_directories : incs,
2525 link_with : link_with,
2526 dependencies : dependencies,
2528 install_rpath : rootlibexecdir,
2529 install : install_tests,
2530 install_dir : join_paths(testsdir, type))
2533 message('@0@ is a manual test'.format(name))
2534 elif type == 'unsafe' and want_tests != 'unsafe'
2535 message('@0@ is an unsafe test'.format(name))
2542 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2546 test_libsystemd_sym = executable(
2547 'test-libsystemd-sym',
2548 test_libsystemd_sym_c,
2549 include_directories : includes,
2550 link_with : [libsystemd],
2551 install : install_tests,
2552 install_dir : testsdir)
2553 test('test-libsystemd-sym',
2554 test_libsystemd_sym)
2556 test_libudev_sym = executable(
2559 include_directories : includes,
2560 c_args : ['-Wno-deprecated-declarations'],
2561 link_with : [libudev],
2562 install : install_tests,
2563 install_dir : testsdir)
2564 test('test-libudev-sym',
2567 ############################################################
2571 foreach tuple : fuzzers
2573 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2574 dependencies = tuple[2]
2575 defs = tuple.length() >= 4 ? tuple[3] : []
2576 incs = tuple.length() >= 5 ? tuple[4] : includes
2579 dependencies += fuzzing_engine
2581 sources += 'src/fuzz/fuzz-main.c'
2584 name = sources[0].split('/')[-1].split('.')[0]
2586 fuzzer_exes += executable(
2589 include_directories : [incs, include_directories('src/fuzz')],
2590 link_with : link_with,
2591 dependencies : dependencies,
2596 run_target('fuzzers',
2597 depends : fuzzer_exes,
2600 ############################################################
2602 make_directive_index_py = find_program('tools/make-directive-index.py')
2603 make_man_index_py = find_program('tools/make-man-index.py')
2604 xml_helper_py = find_program('tools/xml_helper.py')
2605 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2609 subdir('sysusers.d')
2610 subdir('tmpfiles.d')
2615 subdir('shell-completion/bash')
2616 subdir('shell-completion/zsh')
2617 subdir('docs/sysvinit')
2618 subdir('docs/var-log')
2620 # FIXME: figure out if the warning is true:
2621 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2622 install_subdir('factory/etc',
2623 install_dir : factorydir)
2626 install_data('xorg/50-systemd-user.sh',
2627 install_dir : xinitrcdir)
2628 install_data('modprobe.d/systemd.conf',
2629 install_dir : modprobedir)
2630 install_data('LICENSE.GPL2',
2635 'doc/DISTRO_PORTING',
2636 'doc/ENVIRONMENT.md',
2638 'doc/TRANSIENT-SETTINGS.md',
2641 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2642 install_dir : docdir)
2644 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2645 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2647 ############################################################
2649 meson_check_help = find_program('tools/meson-check-help.sh')
2651 foreach exec : public_programs
2652 name = exec.full_path().split('/')[-1]
2653 test('check-help-' + name,
2655 args : [exec.full_path()])
2658 ############################################################
2661 foreach p : fuzz_regression_tests
2662 a = p.split('/')[-3]
2663 b = p.split('/')[-2]
2664 c = p.split('/')[-1]
2667 build = sanitize_address
2669 error('unknown sanitizer @0@'.format(a))
2672 name = '@1@:@0@'.format(a, b)
2675 if want_tests == 'false'
2676 message('Not compiling @0@ because tests is set to false'.format(name))
2677 elif not sanitizers.contains(a)
2678 message('Not compiling @0@ because @1@ sanitizer is not available'.format(name, a))
2680 exe = custom_target(
2684 command : [env, 'ln', '-fs',
2685 join_paths(build.full_path(), b),
2687 build_by_default : true)
2689 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2694 if want_tests != 'false' and slow_tests
2695 test(c, env, args : [exe.full_path(),
2696 join_paths(meson.source_root(),
2697 'test/fuzz-regressions',
2702 ############################################################
2705 all_files = run_command(
2707 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2710 all_files = files(all_files.stdout().split())
2715 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2719 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2723 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2726 command : [meson_git_contrib_sh])
2730 git_head = run_command(
2732 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2733 'rev-parse', 'HEAD']).stdout().strip()
2734 git_head_short = run_command(
2736 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2737 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2741 command : ['git', 'archive',
2742 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2744 '--prefix', 'systemd-@0@/'.format(git_head),
2748 ############################################################
2750 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2753 depends : [man, libsystemd, libudev],
2754 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2756 ############################################################
2759 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2761 'split /usr: @0@'.format(split_usr),
2762 'split bin-sbin: @0@'.format(split_bin),
2763 'prefix directory: @0@'.format(prefixdir),
2764 'rootprefix directory: @0@'.format(rootprefixdir),
2765 'sysconf directory: @0@'.format(sysconfdir),
2766 'include directory: @0@'.format(includedir),
2767 'lib directory: @0@'.format(libdir),
2768 'rootlib directory: @0@'.format(rootlibdir),
2769 'SysV init scripts: @0@'.format(sysvinit_path),
2770 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2771 'PAM modules directory: @0@'.format(pamlibdir),
2772 'PAM configuration directory: @0@'.format(pamconfdir),
2773 'RPM macros directory: @0@'.format(rpmmacrosdir),
2774 'modprobe.d directory: @0@'.format(modprobedir),
2775 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2776 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2777 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2778 'bash completions directory: @0@'.format(bashcompletiondir),
2779 'zsh completions directory: @0@'.format(zshcompletiondir),
2780 'extra start script: @0@'.format(get_option('rc-local')),
2781 'extra stop script: @0@'.format(get_option('halt-local')),
2782 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2783 get_option('debug-tty')),
2784 'TTY GID: @0@'.format(tty_gid),
2785 'users GID: @0@'.format(users_gid),
2786 'maximum system UID: @0@'.format(system_uid_max),
2787 'maximum system GID: @0@'.format(system_gid_max),
2788 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2789 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2790 'minimum container UID base: @0@'.format(container_uid_base_min),
2791 'maximum container UID base: @0@'.format(container_uid_base_max),
2792 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2793 'render group access mode: @0@'.format(get_option('group-render-mode')),
2794 'certificate root directory: @0@'.format(get_option('certificate-root')),
2795 'support URL: @0@'.format(support_url),
2796 'nobody user name: @0@'.format(nobody_user),
2797 'nobody group name: @0@'.format(nobody_group),
2798 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2799 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2801 'default DNSSEC mode: @0@'.format(default_dnssec),
2802 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2803 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2805 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2806 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2808 'default DNS servers: @0@'.format(alt_dns_servers),
2809 'default NTP servers: @0@'.format(alt_ntp_servers)]
2811 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2812 '@@0@'.format(time_epoch)).stdout().strip()
2814 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2817 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2818 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2819 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2821 if conf.get('ENABLE_EFI') == 1
2823 'efi arch: @0@'.format(efi_arch)]
2827 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2828 'EFI CC @0@'.format(efi_cc),
2829 'EFI lib directory: @0@'.format(efi_libdir),
2830 'EFI lds directory: @0@'.format(efi_ldsdir),
2831 'EFI include directory: @0@'.format(efi_incdir)]
2884 ['legacy pkla', install_polkit_pkla],
2886 ['gnu-efi', have_gnu_efi],
2893 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2896 ['man pages', want_man],
2897 ['html pages', want_html],
2898 ['man page indices', want_man and have_lxml],
2903 ['adm group', get_option('adm-group')],
2904 ['wheel group', get_option('wheel-group')],
2907 ['debug mmap cache'],
2910 cond = tuple.get(1, '')
2912 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2913 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2914 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2919 missing += [tuple[0]]
2925 'enabled features: @0@'.format(', '.join(found)),
2927 'disabled features: @0@'.format(', '.join(missing)),
2929 message('\n '.join(status))
2931 if rootprefixdir != rootprefix_default
2932 message('WARNING:\n' +
2933 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2934 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2935 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))