meson.build 45.4 KB
Newer Older
1
# Copyright © 2017-2018 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 25 26
  version : run_command(
    [find_program('python', 'python2', 'python3'), 'bin/meson_get_version.py']
  ).stdout(),
27
  license : 'MIT',
28 29
  meson_version : '>= 0.45',
  default_options : ['buildtype=debugoptimized', 'b_ndebug=if-release', 'c_std=c99', 'cpp_std=c++11']
30
)
31

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

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

37 38
system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'dragonfly', 'linux'].contains(host_machine.system())

39 40 41 42 43 44 45 46 47 48 49 50
# 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',
  '-DVERSION="@0@"'.format(meson.project_version()),
  '-DPACKAGE_VERSION=VERSION',
  '-DPACKAGE_BUGREPORT="https://bugs.freedesktop.org/enter_bug.cgi?product=Mesa"',
]

51
with_vulkan_icd_dir = get_option('vulkan-icd-dir')
52 53
with_tests = get_option('build-tests')
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_osmesa = get_option('osmesa')
58 59
with_swr_arches = get_option('swr-arches')
with_tools = get_option('tools')
60
if with_tools.contains('all')
61
  with_tools = ['freedreno', 'glsl', 'intel', 'nir', 'nouveau', 'xvmc']
62
endif
63

64 65 66 67
dri_drivers_path = get_option('dri-drivers-path')
if dri_drivers_path == ''
  dri_drivers_path = join_paths(get_option('libdir'), 'dri')
endif
68 69 70 71
dri_search_path = get_option('dri-search-path')
if dri_search_path == ''
  dri_search_path = join_paths(get_option('prefix'), dri_drivers_path)
endif
72

73 74 75 76
with_gles1 = get_option('gles1')
with_gles2 = get_option('gles2')
with_opengl = get_option('opengl')
with_any_opengl = with_opengl or with_gles1 or with_gles2
Dylan Baker's avatar
Dylan Baker committed
77 78
# Only build shared_glapi if at least one OpenGL API is enabled
with_shared_glapi = get_option('shared-glapi') and with_any_opengl
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93


# shared-glapi is required if at least two OpenGL APIs are being built
if not with_shared_glapi
  if ((with_gles1 and with_gles2) or (with_gles1 and with_opengl)
      or (with_gles2 and with_opengl))
    error('shared-glapi required for building two or more of OpenGL, OpenGL ES 1.x, OpenGL ES 2.x')
  endif
endif

# We require OpenGL for OpenGL ES
if (with_gles1 or with_gles2) and not with_opengl
  error('building OpenGL ES without OpenGL is not supported.')
endif

94 95
system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'dragonfly', 'linux'].contains(host_machine.system())

96
_drivers = get_option('dri-drivers')
97
if _drivers.contains('auto')
98
  if system_has_kms_drm
99
    # TODO: PPC, Sparc
100
    if ['x86', 'x86_64'].contains(host_machine.cpu_family())
101
      _drivers = ['i915', 'i965', 'r100', 'r200', 'nouveau']
102
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
103
      _drivers = []
104
    else
105 106
      error('Unknown architecture @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format(
            host_machine.cpu_family()))
107
    endif
108
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
109
    # only swrast would make sense here, but gallium swrast is a much better default
110
    _drivers = []
111
  else
112 113
    error('Unknown OS @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
114 115
  endif
endif
116 117 118 119 120 121 122 123 124

with_dri_i915 = _drivers.contains('i915')
with_dri_i965 = _drivers.contains('i965')
with_dri_r100 = _drivers.contains('r100')
with_dri_r200 = _drivers.contains('r200')
with_dri_nouveau = _drivers.contains('nouveau')
with_dri_swrast = _drivers.contains('swrast')

with_dri = _drivers.length() != 0 and _drivers != ['']
125

126
_drivers = get_option('gallium-drivers')
127
if _drivers.contains('auto')
128
  if system_has_kms_drm
129 130
    # TODO: PPC, Sparc
    if ['x86', 'x86_64'].contains(host_machine.cpu_family())
131 132 133
      _drivers = [
        'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'svga', 'swrast'
      ]
134
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
135
      _drivers = [
136
        'pl111', 'v3d', 'vc4', 'freedreno', 'etnaviv', 'imx', 'nouveau',
137 138
        'tegra', 'virgl', 'swrast',
      ]
139
    else
140 141
      error('Unknown architecture @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
            host_machine.cpu_family()))
142
    endif
143
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
144
    _drivers = ['swrast']
145
  else
146 147
    error('Unknown OS @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
148 149
  endif
endif
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
with_gallium_pl111 = _drivers.contains('pl111')
with_gallium_radeonsi = _drivers.contains('radeonsi')
with_gallium_r300 = _drivers.contains('r300')
with_gallium_r600 = _drivers.contains('r600')
with_gallium_nouveau = _drivers.contains('nouveau')
with_gallium_freedreno = _drivers.contains('freedreno')
with_gallium_softpipe = _drivers.contains('swrast')
with_gallium_vc4 = _drivers.contains('vc4')
with_gallium_v3d = _drivers.contains('v3d')
with_gallium_etnaviv = _drivers.contains('etnaviv')
with_gallium_imx = _drivers.contains('imx')
with_gallium_tegra = _drivers.contains('tegra')
with_gallium_i915 = _drivers.contains('i915')
with_gallium_svga = _drivers.contains('svga')
with_gallium_virgl = _drivers.contains('virgl')
with_gallium_swr = _drivers.contains('swr')

with_gallium = _drivers.length() != 0 and _drivers != ['']

if with_gallium and system_has_kms_drm
  _glx = get_option('glx')
  _egl = get_option('egl')
  if _glx == 'dri' or _egl == 'true' or (_glx == 'disabled' and _egl != 'false')
    with_dri = true
174
  endif
Ville Syrjälä's avatar
Ville Syrjälä committed
175 176
endif

177
_vulkan_drivers = get_option('vulkan-drivers')
178
if _vulkan_drivers.contains('auto')
179
  if system_has_kms_drm
180
    if host_machine.cpu_family().startswith('x86')
181
      _vulkan_drivers = ['amd', 'intel']
182 183
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
      _vulkan_drivers = []
184
    else
185 186
      error('Unknown architecture @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
            host_machine.cpu_family()))
187
    endif
188
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
189
    # No vulkan driver supports windows or macOS currently
190
    _vulkan_drivers = []
191
  else
