meson.build 61.9 KB
Newer Older
1
# Copyright © 2017-2020 Intel Corporation
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

21 22 23
project(
  'mesa',
  ['c', 'cpp'],
24
  version : run_command(
25
    [find_program('python', 'python3'), 'bin/meson_get_version.py']
26
  ).stdout(),
27
  license : 'MIT',
28
  meson_version : '>= 0.52',
29
  default_options : ['buildtype=debugoptimized', 'b_ndebug=if-release', 'c_std=c99', 'cpp_std=c++14']
30
)
31

32 33 34
cc = meson.get_compiler('c')
cpp = meson.get_compiler('cpp')

35 36
null_dep = dependency('', required : false)

37 38 39 40
if get_option('layout') != 'mirror'
  error('`mirror` is the only build directory layout supported')
endif

Dylan Baker's avatar
Dylan Baker committed
41 42 43 44 45 46 47
# Arguments for the preprocessor, put these in a separate array from the C and
# C++ (cpp in meson terminology) arguments since they need to be added to the
# default arguments for both C and C++.
pre_args = [
  '-D__STDC_CONSTANT_MACROS',
  '-D__STDC_FORMAT_MACROS',
  '-D__STDC_LIMIT_MACROS',
48
  '-DPACKAGE_VERSION="@0@"'.format(meson.project_version()),
49
  '-DPACKAGE_BUGREPORT="https://gitlab.freedesktop.org/mesa/mesa/-/issues"',
Dylan Baker's avatar
Dylan Baker committed
50 51
]

52
with_vulkan_icd_dir = get_option('vulkan-icd-dir')
53
with_tests = get_option('build-tests')
54
with_glx_read_only_text = get_option('glx-read-only-text')
Dylan Baker's avatar
Dylan Baker committed
55
with_glx_direct = get_option('glx-direct')
Dylan Baker's avatar
Dylan Baker committed
56
with_osmesa = get_option('osmesa')
Dylan Baker's avatar
Dylan Baker committed
57
with_swr_arches = get_option('swr-arches')
58
with_vulkan_overlay_layer = get_option('vulkan-overlay-layer')
Dylan Baker's avatar
Dylan Baker committed
59
with_tools = get_option('tools')
60
if with_tools.contains('all')
61 62 63 64 65 66
  with_tools = [
    'drm-shim',
    'etnaviv',
    'freedreno',
    'glsl',
    'intel',
67
    'intel-ui',
68
    'lima',
69 70 71 72
    'nir',
    'nouveau',
    'xvmc',
  ]
73
endif
Dylan Baker's avatar
Dylan Baker committed
74

75 76 77
with_intel_tools = with_tools.contains('intel') or with_tools.contains('intel-ui')
with_imgui = with_intel_tools or with_vulkan_overlay_layer

78 79
dri_drivers_path = get_option('dri-drivers-path')
if dri_drivers_path == ''
80
  dri_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'dri')
81
endif
82 83
dri_search_path = get_option('dri-search-path')
if dri_search_path == ''
84
  dri_search_path = dri_drivers_path
85
endif
86

Dylan Baker's avatar
Dylan Baker committed
87
with_gles1 = get_option('gles1')
88 89 90 91 92 93 94
if with_gles1 == 'true'
  with_gles1 = 'enabled'
  warning('gles1 option "true" deprecated, please use "enabled" instead.')
elif with_gles1 == 'false'
  with_gles1 = 'disabled'
  warning('gles1 option "false" deprecated, please use "disabled" instead.')
endif
Dylan Baker's avatar
Dylan Baker committed
95
with_gles2 = get_option('gles2')
96 97 98 99 100 101 102
if with_gles2 == 'true'
  with_gles2 = 'enabled'
  warning('gles2 option "true" deprecated, please use "enabled" instead.')
elif with_gles2 == 'false'
  with_gles2 = 'disabled'
  warning('gles2 option "false" deprecated, please use "disabled" instead.')
endif
103 104
if host_machine.system() == 'windows'
  if with_gles1 == 'auto'
105
    with_gles1 = 'disabled'
106 107
  endif
  if with_gles2 == 'auto'
108
    with_gles2 = 'disabled'
109 110
  endif
endif
Dylan Baker's avatar
Dylan Baker committed
111
with_opengl = get_option('opengl')
Dylan Baker's avatar
Dylan Baker committed
112 113 114

# Default shared glapi off for windows, on elsewhere.
_sg = get_option('shared-glapi')
115 116 117 118 119 120 121
if _sg == 'true'
  _sg = 'enabled'
  warning('shared-glapi option "true" deprecated, please use "enabled" instead.')
elif _sg == 'false'
  _sg = 'disabled'
  warning('shared-glapi option "false" deprecated, please use "disabled" instead.')
endif
Dylan Baker's avatar
Dylan Baker committed
122 123 124
if _sg == 'auto'
  with_shared_glapi = host_machine.system() != 'windows'
else
125
  with_shared_glapi = _sg == 'enabled'
Dylan Baker's avatar
Dylan Baker committed
126
endif
Dylan Baker's avatar
Dylan Baker committed
127 128 129

# shared-glapi is required if at least two OpenGL APIs are being built
if not with_shared_glapi
130 131 132
  if ((with_gles1 == 'enabled' and with_gles2 == 'enabled') or
      (with_gles1 == 'enabled' and with_opengl) or
      (with_gles2 == 'enabled' and with_opengl))
Dylan Baker's avatar
Dylan Baker committed
133 134
    error('shared-glapi required for building two or more of OpenGL, OpenGL ES 1.x, OpenGL ES 2.x')
  endif
135 136
  with_gles1 = 'disabled'
  with_gles2 = 'disabled'
Dylan Baker's avatar
Dylan Baker committed
137 138 139
endif

