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]
1637 if conf.get('ENABLE_LOGIND') == 1
1638 executable('systemd-logind',
1639 systemd_logind_sources,
1640 include_directories : includes,
1641 link_with : [liblogind_core,
1643 dependencies : [threads,
1645 install_rpath : rootlibexecdir,
1647 install_dir : rootlibexecdir)
1649 exe = executable('loginctl',
1651 include_directories : includes,
1652 link_with : [libshared],
1653 dependencies : [threads,
1656 install_rpath : rootlibexecdir,
1658 install_dir : rootbindir)
1659 public_programs += [exe]
1661 exe = executable('systemd-inhibit',
1662 'src/login/inhibit.c',
1663 include_directories : includes,
1664 link_with : [libshared],
1665 install_rpath : rootlibexecdir,
1667 install_dir : rootbindir)
1668 public_programs += [exe]
1670 if conf.get('HAVE_PAM') == 1
1671 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1672 pam_systemd = shared_library(
1676 include_directories : includes,
1677 link_args : ['-shared',
1678 '-Wl,--version-script=' + version_script_arg],
1679 link_with : [libsystemd_static,
1681 dependencies : [threads,
1684 link_depends : pam_systemd_sym,
1686 install_dir : pamlibdir)
1688 test('dlopen-pam_systemd',
1690 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1694 if conf.get('HAVE_PAM') == 1
1695 executable('systemd-user-sessions',
1696 'src/user-sessions/user-sessions.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 install_rpath : rootlibexecdir,
1701 install_dir : rootlibexecdir)
1704 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1705 exe = executable('bootctl',
1706 'src/boot/bootctl.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 dependencies : [libblkid],
1710 install_rpath : rootlibexecdir,
1712 public_programs += [exe]
1715 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1716 include_directories : includes,
1717 link_with : [libshared],
1718 dependencies : [threads],
1719 install_rpath : rootlibexecdir,
1721 public_programs += [exe]
1723 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1724 include_directories : includes,
1725 link_with : [libshared],
1726 dependencies : [threads,
1731 install_rpath : rootlibexecdir,
1733 install_dir : rootbindir)
1734 public_programs += [exe]
1736 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1737 meson.add_install_script(meson_make_symlink,
1738 join_paths(rootbindir, 'systemctl'),
1739 join_paths(rootsbindir, alias))
1742 if conf.get('ENABLE_BACKLIGHT') == 1
1743 executable('systemd-backlight',
1744 'src/backlight/backlight.c',
1745 include_directories : includes,
1746 link_with : [libshared],
1747 install_rpath : rootlibexecdir,
1749 install_dir : rootlibexecdir)
1752 if conf.get('ENABLE_RFKILL') == 1
1753 executable('systemd-rfkill',
1754 'src/rfkill/rfkill.c',
1755 include_directories : includes,
1756 link_with : [libshared],
1757 install_rpath : rootlibexecdir,
1759 install_dir : rootlibexecdir)
1762 executable('systemd-system-update-generator',
1763 'src/system-update-generator/system-update-generator.c',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 install_rpath : rootlibexecdir,
1768 install_dir : systemgeneratordir)
1770 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1771 executable('systemd-cryptsetup',
1772 'src/cryptsetup/cryptsetup.c',
1773 include_directories : includes,
1774 link_with : [libshared],
1775 dependencies : [libcryptsetup],
1776 install_rpath : rootlibexecdir,
1778 install_dir : rootlibexecdir)
1780 executable('systemd-cryptsetup-generator',
1781 'src/cryptsetup/cryptsetup-generator.c',
1782 include_directories : includes,
1783 link_with : [libshared],
1784 dependencies : [libcryptsetup],
1785 install_rpath : rootlibexecdir,
1787 install_dir : systemgeneratordir)
1789 executable('systemd-veritysetup',
1790 'src/veritysetup/veritysetup.c',
1791 include_directories : includes,
1792 link_with : [libshared],
1793 dependencies : [libcryptsetup],
1794 install_rpath : rootlibexecdir,
1796 install_dir : rootlibexecdir)
1798 executable('systemd-veritysetup-generator',
1799 'src/veritysetup/veritysetup-generator.c',
1800 include_directories : includes,
1801 link_with : [libshared],
1802 dependencies : [libcryptsetup],
1803 install_rpath : rootlibexecdir,
1805 install_dir : systemgeneratordir)
1808 if conf.get('HAVE_SYSV_COMPAT') == 1
1809 executable('systemd-sysv-generator',
1810 'src/sysv-generator/sysv-generator.c',
1811 include_directories : includes,
1812 link_with : [libshared],
1813 install_rpath : rootlibexecdir,
1815 install_dir : systemgeneratordir)
1817 executable('systemd-rc-local-generator',
1818 'src/rc-local-generator/rc-local-generator.c',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 install_rpath : rootlibexecdir,
1823 install_dir : systemgeneratordir)
1826 if conf.get('ENABLE_HOSTNAMED') == 1
1827 executable('systemd-hostnamed',
1828 'src/hostname/hostnamed.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 install_rpath : rootlibexecdir,
1833 install_dir : rootlibexecdir)
1835 exe = executable('hostnamectl',
1836 'src/hostname/hostnamectl.c',
1837 include_directories : includes,
1838 link_with : [libshared],
1839 install_rpath : rootlibexecdir,
1841 public_programs += [exe]
1844 if conf.get('ENABLE_LOCALED') == 1
1845 if conf.get('HAVE_XKBCOMMON') == 1
1846 # logind will load libxkbcommon.so dynamically on its own
1852 executable('systemd-localed',
1853 systemd_localed_sources,
1854 include_directories : includes,
1855 link_with : [libshared],
1856 dependencies : deps,
1857 install_rpath : rootlibexecdir,
1859 install_dir : rootlibexecdir)
1861 exe = executable('localectl',
1863 include_directories : includes,
1864 link_with : [libshared],
1865 install_rpath : rootlibexecdir,
1867 public_programs += [exe]
1870 if conf.get('ENABLE_TIMEDATED') == 1
1871 executable('systemd-timedated',
1872 'src/timedate/timedated.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 install_rpath : rootlibexecdir,
1877 install_dir : rootlibexecdir)
1879 exe = executable('timedatectl',
1880 'src/timedate/timedatectl.c',
1881 include_directories : includes,
1882 install_rpath : rootlibexecdir,
1883 link_with : [libshared],
1885 public_programs += [exe]
1888 if conf.get('ENABLE_TIMESYNCD') == 1
1889 executable('systemd-timesyncd',
1890 systemd_timesyncd_sources,
1891 include_directories : includes,
1892 link_with : [libshared],
1893 dependencies : [threads,
1895 install_rpath : rootlibexecdir,
1897 install_dir : rootlibexecdir)
1900 if conf.get('ENABLE_MACHINED') == 1
1901 executable('systemd-machined',
1902 systemd_machined_sources,
1903 include_directories : includes,
1904 link_with : [libmachine_core,
1906 install_rpath : rootlibexecdir,
1908 install_dir : rootlibexecdir)
1910 exe = executable('machinectl',
1911 'src/machine/machinectl.c',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 dependencies : [threads,
1917 install_rpath : rootlibexecdir,
1919 install_dir : rootbindir)
1920 public_programs += [exe]
1923 if conf.get('ENABLE_IMPORTD') == 1
1924 executable('systemd-importd',
1925 systemd_importd_sources,
1926 include_directories : includes,
1927 link_with : [libshared],
1928 dependencies : [threads],
1929 install_rpath : rootlibexecdir,
1931 install_dir : rootlibexecdir)
1933 systemd_pull = executable('systemd-pull',
1934 systemd_pull_sources,
1935 include_directories : includes,
1936 link_with : [libshared],
1937 dependencies : [libcurl,
1942 install_rpath : rootlibexecdir,
1944 install_dir : rootlibexecdir)
1946 systemd_import = executable('systemd-import',
1947 systemd_import_sources,
1948 include_directories : includes,
1949 link_with : [libshared],
1950 dependencies : [libcurl,
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootlibexecdir)
1958 systemd_export = executable('systemd-export',
1959 systemd_export_sources,
1960 include_directories : includes,
1961 link_with : [libshared],
1962 dependencies : [libcurl,
1966 install_rpath : rootlibexecdir,
1968 install_dir : rootlibexecdir)
1969 public_programs += [systemd_pull, systemd_import, systemd_export]
1972 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1973 exe = executable('systemd-journal-upload',
1974 systemd_journal_upload_sources,
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [threads,
1982 install_rpath : rootlibexecdir,
1984 install_dir : rootlibexecdir)
1985 public_programs += [exe]
1988 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1989 s_j_remote = executable('systemd-journal-remote',
1990 systemd_journal_remote_sources,
1991 include_directories : includes,
1992 link_with : [libshared],
1993 dependencies : [threads,
1998 install_rpath : rootlibexecdir,
2000 install_dir : rootlibexecdir)
2002 s_j_gatewayd = executable('systemd-journal-gatewayd',
2003 systemd_journal_gatewayd_sources,
2004 include_directories : includes,
2005 link_with : [libshared],
2006 dependencies : [threads,
2011 install_rpath : rootlibexecdir,
2013 install_dir : rootlibexecdir)
2014 public_programs += [s_j_remote, s_j_gatewayd]
2017 if conf.get('ENABLE_COREDUMP') == 1
2018 executable('systemd-coredump',
2019 systemd_coredump_sources,
2020 include_directories : includes,
2021 link_with : [libshared],
2022 dependencies : [threads,
2027 install_rpath : rootlibexecdir,
2029 install_dir : rootlibexecdir)
2031 exe = executable('coredumpctl',
2032 coredumpctl_sources,
2033 include_directories : includes,
2034 link_with : [libshared],
2035 dependencies : [threads,
2038 install_rpath : rootlibexecdir,
2040 public_programs += [exe]
2043 if conf.get('ENABLE_BINFMT') == 1
2044 exe = executable('systemd-binfmt',
2045 'src/binfmt/binfmt.c',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2050 install_dir : rootlibexecdir)
2051 public_programs += [exe]
2053 meson.add_install_script('sh', '-c',
2054 mkdir_p.format(binfmtdir))
2055 meson.add_install_script('sh', '-c',
2056 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2059 if conf.get('ENABLE_VCONSOLE') == 1
2060 executable('systemd-vconsole-setup',
2061 'src/vconsole/vconsole-setup.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 install_rpath : rootlibexecdir,
2066 install_dir : rootlibexecdir)
2069 if conf.get('ENABLE_RANDOMSEED') == 1
2070 executable('systemd-random-seed',
2071 'src/random-seed/random-seed.c',
2072 include_directories : includes,
2073 link_with : [libshared],
2074 install_rpath : rootlibexecdir,
2076 install_dir : rootlibexecdir)
2079 if conf.get('ENABLE_FIRSTBOOT') == 1
2080 executable('systemd-firstboot',
2081 'src/firstboot/firstboot.c',
2082 include_directories : includes,
2083 link_with : [libshared],
2084 dependencies : [libcrypt],
2085 install_rpath : rootlibexecdir,
2087 install_dir : rootbindir)
2090 executable('systemd-remount-fs',
2091 'src/remount-fs/remount-fs.c',
2092 'src/core/mount-setup.c',
2093 'src/core/mount-setup.h',
2094 include_directories : includes,
2095 link_with : [libshared],
2096 install_rpath : rootlibexecdir,
2098 install_dir : rootlibexecdir)
2100 executable('systemd-machine-id-setup',
2101 'src/machine-id-setup/machine-id-setup-main.c',
2102 'src/core/machine-id-setup.c',
2103 'src/core/machine-id-setup.h',
2104 include_directories : includes,
2105 link_with : [libshared],
2106 install_rpath : rootlibexecdir,
2108 install_dir : rootbindir)
2110 executable('systemd-fsck',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootlibexecdir)
2118 executable('systemd-growfs',
2119 'src/partition/growfs.c',
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [libcryptsetup],
2123 install_rpath : rootlibexecdir,
2125 install_dir : rootlibexecdir)
2127 executable('systemd-makefs',
2128 'src/partition/makefs.c',
2129 include_directories : includes,
2130 link_with : [libshared],
2131 install_rpath : rootlibexecdir,
2133 install_dir : rootlibexecdir)
2135 executable('systemd-sleep',
2136 'src/sleep/sleep.c',
2137 include_directories : includes,
2138 link_with : [libshared],
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2143 exe = executable('systemd-sysctl',
2144 'src/sysctl/sysctl.c',
2145 include_directories : includes,
2146 link_with : [libshared],
2147 install_rpath : rootlibexecdir,
2149 install_dir : rootlibexecdir)
2150 public_programs += [exe]
2152 executable('systemd-ac-power',
2153 'src/ac-power/ac-power.c',
2154 include_directories : includes,
2155 link_with : [libshared],
2156 install_rpath : rootlibexecdir,
2158 install_dir : rootlibexecdir)
2160 exe = executable('systemd-detect-virt',
2161 'src/detect-virt/detect-virt.c',
2162 include_directories : includes,
2163 link_with : [libshared],
2164 install_rpath : rootlibexecdir,
2166 public_programs += [exe]
2168 exe = executable('systemd-delta',
2169 'src/delta/delta.c',
2170 include_directories : includes,
2171 link_with : [libshared],
2172 install_rpath : rootlibexecdir,
2174 public_programs += [exe]
2176 exe = executable('systemd-escape',
2177 'src/escape/escape.c',
2178 include_directories : includes,
2179 link_with : [libshared],
2180 install_rpath : rootlibexecdir,
2182 install_dir : rootbindir)
2183 public_programs += [exe]
2185 exe = executable('systemd-notify',
2186 'src/notify/notify.c',
2187 include_directories : includes,
2188 link_with : [libshared],
2189 install_rpath : rootlibexecdir,
2191 install_dir : rootbindir)
2192 public_programs += [exe]
2194 executable('systemd-volatile-root',
2195 'src/volatile-root/volatile-root.c',
2196 include_directories : includes,
2197 link_with : [libshared],
2198 install_rpath : rootlibexecdir,
2200 install_dir : rootlibexecdir)
2202 executable('systemd-cgroups-agent',
2203 'src/cgroups-agent/cgroups-agent.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2208 install_dir : rootlibexecdir)
2210 exe = executable('systemd-path',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2216 public_programs += [exe]
2218 exe = executable('systemd-ask-password',
2219 'src/ask-password/ask-password.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2224 install_dir : rootbindir)
2225 public_programs += [exe]
2227 executable('systemd-reply-password',
2228 'src/reply-password/reply-password.c',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2233 install_dir : rootlibexecdir)
2235 exe = executable('systemd-tty-ask-password-agent',
2236 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2237 include_directories : includes,
2238 link_with : [libshared],
2239 install_rpath : rootlibexecdir,
2241 install_dir : rootbindir)
2242 public_programs += [exe]
2244 exe = executable('systemd-cgls',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 install_rpath : rootlibexecdir,
2250 public_programs += [exe]
2252 exe = executable('systemd-cgtop',
2253 'src/cgtop/cgtop.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 install_rpath : rootlibexecdir,
2258 public_programs += [exe]
2260 executable('systemd-initctl',
2261 'src/initctl/initctl.c',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 install_rpath : rootlibexecdir,
2266 install_dir : rootlibexecdir)
2268 exe = executable('systemd-mount',
2269 'src/mount/mount-tool.c',
2270 include_directories : includes,
2271 link_with : [libshared],
2272 install_rpath : rootlibexecdir,
2274 public_programs += [exe]
2276 meson.add_install_script(meson_make_symlink,
2277 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2279 exe = executable('systemd-run',
2281 include_directories : includes,
2282 link_with : [libshared],
2283 install_rpath : rootlibexecdir,
2285 public_programs += [exe]
2287 exe = executable('systemd-stdio-bridge',
2288 'src/stdio-bridge/stdio-bridge.c',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 install_rpath : rootlibexecdir,
2293 public_programs += [exe]
2295 exe = executable('busctl',
2296 'src/busctl/busctl.c',
2297 'src/busctl/busctl-introspect.c',
2298 'src/busctl/busctl-introspect.h',
2299 include_directories : includes,
2300 link_with : [libshared],
2301 install_rpath : rootlibexecdir,
2303 public_programs += [exe]
2305 if conf.get('ENABLE_SYSUSERS') == 1
2306 exe = executable('systemd-sysusers',
2307 'src/sysusers/sysusers.c',
2308 include_directories : includes,
2309 link_with : [libshared],
2310 install_rpath : rootlibexecdir,
2312 install_dir : rootbindir)
2313 public_programs += [exe]
2316 if conf.get('ENABLE_TMPFILES') == 1
2317 exe = executable('systemd-tmpfiles',
2318 'src/tmpfiles/tmpfiles.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 dependencies : [libacl],
2322 install_rpath : rootlibexecdir,
2324 install_dir : rootbindir)
2325 public_programs += [exe]
2327 test('test-systemd-tmpfiles',
2328 test_systemd_tmpfiles_py,
2329 args : exe.full_path())
2330 # https://github.com/mesonbuild/meson/issues/2681
2333 if conf.get('ENABLE_HWDB') == 1
2334 exe = executable('systemd-hwdb',
2336 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2337 include_directories : includes,
2338 link_with : [libudev_static],
2339 install_rpath : udev_rpath,
2341 install_dir : rootbindir)
2342 public_programs += [exe]
2345 if conf.get('ENABLE_QUOTACHECK') == 1
2346 executable('systemd-quotacheck',
2347 'src/quotacheck/quotacheck.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2355 exe = executable('systemd-socket-proxyd',
2356 'src/socket-proxy/socket-proxyd.c',
2357 include_directories : includes,
2358 link_with : [libshared],
2359 dependencies : [threads],
2360 install_rpath : rootlibexecdir,
2362 install_dir : rootlibexecdir)
2363 public_programs += [exe]
2365 exe = executable('systemd-udevd',
2366 systemd_udevd_sources,
2367 include_directories : includes,
2368 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2369 link_with : [libudev_core,
2372 dependencies : [threads,
2377 install_rpath : udev_rpath,
2379 install_dir : rootlibexecdir)
2380 public_programs += [exe]
2382 exe = executable('udevadm',
2384 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2385 include_directories : includes,
2386 link_with : [libudev_core,
2389 dependencies : [threads,
2394 install_rpath : udev_rpath,
2396 install_dir : rootbindir)
2397 public_programs += [exe]
2399 executable('systemd-shutdown',
2400 systemd_shutdown_sources,
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2405 install_dir : rootlibexecdir)
2407 executable('systemd-update-done',
2408 'src/update-done/update-done.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2413 install_dir : rootlibexecdir)
2415 executable('systemd-update-utmp',
2416 'src/update-utmp/update-utmp.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 dependencies : [libaudit],
2420 install_rpath : rootlibexecdir,
2422 install_dir : rootlibexecdir)
2424 if conf.get('HAVE_KMOD') == 1
2425 executable('systemd-modules-load',
2426 'src/modules-load/modules-load.c',
2427 include_directories : includes,
2428 link_with : [libshared],
2429 dependencies : [libkmod],
2430 install_rpath : rootlibexecdir,
2432 install_dir : rootlibexecdir)
2434 meson.add_install_script('sh', '-c',
2435 mkdir_p.format(modulesloaddir))
2436 meson.add_install_script('sh', '-c',
2437 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2440 exe = executable('systemd-nspawn',
2441 systemd_nspawn_sources,
2442 'src/core/mount-setup.c', # FIXME: use a variable?
2443 'src/core/mount-setup.h',
2444 'src/core/loopback-setup.c',
2445 'src/core/loopback-setup.h',
2446 include_directories : [includes, include_directories('src/nspawn')],
2447 link_with : [libshared],
2448 dependencies : [libacl,
2452 install_rpath : rootlibexecdir,
2454 public_programs += [exe]
2456 if conf.get('ENABLE_NETWORKD') == 1
2457 executable('systemd-networkd',
2458 systemd_networkd_sources,
2459 include_directories : includes,
2460 link_with : [libnetworkd_core,
2464 dependencies : [threads],
2465 install_rpath : rootlibexecdir,
2467 install_dir : rootlibexecdir)
2469 executable('systemd-networkd-wait-online',
2470 systemd_networkd_wait_online_sources,
2471 include_directories : includes,
2472 link_with : [libnetworkd_core,
2474 install_rpath : rootlibexecdir,
2476 install_dir : rootlibexecdir)
2478 exe = executable('networkctl',
2480 include_directories : includes,
2481 link_with : [libsystemd_network,
2483 install_rpath : rootlibexecdir,
2485 install_dir : rootbindir)
2486 public_programs += [exe]
2489 executable('systemd-sulogin-shell',
2490 ['src/sulogin-shell/sulogin-shell.c'],
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2495 install_dir : rootlibexecdir)
2497 ############################################################
2499 foreach tuple : tests
2501 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2502 dependencies = tuple[2]
2503 condition = tuple.length() >= 4 ? tuple[3] : ''
2504 type = tuple.length() >= 5 ? tuple[4] : ''
2505 defs = tuple.length() >= 6 ? tuple[5] : []
2506 incs = tuple.length() >= 7 ? tuple[6] : includes
2509 name = sources[0].split('/')[-1].split('.')[0]
2510 if type.startswith('timeout=')
2511 timeout = type.split('=')[1].to_int()
2514 if want_tests == 'false'
2515 message('Not compiling @0@ because tests is set to false'.format(name))
2516 elif condition == '' or conf.get(condition) == 1
2520 include_directories : incs,
2521 link_with : link_with,
2522 dependencies : dependencies,
2524 install_rpath : rootlibexecdir,
2525 install : install_tests,
2526 install_dir : join_paths(testsdir, type))
2529 message('@0@ is a manual test'.format(name))
2530 elif type == 'unsafe' and want_tests != 'unsafe'
2531 message('@0@ is an unsafe test'.format(name))
2538 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2542 test_libsystemd_sym = executable(
2543 'test-libsystemd-sym',
2544 test_libsystemd_sym_c,
2545 include_directories : includes,
2546 link_with : [libsystemd],
2547 install : install_tests,
2548 install_dir : testsdir)
2549 test('test-libsystemd-sym',
2550 test_libsystemd_sym)
2552 test_libudev_sym = executable(
2555 include_directories : includes,
2556 c_args : ['-Wno-deprecated-declarations'],
2557 link_with : [libudev],
2558 install : install_tests,
2559 install_dir : testsdir)
2560 test('test-libudev-sym',
2563 ############################################################
2567 foreach tuple : fuzzers
2569 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2570 dependencies = tuple[2]
2571 defs = tuple.length() >= 4 ? tuple[3] : []
2572 incs = tuple.length() >= 5 ? tuple[4] : includes
2575 dependencies += fuzzing_engine
2577 sources += 'src/fuzz/fuzz-main.c'
2580 name = sources[0].split('/')[-1].split('.')[0]
2582 fuzzer_exes += executable(
2585 include_directories : [incs, include_directories('src/fuzz')],
2586 link_with : link_with,
2587 dependencies : dependencies,
2592 run_target('fuzzers',
2593 depends : fuzzer_exes,
2596 ############################################################
2598 make_directive_index_py = find_program('tools/make-directive-index.py')
2599 make_man_index_py = find_program('tools/make-man-index.py')
2600 xml_helper_py = find_program('tools/xml_helper.py')
2601 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2605 subdir('sysusers.d')
2606 subdir('tmpfiles.d')
2611 subdir('shell-completion/bash')
2612 subdir('shell-completion/zsh')
2613 subdir('docs/sysvinit')
2614 subdir('docs/var-log')
2616 # FIXME: figure out if the warning is true:
2617 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2618 install_subdir('factory/etc',
2619 install_dir : factorydir)
2622 install_data('xorg/50-systemd-user.sh',
2623 install_dir : xinitrcdir)
2624 install_data('modprobe.d/systemd.conf',
2625 install_dir : modprobedir)
2626 install_data('LICENSE.GPL2',
2631 'doc/DISTRO_PORTING',
2632 'doc/ENVIRONMENT.md',
2634 'doc/TRANSIENT-SETTINGS.md',
2637 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2638 install_dir : docdir)
2640 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2641 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2643 ############################################################
2645 meson_check_help = find_program('tools/meson-check-help.sh')
2647 foreach exec : public_programs
2648 name = exec.full_path().split('/')[-1]
2649 test('check-help-' + name,
2651 args : [exec.full_path()])
2654 ############################################################
2657 foreach p : fuzz_regression_tests
2658 a = p.split('/')[-3]
2659 b = p.split('/')[-2]
2660 c = p.split('/')[-1]
2663 build = sanitize_address
2665 error('unknown sanitizer @0@'.format(a))
2668 name = '@1@:@0@'.format(a, b)
2671 if want_tests == 'false'
2672 message('Not compiling @0@ because tests is set to false'.format(name))
2673 elif not sanitizers.contains(a)
2674 message('Not compiling @0@ because @1@ sanitizer is not available'.format(name, a))
2676 exe = custom_target(
2680 command : [env, 'ln', '-fs',
2681 join_paths(build.full_path(), b),
2683 build_by_default : true)
2685 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2690 if want_tests != 'false' and slow_tests
2691 test(c, env, args : [exe.full_path(),
2692 join_paths(meson.source_root(),
2693 'test/fuzz-regressions',
2698 ############################################################
2701 all_files = run_command(
2703 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2706 all_files = files(all_files.stdout().split())
2711 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2715 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2719 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2722 command : [meson_git_contrib_sh])
2726 git_head = run_command(
2728 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2729 'rev-parse', 'HEAD']).stdout().strip()
2730 git_head_short = run_command(
2732 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2733 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2737 command : ['git', 'archive',
2738 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2740 '--prefix', 'systemd-@0@/'.format(git_head),
2744 ############################################################
2746 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2749 depends : [man, libsystemd, libudev],
2750 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2752 ############################################################
2755 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2757 'split /usr: @0@'.format(split_usr),
2758 'split bin-sbin: @0@'.format(split_bin),
2759 'prefix directory: @0@'.format(prefixdir),
2760 'rootprefix directory: @0@'.format(rootprefixdir),
2761 'sysconf directory: @0@'.format(sysconfdir),
2762 'include directory: @0@'.format(includedir),
2763 'lib directory: @0@'.format(libdir),
2764 'rootlib directory: @0@'.format(rootlibdir),
2765 'SysV init scripts: @0@'.format(sysvinit_path),
2766 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2767 'PAM modules directory: @0@'.format(pamlibdir),
2768 'PAM configuration directory: @0@'.format(pamconfdir),
2769 'RPM macros directory: @0@'.format(rpmmacrosdir),
2770 'modprobe.d directory: @0@'.format(modprobedir),
2771 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2772 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2773 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2774 'bash completions directory: @0@'.format(bashcompletiondir),
2775 'zsh completions directory: @0@'.format(zshcompletiondir),
2776 'extra start script: @0@'.format(get_option('rc-local')),
2777 'extra stop script: @0@'.format(get_option('halt-local')),
2778 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2779 get_option('debug-tty')),
2780 'TTY GID: @0@'.format(tty_gid),
2781 'users GID: @0@'.format(users_gid),
2782 'maximum system UID: @0@'.format(system_uid_max),
2783 'maximum system GID: @0@'.format(system_gid_max),
2784 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2785 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2786 'minimum container UID base: @0@'.format(container_uid_base_min),
2787 'maximum container UID base: @0@'.format(container_uid_base_max),
2788 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2789 'render group access mode: @0@'.format(get_option('group-render-mode')),
2790 'certificate root directory: @0@'.format(get_option('certificate-root')),
2791 'support URL: @0@'.format(support_url),
2792 'nobody user name: @0@'.format(nobody_user),
2793 'nobody group name: @0@'.format(nobody_group),
2794 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2795 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2797 'default DNSSEC mode: @0@'.format(default_dnssec),
2798 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2799 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2801 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2802 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2804 'default DNS servers: @0@'.format(alt_dns_servers),
2805 'default NTP servers: @0@'.format(alt_ntp_servers)]
2807 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2808 '@@0@'.format(time_epoch)).stdout().strip()
2810 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2813 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2814 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2815 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2817 if conf.get('ENABLE_EFI') == 1
2819 'efi arch: @0@'.format(efi_arch)]
2823 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2824 'EFI CC @0@'.format(efi_cc),
2825 'EFI lib directory: @0@'.format(efi_libdir),
2826 'EFI lds directory: @0@'.format(efi_ldsdir),
2827 'EFI include directory: @0@'.format(efi_incdir)]
2880 ['legacy pkla', install_polkit_pkla],
2882 ['gnu-efi', have_gnu_efi],
2889 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2892 ['man pages', want_man],
2893 ['html pages', want_html],
2894 ['man page indices', want_man and have_lxml],
2899 ['adm group', get_option('adm-group')],
2900 ['wheel group', get_option('wheel-group')],
2903 ['debug mmap cache'],
2906 cond = tuple.get(1, '')
2908 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2909 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2910 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2915 missing += [tuple[0]]
2921 'enabled features: @0@'.format(', '.join(found)),
2923 'disabled features: @0@'.format(', '.join(missing)),
2925 message('\n '.join(status))
2927 if rootprefixdir != rootprefix_default
2928 message('WARNING:\n' +
2929 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2930 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2931 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))