192 193
    error('Unknown OS @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
194 195
  endif
endif
196 197 198 199

with_intel_vk = _vulkan_drivers.contains('intel')
with_amd_vk = _vulkan_drivers.contains('amd')
with_any_vk = _vulkan_drivers.length() != 0 and _vulkan_drivers != ['']
200

Dylan Baker's avatar
Dylan Baker committed
201
if with_dri_swrast and (with_gallium_softpipe or with_gallium_swr)
Dylan Baker's avatar
Dylan Baker committed
202 203
  error('Only one swrast provider can be built')
endif
Dylan Baker's avatar
Dylan Baker committed
204 205 206
if with_dri_i915 and with_gallium_i915
  error('Only one i915 provider can be built')
endif
Dylan Baker's avatar
Dylan Baker committed
207 208 209
if with_gallium_imx and not with_gallium_etnaviv
  error('IMX driver requires etnaviv driver')
endif
210 211 212
if with_gallium_pl111 and not with_gallium_vc4
  error('pl111 driver requires vc4 driver')
endif
Thierry Reding's avatar
Thierry Reding committed
213 214 215
if with_gallium_tegra and not with_gallium_nouveau
  error('tegra driver requires nouveau driver')
endif
Dylan Baker's avatar
Dylan Baker committed
216

217 218 219 220
if host_machine.system() == 'darwin'
  with_dri_platform = 'apple'
elif ['windows', 'cygwin'].contains(host_machine.system())
  with_dri_platform = 'windows'
Greg V's avatar
Greg V committed
221
elif system_has_kms_drm
222 223 224 225 226 227
  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.
  # FIXME: GNU (hurd) ends up here as well, but meson doesn't officially
  # support Hurd at time of writing (2017/11)
Greg V's avatar
Greg V committed
228
  # FIXME: illumos ends up here as well
229 230
  with_dri_platform = 'none'
endif
Dylan Baker's avatar
Dylan Baker committed
231

232
_platforms = get_option('platforms')
233
if _platforms.contains('auto')
Greg V's avatar
Greg V committed
234
  if system_has_kms_drm
235
    _platforms = ['x11', 'wayland', 'drm', 'surfaceless']
236
  elif ['darwin', 'windows', 'cygwin'].contains(host_machine.system())
237
    _platforms = ['x11', 'surfaceless']
238
  elif ['haiku'].contains(host_machine.system())
239
    _platforms = ['haiku']
240
  else
241 242
    error('Unknown OS @0@. Please pass -Dplatforms to set platforms. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
243 244
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
245 246 247 248 249 250 251 252 253 254 255

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')

with_platforms = false
if _platforms.length() != 0 and _platforms != ['']
  with_platforms = true
256
  egl_native_platform = _platforms[0]
257 258
endif

259 260 261 262 263 264 265
_xlib_lease = get_option('xlib-lease')
if _xlib_lease == 'auto'
  with_xlib_lease = with_platform_x11 and with_platform_drm
else
  with_xlib_lease = _xlib_lease == 'true'
endif

266 267 268 269
with_glx = get_option('glx')
if with_glx == 'auto'
  if with_dri
    with_glx = 'dri'
270 271
  elif with_platform_haiku
    with_glx = 'disabled'
272
  elif with_gallium
273 274
    # Even when building just gallium drivers the user probably wants dri
    with_glx = 'dri'
275 276 277 278 279 280 281 282
  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
283 284 285 286 287
if with_glx == 'dri'
   if with_gallium
      with_dri = true
   endif
endif
288

289
if not (with_dri or with_gallium or with_glx == 'xlib' or with_glx == 'gallium-xlib')
290 291 292 293 294 295 296
  with_gles1 = false
  with_gles2 = false
  with_opengl = false
  with_any_opengl = false
  with_shared_glapi = false
endif

297 298 299
_gbm = get_option('gbm')
if _gbm == 'auto'
  with_gbm = system_has_kms_drm and with_dri
Dylan Baker's avatar
Dylan Baker committed
300
else
301 302 303 304
  with_gbm = _gbm == 'true'
endif
if with_gbm and not system_has_kms_drm
  error('GBM only supports DRM/KMS platforms')
Dylan Baker's avatar
Dylan Baker committed
305 306
endif

Dylan Baker's avatar
Dylan Baker committed
307 308
_egl = get_option('egl')
if _egl == 'auto'
309 310 311 312
  with_egl = (
    not ['darwin', 'windows'].contains(host_machine.system()) and
    with_dri and with_shared_glapi and with_platforms
  )
313
elif _egl == 'true'
Dylan Baker's avatar
Dylan Baker committed
314 315 316 317
  if not with_dri
    error('EGL requires dri')
  elif not with_shared_glapi
    error('EGL requires shared-glapi')
318
  elif not with_platforms
319
    error('No platforms specified, consider -Dplatforms=drm,x11,surfaceless at least')
320 321
  elif not ['disabled', 'dri'].contains(with_glx)
    error('EGL requires dri, but a GLX is being built without dri')
322 323
  elif ['darwin', 'windows'].contains(host_machine.system())
    error('EGL is not available on Windows or MacOS')
Dylan Baker's avatar
Dylan Baker committed
324 325 326 327 328 329
  endif
  with_egl = true
else
  with_egl = false
endif

Dylan Baker's avatar
Dylan Baker committed
330 331 332 333 334 335 336
if with_egl and not (with_platform_drm or with_platform_surfaceless)
  if with_gallium_radeonsi
    error('RadeonSI requires drm or surfaceless platform when using EGL')
  endif
  if with_gallium_virgl
    error('Virgl requires drm or surfaceless platform when using EGL')
  endif
Dylan Baker's avatar
Dylan Baker committed
337 338
endif

339
pre_args += '-DGLX_USE_TLS'
Dylan Baker's avatar
Dylan Baker committed
340
if with_glx != 'disabled'
341
  if not (with_platform_x11 and with_any_opengl)
342
    error('Cannot build GLX support without X11 platform support and at least one OpenGL API')
Dylan Baker's avatar
Dylan Baker committed
343 344 345
  elif with_glx == 'gallium-xlib' 
    if not with_gallium
      error('Gallium-xlib based GLX requires at least one gallium driver')
346 347
    elif not with_gallium_softpipe
      error('Gallium-xlib based GLX requires softpipe or llvmpipe.')
Dylan Baker's avatar
Dylan Baker committed
348 349 350
    elif with_dri
      error('gallium-xlib conflicts with any dri driver')
    endif
351
  elif with_glx == 'xlib' 
Dylan Baker's avatar
Dylan Baker committed
352
    if with_dri
353
      error('xlib conflicts with any dri driver')
Dylan Baker's avatar
Dylan Baker committed
354
    endif
355 356 357 358 359 360
  elif with_glx == 'dri'
    if not with_dri
      error('dri based GLX requires at least one DRI driver')
    elif not with_shared_glapi
      error('dri based GLX requires shared-glapi')
    endif
Dylan Baker's avatar
Dylan Baker committed
361 362 363 364
  endif
endif

with_glvnd = get_option('glvnd')
365 366 367 368 369 370
if with_glvnd
  if with_glx == 'xlib' or with_glx == 'gallium-xlib'
    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
Dylan Baker's avatar
Dylan Baker committed
371 372 373 374 375
endif

# TODO: toggle for this
with_glx_direct = true

376 377 378 379
if with_vulkan_icd_dir == ''
  with_vulkan_icd_dir = join_paths(get_option('datadir'), 'vulkan/icd.d')
endif

380
with_dri2 = (with_dri or with_any_vk) and with_dri_platform == 'drm'
381 382
_dri3 = get_option('dri3')
if _dri3 == 'auto'
383
  with_dri3 = system_has_kms_drm and with_dri2
384
else
385
  with_dri3 = _dri3 == 'true'
386 387 388 389 390
endif

if with_any_vk and (with_platform_x11 and not with_dri3)
  error('Vulkan drivers require dri3 for X11 support')
endif
391
if with_dri or with_gallium
392
  if with_glx == 'disabled' and not with_egl and not with_platform_haiku
Dylan Baker's avatar
Dylan Baker committed
393 394
    error('building dri or gallium drivers require at least one window system')
  endif
395 396
endif

397 398
prog_pkgconfig = find_program('pkg-config')

399
_vdpau = get_option('gallium-vdpau')
400 401 402
if not system_has_kms_drm
  if _vdpau == 'true'
    error('VDPAU state tracker can only be build on unix-like OSes.')
403
  else
404
    _vdpau = 'false'
405
  endif
406 407
elif not with_platform_x11
  if _vdpau == 'true'
408
    error('VDPAU state tracker requires X11 support.')
409 410 411 412 413 414
  else
    _vdpau = 'false'
  endif
elif not (with_gallium_r300 or with_gallium_r600 or with_gallium_radeonsi or
          with_gallium_nouveau)
  if _vdpau == 'true'
415
    error('VDPAU state tracker requires at least one of the following gallium drivers: r300, r600, radeonsi, nouveau.')
416 417
  else
    _vdpau = 'false'
418 419
  endif
endif
420
dep_vdpau = null_dep
421 422 423 424 425 426 427 428 429
with_gallium_vdpau = false
if _vdpau != 'false'
  dep_vdpau = dependency('vdpau', version : '>= 1.1', required : _vdpau == 'true')
  if dep_vdpau.found()
    dep_vdpau = declare_dependency(
      compile_args : run_command(prog_pkgconfig, ['vdpau', '--cflags']).stdout().split()
    )
    with_gallium_vdpau = true
  endif
430 431 432 433 434 435 436 437 438 439
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

440
_xvmc = get_option('gallium-xvmc')
441 442 443
if not system_has_kms_drm
  if _xvmc == 'true'
    error('XVMC state tracker can only be build on unix-like OSes.')
444
  else
445
    _xvmc = 'false'
446
  endif
447 448
elif not with_platform_x11
  if _xvmc == 'true'
449
    error('XVMC state tracker requires X11 support.')
450 451 452 453 454
  else
    _xvmc = 'false'
  endif
elif not (with_gallium_r600 or with_gallium_nouveau)
  if _xvmc == 'true'
455
    error('XVMC state tracker requires at least one of the following gallium drivers: r600, nouveau.')
456 457
  else
    _xvmc = 'false'
458 459
  endif
endif
460
dep_xvmc = null_dep
461
with_gallium_xvmc = false
462
if _xvmc != 'false'
463 464
  dep_xvmc = dependency('xvmc', version : '>= 1.0.6', required : _xvmc == 'true')
  with_gallium_xvmc = dep_xvmc.found()
465 466 467 468 469 470 471
endif

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

472
_omx = get_option('gallium-omx')
473
if not system_has_kms_drm
474
  if ['auto', 'disabled'].contains(_omx)
475
    _omx = 'disabled'
476 477
  else
    error('OMX state tracker can only be built on unix-like OSes.')
478
  endif
479
elif not (with_platform_x11 or with_platform_drm)
480
  if ['auto', 'disabled'].contains(_omx)
481
    _omx = 'disabled'
482 483
  else
    error('OMX state tracker requires X11 or drm platform support.')
484 485
  endif
elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
486
  if ['auto', 'disabled'].contains(_omx)
487
    _omx = 'disabled'
488 489
  else
    error('OMX state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
490
  endif
491
endif
492 493
with_gallium_omx = _omx
dep_omx = null_dep
494
dep_omx_other = []
495
if ['auto', 'bellagio'].contains(_omx)
496
  dep_omx = dependency(
497
    'libomxil-bellagio', required : _omx == 'bellagio'
498 499 500 501 502
  )
  if dep_omx.found()
    with_gallium_omx = 'bellagio'
  endif
endif
503 504
if ['auto', 'tizonia'].contains(_omx)
  if with_dri and with_egl
505 506
    dep_omx = dependency(
      'libtizonia', version : '>= 0.10.0',
507
      required : _omx == 'tizonia',
508 509
    )
    dep_omx_other = [
510 511
      dependency('libtizplatform', required : _omx == 'tizonia'),
      dependency('tizilheaders', required : _omx == 'tizonia'),
512 513 514 515
    ]
    if dep_omx.found() and dep_omx_other[0].found() and dep_omx_other[1].found()
      with_gallium_omx = 'tizonia'
    endif
516 517
  elif _omx == 'tizonia'
    error('OMX-Tizonia state tracker requires dri and egl')
518
  endif
519
endif
520 521 522 523 524
if _omx == 'auto'
  with_gallium_omx = 'disabled'
else
  with_gallium_omx = _omx
endif
525

526 527 528 529 530 531
pre_args += [
  '-DENABLE_ST_OMX_BELLAGIO=' + (with_gallium_omx == 'bellagio' ? '1' : '0'),
  '-DENABLE_ST_OMX_TIZONIA=' + (with_gallium_omx == 'tizonia' ? '1' : '0'),
]


532
omx_drivers_path = get_option('omx-libs-path')
533

534
if with_gallium_omx != 'disabled'
535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557
  # 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

558
_va = get_option('gallium-va')
559 560 561
if not system_has_kms_drm
  if _va == 'true'
    error('VA state tracker can only be built on unix-like OSes.')
562
  else
563
    _va = 'false'
564
  endif
565 566
elif not (with_platform_x11 or with_platform_drm)
  if _va == 'true'
567
    error('VA state tracker requires X11 or drm or wayland platform support.')
568 569 570 571 572
  else
    _va = 'false'
  endif
elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
  if _va == 'true'
573
    error('VA state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
574 575
  else
    _va = 'false'
576 577
  endif
endif
578
with_gallium_va = false
579
dep_va = null_dep
580 581 582 583 584 585 586 587
if _va != 'false'
  dep_va = dependency('libva', version : '>= 0.38.0', required : _va == 'true')
  if dep_va.found()
    dep_va_headers = declare_dependency(
      compile_args : run_command(prog_pkgconfig, ['libva', '--cflags']).stdout().split()
    )
    with_gallium_va = true
  endif
588 589 590 591 592 593 594
endif

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

595
_xa = get_option('gallium-xa')
596 597 598
if not system_has_kms_drm
  if _xa == 'true'
    error('XA state tracker can only be built on unix-like OSes.')
599
  else
600
    _xa = 'false'
601
  endif
602 603 604
elif not (with_gallium_nouveau or with_gallium_freedreno or with_gallium_i915
          or with_gallium_svga)
  if _xa == 'true'
605
    error('XA state tracker requires at least one of the following gallium drivers: nouveau, freedreno, i915, svga.')
606 607
  else
    _xa = 'false'
608 609
  endif
endif
610
with_gallium_xa = _xa != 'false'
611

612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629
d3d_drivers_path = get_option('d3d-drivers-path')
if d3d_drivers_path == ''
  d3d_drivers_path = join_paths(get_option('libdir'), 'd3d')
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
            or with_gallium_r300 or with_gallium_svga or with_gallium_i915)
    error('The nine state tracker requires at least on non-swrast gallium driver.')
  endif
  if not with_dri3
    error('Using nine with wine requires dri3')
  endif
endif

630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
if get_option('power8') != 'false'
  if host_machine.cpu_family() == 'ppc64le'
    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']
    elif get_option('power8') == 'true'
      error('POWER8 intrinsic support required but not found.')
    endif
  endif
endif

Dylan Baker's avatar
Dylan Baker committed
652
_opencl = get_option('gallium-opencl')
653
if _opencl != 'disabled'
Dylan Baker's avatar
Dylan Baker committed
654 655 656 657 658 659 660 661
  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'
else
662
  dep_clc = null_dep
Dylan Baker's avatar
Dylan Baker committed
663 664 665 666
  with_gallium_opencl = false
  with_gallium_icd = false
endif

Dylan Baker's avatar
Dylan Baker committed
667
gl_pkgconfig_c_flags = []
668
if with_platform_x11
669
  if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm')
670 671
    pre_args += '-DHAVE_X11_PLATFORM'
  endif
672
  if with_glx == 'xlib' or with_glx == 'gallium-xlib'
673
    pre_args += '-DUSE_XSHM'
674 675 676 677 678 679 680
  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'
681 682
    elif with_dri_platform == 'apple'
      pre_args += '-DGLX_USE_APPLEGL'
683 684
    elif with_dri_platform == 'windows'
      pre_args += '-DGLX_USE_WINDOWSGL'
685 686
    endif
  endif
Dylan Baker's avatar
Dylan Baker committed
687 688 689 690 691 692 693 694 695 696 697 698
else
  pre_args += '-DMESA_EGL_NO_X11_HEADERS'
  gl_pkgconfig_c_flags += '-DMESA_EGL_NO_X11_HEADERS'
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'
699
endif
700 701 702 703 704 705 706 707
if with_platform_android
  dep_android = [
    dependency('cutils'),
    dependency('hardware'),
    dependency('sync'),
  ]
  pre_args += '-DHAVE_ANDROID_PLATFORM'
endif
708 709 710
if with_platform_haiku
  pre_args += '-DHAVE_HAIKU_PLATFORM'
endif
711

712
prog_python = import('python3').find_python()
713 714 715 716 717 718 719
has_mako = run_command(
  prog_python, '-c',
  '''
from distutils.version import StrictVersion
import mako
assert StrictVersion(mako.__version__) > StrictVersion("0.8.0")
  ''')
720
if has_mako.returncode() != 0
721
  error('Python (3.x) mako module >= 0.8.0 required to build mesa.')
722
endif
723 724

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

728 729
# Define DEBUG for debug builds only (debugoptimized is not included on this one)
if get_option('buildtype') == 'debug'
730 731 732
  pre_args += '-DDEBUG'
endif

733 734 735 736 737 738
if get_option('shader-cache')
  pre_args += '-DENABLE_SHADER_CACHE'
elif with_amd_vk
  error('Radv requires shader cache support')
endif

739 740 741 742 743 744 745 746
# 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

747
# check for GCC __attribute__
748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764
foreach a : ['const', 'flatten', 'malloc', 'pure', 'unused',
             'warn_unused_result', 'weak',]
  if cc.compiles('int foo(void) __attribute__((@0@));'.format(a),
                 name : '__attribute__((@0@))'.format(a))
    pre_args += '-DHAVE_FUNC_ATTRIBUTE_@0@'.format(a.to_upper())
  endif
endforeach
if cc.compiles('int foo(const char *p, ...) __attribute__((format(printf, 1, 2)));',
               name : '__attribute__((format(...)))')
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_FORMAT'
endif
if cc.compiles('struct __attribute__((packed)) foo { int bar; };',
               name : '__attribute__((packed))')
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_PACKED'
endif
if cc.compiles('int *foo(void) __attribute__((returns_nonnull));',
               name : '__attribute__((returns_nonnull))')
765
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL'
766 767 768 769 770 771
endif
if cc.compiles('''int foo_def(void) __attribute__((visibility("default")));
                  int foo_hid(void) __attribute__((visibility("hidden")));
                  int foo_int(void) __attribute__((visibility("internal")));
                  int foo_pro(void) __attribute__((visibility("protected")));''',
               name : '__attribute__((visibility(...)))')
772
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_VISIBILITY'
773 774 775 776 777
endif
if cc.compiles('int foo(void) { return 0; } int bar(void) __attribute__((alias("foo")));',
               name : '__attribute__((alias(...)))')
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_ALIAS'
endif
778 779 780 781
if cc.compiles('int foo(void) __attribute__((__noreturn__));',
               name : '__attribute__((__noreturn__))')
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_NORETURN'
endif
782 783

# TODO: this is very incomplete
784
if ['linux', 'cygwin'].contains(host_machine.system())
785 786 787
  pre_args += '-D_GNU_SOURCE'
endif

788
# Check for generic C arguments
789
c_args = []
Dylan Baker's avatar
Dylan Baker committed
790
foreach a : ['-Werror=implicit-function-declaration',
791 792
             '-Werror=missing-prototypes', '-Werror=return-type',
             '-fno-math-errno',
793 794 795 796 797
             '-fno-trapping-math', '-Qunused-arguments']
  if cc.has_argument(a)
    c_args += a
  endif
endforeach
798

799
foreach a : ['missing-field-initializers', 'format-truncation']
800 801 802 803
  if cc.has_argument('-W' + a)
    c_args += '-Wno-' + a
  endif
endforeach
804

805 806 807 808 809
c_vis_args = []
if cc.has_argument('-fvisibility=hidden')
  c_vis_args += '-fvisibility=hidden'
endif

810 811
# Check for generic C++ arguments
cpp_args = []
Dylan Baker's avatar
Dylan Baker committed
812
foreach a : ['-Werror=return-type',
813
             '-fno-math-errno', '-fno-trapping-math',
814 815 816 817 818 819
             '-Qunused-arguments']
  if cpp.has_argument(a)
    cpp_args += a
  endif
endforeach

820 821
# For some reason, the test for -Wno-foo always succeeds with gcc, even if the
# option is not supported. Hence, check for -Wfoo instead.
822

823
foreach a : ['non-virtual-dtor', 'missing-field-initializers', 'format-truncation']
824 825 826 827
  if cpp.has_argument('-W' + a)
    cpp_args += '-Wno-' + a
  endif
endforeach
828 829 830 831 832 833 834 835

no_override_init_args = []
foreach a : ['override-init', 'initializer-overrides']
  if cc.has_argument('-W' + a)
    no_override_init_args += '-Wno-' + a
  endif
endforeach

836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854
cpp_vis_args = []
if cpp.has_argument('-fvisibility=hidden')
  cpp_vis_args += '-fvisibility=hidden'
endif

# Check for C and C++ arguments for MSVC2013 compatibility. These are only used
# in parts of the mesa code base that need to compile with old versions of
# MSVC, mainly common code
c_msvc_compat_args = []
cpp_msvc_compat_args = []
foreach a : ['-Werror=pointer-arith', '-Werror=vla']
  if cc.has_argument(a)
    c_msvc_compat_args += a
  endif
  if cpp.has_argument(a)
    cpp_msvc_compat_args += a
  endif
endforeach

855
if host_machine.cpu_family().startswith('x86')
856
  pre_args += '-DUSE_SSE41'
857 858 859 860 861 862 863 864 865 866 867 868
  with_sse41 = true
  sse41_args = ['-msse4.1']

  # GCC on x86 (not x86_64) with -msse* assumes a 16 byte aligned stack, but
  # that's not guaranteed
  if host_machine.cpu_family() == 'x86'
    sse41_args += '-mstackrealign'
  endif
else
  with_sse41 = false
  sse41_args = []
endif
869 870

# Check for GCC style atomics
871
dep_atomic = null_dep
872

Matt Turner's avatar
Matt Turner committed
873 874 875 876 877
if cc.compiles('''#include <stdint.h>
                  int main() {
                    struct {
                      uint64_t *v;
                    } x;
878 879 880
                    return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) &
                           (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL);

Matt Turner's avatar
Matt Turner committed
881
                  }''',
882 883
               name : 'GCC atomic builtins')
  pre_args += '-DUSE_GCC_ATOMIC_BUILTINS'
884 885 886 887 888 889 890 891 892

  # Not all atomic calls can be turned into lock-free instructions, in which
  # GCC will make calls into the libatomic library. Check whether we need to
  # link with -latomic.
  #
  # This can happen for 64-bit atomic operations on 32-bit architectures such
  # as ARM.
  if not cc.links('''#include <stdint.h>
                     int main() {
893 894 895
                       struct {
                         uint64_t *v;
                       } x;
896 897
                       return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) &
                              (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL);
898 899 900 901
                     }''',
                  name : 'GCC atomic builtins required -latomic')
    dep_atomic = cc.find_library('atomic')
  endif
902 903 904 905 906 907
endif
if not cc.links('''#include <stdint.h>
                   uint64_t v;
                   int main() {
                     return __sync_add_and_fetch(&v, (uint64_t)1);
                   }''',
Dylan Baker's avatar
Dylan Baker committed
908
                dependencies : dep_atomic,
909
                name : 'GCC 64bit atomics')
Dylan Baker's avatar
Dylan Baker committed
910
  pre_args += '-DMISSING_64BIT_ATOMICS'
911 912 913 914
endif

# TODO: shared/static? Is this even worth doing?

915 916 917 918 919 920
# When cross compiling we generally need to turn off the use of assembly,
# because mesa's assembly relies on building an executable for the host system,
# and running it to get information about struct sizes. There is at least one
# case of cross compiling where we can use asm, and that's x86_64 -> x86 when
# host OS == build OS, since in that case the build machine can run the host's
# binaries.
921
if meson.is_cross_build() 
922 923 924 925
  if build_machine.system() != host_machine.system()
    # TODO: It may be possible to do this with an exe_wrapper (like wine).
    message('Cross compiling from one OS to another, disabling assembly.')
    with_asm = false
926 927 928 929
  elif not (build_machine.cpu_family().startswith('x86') and host_machine.cpu_family() == 'x86')
    # FIXME: Gentoo always sets -m32 for x86_64 -> x86 builds, resulting in an
    # x86 -> x86 cross compile. We use startswith rather than == to handle this
    # case.
930 931 932 933 934 935
    # TODO: There may be other cases where the 64 bit version of the
    # architecture can run 32 bit binaries (aarch64 and armv7 for example)
    message('''
      Cross compiling to different architectures, and the host cannot run
      the build machine's binaries. Disabling assembly.
    ''')
936 937
    with_asm = false
  endif
938 939 940 941 942
endif

with_asm_arch = ''
if with_asm
  if host_machine.cpu_family() == 'x86'
Greg V's avatar
Greg V committed
943
    if system_has_kms_drm
944 945 946
      with_asm_arch = 'x86'
      pre_args += ['-DUSE_X86_ASM', '-DUSE_MMX_ASM', '-DUSE_3DNOW_ASM',
                   '-DUSE_SSE_ASM']
947 948 949 950

      if with_glx_read_only_text
         pre_args += ['-DGLX_X86_READONLY_TEXT']
      endif
951 952
    endif
  elif host_machine.cpu_family() == 'x86_64'
Greg V's avatar
Greg V committed
953
    if system_has_kms_drm
954 955 956 957
      with_asm_arch = 'x86_64'
      pre_args += ['-DUSE_X86_64_ASM']
    endif
  elif host_machine.cpu_family() == 'arm'
Greg V's avatar
Greg V committed
958
    if system_has_kms_drm
959 960 961 962
      with_asm_arch = 'arm'
      pre_args += ['-DUSE_ARM_ASM']
    endif
  elif host_machine.cpu_family() == 'aarch64'
Greg V's avatar
Greg V committed
963
    if system_has_kms_drm
964 965 966
      with_asm_arch = 'aarch64'
      pre_args += ['-DUSE_AARCH64_ASM']
    endif
967 968 969 970 971
  elif host_machine.cpu_family() == 'sparc64'
    if system_has_kms_drm
      with_asm_arch = 'sparc'
      pre_args += ['-DUSE_SPARC_ASM']
    endif
972 973 974 975 976
  elif host_machine.cpu_family() == 'ppc64le'
    if system_has_kms_drm
      with_asm_arch = 'ppc64le'
      pre_args += ['-DUSE_PPC64LE_ASM']
    endif
977 978
  endif
endif
979 980 981 982 983 984 985 986

# Check for standard headers and functions
if cc.has_header_symbol('sys/sysmacros.h', 'major')
  pre_args += '-DMAJOR_IN_SYSMACROS'
elif cc.has_header_symbol('sys/mkdev.h', 'major')
  pre_args += '-DMAJOR_IN_MKDEV'
endif

987
foreach h : ['xlocale.h', 'sys/sysctl.h', 'linux/futex.h', 'endian.h', 'dlfcn.h']
988
  if cc.compiles('#include <@0@>'.format(h), name : '@0@'.format(h))
989 990 991 992
    pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify())
  endif
endforeach

993
foreach f : ['strtof', 'mkostemp', 'posix_memalign', 'timespec_get', 'memfd_create']
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011
  if cc.has_function(f)
    pre_args += '-DHAVE_@0@'.format(f.to_upper())
  endif
endforeach

# strtod locale support
if cc.links('''
    #define _GNU_SOURCE
    #include <stdlib.h>
    #include <locale.h>
    #ifdef HAVE_XLOCALE_H
    #include <xlocale.h>
    #endif
    int main() {
      locale_t loc = newlocale(LC_CTYPE_MASK, "C", NULL);
      const char *s = "1.0";
      char *end;
      double d = strtod_l(s, end, loc);
1012
      float f = strtof_l(s, end, loc);
1013 1014 1015
      freelocale(loc);
      return 0;
    }''',
1016
    args : pre_args,
1017 1018 1019 1020 1021 1022
    name : 'strtod has locale support')
  pre_args += '-DHAVE_STRTOD_L'
endif

# Check for some linker flags
ld_args_bsymbolic = []
1023
if cc.links('int main() { return 0; }', args : '-Wl,-Bsymbolic', name : 'Bsymbolic')
1024 1025 1026 1027
  ld_args_bsymbolic += '-Wl,-Bsymbolic'
endif
ld_args_gc_sections = []
if cc.links('static char unused() { return 5; } int main() { return 0; }',
1028
            args : '-Wl,--gc-sections', name : 'gc-sections')
1029 1030
  ld_args_gc_sections += '-Wl,--gc-sections'
endif
1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
with_ld_version_script = false
if cc.links('int main() { return 0; }',
            args : '-Wl,--version-script=@0@'.format(
              join_paths(meson.source_root(), 'build-support/conftest.map')),
            name : 'version-script')
  with_ld_version_script = true
endif
with_ld_dynamic_list = false
if cc.links('int main() { return 0; }',
            args : '-Wl,--dynamic-list=@0@'.format(
              join_paths(meson.source_root(), 'build-support/conftest.dyn')),
            name : 'dynamic-list')
  with_ld_dynamic_list = true
endif
1045 1046 1047 1048
ld_args_build_id = []
if build_machine.system() != 'darwin'
   ld_args_build_id += '-Wl,--build-id=sha1'
endif
1049 1050 1051

# check for dl support
if cc.has_function('dlopen')
1052
  dep_dl = null_dep
1053 1054 1055
else
  dep_dl = cc.find_library('dl')
endif
1056 1057 1058
if cc.has_function('dladdr', dependencies : dep_dl)
  # This is really only required for megadrivers
  pre_args += '-DHAVE_DLADDR'
1059 1060 1061 1062
endif

if cc.has_function('dl_iterate_phdr')
  pre_args += '-DHAVE_DL_ITERATE_PHDR'
1063 1064 1065 1066
elif with_intel_vk
  error('Intel "Anvil" Vulkan driver requires the dl_iterate_phdr function')
elif with_dri_i965 and get_option('shader-cache')
  error('Intel i965 GL driver requires dl_iterate_phdr when built with shader caching.')
1067 1068 1069 1070
endif

# Determine whether or not the rt library is needed for time functions
if cc.has_function('clock_gettime')
1071
  dep_clock = null_dep
1072 1073 1074 1075 1076 1077
else
  dep_clock = cc.find_library('rt')
endif

# TODO: some of these may be conditional
dep_zlib = dependency('zlib', version : '>= 1.2.3')
1078
pre_args += '-DHAVE_ZLIB'
1079
dep_thread = dependency('threads')
1080
if dep_thread.found() and host_machine.system() != 'windows'
1081
  pre_args += '-DHAVE_PTHREAD'
1082 1083 1084 1085 1086 1087 1088
  if cc.has_function(
      'pthread_setaffinity_np',
      dependencies : dep_thread,
      prefix : '#include <pthread.h>',
      args : '-D_GNU_SOURCE')
    pre_args += '-DHAVE_PTHREAD_SETAFFINITY'
  endif
1089
endif
1090 1091 1092 1093
dep_expat = dependency('expat')
# this only exists on linux so either this is linux and it will be found, or
# its not linux and and wont
dep_m = cc.find_library('m', required : false)
Dylan Baker's avatar
Dylan Baker committed
1094

1095 1096 1097 1098
# Check for libdrm. various drivers have different libdrm version requirements,
# but we always want to use the same version for all libdrm modules. That means
# even if driver foo requires 2.4.0 and driver bar requires 2.4.3, if foo and
# bar are both on use 2.4.3 for both of them
1099 1100 1101 1102 1103
dep_libdrm_amdgpu = null_dep
dep_libdrm_radeon = null_dep
dep_libdrm_nouveau = null_dep
dep_libdrm_etnaviv = null_dep
dep_libdrm_intel = null_dep
1104

1105
_drm_amdgpu_ver = '2.4.95'
1106 1107
_drm_radeon_ver = '2.4.71'
_drm_nouveau_ver = '2.4.66'
1108
_drm_etnaviv_ver = '2.4.89'
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120
_drm_intel_ver = '2.4.75'
_drm_ver = '2.4.75'

_libdrm_checks = [
  ['intel', with_dri_i915 or with_gallium_i915],
  ['amdgpu', with_amd_vk or with_gallium_radeonsi],
  ['radeon', (with_gallium_radeonsi or with_dri_r100 or with_dri_r200 or
              with_gallium_r300 or with_gallium_r600)],
  ['nouveau', (with_gallium_nouveau or with_dri_nouveau)],
  ['etnaviv', with_gallium_etnaviv],
]

1121 1122 1123 1124 1125 1126
# VC4 only needs core libdrm support of this version, not a libdrm_vc4
# library.
if with_gallium_vc4
  _drm_ver = '2.4.89'
endif

1127 1128
# Loop over the enables versions and get the highest libdrm requirement for all
# active drivers.
1129
_drm_blame = ''
1130 1131 1132 1133
foreach d : _libdrm_checks
  ver = get_variable('_drm_@0@_ver'.format(d[0]))
  if d[1] and ver.version_compare('>' + _drm_ver)
    _drm_ver = ver
1134
    _drm_blame = d[0]
1135 1136
  endif
endforeach
1137 1138 1139
if _drm_blame != ''
  message('libdrm @0@ needed because @1@ has the highest requirement'.format(_drm_ver, _drm_blame))
endif
1140 1141 1142 1143 1144 1145

# Then get each libdrm module
foreach d : _libdrm_checks
  if d[1]
    set_variable(
      'dep_libdrm_' + d[0],
1146
      dependency('libdrm_' + d[0], version : '>=' + _drm_ver)
1147 1148 1149
    )
  endif
endforeach
1150

1151
with_gallium_drisw_kms = false
1152 1153
dep_libdrm = dependency(
  'libdrm', version : '>=' + _drm_ver,
1154
  required : with_dri2 or with_dri3
1155
)
1156 1157 1158 1159 1160 1161 1162
if dep_libdrm.found()
  pre_args += '-DHAVE_LIBDRM'
  if with_dri_platform == 'drm' and with_dri
    with_gallium_drisw_kms = true
  endif
endif

1163
llvm_modules = ['bitwriter', 'engine', 'mcdisassembler', 'mcjit']
1164
llvm_optional_modules = []
Dylan Baker's avatar
Dylan Baker committed
1165
if with_amd_vk or with_gallium_radeonsi or with_gallium_r600
1166
  llvm_modules += ['amdgpu', 'bitreader', 'ipo']
Dylan Baker's avatar
Dylan Baker committed
1167 1168 1169
  if with_gallium_r600
    llvm_modules += 'asmparser'
  endif
1170
endif
Dylan Baker's avatar
Dylan Baker committed
1171 1172 1173 1174 1175
if with_gallium_opencl
  llvm_modules += [
    'all-targets', 'linker', 'coverage', 'instrumentation', 'ipo', 'irreader',
    'lto', 'option', 'objcarcopts', 'profiledata',
  ]
1176
  llvm_optional_modules += ['coroutines']
Dylan Baker's avatar
Dylan Baker committed
1177
endif
1178

1179 1180 1181
if with_amd_vk or with_gallium_radeonsi
  _llvm_version = '>= 6.0.0'
elif with_gallium_swr
1182
  _llvm_version = '>= 6.0.0'
1183
elif with_gallium_opencl or with_gallium_r600
1184 1185 1186 1187 1188
  _llvm_version = '>= 3.9.0'
else
  _llvm_version = '>= 3.3.0'
endif

1189 1190
_shared_llvm = get_option('shared-llvm')

1191
_llvm = get_option('llvm')
1192 1193 1194
dep_llvm = null_dep
with_llvm = false
if _llvm != 'false'
1195 1196 1197 1198 1199
  dep_llvm = dependency(
    'llvm',
    version : _llvm_version,
    modules : llvm_modules,
    optional_modules : llvm_optional_modules,
1200 1201 1202 1203
    required : (
      with_amd_vk or with_gallium_radeonsi or with_gallium_swr or
      with_gallium_opencl or _llvm == 'true'
    ),
1204
    static : not _shared_llvm,
1205
  )
1206
  with_llvm = dep_llvm.found()
1207 1208 1209
endif
if with_llvm
  _llvm_version = dep_llvm.version().split('.')
1210 1211 1212 1213 1214 1215 1216 1217

  # 3 digits versions in LLVM only started from 3.4.1 on
  if dep_llvm.version().version_compare('>= 3.4.1')
    _llvm_patch = _llvm_version[2]
  else
    _llvm_patch = '0'
  endif

1218
  pre_args += [
1219
    '-DHAVE_LLVM=0x0@0@0@1@'.format(_llvm_version[0], _llvm_version[1]),
1220 1221
    '-DMESA_LLVM_VERSION_PATCH=@0@'.format(_llvm_patch),
  ]
1222 1223 1224 1225 1226

  # LLVM can be built without rtti, turning off rtti changes the ABI of C++
  # programs, so we need to build all C++ code in mesa without rtti as well to
  # ensure that linking works.
  if dep_llvm.get_configtool_variable('has-rtti') == 'NO'
1227
    cpp_args += '-fno-rtti'
1228
  endif
Dylan Baker's avatar
Dylan Baker committed
1229
elif with_amd_vk or with_gallium_radeonsi or with_gallium_swr
1230
  error('The following drivers require LLVM: Radv, RadeonSI, SWR. One of these is enabled, but LLVM is disabled.')
1231
endif
1232

1233 1234 1235 1236 1237 1238 1239 1240 1241 1242
if (with_amd_vk or with_gallium_radeonsi or with_gallium_opencl or
    (with_gallium_r600 and with_llvm))
  dep_elf = dependency('libelf', required : false)
  if not dep_elf.found()
    dep_elf = cc.find_library('elf')
  endif
else
  dep_elf = null_dep
endif

1243
dep_glvnd = null_dep
Dylan Baker's avatar
Dylan Baker committed
1244 1245 1246 1247 1248
if with_glvnd
  dep_glvnd = dependency('libglvnd', version : '>= 0.2.0')
  pre_args += '-DUSE_LIBGLVND=1'
endif

1249 1250 1251 1252 1253 1254
if with_valgrind != 'false'
  dep_valgrind = dependency('valgrind', required : with_valgrind == 'true')
  if dep_valgrind.found()
    pre_args += '-DHAVE_VALGRIND'
  endif
else
1255
  dep_valgrind = null_dep
1256 1257 1258 1259
endif

# pthread stubs. Lets not and say we didn't

1260 1261 1262
prog_bison = find_program('bison', required : with_any_opengl)
prog_flex = find_program('flex', required : with_any_opengl)

1263
dep_selinux = null_dep
Eric Engestrom's avatar
Eric Engestrom committed
1264 1265 1266 1267
if get_option('selinux')
  dep_selinux = dependency('libselinux')
  pre_args += '-DMESA_SELINUX'
endif
1268

1269 1270 1271 1272 1273 1274
if with_libunwind != 'false'
  dep_unwind = dependency('libunwind', required : with_libunwind == 'true')
  if dep_unwind.found()
    pre_args += '-DHAVE_LIBUNWIND'
  endif
else
1275
  dep_unwind = null_dep
1276
endif
1277

1278 1279 1280 1281
if with_osmesa != 'none'
  if with_osmesa == 'classic' and not with_dri_swrast
    error('OSMesa classic requires dri (classic) swrast.')
  endif
1282 1283 1284
  if with_osmesa == 'gallium' and not with_gallium_softpipe
    error('OSMesa gallium requires gallium softpipe or llvmpipe.')
  endif
1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296
  osmesa_lib_name = 'OSMesa'
  osmesa_bits = get_option('osmesa-bits')
  if osmesa_bits != '8'
    if with_dri or with_glx != 'disabled'
      error('OSMesa bits must be 8 if building glx or dir based drivers')
    endif
    osmesa_lib_name = osmesa_lib_name + osmesa_bits
    pre_args += [
      '-DCHAN_BITS=@0@'.format(osmesa_bits), '-DDEFAULT_SOFTWARE_DEPTH_BITS=31'
    ]
  endif
endif
1297 1298 1299 1300

# TODO: symbol mangling

if with_platform_wayland
1301 1302
  dep_wl_scanner = dependency('wayland-scanner', native: true)
  prog_wl_scanner = find_program(dep_wl_scanner.get_pkgconfig_variable('wayland_scanner'))
1303 1304 1305 1306 1307
  if dep_wl_scanner.version().version_compare('>= 1.15')
    wl_scanner_arg = 'private-code'
  else
    wl_scanner_arg = 'code'
  endif
1308 1309 1310
  dep_wl_protocols = dependency('wayland-protocols', version : '>= 1.8')
  dep_wayland_client = dependency('wayland-client', version : '>=1.11')
  dep_wayland_server = dependency('wayland-server', version : '>=1.11')
1311
  if with_egl
1312 1313 1314
    dep_wayland_egl = dependency('wayland-egl-backend', version : '>= 3')
    dep_wayland_egl_headers = declare_dependency(
      compile_args : run_command(prog_pkgconfig, ['wayland-egl-backend', '--cflags']).stdout().split())
1315
  endif
Dylan Baker's avatar
Dylan Baker committed
1316 1317 1318 1319 1320
  wayland_dmabuf_xml = join_paths(
    dep_wl_protocols.get_pkgconfig_variable('pkgdatadir'), 'unstable',
    'linux-dmabuf', 'linux-dmabuf-unstable-v1.xml'
  )
  pre_args += ['-DHAVE_WAYLAND_PLATFORM', '-DWL_HIDE_DEPRECATED']
1321 1322
endif

1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
dep_x11 = null_dep
dep_xext = null_dep
dep_xdamage = null_dep
dep_xfixes = null_dep
dep_x11_xcb = null_dep
dep_xcb = null_dep
dep_xcb_glx = null_dep
dep_xcb_dri2 = null_dep
dep_xcb_dri3 = null_dep
dep_dri2proto = null_dep
dep_glproto = null_dep
dep_xxf86vm = null_dep
dep_xcb_dri3 = null_dep
dep_xcb_present = null_dep
dep_xcb_sync = null_dep
dep_xcb_xfixes = null_dep
dep_xshmfence = null_dep
1340
dep_xcb_xrandr = null_dep
1341
dep_xlib_xrandr = null_dep
1342
if with_platform_x11
1343
  if with_glx == 'xlib' or with_glx == 'gallium-xlib'
1344 1345 1346
    dep_x11 = dependency('x11')
    dep_xext = dependency('xext')
    dep_xcb = dependency('xcb')
1347
  elif with_glx == 'dri'
1348 1349 1350 1351 1352
    dep_x11 = dependency('x11')
    dep_xext = dependency('xext')
    dep_xdamage = dependency('xdamage', version : '>= 1.1')
    dep_xfixes = dependency('xfixes')
    dep_xcb_glx = dependency('xcb-glx', version : '>= 1.8.1')
1353
    dep_xxf86vm = dependency('xxf86vm', required : false)
Dylan Baker's avatar
Dylan Baker committed
1354
  endif
1355
  if (with_any_vk or with_glx == 'dri' or
1356 1357
       (with_gallium_vdpau or with_gallium_xvmc or with_gallium_va or
        with_gallium_omx != 'disabled'))
1358 1359
    dep_xcb = dependency('xcb')
    dep_x11_xcb = dependency('x11-xcb')
1360
  endif
1361
  if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm')
1362 1363
    dep_xcb_dri2 = dependency('xcb-dri2', version : '>= 1.8')

Dylan Baker's avatar
Dylan Baker committed
1364
    if with_dri3
1365 1366 1367 1368 1369 1370 1371 1372
      pre_args += '-DHAVE_DRI3'
      dep_xcb_dri3 = dependency('xcb-dri3')
      dep_xcb_present = dependency('xcb-present')
      # until xcb-dri3 has been around long enough to make a hard-dependency:
      if (dep_xcb_dri3.version().version_compare('>= 1.13') and
          dep_xcb_present.version().version_compare('>= 1.13'))
        pre_args += '-DHAVE_DRI3_MODIFIERS'
      endif
1373 1374
      dep_xcb_sync = dependency('xcb-sync')
      dep_xshmfence = dependency('xshmfence', version : '>= 1.1')
Dylan Baker's avatar
Dylan Baker committed
1375
    endif
1376
  endif
1377
  if with_glx == 'dri'
1378 1379 1380
    if with_dri_platform == 'drm'
      dep_dri2proto = dependency('dri2proto', version : '>= 2.8')
    endif
1381 1382
    dep_glproto = dependency('glproto', version : '>= 1.4.14')
  endif
1383 1384 1385
  if (with_egl or (
      with_gallium_vdpau or with_gallium_xvmc or with_gallium_xa or
      with_gallium_omx != 'disabled'))
Dylan Baker's avatar
Dylan Baker committed
1386 1387
    dep_xcb_xfixes = dependency('xcb-xfixes')
  endif
1388 1389
  if with_xlib_lease
    dep_xcb_xrandr = dependency('xcb-randr', version : '>= 1.12')
1390
    dep_xlib_xrandr = dependency('xrandr', version : '>= 1.3')
1391
  endif
1392 1393
endif

1394 1395 1396 1397
if get_option('gallium-extra-hud')
  pre_args += '-DHAVE_GALLIUM_EXTRA_HUD=1'
endif

1398 1399 1400 1401 1402 1403 1404
_sensors = get_option('lmsensors')
if _sensors != 'false'
  dep_lmsensors = cc.find_library('libsensors', required : _sensors == 'true')
  if dep_lmsensors.found()
    pre_args += '-DHAVE_LIBSENSORS=1'
  endif
else
1405
  dep_lmsensors = null_dep
1406 1407
endif

1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
foreach a : pre_args
  add_project_arguments(a, language : ['c', 'cpp'])
endforeach
foreach a : c_args
  add_project_arguments(a, language : ['c'])
endforeach
foreach a : cpp_args
  add_project_arguments(a, language : ['cpp'])
endforeach

inc_include = include_directories('include')

1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431
gl_priv_reqs = []

if with_glx == 'xlib' or with_glx == 'gallium-xlib'
  gl_priv_reqs += ['x11', 'xext', 'xcb']
elif with_glx == 'dri'
  gl_priv_reqs += [
    'x11', 'xext', 'xdamage >= 1.1', 'xfixes', 'x11-xcb', 'xcb',
    'xcb-glx >= 1.8.1']
  if with_dri_platform == 'drm'
    gl_priv_reqs += 'xcb-dri2 >= 1.8'
  endif
endif
1432 1433 1434
if dep_libdrm.found()
  gl_priv_reqs += 'libdrm >= 2.4.75'
endif
1435
if dep_xxf86vm.found()
1436
  gl_priv_reqs += 'xxf86vm'
Dylan Baker's avatar
Dylan Baker committed
1437 1438 1439 1440 1441 1442 1443 1444 1445
endif

gl_priv_libs = []
if dep_thread.found()
  gl_priv_libs += ['-lpthread', '-pthread']
endif
if dep_m.found()
  gl_priv_libs += '-lm'
endif
1446
if dep_dl.found()
Dylan Baker's avatar
Dylan Baker committed
1447 1448 1449
  gl_priv_libs += '-ldl'
endif

1450 1451
pkg = import('pkgconfig')

1452 1453 1454
env_test = environment()
env_test.set('NM', find_program('nm').path())

1455
subdir('include')
1456
subdir('bin')
1457
subdir('src')