turnip: Add driver skeleton (v2)
[mesa.git] / meson.build
1 # Copyright © 2017-2019 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 'mesa',
23 ['c', 'cpp'],
24 version : run_command(
25 [find_program('python', 'python2', 'python3'), 'bin/meson_get_version.py']
26 ).stdout(),
27 license : 'MIT',
28 meson_version : '>= 0.45',
29 default_options : ['buildtype=debugoptimized', 'b_ndebug=if-release', 'c_std=c99', 'cpp_std=c++11']
30 )
31
32 cc = meson.get_compiler('c')
33 cpp = meson.get_compiler('cpp')
34
35 null_dep = dependency('', required : false)
36
37 # Arguments for the preprocessor, put these in a separate array from the C and
38 # C++ (cpp in meson terminology) arguments since they need to be added to the
39 # default arguments for both C and C++.
40 pre_args = [
41 '-D__STDC_CONSTANT_MACROS',
42 '-D__STDC_FORMAT_MACROS',
43 '-D__STDC_LIMIT_MACROS',
44 '-DPACKAGE_VERSION="@0@"'.format(meson.project_version()),
45 '-DPACKAGE_BUGREPORT="https://bugs.freedesktop.org/enter_bug.cgi?product=Mesa"',
46 ]
47
48 with_vulkan_icd_dir = get_option('vulkan-icd-dir')
49 with_tests = get_option('build-tests')
50 with_valgrind = get_option('valgrind')
51 with_libunwind = get_option('libunwind')
52 with_asm = get_option('asm')
53 with_glx_read_only_text = get_option('glx-read-only-text')
54 with_glx_direct = get_option('glx-direct')
55 with_osmesa = get_option('osmesa')
56 with_swr_arches = get_option('swr-arches')
57 with_tools = get_option('tools')
58 if with_tools.contains('all')
59 with_tools = ['etnaviv', 'freedreno', 'glsl', 'intel', 'nir', 'nouveau', 'xvmc']
60 endif
61
62 dri_drivers_path = get_option('dri-drivers-path')
63 if dri_drivers_path == ''
64 dri_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'dri')
65 endif
66 dri_search_path = get_option('dri-search-path')
67 if dri_search_path == ''
68 dri_search_path = dri_drivers_path
69 endif
70
71 with_gles1 = get_option('gles1')
72 with_gles2 = get_option('gles2')
73 with_opengl = get_option('opengl')
74 with_any_opengl = with_opengl or with_gles1 or with_gles2
75 # Only build shared_glapi if at least one OpenGL API is enabled
76 with_shared_glapi = get_option('shared-glapi') and with_any_opengl
77
78
79 # shared-glapi is required if at least two OpenGL APIs are being built
80 if not with_shared_glapi
81 if ((with_gles1 and with_gles2) or (with_gles1 and with_opengl)
82 or (with_gles2 and with_opengl))
83 error('shared-glapi required for building two or more of OpenGL, OpenGL ES 1.x, OpenGL ES 2.x')
84 endif
85 endif
86
87 # We require OpenGL for OpenGL ES
88 if (with_gles1 or with_gles2) and not with_opengl
89 error('building OpenGL ES without OpenGL is not supported.')
90 endif
91
92 system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'dragonfly', 'linux'].contains(host_machine.system())
93
94 _drivers = get_option('dri-drivers')
95 if _drivers.contains('auto')
96 if system_has_kms_drm
97 # TODO: PPC, Sparc
98 if ['x86', 'x86_64'].contains(host_machine.cpu_family())
99 _drivers = ['i915', 'i965', 'r100', 'r200', 'nouveau']
100 elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
101 _drivers = []
102 else
103 error('Unknown architecture @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format(
104 host_machine.cpu_family()))
105 endif
106 elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
107 # only swrast would make sense here, but gallium swrast is a much better default
108 _drivers = []
109 else
110 error('Unknown OS @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format(
111 host_machine.system()))
112 endif
113 endif
114
115 with_dri_i915 = _drivers.contains('i915')
116 with_dri_i965 = _drivers.contains('i965')
117 with_dri_r100 = _drivers.contains('r100')
118 with_dri_r200 = _drivers.contains('r200')
119 with_dri_nouveau = _drivers.contains('nouveau')
120 with_dri_swrast = _drivers.contains('swrast')
121
122 with_dri = _drivers.length() != 0 and _drivers != ['']
123
124 _drivers = get_option('gallium-drivers')
125 if _drivers.contains('auto')
126 if system_has_kms_drm
127 # TODO: PPC, Sparc
128 if ['x86', 'x86_64'].contains(host_machine.cpu_family())
129 _drivers = [
130 'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'svga', 'swrast'
131 ]
132 elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
133 _drivers = [
134 'kmsro', 'v3d', 'vc4', 'freedreno', 'etnaviv', 'nouveau',
135 'tegra', 'virgl', 'swrast'
136 ]
137 else
138 error('Unknown architecture @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
139 host_machine.cpu_family()))
140 endif
141 elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
142 _drivers = ['swrast']
143 else
144 error('Unknown OS @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
145 host_machine.system()))
146 endif
147 endif
148 with_gallium_kmsro = _drivers.contains('kmsro')
149 with_gallium_radeonsi = _drivers.contains('radeonsi')
150 with_gallium_r300 = _drivers.contains('r300')
151 with_gallium_r600 = _drivers.contains('r600')
152 with_gallium_nouveau = _drivers.contains('nouveau')
153 with_gallium_freedreno = _drivers.contains('freedreno')
154 with_gallium_softpipe = _drivers.contains('swrast')
155 with_gallium_vc4 = _drivers.contains('vc4')
156 with_gallium_v3d = _drivers.contains('v3d')
157 with_gallium_panfrost = _drivers.contains('panfrost')
158 with_gallium_etnaviv = _drivers.contains('etnaviv')
159 with_gallium_tegra = _drivers.contains('tegra')
160 with_gallium_iris = _drivers.contains('iris')
161 with_gallium_i915 = _drivers.contains('i915')
162 with_gallium_svga = _drivers.contains('svga')
163 with_gallium_virgl = _drivers.contains('virgl')
164 with_gallium_swr = _drivers.contains('swr')
165
166 if cc.get_id() == 'intel'
167 if meson.version().version_compare('< 0.49.0')
168 error('Meson does not have sufficient support of ICC before 0.49.0 to compile mesa')
169 elif with_gallium_swr and meson.version().version_compare('== 0.49.0')
170 warning('Meson as of 0.49.0 is sufficient for compiling mesa with ICC, but there are some caveats with SWR. 0.49.1 should resolve all of these')
171 endif
172 endif
173
174 with_gallium = _drivers.length() != 0 and _drivers != ['']
175
176 if with_gallium and system_has_kms_drm
177 _glx = get_option('glx')
178 _egl = get_option('egl')
179 if _glx == 'dri' or _egl == 'true' or (_glx == 'disabled' and _egl != 'false')
180 with_dri = true
181 endif
182 endif
183
184 _vulkan_drivers = get_option('vulkan-drivers')
185 if _vulkan_drivers.contains('auto')
186 if system_has_kms_drm
187 if host_machine.cpu_family().startswith('x86')
188 _vulkan_drivers = ['amd', 'intel']
189 elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
190 _vulkan_drivers = []
191 else
192 error('Unknown architecture @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
193 host_machine.cpu_family()))
194 endif
195 elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
196 # No vulkan driver supports windows or macOS currently
197 _vulkan_drivers = []
198 else
199 error('Unknown OS @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
200 host_machine.system()))
201 endif
202 endif
203
204 with_intel_vk = _vulkan_drivers.contains('intel')
205 with_amd_vk = _vulkan_drivers.contains('amd')
206 with_freedreno_vk = _vulkan_drivers.contains('freedreno')
207 with_any_vk = _vulkan_drivers.length() != 0 and _vulkan_drivers != ['']
208
209 if with_dri_swrast and (with_gallium_softpipe or with_gallium_swr)
210 error('Only one swrast provider can be built')
211 endif
212 if with_dri_i915 and with_gallium_i915
213 error('Only one i915 provider can be built')
214 endif
215 if with_gallium_kmsro and not (with_gallium_vc4 or with_gallium_etnaviv or with_gallium_freedreno or with_gallium_panfrost)
216 error('kmsro driver requires one or more renderonly drivers (vc4, etnaviv, freedreno, panfrost)')
217 endif
218 if with_gallium_tegra and not with_gallium_nouveau
219 error('tegra driver requires nouveau driver')
220 endif
221
222 if host_machine.system() == 'darwin'
223 with_dri_platform = 'apple'
224 elif ['windows', 'cygwin'].contains(host_machine.system())
225 with_dri_platform = 'windows'
226 elif system_has_kms_drm
227 with_dri_platform = 'drm'
228 else
229 # FIXME: haiku doesn't use dri, and xlib doesn't use dri, probably should
230 # assert here that one of those cases has been met.
231 # FIXME: illumos ends up here as well
232 with_dri_platform = 'none'
233 endif
234
235 _platforms = get_option('platforms')
236 if _platforms.contains('auto')
237 if system_has_kms_drm
238 _platforms = ['x11', 'wayland', 'drm', 'surfaceless']
239 elif ['darwin', 'windows', 'cygwin'].contains(host_machine.system())
240 _platforms = ['x11', 'surfaceless']
241 elif ['haiku'].contains(host_machine.system())
242 _platforms = ['haiku']
243 else
244 error('Unknown OS @0@. Please pass -Dplatforms to set platforms. Patches gladly accepted to fix this.'.format(
245 host_machine.system()))
246 endif
247 endif
248
249 with_platform_android = _platforms.contains('android')
250 with_platform_x11 = _platforms.contains('x11')
251 with_platform_wayland = _platforms.contains('wayland')
252 with_platform_drm = _platforms.contains('drm')
253 with_platform_haiku = _platforms.contains('haiku')
254 with_platform_surfaceless = _platforms.contains('surfaceless')
255
256 with_platforms = false
257 if _platforms.length() != 0 and _platforms != ['']
258 with_platforms = true
259 egl_native_platform = _platforms[0]
260 endif
261
262 _xlib_lease = get_option('xlib-lease')
263 if _xlib_lease == 'auto'
264 with_xlib_lease = with_platform_x11 and with_platform_drm
265 else
266 with_xlib_lease = _xlib_lease == 'true'
267 endif
268
269 with_glx = get_option('glx')
270 if with_glx == 'auto'
271 if with_dri
272 with_glx = 'dri'
273 elif with_platform_haiku
274 with_glx = 'disabled'
275 elif with_gallium
276 # Even when building just gallium drivers the user probably wants dri
277 with_glx = 'dri'
278 elif with_platform_x11 and with_any_opengl and not with_any_vk
279 # The automatic behavior should not be to turn on xlib based glx when
280 # building only vulkan drivers
281 with_glx = 'xlib'
282 else
283 with_glx = 'disabled'
284 endif
285 endif
286 if with_glx == 'dri'
287 if with_gallium
288 with_dri = true
289 endif
290 endif
291
292 if not (with_dri or with_gallium or with_glx == 'xlib' or with_glx == 'gallium-xlib')
293 with_gles1 = false
294 with_gles2 = false
295 with_opengl = false
296 with_any_opengl = false
297 with_shared_glapi = false
298 endif
299
300 _gbm = get_option('gbm')
301 if _gbm == 'auto'
302 with_gbm = system_has_kms_drm and with_dri
303 else
304 with_gbm = _gbm == 'true'
305 endif
306 if with_gbm and not system_has_kms_drm
307 error('GBM only supports DRM/KMS platforms')
308 endif
309
310 _egl = get_option('egl')
311 if _egl == 'auto'
312 with_egl = (
313 not ['darwin', 'windows'].contains(host_machine.system()) and
314 with_dri and with_shared_glapi and with_platforms
315 )
316 elif _egl == 'true'
317 if not with_dri
318 error('EGL requires dri')
319 elif not with_shared_glapi
320 error('EGL requires shared-glapi')
321 elif not with_platforms
322 error('No platforms specified, consider -Dplatforms=drm,x11,surfaceless at least')
323 elif not ['disabled', 'dri'].contains(with_glx)
324 error('EGL requires dri, but a GLX is being built without dri')
325 elif ['darwin', 'windows'].contains(host_machine.system())
326 error('EGL is not available on Windows or MacOS')
327 endif
328 with_egl = true
329 else
330 with_egl = false
331 endif
332
333 if with_egl and not (with_platform_drm or with_platform_surfaceless)
334 if with_gallium_radeonsi
335 error('RadeonSI requires drm or surfaceless platform when using EGL')
336 endif
337 if with_gallium_virgl
338 error('Virgl requires drm or surfaceless platform when using EGL')
339 endif
340 endif
341
342 pre_args += '-DGLX_USE_TLS'
343 if with_glx != 'disabled'
344 if not (with_platform_x11 and with_any_opengl)
345 error('Cannot build GLX support without X11 platform support and at least one OpenGL API')
346 elif with_glx == 'gallium-xlib'
347 if not with_gallium
348 error('Gallium-xlib based GLX requires at least one gallium driver')
349 elif not with_gallium_softpipe
350 error('Gallium-xlib based GLX requires softpipe or llvmpipe.')
351 elif with_dri
352 error('gallium-xlib conflicts with any dri driver')
353 endif
354 elif with_glx == 'xlib'
355 if with_dri
356 error('xlib conflicts with any dri driver')
357 endif
358 elif with_glx == 'dri'
359 if not with_dri
360 error('dri based GLX requires at least one DRI driver')
361 elif not with_shared_glapi
362 error('dri based GLX requires shared-glapi')
363 endif
364 endif
365 endif
366
367 with_glvnd = get_option('glvnd')
368 if with_glvnd
369 if with_glx == 'xlib' or with_glx == 'gallium-xlib'
370 error('Cannot build glvnd support for GLX that is not DRI based.')
371 elif with_glx == 'disabled' and not with_egl
372 error('glvnd requires DRI based GLX and/or EGL')
373 endif
374 endif
375
376 if with_vulkan_icd_dir == ''
377 with_vulkan_icd_dir = join_paths(get_option('datadir'), 'vulkan/icd.d')
378 endif
379
380 with_dri2 = (with_dri or with_any_vk) and (with_dri_platform == 'drm' or
381 host_machine.system() == 'gnu')
382 _dri3 = get_option('dri3')
383 if _dri3 == 'auto'
384 with_dri3 = system_has_kms_drm and with_dri2
385 else
386 with_dri3 = _dri3 == 'true'
387 endif
388
389 if with_any_vk and (with_platform_x11 and not with_dri3)
390 error('Vulkan drivers require dri3 for X11 support')
391 endif
392 if with_dri
393 if with_glx == 'disabled' and not with_egl and not with_gbm and with_osmesa != 'classic'
394 error('building dri drivers require at least one windowing system or classic osmesa')
395 endif
396 endif
397
398 prog_pkgconfig = find_program('pkg-config')
399
400 _vdpau = get_option('gallium-vdpau')
401 if not system_has_kms_drm
402 if _vdpau == 'true'
403 error('VDPAU state tracker can only be build on unix-like OSes.')
404 else
405 _vdpau = 'false'
406 endif
407 elif not with_platform_x11
408 if _vdpau == 'true'
409 error('VDPAU state tracker requires X11 support.')
410 else
411 _vdpau = 'false'
412 endif
413 elif not (with_gallium_r300 or with_gallium_r600 or with_gallium_radeonsi or
414 with_gallium_nouveau)
415 if _vdpau == 'true'
416 error('VDPAU state tracker requires at least one of the following gallium drivers: r300, r600, radeonsi, nouveau.')
417 else
418 _vdpau = 'false'
419 endif
420 endif
421 dep_vdpau = null_dep
422 with_gallium_vdpau = false
423 if _vdpau != 'false'
424 dep_vdpau = dependency('vdpau', version : '>= 1.1', required : _vdpau == 'true')
425 if dep_vdpau.found()
426 dep_vdpau = declare_dependency(
427 compile_args : run_command(prog_pkgconfig, ['vdpau', '--cflags']).stdout().split()
428 )
429 with_gallium_vdpau = true
430 endif
431 endif
432
433 if with_gallium_vdpau
434 pre_args += '-DHAVE_ST_VDPAU'
435 endif
436 vdpau_drivers_path = get_option('vdpau-libs-path')
437 if vdpau_drivers_path == ''
438 vdpau_drivers_path = join_paths(get_option('libdir'), 'vdpau')
439 endif
440
441 _xvmc = get_option('gallium-xvmc')
442 if not system_has_kms_drm
443 if _xvmc == 'true'
444 error('XVMC state tracker can only be build on unix-like OSes.')
445 else
446 _xvmc = 'false'
447 endif
448 elif not with_platform_x11
449 if _xvmc == 'true'
450 error('XVMC state tracker requires X11 support.')
451 else
452 _xvmc = 'false'
453 endif
454 elif not (with_gallium_r600 or with_gallium_nouveau)
455 if _xvmc == 'true'
456 error('XVMC state tracker requires at least one of the following gallium drivers: r600, nouveau.')
457 else
458 _xvmc = 'false'
459 endif
460 endif
461 dep_xvmc = null_dep
462 with_gallium_xvmc = false
463 if _xvmc != 'false'
464 dep_xvmc = dependency('xvmc', version : '>= 1.0.6', required : _xvmc == 'true')
465 with_gallium_xvmc = dep_xvmc.found()
466 endif
467
468 xvmc_drivers_path = get_option('xvmc-libs-path')
469 if xvmc_drivers_path == ''
470 xvmc_drivers_path = get_option('libdir')
471 endif
472
473 _omx = get_option('gallium-omx')
474 if not system_has_kms_drm
475 if ['auto', 'disabled'].contains(_omx)
476 _omx = 'disabled'
477 else
478 error('OMX state tracker can only be built on unix-like OSes.')
479 endif
480 elif not (with_platform_x11 or with_platform_drm)
481 if ['auto', 'disabled'].contains(_omx)
482 _omx = 'disabled'
483 else
484 error('OMX state tracker requires X11 or drm platform support.')
485 endif
486 elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
487 if ['auto', 'disabled'].contains(_omx)
488 _omx = 'disabled'
489 else
490 error('OMX state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
491 endif
492 endif
493 with_gallium_omx = _omx
494 dep_omx = null_dep
495 dep_omx_other = []
496 if ['auto', 'bellagio'].contains(_omx)
497 dep_omx = dependency(
498 'libomxil-bellagio', required : _omx == 'bellagio'
499 )
500 if dep_omx.found()
501 with_gallium_omx = 'bellagio'
502 endif
503 endif
504 if ['auto', 'tizonia'].contains(_omx)
505 if with_dri and with_egl
506 dep_omx = dependency(
507 'libtizonia', version : '>= 0.10.0',
508 required : _omx == 'tizonia',
509 )
510 dep_omx_other = [
511 dependency('libtizplatform', required : _omx == 'tizonia'),
512 dependency('tizilheaders', required : _omx == 'tizonia'),
513 ]
514 if dep_omx.found() and dep_omx_other[0].found() and dep_omx_other[1].found()
515 with_gallium_omx = 'tizonia'
516 endif
517 elif _omx == 'tizonia'
518 error('OMX-Tizonia state tracker requires dri and egl')
519 endif
520 endif
521 if _omx == 'auto'
522 with_gallium_omx = 'disabled'
523 else
524 with_gallium_omx = _omx
525 endif
526
527 pre_args += [
528 '-DENABLE_ST_OMX_BELLAGIO=' + (with_gallium_omx == 'bellagio' ? '1' : '0'),
529 '-DENABLE_ST_OMX_TIZONIA=' + (with_gallium_omx == 'tizonia' ? '1' : '0'),
530 ]
531
532
533 omx_drivers_path = get_option('omx-libs-path')
534
535 if with_gallium_omx != 'disabled'
536 # Figure out where to put the omx driver.
537 # FIXME: this could all be vastly simplified by adding a 'defined_variable'
538 # argument to meson's get_pkgconfig_variable method.
539 if omx_drivers_path == ''
540 _omx_libdir = dep_omx.get_pkgconfig_variable('libdir')
541 _omx_drivers_dir = dep_omx.get_pkgconfig_variable('pluginsdir')
542 if _omx_libdir == get_option('libdir')
543 omx_drivers_path = _omx_drivers_dir
544 else
545 _omx_base_dir = []
546 # This will fail on windows. Does OMX run on windows?
547 _omx_libdir = _omx_libdir.split('/')
548 _omx_drivers_dir = _omx_drivers_dir.split('/')
549 foreach o : _omx_drivers_dir
550 if not _omx_libdir.contains(o)
551 _omx_base_dir += o
552 endif
553 endforeach
554 omx_drivers_path = join_paths(get_option('libdir'), _omx_base_dir)
555 endif
556 endif
557 endif
558
559 _va = get_option('gallium-va')
560 if not system_has_kms_drm
561 if _va == 'true'
562 error('VA state tracker can only be built on unix-like OSes.')
563 else
564 _va = 'false'
565 endif
566 elif not (with_platform_x11 or with_platform_drm)
567 if _va == 'true'
568 error('VA state tracker requires X11 or drm or wayland platform support.')
569 else
570 _va = 'false'
571 endif
572 elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
573 if _va == 'true'
574 error('VA state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
575 else
576 _va = 'false'
577 endif
578 endif
579 with_gallium_va = false
580 dep_va = null_dep
581 if _va != 'false'
582 dep_va = dependency('libva', version : '>= 0.38.0', required : _va == 'true')
583 if dep_va.found()
584 dep_va_headers = declare_dependency(
585 compile_args : run_command(prog_pkgconfig, ['libva', '--cflags']).stdout().split()
586 )
587 with_gallium_va = true
588 endif
589 endif
590
591 va_drivers_path = get_option('va-libs-path')
592 if va_drivers_path == ''
593 va_drivers_path = join_paths(get_option('libdir'), 'dri')
594 endif
595
596 _xa = get_option('gallium-xa')
597 if not system_has_kms_drm
598 if _xa == 'true'
599 error('XA state tracker can only be built on unix-like OSes.')
600 else
601 _xa = 'false'
602 endif
603 elif not (with_gallium_nouveau or with_gallium_freedreno or with_gallium_i915
604 or with_gallium_svga)
605 if _xa == 'true'
606 error('XA state tracker requires at least one of the following gallium drivers: nouveau, freedreno, i915, svga.')
607 else
608 _xa = 'false'
609 endif
610 endif
611 with_gallium_xa = _xa != 'false'
612
613 d3d_drivers_path = get_option('d3d-drivers-path')
614 if d3d_drivers_path == ''
615 d3d_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'd3d')
616 endif
617
618 with_gallium_st_nine = get_option('gallium-nine')
619 if with_gallium_st_nine
620 if not with_gallium_softpipe
621 error('The nine state tracker requires gallium softpipe/llvmpipe.')
622 elif not (with_gallium_radeonsi or with_gallium_nouveau or with_gallium_r600
623 or with_gallium_r300 or with_gallium_svga or with_gallium_i915
624 or with_gallium_iris)
625 error('The nine state tracker requires at least one non-swrast gallium driver.')
626 endif
627 if not with_dri3
628 error('Using nine with wine requires dri3')
629 endif
630 endif
631
632 if get_option('power8') != 'false'
633 # on old versions of meson the cpu family would return as ppc64le on little
634 # endian power8, this was changed in 0.48 such that the family would always
635 # be ppc64 regardless of endianness, and the the machine.endian() value
636 # should be checked. Since we support versions < 0.48 we need to use
637 # startswith.
638 if host_machine.cpu_family().startswith('ppc64') and host_machine.endian() == 'little'
639 if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.8')
640 error('Altivec is not supported with gcc version < 4.8.')
641 endif
642 if cc.compiles('''
643 #include <altivec.h>
644 int main() {
645 vector unsigned char r;
646 vector unsigned int v = vec_splat_u32 (1);
647 r = __builtin_vec_vgbbd ((vector unsigned char) v);
648 return 0;
649 }''',
650 args : '-mpower8-vector',
651 name : 'POWER8 intrinsics')
652 pre_args += ['-D_ARCH_PWR8', '-mpower8-vector']
653 elif get_option('power8') == 'true'
654 error('POWER8 intrinsic support required but not found.')
655 endif
656 endif
657 endif
658
659 _opencl = get_option('gallium-opencl')
660 clover_cpp_std = []
661 if _opencl != 'disabled'
662 if not with_gallium
663 error('OpenCL Clover implementation requires at least one gallium driver.')
664 endif
665
666 dep_clc = dependency('libclc')
667 with_gallium_opencl = true
668 with_opencl_icd = _opencl == 'icd'
669
670 if host_machine.cpu_family().startswith('ppc') and cpp.compiles('''
671 #if !defined(__VEC__) || !defined(__ALTIVEC__)
672 #error "AltiVec not enabled"
673 #endif''',
674 name : 'Altivec')
675 clover_cpp_std += ['cpp_std=gnu++11']
676 endif
677 else
678 dep_clc = null_dep
679 with_gallium_opencl = false
680 with_opencl_icd = false
681 endif
682
683 gl_pkgconfig_c_flags = []
684 if with_platform_x11
685 if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm')
686 pre_args += '-DHAVE_X11_PLATFORM'
687 endif
688 if with_glx == 'xlib' or with_glx == 'gallium-xlib'
689 pre_args += '-DUSE_XSHM'
690 else
691 pre_args += '-DGLX_INDIRECT_RENDERING'
692 if with_glx_direct
693 pre_args += '-DGLX_DIRECT_RENDERING'
694 endif
695 if with_dri_platform == 'drm'
696 pre_args += '-DGLX_USE_DRM'
697 elif with_dri_platform == 'apple'
698 pre_args += '-DGLX_USE_APPLEGL'
699 elif with_dri_platform == 'windows'
700 pre_args += '-DGLX_USE_WINDOWSGL'
701 endif
702 endif
703 else
704 pre_args += '-DMESA_EGL_NO_X11_HEADERS'
705 gl_pkgconfig_c_flags += '-DMESA_EGL_NO_X11_HEADERS'
706 endif
707 if with_platform_drm
708 if with_egl and not with_gbm
709 error('EGL drm platform requires gbm')
710 endif
711 pre_args += '-DHAVE_DRM_PLATFORM'
712 endif
713 if with_platform_surfaceless
714 pre_args += '-DHAVE_SURFACELESS_PLATFORM'
715 endif
716 if with_platform_android
717 dep_android = [
718 dependency('cutils'),
719 dependency('hardware'),
720 dependency('sync'),
721 ]
722 pre_args += '-DHAVE_ANDROID_PLATFORM'
723 endif
724 if with_platform_haiku
725 pre_args += '-DHAVE_HAIKU_PLATFORM'
726 endif
727
728 prog_python = import('python3').find_python()
729 has_mako = run_command(
730 prog_python, '-c',
731 '''
732 from distutils.version import StrictVersion
733 import mako
734 assert StrictVersion(mako.__version__) > StrictVersion("0.8.0")
735 ''')
736 if has_mako.returncode() != 0
737 error('Python (3.x) mako module >= 0.8.0 required to build mesa.')
738 endif
739
740 if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.4.6')
741 error('When using GCC, version 4.4.6 or later is required.')
742 endif
743
744 # Define DEBUG for debug builds only (debugoptimized is not included on this one)
745 if get_option('buildtype') == 'debug'
746 pre_args += '-DDEBUG'
747 endif
748
749 if get_option('shader-cache')
750 pre_args += '-DENABLE_SHADER_CACHE'
751 elif with_amd_vk
752 error('Radv requires shader cache support')
753 endif
754
755 # Check for GCC style builtins
756 foreach b : ['bswap32', 'bswap64', 'clz', 'clzll', 'ctz', 'expect', 'ffs',
757 'ffsll', 'popcount', 'popcountll', 'unreachable']
758 if cc.has_function(b)
759 pre_args += '-DHAVE___BUILTIN_@0@'.format(b.to_upper())
760 endif
761 endforeach
762
763 # check for GCC __attribute__
764 foreach a : ['const', 'flatten', 'malloc', 'pure', 'unused',
765 'warn_unused_result', 'weak',]
766 if cc.compiles('int foo(void) __attribute__((@0@));'.format(a),
767 name : '__attribute__((@0@))'.format(a))
768 pre_args += '-DHAVE_FUNC_ATTRIBUTE_@0@'.format(a.to_upper())
769 endif
770 endforeach
771 if cc.compiles('int foo(const char *p, ...) __attribute__((format(printf, 1, 2)));',
772 name : '__attribute__((format(...)))')
773 pre_args += '-DHAVE_FUNC_ATTRIBUTE_FORMAT'
774 endif
775 if cc.compiles('struct __attribute__((packed)) foo { int bar; };',
776 name : '__attribute__((packed))')
777 pre_args += '-DHAVE_FUNC_ATTRIBUTE_PACKED'
778 endif
779 if cc.compiles('int *foo(void) __attribute__((returns_nonnull));',
780 name : '__attribute__((returns_nonnull))')
781 pre_args += '-DHAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL'
782 endif
783 if cc.compiles('''int foo_def(void) __attribute__((visibility("default")));
784 int foo_hid(void) __attribute__((visibility("hidden")));
785 int foo_int(void) __attribute__((visibility("internal")));
786 int foo_pro(void) __attribute__((visibility("protected")));''',
787 name : '__attribute__((visibility(...)))')
788 pre_args += '-DHAVE_FUNC_ATTRIBUTE_VISIBILITY'
789 endif
790 if cc.compiles('int foo(void) { return 0; } int bar(void) __attribute__((alias("foo")));',
791 name : '__attribute__((alias(...)))')
792 pre_args += '-DHAVE_FUNC_ATTRIBUTE_ALIAS'
793 endif
794 if cc.compiles('int foo(void) __attribute__((__noreturn__));',
795 name : '__attribute__((__noreturn__))')
796 pre_args += '-DHAVE_FUNC_ATTRIBUTE_NORETURN'
797 endif
798
799 # TODO: this is very incomplete
800 if ['linux', 'cygwin', 'gnu'].contains(host_machine.system())
801 pre_args += '-D_GNU_SOURCE'
802 endif
803
804 # Check for generic C arguments
805 c_args = []
806 foreach a : ['-Werror=implicit-function-declaration',
807 '-Werror=missing-prototypes', '-Werror=return-type',
808 '-Werror=incompatible-pointer-types',
809 '-fno-math-errno',
810 '-fno-trapping-math', '-Qunused-arguments']
811 if cc.has_argument(a)
812 c_args += a
813 endif
814 endforeach
815
816 foreach a : ['missing-field-initializers', 'format-truncation']
817 if cc.has_argument('-W' + a)
818 c_args += '-Wno-' + a
819 endif
820 endforeach
821
822 c_vis_args = []
823 if cc.has_argument('-fvisibility=hidden')
824 c_vis_args += '-fvisibility=hidden'
825 endif
826
827 # Check for generic C++ arguments
828 cpp_args = []
829 foreach a : ['-Werror=return-type',
830 '-fno-math-errno', '-fno-trapping-math',
831 '-Qunused-arguments']
832 if cpp.has_argument(a)
833 cpp_args += a
834 endif
835 endforeach
836
837 # For some reason, the test for -Wno-foo always succeeds with gcc, even if the
838 # option is not supported. Hence, check for -Wfoo instead.
839
840 foreach a : ['non-virtual-dtor', 'missing-field-initializers', 'format-truncation']
841 if cpp.has_argument('-W' + a)
842 cpp_args += '-Wno-' + a
843 endif
844 endforeach
845
846 no_override_init_args = []
847 foreach a : ['override-init', 'initializer-overrides']
848 if cc.has_argument('-W' + a)
849 no_override_init_args += '-Wno-' + a
850 endif
851 endforeach
852
853 cpp_vis_args = []
854 if cpp.has_argument('-fvisibility=hidden')
855 cpp_vis_args += '-fvisibility=hidden'
856 endif
857
858 # Check for C and C++ arguments for MSVC2013 compatibility. These are only used
859 # in parts of the mesa code base that need to compile with old versions of
860 # MSVC, mainly common code
861 c_msvc_compat_args = []
862 cpp_msvc_compat_args = []
863 foreach a : ['-Werror=pointer-arith', '-Werror=vla']
864 if cc.has_argument(a)
865 c_msvc_compat_args += a
866 endif
867 if cpp.has_argument(a)
868 cpp_msvc_compat_args += a
869 endif
870 endforeach
871
872 if host_machine.cpu_family().startswith('x86')
873 pre_args += '-DUSE_SSE41'
874 with_sse41 = true
875 sse41_args = ['-msse4.1']
876
877 # GCC on x86 (not x86_64) with -msse* assumes a 16 byte aligned stack, but
878 # that's not guaranteed
879 if host_machine.cpu_family() == 'x86'
880 sse41_args += '-mstackrealign'
881 endif
882 else
883 with_sse41 = false
884 sse41_args = []
885 endif
886
887 # Check for GCC style atomics
888 dep_atomic = null_dep
889
890 if cc.compiles('''#include <stdint.h>
891 int main() {
892 struct {
893 uint64_t *v;
894 } x;
895 return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) &
896 (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL);
897
898 }''',
899 name : 'GCC atomic builtins')
900 pre_args += '-DUSE_GCC_ATOMIC_BUILTINS'
901
902 # Not all atomic calls can be turned into lock-free instructions, in which
903 # GCC will make calls into the libatomic library. Check whether we need to
904 # link with -latomic.
905 #
906 # This can happen for 64-bit atomic operations on 32-bit architectures such
907 # as ARM.
908 if not cc.links('''#include <stdint.h>
909 int main() {
910 struct {
911 uint64_t *v;
912 } x;
913 return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) &
914 (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL);
915 }''',
916 name : 'GCC atomic builtins required -latomic')
917 dep_atomic = cc.find_library('atomic')
918 endif
919 endif
920 if not cc.links('''#include <stdint.h>
921 uint64_t v;
922 int main() {
923 return __sync_add_and_fetch(&v, (uint64_t)1);
924 }''',
925 dependencies : dep_atomic,
926 name : 'GCC 64bit atomics')
927 pre_args += '-DMISSING_64BIT_ATOMICS'
928 endif
929
930 # TODO: shared/static? Is this even worth doing?
931
932 # When cross compiling we generally need to turn off the use of assembly,
933 # because mesa's assembly relies on building an executable for the host system,
934 # and running it to get information about struct sizes. There is at least one
935 # case of cross compiling where we can use asm, and that's x86_64 -> x86 when
936 # host OS == build OS, since in that case the build machine can run the host's
937 # binaries.
938 if with_asm and meson.is_cross_build()
939 if build_machine.system() != host_machine.system()
940 # TODO: It may be possible to do this with an exe_wrapper (like wine).
941 message('Cross compiling from one OS to another, disabling assembly.')
942 with_asm = false
943 elif not (build_machine.cpu_family().startswith('x86') and host_machine.cpu_family() == 'x86')
944 # FIXME: Gentoo always sets -m32 for x86_64 -> x86 builds, resulting in an
945 # x86 -> x86 cross compile. We use startswith rather than == to handle this
946 # case.
947 # TODO: There may be other cases where the 64 bit version of the
948 # architecture can run 32 bit binaries (aarch64 and armv7 for example)
949 message('''
950 Cross compiling to different architectures, and the host cannot run
951 the build machine's binaries. Disabling assembly.
952 ''')
953 with_asm = false
954 endif
955 endif
956
957 with_asm_arch = ''
958 if with_asm
959 if host_machine.cpu_family() == 'x86'
960 if system_has_kms_drm or host_machine.system() == 'gnu'
961 with_asm_arch = 'x86'
962 pre_args += ['-DUSE_X86_ASM', '-DUSE_MMX_ASM', '-DUSE_3DNOW_ASM',
963 '-DUSE_SSE_ASM']
964
965 if with_glx_read_only_text
966 pre_args += ['-DGLX_X86_READONLY_TEXT']
967 endif
968 endif
969 elif host_machine.cpu_family() == 'x86_64'
970 if system_has_kms_drm
971 with_asm_arch = 'x86_64'
972 pre_args += ['-DUSE_X86_64_ASM']
973 endif
974 elif host_machine.cpu_family() == 'arm'
975 if system_has_kms_drm
976 with_asm_arch = 'arm'
977 pre_args += ['-DUSE_ARM_ASM']
978 endif
979 elif host_machine.cpu_family() == 'aarch64'
980 if system_has_kms_drm
981 with_asm_arch = 'aarch64'
982 pre_args += ['-DUSE_AARCH64_ASM']
983 endif
984 elif host_machine.cpu_family() == 'sparc64'
985 if system_has_kms_drm
986 with_asm_arch = 'sparc'
987 pre_args += ['-DUSE_SPARC_ASM']
988 endif
989 elif host_machine.cpu_family().startswith('ppc64') and host_machine.endian() == 'little'
990 if system_has_kms_drm
991 with_asm_arch = 'ppc64le'
992 pre_args += ['-DUSE_PPC64LE_ASM']
993 endif
994 endif
995 endif
996
997 # Check for standard headers and functions
998 if cc.has_header_symbol('sys/sysmacros.h', 'major')
999 pre_args += '-DMAJOR_IN_SYSMACROS'
1000 elif cc.has_header_symbol('sys/mkdev.h', 'major')
1001 pre_args += '-DMAJOR_IN_MKDEV'
1002 endif
1003
1004 foreach h : ['xlocale.h', 'sys/sysctl.h', 'linux/futex.h', 'endian.h', 'dlfcn.h']
1005 if cc.compiles('#include <@0@>'.format(h), name : '@0@'.format(h))
1006 pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify())
1007 endif
1008 endforeach
1009
1010 foreach f : ['strtof', 'mkostemp', 'posix_memalign', 'timespec_get', 'memfd_create']
1011 if cc.has_function(f)
1012 pre_args += '-DHAVE_@0@'.format(f.to_upper())
1013 endif
1014 endforeach
1015
1016 # strtod locale support
1017 if cc.links('''
1018 #define _GNU_SOURCE
1019 #include <stdlib.h>
1020 #include <locale.h>
1021 #ifdef HAVE_XLOCALE_H
1022 #include <xlocale.h>
1023 #endif
1024 int main() {
1025 locale_t loc = newlocale(LC_CTYPE_MASK, "C", NULL);
1026 const char *s = "1.0";
1027 char *end;
1028 double d = strtod_l(s, end, loc);
1029 float f = strtof_l(s, end, loc);
1030 freelocale(loc);
1031 return 0;
1032 }''',
1033 args : pre_args,
1034 name : 'strtod has locale support')
1035 pre_args += '-DHAVE_STRTOD_L'
1036 endif
1037
1038 # Check for some linker flags
1039 ld_args_bsymbolic = []
1040 if cc.links('int main() { return 0; }', args : '-Wl,-Bsymbolic', name : 'Bsymbolic')
1041 ld_args_bsymbolic += '-Wl,-Bsymbolic'
1042 endif
1043 ld_args_gc_sections = []
1044 if cc.links('static char unused() { return 5; } int main() { return 0; }',
1045 args : '-Wl,--gc-sections', name : 'gc-sections')
1046 ld_args_gc_sections += '-Wl,--gc-sections'
1047 endif
1048 with_ld_version_script = false
1049 if cc.links('int main() { return 0; }',
1050 args : '-Wl,--version-script=@0@'.format(
1051 join_paths(meson.source_root(), 'build-support/conftest.map')),
1052 name : 'version-script')
1053 with_ld_version_script = true
1054 endif
1055 with_ld_dynamic_list = false
1056 if cc.links('int main() { return 0; }',
1057 args : '-Wl,--dynamic-list=@0@'.format(
1058 join_paths(meson.source_root(), 'build-support/conftest.dyn')),
1059 name : 'dynamic-list')
1060 with_ld_dynamic_list = true
1061 endif
1062 ld_args_build_id = []
1063 if build_machine.system() != 'darwin'
1064 ld_args_build_id += '-Wl,--build-id=sha1'
1065 endif
1066
1067 # check for dl support
1068 if cc.has_function('dlopen')
1069 dep_dl = null_dep
1070 else
1071 dep_dl = cc.find_library('dl')
1072 endif
1073 if cc.has_function('dladdr', dependencies : dep_dl)
1074 # This is really only required for megadrivers
1075 pre_args += '-DHAVE_DLADDR'
1076 endif
1077
1078 if cc.has_function('dl_iterate_phdr')
1079 pre_args += '-DHAVE_DL_ITERATE_PHDR'
1080 elif with_intel_vk
1081 error('Intel "Anvil" Vulkan driver requires the dl_iterate_phdr function')
1082 elif with_dri_i965 and get_option('shader-cache')
1083 error('Intel i965 GL driver requires dl_iterate_phdr when built with shader caching.')
1084 endif
1085
1086 # Determine whether or not the rt library is needed for time functions
1087 if cc.has_function('clock_gettime')
1088 dep_clock = null_dep
1089 else
1090 dep_clock = cc.find_library('rt')
1091 endif
1092
1093 # TODO: some of these may be conditional
1094 dep_zlib = dependency('zlib', version : '>= 1.2.3')
1095 pre_args += '-DHAVE_ZLIB'
1096 dep_thread = dependency('threads')
1097 if dep_thread.found() and host_machine.system() != 'windows'
1098 pre_args += '-DHAVE_PTHREAD'
1099 if cc.has_function(
1100 'pthread_setaffinity_np',
1101 dependencies : dep_thread,
1102 prefix : '#include <pthread.h>',
1103 args : '-D_GNU_SOURCE')
1104 pre_args += '-DHAVE_PTHREAD_SETAFFINITY'
1105 endif
1106 endif
1107 dep_expat = dependency('expat')
1108 # this only exists on linux so either this is linux and it will be found, or
1109 # its not linux and and wont
1110 dep_m = cc.find_library('m', required : false)
1111
1112 # Check for libdrm. various drivers have different libdrm version requirements,
1113 # but we always want to use the same version for all libdrm modules. That means
1114 # even if driver foo requires 2.4.0 and driver bar requires 2.4.3, if foo and
1115 # bar are both on use 2.4.3 for both of them
1116 dep_libdrm_amdgpu = null_dep
1117 dep_libdrm_radeon = null_dep
1118 dep_libdrm_nouveau = null_dep
1119 dep_libdrm_etnaviv = null_dep
1120 dep_libdrm_intel = null_dep
1121
1122 _drm_amdgpu_ver = '2.4.97'
1123 _drm_radeon_ver = '2.4.71'
1124 _drm_nouveau_ver = '2.4.66'
1125 _drm_etnaviv_ver = '2.4.89'
1126 _drm_intel_ver = '2.4.75'
1127 _drm_ver = '2.4.75'
1128
1129 _libdrm_checks = [
1130 ['intel', with_dri_i915 or with_gallium_i915],
1131 ['amdgpu', with_amd_vk or with_gallium_radeonsi],
1132 ['radeon', (with_gallium_radeonsi or with_dri_r100 or with_dri_r200 or
1133 with_gallium_r300 or with_gallium_r600)],
1134 ['nouveau', (with_gallium_nouveau or with_dri_nouveau)],
1135 ['etnaviv', with_gallium_etnaviv],
1136 ]
1137
1138 # VC4 only needs core libdrm support of this version, not a libdrm_vc4
1139 # library.
1140 if with_gallium_vc4
1141 _drm_ver = '2.4.89'
1142 endif
1143
1144 # Loop over the enables versions and get the highest libdrm requirement for all
1145 # active drivers.
1146 _drm_blame = ''
1147 foreach d : _libdrm_checks
1148 ver = get_variable('_drm_@0@_ver'.format(d[0]))
1149 if d[1] and ver.version_compare('>' + _drm_ver)
1150 _drm_ver = ver
1151 _drm_blame = d[0]
1152 endif
1153 endforeach
1154 if _drm_blame != ''
1155 message('libdrm @0@ needed because @1@ has the highest requirement'.format(_drm_ver, _drm_blame))
1156 endif
1157
1158 # Then get each libdrm module
1159 foreach d : _libdrm_checks
1160 if d[1]
1161 set_variable(
1162 'dep_libdrm_' + d[0],
1163 dependency('libdrm_' + d[0], version : '>=' + _drm_ver)
1164 )
1165 endif
1166 endforeach
1167
1168 with_gallium_drisw_kms = false
1169 dep_libdrm = dependency(
1170 'libdrm', version : '>=' + _drm_ver,
1171 required : with_dri2 or with_dri3
1172 )
1173 if dep_libdrm.found()
1174 pre_args += '-DHAVE_LIBDRM'
1175 if with_dri_platform == 'drm' and with_dri
1176 with_gallium_drisw_kms = true
1177 endif
1178 endif
1179
1180 llvm_modules = ['bitwriter', 'engine', 'mcdisassembler', 'mcjit']
1181 llvm_optional_modules = []
1182 if with_amd_vk or with_gallium_radeonsi or with_gallium_r600
1183 llvm_modules += ['amdgpu', 'native', 'bitreader', 'ipo']
1184 if with_gallium_r600
1185 llvm_modules += 'asmparser'
1186 endif
1187 endif
1188 if with_gallium_opencl
1189 llvm_modules += [
1190 'all-targets', 'linker', 'coverage', 'instrumentation', 'ipo', 'irreader',
1191 'lto', 'option', 'objcarcopts', 'profiledata',
1192 ]
1193 llvm_optional_modules += ['coroutines']
1194 endif
1195
1196 if with_amd_vk or with_gallium_radeonsi
1197 _llvm_version = '>= 7.0.0'
1198 elif with_gallium_swr
1199 _llvm_version = '>= 6.0.0'
1200 elif with_gallium_opencl or with_gallium_r600
1201 _llvm_version = '>= 3.9.0'
1202 else
1203 _llvm_version = '>= 3.3.0'
1204 endif
1205
1206 _shared_llvm = get_option('shared-llvm')
1207
1208 _llvm = get_option('llvm')
1209 dep_llvm = null_dep
1210 with_llvm = false
1211 if _llvm != 'false'
1212 dep_llvm = dependency(
1213 'llvm',
1214 version : _llvm_version,
1215 modules : llvm_modules,
1216 optional_modules : llvm_optional_modules,
1217 required : (
1218 with_amd_vk or with_gallium_radeonsi or with_gallium_swr or
1219 with_gallium_opencl or _llvm == 'true'
1220 ),
1221 static : not _shared_llvm,
1222 )
1223 with_llvm = dep_llvm.found()
1224 endif
1225 if with_llvm
1226 _llvm_version = dep_llvm.version().split('.')
1227
1228 # 3 digits versions in LLVM only started from 3.4.1 on
1229 if dep_llvm.version().version_compare('>= 3.4.1')
1230 _llvm_patch = _llvm_version[2]
1231 else
1232 _llvm_patch = '0'
1233 endif
1234
1235 pre_args += [
1236 '-DHAVE_LLVM=0x0@0@0@1@'.format(_llvm_version[0], _llvm_version[1]),
1237 '-DMESA_LLVM_VERSION_PATCH=@0@'.format(_llvm_patch),
1238 ]
1239
1240 # LLVM can be built without rtti, turning off rtti changes the ABI of C++
1241 # programs, so we need to build all C++ code in mesa without rtti as well to
1242 # ensure that linking works.
1243 if dep_llvm.get_configtool_variable('has-rtti') == 'NO'
1244 if with_gallium_nouveau
1245 error('The Nouveau driver requires rtti. You either need to turn off nouveau or use an LLVM built with LLVM_ENABLE_RTTI.')
1246 endif
1247 cpp_args += '-fno-rtti'
1248 endif
1249 elif with_amd_vk or with_gallium_radeonsi or with_gallium_swr
1250 error('The following drivers require LLVM: Radv, RadeonSI, SWR. One of these is enabled, but LLVM is disabled.')
1251 endif
1252
1253 if (with_amd_vk or with_gallium_radeonsi or with_gallium_opencl or
1254 (with_gallium_r600 and with_llvm))
1255 dep_elf = dependency('libelf', required : false)
1256 if not dep_elf.found()
1257 dep_elf = cc.find_library('elf')
1258 endif
1259 else
1260 dep_elf = null_dep
1261 endif
1262
1263 dep_glvnd = null_dep
1264 if with_glvnd
1265 dep_glvnd = dependency('libglvnd', version : '>= 0.2.0')
1266 pre_args += '-DUSE_LIBGLVND=1'
1267 endif
1268
1269 if with_valgrind != 'false'
1270 dep_valgrind = dependency('valgrind', required : with_valgrind == 'true')
1271 if dep_valgrind.found()
1272 pre_args += '-DHAVE_VALGRIND'
1273 endif
1274 else
1275 dep_valgrind = null_dep
1276 endif
1277
1278 # pthread stubs. Lets not and say we didn't
1279
1280 prog_bison = find_program('bison', required : with_any_opengl)
1281 prog_flex = find_program('flex', required : with_any_opengl)
1282
1283 dep_selinux = null_dep
1284 if get_option('selinux')
1285 dep_selinux = dependency('libselinux')
1286 pre_args += '-DMESA_SELINUX'
1287 endif
1288
1289 if with_libunwind != 'false'
1290 dep_unwind = dependency('libunwind', required : with_libunwind == 'true')
1291 if dep_unwind.found()
1292 pre_args += '-DHAVE_LIBUNWIND'
1293 endif
1294 else
1295 dep_unwind = null_dep
1296 endif
1297
1298 if with_osmesa != 'none'
1299 if with_osmesa == 'classic' and not with_dri_swrast
1300 error('OSMesa classic requires dri (classic) swrast.')
1301 endif
1302 if with_osmesa == 'gallium' and not with_gallium_softpipe
1303 error('OSMesa gallium requires gallium softpipe or llvmpipe.')
1304 endif
1305 osmesa_lib_name = 'OSMesa'
1306 osmesa_bits = get_option('osmesa-bits')
1307 if osmesa_bits != '8'
1308 if with_dri or with_glx != 'disabled'
1309 error('OSMesa bits must be 8 if building glx or dir based drivers')
1310 endif
1311 osmesa_lib_name = osmesa_lib_name + osmesa_bits
1312 pre_args += [
1313 '-DCHAN_BITS=@0@'.format(osmesa_bits), '-DDEFAULT_SOFTWARE_DEPTH_BITS=31'
1314 ]
1315 endif
1316 endif
1317
1318 # TODO: symbol mangling
1319
1320 if with_platform_wayland
1321 dep_wl_scanner = dependency('wayland-scanner', native: true)
1322 prog_wl_scanner = find_program(dep_wl_scanner.get_pkgconfig_variable('wayland_scanner'))
1323 if dep_wl_scanner.version().version_compare('>= 1.15')
1324 wl_scanner_arg = 'private-code'
1325 else
1326 wl_scanner_arg = 'code'
1327 endif
1328 dep_wl_protocols = dependency('wayland-protocols', version : '>= 1.8')
1329 dep_wayland_client = dependency('wayland-client', version : '>=1.11')
1330 dep_wayland_server = dependency('wayland-server', version : '>=1.11')
1331 if with_egl
1332 dep_wayland_egl = dependency('wayland-egl-backend', version : '>= 3')
1333 dep_wayland_egl_headers = declare_dependency(
1334 compile_args : run_command(prog_pkgconfig, ['wayland-egl-backend', '--cflags']).stdout().split())
1335 endif
1336 wayland_dmabuf_xml = join_paths(
1337 dep_wl_protocols.get_pkgconfig_variable('pkgdatadir'), 'unstable',
1338 'linux-dmabuf', 'linux-dmabuf-unstable-v1.xml'
1339 )
1340 pre_args += ['-DHAVE_WAYLAND_PLATFORM', '-DWL_HIDE_DEPRECATED']
1341 endif
1342
1343 dep_x11 = null_dep
1344 dep_xext = null_dep
1345 dep_xdamage = null_dep
1346 dep_xfixes = null_dep
1347 dep_x11_xcb = null_dep
1348 dep_xcb = null_dep
1349 dep_xcb_glx = null_dep
1350 dep_xcb_dri2 = null_dep
1351 dep_xcb_dri3 = null_dep
1352 dep_dri2proto = null_dep
1353 dep_glproto = null_dep
1354 dep_xxf86vm = null_dep
1355 dep_xcb_dri3 = null_dep
1356 dep_xcb_present = null_dep
1357 dep_xcb_sync = null_dep
1358 dep_xcb_xfixes = null_dep
1359 dep_xshmfence = null_dep
1360 dep_xcb_xrandr = null_dep
1361 dep_xlib_xrandr = null_dep
1362 if with_platform_x11
1363 if with_glx == 'xlib' or with_glx == 'gallium-xlib'
1364 dep_x11 = dependency('x11')
1365 dep_xext = dependency('xext')
1366 dep_xcb = dependency('xcb')
1367 elif with_glx == 'dri'
1368 dep_x11 = dependency('x11')
1369 dep_xext = dependency('xext')
1370 dep_xdamage = dependency('xdamage', version : '>= 1.1')
1371 dep_xfixes = dependency('xfixes')
1372 dep_xcb_glx = dependency('xcb-glx', version : '>= 1.8.1')
1373 endif
1374 if (with_any_vk or with_glx == 'dri' or with_egl or
1375 (with_gallium_vdpau or with_gallium_xvmc or with_gallium_va or
1376 with_gallium_omx != 'disabled'))
1377 dep_xcb = dependency('xcb')
1378 dep_x11_xcb = dependency('x11-xcb')
1379 endif
1380 if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm')
1381 dep_xcb_dri2 = dependency('xcb-dri2', version : '>= 1.8')
1382
1383 if with_dri3
1384 pre_args += '-DHAVE_DRI3'
1385 dep_xcb_dri3 = dependency('xcb-dri3')
1386 dep_xcb_present = dependency('xcb-present')
1387 # until xcb-dri3 has been around long enough to make a hard-dependency:
1388 if (dep_xcb_dri3.version().version_compare('>= 1.13') and
1389 dep_xcb_present.version().version_compare('>= 1.13'))
1390 pre_args += '-DHAVE_DRI3_MODIFIERS'
1391 endif
1392 dep_xcb_sync = dependency('xcb-sync')
1393 dep_xshmfence = dependency('xshmfence', version : '>= 1.1')
1394 endif
1395 endif
1396 if with_glx == 'dri'
1397 if with_dri_platform == 'drm'
1398 dep_dri2proto = dependency('dri2proto', version : '>= 2.8')
1399 dep_xxf86vm = dependency('xxf86vm')
1400 endif
1401 dep_glproto = dependency('glproto', version : '>= 1.4.14')
1402 endif
1403 if (with_egl or (
1404 with_gallium_vdpau or with_gallium_xvmc or with_gallium_xa or
1405 with_gallium_omx != 'disabled'))
1406 dep_xcb_xfixes = dependency('xcb-xfixes')
1407 endif
1408 if with_xlib_lease
1409 dep_xcb_xrandr = dependency('xcb-randr')
1410 dep_xlib_xrandr = dependency('xrandr', version : '>= 1.3')
1411 endif
1412 endif
1413
1414 if get_option('gallium-extra-hud')
1415 pre_args += '-DHAVE_GALLIUM_EXTRA_HUD=1'
1416 endif
1417
1418 _sensors = get_option('lmsensors')
1419 if _sensors != 'false'
1420 dep_lmsensors = cc.find_library('sensors', required : _sensors == 'true')
1421 if dep_lmsensors.found()
1422 pre_args += '-DHAVE_LIBSENSORS=1'
1423 endif
1424 else
1425 dep_lmsensors = null_dep
1426 endif
1427
1428 foreach a : pre_args
1429 add_project_arguments(a, language : ['c', 'cpp'])
1430 endforeach
1431 foreach a : c_args
1432 add_project_arguments(a, language : ['c'])
1433 endforeach
1434 foreach a : cpp_args
1435 add_project_arguments(a, language : ['cpp'])
1436 endforeach
1437
1438 gl_priv_reqs = []
1439
1440 if with_glx == 'xlib' or with_glx == 'gallium-xlib'
1441 gl_priv_reqs += ['x11', 'xext', 'xcb']
1442 elif with_glx == 'dri'
1443 gl_priv_reqs += [
1444 'x11', 'xext', 'xdamage >= 1.1', 'xfixes', 'x11-xcb', 'xcb',
1445 'xcb-glx >= 1.8.1']
1446 if with_dri_platform == 'drm'
1447 gl_priv_reqs += 'xcb-dri2 >= 1.8'
1448 gl_priv_reqs += 'xxf86vm'
1449 endif
1450 endif
1451 if dep_libdrm.found()
1452 gl_priv_reqs += 'libdrm >= 2.4.75'
1453 endif
1454
1455 gl_priv_libs = []
1456 if dep_thread.found()
1457 gl_priv_libs += ['-lpthread', '-pthread']
1458 endif
1459 if dep_m.found()
1460 gl_priv_libs += '-lm'
1461 endif
1462 if dep_dl.found()
1463 gl_priv_libs += '-ldl'
1464 endif
1465
1466 pkg = import('pkgconfig')
1467
1468 env_test = environment()
1469 env_test.set('NM', find_program('nm').path())
1470
1471 # This quirk needs to be applied to sources with functions defined in assembly
1472 # as GCC LTO drops them. See: https://bugs.freedesktop.org/show_bug.cgi?id=109391
1473 gcc_lto_quirk = (cc.get_id() == 'gcc') ? ['-fno-lto'] : []
1474
1475 subdir('include')
1476 subdir('bin')
1477 subdir('src')