OSDN Git Service

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