meson.build 57.8 KB
Newer Older
1
# Copyright © 2017-2019 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.46',
29
  default_options : ['buildtype=debugoptimized', 'b_ndebug=if-release', 'c_std=c99', 'cpp_std=c++14']
30
)
31

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

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

Dylan Baker's avatar
Dylan Baker committed
37
38
39
40
41
42
43
# 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',
44
  '-DPACKAGE_VERSION="@0@"'.format(meson.project_version()),
45
  '-DPACKAGE_BUGREPORT="https://gitlab.freedesktop.org/mesa/mesa/issues"',
Dylan Baker's avatar
Dylan Baker committed
46
47
]

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

73
74
75
with_intel_tools = with_tools.contains('intel') or with_tools.contains('intel-ui')
with_imgui = with_intel_tools or with_vulkan_overlay_layer

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

Dylan Baker's avatar
Dylan Baker committed
85
86
with_gles1 = get_option('gles1')
with_gles2 = get_option('gles2')
87
88
89
90
91
92
93
94
if host_machine.system() == 'windows'
  if with_gles1 == 'auto'
    with_gles1 = 'false'
  endif
  if with_gles2 == 'auto'
    with_gles2 = 'false'
  endif
endif
Dylan Baker's avatar
Dylan Baker committed
95
with_opengl = get_option('opengl')
Dylan Baker's avatar
Dylan Baker committed
96
97
98
99
100
101
102
103

# Default shared glapi off for windows, on elsewhere.
_sg = get_option('shared-glapi')
if _sg == 'auto'
  with_shared_glapi = host_machine.system() != 'windows'
else
  with_shared_glapi = _sg == 'true'
endif
Dylan Baker's avatar
Dylan Baker committed
104
105
106

# shared-glapi is required if at least two OpenGL APIs are being built
if not with_shared_glapi
107
  if ((with_gles1 == 'true' and with_gles2 == 'true') or
108
109
      (with_gles1 == 'true' and with_opengl) or
      (with_gles2 == 'true' and with_opengl))
Dylan Baker's avatar
Dylan Baker committed
110
111
    error('shared-glapi required for building two or more of OpenGL, OpenGL ES 1.x, OpenGL ES 2.x')
  endif
112
113
  with_gles1 = 'false'
  with_gles2 = 'false'
Dylan Baker's avatar
Dylan Baker committed
114
115
116
endif

# We require OpenGL for OpenGL ES
117
118
119
120
121
122
if not with_opengl
  if (with_gles1 == 'true' or with_gles2 == 'true') and not with_opengl
    error('building OpenGL ES without OpenGL is not supported.')
  endif
  with_gles1 = 'false'
  with_gles2 = 'false'
Dylan Baker's avatar
Dylan Baker committed
123
124
endif

125
126
127
128
with_gles1 = with_gles1 != 'false'
with_gles2 = with_gles2 != 'false'
with_any_opengl = with_opengl or with_gles1 or with_gles2
# Only build shared_glapi if at least one OpenGL API is enabled
Dylan Baker's avatar
Dylan Baker committed
129
with_shared_glapi = with_shared_glapi and with_any_opengl
130

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

133
134
dri_drivers = get_option('dri-drivers')
if dri_drivers.contains('auto')
135
  if system_has_kms_drm
136
    # TODO: PPC, Sparc
137
    if ['x86', 'x86_64'].contains(host_machine.cpu_family())
138
      dri_drivers = ['i915', 'i965', 'r100', 'r200', 'nouveau']
139
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
140
      dri_drivers = []
141
    else
142
143
      error('Unknown architecture @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format(
            host_machine.cpu_family()))
144
    endif
145
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
146
    # only swrast would make sense here, but gallium swrast is a much better default
147
    dri_drivers = []
148
  else