# We require OpenGL for OpenGL ES
140
if not with_opengl
141
  if (with_gles1 == 'enabled' or with_gles2 == 'enabled') and not with_opengl
142 143
    error('building OpenGL ES without OpenGL is not supported.')
  endif
144 145
  with_gles1 = 'disabled'
  with_gles2 = 'disabled'
Dylan Baker's avatar
Dylan Baker committed
146 147
endif

148 149
with_gles1 = with_gles1 != 'disabled'
with_gles2 = with_gles2 != 'disabled'
150 151
with_any_opengl = with_opengl or with_gles1 or with_gles2
# Only build shared_glapi if at least one OpenGL API is enabled
Dylan Baker's avatar
Dylan Baker committed
152
with_shared_glapi = with_shared_glapi and with_any_opengl
153

154
system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'gnu/kfreebsd', 'dragonfly', 'linux', 'sunos'].contains(host_machine.system())
155

156 157
dri_drivers = get_option('dri-drivers')
if dri_drivers.contains('auto')
158
  if system_has_kms_drm
159
    # TODO: PPC, Sparc
160
    if ['x86', 'x86_64'].contains(host_machine.cpu_family())
161
      dri_drivers = ['i915', 'i965', 'r100', 'r200', 'nouveau']
162
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
163
      dri_drivers = []
164
    else
165 166
      error('Unknown architecture @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format(
            host_machine.cpu_family()))
167
    endif
168
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
169
    # only swrast would make sense here, but gallium swrast is a much better default
170
    dri_drivers = []
171
  else
172 173
    error('Unknown OS @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
174 175
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
176

177 178 179 180 181 182
with_dri_i915 = dri_drivers.contains('i915')
with_dri_i965 = dri_drivers.contains('i965')
with_dri_r100 = dri_drivers.contains('r100')
with_dri_r200 = dri_drivers.contains('r200')
with_dri_nouveau = dri_drivers.contains('nouveau')
with_dri_swrast = dri_drivers.contains('swrast')
Eric Engestrom's avatar
Eric Engestrom committed
183

184
with_dri = dri_drivers.length() != 0
Dylan Baker's avatar
Dylan Baker committed
185

186 187
gallium_drivers = get_option('gallium-drivers')
if gallium_drivers.contains('auto')
188
  if system_has_kms_drm
189 190
    # TODO: PPC, Sparc
    if ['x86', 'x86_64'].contains(host_machine.cpu_family())
191
      gallium_drivers = [
192 193
        'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'svga', 'swrast',
        'iris'
Dylan Baker's avatar
Dylan Baker committed
194
      ]
195
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
196
      gallium_drivers = [
197
        'kmsro', 'v3d', 'vc4', 'freedreno', 'etnaviv', 'nouveau',
198
        'tegra', 'virgl', 'lima', 'panfrost', 'swrast'
Dylan Baker's avatar
Dylan Baker committed
199
      ]
200
    else
201 202
      error('Unknown architecture @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
            host_machine.cpu_family()))
203
    endif
204
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
205
    gallium_drivers = ['swrast']
206
  else
207 208
    error('Unknown OS @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
209 210
  endif
endif
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
with_gallium_kmsro = gallium_drivers.contains('kmsro')
with_gallium_radeonsi = gallium_drivers.contains('radeonsi')
with_gallium_r300 = gallium_drivers.contains('r300')
with_gallium_r600 = gallium_drivers.contains('r600')
with_gallium_nouveau = gallium_drivers.contains('nouveau')
with_gallium_freedreno = gallium_drivers.contains('freedreno')
with_gallium_softpipe = gallium_drivers.contains('swrast')
with_gallium_vc4 = gallium_drivers.contains('vc4')
with_gallium_v3d = gallium_drivers.contains('v3d')
with_gallium_panfrost = gallium_drivers.contains('panfrost')
with_gallium_etnaviv = gallium_drivers.contains('etnaviv')
with_gallium_tegra = gallium_drivers.contains('tegra')
with_gallium_iris = gallium_drivers.contains('iris')
with_gallium_i915 = gallium_drivers.contains('i915')
with_gallium_svga = gallium_drivers.contains('svga')
with_gallium_virgl = gallium_drivers.contains('virgl')
with_gallium_swr = gallium_drivers.contains('swr')
with_gallium_lima = gallium_drivers.contains('lima')
229
with_gallium_zink = gallium_drivers.contains('zink')
Eric Engestrom's avatar
Eric Engestrom committed
230

231
with_gallium = gallium_drivers.length() != 0
Eric Engestrom's avatar
Eric Engestrom committed
232 233 234 235

if with_gallium and system_has_kms_drm
  _glx = get_option('glx')
  _egl = get_option('egl')
236
  if _glx == 'dri' or _egl == 'enabled' or (_glx == 'disabled' and _egl != 'disabled')
Eric Engestrom's avatar
Eric Engestrom committed
237
    with_dri = true
238
  endif
Ville Syrjälä's avatar
Ville Syrjälä committed
239 240
endif

241
_vulkan_drivers = get_option('vulkan-drivers')
Dylan Baker's avatar
Dylan Baker committed
242
if _vulkan_drivers.contains('auto')
243
  if system_has_kms_drm
244
    if host_machine.cpu_family().startswith('x86')
Dylan Baker's avatar
Dylan Baker committed
245
      _vulkan_drivers = ['amd', 'intel']
246 247
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
      _vulkan_drivers = []
248
    else
249 250
      error('Unknown architecture @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
            host_machine.cpu_family()))
251
    endif
252
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
253
    # No vulkan driver supports windows or macOS currently
254
    _vulkan_drivers = []
255
  else
