diff options
Diffstat (limited to 'meson.build')
-rw-r--r-- | meson.build | 382 |
1 files changed, 382 insertions, 0 deletions
diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..961ee59c --- /dev/null +++ b/meson.build | |||
@@ -0,0 +1,382 @@ | |||
1 | # Copyright © 2017-2018 Intel Corporation | ||
2 | |||
3 | # Permission is hereby granted, free of charge, to any person obtaining a copy | ||
4 | # of this software and associated documentation files (the "Software"), to deal | ||
5 | # in the Software without restriction, including without limitation the rights | ||
6 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
7 | # copies of the Software, and to permit persons to whom the Software is | ||
8 | # furnished to do so, subject to the following conditions: | ||
9 | |||
10 | # The above copyright notice and this permission notice shall be included in | ||
11 | # all copies or substantial portions of the Software. | ||
12 | |||
13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
14 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
15 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
16 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
17 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
18 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
19 | # SOFTWARE. | ||
20 | |||
21 | project( | ||
22 | 'libdrm', | ||
23 | ['c'], | ||
24 | version : '2.4.91', | ||
25 | license : 'MIT', | ||
26 | meson_version : '>= 0.43', | ||
27 | default_options : ['buildtype=debugoptimized', 'c_std=gnu99'], | ||
28 | ) | ||
29 | |||
30 | pkg = import('pkgconfig') | ||
31 | |||
32 | config = configuration_data() | ||
33 | |||
34 | config.set10('UDEV', get_option('udev')) | ||
35 | with_freedreno_kgsl = get_option('freedreno-kgsl') | ||
36 | with_install_tests = get_option('install-test-programs') | ||
37 | |||
38 | if ['freebsd', 'dragonfly', 'netbsd'].contains(host_machine.system()) | ||
39 | dep_pthread_stubs = dependency('pthread-stubs', version : '>= 0.4') | ||
40 | else | ||
41 | dep_pthread_stubs = [] | ||
42 | endif | ||
43 | dep_threads = dependency('threads') | ||
44 | |||
45 | cc = meson.get_compiler('c') | ||
46 | |||
47 | # Check for atomics | ||
48 | intel_atomics = false | ||
49 | lib_atomics = false | ||
50 | |||
51 | dep_atomic_ops = dependency('atomic_ops', required : false) | ||
52 | if cc.compiles(''' | ||
53 | int atomic_add(int *i) { return __sync_add_and_fetch (i, 1); } | ||
54 | int atomic_cmpxchg(int *i, int j, int k) { return __sync_val_compare_and_swap (i, j, k); } | ||
55 | ''', | ||
56 | name : 'Intel Atomics') | ||
57 | intel_atomics = true | ||
58 | with_atomics = true | ||
59 | dep_atomic_ops = [] | ||
60 | elif dep_atomic_ops.found() | ||
61 | lib_atomics = true | ||
62 | with_atomics = true | ||
63 | elif cc.has_function('atomic_cas_uint') | ||
64 | with_atomics = true | ||
65 | else | ||
66 | with_atomics = false | ||
67 | endif | ||
68 | |||
69 | config.set10('HAVE_LIBDRM_ATOMIC_PRIMITIVES', intel_atomics) | ||
70 | config.set10('HAVE_LIB_ATOMIC_OPS', lib_atomics) | ||
71 | |||
72 | with_intel = false | ||
73 | _intel = get_option('intel') | ||
74 | if _intel != 'false' | ||
75 | if _intel == 'true' and not with_atomics | ||
76 | error('libdrm_intel requires atomics.') | ||
77 | else | ||
78 | with_intel = _intel == 'true' or host_machine.cpu_family().startswith('x86') | ||
79 | endif | ||
80 | endif | ||
81 | |||
82 | with_radeon = false | ||
83 | _radeon = get_option('radeon') | ||
84 | if _radeon != 'false' | ||
85 | if _radeon == 'true' and not with_atomics | ||
86 | error('libdrm_radeon requires atomics.') | ||
87 | endif | ||
88 | with_radeon = true | ||
89 | endif | ||
90 | |||
91 | with_amdgpu = false | ||
92 | _amdgpu = get_option('amdgpu') | ||
93 | if _amdgpu != 'false' | ||
94 | if _amdgpu == 'true' and not with_atomics | ||
95 | error('libdrm_amdgpu requires atomics.') | ||
96 | endif | ||
97 | with_amdgpu = true | ||
98 | endif | ||
99 | |||
100 | with_nouveau = false | ||
101 | _nouveau = get_option('nouveau') | ||
102 | if _nouveau != 'false' | ||
103 | if _nouveau == 'true' and not with_atomics | ||
104 | error('libdrm_nouveau requires atomics.') | ||
105 | endif | ||
106 | with_nouveau = true | ||
107 | endif | ||
108 | |||
109 | with_vmwgfx = false | ||
110 | _vmwgfx = get_option('vmwgfx') | ||
111 | if _vmwgfx != 'false' | ||
112 | with_vmwgfx = true | ||
113 | endif | ||
114 | |||
115 | with_omap = false | ||
116 | _omap = get_option('omap') | ||
117 | if _omap == 'true' | ||
118 | if not with_atomics | ||
119 | error('libdrm_omap requires atomics.') | ||
120 | endif | ||
121 | with_omap = true | ||
122 | endif | ||
123 | |||
124 | with_freedreno = false | ||
125 | _freedreno = get_option('freedreno') | ||
126 | if _freedreno != 'false' | ||
127 | if _freedreno == 'true' and not with_atomics | ||
128 | error('libdrm_freedreno requires atomics.') | ||
129 | else | ||
130 | with_freedreno = _freedreno == 'true' or ['arm', 'aarch64'].contains(host_machine.cpu_family()) | ||
131 | endif | ||
132 | endif | ||
133 | |||
134 | with_tegra = false | ||
135 | _tegra = get_option('tegra') | ||
136 | if _tegra == 'true' | ||
137 | if not with_atomics | ||
138 | error('libdrm_tegra requires atomics.') | ||
139 | endif | ||
140 | with_tegra = true | ||
141 | endif | ||
142 | |||
143 | with_etnaviv = false | ||
144 | _etnaviv = get_option('etnaviv') | ||
145 | if _etnaviv == 'true' | ||
146 | if not with_atomics | ||
147 | error('libdrm_etnaviv requires atomics.') | ||
148 | endif | ||
149 | with_etnaviv = true | ||
150 | endif | ||
151 | |||
152 | with_exynos = get_option('exynos') == 'true' | ||
153 | |||
154 | with_vc4 = false | ||
155 | _vc4 = get_option('vc4') | ||
156 | if _vc4 != 'false' | ||
157 | with_vc4 = _vc4 == 'true' or ['arm', 'aarch64'].contains(host_machine.cpu_family()) | ||
158 | endif | ||
159 | |||
160 | # XXX: Aparently only freebsd and dragonfly bsd actually need this (and | ||
161 | # gnu/kfreebsd), not openbsd and netbsd | ||
162 | with_libkms = false | ||
163 | _libkms = get_option('libkms') | ||
164 | if _libkms != 'false' | ||
165 | with_libkms = _libkms == 'true' or ['linux', 'freebsd', 'dragonfly'].contains(host_machine.system()) | ||
166 | endif | ||
167 | |||
168 | # Among others FreeBSD does not have a separate dl library. | ||
169 | if not cc.has_function('dlsym') | ||
170 | dep_dl = cc.find_library('dl', required : with_nouveau) | ||
171 | else | ||
172 | dep_dl = [] | ||
173 | endif | ||
174 | # clock_gettime might require -rt, or it might not. find out | ||
175 | if not cc.has_function('clock_gettime', prefix : '#define _GNU_SOURCE\n#include <time.h>') | ||
176 | # XXX: untested | ||
177 | dep_rt = cc.find_library('rt') | ||
178 | else | ||
179 | dep_rt = [] | ||
180 | endif | ||
181 | dep_m = cc.find_library('m', required : false) | ||
182 | foreach header : ['sys/sysctl.h', 'sys/select.h', 'alloca.h'] | ||
183 | config.set('HAVE_' + header.underscorify().to_upper(), | ||
184 | cc.compiles('#include <@0@>'.format(header), name : '@0@ works'.format(header))) | ||
185 | endforeach | ||
186 | if cc.has_header_symbol('sys/sysmacros.h', 'major') | ||
187 | config.set10('MAJOR_IN_SYSMACROS', true) | ||
188 | elif cc.has_header_symbol('sys/mkdev.h', 'major') | ||
189 | config.set10('MAJOR_IN_MKDEV', true) | ||
190 | endif | ||
191 | config.set10('HAVE_OPEN_MEMSTREAM', cc.has_function('open_memstream')) | ||
192 | |||
193 | warn_c_args = [] | ||
194 | foreach a : ['-Wall', '-Wextra', '-Wsign-compare', '-Werror=undef', | ||
195 | '-Werror-implicit-function-declaration', '-Wpointer-arith', | ||
196 | '-Wwrite-strings', '-Wstrict-prototypes', '-Wmissing-prototypes', | ||
197 | '-Wmissing-declarations', '-Wnested-externs', '-Wpacked', | ||
198 | '-Wswitch-enum', '-Wmissing-format-attribute', | ||
199 | '-Wstrict-aliasing=2', '-Winit-self', '-Winline', '-Wshadow', | ||
200 | '-Wdeclaration-after-statement', '-Wold-style-definition'] | ||
201 | if cc.has_argument(a) | ||
202 | warn_c_args += a | ||
203 | endif | ||
204 | endforeach | ||
205 | # GCC will never error for -Wno-*, so check for -W* then add -Wno-* to the list | ||
206 | # of options | ||
207 | foreach a : ['unused-parameter', 'attributes', 'long-long', | ||
208 | 'missing-field-initializers'] | ||
209 | if cc.has_argument('-W@0@'.format(a)) | ||
210 | warn_c_args += '-Wno-@0@'.format(a) | ||
211 | endif | ||
212 | endforeach | ||
213 | |||
214 | |||
215 | dep_pciaccess = dependency('pciaccess', version : '>= 0.10', required : with_intel) | ||
216 | dep_cunit = dependency('cunit', version : '>= 2.1', required : false) | ||
217 | _cairo_tests = get_option('cairo-tests') | ||
218 | if _cairo_tests != 'false' | ||
219 | dep_cairo = dependency('cairo', required : _cairo_tests == 'true') | ||
220 | with_cairo_tests = dep_cairo.found() | ||
221 | else | ||
222 | dep_cairo = [] | ||
223 | with_cairo_tests = false | ||
224 | endif | ||
225 | _valgrind = get_option('valgrind') | ||
226 | if _valgrind != 'false' | ||
227 | dep_valgrind = dependency('valgrind', required : _valgrind == 'true') | ||
228 | with_valgrind = dep_valgrind.found() | ||
229 | else | ||
230 | dep_valgrind = [] | ||
231 | with_valgrind = false | ||
232 | endif | ||
233 | |||
234 | with_man_pages = get_option('man-pages') | ||
235 | prog_xslt = find_program('xsltproc', required : with_man_pages == 'true') | ||
236 | prog_sed = find_program('sed', required : with_man_pages == 'true') | ||
237 | manpage_style = 'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl' | ||
238 | if prog_xslt.found() | ||
239 | if run_command(prog_xslt, '--nonet', manpage_style).returncode() != 0 | ||
240 | if with_man_pages == 'true' | ||
241 | error('Manpage style sheet cannot be found') | ||
242 | endif | ||
243 | with_man_pages = 'false' | ||
244 | endif | ||
245 | endif | ||
246 | with_man_pages = with_man_pages != 'false' and prog_xslt.found() and prog_sed.found() | ||
247 | |||
248 | # Used for tets | ||
249 | prog_bash = find_program('bash') | ||
250 | |||
251 | config.set10('HAVE_VISIBILITY', | ||
252 | cc.compiles('''int foo_hidden(void) __attribute__((visibility(("hidden"))));''', | ||
253 | name : 'compiler supports __attribute__(("hidden"))')) | ||
254 | |||
255 | foreach t : [ | ||
256 | [with_exynos, 'EXYNOS'], | ||
257 | [with_freedreno_kgsl, 'FREEDRENO_KGSL'], | ||
258 | [with_intel, 'INTEL'], | ||
259 | [with_nouveau, 'NOUVEAU'], | ||
260 | [with_radeon, 'RADEON'], | ||
261 | [with_vc4, 'VC4'], | ||
262 | [with_vmwgfx, 'VMWGFX'], | ||
263 | [with_cairo_tests, 'CAIRO'], | ||
264 | [with_valgrind, 'VALGRIND'], | ||
265 | ] | ||
266 | config.set10('HAVE_@0@'.format(t[1]), t[0]) | ||
267 | endforeach | ||
268 | if with_freedreno_kgsl and not with_freedreno | ||
269 | error('cannot enable freedreno-kgsl without freedreno support') | ||
270 | endif | ||
271 | config.set10('_GNU_SOURCE', true) | ||
272 | config_file = configure_file( | ||
273 | configuration : config, | ||
274 | output : 'config.h', | ||
275 | ) | ||
276 | add_project_arguments('-include', 'config.h', language : 'c') | ||
277 | |||
278 | inc_root = include_directories('.') | ||
279 | inc_drm = include_directories('include/drm') | ||
280 | |||
281 | libdrm = shared_library( | ||
282 | 'drm', | ||
283 | [files( | ||
284 | 'xf86drm.c', 'xf86drmHash.c', 'xf86drmRandom.c', 'xf86drmSL.c', | ||
285 | 'xf86drmMode.c' | ||
286 | ), | ||
287 | config_file, | ||
288 | ], | ||
289 | c_args : warn_c_args, | ||
290 | dependencies : [dep_valgrind, dep_rt, dep_m], | ||
291 | include_directories : inc_drm, | ||
292 | version : '2.4.0', | ||
293 | install : true, | ||
294 | ) | ||
295 | |||
296 | ext_libdrm = declare_dependency( | ||
297 | link_with : libdrm, | ||
298 | include_directories : [inc_root, inc_drm], | ||
299 | ) | ||
300 | |||
301 | install_headers('libsync.h', 'xf86drm.h', 'xf86drmMode.h') | ||
302 | install_headers( | ||
303 | 'include/drm/drm.h', 'include/drm/drm_fourcc.h', 'include/drm/drm_mode.h', | ||
304 | 'include/drm/drm_sarea.h', 'include/drm/i915_drm.h', | ||
305 | 'include/drm/mach64_drm.h', 'include/drm/mga_drm.h', | ||
306 | 'include/drm/nouveau_drm.h', 'include/drm/qxl_drm.h', | ||
307 | 'include/drm/r128_drm.h', 'include/drm/radeon_drm.h', | ||
308 | 'include/drm/amdgpu_drm.h', 'include/drm/savage_drm.h', | ||
309 | 'include/drm/sis_drm.h', 'include/drm/tegra_drm.h', 'include/drm/vc4_drm.h', | ||
310 | 'include/drm/via_drm.h', 'include/drm/virtgpu_drm.h', | ||
311 | subdir : 'libdrm', | ||
312 | ) | ||
313 | if with_vmwgfx | ||
314 | install_headers('include/drm/vmwgfx_drm.h', subdir : 'libdrm') | ||
315 | endif | ||
316 | |||
317 | pkg.generate( | ||
318 | name : 'libdrm', | ||
319 | libraries : libdrm, | ||
320 | subdirs : ['.', 'libdrm'], | ||
321 | version : meson.project_version(), | ||
322 | description : 'Userspace interface to kernel DRM services', | ||
323 | ) | ||
324 | |||
325 | env_test = environment() | ||
326 | env_test.set('NM', find_program('nm').path()) | ||
327 | |||
328 | if with_libkms | ||
329 | subdir('libkms') | ||
330 | endif | ||
331 | if with_intel | ||
332 | subdir('intel') | ||
333 | endif | ||
334 | if with_nouveau | ||
335 | subdir('nouveau') | ||
336 | endif | ||
337 | if with_radeon | ||
338 | subdir('radeon') | ||
339 | endif | ||
340 | if with_amdgpu | ||
341 | subdir('amdgpu') | ||
342 | endif | ||
343 | if with_omap | ||
344 | subdir('omap') | ||
345 | endif | ||
346 | if with_exynos | ||
347 | subdir('exynos') | ||
348 | endif | ||
349 | if with_freedreno | ||
350 | subdir('freedreno') | ||
351 | endif | ||
352 | if with_tegra | ||
353 | subdir('tegra') | ||
354 | endif | ||
355 | if with_vc4 | ||
356 | subdir('vc4') | ||
357 | endif | ||
358 | if with_etnaviv | ||
359 | subdir('etnaviv') | ||
360 | endif | ||
361 | if with_man_pages | ||
362 | subdir('man') | ||
363 | endif | ||
364 | subdir('data') | ||
365 | subdir('tests') | ||
366 | |||
367 | message('') | ||
368 | message('@0@ will be compiled with:'.format(meson.project_name())) | ||
369 | message('') | ||
370 | message(' libkms @0@'.format(with_libkms)) | ||
371 | message(' Intel API @0@'.format(with_intel)) | ||
372 | message(' vmwgfx API @0@'.format(with_vmwgfx)) | ||
373 | message(' Radeon API @0@'.format(with_radeon)) | ||
374 | message(' AMDGPU API @0@'.format(with_amdgpu)) | ||
375 | message(' Nouveau API @0@'.format(with_nouveau)) | ||
376 | message(' OMAP API @0@'.format(with_omap)) | ||
377 | message(' EXYNOS API @0@'.format(with_exynos)) | ||
378 | message(' Freedreno API @0@ (kgsl: @1@)'.format(with_freedreno, with_freedreno_kgsl)) | ||
379 | message(' Tegra API @0@'.format(with_tegra)) | ||
380 | message(' VC4 API @0@'.format(with_vc4)) | ||
381 | message(' Etnaviv API @0@'.format(with_etnaviv)) | ||
382 | message('') | ||