meson.build 44.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
  meson_version : '>= 0.44.1',
29
  default_options : ['buildtype=debugoptimized', '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())

Dylan Baker's avatar
Dylan Baker committed
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')
Dylan Baker's avatar
Dylan Baker committed
55
with_asm = get_option('asm')
56
with_glx_read_only_text = get_option('glx-read-only-text')
Dylan Baker's avatar
Dylan Baker committed
57
with_osmesa = get_option('osmesa')
Dylan Baker's avatar
Dylan Baker committed
58
59
with_swr_arches = get_option('swr-arches')
with_tools = get_option('tools')
60
61
62
if with_tools.contains('all')
  with_tools = ['freedreno', 'glsl', 'intel', 'nir', 'nouveau']
endif
Dylan Baker's avatar
Dylan Baker committed
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

Dylan Baker's avatar
Dylan Baker committed
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
Dylan Baker's avatar
Dylan Baker committed
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())

Dylan Baker's avatar
Dylan Baker committed
96
_drivers = get_option('dri-drivers')
Dylan Baker's avatar
Dylan Baker committed
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())
Dylan Baker's avatar
Dylan Baker committed
101
      _drivers = ['i915', 'i965', 'r100', 'r200', 'nouveau']
102
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
103
      _drivers = []
104
105
106
    else
      error('Unknown architecture. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.')
    endif
107
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
108
    # only swrast would make sense here, but gallium swrast is a much better default
109
    _drivers = []
110
111
112
113
  else
    error('Unknown OS. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.')
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
114
115
116
117
118
119
120
121
122

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 != ['']
Dylan Baker's avatar
Dylan Baker committed
123

Dylan Baker's avatar
Dylan Baker committed
124
_drivers = get_option('gallium-drivers')
Dylan Baker's avatar
Dylan Baker committed
125
if _drivers.contains('auto')
126
  if system_has_kms_drm
127
128
    # TODO: PPC, Sparc
    if ['x86', 'x86_64'].contains(host_machine.cpu_family())
Dylan Baker's avatar
Dylan Baker committed
129
130
131
      _drivers = [
        'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'svga', 'swrast'
      ]
132
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
Dylan Baker's avatar
Dylan Baker committed
133
      _drivers = [
134
        'pl111', 'v3d', 'vc4', 'freedreno', 'etnaviv', 'imx', 'nouveau',
Dylan Baker's avatar
Dylan Baker committed
135
136
        'tegra', 'virgl', 'swrast',
      ]
137
138
139
    else
      error('Unknown architecture. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.')
    endif
140
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
Dylan Baker's avatar
Dylan Baker committed
141
    _drivers = ['swrast']
142
143
144
145
  else
    error('Unknown OS. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.')
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
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
170
  endif
Ville Syrjälä's avatar
Ville Syrjälä committed
171
172
endif

173
_vulkan_drivers = get_option('vulkan-drivers')
Dylan Baker's avatar
Dylan Baker committed
174
if _vulkan_drivers.contains('auto')
175
  if system_has_kms_drm
176
    if host_machine.cpu_family().startswith('x86')
Dylan Baker's avatar
Dylan Baker committed
177
      _vulkan_drivers = ['amd', 'intel']
178
179
180
    else
      error('Unknown architecture. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.')
    endif
181
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
182
    # No vulkan driver supports windows or macOS currently
183
    _vulkan_drivers = []
184
185
  else
    error('Unknown OS. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.')
186
187
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
188
189
190
191

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

Dylan Baker's avatar
Dylan Baker committed
193
if with_dri_swrast and (with_gallium_softpipe or with_gallium_swr)
Dylan Baker's avatar
Dylan Baker committed
194
195
  error('Only one swrast provider can be built')
endif
Dylan Baker's avatar
Dylan Baker committed
196
197
198
if with_dri_i915 and with_gallium_i915
  error('Only one i915 provider can be built')
endif
Dylan Baker's avatar
Dylan Baker committed
199
200
201
if with_gallium_imx and not with_gallium_etnaviv
  error('IMX driver requires etnaviv driver')
endif
202
203
204
if with_gallium_pl111 and not with_gallium_vc4
  error('pl111 driver requires vc4 driver')
endif
Thierry Reding's avatar
Thierry Reding committed
205
206
207
if with_gallium_tegra and not with_gallium_nouveau
  error('tegra driver requires nouveau driver')
endif
Dylan Baker's avatar
Dylan Baker committed
208

209
210
211
212
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
213
elif system_has_kms_drm
214
215
216
217
218
219
  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
220
  # FIXME: illumos ends up here as well
221
222
  with_dri_platform = 'none'
endif
Dylan Baker's avatar
Dylan Baker committed
223