149
150
    error('Unknown OS @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
151
152
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
153

154
155
156
157
158
159
with_dri_i915 = dri_drivers.contains('i915')
with_dri_i965 = dri_drivers.contains('i965')
with_dri_r100 = dri_drivers.contains('r100')
with_dri_r200 = dri_drivers.contains('r200')
with_dri_nouveau = dri_drivers.contains('nouveau')
with_dri_swrast = dri_drivers.contains('swrast')
Eric Engestrom's avatar
Eric Engestrom committed
160

161
with_dri = dri_drivers.length() != 0 and dri_drivers != ['']
Dylan Baker's avatar
Dylan Baker committed
162

163
164
gallium_drivers = get_option('gallium-drivers')
if gallium_drivers.contains('auto')
165
  if system_has_kms_drm
166
167
    # TODO: PPC, Sparc
    if ['x86', 'x86_64'].contains(host_machine.cpu_family())
168
      gallium_drivers = [
169
170
        'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'svga', 'swrast',
        'iris'
Dylan Baker's avatar
Dylan Baker committed
171
      ]
172
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
173
      gallium_drivers = [
174
        'kmsro', 'v3d', 'vc4', 'freedreno', 'etnaviv', 'nouveau',
175
        'tegra', 'virgl', 'lima', 'panfrost', 'swrast'
Dylan Baker's avatar
Dylan Baker committed
176
      ]
177
    else
178
179
      error('Unknown architecture @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
            host_machine.cpu_family()))
180
    endif
181
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
182
    gallium_drivers = ['swrast']
183
  else
184
185
    error('Unknown OS @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
186
187
  endif
endif
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
with_gallium_kmsro = gallium_drivers.contains('kmsro')
with_gallium_radeonsi = gallium_drivers.contains('radeonsi')
with_gallium_r300 = gallium_drivers.contains('r300')
with_gallium_r600 = gallium_drivers.contains('r600')
with_gallium_nouveau = gallium_drivers.contains('nouveau')
with_gallium_freedreno = gallium_drivers.contains('freedreno')
with_gallium_softpipe = gallium_drivers.contains('swrast')
with_gallium_vc4 = gallium_drivers.contains('vc4')
with_gallium_v3d = gallium_drivers.contains('v3d')
with_gallium_panfrost = gallium_drivers.contains('panfrost')
with_gallium_etnaviv = gallium_drivers.contains('etnaviv')
with_gallium_tegra = gallium_drivers.contains('tegra')
with_gallium_iris = gallium_drivers.contains('iris')
with_gallium_i915 = gallium_drivers.contains('i915')
with_gallium_svga = gallium_drivers.contains('svga')
with_gallium_virgl = gallium_drivers.contains('virgl')
with_gallium_swr = gallium_drivers.contains('swr')
with_gallium_lima = gallium_drivers.contains('lima')
206
with_gallium_zink = gallium_drivers.contains('zink')
Eric Engestrom's avatar
Eric Engestrom committed
207

208
209
if cc.get_id().startswith('intel') and meson.version().version_compare('< 0.49.1')
  error('Meson does not have sufficient support of ICC before 0.49.1 to compile mesa')
210
211
endif

212
with_gallium = gallium_drivers.length() != 0 and gallium_drivers != ['']
Eric Engestrom's avatar
Eric Engestrom committed
213
214
215
216
217
218

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
219
  endif
Ville Syrjälä's avatar
Ville Syrjälä committed
220
221
endif

222
_vulkan_drivers = get_option('vulkan-drivers')
Dylan Baker's avatar
Dylan Baker committed
223
if _vulkan_drivers.contains('auto')
224
  if system_has_kms_drm
225
    if host_machine.cpu_family().startswith('x86')
Dylan Baker's avatar
Dylan Baker committed
226
      _vulkan_drivers = ['amd', 'intel']
227
228
    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
      _vulkan_drivers = []
229
    else
230
231
      error('Unknown architecture @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
            host_machine.cpu_family()))
232
    endif
233
  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
234
    # No vulkan driver supports windows or macOS currently
235
    _vulkan_drivers = []
236
  else
