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

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

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

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

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

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

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

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

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_glx_direct = get_option('glx-direct')
Dylan Baker's avatar
Dylan Baker committed
58
with_osmesa = get_option('osmesa')
Dylan Baker's avatar
Dylan Baker committed
59
60
with_swr_arches = get_option('swr-arches')
with_tools = get_option('tools')
61
if with_tools.contains('all')
62
  with_tools = ['freedreno', 'glsl', 'intel', 'nir', 'nouveau', 'xvmc']
63
endif
Dylan Baker's avatar
Dylan Baker committed
64

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

Dylan Baker's avatar
Dylan Baker committed
74
75
76
77
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
78
79
# 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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94


# 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

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

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

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
126

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

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

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

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

218
219
220
221
if host_machine.system() == 'darwin'
  with_dri_platform = 'apple'
elif ['windows', 'cygwin'].contains(host_machine.system())
  with_dri_platform = 'windows'
unrelentingtech's avatar
unrelentingtech committed
222
elif system_has_kms_drm
223
224
225
226
  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.
unrelentingtech's avatar
unrelentingtech committed
227
  # FIXME: illumos ends up here as well
228
229
  with_dri_platform = 'none'
endif
Dylan Baker's avatar
Dylan Baker committed
230

231
_platforms = get_option('platforms')
Dylan Baker's avatar
Dylan Baker committed
232
if _platforms.contains('auto')
unrelentingtech's avatar
unrelentingtech committed
233
  if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
234
    _platforms = ['x11', 'wayland', 'drm', 'surfaceless']
235
  elif ['darwin', 'windows', 'cygwin'].contains(host_machine.system())
Dylan Baker's avatar
Dylan Baker committed
236
    _platforms = ['x11', 'surfaceless']
237
  elif ['haiku'].contains(host_machine.system())
Dylan Baker's avatar
Dylan Baker committed
238
    _platforms = ['haiku']
Dylan Baker's avatar
Dylan Baker committed
239
  else
240
241
    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
242
243
  endif
endif
Eric Engestrom's avatar
Eric Engestrom committed
244
245
246
247
248
249
250
251
252
253
254

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
255
  egl_native_platform = _platforms[0]
256
257
endif

258
259
260
261
262
263
264
_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
265
266
267
268
with_glx = get_option('glx')
if with_glx == 'auto'
  if with_dri
    with_glx = 'dri'
269
270
  elif with_platform_haiku
    with_glx = 'disabled'
Dylan Baker's avatar
Dylan Baker committed
271
  elif with_gallium
272
273
    # Even when building just gallium drivers the user probably wants dri
    with_glx = 'dri'
Dylan Baker's avatar
Dylan Baker committed
274
275
276
277
278
279
280
281
  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
282
283
284
285
286
if with_glx == 'dri'
   if with_gallium
      with_dri = true
   endif
endif
Dylan Baker's avatar
Dylan Baker committed
287

288
if not (with_dri or with_gallium or with_glx == 'xlib' or with_glx == 'gallium-xlib')
Dylan Baker's avatar
Dylan Baker committed
289
290
291
292
293
294
295
  with_gles1 = false
  with_gles2 = false
  with_opengl = false
  with_any_opengl = false
  with_shared_glapi = false
endif

296
297
298
_gbm = get_option('gbm')
if _gbm == 'auto'
  with_gbm = system_has_kms_drm and with_dri
Dylan Baker's avatar
Dylan Baker committed
299
else
300
301
302
303
  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
304
305
endif

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

Dylan Baker's avatar
Dylan Baker committed
329
330
331
332
333
334
335
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
336
337
endif

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

with_glvnd = get_option('glvnd')
364
365
366
367
368
369
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
370
371
endif

372
373
374
375
if with_vulkan_icd_dir == ''
  with_vulkan_icd_dir = join_paths(get_option('datadir'), 'vulkan/icd.d')
endif

376
with_dri2 = (with_dri or with_any_vk) and with_dri_platform == 'drm'
377
378
_dri3 = get_option('dri3')
if _dri3 == 'auto'
Eric Engestrom's avatar
Eric Engestrom committed
379
  with_dri3 = system_has_kms_drm and with_dri2