256 257
    error('Unknown OS @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
258 259
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
260 261 262

with_intel_vk = _vulkan_drivers.contains('intel')
with_amd_vk = _vulkan_drivers.contains('amd')
263
with_freedreno_vk = _vulkan_drivers.contains('freedreno')
264
with_any_vk = _vulkan_drivers.length() != 0
265

Dylan Baker's avatar
Dylan Baker committed
266
if with_dri_swrast and (with_gallium_softpipe or with_gallium_swr)
Dylan Baker's avatar
Dylan Baker committed
267 268
  error('Only one swrast provider can be built')
endif
Dylan Baker's avatar
Dylan Baker committed
269 270 271
if with_dri_i915 and with_gallium_i915
  error('Only one i915 provider can be built')
endif
Eric Anholt's avatar
Eric Anholt committed
272
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)
273
  error('kmsro driver requires one or more renderonly drivers (vc4, etnaviv, freedreno, panfrost, lima)')
274
endif
Thierry Reding's avatar
Thierry Reding committed
275 276 277
if with_gallium_tegra and not with_gallium_nouveau
  error('tegra driver requires nouveau driver')
endif
Dylan Baker's avatar
Dylan Baker committed
278

279 280
if host_machine.system() == 'darwin'
  with_dri_platform = 'apple'
281
  pre_args += '-DBUILDING_MESA'
282 283
elif ['windows', 'cygwin'].contains(host_machine.system())
  with_dri_platform = 'windows'
myfreeweb's avatar
myfreeweb committed
284
elif system_has_kms_drm
285 286 287 288
  with_dri_platform = 'drm'
else
  # FIXME: haiku doesn't use dri, and xlib doesn't use dri, probably should
  # assert here that one of those cases has been met.
myfreeweb's avatar
myfreeweb committed
289
  # FIXME: illumos ends up here as well
290 291
  with_dri_platform = 'none'
endif
Dylan Baker's avatar
Dylan Baker committed
292

293
_platforms = get_option('platforms')
Dylan Baker's avatar
Dylan Baker committed
294
if _platforms.contains('auto')
myfreeweb's avatar
myfreeweb committed
295
  if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
296
    _platforms = ['x11', 'wayland', 'drm', 'surfaceless']
297
  elif ['darwin', 'cygwin'].contains(host_machine.system())
Dylan Baker's avatar
Dylan Baker committed
298
    _platforms = ['x11', 'surfaceless']
299
  elif ['haiku'].contains(host_machine.system())
Dylan Baker's avatar
Dylan Baker committed
300
    _platforms = ['haiku']
301 302
  elif host_machine.system() == 'windows'
    _platforms = ['windows']
Dylan Baker's avatar
Dylan Baker committed
303
  else