224
_platforms = get_option('platforms')
Dylan Baker's avatar
Dylan Baker committed
225
if _platforms.contains('auto')
Greg V's avatar
Greg V committed
226
  if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
227
    _platforms = ['x11', 'wayland', 'drm', 'surfaceless']
228
  elif ['darwin', 'windows', 'cygwin'].contains(host_machine.system())
Dylan Baker's avatar
Dylan Baker committed
229
    _platforms = ['x11', 'surfaceless']
230
  elif ['haiku'].contains(host_machine.system())
Dylan Baker's avatar
Dylan Baker committed
231
    _platforms = ['haiku']
Dylan Baker's avatar
Dylan Baker committed
232
  else
233
    error('Unknown OS. Please pass -Dplatforms to set platforms. Patches gladly accepted to fix this.')
Dylan Baker's avatar
Dylan Baker committed
234
235
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
236
237
238
239
240
241
242
243
244
245
246

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
Dylan Baker's avatar
Dylan Baker committed
247
  egl_native_platform = _platforms[0]
248
249
endif

250
251
252
253
254
255
256
_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

Dylan Baker's avatar
Dylan Baker committed
257
258
259
260
with_glx = get_option('glx')
if with_glx == 'auto'
  if with_dri
    with_glx = 'dri'
261
262
  elif with_platform_haiku
    with_glx = 'disabled'
Dylan Baker's avatar
Dylan Baker committed
263
  elif with_gallium
264
265
    # Even when building just gallium drivers the user probably wants dri
    with_glx = 'dri'
266
    with_dri = true
Dylan Baker's avatar
Dylan Baker committed
267
268
269
270
271
272
273
274
275
  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

276
if not (with_dri or with_gallium or with_glx == 'xlib' or with_glx == 'gallium-xlib')
Dylan Baker's avatar
Dylan Baker committed
277
278
279
280
281
282
283
  with_gles1 = false
  with_gles2 = false
  with_opengl = false
  with_any_opengl = false
  with_shared_glapi = false
endif

284
285
286
_gbm = get_option('gbm')
if _gbm == 'auto'
  with_gbm = system_has_kms_drm and with_dri
Dylan Baker's avatar
Dylan Baker committed
287
else
288
289
290
291
  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
292
293
endif

Dylan Baker's avatar
Dylan Baker committed
294
295
_egl = get_option('egl')
if _egl == 'auto'
Eric Engestrom's avatar
Eric Engestrom committed
296
  with_egl = with_dri and with_shared_glapi and with_platforms
297
elif _egl == 'true'
Dylan Baker's avatar
Dylan Baker committed
298
299
300
301
  if not with_dri
    error('EGL requires dri')
  elif not with_shared_glapi
    error('EGL requires shared-glapi')
302
  elif not with_platforms
Dylan Baker's avatar
Dylan Baker committed
303
    error('No platforms specified, consider -Dplatforms=drm,x11 at least')
304
305
  elif not ['disabled', 'dri'].contains(with_glx)
    error('EGL requires dri, but a GLX is being built without dri')
Dylan Baker's avatar
Dylan Baker committed
306
307
308
309
310
311
  endif
  with_egl = true
else
  with_egl = false
endif

Dylan Baker's avatar
Dylan Baker committed
312
313
314
315
316
317
318
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
319
320
endif

Dylan Baker's avatar
Dylan Baker committed
321
pre_args += '-DGLX_USE_TLS'
Dylan Baker's avatar
Dylan Baker committed
322
if with_glx != 'disabled'
323
  if not (with_platform_x11 and with_any_opengl)
324
    error('Cannot build GLX support without X11 platform support and at least one OpenGL API')
Dylan Baker's avatar
Dylan Baker committed
325
326
327
  elif with_glx == 'gallium-xlib' 
    if not with_gallium
      error('Gallium-xlib based GLX requires at least one gallium driver')
328
329
    elif not with_gallium_softpipe
      error('Gallium-xlib based GLX requires softpipe or llvmpipe.')
Dylan Baker's avatar
Dylan Baker committed
330
331
332
    elif with_dri
      error('gallium-xlib conflicts with any dri driver')
    endif
Dylan Baker's avatar
Dylan Baker committed
333
  elif with_glx == 'xlib' 
Dylan Baker's avatar
Dylan Baker committed
334
    if with_dri
Dylan Baker's avatar
Dylan Baker committed
335
      error('xlib conflicts with any dri driver')
Dylan Baker's avatar
Dylan Baker committed
336
    endif
337
338
339
340
341
342
  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
343
344
345
346
  endif
endif

with_glvnd = get_option('glvnd')
347
348
349
350
351
352
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
353
354
355
356
357
endif

# TODO: toggle for this
with_glx_direct = true

358
359
360
361
if with_vulkan_icd_dir == ''
  with_vulkan_icd_dir = join_paths(get_option('datadir'), 'vulkan/icd.d')