380
else
381
  with_dri3 = _dri3 == 'true'
382
383
384
385
386
endif

if with_any_vk and (with_platform_x11 and not with_dri3)
  error('Vulkan drivers require dri3 for X11 support')
endif
387
388
389
if with_dri
  if with_glx == 'disabled' and not with_egl and not with_gbm
    error('building dri drivers require at least one windowing system')
Dylan Baker's avatar
Dylan Baker committed
390
  endif
391
392
endif

393
394
prog_pkgconfig = find_program('pkg-config')

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

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

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

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

522
523
524
525
526
527
pre_args += [
  '-DENABLE_ST_OMX_BELLAGIO=' + (with_gallium_omx == 'bellagio' ? '1' : '0'),
  '-DENABLE_ST_OMX_TIZONIA=' + (with_gallium_omx == 'tizonia' ? '1' : '0'),
]


528
omx_drivers_path = get_option('omx-libs-path')
529

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

554
_va = get_option('gallium-va')
Eric Engestrom's avatar
Eric Engestrom committed
555
556
557
if not system_has_kms_drm
  if _va == 'true'
    error('VA state tracker can only be built on unix-like OSes.')
558
  else
Eric Engestrom's avatar
Eric Engestrom committed
559
    _va = 'false'
560
  endif
Eric Engestrom's avatar
Eric Engestrom committed
561
562
elif not (with_platform_x11 or with_platform_drm)
  if _va == 'true'
563
    error('VA state tracker requires X11 or drm or wayland platform support.')
Eric Engestrom's avatar
Eric Engestrom committed
564
565
566
567
568
  else
    _va = 'false'
  endif
elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau)
  if _va == 'true'
569
    error('VA state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.')
Eric Engestrom's avatar
Eric Engestrom committed
570
571
  else
    _va = 'false'
572
573
  endif
endif
Dylan Baker's avatar
Dylan Baker committed
574
with_gallium_va = false
575
dep_va = null_dep
Dylan Baker's avatar
Dylan Baker committed
576
577
578
579
580
581
582
583
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
584
585
586
587
588
589
590
endif

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

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

608
609
610
611
612
613
614
615
616
617
618
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)
Vinson Lee's avatar
Vinson Lee committed
619
    error('The nine state tracker requires at least one non-swrast gallium driver.')
620
621
622
623
624
625
  endif
  if not with_dri3
    error('Using nine with wine requires dri3')
  endif
endif

626
if get_option('power8') != 'false'
627
628
629
630
631
632
  # 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
  # be ppc64 regardless of endianness, and the the machine.endian() value
  # 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'
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
    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
653
_opencl = get_option('gallium-opencl')
654
clover_cpp_std = []
Dylan Baker's avatar
Dylan Baker committed
655
if _opencl != 'disabled'
Dylan Baker's avatar
Dylan Baker committed
656
657
658
659
660
661
662
  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'
663
664
665
666
667
668
669
670

  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
671
else
672
  dep_clc = null_dep
Dylan Baker's avatar
Dylan Baker committed
673
674
675
676
  with_gallium_opencl = false
  with_gallium_icd = false
endif

Dylan Baker's avatar
Dylan Baker committed
677
gl_pkgconfig_c_flags = []
678
if with_platform_x11
679
  if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm')
680
681
    pre_args += '-DHAVE_X11_PLATFORM'
  endif
682
  if with_glx == 'xlib' or with_glx == 'gallium-xlib'
Dylan Baker's avatar
Dylan Baker committed
683
    pre_args += '-DUSE_XSHM'
684
685
686
687
688
689
690
  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
691
692
    elif with_dri_platform == 'apple'
      pre_args += '-DGLX_USE_APPLEGL'
Jon Turney's avatar
Jon Turney committed
693
694
    elif with_dri_platform == 'windows'
      pre_args += '-DGLX_USE_WINDOWSGL'
695
696
    endif
  endif
Dylan Baker's avatar
Dylan Baker committed
697
698
699
700
701
702
703
704
705
706
707
708
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'
709
endif
Eric Engestrom's avatar
Eric Engestrom committed
710
711
712
713
714
715
716
717
if with_platform_android
  dep_android = [
    dependency('cutils'),
    dependency('hardware'),
    dependency('sync'),
  ]
  pre_args += '-DHAVE_ANDROID_PLATFORM'
