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