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.20.0'
31 libudev_version = '1.6.8'
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 split_usr = get_option('split-usr')
58 conf.set10('HAVE_SPLIT_USR', split_usr)
60 rootprefixdir = get_option('rootprefix')
61 # Unusual rootprefixdir values are used by some distros
62 # (see https://github.com/systemd/systemd/pull/7461).
63 rootprefix_default = get_option('split-usr') ? '/' : '/usr'
64 if rootprefixdir == ''
65 rootprefixdir = rootprefix_default
68 sysvinit_path = get_option('sysvinit-path')
69 sysvrcnd_path = get_option('sysvrcnd-path')
70 have = sysvinit_path != '' and sysvrcnd_path != ''
71 conf.set10('HAVE_SYSV_COMPAT', have,
72 description : 'SysV init scripts and rcN.d links are supported')
73 m4_defines += have ? ['-DHAVE_SYSV_COMPAT'] : []
75 # join_paths ignore the preceding arguments if an absolute component is
76 # encountered, so this should canonicalize various paths when they are
77 # absolute or relative.
78 prefixdir = get_option('prefix')
79 if not prefixdir.startswith('/')
80 error('Prefix is not absolute: "@0@"'.format(prefixdir))
82 bindir = join_paths(prefixdir, get_option('bindir'))
83 libdir = join_paths(prefixdir, get_option('libdir'))
84 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
85 includedir = join_paths(prefixdir, get_option('includedir'))
86 datadir = join_paths(prefixdir, get_option('datadir'))
87 localstatedir = join_paths('/', get_option('localstatedir'))
89 rootbindir = join_paths(rootprefixdir, 'bin')
90 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
92 rootlibdir = get_option('rootlibdir')
94 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
97 # Dirs of external packages
98 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
99 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
100 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
101 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
102 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
103 varlogdir = join_paths(localstatedir, 'log')
104 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
105 rpmmacrosdir = get_option('rpmmacrosdir')
106 if rpmmacrosdir != 'no'
107 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
109 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
112 pkgdatadir = join_paths(datadir, 'systemd')
113 environmentdir = join_paths(prefixdir, 'lib/environment.d')
114 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
115 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
116 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
117 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
118 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
119 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
120 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
121 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
122 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
123 pkgincludedir = join_paths(includedir, 'systemd')
124 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
125 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
126 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
127 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
128 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
129 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
130 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
131 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
132 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
133 udevhomedir = udevlibexecdir
134 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
135 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
136 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
137 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
138 factorydir = join_paths(datadir, 'factory')
139 docdir = join_paths(datadir, 'doc/systemd')
140 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
141 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
142 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
143 catalogstatedir = join_paths(systemdstatedir, 'catalog')
144 randomseeddir = join_paths(localstatedir, 'lib/systemd')
146 dbuspolicydir = get_option('dbuspolicydir')
147 if dbuspolicydir == ''
148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
151 dbussessionservicedir = get_option('dbussessionservicedir')
152 if dbussessionservicedir == ''
153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
156 dbussystemservicedir = get_option('dbussystemservicedir')
157 if dbussystemservicedir == ''
158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
161 pamlibdir = get_option('pamlibdir')
163 pamlibdir = join_paths(rootlibdir, 'security')
166 pamconfdir = get_option('pamconfdir')
168 pamconfdir = join_paths(sysconfdir, 'pam.d')
171 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
172 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
173 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
174 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
175 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
176 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
177 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
178 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
179 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
180 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
181 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
182 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
183 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
184 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
185 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
186 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
187 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
188 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
189 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
190 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
191 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
192 conf.set_quoted('ROOTPREFIX', rootprefixdir)
193 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
194 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
195 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
196 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
197 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
198 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
199 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
200 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
201 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
202 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
203 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
204 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
205 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
206 conf.set_quoted('LIBDIR', libdir)
207 conf.set_quoted('ROOTLIBDIR', rootlibdir)
208 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
209 conf.set_quoted('BOOTLIBDIR', bootlibdir)
210 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
211 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
212 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
213 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
214 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
215 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
217 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
218 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
220 substs.set('prefix', prefixdir)
221 substs.set('exec_prefix', prefixdir)
222 substs.set('libdir', libdir)
223 substs.set('rootlibdir', rootlibdir)
224 substs.set('includedir', includedir)
225 substs.set('pkgsysconfdir', pkgsysconfdir)
226 substs.set('bindir', bindir)
227 substs.set('rootbindir', rootbindir)
228 substs.set('rootlibexecdir', rootlibexecdir)
229 substs.set('systemunitdir', systemunitdir)
230 substs.set('userunitdir', userunitdir)
231 substs.set('systempresetdir', systempresetdir)
232 substs.set('userpresetdir', userpresetdir)
233 substs.set('udevhwdbdir', udevhwdbdir)
234 substs.set('udevrulesdir', udevrulesdir)
235 substs.set('udevlibexecdir', udevlibexecdir)
236 substs.set('catalogdir', catalogdir)
237 substs.set('tmpfilesdir', tmpfilesdir)
238 substs.set('sysusersdir', sysusersdir)
239 substs.set('sysctldir', sysctldir)
240 substs.set('binfmtdir', binfmtdir)
241 substs.set('modulesloaddir', modulesloaddir)
242 substs.set('systemgeneratordir', systemgeneratordir)
243 substs.set('usergeneratordir', usergeneratordir)
244 substs.set('systemenvgeneratordir', systemenvgeneratordir)
245 substs.set('userenvgeneratordir', userenvgeneratordir)
246 substs.set('systemshutdowndir', systemshutdowndir)
247 substs.set('systemsleepdir', systemsleepdir)
248 substs.set('VARLOGDIR', varlogdir)
249 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
250 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
251 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
252 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
253 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
254 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
255 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
257 #####################################################################
259 cc = meson.get_compiler('c')
260 pkgconfig = import('pkgconfig')
261 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
263 if get_option('tests') != 'false'
264 cxx = find_program('c++', required : false)
266 # Used only for tests
271 want_ossfuzz = get_option('oss-fuzz')
272 want_libfuzzer = get_option('llvm-fuzz')
273 fuzzer_build = want_ossfuzz or want_libfuzzer
274 if want_ossfuzz and want_libfuzzer
275 error('only one of oss-fuzz and llvm-fuzz can be specified')
278 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
281 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
284 foreach arg : ['-Wextra',
287 '-Wmissing-include-dirs',
288 '-Wold-style-definition',
291 '-Wdeclaration-after-statement',
293 '-Wsuggest-attribute=noreturn',
294 '-Werror=missing-prototypes',
295 '-Werror=implicit-function-declaration',
296 '-Werror=missing-declarations',
297 '-Werror=return-type',
298 '-Werror=incompatible-pointer-types',
300 '-Wstrict-prototypes',
302 '-Wmissing-noreturn',
303 '-Wimplicit-fallthrough=5',
306 '-Wstrict-aliasing=2',
313 '-fdiagnostics-show-option',
314 '-fno-strict-aliasing',
315 '-fvisibility=hidden',
317 '-fstack-protector-strong',
318 '--param=ssp-buffer-size=4',
320 if cc.has_argument(arg)
321 add_project_arguments(arg, language : 'c')
325 # the oss-fuzz fuzzers are not built with -fPIE, so don't
326 # enable it when we are linking against them
328 if cc.has_argument('-fPIE')
329 add_project_arguments('-fPIE', language : 'c')
333 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
334 # arguments, just emits a warnings. So test for the "positive" version instead.
335 foreach arg : ['unused-parameter',
336 'missing-field-initializers',
339 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
341 if cc.has_argument('-W' + arg)
342 add_project_arguments('-Wno-' + arg, language : 'c')
348 #include <inttypes.h>
349 typedef uint64_t usec_t;
350 usec_t now(clockid_t clock);
355 ', name : '-Werror=shadow with local shadowing')
356 add_project_arguments('-Werror=shadow', language : 'c')
359 if cc.get_id() == 'clang'
360 foreach arg : ['-Wno-typedef-redefinition',
361 '-Wno-gnu-variable-sized-type-not-at-end',
363 if cc.has_argument(arg,
364 name : '@0@ is supported'.format(arg))
365 add_project_arguments(arg, language : 'c')
370 link_test_c = files('tools/meson-link-test.c')
372 # --as-needed and --no-undefined are provided by meson by default,
373 # run mesonconf to see what is enabled
374 foreach arg : ['-Wl,-z,relro',
379 have = run_command(check_compilation_sh,
380 cc.cmd_array(), '-x', 'c', arg,
381 '-include', link_test_c).returncode() == 0
382 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
383 if have and (arg != '-pie' or not fuzzer_build)
384 add_project_link_arguments(arg, language : 'c')
388 if get_option('buildtype') != 'debug'
389 foreach arg : ['-ffunction-sections',
391 if cc.has_argument(arg,
392 name : '@0@ is supported'.format(arg))
393 add_project_arguments(arg, language : 'c')
397 foreach arg : ['-Wl,--gc-sections']
398 have = run_command(check_compilation_sh,
399 cc.cmd_array(), '-x', 'c', arg,
400 '-include', link_test_c).returncode() == 0
401 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
403 add_project_link_arguments(arg, language : 'c')
408 cpp = ' '.join(cc.cmd_array()) + ' -E'
410 #####################################################################
411 # compilation result tests
413 conf.set('_GNU_SOURCE', true)
414 conf.set('__SANE_USERSPACE_TYPES__', true)
416 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
417 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
418 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
419 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
420 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
421 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
422 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
426 #include <linux/ethtool.h>
427 #include <linux/fib_rules.h>
429 # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail
431 foreach decl : ['char16_t',
434 'struct ethtool_link_settings',
435 'struct fib_rule_uid_range',
438 # We get -1 if the size cannot be determined
439 have = cc.sizeof(decl, prefix : decl_headers) > 0
440 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
443 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
444 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
445 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
446 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
447 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
448 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
449 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
450 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
451 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
452 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
453 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
454 # if_tunnel.h is buggy and cannot be included on its own
455 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
456 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
457 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
458 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
459 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
460 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
461 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
462 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
463 ['NDA_IFINDEX', 'linux/neighbour.h'],
464 ['IFA_FLAGS', 'linux/if_addr.h'],
465 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
466 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
467 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
469 prefix = decl.length() > 2 ? decl[2] : ''
470 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
471 conf.set10('HAVE_' + decl[0], have)
474 foreach ident : ['secure_getenv', '__secure_getenv']
475 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
479 ['memfd_create', '''#include <sys/mman.h>'''],
480 ['gettid', '''#include <sys/types.h>
481 #include <unistd.h>'''],
482 ['pivot_root', '''#include <stdlib.h>
483 #include <unistd.h>'''], # no known header declares pivot_root
484 ['name_to_handle_at', '''#include <sys/types.h>
485 #include <sys/stat.h>
486 #include <fcntl.h>'''],
487 ['setns', '''#include <sched.h>'''],
488 ['renameat2', '''#include <stdio.h>
489 #include <fcntl.h>'''],
490 ['kcmp', '''#include <linux/kcmp.h>'''],
491 ['keyctl', '''#include <sys/types.h>
492 #include <keyutils.h>'''],
493 ['copy_file_range', '''#include <sys/syscall.h>
494 #include <unistd.h>'''],
495 ['bpf', '''#include <sys/syscall.h>
496 #include <unistd.h>'''],
497 ['explicit_bzero' , '''#include <string.h>'''],
500 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
501 conf.set10('HAVE_' + ident[0].to_upper(), have)
504 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
505 conf.set10('USE_SYS_RANDOM_H', true)
506 conf.set10('HAVE_GETRANDOM', true)
508 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
509 conf.set10('USE_SYS_RANDOM_H', false)
510 conf.set10('HAVE_GETRANDOM', have)
513 #####################################################################
515 sed = find_program('sed')
516 awk = find_program('awk')
517 m4 = find_program('m4')
518 stat = find_program('stat')
519 git = find_program('git', required : false)
521 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
522 mkdir_p = 'mkdir -p $DESTDIR/@0@'
523 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
524 splash_bmp = files('test/splash.bmp')
526 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
527 # /usr/sbin, /sbin, and fall back to the default from middle column.
528 progs = [['quotaon', '/usr/sbin/quotaon' ],
529 ['quotacheck', '/usr/sbin/quotacheck' ],
530 ['kill', '/usr/bin/kill' ],
531 ['kmod', '/usr/bin/kmod' ],
532 ['kexec', '/usr/sbin/kexec' ],
533 ['sulogin', '/usr/sbin/sulogin' ],
534 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
535 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
536 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
537 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
540 path = get_option(prog[0] + '-path')
542 message('Using @1@ for @0@'.format(prog[0], path))
544 exe = find_program(prog[0],
545 '/usr/sbin/' + prog[0],
548 path = exe.found() ? exe.path() : prog[1]
550 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
551 conf.set_quoted(name, path)
552 substs.set(name, path)
555 conf.set_quoted('TELINIT', get_option('telinit-path'))
557 if run_command('ln', '--relative', '--help').returncode() != 0
558 error('ln does not support --relative')
561 ############################################################
563 gperf = find_program('gperf')
565 gperf_test_format = '''
567 const char * in_word_set(const char *, @0@);
570 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
571 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
572 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
573 if cc.compiles(gperf_test)
574 gperf_len_type = 'size_t'
576 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
577 if cc.compiles(gperf_test)
578 gperf_len_type = 'unsigned'
580 error('unable to determine gperf len type')
583 message('gperf len type is @0@'.format(gperf_len_type))
584 conf.set('GPERF_LEN_TYPE', gperf_len_type,
585 description : 'The type of gperf "len" parameter')
587 ############################################################
589 if not cc.has_header('sys/capability.h')
590 error('POSIX caps headers not found')
592 foreach header : ['linux/btrfs.h',
594 'linux/vm_sockets.h',
596 'valgrind/memcheck.h',
597 'valgrind/valgrind.h',
600 conf.set10('HAVE_' + header.underscorify().to_upper(),
601 cc.has_header(header))
604 ############################################################
606 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
607 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
608 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
610 default_hierarchy = get_option('default-hierarchy')
611 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
612 description : 'default cgroup hierarchy as string')
613 if default_hierarchy == 'legacy'
614 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
615 elif default_hierarchy == 'hybrid'
616 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
618 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
621 time_epoch = get_option('time-epoch')
624 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
626 time_epoch = time_epoch.to_int()
627 conf.set('TIME_EPOCH', time_epoch)
629 system_uid_max = get_option('system-uid-max')
630 if system_uid_max == ''
631 system_uid_max = run_command(
633 'BEGIN { uid=999 } /^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
634 '/etc/login.defs').stdout()
636 system_uid_max = system_uid_max.to_int()
637 conf.set('SYSTEM_UID_MAX', system_uid_max)
638 substs.set('systemuidmax', system_uid_max)
639 message('maximum system UID is @0@'.format(system_uid_max))
641 system_gid_max = get_option('system-gid-max')
642 if system_gid_max == ''
643 system_gid_max = run_command(
645 'BEGIN { gid=999 } /^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
646 '/etc/login.defs').stdout()
648 system_gid_max = system_gid_max.to_int()
649 conf.set('SYSTEM_GID_MAX', system_gid_max)
650 substs.set('systemgidmax', system_gid_max)
651 message('maximum system GID is @0@'.format(system_gid_max))
653 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
654 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
655 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
656 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
657 substs.set('dynamicuidmin', dynamic_uid_min)
658 substs.set('dynamicuidmax', dynamic_uid_max)
660 container_uid_base_min = get_option('container-uid-base-min').to_int()
661 container_uid_base_max = get_option('container-uid-base-max').to_int()
662 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
663 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
664 substs.set('containeruidbasemin', container_uid_base_min)
665 substs.set('containeruidbasemax', container_uid_base_max)
667 nobody_user = get_option('nobody-user')
668 nobody_group = get_option('nobody-group')
670 getent_result = run_command('getent', 'passwd', '65534')
671 if getent_result.returncode() == 0
672 name = getent_result.stdout().split(':')[0]
673 if name != nobody_user
674 message('WARNING:\n' +
675 ' The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
676 ' Your build will result in an user table setup that is incompatible with the local system.')
679 id_result = run_command('id', '-u', nobody_user)
680 if id_result.returncode() == 0
681 id = id_result.stdout().to_int()
683 message('WARNING:\n' +
684 ' The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
685 ' Your build will result in an user table setup that is incompatible with the local system.')
689 getent_result = run_command('getent', 'group', '65534')
690 if getent_result.returncode() == 0
691 name = getent_result.stdout().split(':')[0]
692 if name != nobody_group
693 message('WARNING:\n' +
694 ' The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
695 ' Your build will result in an group table setup that is incompatible with the local system.')
698 id_result = run_command('id', '-g', nobody_group)
699 if id_result.returncode() == 0
700 id = id_result.stdout().to_int()
702 message('WARNING:\n' +
703 ' The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
704 ' Your build will result in an group table setup that is incompatible with the local system.')
707 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
708 message('WARNING:\n' +
709 ' The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
710 ' Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
713 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
714 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
715 substs.set('NOBODY_USER_NAME', nobody_user)
716 substs.set('NOBODY_GROUP_NAME', nobody_group)
718 tty_gid = get_option('tty-gid')
719 conf.set('TTY_GID', tty_gid)
720 substs.set('TTY_GID', tty_gid)
722 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
723 if get_option('users-gid') != ''
724 users_gid = get_option('users-gid').to_int()
728 substs.set('USERS_GID', users_gid)
730 if get_option('adm-group')
731 m4_defines += ['-DENABLE_ADM_GROUP']
734 if get_option('wheel-group')
735 m4_defines += ['-DENABLE_WHEEL_GROUP']
738 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
739 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
741 kill_user_processes = get_option('default-kill-user-processes')
742 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
743 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
745 dns_servers = get_option('dns-servers')
746 conf.set_quoted('DNS_SERVERS', dns_servers)
747 substs.set('DNS_SERVERS', dns_servers)
749 ntp_servers = get_option('ntp-servers')
750 conf.set_quoted('NTP_SERVERS', ntp_servers)
751 substs.set('NTP_SERVERS', ntp_servers)
753 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
755 substs.set('SUSHELL', get_option('debug-shell'))
756 substs.set('DEBUGTTY', get_option('debug-tty'))
758 debug = get_option('debug')
759 enable_debug_hashmap = false
760 enable_debug_mmap_cache = false
762 foreach name : debug.split(',')
764 enable_debug_hashmap = true
765 elif name == 'mmap-cache'
766 enable_debug_mmap_cache = true
768 message('unknown debug option "@0@", ignoring'.format(name))
772 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
773 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
775 #####################################################################
777 threads = dependency('threads')
778 librt = cc.find_library('rt')
779 libm = cc.find_library('m')
780 libdl = cc.find_library('dl')
781 libcrypt = cc.find_library('crypt')
783 libcap = dependency('libcap', required : false)
784 if not libcap.found()
785 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
786 libcap = cc.find_library('cap')
789 libmount = dependency('mount',
791 required : not fuzzer_build)
793 want_seccomp = get_option('seccomp')
794 if want_seccomp != 'false' and not fuzzer_build
795 libseccomp = dependency('libseccomp',
796 version : '>= 2.3.1',
797 required : want_seccomp == 'true')
798 have = libseccomp.found()
803 conf.set10('HAVE_SECCOMP', have)
804 m4_defines += have ? ['-DHAVE_SECCOMP'] : []
806 want_selinux = get_option('selinux')
807 if want_selinux != 'false' and not fuzzer_build
808 libselinux = dependency('libselinux',
809 version : '>= 2.1.9',
810 required : want_selinux == 'true')
811 have = libselinux.found()
816 conf.set10('HAVE_SELINUX', have)
817 m4_defines += have ? ['-DHAVE_SELINUX'] : []
819 want_apparmor = get_option('apparmor')
820 if want_apparmor != 'false' and not fuzzer_build
821 libapparmor = dependency('libapparmor',
822 required : want_apparmor == 'true')
823 have = libapparmor.found()
828 conf.set10('HAVE_APPARMOR', have)
829 m4_defines += have ? ['-DHAVE_APPARMOR'] : []
831 smack_run_label = get_option('smack-run-label')
832 if smack_run_label != ''
833 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
834 m4_defines += ['-DHAVE_SMACK_RUN_LABEL']
837 want_polkit = get_option('polkit')
838 install_polkit = false
839 install_polkit_pkla = false
840 if want_polkit != 'false' and not fuzzer_build
841 install_polkit = true
843 libpolkit = dependency('polkit-gobject-1',
845 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
846 message('Old polkit detected, will install pkla files')
847 install_polkit_pkla = true
850 conf.set10('ENABLE_POLKIT', install_polkit)
852 want_acl = get_option('acl')
853 if want_acl != 'false' and not fuzzer_build
854 libacl = cc.find_library('acl', required : want_acl == 'true')
855 have = libacl.found()
860 conf.set10('HAVE_ACL', have)
861 m4_defines += have ? ['-DHAVE_ACL'] : []
863 want_audit = get_option('audit')
864 if want_audit != 'false' and not fuzzer_build
865 libaudit = dependency('audit', required : want_audit == 'true')
866 have = libaudit.found()
871 conf.set10('HAVE_AUDIT', have)
873 want_blkid = get_option('blkid')
874 if want_blkid != 'false' and not fuzzer_build
875 libblkid = dependency('blkid', required : want_blkid == 'true')
876 have = libblkid.found()
881 conf.set10('HAVE_BLKID', have)
883 want_kmod = get_option('kmod')
884 if want_kmod != 'false' and not fuzzer_build
885 libkmod = dependency('libkmod',
887 required : want_kmod == 'true')
888 have = libkmod.found()
893 conf.set10('HAVE_KMOD', have)
895 want_pam = get_option('pam')
896 if want_pam != 'false' and not fuzzer_build
897 libpam = cc.find_library('pam', required : want_pam == 'true')
898 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
899 have = libpam.found() and libpam_misc.found()
905 conf.set10('HAVE_PAM', have)
906 m4_defines += have ? ['-DHAVE_PAM'] : []
908 want_microhttpd = get_option('microhttpd')
909 if want_microhttpd != 'false' and not fuzzer_build
910 libmicrohttpd = dependency('libmicrohttpd',
911 version : '>= 0.9.33',
912 required : want_microhttpd == 'true')
913 have = libmicrohttpd.found()
918 conf.set10('HAVE_MICROHTTPD', have)
919 m4_defines += have ? ['-DHAVE_MICROHTTPD'] : []
921 want_libcryptsetup = get_option('libcryptsetup')
922 if want_libcryptsetup != 'false' and not fuzzer_build
923 libcryptsetup = dependency('libcryptsetup',
924 version : '>= 1.6.0',
925 required : want_libcryptsetup == 'true')
926 have = libcryptsetup.found()
931 conf.set10('HAVE_LIBCRYPTSETUP', have)
933 want_libcurl = get_option('libcurl')
934 if want_libcurl != 'false' and not fuzzer_build
935 libcurl = dependency('libcurl',
936 version : '>= 7.32.0',
937 required : want_libcurl == 'true')
938 have = libcurl.found()
943 conf.set10('HAVE_LIBCURL', have)
944 m4_defines += have ? ['-DHAVE_LIBCURL'] : []
946 want_libidn = get_option('libidn')
947 want_libidn2 = get_option('libidn2')
948 if want_libidn == 'true' and want_libidn2 == 'true'
949 error('libidn and libidn2 cannot be requested simultaneously')
952 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
953 libidn = dependency('libidn',
954 required : want_libidn == 'true')
955 have = libidn.found()
960 conf.set10('HAVE_LIBIDN', have)
961 m4_defines += have ? ['-DHAVE_LIBIDN'] : []
962 if not have and want_libidn2 != 'false' and not fuzzer_build
963 # libidn is used for both libidn and libidn2 objects
964 libidn = dependency('libidn2',
965 required : want_libidn2 == 'true')
966 have = libidn.found()
970 conf.set10('HAVE_LIBIDN2', have)
971 m4_defines += have ? ['-DHAVE_LIBIDN2'] : []
973 want_libiptc = get_option('libiptc')
974 if want_libiptc != 'false' and not fuzzer_build
975 libiptc = dependency('libiptc',
976 required : want_libiptc == 'true')
977 have = libiptc.found()
982 conf.set10('HAVE_LIBIPTC', have)
983 m4_defines += have ? ['-DHAVE_LIBIPTC'] : []
985 want_qrencode = get_option('qrencode')
986 if want_qrencode != 'false' and not fuzzer_build
987 libqrencode = dependency('libqrencode',
988 required : want_qrencode == 'true')
989 have = libqrencode.found()
994 conf.set10('HAVE_QRENCODE', have)
996 want_gcrypt = get_option('gcrypt')
997 if want_gcrypt != 'false' and not fuzzer_build
998 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
999 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1000 have = libgcrypt.found() and libgpg_error.found()
1005 # link to neither of the libs if one is not found
1009 conf.set10('HAVE_GCRYPT', have)
1011 want_gnutls = get_option('gnutls')
1012 if want_gnutls != 'false' and not fuzzer_build
1013 libgnutls = dependency('gnutls',
1014 version : '>= 3.1.4',
1015 required : want_gnutls == 'true')
1016 have = libgnutls.found()
1021 conf.set10('HAVE_GNUTLS', have)
1023 want_elfutils = get_option('elfutils')
1024 if want_elfutils != 'false' and not fuzzer_build
1025 libdw = dependency('libdw',
1026 required : want_elfutils == 'true')
1027 have = libdw.found()
1032 conf.set10('HAVE_ELFUTILS', have)
1034 want_zlib = get_option('zlib')
1035 if want_zlib != 'false' and not fuzzer_build
1036 libz = dependency('zlib',
1037 required : want_zlib == 'true')
1043 conf.set10('HAVE_ZLIB', have)
1045 want_bzip2 = get_option('bzip2')
1046 if want_bzip2 != 'false' and not fuzzer_build
1047 libbzip2 = cc.find_library('bz2',
1048 required : want_bzip2 == 'true')
1049 have = libbzip2.found()
1054 conf.set10('HAVE_BZIP2', have)
1056 want_xz = get_option('xz')
1057 if want_xz != 'false' and not fuzzer_build
1058 libxz = dependency('liblzma',
1059 required : want_xz == 'true')
1060 have = libxz.found()
1065 conf.set10('HAVE_XZ', have)
1067 want_lz4 = get_option('lz4')
1068 if want_lz4 != 'false' and not fuzzer_build
1069 liblz4 = dependency('liblz4',
1070 required : want_lz4 == 'true')
1071 have = liblz4.found()
1076 conf.set10('HAVE_LZ4', have)
1078 want_xkbcommon = get_option('xkbcommon')
1079 if want_xkbcommon != 'false' and not fuzzer_build
1080 libxkbcommon = dependency('xkbcommon',
1081 version : '>= 0.3.0',
1082 required : want_xkbcommon == 'true')
1083 have = libxkbcommon.found()
1088 conf.set10('HAVE_XKBCOMMON', have)
1090 want_glib = get_option('glib')
1091 if want_glib != 'false' and not fuzzer_build
1092 libglib = dependency('glib-2.0',
1093 version : '>= 2.22.0',
1094 required : want_glib == 'true')
1095 libgobject = dependency('gobject-2.0',
1096 version : '>= 2.22.0',
1097 required : want_glib == 'true')
1098 libgio = dependency('gio-2.0',
1099 required : want_glib == 'true')
1100 have = libglib.found() and libgobject.found() and libgio.found()
1107 conf.set10('HAVE_GLIB', have)
1109 want_dbus = get_option('dbus')
1110 if want_dbus != 'false' and not fuzzer_build
1111 libdbus = dependency('dbus-1',
1112 version : '>= 1.3.2',
1113 required : want_dbus == 'true')
1114 have = libdbus.found()
1119 conf.set10('HAVE_DBUS', have)
1121 default_dnssec = get_option('default-dnssec')
1123 default_dnssec = 'no'
1125 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1126 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1127 default_dnssec = 'no'
1129 conf.set('DEFAULT_DNSSEC_MODE',
1130 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1131 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1133 want_importd = get_option('importd')
1134 if want_importd != 'false'
1135 have = (conf.get('HAVE_LIBCURL') == 1 and
1136 conf.get('HAVE_ZLIB') == 1 and
1137 conf.get('HAVE_BZIP2') == 1 and
1138 conf.get('HAVE_XZ') == 1 and
1139 conf.get('HAVE_GCRYPT') == 1)
1140 if want_importd == 'true' and not have
1141 error('importd support was requested, but dependencies are not available')
1146 conf.set10('ENABLE_IMPORTD', have)
1148 want_remote = get_option('remote')
1149 if want_remote != 'false'
1150 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1151 conf.get('HAVE_LIBCURL') == 1]
1152 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1153 # it's possible to build one without the other. Complain only if
1154 # support was explictly requested. The auxiliary files like sysusers
1155 # config should be installed when any of the programs are built.
1156 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1157 error('remote support was requested, but dependencies are not available')
1159 have = have_deps[0] or have_deps[1]
1163 conf.set10('ENABLE_REMOTE', have)
1165 foreach term : ['utmp',
1196 have = get_option(term)
1197 name = 'ENABLE_' + term.underscorify().to_upper()
1198 conf.set10(name, have)
1199 m4_defines += have ? ['-D' + name] : []
1202 want_tests = get_option('tests')
1203 install_tests = get_option('install-tests')
1207 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', get_option('slow-tests'))
1209 #####################################################################
1211 if get_option('efi')
1212 efi_arch = host_machine.cpu_family()
1214 if efi_arch == 'x86'
1215 EFI_MACHINE_TYPE_NAME = 'ia32'
1216 gnu_efi_arch = 'ia32'
1217 elif efi_arch == 'x86_64'
1218 EFI_MACHINE_TYPE_NAME = 'x64'
1219 gnu_efi_arch = 'x86_64'
1220 elif efi_arch == 'arm'
1221 EFI_MACHINE_TYPE_NAME = 'arm'
1222 gnu_efi_arch = 'arm'
1223 elif efi_arch == 'aarch64'
1224 EFI_MACHINE_TYPE_NAME = 'aa64'
1225 gnu_efi_arch = 'aarch64'
1227 EFI_MACHINE_TYPE_NAME = ''
1232 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1234 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1238 conf.set10('ENABLE_EFI', have)
1240 #####################################################################
1242 config_h = configure_file(
1243 output : 'config.h',
1244 configuration : conf)
1246 includes = include_directories('src/basic',
1256 'src/libsystemd/sd-bus',
1257 'src/libsystemd/sd-device',
1258 'src/libsystemd/sd-hwdb',
1259 'src/libsystemd/sd-id128',
1260 'src/libsystemd/sd-netlink',
1261 'src/libsystemd/sd-network',
1262 'src/libsystemd-network',
1265 add_project_arguments('-include', 'config.h', language : 'c')
1269 subdir('src/systemd')
1271 subdir('src/libsystemd')
1272 subdir('src/libsystemd-network')
1273 subdir('src/journal')
1276 libjournal_core = static_library(
1278 libjournal_core_sources,
1280 include_directories : includes,
1283 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1284 libsystemd = shared_library(
1286 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1287 version : libsystemd_version,
1288 include_directories : includes,
1289 link_args : ['-shared',
1290 '-Wl,--version-script=' + libsystemd_sym_path],
1291 link_with : [libbasic,
1293 link_whole : [libsystemd_static,
1295 dependencies : [threads,
1299 link_depends : libsystemd_sym,
1301 install_dir : rootlibdir)
1303 ############################################################
1305 # binaries that have --help and are intended for use by humans,
1306 # usually, but not always, installed in /bin.
1307 public_programs = []
1309 subdir('src/libudev')
1310 subdir('src/shared')
1313 subdir('src/network')
1315 subdir('src/analyze')
1316 subdir('src/journal-remote')
1317 subdir('src/coredump')
1318 subdir('src/hostname')
1319 subdir('src/import')
1320 subdir('src/kernel-install')
1321 subdir('src/locale')
1322 subdir('src/machine')
1323 subdir('src/nspawn')
1324 subdir('src/resolve')
1325 subdir('src/timedate')
1326 subdir('src/timesync')
1327 subdir('src/vconsole')
1328 subdir('src/boot/efi')
1335 ############################################################
1337 # only static linking apart from libdl, to make sure that the
1338 # module is linked to all libraries that it uses.
1339 test_dlopen = executable(
1342 include_directories : includes,
1343 link_with : [libbasic],
1344 dependencies : [libdl])
1346 foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
1347 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1348 ['mymachines', 'ENABLE_MACHINED'],
1349 ['resolve', 'ENABLE_RESOLVE']]
1351 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1355 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1356 version_script_arg = join_paths(meson.current_source_dir(), sym)
1358 nss = shared_library(
1360 'src/nss-@0@/nss-@0@.c'.format(module),
1362 include_directories : includes,
1363 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1364 link_args : ['-Wl,-z,nodelete',
1366 '-Wl,--version-script=' + version_script_arg,
1368 link_with : [libsystemd_static,
1370 dependencies : [threads,
1374 install_dir : rootlibdir)
1376 # We cannot use shared_module because it does not support version suffix.
1377 # Unfortunately shared_library insists on creating the symlink…
1378 meson.add_install_script('sh', '-c',
1379 'rm $DESTDIR@0@/libnss_@1@.so'
1380 .format(rootlibdir, module))
1382 test('dlopen-nss_' + module,
1384 args : [nss.full_path()]) # path to dlopen must include a slash
1388 ############################################################
1390 executable('systemd',
1392 include_directories : includes,
1393 link_with : [libcore,
1395 dependencies : [threads,
1401 install_rpath : rootlibexecdir,
1403 install_dir : rootlibexecdir)
1405 exe = executable('systemd-analyze',
1406 systemd_analyze_sources,
1407 include_directories : includes,
1408 link_with : [libcore,
1410 dependencies : [threads,
1416 install_rpath : rootlibexecdir,
1418 public_programs += [exe]
1420 executable('systemd-journald',
1421 systemd_journald_sources,
1422 include_directories : includes,
1423 link_with : [libjournal_core,
1425 dependencies : [threads,
1429 install_rpath : rootlibexecdir,
1431 install_dir : rootlibexecdir)
1433 exe = executable('systemd-cat',
1434 systemd_cat_sources,
1435 include_directories : includes,
1436 link_with : [libjournal_core,
1438 dependencies : [threads],
1439 install_rpath : rootlibexecdir,
1441 public_programs += [exe]
1443 exe = executable('journalctl',
1445 include_directories : includes,
1446 link_with : [libshared],
1447 dependencies : [threads,
1451 install_rpath : rootlibexecdir,
1453 install_dir : rootbindir)
1454 public_programs += [exe]
1456 executable('systemd-getty-generator',
1457 'src/getty-generator/getty-generator.c',
1458 include_directories : includes,
1459 link_with : [libshared],
1460 install_rpath : rootlibexecdir,
1462 install_dir : systemgeneratordir)
1464 executable('systemd-debug-generator',
1465 'src/debug-generator/debug-generator.c',
1466 include_directories : includes,
1467 link_with : [libshared],
1468 install_rpath : rootlibexecdir,
1470 install_dir : systemgeneratordir)
1472 executable('systemd-fstab-generator',
1473 'src/fstab-generator/fstab-generator.c',
1474 'src/core/mount-setup.c',
1475 include_directories : includes,
1476 link_with : [libshared],
1477 install_rpath : rootlibexecdir,
1479 install_dir : systemgeneratordir)
1481 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1482 executable('30-systemd-environment-d-generator',
1483 'src/environment-d-generator/environment-d-generator.c',
1484 include_directories : includes,
1485 link_with : [libshared],
1486 install_rpath : rootlibexecdir,
1488 install_dir : userenvgeneratordir)
1490 meson.add_install_script(meson_make_symlink,
1491 join_paths(sysconfdir, 'environment'),
1492 join_paths(environmentdir, '99-environment.conf'))
1495 if conf.get('ENABLE_HIBERNATE') == 1
1496 executable('systemd-hibernate-resume-generator',
1497 'src/hibernate-resume/hibernate-resume-generator.c',
1498 include_directories : includes,
1499 link_with : [libshared],
1500 install_rpath : rootlibexecdir,
1502 install_dir : systemgeneratordir)
1504 executable('systemd-hibernate-resume',
1505 'src/hibernate-resume/hibernate-resume.c',
1506 include_directories : includes,
1507 link_with : [libshared],
1508 install_rpath : rootlibexecdir,
1510 install_dir : rootlibexecdir)
1513 if conf.get('HAVE_BLKID') == 1
1514 executable('systemd-gpt-auto-generator',
1515 'src/gpt-auto-generator/gpt-auto-generator.c',
1516 'src/basic/blkid-util.h',
1517 include_directories : includes,
1518 link_with : [libshared],
1519 dependencies : libblkid,
1520 install_rpath : rootlibexecdir,
1522 install_dir : systemgeneratordir)
1524 exe = executable('systemd-dissect',
1525 'src/dissect/dissect.c',
1526 include_directories : includes,
1527 link_with : [libshared],
1528 install_rpath : rootlibexecdir,
1530 install_dir : rootlibexecdir)
1531 public_programs += [exe]
1534 if conf.get('ENABLE_RESOLVE') == 1
1535 executable('systemd-resolved',
1536 systemd_resolved_sources,
1537 include_directories : includes,
1538 link_with : [libshared,
1540 libsystemd_resolve_core],
1541 dependencies : [threads,
1545 install_rpath : rootlibexecdir,
1547 install_dir : rootlibexecdir)
1549 exe = executable('systemd-resolve',
1550 systemd_resolve_sources,
1551 include_directories : includes,
1552 link_with : [libshared,
1554 libsystemd_resolve_core],
1555 dependencies : [threads,
1559 install_rpath : rootlibexecdir,
1561 public_programs += [exe]
1564 if conf.get('ENABLE_LOGIND') == 1
1565 executable('systemd-logind',
1566 systemd_logind_sources,
1567 include_directories : includes,
1568 link_with : [liblogind_core,
1570 dependencies : [threads,
1572 install_rpath : rootlibexecdir,
1574 install_dir : rootlibexecdir)
1576 exe = executable('loginctl',
1578 include_directories : includes,
1579 link_with : [libshared],
1580 dependencies : [threads,
1583 install_rpath : rootlibexecdir,
1585 install_dir : rootbindir)
1586 public_programs += [exe]
1588 exe = executable('systemd-inhibit',
1589 'src/login/inhibit.c',
1590 include_directories : includes,
1591 link_with : [libshared],
1592 install_rpath : rootlibexecdir,
1594 install_dir : rootbindir)
1595 public_programs += [exe]
1597 if conf.get('HAVE_PAM') == 1
1598 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1599 pam_systemd = shared_library(
1603 include_directories : includes,
1604 link_args : ['-shared',
1605 '-Wl,--version-script=' + version_script_arg],
1606 link_with : [libsystemd_static,
1608 dependencies : [threads,
1611 link_depends : pam_systemd_sym,
1613 install_dir : pamlibdir)
1615 test('dlopen-pam_systemd',
1617 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1621 if conf.get('HAVE_PAM') == 1
1622 executable('systemd-user-sessions',
1623 'src/user-sessions/user-sessions.c',
1624 include_directories : includes,
1625 link_with : [libshared],
1626 install_rpath : rootlibexecdir,
1628 install_dir : rootlibexecdir)
1631 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1632 exe = executable('bootctl',
1633 'src/boot/bootctl.c',
1634 include_directories : includes,
1635 link_with : [libshared],
1636 dependencies : [libblkid],
1637 install_rpath : rootlibexecdir,
1639 public_programs += [exe]
1642 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1643 include_directories : includes,
1644 link_with : [libshared],
1645 dependencies : [threads],
1646 install_rpath : rootlibexecdir,
1648 public_programs += [exe]
1650 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1651 include_directories : includes,
1652 link_with : [libshared],
1653 dependencies : [threads,
1658 install_rpath : rootlibexecdir,
1660 install_dir : rootbindir)
1661 public_programs += [exe]
1663 if conf.get('ENABLE_BACKLIGHT') == 1
1664 executable('systemd-backlight',
1665 'src/backlight/backlight.c',
1666 include_directories : includes,
1667 link_with : [libshared],
1668 install_rpath : rootlibexecdir,
1670 install_dir : rootlibexecdir)
1673 if conf.get('ENABLE_RFKILL') == 1
1674 executable('systemd-rfkill',
1675 'src/rfkill/rfkill.c',
1676 include_directories : includes,
1677 link_with : [libshared],
1678 install_rpath : rootlibexecdir,
1680 install_dir : rootlibexecdir)
1683 executable('systemd-system-update-generator',
1684 'src/system-update-generator/system-update-generator.c',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 install_rpath : rootlibexecdir,
1689 install_dir : systemgeneratordir)
1691 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1692 executable('systemd-cryptsetup',
1693 'src/cryptsetup/cryptsetup.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 dependencies : [libcryptsetup],
1697 install_rpath : rootlibexecdir,
1699 install_dir : rootlibexecdir)
1701 executable('systemd-cryptsetup-generator',
1702 'src/cryptsetup/cryptsetup-generator.c',
1703 include_directories : includes,
1704 link_with : [libshared],
1705 dependencies : [libcryptsetup],
1706 install_rpath : rootlibexecdir,
1708 install_dir : systemgeneratordir)
1710 executable('systemd-veritysetup',
1711 'src/veritysetup/veritysetup.c',
1712 include_directories : includes,
1713 link_with : [libshared],
1714 dependencies : [libcryptsetup],
1715 install_rpath : rootlibexecdir,
1717 install_dir : rootlibexecdir)
1719 executable('systemd-veritysetup-generator',
1720 'src/veritysetup/veritysetup-generator.c',
1721 include_directories : includes,
1722 link_with : [libshared],
1723 dependencies : [libcryptsetup],
1724 install_rpath : rootlibexecdir,
1726 install_dir : systemgeneratordir)
1729 if conf.get('HAVE_SYSV_COMPAT') == 1
1730 executable('systemd-sysv-generator',
1731 'src/sysv-generator/sysv-generator.c',
1732 include_directories : includes,
1733 link_with : [libshared],
1734 install_rpath : rootlibexecdir,
1736 install_dir : systemgeneratordir)
1738 executable('systemd-rc-local-generator',
1739 'src/rc-local-generator/rc-local-generator.c',
1740 include_directories : includes,
1741 link_with : [libshared],
1742 install_rpath : rootlibexecdir,
1744 install_dir : systemgeneratordir)
1747 if conf.get('ENABLE_HOSTNAMED') == 1
1748 executable('systemd-hostnamed',
1749 'src/hostname/hostnamed.c',
1750 include_directories : includes,
1751 link_with : [libshared],
1752 install_rpath : rootlibexecdir,
1754 install_dir : rootlibexecdir)
1756 exe = executable('hostnamectl',
1757 'src/hostname/hostnamectl.c',
1758 include_directories : includes,
1759 link_with : [libshared],
1760 install_rpath : rootlibexecdir,
1762 public_programs += [exe]
1765 if conf.get('ENABLE_LOCALED') == 1
1766 if conf.get('HAVE_XKBCOMMON') == 1
1767 # logind will load libxkbcommon.so dynamically on its own
1773 executable('systemd-localed',
1774 systemd_localed_sources,
1775 include_directories : includes,
1776 link_with : [libshared],
1777 dependencies : deps,
1778 install_rpath : rootlibexecdir,
1780 install_dir : rootlibexecdir)
1782 exe = executable('localectl',
1784 include_directories : includes,
1785 link_with : [libshared],
1786 install_rpath : rootlibexecdir,
1788 public_programs += [exe]
1791 if conf.get('ENABLE_TIMEDATED') == 1
1792 executable('systemd-timedated',
1793 'src/timedate/timedated.c',
1794 include_directories : includes,
1795 link_with : [libshared],
1796 install_rpath : rootlibexecdir,
1798 install_dir : rootlibexecdir)
1800 exe = executable('timedatectl',
1801 'src/timedate/timedatectl.c',
1802 include_directories : includes,
1803 install_rpath : rootlibexecdir,
1804 link_with : [libshared],
1806 public_programs += [exe]
1809 if conf.get('ENABLE_TIMESYNCD') == 1
1810 executable('systemd-timesyncd',
1811 systemd_timesyncd_sources,
1812 include_directories : includes,
1813 link_with : [libshared],
1814 dependencies : [threads,
1816 install_rpath : rootlibexecdir,
1818 install_dir : rootlibexecdir)
1821 if conf.get('ENABLE_MACHINED') == 1
1822 executable('systemd-machined',
1823 systemd_machined_sources,
1824 include_directories : includes,
1825 link_with : [libmachine_core,
1827 install_rpath : rootlibexecdir,
1829 install_dir : rootlibexecdir)
1831 exe = executable('machinectl',
1832 'src/machine/machinectl.c',
1833 include_directories : includes,
1834 link_with : [libshared],
1835 dependencies : [threads,
1838 install_rpath : rootlibexecdir,
1840 install_dir : rootbindir)
1841 public_programs += [exe]
1844 if conf.get('ENABLE_IMPORTD') == 1
1845 executable('systemd-importd',
1846 systemd_importd_sources,
1847 include_directories : includes,
1848 link_with : [libshared],
1849 dependencies : [threads],
1850 install_rpath : rootlibexecdir,
1852 install_dir : rootlibexecdir)
1854 systemd_pull = executable('systemd-pull',
1855 systemd_pull_sources,
1856 include_directories : includes,
1857 link_with : [libshared],
1858 dependencies : [libcurl,
1863 install_rpath : rootlibexecdir,
1865 install_dir : rootlibexecdir)
1867 systemd_import = executable('systemd-import',
1868 systemd_import_sources,
1869 include_directories : includes,
1870 link_with : [libshared],
1871 dependencies : [libcurl,
1875 install_rpath : rootlibexecdir,
1877 install_dir : rootlibexecdir)
1879 systemd_export = executable('systemd-export',
1880 systemd_export_sources,
1881 include_directories : includes,
1882 link_with : [libshared],
1883 dependencies : [libcurl,
1887 install_rpath : rootlibexecdir,
1889 install_dir : rootlibexecdir)
1890 public_programs += [systemd_pull, systemd_import, systemd_export]
1893 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
1894 exe = executable('systemd-journal-upload',
1895 systemd_journal_upload_sources,
1896 include_directories : includes,
1897 link_with : [libshared],
1898 dependencies : [threads,
1903 install_rpath : rootlibexecdir,
1905 install_dir : rootlibexecdir)
1906 public_programs += [exe]
1909 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
1910 s_j_remote = executable('systemd-journal-remote',
1911 systemd_journal_remote_sources,
1912 include_directories : includes,
1913 link_with : [libshared],
1914 dependencies : [threads,
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootlibexecdir)
1923 s_j_gatewayd = executable('systemd-journal-gatewayd',
1924 systemd_journal_gatewayd_sources,
1925 include_directories : includes,
1926 link_with : [libshared],
1927 dependencies : [threads,
1932 install_rpath : rootlibexecdir,
1934 install_dir : rootlibexecdir)
1935 public_programs += [s_j_remote, s_j_gatewayd]
1938 if conf.get('ENABLE_COREDUMP') == 1
1939 executable('systemd-coredump',
1940 systemd_coredump_sources,
1941 include_directories : includes,
1942 link_with : [libshared],
1943 dependencies : [threads,
1948 install_rpath : rootlibexecdir,
1950 install_dir : rootlibexecdir)
1952 exe = executable('coredumpctl',
1953 coredumpctl_sources,
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [threads,
1959 install_rpath : rootlibexecdir,
1961 public_programs += [exe]
1964 if conf.get('ENABLE_BINFMT') == 1
1965 exe = executable('systemd-binfmt',
1966 'src/binfmt/binfmt.c',
1967 include_directories : includes,
1968 link_with : [libshared],
1969 install_rpath : rootlibexecdir,
1971 install_dir : rootlibexecdir)
1972 public_programs += [exe]
1974 meson.add_install_script('sh', '-c',
1975 mkdir_p.format(binfmtdir))
1976 meson.add_install_script('sh', '-c',
1977 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1980 if conf.get('ENABLE_VCONSOLE') == 1
1981 executable('systemd-vconsole-setup',
1982 'src/vconsole/vconsole-setup.c',
1983 include_directories : includes,
1984 link_with : [libshared],
1985 install_rpath : rootlibexecdir,
1987 install_dir : rootlibexecdir)
1990 if conf.get('ENABLE_RANDOMSEED') == 1
1991 executable('systemd-random-seed',
1992 'src/random-seed/random-seed.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 install_rpath : rootlibexecdir,
1997 install_dir : rootlibexecdir)
2000 if conf.get('ENABLE_FIRSTBOOT') == 1
2001 executable('systemd-firstboot',
2002 'src/firstboot/firstboot.c',
2003 include_directories : includes,
2004 link_with : [libshared],
2005 dependencies : [libcrypt],
2006 install_rpath : rootlibexecdir,
2008 install_dir : rootbindir)
2011 executable('systemd-remount-fs',
2012 'src/remount-fs/remount-fs.c',
2013 'src/core/mount-setup.c',
2014 'src/core/mount-setup.h',
2015 include_directories : includes,
2016 link_with : [libshared],
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2021 executable('systemd-machine-id-setup',
2022 'src/machine-id-setup/machine-id-setup-main.c',
2023 'src/core/machine-id-setup.c',
2024 'src/core/machine-id-setup.h',
2025 include_directories : includes,
2026 link_with : [libshared],
2027 install_rpath : rootlibexecdir,
2029 install_dir : rootbindir)
2031 executable('systemd-fsck',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 install_rpath : rootlibexecdir,
2037 install_dir : rootlibexecdir)
2039 executable('systemd-growfs',
2040 'src/partition/growfs.c',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 dependencies : [libcryptsetup],
2044 install_rpath : rootlibexecdir,
2046 install_dir : rootlibexecdir)
2048 executable('systemd-makefs',
2049 'src/partition/makefs.c',
2050 include_directories : includes,
2051 link_with : [libshared],
2052 install_rpath : rootlibexecdir,
2054 install_dir : rootlibexecdir)
2056 executable('systemd-sleep',
2057 'src/sleep/sleep.c',
2058 include_directories : includes,
2059 link_with : [libshared],
2060 install_rpath : rootlibexecdir,
2062 install_dir : rootlibexecdir)
2064 exe = executable('systemd-sysctl',
2065 'src/sysctl/sysctl.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 install_rpath : rootlibexecdir,
2070 install_dir : rootlibexecdir)
2071 public_programs += [exe]
2073 executable('systemd-ac-power',
2074 'src/ac-power/ac-power.c',
2075 include_directories : includes,
2076 link_with : [libshared],
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootlibexecdir)
2081 exe = executable('systemd-detect-virt',
2082 'src/detect-virt/detect-virt.c',
2083 include_directories : includes,
2084 link_with : [libshared],
2085 install_rpath : rootlibexecdir,
2087 public_programs += [exe]
2089 exe = executable('systemd-delta',
2090 'src/delta/delta.c',
2091 include_directories : includes,
2092 link_with : [libshared],
2093 install_rpath : rootlibexecdir,
2095 public_programs += [exe]
2097 exe = executable('systemd-escape',
2098 'src/escape/escape.c',
2099 include_directories : includes,
2100 link_with : [libshared],
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootbindir)
2104 public_programs += [exe]
2106 exe = executable('systemd-notify',
2107 'src/notify/notify.c',
2108 include_directories : includes,
2109 link_with : [libshared],
2110 install_rpath : rootlibexecdir,
2112 install_dir : rootbindir)
2113 public_programs += [exe]
2115 executable('systemd-volatile-root',
2116 'src/volatile-root/volatile-root.c',
2117 include_directories : includes,
2118 link_with : [libshared],
2119 install_rpath : rootlibexecdir,
2121 install_dir : rootlibexecdir)
2123 executable('systemd-cgroups-agent',
2124 'src/cgroups-agent/cgroups-agent.c',
2125 include_directories : includes,
2126 link_with : [libshared],
2127 install_rpath : rootlibexecdir,
2129 install_dir : rootlibexecdir)
2131 exe = executable('systemd-path',
2133 include_directories : includes,
2134 link_with : [libshared],
2135 install_rpath : rootlibexecdir,
2137 public_programs += [exe]
2139 exe = executable('systemd-ask-password',
2140 'src/ask-password/ask-password.c',
2141 include_directories : includes,
2142 link_with : [libshared],
2143 install_rpath : rootlibexecdir,
2145 install_dir : rootbindir)
2146 public_programs += [exe]
2148 executable('systemd-reply-password',
2149 'src/reply-password/reply-password.c',
2150 include_directories : includes,
2151 link_with : [libshared],
2152 install_rpath : rootlibexecdir,
2154 install_dir : rootlibexecdir)
2156 exe = executable('systemd-tty-ask-password-agent',
2157 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2158 include_directories : includes,
2159 link_with : [libshared],
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootbindir)
2163 public_programs += [exe]
2165 exe = executable('systemd-cgls',
2167 include_directories : includes,
2168 link_with : [libshared],
2169 install_rpath : rootlibexecdir,
2171 public_programs += [exe]
2173 exe = executable('systemd-cgtop',
2174 'src/cgtop/cgtop.c',
2175 include_directories : includes,
2176 link_with : [libshared],
2177 install_rpath : rootlibexecdir,
2179 public_programs += [exe]
2181 executable('systemd-initctl',
2182 'src/initctl/initctl.c',
2183 include_directories : includes,
2184 link_with : [libshared],
2185 install_rpath : rootlibexecdir,
2187 install_dir : rootlibexecdir)
2189 exe = executable('systemd-mount',
2190 'src/mount/mount-tool.c',
2191 include_directories : includes,
2192 link_with : [libshared],
2193 install_rpath : rootlibexecdir,
2195 public_programs += [exe]
2197 meson.add_install_script(meson_make_symlink,
2198 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2200 exe = executable('systemd-run',
2202 include_directories : includes,
2203 link_with : [libshared],
2204 install_rpath : rootlibexecdir,
2206 public_programs += [exe]
2208 exe = executable('systemd-stdio-bridge',
2209 'src/stdio-bridge/stdio-bridge.c',
2210 include_directories : includes,
2211 link_with : [libshared],
2212 install_rpath : rootlibexecdir,
2214 public_programs += [exe]
2216 exe = executable('busctl',
2217 'src/busctl/busctl.c',
2218 'src/busctl/busctl-introspect.c',
2219 'src/busctl/busctl-introspect.h',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2224 public_programs += [exe]
2226 if conf.get('ENABLE_SYSUSERS') == 1
2227 exe = executable('systemd-sysusers',
2228 'src/sysusers/sysusers.c',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2233 install_dir : rootbindir)
2234 public_programs += [exe]
2237 if conf.get('ENABLE_TMPFILES') == 1
2238 exe = executable('systemd-tmpfiles',
2239 'src/tmpfiles/tmpfiles.c',
2240 include_directories : includes,
2241 link_with : [libshared],
2242 dependencies : [libacl],
2243 install_rpath : rootlibexecdir,
2245 install_dir : rootbindir)
2246 public_programs += [exe]
2248 test('test-systemd-tmpfiles',
2249 test_systemd_tmpfiles_py,
2250 args : exe.full_path())
2251 # https://github.com/mesonbuild/meson/issues/2681
2254 if conf.get('ENABLE_HWDB') == 1
2255 exe = executable('systemd-hwdb',
2257 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2258 include_directories : includes,
2259 link_with : [libudev_static],
2260 install_rpath : udev_rpath,
2262 install_dir : rootbindir)
2263 public_programs += [exe]
2266 if conf.get('ENABLE_QUOTACHECK') == 1
2267 executable('systemd-quotacheck',
2268 'src/quotacheck/quotacheck.c',
2269 include_directories : includes,
2270 link_with : [libshared],
2271 install_rpath : rootlibexecdir,
2273 install_dir : rootlibexecdir)
2276 exe = executable('systemd-socket-proxyd',
2277 'src/socket-proxy/socket-proxyd.c',
2278 include_directories : includes,
2279 link_with : [libshared],
2280 dependencies : [threads],
2281 install_rpath : rootlibexecdir,
2283 install_dir : rootlibexecdir)
2284 public_programs += [exe]
2286 exe = executable('systemd-udevd',
2287 systemd_udevd_sources,
2288 include_directories : includes,
2289 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2290 link_with : [libudev_core,
2293 dependencies : [threads,
2298 install_rpath : udev_rpath,
2300 install_dir : rootlibexecdir)
2301 public_programs += [exe]
2303 exe = executable('udevadm',
2305 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2306 include_directories : includes,
2307 link_with : [libudev_core,
2310 dependencies : [threads,
2315 install_rpath : udev_rpath,
2317 install_dir : rootbindir)
2318 public_programs += [exe]
2320 executable('systemd-shutdown',
2321 systemd_shutdown_sources,
2322 include_directories : includes,
2323 link_with : [libshared],
2324 install_rpath : rootlibexecdir,
2326 install_dir : rootlibexecdir)
2328 executable('systemd-update-done',
2329 'src/update-done/update-done.c',
2330 include_directories : includes,
2331 link_with : [libshared],
2332 install_rpath : rootlibexecdir,
2334 install_dir : rootlibexecdir)
2336 executable('systemd-update-utmp',
2337 'src/update-utmp/update-utmp.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 dependencies : [libaudit],
2341 install_rpath : rootlibexecdir,
2343 install_dir : rootlibexecdir)
2345 if conf.get('HAVE_KMOD') == 1
2346 executable('systemd-modules-load',
2347 'src/modules-load/modules-load.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 dependencies : [libkmod],
2351 install_rpath : rootlibexecdir,
2353 install_dir : rootlibexecdir)
2355 meson.add_install_script('sh', '-c',
2356 mkdir_p.format(modulesloaddir))
2357 meson.add_install_script('sh', '-c',
2358 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2361 exe = executable('systemd-nspawn',
2362 systemd_nspawn_sources,
2363 'src/core/mount-setup.c', # FIXME: use a variable?
2364 'src/core/mount-setup.h',
2365 'src/core/loopback-setup.c',
2366 'src/core/loopback-setup.h',
2367 include_directories : [includes, include_directories('src/nspawn')],
2368 link_with : [libshared],
2369 dependencies : [libacl,
2373 install_rpath : rootlibexecdir,
2375 public_programs += [exe]
2377 if conf.get('ENABLE_NETWORKD') == 1
2378 executable('systemd-networkd',
2379 systemd_networkd_sources,
2380 include_directories : includes,
2381 link_with : [libnetworkd_core,
2385 dependencies : [threads],
2386 install_rpath : rootlibexecdir,
2388 install_dir : rootlibexecdir)
2390 executable('systemd-networkd-wait-online',
2391 systemd_networkd_wait_online_sources,
2392 include_directories : includes,
2393 link_with : [libnetworkd_core,
2395 install_rpath : rootlibexecdir,
2397 install_dir : rootlibexecdir)
2399 exe = executable('networkctl',
2401 include_directories : includes,
2402 link_with : [libsystemd_network,
2404 install_rpath : rootlibexecdir,
2406 install_dir : rootbindir)
2407 public_programs += [exe]
2410 executable('systemd-sulogin-shell',
2411 ['src/sulogin-shell/sulogin-shell.c'],
2412 include_directories : includes,
2413 link_with : [libshared],
2414 install_rpath : rootlibexecdir,
2416 install_dir : rootlibexecdir)
2418 ############################################################
2420 foreach tuple : tests
2422 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2423 dependencies = tuple[2]
2424 condition = tuple.length() >= 4 ? tuple[3] : ''
2425 type = tuple.length() >= 5 ? tuple[4] : ''
2426 defs = tuple.length() >= 6 ? tuple[5] : []
2427 incs = tuple.length() >= 7 ? tuple[6] : includes
2430 name = sources[0].split('/')[-1].split('.')[0]
2431 if type.startswith('timeout=')
2432 timeout = type.split('=')[1].to_int()
2435 if want_tests == 'false'
2436 message('Not compiling @0@ because tests is set to false'.format(name))
2437 elif condition == '' or conf.get(condition) == 1
2441 include_directories : incs,
2442 link_with : link_with,
2443 dependencies : dependencies,
2445 install_rpath : rootlibexecdir,
2446 install : install_tests,
2447 install_dir : join_paths(testsdir, type))
2450 message('@0@ is a manual test'.format(name))
2451 elif type == 'unsafe' and want_tests != 'unsafe'
2452 message('@0@ is an unsafe test'.format(name))
2459 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2463 test_libsystemd_sym = executable(
2464 'test-libsystemd-sym',
2465 test_libsystemd_sym_c,
2466 include_directories : includes,
2467 link_with : [libsystemd],
2468 install : install_tests,
2469 install_dir : testsdir)
2470 test('test-libsystemd-sym',
2471 test_libsystemd_sym)
2473 test_libudev_sym = executable(
2476 include_directories : includes,
2477 c_args : ['-Wno-deprecated-declarations'],
2478 link_with : [libudev],
2479 install : install_tests,
2480 install_dir : testsdir)
2481 test('test-libudev-sym',
2484 ############################################################
2488 foreach tuple : fuzzers
2490 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2491 dependencies = tuple[2]
2492 defs = tuple.length() >= 4 ? tuple[3] : []
2493 incs = tuple.length() >= 5 ? tuple[4] : includes
2496 dependencies += fuzzing_engine
2498 sources += 'src/fuzz/fuzz-main.c'
2501 name = sources[0].split('/')[-1].split('.')[0]
2503 fuzzer_exes += executable(
2506 include_directories : [incs, include_directories('src/fuzz')],
2507 link_with : link_with,
2508 dependencies : dependencies,
2513 run_target('fuzzers',
2514 depends : fuzzer_exes,
2517 ############################################################
2519 make_directive_index_py = find_program('tools/make-directive-index.py')
2520 make_man_index_py = find_program('tools/make-man-index.py')
2521 xml_helper_py = find_program('tools/xml_helper.py')
2522 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2526 subdir('sysusers.d')
2527 subdir('tmpfiles.d')
2532 subdir('shell-completion/bash')
2533 subdir('shell-completion/zsh')
2534 subdir('docs/sysvinit')
2535 subdir('docs/var-log')
2537 # FIXME: figure out if the warning is true:
2538 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2539 install_subdir('factory/etc',
2540 install_dir : factorydir)
2543 install_data('xorg/50-systemd-user.sh',
2544 install_dir : xinitrcdir)
2545 install_data('modprobe.d/systemd.conf',
2546 install_dir : modprobedir)
2547 install_data('README',
2554 'TRANSIENT-SETTINGS.md',
2556 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2557 install_dir : docdir)
2559 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2560 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2562 ############################################################
2564 meson_check_help = find_program('tools/meson-check-help.sh')
2566 foreach exec : public_programs
2567 name = exec.full_path().split('/')[-1]
2568 test('check-help-' + name,
2570 args : [exec.full_path()])
2573 ############################################################
2576 all_files = run_command(
2578 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2581 all_files = files(all_files.stdout().split())
2586 command : ['env', 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2590 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2594 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2597 command : [meson_git_contrib_sh])
2601 git_head = run_command(
2603 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2604 'rev-parse', 'HEAD']).stdout().strip()
2605 git_head_short = run_command(
2607 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2608 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2612 command : ['git', 'archive',
2613 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2615 '--prefix', 'systemd-@0@/'.format(git_head),
2619 ############################################################
2621 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2624 depends : [man, libsystemd, libudev],
2625 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2627 ############################################################
2630 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2632 'prefix directory: @0@'.format(prefixdir),
2633 'rootprefix directory: @0@'.format(rootprefixdir),
2634 'sysconf directory: @0@'.format(sysconfdir),
2635 'include directory: @0@'.format(includedir),
2636 'lib directory: @0@'.format(libdir),
2637 'rootlib directory: @0@'.format(rootlibdir),
2638 'SysV init scripts: @0@'.format(sysvinit_path),
2639 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2640 'PAM modules directory: @0@'.format(pamlibdir),
2641 'PAM configuration directory: @0@'.format(pamconfdir),
2642 'RPM macros directory: @0@'.format(rpmmacrosdir),
2643 'modprobe.d directory: @0@'.format(modprobedir),
2644 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2645 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2646 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2647 'bash completions directory: @0@'.format(bashcompletiondir),
2648 'zsh completions directory: @0@'.format(zshcompletiondir),
2649 'extra start script: @0@'.format(get_option('rc-local')),
2650 'extra stop script: @0@'.format(get_option('halt-local')),
2651 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2652 get_option('debug-tty')),
2653 'TTY GID: @0@'.format(tty_gid),
2654 'users GID: @0@'.format(users_gid),
2655 'maximum system UID: @0@'.format(system_uid_max),
2656 'maximum system GID: @0@'.format(system_gid_max),
2657 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2658 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2659 'minimum container UID base: @0@'.format(container_uid_base_min),
2660 'maximum container UID base: @0@'.format(container_uid_base_max),
2661 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2662 'render group access mode: @0@'.format(get_option('group-render-mode')),
2663 'certificate root directory: @0@'.format(get_option('certificate-root')),
2664 'support URL: @0@'.format(support_url),
2665 'nobody user name: @0@'.format(nobody_user),
2666 'nobody group name: @0@'.format(nobody_group),
2667 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2668 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2670 'default DNSSEC mode: @0@'.format(default_dnssec),
2671 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2672 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2674 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2675 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2677 'default DNS servers: @0@'.format(alt_dns_servers),
2678 'default NTP servers: @0@'.format(alt_ntp_servers)]
2680 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2681 '@@0@'.format(time_epoch)).stdout().strip()
2683 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2686 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2687 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2688 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2690 if conf.get('ENABLE_EFI') == 1
2692 'efi arch: @0@'.format(efi_arch)]
2696 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2697 'EFI CC @0@'.format(efi_cc),
2698 'EFI lib directory: @0@'.format(efi_libdir),
2699 'EFI lds directory: @0@'.format(efi_ldsdir),
2700 'EFI include directory: @0@'.format(efi_incdir)]
2753 ['legacy pkla', install_polkit_pkla],
2755 ['gnu-efi', have_gnu_efi],
2761 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
2764 ['man pages', want_man],
2765 ['html pages', want_html],
2766 ['man page indices', want_man and have_lxml],
2767 ['split /usr', conf.get('HAVE_SPLIT_USR') == 1],
2772 ['adm group', get_option('adm-group')],
2773 ['wheel group', get_option('wheel-group')],
2776 ['debug mmap cache'],
2779 cond = tuple.get(1, '')
2781 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2782 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
2783 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
2788 missing += [tuple[0]]
2794 'enabled features: @0@'.format(', '.join(found)),
2796 'disabled features: @0@'.format(', '.join(missing)),
2798 message('\n '.join(status))
2800 if rootprefixdir != rootprefix_default
2801 message('WARNING:\n' +
2802 ' Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
2803 ' systemd used fixed names for unit file directories and other paths, so anything\n' +
2804 ' except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))