endif

362
with_dri2 = (with_dri or with_any_vk) and with_dri_platform == 'drm'
363
364
_dri3 = get_option('dri3')
if _dri3 == 'auto'
Eric Engestrom's avatar
Eric Engestrom committed
365
  with_dri3 = system_has_kms_drm and with_dri2
366
else
367
  with_dri3 = _dri3 == 'true'
368
369
370
371
372
endif

if with_any_vk and (with_platform_x11 and not with_dri3)
  error('Vulkan drivers require dri3 for X11 support')
endif
Dylan Baker's avatar
Dylan Baker committed
373
if with_dri or with_gallium
374
  if with_glx == 'disabled' and not with_egl and not with_platform_haiku
Dylan Baker's avatar
Dylan Baker committed
375
376
    error('building dri or gallium drivers require at least one window system')
  endif
377
378
endif

379
380
prog_pkgconfig = find_program('pkg-config')

381
_vdpau = get_option('gallium-vdpau')
382
383
384
if not system_has_kms_drm
  if _vdpau == 'true'
    error('VDPAU state tracker can only be build on unix-like OSes.')
385
  else
386
    _vdpau = 'false'
387
  endif
388
389
elif not with_platform_x11
  if _vdpau == 'true'
390
    error('VDPAU state tracker requires X11 support.')
391
392
393
394
395
396
  else
    _vdpau = 'false'
  endif
elif not (with_gallium_r300 or with_gallium_r600 or with_gallium_radeonsi or
          with_gallium_nouveau)
  if _vdpau == 'true'
397
    error('VDPAU state tracker requires at least one of the following gallium drivers: r300, r600, radeonsi, nouveau.')
398
399
  else
    _vdpau = 'false'
400
401
  endif
endif
402
dep_vdpau = null_dep
403
404
405
406
407
408
409
410
411
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
412
413
414
415
416
417
418
419
420
421
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

422
_xvmc = get_option('gallium-xvmc')
423
424
425
if not system_has_kms_drm
  if _xvmc == 'true'
    error('XVMC state tracker can only be build on unix-like OSes.')
426
  else
427
    _xvmc = 'false'
428
  endif
429
430
elif not with_platform_x11
  if _xvmc == 'true'
431
    error('XVMC state tracker requires X11 support.')
432
433
434
435
436
  else
    _xvmc = 'false'
  endif
elif not (with_gallium_r600 or with_gallium_nouveau)
  if _xvmc == 'true'
437
    error('XVMC state tracker requires at least one of the following gallium drivers: r600, nouveau.')
438
439
  else
    _xvmc = 'false'
440
  endif
441
442
elif _xvmc == 'auto'
  _xvmc = 'true'
443
endif
444
with_gallium_xvmc = _xvmc == 'true'
445
dep_xvmc = null_dep
446
if with_gallium_xvmc
447
  dep_xvmc = dependency('xvmc', version : '>= 1.0.6')
448
449
450
451
452
453
454
endif

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

455
_omx = get_option('gallium-omx')
456
if not system_has_kms_drm
457
  if ['auto', 'disabled'].contains(_omx)
458
    _omx = 'disabled'
459
460
  else
    error('OMX state tracker can only be built on unix-like OSes.')
461
  endif
462
elif not (with_platform_x11 or with_platform_drm)
463
  if ['auto', 'disabled'].contains(_omx)
464
    _omx = 'disabled'
465
466
  else
    error('OMX state tracker requires X11 or drm platform support.')
467
468
  endif
elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
469
  if ['auto', 'disabled'].contains(_omx)
470
    _omx = 'disabled'