endif
718
719
720
if with_platform_haiku
  pre_args += '-DHAVE_HAIKU_PLATFORM'
endif
721

722
prog_python = import('python3').find_python()
723
724
725
726
727
728
729
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
730
if has_mako.returncode() != 0
731
  error('Python (3.x) mako module >= 0.8.0 required to build mesa.')
Dylan Baker's avatar
Dylan Baker committed
732
endif
733
734

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

738
739
# Define DEBUG for debug builds only (debugoptimized is not included on this one)
if get_option('buildtype') == 'debug'
740
741
742
  pre_args += '-DDEBUG'
endif

743
744
745
746
747
748
if get_option('shader-cache')
  pre_args += '-DENABLE_SHADER_CACHE'
elif with_amd_vk
  error('Radv requires shader cache support')
endif

749
750
751
752
753
754
755
756
# 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

757
# check for GCC __attribute__
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
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))')
775
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL'
776
777
778
779
780
781
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(...)))')
782
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_VISIBILITY'
783
784
785
786
787
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
788
789
790
791
if cc.compiles('int foo(void) __attribute__((__noreturn__));',
               name : '__attribute__((__noreturn__))')
  pre_args += '-DHAVE_FUNC_ATTRIBUTE_NORETURN'
endif
792
793

# TODO: this is very incomplete
Dylan Baker's avatar
Dylan Baker committed
794
if ['linux', 'cygwin', 'gnu'].contains(host_machine.system())
795
796
797
  pre_args += '-D_GNU_SOURCE'
endif

798
# Check for generic C arguments
799
c_args = []
Dylan Baker's avatar
Dylan Baker committed
800
foreach a : ['-Werror=implicit-function-declaration',
801
802
             '-Werror=missing-prototypes', '-Werror=return-type',
             '-fno-math-errno',
803
804
805
806
807
             '-fno-trapping-math', '-Qunused-arguments']
  if cc.has_argument(a)
    c_args += a
  endif
endforeach
808

809
foreach a : ['missing-field-initializers', 'format-truncation']
810
811
812
813
  if cc.has_argument('-W' + a)
    c_args += '-Wno-' + a
  endif
endforeach
814

815
816
817
818
819
c_vis_args = []
if cc.has_argument('-fvisibility=hidden')
  c_vis_args += '-fvisibility=hidden'
endif

820
821
# Check for generic C++ arguments
cpp_args = []
Dylan Baker's avatar
Dylan Baker committed
822
foreach a : ['-Werror=return-type',
823
             '-fno-math-errno', '-fno-trapping-math',
824
825
826
827
828
829
             '-Qunused-arguments']
  if cpp.has_argument(a)
    cpp_args += a
  endif
endforeach

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

833
foreach a : ['non-virtual-dtor', 'missing-field-initializers', 'format-truncation']
834
835
836
837
  if cpp.has_argument('-W' + a)
    cpp_args += '-Wno-' + a
  endif
endforeach
838
839
840
841
842
843
844
845

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

846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
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

865
if host_machine.cpu_family().startswith('x86')
866
  pre_args += '-DUSE_SSE41'
867
868
869
870
871
872
873
874
875
876
877
878
  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
879
880

# Check for GCC style atomics
881
dep_atomic = null_dep
882

Matt Turner's avatar
Matt Turner committed
883
884
885
886
887
if cc.compiles('''#include <stdint.h>
                  int main() {
                    struct {
                      uint64_t *v;
                    } x;
888
889
890
                    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
891
                  }''',
892
893
               name : 'GCC atomic builtins')
  pre_args += '-DUSE_GCC_ATOMIC_BUILTINS'
894
895
896
897
898
899
900
901
902

  # 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() {
903
904
905
                       struct {
                         uint64_t *v;
                       } x;
906
907
                       return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) &
                              (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL);
