]> git.proxmox.com Git - mirror_lxcfs.git/blame - meson.build
Merge pull request #474 from brauner/2021-09-01.meson
[mirror_lxcfs.git] / meson.build
CommitLineData
1fbf5591
CB
1# SPDX-License-Identifier: LGPL-2.1-or-later
2
3project('lxcfs', 'c',
4 version : '4.0.0',
5 license : 'LGPLv2+',
6 default_options: [
7 'c_std=gnu11',
8 'warning_level=2',
9 ],
10 meson_version : '>= 0.45',
11 )
12
13conf = configuration_data()
14conf.set_quoted('PROJECT_URL', 'https://linuxcontainers.org/lxcfs/introduction/')
15conf.set('PROJECT_VERSION', meson.project_version(),
16 description : 'Numerical project version (used where a simple number is expected)')
17project_source_root = meson.current_source_dir()
18project_build_root = meson.current_build_dir()
19
20# join_paths ignores the preceding arguments if an absolute component is
21# encountered, so this should canonicalize various paths when they are
22# absolute or relative.
23prefixdir = get_option('prefix')
24if not prefixdir.startswith('/')
25 error('Prefix is not absolute: "@0@"'.format(prefixdir))
26endif
27bindir = join_paths(prefixdir, get_option('bindir'))
28libdir = join_paths(prefixdir, get_option('libdir'))
29lxcfsdir = join_paths(libdir, 'lxcfs')
30sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
31runtimepath = join_paths(prefixdir, get_option('runtime-path'))
32localstatedir = join_paths('/', get_option('localstatedir'))
33
34conf.set_quoted('LXCFS_BUILD_ROOT', project_build_root)
35conf.set_quoted('LXCFS_SOURCE_ROOT', project_source_root)
36conf.set_quoted('BINDIR', bindir)
37conf.set_quoted('LIBDIR', libdir)
38conf.set_quoted('LOCALSTATEDIR', localstatedir)
39conf.set_quoted('LXCFSSHAREDIR', join_paths(localstatedir, 'lxcfs'))
40conf.set_quoted('LXCCONFDIR', join_paths(localstatedir, '/lxc/config/common.conf.d'))
41conf.set_quoted('RUNTIME_PATH', runtimepath)
42conf.set_quoted('SYSCONFDIR', sysconfdir)
43
44init_script = get_option('init-script')
45
46cc = meson.get_compiler('c')
47meson_build_sh = find_program('tools/meson-build.sh')
48
49want_tests = get_option('tests')
50
51possible_cc_flags = [
52 '-fPIE',
53 '-Wvla',
54 '-std=gnu11',
55 '-fdiagnostics-color',
56 '-Wimplicit-fallthrough=5',
57 '-Wcast-align',
58 '-Wstrict-prototypes',
59 '-fno-strict-aliasing',
60 '-fstack-clash-protection',
61 '-fstack-protector-strong',
62 '--param=ssp-buffer-size=4',
63 '--mcet -fcf-protection',
64 '-Werror=implicit-function-declaration',
65 '-Wlogical-op',
66 '-Wmissing-include-dirs',
67 '-Wold-style-definition',
68 '-Winit-self',
69 '-Wunused-but-set-variable',
70 '-Wno-unused-parameter',
71 '-Wfloat-equal',
72 '-Wsuggest-attribute=noreturn',
73 '-Werror=return-type',
74 '-Werror=incompatible-pointer-types',
75 '-Wformat=2',
76 '-Wshadow',
77 '-Wendif-labels',
78 '-Werror=overflow',
79 '-fdiagnostics-show-option',
80 '-Werror=shift-count-overflow',
81 '-Werror=shift-overflow=2',
82 '-Wdate-time',
83 '-Wnested-externs',
84 '-fasynchronous-unwind-tables',
85 '-fexceptions',
86 '-Warray-bounds',
87 '-Wrestrict',
88 '-Wreturn-local-addr',
89 '-fsanitize=cfi',
90 '-Wstringop-overflow',
91]
92
93possible_link_flags = [
94 '-Wl,--as-needed',
95 '-Wl,--gc-sections',
96 '-Wl,-z,relro',
97 '-Wl,-z,now',
98 '-pie',
99 '-Wl,-fuse-ld=gold',
100]
101
102if meson.version().version_compare('>=0.46')
103 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
104else
105 add_project_link_arguments(possible_link_flags, language : 'c')
106endif
107
108add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
109
110foreach ident : [
111 ['strlcpy', '''#include <string.h>'''],
112 ['strlcat', '''#include <string.h>'''],
113 ['pidfd_send_signal', '''#include <stdlib.h>
114 #include <unistd.h>
115 #include <signal.h>
116 #include <sys/wait.h>'''],
117 ['pidfd_open', '''#include <stdlib.h>
118 #include <unistd.h>
119 #include <signal.h>
120 #include <sys/wait.h>'''],
121]
122
123 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
124 conf.set10('HAVE_' + ident[0].to_upper(), have)
125endforeach
126
127conf.set('_FILE_OFFSET_BITS', 64)
128
129libfuse = cc.find_library('fuse3', required : false)
130if libfuse.found()
131 conf.set10('HAVE_FUSE3', libfuse.found())
132 conf.set('FUSE_USE_VERSION', 30)
133else
134 libfuse = cc.find_library('fuse')
135 conf.set10('HAVE_FUSE', libfuse.found())
136 conf.set('FUSE_USE_VERSION', 26)
137endif
138
139libdl = cc.find_library('dl')
140threads = dependency('threads')
141
142config_h = configure_file(
143 output : 'config.h',
144 configuration : conf)
145config_include = include_directories('.')
146
147add_project_arguments('-include', 'config.h', language : 'c')
148
149subdir('tests')
150
151public_programs = []
152
153lxcfs_sources = files('src/lxcfs.c')
154
155public_programs += executable(
156 'lxcfs',
157 lxcfs_sources,
158 dependencies : [threads,
159 libdl,
160 libfuse],
161 install : true,
162 install_dir : bindir)
163
164liblxcfs_sources = files(
165 'src/api_extensions.h',
166 'src/bindings.c',
167 'src/bindings.h',
168 'src/cgroups/cgfsng.c',
169 'src/cgroups/cgroup.c',
170 'src/cgroups/cgroup.h',
171 'src/cgroups/cgroup2_devices.c',
172 'src/cgroups/cgroup2_devices.h',
173 'src/cgroups/cgroup_utils.c',
174 'src/cgroups/cgroup_utils.h',
175 'src/cgroup_fuse.c',
176 'src/cgroup_fuse.h',
177 'src/cpuset_parse.c',
178 'src/cpuset_parse.h',
179 'src/lxcfs.c',
180 'src/lxcfs_fuse_compat.h',
181 'src/macro.h',
182 'src/memory_utils.h',
183 'src/proc_cpuview.c',
184 'src/proc_cpuview.h',
185 'src/proc_fuse.c',
186 'src/proc_fuse.h',
187 'src/proc_loadavg.c',
188 'src/proc_loadavg.h',
189 'src/syscall_numbers.h',
190 'src/sysfs_fuse.c',
191 'src/sysfs_fuse.h',
192 'src/utils.c',
193 'src/utils.h')
194
195liblxcfs = shared_library(
196 'lxcfs',
197 liblxcfs_sources,
198 link_args : ['-shared'],
199 dependencies : [threads,
200 libdl,
201 libfuse],
202 install : true,
203 install_dir : lxcfsdir)
204
205if want_tests == true
206 liblxcfs_test = shared_library(
207 'lxcfstest',
208 liblxcfs_sources,
209 link_args : ['-shared'],
210 dependencies : [threads,
211 libdl,
212 libfuse],
213 install : false,
214 install_dir : lxcfsdir,
215 c_args : '-DRELOADTEST -DDEBUG')
216endif
217
218if init_script == 'systemd'
219 systemd_service_data = configuration_data()
220 systemd_service_data.set_quoted('LXCFSTARGETDIR', join_paths(localstatedir, 'lib/lxcfs'))
221 systemd_service = configure_file(
222 configuration : systemd_service_data,
223 input : 'config/init/systemd/lxcfs.service.in',
224 output : 'lxcfs.service')
225 install_data(join_paths(project_build_root, 'lxcfs.service'), install_dir : '/lib/systemd/system')
226elif init_script == 'upstart'
227 install_data('config/init/upstart/lxcfs.conf', install_dir : join_paths(sysconfdir, 'init'))
228elif init_script == 'openrc'
229 install_data('config/init/sysvinit/lxcfs', install_dir : join_paths(sysconfdir, 'rc.d/init.d/lxcfs'))
230elif init_script == 'sysvinit'
231 install_data('config/init/sysvinit/lxcfs', install_dir : join_paths(sysconfdir, 'rc.d/init.d/lxcfs'))
232endif
233
234status = [
235 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
236
237 'prefix directory: @0@'.format(prefixdir),
238 'sysconf directory: @0@'.format(sysconfdir),
239 'bin directory: @0@'.format(bindir),
240 'lxcfs directory: @0@'.format(lxcfsdir),
241 'runtime directory: @0@'.format(runtimepath),
242 'local state directory: @0@'.format(localstatedir),
243 'lxcfs build root directory: @0@'.format(project_build_root),
244 'lxcfs source root directory: @0@'.format(project_source_root),
245 'init system: @0@'.format(init_script),
246 'tests: @0@'.format(want_tests)]
247
248message('\n '.join(status))