471
472
  else
    error('OMX state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
473
  endif
474
endif
475
476
with_gallium_omx = _omx
dep_omx = null_dep
477
dep_omx_other = []
Mathias Fröhlich's avatar
Mathias Fröhlich committed
478
if ['auto', 'bellagio'].contains(_omx)
479
  dep_omx = dependency(
Mathias Fröhlich's avatar
Mathias Fröhlich committed
480
    'libomxil-bellagio', required : _omx == 'bellagio'
481
482
483
484
485
  )
  if dep_omx.found()
    with_gallium_omx = 'bellagio'
  endif
endif
Mathias Fröhlich's avatar
Mathias Fröhlich committed
486
487
if ['auto', 'tizonia'].contains(_omx)
  if with_dri and with_egl
488
489
    dep_omx = dependency(
      'libtizonia', version : '>= 0.10.0',
Mathias Fröhlich's avatar
Mathias Fröhlich committed
490
      required : _omx == 'tizonia',
491
492
    )
    dep_omx_other = [
Mathias Fröhlich's avatar
Mathias Fröhlich committed
493
494
      dependency('libtizplatform', required : _omx == 'tizonia'),
      dependency('tizilheaders', required : _omx == 'tizonia'),
495
496
497
498
    ]
    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
499
500
  elif _omx == 'tizonia'
    error('OMX-Tizonia state tracker requires dri and egl')
501
  endif
502
endif
Mathias Fröhlich's avatar
Mathias Fröhlich committed
503
504
505
506
507
if _omx == 'auto'
  with_gallium_omx = 'disabled'
else
  with_gallium_omx = _omx
endif
508

509
510
511
512
513
514
pre_args += [
  '-DENABLE_ST_OMX_BELLAGIO=' + (with_gallium_omx == 'bellagio' ? '1' : '0'),
  '-DENABLE_ST_OMX_TIZONIA=' + (with_gallium_omx == 'tizonia' ? '1' : '0'),
]


515
omx_drivers_path = get_option('omx-libs-path')
516

517
if with_gallium_omx != 'disabled'
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
  # 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

541
_va = get_option('gallium-va')
Eric Engestrom's avatar
Eric Engestrom committed
542
543
544
if not system_has_kms_drm
  if _va == 'true'
    error('VA state tracker can only be built on unix-like OSes.')
545
  else
Eric Engestrom's avatar
Eric Engestrom committed
546
    _va = 'false'
547
  endif
Eric Engestrom's avatar
Eric Engestrom committed
548
549
elif not (with_platform_x11 or with_platform_drm)
  if _va == 'true'
550
    error('VA state tracker requires X11 or drm or wayland platform support.')
Eric Engestrom's avatar
Eric Engestrom committed
551
552
553
554
555
  else
    _va = 'false'
  endif
elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
  if _va == 'true'
556
    error('VA state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
Eric Engestrom's avatar
Eric Engestrom committed
557
558
  else
    _va = 'false'
559
  endif
Eric Engestrom's avatar
Eric Engestrom committed
560
561
elif _va == 'auto'
  _va = 'true'
562
endif
Eric Engestrom's avatar
Eric Engestrom committed
563
with_gallium_va = _va == 'true'
564
dep_va = null_dep
565
if with_gallium_va
566
  dep_va = dependency('libva', version : '>= 0.39.0')
567
  dep_va_headers = declare_dependency(
568
    compile_args : run_command(prog_pkgconfig, ['libva', '--cflags']).stdout().split()
569
570
571
572
573
574
575
576
  )
endif

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

577
_xa = get_option('gallium-xa')
Eric Engestrom's avatar
Eric Engestrom committed
578
579
580
if not system_has_kms_drm
  if _xa == 'true'
    error('XA state tracker can only be built on unix-like OSes.')
581
  else
Eric Engestrom's avatar
Eric Engestrom committed
582
    _xa = 'false'
583
  endif
Eric Engestrom's avatar
Eric Engestrom committed
584
585
586
elif not (with_gallium_nouveau or with_gallium_freedreno or with_gallium_i915
          or with_gallium_svga)
  if _xa == 'true'
587
    error('XA state tracker requires at least one of the following gallium drivers: nouveau, freedreno, i915, svga.')
Eric Engestrom's avatar
Eric Engestrom committed
588
589
  else
    _xa = 'false'
590
591
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
592
with_gallium_xa = _xa != 'false'
593

594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
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

612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
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
634
_opencl = get_option('gallium-opencl')
Dylan Baker's avatar
Dylan Baker committed
635
if _opencl != 'disabled'
Dylan Baker's avatar
Dylan Baker committed
636
637
638
639
640
641
642
643
  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
644
  dep_clc = null_dep
Dylan Baker's avatar
Dylan Baker committed
645
646
647
648
  with_gallium_opencl = false
  with_gallium_icd = false
endif

Dylan Baker's avatar
Dylan Baker committed
649
gl_pkgconfig_c_flags = []
650
if with_platform_x11
651
  if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm')
652
653
    pre_args += '-DHAVE_X11_PLATFORM'
  endif
654
  if with_glx == 'xlib' or with_glx == 'gallium-xlib'
Dylan Baker's avatar
Dylan Baker committed
655
    pre_args += '-DUSE_XSHM'
656
657
658
659
660
661
662
  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
663
664
    elif with_dri_platform == 'apple'
      pre_args += '-DGLX_USE_APPLEGL'
Jon Turney's avatar
Jon Turney committed
665
666
    elif with_dri_platform == 'windows'
      pre_args += '-DGLX_USE_WINDOWSGL'
667
668
    endif
  endif
Dylan Baker's avatar
Dylan Baker committed
669
670
671
672
673
674
675
676
677
678
679
680
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'
681
endif
Eric Engestrom's avatar
Eric Engestrom committed
682
683
684
685
686
687
688
689
if with_platform_android
  dep_android = [
    dependency('cutils'),
    dependency('hardware'),
    dependency('sync'),
  ]
  pre_args += '-DHAVE_ANDROID_PLATFORM'
endif
690
691
692
if with_platform_haiku
  pre_args += '-DHAVE_HAIKU_PLATFORM'
endif
693

694
prog_python2 = find_program('python2')
Dylan Baker's avatar
Dylan Baker committed
695
696
697
698
has_mako = run_command(prog_python2, '-c', 'import mako')
if has_mako.returncode() != 0
  error('Python (2.x) mako module required to build mesa.')
endif
699
700

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

704
705
# Define DEBUG for debug builds only (debugoptimized is not included on this one)
if get_option('buildtype') == 'debug'
706
707
708
  pre_args += '-DDEBUG'
endif

709
710
711
712
713
714
if get_option('shader-cache')
  pre_args += '-DENABLE_SHADER_CACHE'
elif with_amd_vk
  error('Radv requires shader cache support')
endif

715
716
717
718
719
720
721
722
# 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

723
# check for GCC __attribute__
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
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))')
741
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL'
742
743
744
745
746
747
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(...)))')
748
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_VISIBILITY'
749
750
751
752
753
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
Jason Ekstrand's avatar
Jason Ekstrand committed
754
755
756
757
if cc.compiles('int foo(void) __attribute__((__noreturn__));',
               name : '__attribute__((__noreturn__))')
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_NORETURN'
endif
758
759