237
238
    error('Unknown OS @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
239
240
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
241
242
243

with_intel_vk = _vulkan_drivers.contains('intel')
with_amd_vk = _vulkan_drivers.contains('amd')
244
with_freedreno_vk = _vulkan_drivers.contains('freedreno')
Eric Engestrom's avatar
Eric Engestrom committed
245
with_any_vk = _vulkan_drivers.length() != 0 and _vulkan_drivers != ['']
246

247
248
249
250
if with_freedreno_vk and get_option('I-love-half-baked-turnips') != true
  error('Cannot enable freedreno vulkan driver')
endif

Dylan Baker's avatar
Dylan Baker committed
251
if with_dri_swrast and (with_gallium_softpipe or with_gallium_swr)
Dylan Baker's avatar
Dylan Baker committed
252
253
  error('Only one swrast provider can be built')
endif
Dylan Baker's avatar
Dylan Baker committed
254
255
256
if with_dri_i915 and with_gallium_i915
  error('Only one i915 provider can be built')
endif
Emma Anholt's avatar
Emma Anholt committed
257
if with_gallium_kmsro and not (with_gallium_v3d or with_gallium_vc4 or with_gallium_etnaviv or with_gallium_freedreno or with_gallium_panfrost or with_gallium_lima)
258
  error('kmsro driver requires one or more renderonly drivers (vc4, etnaviv, freedreno, panfrost, lima)')
259
endif
Thierry Reding's avatar
Thierry Reding committed
260
261
262
if with_gallium_tegra and not with_gallium_nouveau
  error('tegra driver requires nouveau driver')
endif
Dylan Baker's avatar
Dylan Baker committed
263

264
265
if host_machine.system() == 'darwin'
  with_dri_platform = 'apple'
266
  pre_args += '-DBUILDING_MESA'
267
268
elif ['windows', 'cygwin'].contains(host_machine.system())
  with_dri_platform = 'windows'
Val Packett's avatar
Val Packett committed
269
elif system_has_kms_drm
270
271
272
273
  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.
Val Packett's avatar
Val Packett committed
274
  # FIXME: illumos ends up here as well
275
276
  with_dri_platform = 'none'
endif
Dylan Baker's avatar
Dylan Baker committed
277

278
_platforms = get_option('platforms')
Dylan Baker's avatar
Dylan Baker committed
279
if _platforms.contains('auto')
Val Packett's avatar
Val Packett committed
280
  if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
281
    _platforms = ['x11', 'wayland', 'drm', 'surfaceless']
282
  elif ['darwin', 'cygwin'].contains(host_machine.system())
Dylan Baker's avatar
Dylan Baker committed
283
    _platforms = ['x11', 'surfaceless']
284
  elif ['haiku'].contains(host_machine.system())
Dylan Baker's avatar
Dylan Baker committed
285
    _platforms = ['haiku']
286
287
  elif host_machine.system() == 'windows'
    _platforms = ['windows']
Dylan Baker's avatar
Dylan Baker committed
288
  else
289
290
    error('Unknown OS @0@. Please pass -Dplatforms to set platforms. Patches gladly accepted to fix this.'.format(
          host_machine.system()))
Dylan Baker's avatar
Dylan Baker committed
291
292
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
293
294
295
296
297
298
299

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')
300
with_platform_windows = _platforms.contains('windows')
Eric Engestrom's avatar
Eric Engestrom committed
301
302
303

with_platforms = false
if _platforms.length() != 0 and _platforms != ['']
304
305
306
307
  # sanity check that list contains no empty strings
  if _platforms.contains('')
    error('Invalid argument list given to -Dplatforms, please fix.')
  endif
Eric Engestrom's avatar
Eric Engestrom committed
308
  with_platforms = true
Dylan Baker's avatar
Dylan Baker committed
309
  egl_native_platform = _platforms[0]
310
311
endif

312
313
314
315
316
317
318
_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
319
320
321
322
with_glx = get_option('glx')
if with_glx == 'auto'
  if with_dri
    with_glx = 'dri'
323
324
  elif with_platform_haiku
    with_glx = 'disabled'
325
326
  elif host_machine.system() == 'windows'
    with_glx = 'disabled'
Dylan Baker's avatar
Dylan Baker committed
327
  elif with_gallium
328
329
    # Even when building just gallium drivers the user probably wants dri
    with_glx = 'dri'
Dylan Baker's avatar
Dylan Baker committed
330
331
332
333
334
335
336
337
  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
338
339
340
341
342
if with_glx == 'dri'
   if with_gallium
      with_dri = true
   endif
endif
Dylan Baker's avatar
Dylan Baker committed
343

344
if not (with_dri or with_gallium or with_glx != 'disabled')
Dylan Baker's avatar
Dylan Baker committed
345
346
347
348
349
350
351
  with_gles1 = false
  with_gles2 = false
  with_opengl = false
  with_any_opengl = false
  with_shared_glapi = false
endif

352
353
354
_gbm = get_option('gbm')
if _gbm == 'auto'
  with_gbm = system_has_kms_drm and with_dri
Dylan Baker's avatar
Dylan Baker committed
355
else
356
357
358
359
  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
360
361
endif

Dylan Baker's avatar
Dylan Baker committed
362
363
_egl = get_option('egl')
if _egl == 'auto'
364
365
366
367
  with_egl = (
    not ['darwin', 'windows'].contains(host_machine.system()) and
    with_dri and with_shared_glapi and with_platforms
  )
368
elif _egl == 'true'
Dylan Baker's avatar
Dylan Baker committed
369
370
371
372
  if not with_dri
    error('EGL requires dri')
  elif not with_shared_glapi
    error('EGL requires shared-glapi')
373
  elif not with_platforms
374
    error('No platforms specified, consider -Dplatforms=drm,x11,surfaceless at least')
375
376
  elif not ['disabled', 'dri'].contains(with_glx)
    error('EGL requires dri, but a GLX is being built without dri')
377
378
  elif ['darwin', 'windows'].contains(host_machine.system())
    error('EGL is not available on Windows or MacOS')
Dylan Baker's avatar
Dylan Baker committed
379
380
381
382
383
384
  endif
  with_egl = true
else
  with_egl = false
endif

385
if with_egl and not (with_platform_drm or with_platform_surfaceless or with_platform_android)
Dylan Baker's avatar
Dylan Baker committed
386
  if with_gallium_radeonsi
387
    error('RadeonSI requires the drm, surfaceless or android platform when using EGL')
Dylan Baker's avatar
Dylan Baker committed
388
389
  endif
  if with_gallium_virgl
390
    error('Virgl requires the drm, surfaceless or android platform when using EGL')
Dylan Baker's avatar
Dylan Baker committed
391
  endif
Dylan Baker's avatar
Dylan Baker committed
392
393
endif

394
# Android uses emutls for versions <= P/28. For USE_ELF_TLS we need ELF TLS.
395
if host_machine.system() != 'windows' and (not with_platform_android or get_option('platform-sdk-version') >= 29)
396
  pre_args += '-DUSE_ELF_TLS'
397
398
endif

Dylan Baker's avatar
Dylan Baker committed
399
if with_glx != 'disabled'
400
  if not (with_platform_x11 and with_any_opengl)
401
    error('Cannot build GLX support without X11 platform support and at least one OpenGL API')
402
  elif with_glx == 'gallium-xlib'
Dylan Baker's avatar
Dylan Baker committed
403
404
    if not with_gallium
      error('Gallium-xlib based GLX requires at least one gallium driver')
405
406
    elif not with_gallium_softpipe
      error('Gallium-xlib based GLX requires softpipe or llvmpipe.')
Dylan Baker's avatar
Dylan Baker committed
407
408
409
    elif with_dri
      error('gallium-xlib conflicts with any dri driver')
    endif
410
  elif with_glx == 'xlib'
Dylan Baker's avatar
Dylan Baker committed
411
    if with_dri
Dylan Baker's avatar
Dylan Baker committed
412
      error('xlib conflicts with any dri driver')
Dylan Baker's avatar
Dylan Baker committed
413
    endif
414
  elif with_glx == 'dri'
415
    if not with_shared_glapi
416
417
      error('dri based GLX requires shared-glapi')
    endif
Dylan Baker's avatar
Dylan Baker committed
418
419
420
421
  endif
endif

with_glvnd = get_option('glvnd')
422
if with_glvnd
423
424
425
  if with_platform_windows
    error('glvnd cannot be used on Windows')
  elif with_glx == 'xlib' or with_glx == 'gallium-xlib'
426
427
428
429
    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
430
431
432
  if get_option('egl-lib-suffix') != ''
    error('''EGL lib suffix can't be used with libglvnd''')
  endif
Dylan Baker's avatar
Dylan Baker committed
433
434
endif

435
436
437
438
if with_vulkan_icd_dir == ''
  with_vulkan_icd_dir = join_paths(get_option('datadir'), 'vulkan/icd.d')
endif

439
440
with_dri2 = (with_dri or with_any_vk) and (with_dri_platform == 'drm' or
  host_machine.system() == 'gnu')
441
442
_dri3 = get_option('dri3')
if _dri3 == 'auto'
Eric Engestrom's avatar
Eric Engestrom committed
443
  with_dri3 = system_has_kms_drm and with_dri2
444
else
445
  with_dri3 = _dri3 == 'true'
446
447
448
449
450
endif

if with_any_vk and (with_platform_x11 and not with_dri3)
  error('Vulkan drivers require dri3 for X11 support')
endif
451
if with_dri
452
453
  if with_glx == 'disabled' and not with_egl and not with_gbm and with_osmesa != 'classic'
    error('building dri drivers require at least one windowing system or classic osmesa')
Dylan Baker's avatar
Dylan Baker committed
454
  endif
455
456
endif

457
458
prog_pkgconfig = find_program('pkg-config')

459
_vdpau = get_option('gallium-vdpau')
460
461
462
if not system_has_kms_drm
  if _vdpau == 'true'
    error('VDPAU state tracker can only be build on unix-like OSes.')
463
  else
464
    _vdpau = 'false'
465
  endif
466
467
elif not with_platform_x11
  if _vdpau == 'true'
468
    error('VDPAU state tracker requires X11 support.')
469
470
471
472
473
474
  else
    _vdpau = 'false'
  endif
elif not (with_gallium_r300 or with_gallium_r600 or with_gallium_radeonsi or
          with_gallium_nouveau)
  if _vdpau == 'true'
475
    error('VDPAU state tracker requires at least one of the following gallium drivers: r300, r600, radeonsi, nouveau.')
476
477
  else
    _vdpau = 'false'
478
479
  endif
endif
480
dep_vdpau = null_dep
481
482
483
484
485
486
487
488
489
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
490
491
492
493
494
495
496
497
498
499
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

500
501
502
503
if with_gallium_zink
  dep_vulkan = dependency('vulkan')
endif

504
_xvmc = get_option('gallium-xvmc')
505
506
507
if not system_has_kms_drm
  if _xvmc == 'true'
    error('XVMC state tracker can only be build on unix-like OSes.')
508
  else
509
    _xvmc = 'false'
510
  endif
511
512
elif not with_platform_x11
  if _xvmc == 'true'
513
    error('XVMC state tracker requires X11 support.')
514
515
516
517
518
  else
    _xvmc = 'false'
  endif
elif not (with_gallium_r600 or with_gallium_nouveau)
  if _xvmc == 'true'
519
    error('XVMC state tracker requires at least one of the following gallium drivers: r600, nouveau.')
520
521
  else
    _xvmc = 'false'
522
523
  endif
endif
524
dep_xvmc = null_dep
Dylan Baker's avatar
Dylan Baker committed
525
dep_xv = null_dep
Dylan Baker's avatar
Dylan Baker committed
526
with_gallium_xvmc = false
527
if _xvmc != 'false'
Dylan Baker's avatar
Dylan Baker committed
528
  dep_xvmc = dependency('xvmc', version : '>= 1.0.6', required : _xvmc == 'true')
Dylan Baker's avatar
Dylan Baker committed
529
530
  dep_xv = dependency('xv', required : _xvmc == 'true')
  with_gallium_xvmc = dep_xvmc.found() and dep_xv.found()
531
532
533
534
535
536
537
endif

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

538
_omx = get_option('gallium-omx')
539
if not system_has_kms_drm
540
  if ['auto', 'disabled'].contains(_omx)
541
    _omx = 'disabled'
542
543
  else
    error('OMX state tracker can only be built on unix-like OSes.')
544
  endif
545
elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
546
  if ['auto', 'disabled'].contains(_omx)
547
    _omx = 'disabled'
548
549
  else
    error('OMX state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
550
  endif
551
endif
552
553
with_gallium_omx = _omx
dep_omx = null_dep
554
dep_omx_other = []
Mathias Fröhlich's avatar
Mathias Fröhlich committed
555
if ['auto', 'bellagio'].contains(_omx)
556
  dep_omx = dependency(
Mathias Fröhlich's avatar
Mathias Fröhlich committed
557
    'libomxil-bellagio', required : _omx == 'bellagio'
558
559
560
561
562
  )
  if dep_omx.found()
    with_gallium_omx = 'bellagio'
  endif
endif
Mathias Fröhlich's avatar
Mathias Fröhlich committed
563
564
if ['auto', 'tizonia'].contains(_omx)
  if with_dri and with_egl
565
566
    dep_omx = dependency(
      'libtizonia', version : '>= 0.10.0',
Mathias Fröhlich's avatar
Mathias Fröhlich committed
567
      required : _omx == 'tizonia',
568
569
    )
    dep_omx_other = [
Mathias Fröhlich's avatar
Mathias Fröhlich committed
570
571
      dependency('libtizplatform', required : _omx == 'tizonia'),
      dependency('tizilheaders', required : _omx == 'tizonia'),
572
573
574
575
    ]
    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
576
577
  elif _omx == 'tizonia'
    error('OMX-Tizonia state tracker requires dri and egl')
578
  endif
579
endif
Mathias Fröhlich's avatar
Mathias Fröhlich committed
580
581
582
583
584
if _omx == 'auto'
  with_gallium_omx = 'disabled'
else
  with_gallium_omx = _omx
endif
585

586
587
588
589
590
591
pre_args += [
  '-DENABLE_ST_OMX_BELLAGIO=' + (with_gallium_omx == 'bellagio' ? '1' : '0'),
  '-DENABLE_ST_OMX_TIZONIA=' + (with_gallium_omx == 'tizonia' ? '1' : '0'),
]


592
omx_drivers_path = get_option('omx-libs-path')
593

594
if with_gallium_omx != 'disabled'
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
  # 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

618
_va = get_option('gallium-va')
Eric Engestrom's avatar
Eric Engestrom committed
619
620
621
if not system_has_kms_drm
  if _va == 'true'
    error('VA state tracker can only be built on unix-like OSes.')
622
  else
Eric Engestrom's avatar
Eric Engestrom committed
623
    _va = 'false'
624
  endif
Eric Engestrom's avatar
Eric Engestrom committed
625
626
elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
  if _va == 'true'
627
    error('VA state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
Eric Engestrom's avatar
Eric Engestrom committed
628
629
  else
    _va = 'false'
630
631
  endif
endif
Dylan Baker's avatar
Dylan Baker committed
632
with_gallium_va = false
633
dep_va = null_dep
Dylan Baker's avatar
Dylan Baker committed
634
635
636
637
638
639
640
641
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
642
643
644
645
646
647
648
endif

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

649
_xa = get_option('gallium-xa')
Eric Engestrom's avatar
Eric Engestrom committed
650
651
652
if not system_has_kms_drm
  if _xa == 'true'
    error('XA state tracker can only be built on unix-like OSes.')
653
  else
Eric Engestrom's avatar
Eric Engestrom committed
654
    _xa = 'false'
655
  endif
Eric Engestrom's avatar
Eric Engestrom committed
656
657
658
elif not (with_gallium_nouveau or with_gallium_freedreno or with_gallium_i915
          or with_gallium_svga)
  if _xa == 'true'
659
    error('XA state tracker requires at least one of the following gallium drivers: nouveau, freedreno, i915, svga.')
Eric Engestrom's avatar
Eric Engestrom committed
660
661
  else
    _xa = 'false'
662
663
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
664
with_gallium_xa = _xa != 'false'
665

666
667
d3d_drivers_path = get_option('d3d-drivers-path')
if d3d_drivers_path == ''
668
  d3d_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'd3d')
669
670
671
672
673
674
675
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
676
677
            or with_gallium_r300 or with_gallium_svga or with_gallium_i915
            or with_gallium_iris)
Vinson Lee's avatar
Vinson Lee committed
678
    error('The nine state tracker requires at least one non-swrast gallium driver.')
679
680
681
682
683
684
  endif
  if not with_dri3
    error('Using nine with wine requires dri3')
  endif
endif

685
if get_option('power8') != 'false'
686
687
  # on old versions of meson the cpu family would return as ppc64le on little
  # endian power8, this was changed in 0.48 such that the family would always
688
  # be ppc64 regardless of endianness, and then the machine.endian() value
689
690
691
  # should be checked. Since we support versions < 0.48 we need to use
  # startswith.
  if host_machine.cpu_family().startswith('ppc64') and host_machine.endian() == 'little'
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
    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
712
_opencl = get_option('gallium-opencl')
713
clover_cpp_std = []
Dylan Baker's avatar
Dylan Baker committed
714
if _opencl != 'disabled'
Dylan Baker's avatar
Dylan Baker committed
715
716
717
718
719
720
721
  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'
722

723
724
725
726
727
728
729
730
731
732
  with_opencl_spirv = get_option('opencl-spirv')
  if with_opencl_spirv
    dep_spirv_tools = dependency('SPIRV-Tools', required : true, version : '>= 2018.0')
    # LLVMSPIRVLib is available at https://github.com/KhronosGroup/SPIRV-LLVM-Translator
    dep_llvmspirvlib = dependency('LLVMSPIRVLib', required : true, version : '>= 0.2.1')
  else
    dep_spirv_tools = null_dep
    dep_llvmspirvlib = null_dep
  endif

733
734
735
736
737
738
739
  if host_machine.cpu_family().startswith('ppc') and cpp.compiles('''
      #if !defined(__VEC__) || !defined(__ALTIVEC__)
      #error "AltiVec not enabled"
      #endif''',
      name : 'Altivec')
    clover_cpp_std += ['cpp_std=gnu++11']
  endif
Dylan Baker's avatar
Dylan Baker committed
740
else
741
  dep_clc = null_dep
742
743
  dep_spirv_tools = null_dep
  dep_llvmspirvlib = null_dep
Dylan Baker's avatar
Dylan Baker committed
744
  with_gallium_opencl = false
745
  with_opencl_icd = false
746
  with_opencl_spirv = false
Dylan Baker's avatar
Dylan Baker committed
747
748
endif

Dylan Baker's avatar
Dylan Baker committed
749
gl_pkgconfig_c_flags = []
750
if with_platform_x11
751
  if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm')
752
753
    pre_args += '-DHAVE_X11_PLATFORM'
  endif
754
  if with_glx == 'xlib' or with_glx == 'gallium-xlib'
Dylan Baker's avatar
Dylan Baker committed
755
    pre_args += '-DUSE_XSHM'
756
757
758
759
760
761
762
  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
763
764
    elif with_dri_platform == 'apple'
      pre_args += '-DGLX_USE_APPLEGL'
Jon Turney's avatar
Jon Turney committed
765
766
    elif with_dri_platform == 'windows'
      pre_args += '-DGLX_USE_WINDOWSGL'
767
768
    endif
  endif
Dylan Baker's avatar
Dylan Baker committed
769
else
770
771
  pre_args += '-DEGL_NO_X11'
  gl_pkgconfig_c_flags += '-DEGL_NO_X11'
Dylan Baker's avatar
Dylan Baker committed
772
773
774
775
776
777
778
779
780
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'
781
endif
Eric Engestrom's avatar
Eric Engestrom committed
782
783
784
785
786
787
if with_platform_android
  dep_android = [
    dependency('cutils'),
    dependency('hardware'),
    dependency('sync'),
  ]
788
789
790
  if get_option('platform-sdk-version') >= 26
    dep_android += dependency('nativewindow')
  endif
Eric Engestrom's avatar
Eric Engestrom committed
791
792
  pre_args += '-DHAVE_ANDROID_PLATFORM'
endif
793
794
795
if with_platform_haiku
  pre_args += '-DHAVE_HAIKU_PLATFORM'
endif
796

797
798
799
800
801
if meson.version().version_compare('>=0.50')
  prog_python = import('python').find_installation('python3')
else
  prog_python = import('python3').find_python()
endif
802
803
804
805
806
807
808
has_mako = run_command(
  prog_python, '-c',
  '''
from distutils.version import StrictVersion
import mako
assert StrictVersion(mako.__version__) > StrictVersion("0.8.0")
  ''')
Dylan Baker's avatar
Dylan Baker committed
809
if has_mako.returncode() != 0
810
  error('Python (3.x) mako module >= 0.8.0 required to build mesa.')
Dylan Baker's avatar
Dylan Baker committed
811
endif
812
813

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

817
818
819
820
821
# Support systems without ETIME (e.g. FreeBSD)
if cc.get_define('ETIME', prefix : '#include <errno.h>') == ''
  pre_args += '-DETIME=ETIMEDOUT'
endif

822
823
# Define DEBUG for debug builds only (debugoptimized is not included on this one)
if get_option('buildtype') == 'debug'
824
825
826
  pre_args += '-DDEBUG'
endif

827
828
829
830
831
832
833
834
835
836
837
838
839
with_shader_cache = false
_shader_cache = get_option('shader-cache')
if _shader_cache != 'false'
  if host_machine.system() == 'windows'
    if _shader_cache == 'true'
      error('Shader Cache does not currently work on Windows')
    endif
  else
    pre_args += '-DENABLE_SHADER_CACHE'
    with_shader_cache = true
  endif
endif
if with_amd_vk and not with_shader_cache
840
841
842
  error('Radv requires shader cache support')
endif

843
844
845
846
847
848
849
850
# 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

851
# check for GCC __attribute__
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
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))')
869
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL'
870
871
872
873
874
875
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(...)))')
876
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_VISIBILITY'
877
878
879
880
881
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
882
883
884
885
if cc.compiles('int foo(void) __attribute__((__noreturn__));',
               name : '__attribute__((__noreturn__))')
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_NORETURN'
endif
886
887
888
889
if cc.compiles('__uint128_t foo(void) { return 0; }',
               name : '__uint128_t')
  pre_args += '-DHAVE_UINT128'