908
909
910
911
                     }''',
                  name : 'GCC atomic builtins required -latomic')
    dep_atomic = cc.find_library('atomic')
  endif
912
913
914
915
916
917
endif
if not cc.links('''#include <stdint.h>
                   uint64_t v;
                   int main() {
                     return __sync_add_and_fetch(&v, (uint64_t)1);
                   }''',
Dylan Baker's avatar
Dylan Baker committed
918
                dependencies : dep_atomic,
919
                name : 'GCC 64bit atomics')
Dylan Baker's avatar
Dylan Baker committed
920
  pre_args += '-DMISSING_64BIT_ATOMICS'
921
922
923
924
endif

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

925
926
927
928
929
930
# 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.
931
if meson.is_cross_build() 
932
933
934
935
  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
936
937
938
939
  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.
940
941
942
943
944
945
    # 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.
    ''')
946
947
    with_asm = false
  endif
Dylan Baker's avatar
Dylan Baker committed
948
949
950
951
952
endif

with_asm_arch = ''
if with_asm
  if host_machine.cpu_family() == 'x86'
Dylan Baker's avatar
Dylan Baker committed
953
    if system_has_kms_drm or host_machine.system() == 'gnu'
Dylan Baker's avatar
Dylan Baker committed
954
955
956
      with_asm_arch = 'x86'
      pre_args += ['-DUSE_X86_ASM', '-DUSE_MMX_ASM', '-DUSE_3DNOW_ASM',
                   '-DUSE_SSE_ASM']
957
958
959
960

      if with_glx_read_only_text
         pre_args += ['-DGLX_X86_READONLY_TEXT']
      endif
Dylan Baker's avatar
Dylan Baker committed
961
962
    endif
  elif host_machine.cpu_family() == 'x86_64'
unrelentingtech's avatar
unrelentingtech committed
963
    if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
964
965
966
967
      with_asm_arch = 'x86_64'
      pre_args += ['-DUSE_X86_64_ASM']
    endif
  elif host_machine.cpu_family() == 'arm'
unrelentingtech's avatar
unrelentingtech committed
968
    if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
969
970
971
972
      with_asm_arch = 'arm'
      pre_args += ['-DUSE_ARM_ASM']
    endif
  elif host_machine.cpu_family() == 'aarch64'
unrelentingtech's avatar
unrelentingtech committed
973
    if system_has_kms_drm
Dylan Baker's avatar
Dylan Baker committed
974
975
976
      with_asm_arch = 'aarch64'
      pre_args += ['-DUSE_AARCH64_ASM']
    endif
977
978
979
980
981
  elif host_machine.cpu_family() == 'sparc64'
    if system_has_kms_drm
      with_asm_arch = 'sparc'
      pre_args += ['-DUSE_SPARC_ASM']
    endif
982
  elif host_machine.cpu_family().startswith('ppc64') and host_machine.endian() == 'little'
983
984
985
986
    if system_has_kms_drm
      with_asm_arch = 'ppc64le'
      pre_args += ['-DUSE_PPC64LE_ASM']
    endif
Dylan Baker's avatar
Dylan Baker committed
987
988
  endif
endif
989
990
991
992
993
994
995
996

# 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

997
foreach h : ['xlocale.h', 'sys/sysctl.h', 'linux/futex.h', 'endian.h', 'dlfcn.h']
998
  if cc.compiles('#include <@0@>'.format(h), name : '@0@'.format(h))
999
1000
1001
1002
    pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify())
  endif
endforeach

1003
foreach f : ['strtof', 'mkostemp', 'posix_memalign', 'timespec_get', 'memfd_create']
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
  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);
1022
      float f = strtof_l(s, end, loc);