# TODO: this is very incomplete
Jon Turney's avatar
Jon Turney committed
760
if ['linux', 'cygwin'].contains(host_machine.system())
761
762
763
  pre_args += '-D_GNU_SOURCE'
endif

764
# Check for generic C arguments
765
766
767
768
769
770
771
772
c_args = []
foreach a : ['-Wall', '-Werror=implicit-function-declaration',
             '-Werror=missing-prototypes', '-fno-math-errno',
             '-fno-trapping-math', '-Qunused-arguments']
  if cc.has_argument(a)
    c_args += a
  endif
endforeach
773
774
775
776
if cc.has_argument('-Wmissing-field-initializers')
  c_args += '-Wno-missing-field-initializers'
endif

777
778
779
780
781
c_vis_args = []
if cc.has_argument('-fvisibility=hidden')
  c_vis_args += '-fvisibility=hidden'
endif

782
783
784
785
786
787
788
789
790
# Check for generic C++ arguments
cpp_args = []
foreach a : ['-Wall', '-fno-math-errno', '-fno-trapping-math',
             '-Qunused-arguments']
  if cpp.has_argument(a)
    cpp_args += a
  endif
endforeach

791
792
# For some reason, the test for -Wno-foo always succeeds with gcc, even if the
# option is not supported. Hence, check for -Wfoo instead.
793
794
795
796
797
798

foreach a : ['non-virtual-dtor', 'missing-field-initializers']
  if cpp.has_argument('-W' + a)
    cpp_args += '-Wno-' + a
  endif
endforeach
799
800
801
802
803
804
805
806

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

807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
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

826
if host_machine.cpu_family().startswith('x86')
827
  pre_args += '-DUSE_SSE41'
828
829
830
831
832
833
834
835
836
837
838
839
  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
840
841

# Check for GCC style atomics
842
dep_atomic = null_dep
843

Matt Turner's avatar
Matt Turner committed
844
845
846
847
848
if cc.compiles('''#include <stdint.h>
                  int main() {
                    struct {
                      uint64_t *v;
                    } x;
849
850
851
                    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
852
                  }''',
853
854
               name : 'GCC atomic builtins')
  pre_args += '-DUSE_GCC_ATOMIC_BUILTINS'
855
856
857
858
859
860
861
862
863

  # 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() {
864
865
866
                       struct {
                         uint64_t *v;
                       } x;
867
868
                       return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) &
                              (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL);
869
870
871
872
                     }''',
                  name : 'GCC atomic builtins required -latomic')
    dep_atomic = cc.find_library('atomic')
  endif
873
874
875
876
877
878
879
880
881
882
883
884
endif
if not cc.links('''#include <stdint.h>
                   uint64_t v;
                   int main() {
                     return __sync_add_and_fetch(&v, (uint64_t)1);
                   }''',
                name : 'GCC 64bit atomics')
  pre_args += '-DMISSING_64_BIT_ATOMICS'
endif

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

885
886
887
888
889
890
# 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.
891
if meson.is_cross_build() 
892
893
894
895
  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
896
897
898
899
  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.
900
901
902
903
904
905
    # 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.
    ''')
906
907
    with_asm = false
  endif
Dylan Baker's avatar
Dylan Baker committed
908
909
910
911
912
endif

with_asm_arch = ''
if with_asm
  if host_machine.cpu_family() == 'x86'
Greg V's avatar
Greg V committed
913
    if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