endif
890
891

# TODO: this is very incomplete
892
if ['linux', 'cygwin', 'gnu', 'freebsd', 'gnu/kfreebsd'].contains(host_machine.system())
893
  pre_args += '-D_GNU_SOURCE'
894
895
elif host_machine.system() == 'sunos'
  pre_args += '-D__EXTENSIONS__'
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
elif host_machine.system() == 'windows'
  pre_args += [
    '-D_WINDOWS', '-D_WIN32_WINNT=0x0601', '-D_WINVER=0x0601',
    '-DPIPE_SUBSYSTEM_WINDOWS_USER',
    '-D_USE_MATH_DEFINES',  # XXX: scons doesn't use this for mingw
  ]
  if cc.get_id() == 'msvc'
    pre_args += [
      '-DVC_EXTRALEAN',
      '-D_CRT_SECURE_NO_WARNINGS',
      '-D_CRT_SECURE_NO_DEPRECATE',
      '-D_SCL_SECURE_NO_WARNINGS',
      '-D_SCL_SECURE_NO_DEPRECATE',
      '-D_ALLOW_KEYWORD_MACROS',
      '-D_HAS_EXCEPTIONS=0', # Tell C++ STL to not use exceptions
    ]
  else
    pre_args += ['-D__MSVCRT_VERSION__=0x0700']
  endif
