]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
build-sys: fix invalid args detected by meson 0.42 (#6561)
[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 add_project_arguments('-include', 'config.h', language : 'c')
1096
1097 gcrypt_util_sources = files('src/shared/gcrypt-util.h',
1098 'src/shared/gcrypt-util.c')
1099
1100 subdir('po')
1101 subdir('catalog')
1102 subdir('src/systemd')
1103 subdir('src/basic')
1104 subdir('src/libsystemd')
1105 subdir('src/libsystemd-network')
1106 subdir('src/journal')
1107 subdir('src/login')
1108
1109 libjournal_core = static_library(
1110 'journal-core',
1111 libjournal_core_sources,
1112 journald_gperf_c,
1113 include_directories : includes,
1114 install : false)
1115
1116 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1117 libsystemd = shared_library(
1118 'systemd',
1119 libsystemd_internal_sources,
1120 journal_internal_sources,
1121 version : '0.19.0',
1122 include_directories : includes,
1123 link_args : ['-shared',
1124 '-Wl,--version-script=' + libsystemd_sym_path],
1125 link_with : [libbasic],
1126 dependencies : [threads,
1127 libgcrypt,
1128 librt,
1129 libxz,
1130 liblz4],
1131 link_depends : libsystemd_sym,
1132 install : true,
1133 install_dir : rootlibdir)
1134
1135 ############################################################
1136
1137 # binaries that have --help and are intended for use by humans,
1138 # usually, but not always, installed in /bin.
1139 public_programs = []
1140
1141 subdir('src/libudev')
1142 subdir('src/shared')
1143 subdir('src/core')
1144 subdir('src/udev')
1145 subdir('src/network')
1146
1147 subdir('src/analyze')
1148 subdir('src/journal-remote')
1149 subdir('src/coredump')
1150 subdir('src/hostname')
1151 subdir('src/import')
1152 subdir('src/kernel-install')
1153 subdir('src/locale')
1154 subdir('src/machine')
1155 subdir('src/nspawn')
1156 subdir('src/resolve')
1157 subdir('src/timedate')
1158 subdir('src/timesync')
1159 subdir('src/vconsole')
1160 subdir('src/sulogin-shell')
1161 subdir('src/boot/efi')
1162
1163 subdir('src/test')
1164 subdir('test')
1165
1166 ############################################################
1167
1168 # only static linking apart from libdl, to make sure that the
1169 # module is linked to all libraries that it uses.
1170 test_dlopen = executable(
1171 'test-dlopen',
1172 test_dlopen_c,
1173 include_directories : includes,
1174 link_with : [libbasic],
1175 dependencies : [libdl])
1176
1177 foreach tuple : [['myhostname', 'HAVE_MYHOSTNAME'],
1178 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1179 ['mymachines', 'ENABLE_MACHINED'],
1180 ['resolve', 'ENABLE_RESOLVED']]
1181
1182 condition = tuple[1] == '' or conf.get(tuple[1], false)
1183 if condition
1184 module = tuple[0]
1185
1186 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1187 version_script_arg = join_paths(meson.current_source_dir(), sym)
1188
1189 nss = shared_library(
1190 'nss_' + module,
1191 'src/nss-@0@/nss-@0@.c'.format(module),
1192 version : '2',
1193 include_directories : includes,
1194 link_args : ['-shared',
1195 '-Wl,--version-script=' + version_script_arg,
1196 '-Wl,--undefined'],
1197 link_with : [libsystemd_internal,
1198 libbasic],
1199 dependencies : [threads,
1200 librt],
1201 link_depends : sym,
1202 install : true,
1203 install_dir : rootlibdir)
1204
1205 # We cannot use shared_module because it does not support version suffix.
1206 # Unfortunately shared_library insists on creating the symlink…
1207 meson.add_install_script('sh', '-c',
1208 'rm $DESTDIR@0@/libnss_@1@.so'
1209 .format(rootlibdir, module))
1210
1211 test('dlopen-nss_' + module,
1212 test_dlopen,
1213 args : [nss.full_path()]) # path to dlopen must include a slash
1214 endif
1215 endforeach
1216
1217 ############################################################
1218
1219 executable('systemd',
1220 systemd_sources,
1221 include_directories : includes,
1222 link_with : [libcore,
1223 libshared],
1224 dependencies : [threads,
1225 librt,
1226 libseccomp,
1227 libselinux,
1228 libmount,
1229 libblkid],
1230 install_rpath : rootlibexecdir,
1231 install : true,
1232 install_dir : rootlibexecdir)
1233
1234 exe = executable('systemd-analyze',
1235 systemd_analyze_sources,
1236 include_directories : includes,
1237 link_with : [libcore,
1238 libshared],
1239 dependencies : [threads,
1240 librt,
1241 libseccomp,
1242 libselinux,
1243 libmount,
1244 libblkid],
1245 install_rpath : rootlibexecdir,
1246 install : true)
1247 public_programs += [exe]
1248
1249 executable('systemd-journald',
1250 systemd_journald_sources,
1251 include_directories : includes,
1252 link_with : [libjournal_core,
1253 libshared],
1254 dependencies : [threads,
1255 libxz,
1256 liblz4,
1257 libselinux],
1258 install_rpath : rootlibexecdir,
1259 install : true,
1260 install_dir : rootlibexecdir)
1261
1262 exe = executable('systemd-cat',
1263 systemd_cat_sources,
1264 include_directories : includes,
1265 link_with : [libjournal_core,
1266 libshared],
1267 dependencies : [threads],
1268 install_rpath : rootlibexecdir,
1269 install : true)
1270 public_programs += [exe]
1271
1272 exe = executable('journalctl',
1273 journalctl_sources,
1274 include_directories : includes,
1275 link_with : [libshared],
1276 dependencies : [threads,
1277 libqrencode,
1278 libxz,
1279 liblz4],
1280 install_rpath : rootlibexecdir,
1281 install : true,
1282 install_dir : rootbindir)
1283 public_programs += [exe]
1284
1285 executable('systemd-getty-generator',
1286 'src/getty-generator/getty-generator.c',
1287 include_directories : includes,
1288 link_with : [libshared],
1289 install_rpath : rootlibexecdir,
1290 install : true,
1291 install_dir : systemgeneratordir)
1292
1293 executable('systemd-debug-generator',
1294 'src/debug-generator/debug-generator.c',
1295 include_directories : includes,
1296 link_with : [libshared],
1297 install_rpath : rootlibexecdir,
1298 install : true,
1299 install_dir : systemgeneratordir)
1300
1301 executable('systemd-fstab-generator',
1302 'src/fstab-generator/fstab-generator.c',
1303 'src/core/mount-setup.c',
1304 include_directories : includes,
1305 link_with : [libshared],
1306 install_rpath : rootlibexecdir,
1307 install : true,
1308 install_dir : systemgeneratordir)
1309
1310 if conf.get('ENABLE_ENVIRONMENT_D', false)
1311 executable('30-systemd-environment-d-generator',
1312 'src/environment-d-generator/environment-d-generator.c',
1313 include_directories : includes,
1314 link_with : [libshared],
1315 install_rpath : rootlibexecdir,
1316 install : true,
1317 install_dir : userenvgeneratordir)
1318
1319 meson.add_install_script(meson_make_symlink,
1320 join_paths(sysconfdir, 'environment'),
1321 join_paths(environmentdir, '99-environment.conf'))
1322 endif
1323
1324 if conf.get('ENABLE_HIBERNATE', false)
1325 executable('systemd-hibernate-resume-generator',
1326 'src/hibernate-resume/hibernate-resume-generator.c',
1327 include_directories : includes,
1328 link_with : [libshared],
1329 install_rpath : rootlibexecdir,
1330 install : true,
1331 install_dir : systemgeneratordir)
1332
1333 executable('systemd-hibernate-resume',
1334 'src/hibernate-resume/hibernate-resume.c',
1335 include_directories : includes,
1336 link_with : [libshared],
1337 install_rpath : rootlibexecdir,
1338 install : true,
1339 install_dir : rootlibexecdir)
1340 endif
1341
1342 if conf.get('HAVE_BLKID', false)
1343 executable('systemd-gpt-auto-generator',
1344 'src/gpt-auto-generator/gpt-auto-generator.c',
1345 'src/basic/blkid-util.h',
1346 include_directories : includes,
1347 link_with : [libshared],
1348 dependencies : libblkid,
1349 install_rpath : rootlibexecdir,
1350 install : true,
1351 install_dir : systemgeneratordir)
1352
1353 exe = executable('systemd-dissect',
1354 'src/dissect/dissect.c',
1355 include_directories : includes,
1356 link_with : [libshared],
1357 install_rpath : rootlibexecdir,
1358 install : true,
1359 install_dir : rootlibexecdir)
1360 public_programs += [exe]
1361 endif
1362
1363 if conf.get('ENABLE_RESOLVED', false)
1364 executable('systemd-resolved',
1365 systemd_resolved_sources,
1366 gcrypt_util_sources,
1367 include_directories : includes,
1368 link_with : [libshared],
1369 dependencies : [threads,
1370 libgcrypt,
1371 libgpg_error,
1372 libm,
1373 libidn],
1374 install_rpath : rootlibexecdir,
1375 install : true,
1376 install_dir : rootlibexecdir)
1377
1378 exe = executable('systemd-resolve',
1379 systemd_resolve_sources,
1380 gcrypt_util_sources,
1381 include_directories : includes,
1382 link_with : [libshared],
1383 dependencies : [threads,
1384 libgcrypt,
1385 libgpg_error,
1386 libm,
1387 libidn],
1388 install_rpath : rootlibexecdir,
1389 install : true)
1390 public_programs += [exe]
1391 endif
1392
1393 if conf.get('ENABLE_LOGIND', false)
1394 executable('systemd-logind',
1395 systemd_logind_sources,
1396 include_directories : includes,
1397 link_with : [liblogind_core,
1398 libshared],
1399 dependencies : [threads,
1400 libacl],
1401 install_rpath : rootlibexecdir,
1402 install : true,
1403 install_dir : rootlibexecdir)
1404
1405 exe = executable('loginctl',
1406 loginctl_sources,
1407 include_directories : includes,
1408 link_with : [libshared],
1409 dependencies : [threads,
1410 liblz4,
1411 libxz],
1412 install_rpath : rootlibexecdir,
1413 install : true,
1414 install_dir : rootbindir)
1415 public_programs += [exe]
1416
1417 exe = executable('systemd-inhibit',
1418 'src/login/inhibit.c',
1419 include_directories : includes,
1420 link_with : [libshared],
1421 install_rpath : rootlibexecdir,
1422 install : true,
1423 install_dir : rootbindir)
1424 public_programs += [exe]
1425
1426 if conf.get('HAVE_PAM', false)
1427 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1428 pam_systemd = shared_library(
1429 'pam_systemd',
1430 pam_systemd_c,
1431 name_prefix : '',
1432 include_directories : includes,
1433 link_args : ['-shared',
1434 '-Wl,--version-script=' + version_script_arg],
1435 link_with : [libsystemd_internal,
1436 libshared_static],
1437 dependencies : [threads,
1438 libpam,
1439 libpam_misc],
1440 link_depends : pam_systemd_sym,
1441 install : true,
1442 install_dir : pamlibdir)
1443
1444 test('dlopen-pam_systemd',
1445 test_dlopen,
1446 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1447 endif
1448 endif
1449
1450 if conf.get('HAVE_PAM', false)
1451 executable('systemd-user-sessions',
1452 'src/user-sessions/user-sessions.c',
1453 include_directories : includes,
1454 link_with : [libshared],
1455 install_rpath : rootlibexecdir,
1456 install : true,
1457 install_dir : rootlibexecdir)
1458 endif
1459
1460 if conf.get('ENABLE_EFI', false) and conf.get('HAVE_BLKID', false)
1461 exe = executable('bootctl',
1462 'src/boot/bootctl.c',
1463 include_directories : includes,
1464 link_with : [libshared],
1465 dependencies : [libblkid],
1466 install_rpath : rootlibexecdir,
1467 install : true)
1468 public_programs += [exe]
1469 endif
1470
1471 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1472 include_directories : includes,
1473 link_with : [libshared],
1474 dependencies : [threads],
1475 install_rpath : rootlibexecdir,
1476 install : true)
1477 public_programs += [exe]
1478
1479 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1480 include_directories : includes,
1481 link_with : [libshared],
1482 dependencies : [threads,
1483 libcap,
1484 libselinux,
1485 libxz,
1486 liblz4],
1487 install_rpath : rootlibexecdir,
1488 install : true,
1489 install_dir : rootbindir)
1490 public_programs += [exe]
1491
1492 if conf.get('ENABLE_BACKLIGHT', false)
1493 executable('systemd-backlight',
1494 'src/backlight/backlight.c',
1495 include_directories : includes,
1496 link_with : [libshared],
1497 install_rpath : rootlibexecdir,
1498 install : true,
1499 install_dir : rootlibexecdir)
1500 endif
1501
1502 if conf.get('ENABLE_RFKILL', false)
1503 executable('systemd-rfkill',
1504 'src/rfkill/rfkill.c',
1505 include_directories : includes,
1506 link_with : [libshared],
1507 install_rpath : rootlibexecdir,
1508 install : true,
1509 install_dir : rootlibexecdir)
1510 endif
1511
1512 executable('systemd-system-update-generator',
1513 'src/system-update-generator/system-update-generator.c',
1514 include_directories : includes,
1515 link_with : [libshared],
1516 install_rpath : rootlibexecdir,
1517 install : true,
1518 install_dir : systemgeneratordir)
1519
1520 if conf.get('HAVE_LIBCRYPTSETUP', false)
1521 executable('systemd-cryptsetup',
1522 'src/cryptsetup/cryptsetup.c',
1523 include_directories : includes,
1524 link_with : [libshared],
1525 dependencies : [libcryptsetup],
1526 install_rpath : rootlibexecdir,
1527 install : true,
1528 install_dir : rootlibexecdir)
1529
1530 executable('systemd-cryptsetup-generator',
1531 'src/cryptsetup/cryptsetup-generator.c',
1532 include_directories : includes,
1533 link_with : [libshared],
1534 dependencies : [libcryptsetup],
1535 install_rpath : rootlibexecdir,
1536 install : true,
1537 install_dir : systemgeneratordir)
1538
1539 executable('systemd-veritysetup',
1540 'src/veritysetup/veritysetup.c',
1541 include_directories : includes,
1542 link_with : [libshared],
1543 dependencies : [libcryptsetup],
1544 install_rpath : rootlibexecdir,
1545 install : true,
1546 install_dir : rootlibexecdir)
1547
1548 executable('systemd-veritysetup-generator',
1549 'src/veritysetup/veritysetup-generator.c',
1550 include_directories : includes,
1551 link_with : [libshared],
1552 dependencies : [libcryptsetup],
1553 install_rpath : rootlibexecdir,
1554 install : true,
1555 install_dir : systemgeneratordir)
1556 endif
1557
1558 if conf.get('HAVE_SYSV_COMPAT', false)
1559 executable('systemd-sysv-generator',
1560 'src/sysv-generator/sysv-generator.c',
1561 include_directories : includes,
1562 link_with : [libshared],
1563 install_rpath : rootlibexecdir,
1564 install : true,
1565 install_dir : systemgeneratordir)
1566
1567 executable('systemd-rc-local-generator',
1568 'src/rc-local-generator/rc-local-generator.c',
1569 include_directories : includes,
1570 link_with : [libshared],
1571 install_rpath : rootlibexecdir,
1572 install : true,
1573 install_dir : systemgeneratordir)
1574 endif
1575
1576 if conf.get('ENABLE_HOSTNAMED', false)
1577 executable('systemd-hostnamed',
1578 'src/hostname/hostnamed.c',
1579 include_directories : includes,
1580 link_with : [libshared],
1581 install_rpath : rootlibexecdir,
1582 install : true,
1583 install_dir : rootlibexecdir)
1584
1585 exe = executable('hostnamectl',
1586 'src/hostname/hostnamectl.c',
1587 include_directories : includes,
1588 link_with : [libshared],
1589 install_rpath : rootlibexecdir,
1590 install : true)
1591 public_programs += [exe]
1592 endif
1593
1594 if conf.get('ENABLE_LOCALED', false)
1595 if conf.get('HAVE_XKBCOMMON', false)
1596 # logind will load libxkbcommon.so dynamically on its own
1597 deps = [libdl]
1598 else
1599 deps = []
1600 endif
1601
1602 executable('systemd-localed',
1603 systemd_localed_sources,
1604 include_directories : includes,
1605 link_with : [libshared],
1606 dependencies : deps,
1607 install_rpath : rootlibexecdir,
1608 install : true,
1609 install_dir : rootlibexecdir)
1610
1611 exe = executable('localectl',
1612 localectl_sources,
1613 include_directories : includes,
1614 link_with : [libshared],
1615 install_rpath : rootlibexecdir,
1616 install : true)
1617 public_programs += [exe]
1618 endif
1619
1620 if conf.get('ENABLE_TIMEDATED', false)
1621 executable('systemd-timedated',
1622 'src/timedate/timedated.c',
1623 include_directories : includes,
1624 link_with : [libshared],
1625 install_rpath : rootlibexecdir,
1626 install : true,
1627 install_dir : rootlibexecdir)
1628
1629 exe = executable('timedatectl',
1630 'src/timedate/timedatectl.c',
1631 include_directories : includes,
1632 install_rpath : rootlibexecdir,
1633 link_with : [libshared],
1634 install : true)
1635 public_programs += [exe]
1636 endif
1637
1638 if conf.get('ENABLE_TIMESYNCD', false)
1639 executable('systemd-timesyncd',
1640 systemd_timesyncd_sources,
1641 include_directories : includes,
1642 link_with : [libshared],
1643 dependencies : [threads,
1644 libm],
1645 install_rpath : rootlibexecdir,
1646 install : true,
1647 install_dir : rootlibexecdir)
1648 endif
1649
1650 if conf.get('ENABLE_MACHINED', false)
1651 executable('systemd-machined',
1652 systemd_machined_sources,
1653 include_directories : includes,
1654 link_with : [libmachine_core,
1655 libshared],
1656 install_rpath : rootlibexecdir,
1657 install : true,
1658 install_dir : rootlibexecdir)
1659
1660 exe = executable('machinectl',
1661 'src/machine/machinectl.c',
1662 include_directories : includes,
1663 link_with : [libshared],
1664 dependencies : [threads,
1665 libxz,
1666 liblz4],
1667 install_rpath : rootlibexecdir,
1668 install : true,
1669 install_dir : rootbindir)
1670 public_programs += [exe]
1671 endif
1672
1673 if conf.get('ENABLE_IMPORTD', false)
1674 executable('systemd-importd',
1675 systemd_importd_sources,
1676 include_directories : includes,
1677 link_with : [libshared],
1678 dependencies : [threads],
1679 install_rpath : rootlibexecdir,
1680 install : true,
1681 install_dir : rootlibexecdir)
1682
1683 systemd_pull = executable('systemd-pull',
1684 systemd_pull_sources,
1685 include_directories : includes,
1686 link_with : [libshared],
1687 dependencies : [libcurl,
1688 libz,
1689 libbzip2,
1690 libxz,
1691 libgcrypt],
1692 install_rpath : rootlibexecdir,
1693 install : true,
1694 install_dir : rootlibexecdir)
1695
1696 systemd_import = executable('systemd-import',
1697 systemd_import_sources,
1698 include_directories : includes,
1699 link_with : [libshared],
1700 dependencies : [libcurl,
1701 libz,
1702 libbzip2,
1703 libxz],
1704 install_rpath : rootlibexecdir,
1705 install : true,
1706 install_dir : rootlibexecdir)
1707
1708 systemd_export = executable('systemd-export',
1709 systemd_export_sources,
1710 include_directories : includes,
1711 link_with : [libshared],
1712 dependencies : [libcurl,
1713 libz,
1714 libbzip2,
1715 libxz],
1716 install_rpath : rootlibexecdir,
1717 install : true,
1718 install_dir : rootlibexecdir)
1719 public_programs += [systemd_pull, systemd_import, systemd_export]
1720 endif
1721
1722 if conf.get('ENABLE_REMOTE', false) and conf.get('HAVE_LIBCURL', false)
1723 exe = executable('systemd-journal-upload',
1724 systemd_journal_upload_sources,
1725 include_directories : includes,
1726 link_with : [libshared],
1727 dependencies : [threads,
1728 libcurl,
1729 libgnutls,
1730 libxz,
1731 liblz4],
1732 install_rpath : rootlibexecdir,
1733 install : true,
1734 install_dir : rootlibexecdir)
1735 public_programs += [exe]
1736 endif
1737
1738 if conf.get('ENABLE_REMOTE', false) and conf.get('HAVE_MICROHTTPD', false)
1739 s_j_remote = executable('systemd-journal-remote',
1740 systemd_journal_remote_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
1752 s_j_gatewayd = executable('systemd-journal-gatewayd',
1753 systemd_journal_gatewayd_sources,
1754 include_directories : includes,
1755 link_with : [libshared],
1756 dependencies : [threads,
1757 libmicrohttpd,
1758 libgnutls,
1759 libxz,
1760 liblz4],
1761 install_rpath : rootlibexecdir,
1762 install : true,
1763 install_dir : rootlibexecdir)
1764 public_programs += [s_j_remote, s_j_gatewayd]
1765 endif
1766
1767 if conf.get('ENABLE_COREDUMP', false)
1768 executable('systemd-coredump',
1769 systemd_coredump_sources,
1770 include_directories : includes,
1771 link_with : [libshared],
1772 dependencies : [threads,
1773 libacl,
1774 libdw,
1775 libxz,
1776 liblz4],
1777 install_rpath : rootlibexecdir,
1778 install : true,
1779 install_dir : rootlibexecdir)
1780
1781 exe = executable('coredumpctl',
1782 coredumpctl_sources,
1783 include_directories : includes,
1784 link_with : [libshared],
1785 dependencies : [threads,
1786 libxz,
1787 liblz4],
1788 install_rpath : rootlibexecdir,
1789 install : true)
1790 public_programs += [exe]
1791 endif
1792
1793 if conf.get('ENABLE_BINFMT', false)
1794 exe = executable('systemd-binfmt',
1795 'src/binfmt/binfmt.c',
1796 include_directories : includes,
1797 link_with : [libshared],
1798 install_rpath : rootlibexecdir,
1799 install : true,
1800 install_dir : rootlibexecdir)
1801 public_programs += [exe]
1802
1803 meson.add_install_script('sh', '-c',
1804 mkdir_p.format(binfmtdir))
1805 meson.add_install_script('sh', '-c',
1806 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
1807 endif
1808
1809 if conf.get('ENABLE_VCONSOLE', false)
1810 executable('systemd-vconsole-setup',
1811 'src/vconsole/vconsole-setup.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 install_rpath : rootlibexecdir,
1815 install : true,
1816 install_dir : rootlibexecdir)
1817 endif
1818
1819 if conf.get('ENABLE_RANDOMSEED', false)
1820 executable('systemd-random-seed',
1821 'src/random-seed/random-seed.c',
1822 include_directories : includes,
1823 link_with : [libshared],
1824 install_rpath : rootlibexecdir,
1825 install : true,
1826 install_dir : rootlibexecdir)
1827 endif
1828
1829 if conf.get('ENABLE_FIRSTBOOT', false)
1830 executable('systemd-firstboot',
1831 'src/firstboot/firstboot.c',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 dependencies : [libcrypt],
1835 install_rpath : rootlibexecdir,
1836 install : true,
1837 install_dir : rootbindir)
1838 endif
1839
1840 executable('systemd-remount-fs',
1841 'src/remount-fs/remount-fs.c',
1842 'src/core/mount-setup.c',
1843 'src/core/mount-setup.h',
1844 include_directories : includes,
1845 link_with : [libshared],
1846 install_rpath : rootlibexecdir,
1847 install : true,
1848 install_dir : rootlibexecdir)
1849
1850 executable('systemd-machine-id-setup',
1851 'src/machine-id-setup/machine-id-setup-main.c',
1852 'src/core/machine-id-setup.c',
1853 'src/core/machine-id-setup.h',
1854 include_directories : includes,
1855 link_with : [libshared],
1856 install_rpath : rootlibexecdir,
1857 install : true,
1858 install_dir : rootbindir)
1859
1860 executable('systemd-fsck',
1861 'src/fsck/fsck.c',
1862 include_directories : includes,
1863 link_with : [libshared],
1864 install_rpath : rootlibexecdir,
1865 install : true,
1866 install_dir : rootlibexecdir)
1867
1868 executable('systemd-sleep',
1869 'src/sleep/sleep.c',
1870 include_directories : includes,
1871 link_with : [libshared],
1872 install_rpath : rootlibexecdir,
1873 install : true,
1874 install_dir : rootlibexecdir)
1875
1876 exe = executable('systemd-sysctl',
1877 'src/sysctl/sysctl.c',
1878 include_directories : includes,
1879 link_with : [libshared],
1880 install_rpath : rootlibexecdir,
1881 install : true,
1882 install_dir : rootlibexecdir)
1883 public_programs += [exe]
1884
1885 executable('systemd-ac-power',
1886 'src/ac-power/ac-power.c',
1887 include_directories : includes,
1888 link_with : [libshared],
1889 install_rpath : rootlibexecdir,
1890 install : true,
1891 install_dir : rootlibexecdir)
1892
1893 exe = executable('systemd-detect-virt',
1894 'src/detect-virt/detect-virt.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 install_rpath : rootlibexecdir,
1898 install : true)
1899 public_programs += [exe]
1900
1901 exe = executable('systemd-delta',
1902 'src/delta/delta.c',
1903 include_directories : includes,
1904 link_with : [libshared],
1905 install_rpath : rootlibexecdir,
1906 install : true)
1907 public_programs += [exe]
1908
1909 exe = executable('systemd-escape',
1910 'src/escape/escape.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 install_rpath : rootlibexecdir,
1914 install : true,
1915 install_dir : rootbindir)
1916 public_programs += [exe]
1917
1918 exe = executable('systemd-notify',
1919 'src/notify/notify.c',
1920 include_directories : includes,
1921 link_with : [libshared],
1922 install_rpath : rootlibexecdir,
1923 install : true,
1924 install_dir : rootbindir)
1925 public_programs += [exe]
1926
1927 executable('systemd-volatile-root',
1928 'src/volatile-root/volatile-root.c',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 install_rpath : rootlibexecdir,
1932 install : true,
1933 install_dir : rootlibexecdir)
1934
1935 executable('systemd-cgroups-agent',
1936 'src/cgroups-agent/cgroups-agent.c',
1937 include_directories : includes,
1938 link_with : [libshared],
1939 install_rpath : rootlibexecdir,
1940 install : true,
1941 install_dir : rootlibexecdir)
1942
1943 exe = executable('systemd-path',
1944 'src/path/path.c',
1945 include_directories : includes,
1946 link_with : [libshared],
1947 install_rpath : rootlibexecdir,
1948 install : true)
1949 public_programs += [exe]
1950
1951 exe = executable('systemd-ask-password',
1952 'src/ask-password/ask-password.c',
1953 include_directories : includes,
1954 link_with : [libshared],
1955 install_rpath : rootlibexecdir,
1956 install : true,
1957 install_dir : rootbindir)
1958 public_programs += [exe]
1959
1960 executable('systemd-reply-password',
1961 'src/reply-password/reply-password.c',
1962 include_directories : includes,
1963 link_with : [libshared],
1964 install_rpath : rootlibexecdir,
1965 install : true,
1966 install_dir : rootlibexecdir)
1967
1968 exe = executable('systemd-tty-ask-password-agent',
1969 'src/tty-ask-password-agent/tty-ask-password-agent.c',
1970 include_directories : includes,
1971 link_with : [libshared],
1972 install_rpath : rootlibexecdir,
1973 install : true,
1974 install_dir : rootbindir)
1975 public_programs += [exe]
1976
1977 exe = executable('systemd-cgls',
1978 'src/cgls/cgls.c',
1979 include_directories : includes,
1980 link_with : [libshared],
1981 install_rpath : rootlibexecdir,
1982 install : true)
1983 public_programs += [exe]
1984
1985 exe = executable('systemd-cgtop',
1986 'src/cgtop/cgtop.c',
1987 include_directories : includes,
1988 link_with : [libshared],
1989 install_rpath : rootlibexecdir,
1990 install : true)
1991 public_programs += [exe]
1992
1993 executable('systemd-initctl',
1994 'src/initctl/initctl.c',
1995 include_directories : includes,
1996 link_with : [libshared],
1997 install_rpath : rootlibexecdir,
1998 install : true,
1999 install_dir : rootlibexecdir)
2000
2001 exe = executable('systemd-mount',
2002 'src/mount/mount-tool.c',
2003 include_directories : includes,
2004 link_with : [libshared],
2005 install_rpath : rootlibexecdir,
2006 install : true)
2007 public_programs += [exe]
2008
2009 meson.add_install_script(meson_make_symlink,
2010 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2011
2012 exe = executable('systemd-run',
2013 'src/run/run.c',
2014 include_directories : includes,
2015 link_with : [libshared],
2016 install_rpath : rootlibexecdir,
2017 install : true)
2018 public_programs += [exe]
2019
2020 exe = executable('systemd-stdio-bridge',
2021 'src/stdio-bridge/stdio-bridge.c',
2022 include_directories : includes,
2023 link_with : [libshared],
2024 install_rpath : rootlibexecdir,
2025 install : true)
2026 public_programs += [exe]
2027
2028 exe = executable('busctl',
2029 'src/busctl/busctl.c',
2030 'src/busctl/busctl-introspect.c',
2031 'src/busctl/busctl-introspect.h',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 install_rpath : rootlibexecdir,
2035 install : true)
2036 public_programs += [exe]
2037
2038 if conf.get('ENABLE_SYSUSERS', false)
2039 exe = executable('systemd-sysusers',
2040 'src/sysusers/sysusers.c',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 install_rpath : rootlibexecdir,
2044 install : true,
2045 install_dir : rootbindir)
2046 public_programs += [exe]
2047 endif
2048
2049 if conf.get('ENABLE_TMPFILES', false)
2050 exe = executable('systemd-tmpfiles',
2051 'src/tmpfiles/tmpfiles.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 dependencies : [libacl],
2055 install_rpath : rootlibexecdir,
2056 install : true,
2057 install_dir : rootbindir)
2058 public_programs += [exe]
2059 endif
2060
2061 if conf.get('ENABLE_HWDB', false)
2062 exe = executable('systemd-hwdb',
2063 'src/hwdb/hwdb.c',
2064 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2065 include_directories : includes,
2066 link_with : [libudev_internal],
2067 install_rpath : udev_rpath,
2068 install : true,
2069 install_dir : rootbindir)
2070 public_programs += [exe]
2071 endif
2072
2073 if conf.get('ENABLE_QUOTACHECK', false)
2074 executable('systemd-quotacheck',
2075 'src/quotacheck/quotacheck.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 install_rpath : rootlibexecdir,
2079 install : true,
2080 install_dir : rootlibexecdir)
2081 endif
2082
2083 exe = executable('systemd-socket-proxyd',
2084 'src/socket-proxy/socket-proxyd.c',
2085 include_directories : includes,
2086 link_with : [libshared],
2087 dependencies : [threads],
2088 install_rpath : rootlibexecdir,
2089 install : true,
2090 install_dir : rootlibexecdir)
2091 public_programs += [exe]
2092
2093 exe = executable('systemd-udevd',
2094 systemd_udevd_sources,
2095 include_directories : includes,
2096 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2097 link_with : [libudev_core,
2098 libsystemd_network,
2099 libudev_internal],
2100 dependencies : [threads,
2101 libkmod,
2102 libidn,
2103 libacl,
2104 libblkid],
2105 install_rpath : udev_rpath,
2106 install : true,
2107 install_dir : rootlibexecdir)
2108 public_programs += [exe]
2109
2110 exe = executable('udevadm',
2111 udevadm_sources,
2112 include_directories : includes,
2113 link_with : [libudev_core,
2114 libsystemd_network,
2115 libudev_internal],
2116 dependencies : [threads,
2117 libkmod,
2118 libidn,
2119 libacl,
2120 libblkid],
2121 install_rpath : udev_rpath,
2122 install : true,
2123 install_dir : rootbindir)
2124 public_programs += [exe]
2125
2126 executable('systemd-shutdown',
2127 systemd_shutdown_sources,
2128 include_directories : includes,
2129 link_with : [libshared],
2130 install_rpath : rootlibexecdir,
2131 install : true,
2132 install_dir : rootlibexecdir)
2133
2134 executable('systemd-update-done',
2135 'src/update-done/update-done.c',
2136 include_directories : includes,
2137 link_with : [libshared],
2138 install_rpath : rootlibexecdir,
2139 install : true,
2140 install_dir : rootlibexecdir)
2141
2142 executable('systemd-update-utmp',
2143 'src/update-utmp/update-utmp.c',
2144 include_directories : includes,
2145 link_with : [libshared],
2146 dependencies : [libaudit],
2147 install_rpath : rootlibexecdir,
2148 install : true,
2149 install_dir : rootlibexecdir)
2150
2151 if conf.get('HAVE_KMOD', false)
2152 executable('systemd-modules-load',
2153 'src/modules-load/modules-load.c',
2154 include_directories : includes,
2155 link_with : [libshared],
2156 dependencies : [libkmod],
2157 install_rpath : rootlibexecdir,
2158 install : true,
2159 install_dir : rootlibexecdir)
2160
2161 meson.add_install_script('sh', '-c',
2162 mkdir_p.format(modulesloaddir))
2163 meson.add_install_script('sh', '-c',
2164 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2165 endif
2166
2167 exe = executable('systemd-nspawn',
2168 systemd_nspawn_sources,
2169 'src/core/mount-setup.c', # FIXME: use a variable?
2170 'src/core/mount-setup.h',
2171 'src/core/loopback-setup.c',
2172 'src/core/loopback-setup.h',
2173 include_directories : [includes, include_directories('src/nspawn')],
2174 link_with : [libshared],
2175 dependencies : [libacl,
2176 libblkid,
2177 libseccomp,
2178 libselinux],
2179 install_rpath : rootlibexecdir,
2180 install : true)
2181 public_programs += [exe]
2182
2183 if conf.get('ENABLE_NETWORKD', false)
2184 executable('systemd-networkd',
2185 systemd_networkd_sources,
2186 include_directories : includes,
2187 link_with : [libnetworkd_core,
2188 libsystemd_network,
2189 libudev_internal,
2190 libshared],
2191 dependencies : [threads],
2192 install_rpath : rootlibexecdir,
2193 install : true,
2194 install_dir : rootlibexecdir)
2195
2196 executable('systemd-networkd-wait-online',
2197 systemd_networkd_wait_online_sources,
2198 include_directories : includes,
2199 link_with : [libnetworkd_core,
2200 libshared],
2201 install_rpath : rootlibexecdir,
2202 install : true,
2203 install_dir : rootlibexecdir)
2204 endif
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
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.source_root()),
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.source_root())] + all_files)
2351 custom_target(
2352 'ctags',
2353 output : 'ctags',
2354 command : ['env', 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + 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.source_root()),
2368 'rev-parse', 'HEAD']).stdout().strip()
2369 git_head_short = run_command(
2370 git,
2371 ['--git-dir=@0@/.git'.format(meson.source_root()),
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.source_root(),
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))