914
915
916
      with_asm_arch = 'x86'
      pre_args += ['-DUSE_X86_ASM', '-DUSE_MMX_ASM', '-DUSE_3DNOW_ASM',
                   '-DUSE_SSE_ASM']
917
918
919
920

      if with_glx_read_only_text
         pre_args += ['-DGLX_X86_READONLY_TEXT']
      endif
Dylan Baker's avatar
Dylan Baker committed
921
922
    endif
  elif host_machine.cpu_family() == 'x86_64'
Greg V's avatar
Greg V committed
923
    if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
924
925
926
927
      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
928
    if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
929
930
931
932
      with_asm_arch = 'arm'
      pre_args += ['-DUSE_ARM_ASM']
    endif
  elif host_machine.cpu_family() == 'aarch64'
Greg V's avatar
Greg V committed
933
    if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
934
935
936
      with_asm_arch = 'aarch64'
      pre_args += ['-DUSE_AARCH64_ASM']
    endif
937
938
939
940
941
  elif host_machine.cpu_family() == 'sparc64'
    if system_has_kms_drm
      with_asm_arch = 'sparc'
      pre_args += ['-DUSE_SPARC_ASM']
    endif
942
943
944
945
946
  elif host_machine.cpu_family() == 'ppc64le'
    if system_has_kms_drm
      with_asm_arch = 'ppc64le'
      pre_args += ['-DUSE_PPC64LE_ASM']
    endif
Dylan Baker's avatar
Dylan Baker committed
947
948
  endif
endif
949
950
951
952
953
954
955
956

# 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

957
foreach h : ['xlocale.h', 'sys/sysctl.h', 'linux/futex.h', 'endian.h']
958
  if cc.compiles('#include <@0@>'.format(h), name : '@0@'.format(h))
959
960
961
962
    pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify())
  endif
endforeach

963
foreach f : ['strtof', 'mkostemp', 'posix_memalign', 'timespec_get', 'memfd_create']
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
  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);
982
      float f = strtof_l(s, end, loc);