1023
1024
1025
      freelocale(loc);
      return 0;
    }''',
1026
    args : pre_args,
1027
1028
1029
1030
1031
1032
    name : 'strtod has locale support')
  pre_args += '-DHAVE_STRTOD_L'
endif

# Check for some linker flags
ld_args_bsymbolic = []
1033
if cc.links('int main() { return 0; }', args : '-Wl,-Bsymbolic', name : 'Bsymbolic')
1034
1035
1036
1037
  ld_args_bsymbolic += '-Wl,-Bsymbolic'
endif
ld_args_gc_sections = []
if cc.links('static char unused() { return 5; } int main() { return 0; }',
1038
            args : '-Wl,--gc-sections', name : 'gc-sections')
1039
1040
  ld_args_gc_sections += '-Wl,--gc-sections'
endif
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
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
1055
1056
1057
1058
ld_args_build_id = []
if build_machine.system() != 'darwin'
   ld_args_build_id += '-Wl,--build-id=sha1'
endif
1059
1060
1061

# check for dl support
if cc.has_function('dlopen')
1062
  dep_dl = null_dep
1063
1064
1065
else
  dep_dl = cc.find_library('dl')
endif
Dylan Baker's avatar
Dylan Baker committed
1066
1067
1068
if cc.has_function('dladdr', dependencies : dep_dl)
  # This is really only required for megadrivers
  pre_args += '-DHAVE_DLADDR'
1069
1070
1071
1072
endif

if cc.has_function('dl_iterate_phdr')
  pre_args += '-DHAVE_DL_ITERATE_PHDR'
1073
1074
1075
1076
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.')
1077
1078
1079
1080
endif

# Determine whether or not the rt library is needed for time functions
if cc.has_function('clock_gettime')
1081
  dep_clock = null_dep
1082
1083
1084
1085
1086
1087
else
  dep_clock = cc.find_library('rt')
endif

# TODO: some of these may be conditional
dep_zlib = dependency('zlib', version : '>= 1.2.3')
1088
pre_args += '-DHAVE_ZLIB'
1089
dep_thread = dependency('threads')
1090
if dep_thread.found() and host_machine.system() != 'windows'
1091
  pre_args += '-DHAVE_PTHREAD'
1092
1093
1094
1095
1096
1097
1098
  if cc.has_function(
      'pthread_setaffinity_np',
      dependencies : dep_thread,
      prefix : '#include <pthread.h>',
      args : '-D_GNU_SOURCE')
    pre_args += '-DHAVE_PTHREAD_SETAFFINITY'
  endif
1099
endif
1100
1101
1102
1103
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
1104

1105
1106
1107
1108
# 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
1109
1110
1111
1112
1113
dep_libdrm_amdgpu = null_dep
dep_libdrm_radeon = null_dep
dep_libdrm_nouveau = null_dep
dep_libdrm_etnaviv = null_dep
dep_libdrm_intel = null_dep
1114

1115
_drm_amdgpu_ver = '2.4.95'
1116
1117
_drm_radeon_ver = '2.4.71'
_drm_nouveau_ver = '2.4.66'
1118
_drm_etnaviv_ver = '2.4.89'
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
_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],
]

1131
1132
1133
1134
1135
1136
# VC4 only needs core libdrm support of this version, not a libdrm_vc4
# library.
if with_gallium_vc4
  _drm_ver = '2.4.89'
endif

1137
1138
# Loop over the enables versions and get the highest libdrm requirement for all
# active drivers.
1139
_drm_blame = ''
1140
1141
1142
1143
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
1144
    _drm_blame = d[0]
1145
1146
  endif
endforeach
1147
1148
1149
if _drm_blame != ''
  message('libdrm @0@ needed because @1@ has the highest requirement'.format(_drm_ver, _drm_blame))
endif
1150
1151
1152
1153
1154
1155

# Then get each libdrm module
foreach d : _libdrm_checks
  if d[1]
    set_variable(
      'dep_libdrm_' + d[0],
1156
      dependency('libdrm_' + d[0], version : '>=' + _drm_ver)
1157
1158
1159
    )
  endif
endforeach
1160

Dylan Baker's avatar
Dylan Baker committed
1161
with_gallium_drisw_kms = false
1162
1163
dep_libdrm = dependency(
  'libdrm', version : '>=' + _drm_ver,
1164
  required : with_dri2 or with_dri3
1165
)
Dylan Baker's avatar
Dylan Baker committed
1166
1167
1168
1169
1170
1171
1172
if dep_libdrm.found()
  pre_args += '-DHAVE_LIBDRM'
  if with_dri_platform == 'drm' and with_dri
    with_gallium_drisw_kms = true
  endif
endif

1173
llvm_modules = ['bitwriter', 'engine', 'mcdisassembler', 'mcjit']
1174
llvm_optional_modules = []
Dylan Baker's avatar
Dylan Baker committed
1175
if with_amd_vk or with_gallium_radeonsi or with_gallium_r600
1176
  llvm_modules += ['amdgpu', 'native', 'bitreader', 'ipo']
Dylan Baker's avatar
Dylan Baker committed
1177
1178
1179
  if with_gallium_r600
    llvm_modules += 'asmparser'
  endif
1180
endif
Dylan Baker's avatar
Dylan Baker committed
1181
1182
1183
1184
1185
if with_gallium_opencl
  llvm_modules += [
    'all-targets', 'linker', 'coverage', 'instrumentation', 'ipo', 'irreader',
    'lto', 'option', 'objcarcopts', 'profiledata',
  ]
1186
  llvm_optional_modules += ['coroutines']
Dylan Baker's avatar
Dylan Baker committed
1187
endif
1188

1189
1190
1191
if with_amd_vk or with_gallium_radeonsi
  _llvm_version = '>= 6.0.0'
elif with_gallium_swr
1192
  _llvm_version = '>= 6.0.0'
1193
elif with_gallium_opencl or with_gallium_r600
1194
1195
1196
1197
1198
  _llvm_version = '>= 3.9.0'
else
  _llvm_version = '>= 3.3.0'
endif

1199
1200
_shared_llvm = get_option('shared-llvm')

1201
_llvm = get_option('llvm')
Dylan Baker's avatar
Dylan Baker committed
1202
1203
1204
dep_llvm = null_dep
with_llvm = false
if _llvm != 'false'
1205
1206
1207
1208
1209
  dep_llvm = dependency(
    'llvm',
    version : _llvm_version,
    modules : llvm_modules,
    optional_modules : llvm_optional_modules,
Dylan Baker's avatar
Dylan Baker committed
1210
1211
1212
1213
    required : (
      with_amd_vk or with_gallium_radeonsi or with_gallium_swr or
      with_gallium_opencl or _llvm == 'true'
    ),
1214
    static : not _shared_llvm,
1215
  )
Dylan Baker's avatar
Dylan Baker committed
1216
  with_llvm = dep_llvm.found()
1217
1218
1219
endif
if with_llvm
  _llvm_version = dep_llvm.version().split('.')
1220
1221
1222
1223
1224
1225
1226
1227

  # 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

1228
  pre_args += [
1229
    '-DHAVE_LLVM=0x0@0@0@1@'.format(_llvm_version[0], _llvm_version[1]),
1230
1231
    '-DMESA_LLVM_VERSION_PATCH=@0@'.format(_llvm_patch),
  ]
1232
1233
1234
1235
1236

  # 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'
1237
1238
1239
    if with_gallium_nouveau
      error('The Nouveau driver requires rtti. You either need to turn off nouveau or use an LLVM built with LLVM_ENABLE_RTTI.')
    endif
1240
    cpp_args += '-fno-rtti'
1241
  endif
Dylan Baker's avatar
Dylan Baker committed
1242
elif with_amd_vk or with_gallium_radeonsi or with_gallium_swr
1243
  error('The following drivers require LLVM: Radv, RadeonSI, SWR. One of these is enabled, but LLVM is disabled.')
1244
endif
1245

1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
if (with_amd_vk or with_gallium_radeonsi or with_gallium_opencl or
    (with_gallium_r600 and with_llvm))
  dep_elf = dependency('libelf', required : false)
  if not dep_elf.found()
    dep_elf = cc.find_library('elf')
  endif
else
  dep_elf = null_dep
endif

1256
dep_glvnd = null_dep
Dylan Baker's avatar
Dylan Baker committed
1257
1258
1259
1260
1261
if with_glvnd
  dep_glvnd = dependency('libglvnd', version : '>= 0.2.0')
  pre_args += '-DUSE_LIBGLVND=1'
endif

1262
1263
1264
1265
1266
1267
if with_valgrind != 'false'
  dep_valgrind = dependency('valgrind', required : with_valgrind == 'true')
  if dep_valgrind.found()
    pre_args += '-DHAVE_VALGRIND'
  endif
else
1268
  dep_valgrind = null_dep
1269
1270
1271
1272
endif

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

Dylan Baker's avatar
Dylan Baker committed
1273
1274
1275
prog_bison = find_program('bison', required : with_any_opengl)
prog_flex = find_program('flex', required : with_any_opengl)