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