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