915
916
endif

917
# Check for generic C arguments
918
919
c_args = []
c_vis_args = []
920
921
c_msvc_compat_args = []
no_override_init_args = []
922
cpp_args = []
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
cpp_vis_args = []
cpp_msvc_compat_args = []
if cc.get_id() == 'msvc'
  foreach a : ['/wd4018',  # signed/unsigned mismatch
               '/wd4056',  # overflow in floating-point constant arithmetic
               '/wd4244',  # conversion from 'type1' to 'type2', possible loss of data
               '/wd4267',  # 'var' : conversion from 'size_t' to 'type', possible loss of data
               '/wd4305',  # trancation from 'type1' to 'type2'
               '/wd4351',  # new behavior: elements of array 'array' will be default initialized
               '/wd4756',  # overflow in constant arithmetic
               '/wd4800',  # forcing value to bool 'true' or 'false' (performance warning)
               '/wd4996',  # disabled deprecated POSIX name warnings
               '/wd4291']  # no matching operator delete found
    if cc.has_argument(a)
      c_args += a
    endif
    if cpp.has_argument(a)
      cpp_args += a
    endif
  endforeach
  if cc.has_argument('-Wmicrosoft-enum-value')  # Clang
    c_args += '-Wno-microsoft-enum-value'
    cpp_args += '-Wno-microsoft-enum-value'