983
984
985
986
987
988
989
990
991
992
      freelocale(loc);
      return 0;
    }''',
    extra_args : pre_args,
    name : 'strtod has locale support')
  pre_args += '-DHAVE_STRTOD_L'
endif

# Check for some linker flags
ld_args_bsymbolic = []
993
if cc.links('int main() { return 0; }', args : '-Wl,-Bsymbolic', name : 'Bsymbolic')
994
995
996
997
  ld_args_bsymbolic += '-Wl,-Bsymbolic'
endif
ld_args_gc_sections = []
if cc.links('static char unused() { return 5; } int main() { return 0; }',
998
            args : '-Wl,--gc-sections', name : 'gc-sections')
999
1000
  ld_args_gc_sections += '-Wl,--gc-sections'
endif
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
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
1015
1016
1017
1018
ld_args_build_id = []
if build_machine.system() != 'darwin'
   ld_args_build_id += '-Wl,--build-id=sha1'
endif
1019
1020
1021

# check for dl support
if cc.has_function('dlopen')
1022
  dep_dl = null_dep
1023
1024
1025
else
  dep_dl = cc.find_library('dl')
endif
Dylan Baker's avatar
Dylan Baker committed
1026
1027
1028
if cc.has_function('dladdr', dependencies : dep_dl)
  # This is really only required for megadrivers
  pre_args += '-DHAVE_DLADDR'
1029
1030
1031
1032
endif

if cc.has_function('dl_iterate_phdr')
  pre_args += '-DHAVE_DL_ITERATE_PHDR'
1033
1034
1035
1036
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.')
1037
1038
1039
1040
endif

# Determine whether or not the rt library is needed for time functions
if cc.has_function('clock_gettime')
1041
  dep_clock = null_dep
1042
1043
1044
1045
1046
1047
else
  dep_clock = cc.find_library('rt')
endif

# TODO: some of these may be conditional
dep_zlib = dependency('zlib', version : '>= 1.2.3')
1048
pre_args += '-DHAVE_ZLIB'
1049
dep_thread = dependency('threads')
1050
if dep_thread.found() and host_machine.system() != 'windows'
1051
1052
  pre_args += '-DHAVE_PTHREAD'
endif
Dylan Baker's avatar
Dylan Baker committed
1053
if with_amd_vk or with_gallium_radeonsi or with_gallium_r600 or with_gallium_opencl
Dylan Baker's avatar
Dylan Baker committed
1054
1055
1056
1057
1058
  dep_elf = dependency('libelf', required : false)
  if not dep_elf.found()
    dep_elf = cc.find_library('elf')
  endif
else
1059
  dep_elf = null_dep
1060
endif
1061
1062
1063
1064
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
1065

1066
1067
1068
1069
# 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
1070
1071
1072
1073
1074
1075
dep_libdrm_amdgpu = null_dep
dep_libdrm_radeon = null_dep
dep_libdrm_nouveau = null_dep
dep_libdrm_etnaviv = null_dep
dep_libdrm_freedreno = null_dep
dep_libdrm_intel = null_dep
1076
1077
1078
1079

_drm_amdgpu_ver = '2.4.91'
_drm_radeon_ver = '2.4.71'
_drm_nouveau_ver = '2.4.66'
1080
_drm_etnaviv_ver = '2.4.89'
1081
_drm_freedreno_ver = '2.4.92'
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
_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],
  ['freedreno', with_gallium_freedreno],
]

1095
1096
1097
1098
1099
1100
# VC4 only needs core libdrm support of this version, not a libdrm_vc4
# library.
if with_gallium_vc4
  _drm_ver = '2.4.89'
endif

1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
# Loop over the enables versions and get the highest libdrm requirement for all
# active drivers.
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
  endif
endforeach

# Then get each libdrm module
foreach d : _libdrm_checks
  if d[1]
    set_variable(
      'dep_libdrm_' + d[0],
1115
      dependency('libdrm_' + d[0], version : '>=' + _drm_ver)
1116
1117
1118
    )
  endif
endforeach
1119

Dylan Baker's avatar
Dylan Baker committed
1120
with_gallium_drisw_kms = false
1121
1122
dep_libdrm = dependency(
  'libdrm', version : '>=' + _drm_ver,
1123
  required : with_dri2 or with_dri3
1124
)
Dylan Baker's avatar
Dylan Baker committed
1125
1126
1127
1128
1129
1130
1131
if dep_libdrm.found()
  pre_args += '-DHAVE_LIBDRM'
  if with_dri_platform == 'drm' and with_dri
    with_gallium_drisw_kms = true
  endif
endif

1132
llvm_modules = ['bitwriter', 'engine', 'mcdisassembler', 'mcjit']
1133
llvm_optional_modules = []
Dylan Baker's avatar
Dylan Baker committed
1134
if with_amd_vk or with_gallium_radeonsi or with_gallium_r600
1135
  llvm_modules += ['amdgpu', 'bitreader', 'ipo']
Dylan Baker's avatar
Dylan Baker committed
1136
1137
1138
  if with_gallium_r600
    llvm_modules += 'asmparser'
  endif
1139
endif
Dylan Baker's avatar
Dylan Baker committed
1140
1141
1142
1143
1144
if with_gallium_opencl
  llvm_modules += [
    'all-targets', 'linker', 'coverage', 'instrumentation', 'ipo', 'irreader',
    'lto', 'option', 'objcarcopts', 'profiledata',
  ]
1145
  llvm_optional_modules += ['coroutines', 'opencl']
Dylan Baker's avatar
Dylan Baker committed
1146
endif
1147

1148
if with_amd_vk or with_gallium_radeonsi or with_gallium_swr
1149
  _llvm_version = '>= 5.0.0'
1150
elif with_gallium_opencl or with_gallium_r600
1151
1152
1153
1154
1155
  _llvm_version = '>= 3.9.0'
else
  _llvm_version = '>= 3.3.0'
endif

1156
1157
_llvm = get_option('llvm')
if _llvm == 'auto'
1158
  dep_llvm = dependency(
1159
1160
1161
1162
    'llvm',
    version : _llvm_version,
    modules : llvm_modules,
    optional_modules : llvm_optional_modules,
Dylan Baker's avatar
Dylan Baker committed
1163
    required : with_amd_vk or with_gallium_radeonsi or with_gallium_swr or with_gallium_opencl,
1164
  )
1165
1166
  with_llvm = dep_llvm.found()
elif _llvm == 'true'
1167
1168
1169
1170
1171
1172
  dep_llvm = dependency(
    'llvm',
    version : _llvm_version,
    modules : llvm_modules,
    optional_modules : llvm_optional_modules,
  )
1173
1174
  with_llvm = true
else
1175
  dep_llvm = null_dep
1176
1177
1178
1179
  with_llvm = false
endif
if with_llvm
  _llvm_version = dep_llvm.version().split('.')
1180
1181
1182
1183
  # Development versions of LLVM have an 'svn' or 'git' suffix, we don't want
  # that for our version checks.
  # svn suffixes are stripped by meson as of 0.43, and git suffixes are
  # strippped as of 0.44, but we support older meson versions.
1184
1185
1186
1187
1188
1189
1190
1191

  # 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

1192
1193
  if _llvm_patch.endswith('svn')
    _llvm_patch = _llvm_patch.split('s')[0]
1194
1195
  elif _llvm_patch.contains('git')
    _llvm_patch = _llvm_patch.split('g')[0]
1196
  endif
1197
  pre_args += [
1198
    '-DHAVE_LLVM=0x0@0@0@1@'.format(_llvm_version[0], _llvm_version[1]),
1199
1200
    '-DMESA_LLVM_VERSION_PATCH=@0@'.format(_llvm_patch),
  ]
1201
1202
1203
1204
1205

  # 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'
1206
    cpp_args += '-fno-rtti'
1207
  endif
Dylan Baker's avatar
Dylan Baker committed
1208
elif with_amd_vk or with_gallium_radeonsi or with_gallium_swr
1209
  error('The following drivers require LLVM: Radv, RadeonSI, SWR. One of these is enabled, but LLVM is disabled.')
1210
endif
1211

1212
dep_glvnd = null_dep
Dylan Baker's avatar
Dylan Baker committed
1213
1214
1215
1216
1217
if with_glvnd
  dep_glvnd = dependency('libglvnd', version : '>= 0.2.0')
  pre_args += '-DUSE_LIBGLVND=1'
endif

1218
1219
1220
1221
1222
1223
if with_valgrind != 'false'
  dep_valgrind = dependency('valgrind', required : with_valgrind == 'true')
  if dep_valgrind.found()
    pre_args += '-DHAVE_VALGRIND'
  endif
else
1224
  dep_valgrind = null_dep
1225
1226
1227
1228
endif

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

Dylan Baker's avatar
Dylan Baker committed
1229
1230
1231
prog_bison = find_program('bison', required : with_any_opengl)
prog_flex = find_program('flex', required : with_any_opengl)

1232
dep_selinux = null_dep
Eric Engestrom's avatar
Eric Engestrom committed
1233
1234
1235
1236
if get_option('selinux')
  dep_selinux = dependency('libselinux')
  pre_args += '-DMESA_SELINUX'
endif
1237

1238
1239
1240
1241
1242
1243
if with_libunwind != 'false'
  dep_unwind = dependency('libunwind', required : with_libunwind == 'true')
  if dep_unwind.found()
    pre_args += '-DHAVE_LIBUNWIND'
  endif
else
1244
  dep_unwind = null_dep
Dylan Baker's avatar
Dylan Baker committed
1245
endif
1246

Dylan Baker's avatar
Dylan Baker committed
1247
1248
1249
1250
if with_osmesa != 'none'
  if with_osmesa == 'classic' and not with_dri_swrast
    error('OSMesa classic requires dri (classic) swrast.')
  endif
1251
1252
1253
  if with_osmesa == 'gallium' and not with_gallium_softpipe
    error('OSMesa gallium requires gallium softpipe or llvmpipe.')
  endif
Dylan Baker's avatar
Dylan Baker committed
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
  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
1266
1267
1268
1269
1270
1271
1272
1273

# TODO: symbol mangling

if with_platform_wayland
  prog_wl_scanner = find_program('wayland-scanner')
  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')
1274
  if with_egl
1275
1276
1277
    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())
1278
  endif
Dylan Baker's avatar
Dylan Baker committed
1279
1280
1281
1282
1283
  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']
1284
1285
else
  prog_wl_scanner = []
1286
1287
1288
  dep_wl_protocols = null_dep
  dep_wayland_client = null_dep
  dep_wayland_server = null_dep
Dylan Baker's avatar
Dylan Baker committed
1289
  wayland_dmabuf_xml = ''
1290
1291
endif

1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
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
1309
dep_xcb_xrandr = null_dep
1310
dep_xlib_xrandr = null_dep
1311
if with_platform_x11
1312
  if with_glx == 'xlib' or with_glx == 'gallium-xlib'
Dylan Baker's avatar
Dylan Baker committed
1313
1314
1315
    dep_x11 = dependency('x11')
    dep_xext = dependency('xext')
    dep_xcb = dependency('xcb')
1316
  elif with_glx == 'dri'
1317
1318
1319
1320
1321
    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')
1322
    dep_xxf86vm = dependency('xxf86vm', required : false)
Dylan Baker's avatar
Dylan Baker committed
1323
  endif
1324
  if (with_any_vk or with_glx == 'dri' or
1325
1326
       (with_gallium_vdpau or with_gallium_xvmc or with_gallium_va or
        with_gallium_omx != 'disabled'))
1327
1328
    dep_xcb = dependency('xcb')
    dep_x11_xcb = dependency('x11-xcb')
1329
  endif
1330
  if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm')
1331
1332
    dep_xcb_dri2 = dependency('xcb-dri2', version : '>= 1.8')

Dylan Baker's avatar
Dylan Baker committed
1333
    if with_dri3
1334
1335
1336
1337
1338
1339
1340
1341
      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
1342
1343
      dep_xcb_sync = dependency('xcb-sync')
      dep_xshmfence = dependency('xshmfence', version : '>= 1.1')