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