946
  endif
947
else
948
949
950
951
  _trial = [
    '-Werror=implicit-function-declaration',
    '-Werror=missing-prototypes',
    '-Werror=return-type',
952
    '-Werror=empty-body',
953
954
955
956
957
958
959
960
961
962
963
964
    '-Werror=incompatible-pointer-types',
    '-Wno-missing-field-initializers',
    '-Wno-format-truncation',
    '-fno-math-errno',
    '-fno-trapping-math',
    '-Qunused-arguments',
  ]
  # MinGW chokes on format specifiers and I can't get it all working
  if not (cc.get_id() == 'gcc' and host_machine.system() == 'windows')
    _trial += ['-Werror=format', '-Wformat-security']
  endif
  foreach a : _trial
965
966
967
968
969
    if cc.has_argument(a)
      c_args += a
    endif
  endforeach

970
971
  _trial = [
    '-Werror=return-type',
972
    '-Werror=empty-body',
973
974
975
976
977
978
979
980
981
982
983
984
    '-Wno-non-virtual-dtor',
    '-Wno-missing-field-initializers',
    '-Wno-format-truncation',
    '-fno-math-errno',
    '-fno-trapping-math',
    '-Qunused-arguments',
  ]
  # MinGW chokes on format specifiers and I can't get it all working
  if not (cc.get_id() == 'gcc' and host_machine.system() == 'windows')
    _trial += ['-Werror=format', '-Wformat-security']
  endif
  foreach a : _trial
985
986
987
988
    if cpp.has_argument(a)
      cpp_args += a
    endif
  endforeach
989

990
991
992
993
994
995
996
997
998
999
  foreach a : ['-Wno-override-init', '-Wno-initializer-overrides']
    if cc.has_argument(a)
      no_override_init_args += a
    endif
  endforeach

  if cc.has_argument('-fvisibility=hidden')
    c_vis_args += '-fvisibility=hidden'
  endif

1000
  # Check for C and C++ arguments for MSVC compatibility. These are only used
For faster browsing, not all history is shown. View entire blame