OSDN Git Service

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