304 305
    error('Unknown OS @0@. Please pass -Dplatforms to set platforms. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
Dylan Baker's avatar
Dylan Baker committed
306 307
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
308 309 310 311 312 313 314

with_platform_android = _platforms.contains('android')
with_platform_x11 = _platforms.contains('x11')
with_platform_wayland = _platforms.contains('wayland')
with_platform_drm = _platforms.contains('drm')
with_platform_haiku = _platforms.contains('haiku')
with_platform_surfaceless = _platforms.contains('surfaceless')
315
with_platform_windows = _platforms.contains('windows')
Eric Engestrom's avatar
Eric Engestrom committed
316

317
if _platforms.length() != 0
Dylan Baker's avatar
Dylan Baker committed
318
  egl_native_platform = _platforms[0]
319 320
endif

321
_xlib_lease = get_option('xlib-lease')
322 323 324 325 326 327 328
if _xlib_lease == 'true'
  _xlib_lease = 'enabled'
  warning('xlib_lease option "true" deprecated, please use "enabled" instead.')
elif _xlib_lease == 'false'
  _xlib_lease = 'disabled'
  warning('xlib_lease option "false" deprecated, please use "disabled" instead.')
endif
329 330 331
if _xlib_lease == 'auto'
  with_xlib_lease = with_platform_x11 and with_platform_drm
else
332
  with_xlib_lease = _xlib_lease == 'enabled'
333 334
endif

Dylan Baker's avatar
Dylan Baker committed
335 336 337 338
with_glx = get_option('glx')
if with_glx == 'auto'
  if with_dri
    with_glx = 'dri'
339 340
  elif with_platform_haiku
    with_glx = 'disabled'
341 342
  elif host_machine.system() == 'windows'
    with_glx = 'disabled'
Dylan Baker's avatar
Dylan Baker committed
343
  elif with_gallium
344 345
    # Even when building just gallium drivers the user probably wants dri
    with_glx = 'dri'
Dylan Baker's avatar
Dylan Baker committed
346 347 348 349 350 351 352 353
  elif with_platform_x11 and with_any_opengl and not with_any_vk
    # The automatic behavior should not be to turn on xlib based glx when
    # building only vulkan drivers
    with_glx = 'xlib'
  else
    with_glx = 'disabled'
  endif
endif
354 355 356 357 358
if with_glx == 'dri'
   if with_gallium
      with_dri = true
   endif
endif
Dylan Baker's avatar
Dylan Baker committed
359

360
if not (with_dri or with_gallium or with_glx != 'disabled')
Dylan Baker's avatar
Dylan Baker committed
361 362 363 364 365 366 367
  with_gles1 = false
  with_gles2 = false
  with_opengl = false
  with_any_opengl = false
  with_shared_glapi = false
endif

368
_gbm = get_option('gbm')
369 370 371 372 373 374 375
if _gbm == 'true'
  _gbm = 'enabled'
  warning('gbm option "true" deprecated, please use "enabled" instead.')
elif _gbm == 'false'
  _gbm = 'disabled'
  warning('gbm option "false" deprecated, please use "disabled" instead.')
endif
376 377
if _gbm == 'auto'
  with_gbm = system_has_kms_drm and with_dri
Dylan Baker's avatar
Dylan Baker committed
378
else
379
  with_gbm = _gbm == 'enabled'
380 381 382
endif
if with_gbm and not system_has_kms_drm
  error('GBM only supports DRM/KMS platforms')
Dylan Baker's avatar
Dylan Baker committed
383 384
endif

Dylan Baker's avatar
Dylan Baker committed
385
_egl = get_option('egl')
386 387 388 389 390 391 392
if _egl == 'true'
  _egl = 'enabled'
  warning('egl option "true" deprecated, please use "enabled" instead.')
elif _egl == 'false'
  _egl = 'disabled'
  warning('egl option "false" deprecated, please use "disabled" instead.')
endif
Dylan Baker's avatar
Dylan Baker committed
393
if _egl == 'auto'
394 395
  with_egl = (
    not ['darwin', 'windows'].contains(host_machine.system()) and
396
    with_dri and with_shared_glapi and _platforms.length() != 0
397
  )
398
elif _egl == 'enabled'
Dylan Baker's avatar
Dylan Baker committed
399 400 401 402
  if not with_dri
    error('EGL requires dri')
  elif not with_shared_glapi
    error('EGL requires shared-glapi')
403
  elif _platforms.length() == 0
404
    error('No platforms specified, consider -Dplatforms=drm,x11,surfaceless at least')
405 406
  elif not ['disabled', 'dri'].contains(with_glx)
    error('EGL requires dri, but a GLX is being built without dri')
407 408
  elif ['darwin', 'windows'].contains(host_machine.system())
    error('EGL is not available on Windows or MacOS')
Dylan Baker's avatar
Dylan Baker committed
409 410 411 412 413 414
  endif
  with_egl = true
else
  with_egl = false
endif

415
if with_egl and not (with_platform_drm or with_platform_surfaceless or with_platform_android)
Dylan Baker's avatar
Dylan Baker committed
416
  if with_gallium_radeonsi
417
    error('RadeonSI requires the drm, surfaceless or android platform when using EGL')
Dylan Baker's avatar
Dylan Baker committed
418 419
  endif
  if with_gallium_virgl
420
    error('Virgl requires the drm, surfaceless or android platform when using EGL')
Dylan Baker's avatar
Dylan Baker committed
421
  endif
Dylan Baker's avatar
Dylan Baker committed
422 423
endif

424
# Android uses emutls for versions <= P/28. For USE_ELF_TLS we need ELF TLS.
425
if not ['windows', 'freebsd'].contains(host_machine.system()) and (not with_platform_android or get_option('platform-sdk-version') >= 29)
426
  pre_args += '-DUSE_ELF_TLS'
427 428
endif

Dylan Baker's avatar
Dylan Baker committed
429
if with_glx != 'disabled'
430
  if not (with_platform_x11 and with_any_opengl)
431
    error('Cannot build GLX support without X11 platform support and at least one OpenGL API')
432
  elif with_glx == 'gallium-xlib'
Dylan Baker's avatar
Dylan Baker committed
433 434
    if not with_gallium
      error('Gallium-xlib based GLX requires at least one gallium driver')
435 436
    elif not with_gallium_softpipe
      error('Gallium-xlib based GLX requires softpipe or llvmpipe.')
Dylan Baker's avatar
Dylan Baker committed
437 438 439
    elif with_dri
      error('gallium-xlib conflicts with any dri driver')
    endif
440
  elif with_glx == 'xlib'
Dylan Baker's avatar
Dylan Baker committed
441
    if with_dri
Dylan Baker's avatar
Dylan Baker committed
442
      error('xlib conflicts with any dri driver')
Dylan Baker's avatar
Dylan Baker committed
443
    endif
444
  elif with_glx == 'dri'
445
    if not with_shared_glapi
446 447
      error('dri based GLX requires shared-glapi')
    endif
Dylan Baker's avatar
Dylan Baker committed
448 449 450 451
  endif
endif

with_glvnd = get_option('glvnd')
452
if with_glvnd
453 454 455
  if with_platform_windows
    error('glvnd cannot be used on Windows')
  elif with_glx == 'xlib' or with_glx == 'gallium-xlib'
456 457 458 459
    error('Cannot build glvnd support for GLX that is not DRI based.')
  elif with_glx == 'disabled' and not with_egl
    error('glvnd requires DRI based GLX and/or EGL')
  endif
460 461 462
  if get_option('egl-lib-suffix') != ''
    error('''EGL lib suffix can't be used with libglvnd''')
  endif
Dylan Baker's avatar
Dylan Baker committed
463 464
endif

465 466 467 468
if with_vulkan_icd_dir == ''
  with_vulkan_icd_dir = join_paths(get_option('datadir'), 'vulkan/icd.d')
endif

469
# GNU/Hurd includes egl_dri2, without drm.
470 471
with_dri2 = (with_dri or with_any_vk) and (with_dri_platform == 'drm' or
  host_machine.system() == 'gnu')
472
_dri3 = get_option('dri3')
473 474 475 476 477 478 479
if _dri3 == 'true'
  _dri3 = 'enabled'
  warning('dri3 option "true" deprecated, please use "enabled" instead.')
elif _dri3 == 'false'
  _dri3 = 'disabled'
  warning('dri3 option "false" deprecated, please use "disabled" instead.')
endif
480
if _dri3 == 'auto'
Eric Engestrom's avatar
Eric Engestrom committed
481
  with_dri3 = system_has_kms_drm and with_dri2
482
else
483
  with_dri3 = _dri3 == 'enabled'
484 485 486 487 488
endif

if with_any_vk and (with_platform_x11 and not with_dri3)
  error('Vulkan drivers require dri3 for X11 support')
endif
489
if with_dri
490 491
  if with_glx == 'disabled' and not with_egl and not with_gbm and with_osmesa != 'classic'
    error('building dri drivers require at least one windowing system or classic osmesa')
Dylan Baker's avatar
Dylan Baker committed
492
  endif
493 494
endif

495
_vdpau = get_option('gallium-vdpau')
496 497 498 499 500 501 502
if _vdpau == 'true'
  _vdpau = 'enabled'
  warning('gallium-vdpau option "true" deprecated, please use "enabled" instead.')
elif _vdpau == 'false'
  _vdpau = 'disabled'
  warning('gallium-vdpau option "false" deprecated, please use "disabled" instead.')
endif
503
if not system_has_kms_drm
504
  if _vdpau == 'enabled'
505
    error('VDPAU state tracker can only be build on unix-like OSes.')
506
  else
507
    _vdpau = 'disabled'
508
  endif
509
elif not with_platform_x11
510
  if _vdpau == 'enabled'
511
    error('VDPAU state tracker requires X11 support.')
512
  else
513
    _vdpau = 'disabled'
514 515 516
  endif
elif not (with_gallium_r300 or with_gallium_r600 or with_gallium_radeonsi or
          with_gallium_nouveau)
517
  if _vdpau == 'enabled'
518
    error('VDPAU state tracker requires at least one of the following gallium drivers: r300, r600, radeonsi, nouveau.')
519
  else
520
    _vdpau = 'disabled'
521 522
  endif
endif
523
dep_vdpau = null_dep
524
with_gallium_vdpau = false
525 526
if _vdpau != 'disabled'
  dep_vdpau = dependency('vdpau', version : '>= 1.1', required : _vdpau == 'enabled')
527
  if dep_vdpau.found()
528
    dep_vdpau = dep_vdpau.partial_dependency(compile_args : true)
529 530
    with_gallium_vdpau = true
  endif
531 532 533 534 535 536 537 538 539 540
endif

if with_gallium_vdpau
  pre_args += '-DHAVE_ST_VDPAU'
endif
vdpau_drivers_path = get_option('vdpau-libs-path')
if vdpau_drivers_path == ''
  vdpau_drivers_path = join_paths(get_option('libdir'), 'vdpau')
endif

541 542 543 544
if with_gallium_zink
  dep_vulkan = dependency('vulkan')
endif

545
_xvmc = get_option('gallium-xvmc')
546 547 548 549 550 551 552
if _xvmc == 'true'
  _xvmc = 'enabled'
  warning('gallium-xvmc option "true" deprecated, please use "enabled" instead.')
elif _xvmc == 'false'
  _xvmc = 'disabled'
  warning('gallium-xvmc option "false" deprecated, please use "disabled" instead.')
endif
553
if not system_has_kms_drm
554
  if _xvmc == 'enabled'
555
    error('XVMC state tracker can only be build on unix-like OSes.')
556
  else
557
    _xvmc = 'disabled'
558
  endif
559
elif not with_platform_x11
560
  if _xvmc == 'enabled'
561
    error('XVMC state tracker requires X11 support.')
562
  else
563
    _xvmc = 'disabled'
564 565
  endif
elif not (with_gallium_r600 or with_gallium_nouveau)
566
  if _xvmc == 'enabled'
567
    error('XVMC state tracker requires at least one of the following gallium drivers: r600, nouveau.')
568
  else
569
    _xvmc = 'disabled'
570 571
  endif
endif
572
dep_xvmc = null_dep
Dylan Baker's avatar
Dylan Baker committed
573
dep_xv = null_dep
Dylan Baker's avatar
Dylan Baker committed
574
with_gallium_xvmc = false
575 576 577
if _xvmc != 'disabled'
  dep_xvmc = dependency('xvmc', version : '>= 1.0.6', required : _xvmc == 'enabled')
  dep_xv = dependency('xv', required : _xvmc == 'enabled')
Dylan Baker's avatar
Dylan Baker committed
578
  with_gallium_xvmc = dep_xvmc.found() and dep_xv.found()
579 580 581 582 583 584 585
endif

xvmc_drivers_path = get_option('xvmc-libs-path')
if xvmc_drivers_path == ''
  xvmc_drivers_path = get_option('libdir')
endif

586
_omx = get_option('gallium-omx')
587
if not system_has_kms_drm
588
  if ['auto', 'disabled'].contains(_omx)
589
    _omx = 'disabled'
590 591
  else
    error('OMX state tracker can only be built on unix-like OSes.')
592
  endif
593
elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
594
  if ['auto', 'disabled'].contains(_omx)
595
    _omx = 'disabled'
596 597
  else
    error('OMX state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
598
  endif
599
endif
600 601
with_gallium_omx = _omx
dep_omx = null_dep
602
dep_omx_other = []
Mathias Fröhlich's avatar
Mathias Fröhlich committed
603
if ['auto', 'bellagio'].contains(_omx)
604
  dep_omx = dependency(
Mathias Fröhlich's avatar
Mathias Fröhlich committed
605
    'libomxil-bellagio', required : _omx == 'bellagio'
606 607 608 609 610
  )
  if dep_omx.found()
    with_gallium_omx = 'bellagio'
  endif
endif
Mathias Fröhlich's avatar
Mathias Fröhlich committed
611 612
if ['auto', 'tizonia'].contains(_omx)
  if with_dri and with_egl
613 614
    dep_omx = dependency(
      'libtizonia', version : '>= 0.10.0',
Mathias Fröhlich's avatar
Mathias Fröhlich committed
615
      required : _omx == 'tizonia',
616 617
    )
    dep_omx_other = [
Mathias Fröhlich's avatar
Mathias Fröhlich committed
618 619
      dependency('libtizplatform', required : _omx == 'tizonia'),
      dependency('tizilheaders', required : _omx == 'tizonia'),
620 621 622 623
    ]
    if dep_omx.found() and dep_omx_other[0].found() and dep_omx_other[1].found()
      with_gallium_omx = 'tizonia'
    endif
Mathias Fröhlich's avatar
Mathias Fröhlich committed
624 625
  elif _omx == 'tizonia'
    error('OMX-Tizonia state tracker requires dri and egl')
626
  endif
627
endif
Mathias Fröhlich's avatar
Mathias Fröhlich committed
628 629 630 631 632
if _omx == 'auto'
  with_gallium_omx = 'disabled'
else
  with_gallium_omx = _omx
endif
633

634 635 636 637 638 639
pre_args += [
  '-DENABLE_ST_OMX_BELLAGIO=' + (with_gallium_omx == 'bellagio' ? '1' : '0'),
  '-DENABLE_ST_OMX_TIZONIA=' + (with_gallium_omx == 'tizonia' ? '1' : '0'),
]


640
omx_drivers_path = get_option('omx-libs-path')
641

642
if with_gallium_omx != 'disabled'
643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665
  # Figure out where to put the omx driver.
  # FIXME: this could all be vastly simplified by adding a 'defined_variable'
  # argument to meson's get_pkgconfig_variable method.
  if omx_drivers_path == ''
    _omx_libdir = dep_omx.get_pkgconfig_variable('libdir')
    _omx_drivers_dir = dep_omx.get_pkgconfig_variable('pluginsdir')
    if _omx_libdir == get_option('libdir')
      omx_drivers_path = _omx_drivers_dir
    else
      _omx_base_dir = []
      # This will fail on windows. Does OMX run on windows?
      _omx_libdir = _omx_libdir.split('/')
      _omx_drivers_dir = _omx_drivers_dir.split('/')
      foreach o : _omx_drivers_dir
        if not _omx_libdir.contains(o)
          _omx_base_dir += o
        endif
      endforeach
      omx_drivers_path = join_paths(get_option('libdir'), _omx_base_dir)
    endif
  endif
endif

666
_va = get_option('gallium-va')
667 668 669 670 671 672 673
if _va == 'true'
  _va = 'enabled'
  warning('gallium-va option "true" deprecated, please use "enabled" instead.')
elif _va == 'false'
  _va = 'disabled'
  warning('gallium-va option "false" deprecated, please use "disabled" instead.')
endif
Eric Engestrom's avatar
Eric Engestrom committed
674
if not system_has_kms_drm
675
  if _va == 'enabled'
Eric Engestrom's avatar
Eric Engestrom committed
676
    error('VA state tracker can only be built on unix-like OSes.')
677
  else
678
    _va = 'disabled'
679
  endif
Eric Engestrom's avatar
Eric Engestrom committed
680
elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
681
  if _va == 'enabled'
682
    error('VA state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
Eric Engestrom's avatar
Eric Engestrom committed
683
  else
684
    _va = 'disabled'
685 686
  endif
endif
Dylan Baker's avatar
Dylan Baker committed
687
with_gallium_va = false
688
dep_va = null_dep
689 690
if _va != 'disabled'
  dep_va = dependency('libva', version : '>= 0.38.0', required : _va == 'enabled')
Dylan Baker's avatar
Dylan Baker committed
691
  if dep_va.found()
692
    dep_va_headers = dep_va.partial_dependency(compile_args : true)
Dylan Baker's avatar
Dylan Baker committed
693 694
    with_gallium_va = true
  endif
695 696 697 698 699 700 701
endif

va_drivers_path = get_option('va-libs-path')
if va_drivers_path == ''
  va_drivers_path = join_paths(get_option('libdir'), 'dri')
endif

702
_xa = get_option('gallium-xa')
703 704 705 706 707 708 709
if _xa == 'true'
  _xa = 'enabled'
  warning('gallium-xa option "true" deprecated, please use "enabled" instead.')
elif _xa == 'false'
  _xa = 'disabled'
  warning('gallium-xa option "false" deprecated, please use "disabled" instead.')
endif
Eric Engestrom's avatar
Eric Engestrom committed
710
if not system_has_kms_drm
711
  if _xa == 'enabled'
Eric Engestrom's avatar
Eric Engestrom committed
712
    error('XA state tracker can only be built on unix-like OSes.')
713
  else
714
    _xa = 'disabled'
715
  endif
Eric Engestrom's avatar
Eric Engestrom committed
716 717
elif not (with_gallium_nouveau or with_gallium_freedreno or with_gallium_i915
          or with_gallium_svga)
718
  if _xa == 'enabled'
719
    error('XA state tracker requires at least one of the following gallium drivers: nouveau, freedreno, i915, svga.')
Eric Engestrom's avatar
Eric Engestrom committed
720
  else
721
    _xa = 'disabled'
722 723
  endif
endif
724
with_gallium_xa = _xa != 'disabled'
725

726 727
d3d_drivers_path = get_option('d3d-drivers-path')
if d3d_drivers_path == ''
728
  d3d_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'd3d')
729 730 731 732 733 734 735
endif

with_gallium_st_nine =  get_option('gallium-nine')
if with_gallium_st_nine
  if not with_gallium_softpipe
    error('The nine state tracker requires gallium softpipe/llvmpipe.')
  elif not (with_gallium_radeonsi or with_gallium_nouveau or with_gallium_r600
736 737
            or with_gallium_r300 or with_gallium_svga or with_gallium_i915
            or with_gallium_iris)
Vinson Lee's avatar
Vinson Lee committed
738
    error('The nine state tracker requires at least one non-swrast gallium driver.')
739 740 741 742 743
  endif
  if not with_dri3
    error('Using nine with wine requires dri3')
  endif
endif
744 745 746 747 748 749 750 751 752
_power8 = get_option('power8')
if _power8 == 'true'
  _power8 = 'enabled'
  warning('power8 option "true" deprecated, please use "enabled" instead.')
elif _power8 == 'disabled'
  _power8 = 'disabled'
  warning('power8 option "false" deprecated, please use "disabled" instead.')
endif
if _power8 != 'disabled'
753 754
  # on old versions of meson the cpu family would return as ppc64le on little
  # endian power8, this was changed in 0.48 such that the family would always
755
  # be ppc64 regardless of endianness, and then the machine.endian() value
756 757 758
  # should be checked. Since we support versions < 0.48 we need to use
  # startswith.
  if host_machine.cpu_family().startswith('ppc64') and host_machine.endian() == 'little'
759 760 761 762 763 764 765 766 767 768 769 770 771 772
    if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.8')
      error('Altivec is not supported with gcc version < 4.8.')
    endif
    if cc.compiles('''
        #include <altivec.h>
        int main() {
          vector unsigned char r;
          vector unsigned int v = vec_splat_u32 (1);
          r = __builtin_vec_vgbbd ((vector unsigned char) v);
          return 0;
        }''',
        args : '-mpower8-vector',
        name : 'POWER8 intrinsics')
      pre_args += ['-D_ARCH_PWR8', '-mpower8-vector']
773
    elif get_option('power8') == 'enabled'
774 775 776 777 778
      error('POWER8 intrinsic support required but not found.')
    endif
  endif
endif

Dylan Baker's avatar
Dylan Baker committed
779
_opencl = get_option('gallium-opencl')
Dylan Baker's avatar
Dylan Baker committed
780
if _opencl != 'disabled'
Dylan Baker's avatar
Dylan Baker committed
781 782 783 784 785 786 787
  if not with_gallium
    error('OpenCL Clover implementation requires at least one gallium driver.')
  endif

  dep_clc = dependency('libclc')
  with_gallium_opencl = true
  with_opencl_icd = _opencl == 'icd'
788

789 790 791 792 793 794 795 796 797
  with_opencl_spirv = get_option('opencl-spirv')
  if with_opencl_spirv
    dep_spirv_tools = dependency('SPIRV-Tools', required : true, version : '>= 2018.0')
    # LLVMSPIRVLib is available at https://github.com/KhronosGroup/SPIRV-LLVM-Translator
    dep_llvmspirvlib = dependency('LLVMSPIRVLib', required : true, version : '>= 0.2.1')
  else
    dep_spirv_tools = null_dep
    dep_llvmspirvlib = null_dep
  endif
Dylan Baker's avatar
Dylan Baker committed
798
else
799
  dep_clc = null_dep
800 801
  dep_spirv_tools = null_dep
  dep_llvmspirvlib = null_dep
Dylan Baker's avatar
Dylan Baker committed
802
  with_gallium_opencl = false
803
  with_opencl_icd = false
804
  with_opencl_spirv = false
Dylan Baker's avatar
Dylan Baker committed
805 806
endif

Dylan Baker's avatar
Dylan Baker committed
807
gl_pkgconfig_c_flags = []
808
if with_platform_x11
809
  if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm')
810 811
    pre_args += '-DHAVE_X11_PLATFORM'
  endif
812
  if with_glx == 'xlib' or with_glx == 'gallium-xlib'
Dylan Baker's avatar
Dylan Baker committed
813
    pre_args += '-DUSE_XSHM'
814 815 816 817 818 819 820
  else
    pre_args += '-DGLX_INDIRECT_RENDERING'
    if with_glx_direct
      pre_args += '-DGLX_DIRECT_RENDERING'
    endif
    if with_dri_platform == 'drm'
      pre_args += '-DGLX_USE_DRM'
Dylan Baker's avatar
Dylan Baker committed
821 822
    elif with_dri_platform == 'apple'
      pre_args += '-DGLX_USE_APPLEGL'
Jon Turney's avatar
Jon Turney committed
823 824
    elif with_dri_platform == 'windows'
      pre_args += '-DGLX_USE_WINDOWSGL'
825 826
    endif
  endif
Dylan Baker's avatar
Dylan Baker committed
827
else
828 829
  pre_args += '-DEGL_NO_X11'
  gl_pkgconfig_c_flags += '-DEGL_NO_X11'
Dylan Baker's avatar
Dylan Baker committed
830 831 832 833 834 835 836 837 838
endif
if with_platform_drm
  if with_egl and not with_gbm
    error('EGL drm platform requires gbm')
  endif
  pre_args += '-DHAVE_DRM_PLATFORM'
endif
if with_platform_surfaceless
  pre_args += '-DHAVE_SURFACELESS_PLATFORM'
839
endif
Eric Engestrom's avatar
Eric Engestrom committed
840 841 842 843 844 845
if with_platform_android
  dep_android = [
    dependency('cutils'),
    dependency('hardware'),
    dependency('sync'),
  ]
846 847 848
  if with_gallium
    dep_android += dependency('backtrace')
  endif
849 850 851
  if get_option('platform-sdk-version') >= 26
    dep_android += dependency('nativewindow')
  endif
Eric Engestrom's avatar
Eric Engestrom committed
852 853
  pre_args += '-DHAVE_ANDROID_PLATFORM'
endif
854 855 856
if with_platform_haiku
  pre_args += '-DHAVE_HAIKU_PLATFORM'
endif
857

858
prog_python = import('python').find_installation('python3')
859 860 861 862 863 864 865
has_mako = run_command(
  prog_python, '-c',
  '''
from distutils.version import StrictVersion
import mako
assert StrictVersion(mako.__version__) > StrictVersion("0.8.0")
  ''')
Dylan Baker's avatar
Dylan Baker committed
866
if has_mako.returncode() != 0
867
  error('Python (3.x) mako module >= 0.8.0 required to build mesa.')
Dylan Baker's avatar
Dylan Baker committed
868
endif
869 870

if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.4.6')
871
  error('When using GCC, version 4.4.6 or later is required.')
872 873
endif

874 875 876 877 878
# Support systems without ETIME (e.g. FreeBSD)
if cc.get_define('ETIME', prefix : '#include <errno.h>') == ''
  pre_args += '-DETIME=ETIMEDOUT'
endif

879 880
# Define DEBUG for debug builds only (debugoptimized is not included on this one)
if get_option('buildtype') == 'debug'
881 882 883
  pre_args += '-DDEBUG'
endif

884 885
with_shader_cache = false
_shader_cache = get_option('shader-cache')
886 887 888 889 890 891 892 893
if _shader_cache == 'true'
  _shader_cache = 'enabled'
  warning('shader_cache option "true" deprecated, please use "enabled" instead.')
elif _shader_cache == 'false'
  _shader_cache = 'disabled'
  warning('shader_cache option "false" deprecated, please use "disabled" instead.')
endif
if _shader_cache != 'disabled'
894
  if host_machine.system() == 'windows'
895
    if _shader_cache == 'enabled'
896 897 898 899 900 901 902
      error('Shader Cache does not currently work on Windows')
    endif
  else
    pre_args += '-DENABLE_SHADER_CACHE'
    with_shader_cache = true
  endif
endif
903

904 905 906 907 908 909 910 911
# Check for GCC style builtins
foreach b : ['bswap32', 'bswap64', 'clz', 'clzll', 'ctz', 'expect', 'ffs',
             'ffsll', 'popcount', 'popcountll', 'unreachable']
  if cc.has_function(b)
    pre_args += '-DHAVE___BUILTIN_@0@'.format(b.to_upper())
  endif
endforeach

912
# check for GCC __attribute__
913 914 915 916 917 918
_attributes = [
  'const', 'flatten', 'malloc', 'pure', 'unused', 'warn_unused_result',
  'weak', 'format', 'packed', 'returns_nonnull', 'alias', 'noreturn',
]
foreach a : cc.get_supported_function_attributes(_attributes)
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_@0@'.format(a.to_upper())
919
endforeach
920
if cc.has_function_attribute('visibility:hidden')
921
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_VISIBILITY'
922
endif
923 924 925 926
if cc.compiles('__uint128_t foo(void) { return 0; }',
               name : '__uint128_t')
  pre_args += '-DHAVE_UINT128'
endif
927 928

# TODO: this is very incomplete
929
if ['linux', 'cygwin', 'gnu', 'freebsd', 'gnu/kfreebsd'].contains(host_machine.system())
930
  pre_args += '-D_GNU_SOURCE'
931 932
elif host_machine.system() == 'sunos'
  pre_args += '-D__EXTENSIONS__'
933 934
elif host_machine.system() == 'windows'
  pre_args += [
935
    '-D_WINDOWS', '-D_WIN32_WINNT=0x0601', '-DWINVER=0x0601',
936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951
    '-DPIPE_SUBSYSTEM_WINDOWS_USER',
    '-D_USE_MATH_DEFINES',  # XXX: scons doesn't use this for mingw
  ]
  if cc.get_id() == 'msvc'
    pre_args += [
      '-DVC_EXTRALEAN',
      '-D_CRT_SECURE_NO_WARNINGS',
      '-D_CRT_SECURE_NO_DEPRECATE',
      '-D_SCL_SECURE_NO_WARNINGS',
      '-D_SCL_SECURE_NO_DEPRECATE',
      '-D_ALLOW_KEYWORD_MACROS',
      '-D_HAS_EXCEPTIONS=0', # Tell C++ STL to not use exceptions
    ]
  else
    pre_args += ['-D__MSVCRT_VERSION__=0x0700']
  endif
952 953
endif

954
# Check for generic C arguments
955
c_args = []
956 957
c_msvc_compat_args = []
no_override_init_args = []
958
cpp_args = []
959 960 961 962 963 964 965 966 967 968 969
cpp_msvc_compat_args = []
if cc.get_id() == 'msvc'
  foreach a : ['/wd4018',  # signed/unsigned mismatch
               '/wd4056',  # overflow in floating-point constant arithmetic
               '/wd4244',  # conversion from 'type1' to 'type2', possible loss of data
               '/wd4267',  # 'var' : conversion from 'size_t' to 'type', possible loss of data
               '/wd4305',  # trancation from 'type1' to 'type2'
               '/wd4351',  # new behavior: elements of array 'array' will be default initialized
               '/wd4756',  # overflow in constant arithmetic
               '/wd4800',  # forcing value to bool 'true' or 'false' (performance warning)
               '/wd4996',  # disabled deprecated POSIX name warnings
970 971
               '/wd4291',  # no matching operator delete found
               '/wd4146',  # unary minus operator applied to unsigned type, result still unsigned
972 973 974
               '/wd4200',  # nonstandard extension used: zero-sized array in struct/union
               '/wd4624',  # destructor was implicitly defined as deleted [from LLVM]
              ]
975 976 977 978 979 980 981 982 983 984
    if cc.has_argument(a)
      c_args += a
    endif
    if cpp.has_argument(a)
      cpp_args += a
    endif
  endforeach
  if cc.has_argument('-Wmicrosoft-enum-value')  # Clang
    c_args += '-Wno-microsoft-enum-value'
    cpp_args += '-Wno-microsoft-enum-value'
985
  endif
986
else
987 988 989 990
  _trial = [
    '-Werror=implicit-function-declaration',
    '-Werror=missing-prototypes',
    '-Werror=return-type',
991
    '-Werror=empty-body',
992
    '-Werror=incompatible-pointer-types',