xref: /aosp_15_r20/external/mesa3d/meson.build (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker# Copyright © 2017-2020 Intel Corporation
2*61046927SAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT
3*61046927SAndroid Build Coastguard Worker
4*61046927SAndroid Build Coastguard Workerproject(
5*61046927SAndroid Build Coastguard Worker  'mesa',
6*61046927SAndroid Build Coastguard Worker  ['c', 'cpp'],
7*61046927SAndroid Build Coastguard Worker  version : files('VERSION'),
8*61046927SAndroid Build Coastguard Worker  license : 'MIT',
9*61046927SAndroid Build Coastguard Worker  meson_version : '>= 1.1.0',
10*61046927SAndroid Build Coastguard Worker  default_options : [
11*61046927SAndroid Build Coastguard Worker    'buildtype=debugoptimized',
12*61046927SAndroid Build Coastguard Worker    'b_ndebug=if-release',
13*61046927SAndroid Build Coastguard Worker    'c_std=c11',
14*61046927SAndroid Build Coastguard Worker    'cpp_std=c++17',
15*61046927SAndroid Build Coastguard Worker    'rust_std=2021',
16*61046927SAndroid Build Coastguard Worker    'build.rust_std=2021',
17*61046927SAndroid Build Coastguard Worker  ],
18*61046927SAndroid Build Coastguard Worker)
19*61046927SAndroid Build Coastguard Worker
20*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'darwin'
21*61046927SAndroid Build Coastguard Worker  add_languages('objc', native : false)
22*61046927SAndroid Build Coastguard Worker  add_global_arguments('-fobjc-arc', language : 'objc')
23*61046927SAndroid Build Coastguard Workerendif
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Workercc = meson.get_compiler('c')
26*61046927SAndroid Build Coastguard Workercpp = meson.get_compiler('cpp')
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Workersizeof_pointer = cc.sizeof('void*').to_string()
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Workernull_dep = dependency('', required : false)
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Workerif get_option('layout') != 'mirror'
33*61046927SAndroid Build Coastguard Worker  error('`mirror` is the only build directory layout supported')
34*61046927SAndroid Build Coastguard Workerendif
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Workerwith_mesa_debug = get_option('buildtype') == 'debug'
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker# This means the final value of b_ndebug==true
39*61046927SAndroid Build Coastguard Workerwith_mesa_ndebug = get_option('b_ndebug') == 'true' or (get_option('buildtype') == 'release' and get_option('b_ndebug') == 'if-release')
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker# Arguments for the preprocessor, put these in a separate array from the C and
42*61046927SAndroid Build Coastguard Worker# C++ (cpp in meson terminology) arguments since they need to be added to the
43*61046927SAndroid Build Coastguard Worker# default arguments for both C and C++.
44*61046927SAndroid Build Coastguard Workerpre_args = [
45*61046927SAndroid Build Coastguard Worker  '-D__STDC_CONSTANT_MACROS',
46*61046927SAndroid Build Coastguard Worker  '-D__STDC_FORMAT_MACROS',
47*61046927SAndroid Build Coastguard Worker  '-D__STDC_LIMIT_MACROS',
48*61046927SAndroid Build Coastguard Worker  '-DPACKAGE_VERSION="@0@"'.format(meson.project_version()),
49*61046927SAndroid Build Coastguard Worker  '-DPACKAGE_BUGREPORT="https://gitlab.freedesktop.org/mesa/mesa/-/issues"',
50*61046927SAndroid Build Coastguard Worker]
51*61046927SAndroid Build Coastguard Worker# Arguments for c or cpp compiler, can be compiler options
52*61046927SAndroid Build Coastguard Workerc_cpp_args = []
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Workerc_args = []
55*61046927SAndroid Build Coastguard Workercpp_args = []
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Workerwith_moltenvk_dir = get_option('moltenvk-dir')
58*61046927SAndroid Build Coastguard Workerwith_vulkan_icd_dir = get_option('vulkan-icd-dir')
59*61046927SAndroid Build Coastguard Workerwith_tests = get_option('build-tests')
60*61046927SAndroid Build Coastguard Workerwith_glcpp_tests = get_option('enable-glcpp-tests')
61*61046927SAndroid Build Coastguard Workerwith_aco_tests = get_option('build-aco-tests')
62*61046927SAndroid Build Coastguard Workerwith_glx_read_only_text = get_option('glx-read-only-text')
63*61046927SAndroid Build Coastguard Workerwith_glx_direct = get_option('glx-direct')
64*61046927SAndroid Build Coastguard Workerwith_osmesa = get_option('osmesa')
65*61046927SAndroid Build Coastguard Workerwith_vulkan_overlay_layer = get_option('vulkan-layers').contains('overlay')
66*61046927SAndroid Build Coastguard Workerwith_vulkan_device_select_layer = get_option('vulkan-layers').contains('device-select')
67*61046927SAndroid Build Coastguard Workerwith_vulkan_screenshot_layer = get_option('vulkan-layers').contains('screenshot')
68*61046927SAndroid Build Coastguard Workerwith_tools = get_option('tools')
69*61046927SAndroid Build Coastguard Workerif with_tools.contains('all')
70*61046927SAndroid Build Coastguard Worker  with_tools = [
71*61046927SAndroid Build Coastguard Worker    'drm-shim',
72*61046927SAndroid Build Coastguard Worker    'dlclose-skip',
73*61046927SAndroid Build Coastguard Worker    'etnaviv',
74*61046927SAndroid Build Coastguard Worker    'freedreno',
75*61046927SAndroid Build Coastguard Worker    'glsl',
76*61046927SAndroid Build Coastguard Worker    'intel',
77*61046927SAndroid Build Coastguard Worker    'intel-ui',
78*61046927SAndroid Build Coastguard Worker    'lima',
79*61046927SAndroid Build Coastguard Worker    'nir',
80*61046927SAndroid Build Coastguard Worker    'nouveau',
81*61046927SAndroid Build Coastguard Worker    'asahi',
82*61046927SAndroid Build Coastguard Worker    'imagination',
83*61046927SAndroid Build Coastguard Worker  ]
84*61046927SAndroid Build Coastguard Workerendif
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Workerwith_any_vulkan_layers = get_option('vulkan-layers').length() != 0
87*61046927SAndroid Build Coastguard Workerwith_intel_tools = with_tools.contains('intel') or with_tools.contains('intel-ui')
88*61046927SAndroid Build Coastguard Workerwith_imgui = with_intel_tools or with_vulkan_overlay_layer
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Workerdri_drivers_path = get_option('dri-drivers-path')
91*61046927SAndroid Build Coastguard Workerif dri_drivers_path == ''
92*61046927SAndroid Build Coastguard Worker  dri_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'dri')
93*61046927SAndroid Build Coastguard Workerendif
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Workergbm_backends_path = get_option('gbm-backends-path')
96*61046927SAndroid Build Coastguard Workerif gbm_backends_path == ''
97*61046927SAndroid Build Coastguard Worker  gbm_backends_path = join_paths(get_option('prefix'), get_option('libdir'), 'gbm')
98*61046927SAndroid Build Coastguard Workerendif
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker# Default shared glapi disabled for windows, enabled elsewhere.
101*61046927SAndroid Build Coastguard Workerwith_shared_glapi = get_option('shared-glapi') \
102*61046927SAndroid Build Coastguard Worker  .disable_auto_if(host_machine.system() == 'windows') \
103*61046927SAndroid Build Coastguard Worker  .allowed()
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Workerwith_opengl = get_option('opengl')
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Workerwith_gles1 = get_option('gles1') \
108*61046927SAndroid Build Coastguard Worker  .require(with_shared_glapi, error_message : 'OpengGL ES 1.x requires shared-glapi') \
109*61046927SAndroid Build Coastguard Worker  .allowed()
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Workerwith_gles2 = get_option('gles2') \
112*61046927SAndroid Build Coastguard Worker  .require(with_shared_glapi, error_message : 'OpengGL ES 2.x requires shared-glapi') \
113*61046927SAndroid Build Coastguard Worker  .allowed()
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard Workerpre_args += '-DHAVE_OPENGL=@0@'.format(with_opengl.to_int())
116*61046927SAndroid Build Coastguard Workerpre_args += '-DHAVE_OPENGL_ES_1=@0@'.format(with_gles1.to_int())
117*61046927SAndroid Build Coastguard Workerpre_args += '-DHAVE_OPENGL_ES_2=@0@'.format(with_gles2.to_int())
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Workerwith_any_opengl = with_opengl or with_gles1 or with_gles2
120*61046927SAndroid Build Coastguard Worker# Only build shared_glapi if at least one OpenGL API is enabled
121*61046927SAndroid Build Coastguard Workerwith_shared_glapi = with_shared_glapi and with_any_opengl
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Workersystem_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'gnu/kfreebsd', 'dragonfly', 'linux', 'sunos', 'android', 'managarm'].contains(host_machine.system())
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Workergallium_drivers = get_option('gallium-drivers')
126*61046927SAndroid Build Coastguard Workerif gallium_drivers.contains('auto')
127*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm
128*61046927SAndroid Build Coastguard Worker    # TODO: Sparc
129*61046927SAndroid Build Coastguard Worker    if ['x86', 'x86_64'].contains(host_machine.cpu_family())
130*61046927SAndroid Build Coastguard Worker      gallium_drivers = [
131*61046927SAndroid Build Coastguard Worker        'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'svga', 'llvmpipe', 'softpipe',
132*61046927SAndroid Build Coastguard Worker        'iris', 'crocus', 'i915', 'zink'
133*61046927SAndroid Build Coastguard Worker      ]
134*61046927SAndroid Build Coastguard Worker    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
135*61046927SAndroid Build Coastguard Worker      gallium_drivers = [
136*61046927SAndroid Build Coastguard Worker        'v3d', 'vc4', 'freedreno', 'etnaviv', 'nouveau', 'svga',
137*61046927SAndroid Build Coastguard Worker        'tegra', 'virgl', 'lima', 'panfrost', 'llvmpipe', 'softpipe', 'iris',
138*61046927SAndroid Build Coastguard Worker        'zink'
139*61046927SAndroid Build Coastguard Worker      ]
140*61046927SAndroid Build Coastguard Worker    elif ['mips', 'mips64', 'ppc', 'ppc64', 'riscv32', 'riscv64'].contains(host_machine.cpu_family())
141*61046927SAndroid Build Coastguard Worker      gallium_drivers = [
142*61046927SAndroid Build Coastguard Worker        'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'llvmpipe', 'softpipe', 'zink'
143*61046927SAndroid Build Coastguard Worker      ]
144*61046927SAndroid Build Coastguard Worker    elif ['loongarch64'].contains(host_machine.cpu_family())
145*61046927SAndroid Build Coastguard Worker      gallium_drivers = [
146*61046927SAndroid Build Coastguard Worker        'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'etnaviv', 'llvmpipe', 'softpipe', 'zink'
147*61046927SAndroid Build Coastguard Worker      ]
148*61046927SAndroid Build Coastguard Worker    else
149*61046927SAndroid Build Coastguard Worker      error('Unknown architecture @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
150*61046927SAndroid Build Coastguard Worker            host_machine.cpu_family()))
151*61046927SAndroid Build Coastguard Worker    endif
152*61046927SAndroid Build Coastguard Worker  elif ['windows'].contains(host_machine.system())
153*61046927SAndroid Build Coastguard Worker    gallium_drivers = ['llvmpipe', 'softpipe', 'zink', 'd3d12']
154*61046927SAndroid Build Coastguard Worker  elif ['darwin', 'cygwin', 'haiku'].contains(host_machine.system())
155*61046927SAndroid Build Coastguard Worker    gallium_drivers = ['llvmpipe', 'softpipe']
156*61046927SAndroid Build Coastguard Worker  else
157*61046927SAndroid Build Coastguard Worker    error('Unknown OS @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
158*61046927SAndroid Build Coastguard Worker          host_machine.system()))
159*61046927SAndroid Build Coastguard Worker  endif
160*61046927SAndroid Build Coastguard Workerelif gallium_drivers.contains('all')
161*61046927SAndroid Build Coastguard Worker   # Build-test everything except for i915, which depends on libdrm-intel which
162*61046927SAndroid Build Coastguard Worker   # is not available on non-Intel distros.
163*61046927SAndroid Build Coastguard Worker   gallium_drivers = [
164*61046927SAndroid Build Coastguard Worker     'r300', 'r600', 'radeonsi', 'crocus', 'v3d', 'vc4', 'freedreno', 'etnaviv',
165*61046927SAndroid Build Coastguard Worker     'nouveau', 'svga', 'tegra', 'virgl', 'lima', 'panfrost', 'llvmpipe', 'softpipe', 'iris',
166*61046927SAndroid Build Coastguard Worker     'zink', 'd3d12', 'asahi'
167*61046927SAndroid Build Coastguard Worker   ]
168*61046927SAndroid Build Coastguard Workerendif
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker# compatibility for meson configurations asking for 'swrast'
171*61046927SAndroid Build Coastguard Workerwith_swrast = gallium_drivers.contains('swrast')
172*61046927SAndroid Build Coastguard Workerif with_swrast
173*61046927SAndroid Build Coastguard Worker  warning('`gallium-drivers=swrast` is a deprecated alias for `gallium-drivers=softpipe,llvmpipe` and will be removed in version 25.0')
174*61046927SAndroid Build Coastguard Workerendif
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Workerwith_gallium_radeonsi = gallium_drivers.contains('radeonsi')
177*61046927SAndroid Build Coastguard Workerwith_gallium_r300 = gallium_drivers.contains('r300')
178*61046927SAndroid Build Coastguard Workerwith_gallium_r600 = gallium_drivers.contains('r600')
179*61046927SAndroid Build Coastguard Workerwith_gallium_nouveau = gallium_drivers.contains('nouveau')
180*61046927SAndroid Build Coastguard Workerwith_gallium_freedreno = gallium_drivers.contains('freedreno')
181*61046927SAndroid Build Coastguard Workerwith_gallium_softpipe = with_swrast or gallium_drivers.contains('softpipe')
182*61046927SAndroid Build Coastguard Workerwith_gallium_llvmpipe = with_swrast or gallium_drivers.contains('llvmpipe')
183*61046927SAndroid Build Coastguard Workerwith_gallium_vc4 = gallium_drivers.contains('vc4')
184*61046927SAndroid Build Coastguard Workerwith_gallium_v3d = gallium_drivers.contains('v3d')
185*61046927SAndroid Build Coastguard Workerwith_gallium_panfrost = gallium_drivers.contains('panfrost')
186*61046927SAndroid Build Coastguard Workerwith_gallium_etnaviv = gallium_drivers.contains('etnaviv')
187*61046927SAndroid Build Coastguard Workerwith_gallium_tegra = gallium_drivers.contains('tegra')
188*61046927SAndroid Build Coastguard Workerwith_gallium_crocus = gallium_drivers.contains('crocus')
189*61046927SAndroid Build Coastguard Workerwith_gallium_iris = gallium_drivers.contains('iris')
190*61046927SAndroid Build Coastguard Workerwith_gallium_i915 = gallium_drivers.contains('i915')
191*61046927SAndroid Build Coastguard Workerwith_gallium_svga = gallium_drivers.contains('svga')
192*61046927SAndroid Build Coastguard Workerwith_gallium_virgl = gallium_drivers.contains('virgl')
193*61046927SAndroid Build Coastguard Workerwith_gallium_lima = gallium_drivers.contains('lima')
194*61046927SAndroid Build Coastguard Workerwith_gallium_zink = gallium_drivers.contains('zink')
195*61046927SAndroid Build Coastguard Workerwith_gallium_d3d12 = gallium_drivers.contains('d3d12')
196*61046927SAndroid Build Coastguard Workerwith_gallium_asahi = gallium_drivers.contains('asahi')
197*61046927SAndroid Build Coastguard Workerforeach gallium_driver : gallium_drivers
198*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_@0@'.format(gallium_driver.to_upper())
199*61046927SAndroid Build Coastguard Workerendforeach
200*61046927SAndroid Build Coastguard Worker
201*61046927SAndroid Build Coastguard Worker# compatibility for "swrast" as an internal-ish driver name
202*61046927SAndroid Build Coastguard Workerwith_gallium_swrast = with_gallium_softpipe or with_gallium_llvmpipe
203*61046927SAndroid Build Coastguard Workerif with_gallium_swrast
204*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_SWRAST'
205*61046927SAndroid Build Coastguard Workerendif
206*61046927SAndroid Build Coastguard Worker
207*61046927SAndroid Build Coastguard Workerwith_gallium = gallium_drivers.length() != 0
208*61046927SAndroid Build Coastguard Workerwith_gallium_kmsro = system_has_kms_drm and [
209*61046927SAndroid Build Coastguard Worker  with_gallium_asahi,
210*61046927SAndroid Build Coastguard Worker  with_gallium_etnaviv,
211*61046927SAndroid Build Coastguard Worker  with_gallium_freedreno,
212*61046927SAndroid Build Coastguard Worker  with_gallium_lima,
213*61046927SAndroid Build Coastguard Worker  with_gallium_panfrost,
214*61046927SAndroid Build Coastguard Worker  with_gallium_v3d,
215*61046927SAndroid Build Coastguard Worker  with_gallium_vc4,
216*61046927SAndroid Build Coastguard Worker].contains(true)
217*61046927SAndroid Build Coastguard Worker
218*61046927SAndroid Build Coastguard Worker_vulkan_drivers = get_option('vulkan-drivers')
219*61046927SAndroid Build Coastguard Workerif _vulkan_drivers.contains('auto')
220*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm
221*61046927SAndroid Build Coastguard Worker    if host_machine.cpu_family().startswith('x86')
222*61046927SAndroid Build Coastguard Worker      _vulkan_drivers = ['amd', 'intel', 'intel_hasvk', 'nouveau', 'swrast']
223*61046927SAndroid Build Coastguard Worker    elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
224*61046927SAndroid Build Coastguard Worker      _vulkan_drivers = ['swrast', 'intel']
225*61046927SAndroid Build Coastguard Worker    elif ['mips', 'mips64', 'ppc', 'ppc64', 'riscv32', 'riscv64'].contains(host_machine.cpu_family())
226*61046927SAndroid Build Coastguard Worker      _vulkan_drivers = ['amd', 'swrast']
227*61046927SAndroid Build Coastguard Worker    elif ['loongarch64'].contains(host_machine.cpu_family())
228*61046927SAndroid Build Coastguard Worker      _vulkan_drivers = ['amd', 'swrast']
229*61046927SAndroid Build Coastguard Worker    else
230*61046927SAndroid Build Coastguard Worker      error('Unknown architecture @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
231*61046927SAndroid Build Coastguard Worker            host_machine.cpu_family()))
232*61046927SAndroid Build Coastguard Worker    endif
233*61046927SAndroid Build Coastguard Worker  elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
234*61046927SAndroid Build Coastguard Worker    # No vulkan driver supports windows or macOS currently
235*61046927SAndroid Build Coastguard Worker    _vulkan_drivers = []
236*61046927SAndroid Build Coastguard Worker  else
237*61046927SAndroid Build Coastguard Worker    error('Unknown OS @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
238*61046927SAndroid Build Coastguard Worker          host_machine.system()))
239*61046927SAndroid Build Coastguard Worker  endif
240*61046927SAndroid Build Coastguard Workerelif _vulkan_drivers.contains('all')
241*61046927SAndroid Build Coastguard Worker   # Build every vulkan driver regardless of architecture.
242*61046927SAndroid Build Coastguard Worker   _vulkan_drivers = ['amd', 'intel', 'intel_hasvk', 'swrast',
243*61046927SAndroid Build Coastguard Worker                      'freedreno', 'panfrost', 'virtio', 'broadcom',
244*61046927SAndroid Build Coastguard Worker                      'imagination-experimental', 'microsoft-experimental',
245*61046927SAndroid Build Coastguard Worker                      'nouveau', 'asahi', 'gfxstream']
246*61046927SAndroid Build Coastguard Workerendif
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Workerwith_intel_vk = _vulkan_drivers.contains('intel')
249*61046927SAndroid Build Coastguard Workerwith_intel_hasvk = _vulkan_drivers.contains('intel_hasvk')
250*61046927SAndroid Build Coastguard Workerwith_amd_vk = _vulkan_drivers.contains('amd')
251*61046927SAndroid Build Coastguard Workerwith_freedreno_vk = _vulkan_drivers.contains('freedreno')
252*61046927SAndroid Build Coastguard Workerwith_panfrost_vk = _vulkan_drivers.contains('panfrost')
253*61046927SAndroid Build Coastguard Workerwith_swrast_vk = _vulkan_drivers.contains('swrast')
254*61046927SAndroid Build Coastguard Workerwith_virtio_vk = _vulkan_drivers.contains('virtio')
255*61046927SAndroid Build Coastguard Workerwith_broadcom_vk = _vulkan_drivers.contains('broadcom')
256*61046927SAndroid Build Coastguard Workerwith_imagination_vk = _vulkan_drivers.contains('imagination-experimental')
257*61046927SAndroid Build Coastguard Workerwith_imagination_srv = get_option('imagination-srv')
258*61046927SAndroid Build Coastguard Workerwith_microsoft_vk = _vulkan_drivers.contains('microsoft-experimental')
259*61046927SAndroid Build Coastguard Workerwith_nouveau_vk = _vulkan_drivers.contains('nouveau')
260*61046927SAndroid Build Coastguard Workerwith_asahi_vk = _vulkan_drivers.contains('asahi')
261*61046927SAndroid Build Coastguard Workerwith_gfxstream_vk = _vulkan_drivers.contains('gfxstream')
262*61046927SAndroid Build Coastguard Workerwith_any_vk = _vulkan_drivers.length() != 0
263*61046927SAndroid Build Coastguard Worker
264*61046927SAndroid Build Coastguard Workerif with_any_vk and host_machine.system() == 'windows' and meson.version().version_compare('< 1.3')
265*61046927SAndroid Build Coastguard Worker  error('Vulkan drivers on Windows require meson 1.3 or newer')
266*61046927SAndroid Build Coastguard Workerendif
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Workerwith_any_llvmpipe = with_gallium_llvmpipe or with_swrast_vk
269*61046927SAndroid Build Coastguard Workerwith_gallium_or_lvp = with_gallium or with_swrast_vk
270*61046927SAndroid Build Coastguard Worker
271*61046927SAndroid Build Coastguard Workerfreedreno_kmds = get_option('freedreno-kmds')
272*61046927SAndroid Build Coastguard Workerif freedreno_kmds.length() != 0 and freedreno_kmds != [ 'msm' ] and with_freedreno_vk
273*61046927SAndroid Build Coastguard Worker  if freedreno_kmds.contains('msm')
274*61046927SAndroid Build Coastguard Worker      warning('Turnip with the DRM KMD will require libdrm to always be present at runtime which may not always be the case on platforms such as Android.')
275*61046927SAndroid Build Coastguard Worker  elif with_gallium_kmsro
276*61046927SAndroid Build Coastguard Worker      warning('As a side-effect, Turnip is forced to link with libdrm when built alongside Gallium DRM drivers which platforms such as Android may not have available at runtime.')
277*61046927SAndroid Build Coastguard Worker  elif _vulkan_drivers != [ 'freedreno' ]
278*61046927SAndroid Build Coastguard Worker      warning('Turnip is forced to link with libdrm when built alongside other Vulkan drivers which platforms such as Android may not have available at runtime.')
279*61046927SAndroid Build Coastguard Worker  else
280*61046927SAndroid Build Coastguard Worker    # If DRM support isn't needed, we can get rid of it since linking
281*61046927SAndroid Build Coastguard Worker    # to libdrm can be a potential compatibility hazard.
282*61046927SAndroid Build Coastguard Worker    system_has_kms_drm = false
283*61046927SAndroid Build Coastguard Worker  endif
284*61046927SAndroid Build Coastguard Workerendif
285*61046927SAndroid Build Coastguard Worker
286*61046927SAndroid Build Coastguard Workerwith_dri = false
287*61046927SAndroid Build Coastguard Workerif with_gallium and system_has_kms_drm
288*61046927SAndroid Build Coastguard Worker  _glx = get_option('glx')
289*61046927SAndroid Build Coastguard Worker  _egl = get_option('egl')
290*61046927SAndroid Build Coastguard Worker  if _glx == 'dri' or _egl.enabled() or (_glx == 'disabled' and _egl.allowed())
291*61046927SAndroid Build Coastguard Worker    with_dri = true
292*61046927SAndroid Build Coastguard Worker  endif
293*61046927SAndroid Build Coastguard Workerendif
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Workerwith_any_broadcom = [
296*61046927SAndroid Build Coastguard Worker  with_gallium_vc4,
297*61046927SAndroid Build Coastguard Worker  with_gallium_v3d,
298*61046927SAndroid Build Coastguard Worker  with_broadcom_vk,
299*61046927SAndroid Build Coastguard Worker].contains(true)
300*61046927SAndroid Build Coastguard Worker
301*61046927SAndroid Build Coastguard Workerif get_option('intel-clc') != 'system'
302*61046927SAndroid Build Coastguard Worker  # Require intel-clc with Anv & Iris (for internal shaders)
303*61046927SAndroid Build Coastguard Worker  with_intel_clc = get_option('intel-clc') == 'enabled' or \
304*61046927SAndroid Build Coastguard Worker                   with_intel_vk or with_gallium_iris
305*61046927SAndroid Build Coastguard Workerelse
306*61046927SAndroid Build Coastguard Worker  with_intel_clc = false
307*61046927SAndroid Build Coastguard Workerendif
308*61046927SAndroid Build Coastguard Worker
309*61046927SAndroid Build Coastguard Workerwith_intel_vk_rt = get_option('intel-rt') \
310*61046927SAndroid Build Coastguard Worker  .disable_auto_if(not with_intel_vk) \
311*61046927SAndroid Build Coastguard Worker  .disable_if(host_machine.cpu_family() != 'x86_64', error_message : 'Intel Ray Tracing is only supported on x86_64') \
312*61046927SAndroid Build Coastguard Worker  .allowed()
313*61046927SAndroid Build Coastguard Worker
314*61046927SAndroid Build Coastguard Workerwith_any_intel = [
315*61046927SAndroid Build Coastguard Worker  with_gallium_crocus,
316*61046927SAndroid Build Coastguard Worker  with_gallium_i915,
317*61046927SAndroid Build Coastguard Worker  with_gallium_iris,
318*61046927SAndroid Build Coastguard Worker  with_intel_clc,
319*61046927SAndroid Build Coastguard Worker  with_intel_hasvk,
320*61046927SAndroid Build Coastguard Worker  with_intel_tools,
321*61046927SAndroid Build Coastguard Worker  with_intel_vk,
322*61046927SAndroid Build Coastguard Worker].contains(true)
323*61046927SAndroid Build Coastguard Workerwith_any_nouveau = with_gallium_nouveau or with_nouveau_vk
324*61046927SAndroid Build Coastguard Worker
325*61046927SAndroid Build Coastguard Worker# needed in the loader
326*61046927SAndroid Build Coastguard Workerif with_nouveau_vk
327*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_NVK'
328*61046927SAndroid Build Coastguard Workerendif
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Workerif with_gallium_tegra and not with_gallium_nouveau
331*61046927SAndroid Build Coastguard Worker  error('tegra driver requires nouveau driver')
332*61046927SAndroid Build Coastguard Workerendif
333*61046927SAndroid Build Coastguard Workerif with_aco_tests and not with_amd_vk
334*61046927SAndroid Build Coastguard Worker  error('ACO tests require Radv')
335*61046927SAndroid Build Coastguard Workerendif
336*61046927SAndroid Build Coastguard Worker
337*61046927SAndroid Build Coastguard Workerwith_microsoft_clc = get_option('microsoft-clc').enabled()
338*61046927SAndroid Build Coastguard Workerwith_spirv_to_dxil = get_option('spirv-to-dxil')
339*61046927SAndroid Build Coastguard Worker
340*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'darwin'
341*61046927SAndroid Build Coastguard Worker  with_dri_platform = 'apple'
342*61046927SAndroid Build Coastguard Worker  pre_args += '-DBUILDING_MESA'
343*61046927SAndroid Build Coastguard Workerelif ['windows', 'cygwin'].contains(host_machine.system())
344*61046927SAndroid Build Coastguard Worker  with_dri_platform = 'windows'
345*61046927SAndroid Build Coastguard Workerelif system_has_kms_drm
346*61046927SAndroid Build Coastguard Worker  with_dri_platform = 'drm'
347*61046927SAndroid Build Coastguard Workerelse
348*61046927SAndroid Build Coastguard Worker  # FIXME: haiku doesn't use dri, and xlib doesn't use dri, probably should
349*61046927SAndroid Build Coastguard Worker  # assert here that one of those cases has been met.
350*61046927SAndroid Build Coastguard Worker  # FIXME: illumos ends up here as well
351*61046927SAndroid Build Coastguard Worker  with_dri_platform = 'none'
352*61046927SAndroid Build Coastguard Workerendif
353*61046927SAndroid Build Coastguard Worker
354*61046927SAndroid Build Coastguard Workerwith_vulkan_beta = get_option('vulkan-beta')
355*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'darwin'
356*61046927SAndroid Build Coastguard Worker  #macOS seems to need beta extensions to build for now:
357*61046927SAndroid Build Coastguard Worker  with_vulkan_beta = true
358*61046927SAndroid Build Coastguard Workerendif
359*61046927SAndroid Build Coastguard Workerif with_vulkan_beta
360*61046927SAndroid Build Coastguard Worker  pre_args += '-DVK_ENABLE_BETA_EXTENSIONS'
361*61046927SAndroid Build Coastguard Workerendif
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker_codecs = get_option('video-codecs')
364*61046927SAndroid Build Coastguard Workerpatent_codecs = ['vc1dec', 'h264dec', 'h264enc', 'h265dec', 'h265enc']
365*61046927SAndroid Build Coastguard Workerfree_codecs = ['av1dec', 'av1enc', 'vp9dec']
366*61046927SAndroid Build Coastguard Workerall_codecs = patent_codecs + free_codecs
367*61046927SAndroid Build Coastguard Worker
368*61046927SAndroid Build Coastguard Workerif _codecs.contains('all')
369*61046927SAndroid Build Coastguard Worker  _codecs = all_codecs
370*61046927SAndroid Build Coastguard Workerelif _codecs.contains('all_free')
371*61046927SAndroid Build Coastguard Worker  selected_codecs = _codecs
372*61046927SAndroid Build Coastguard Worker  _codecs = free_codecs
373*61046927SAndroid Build Coastguard Worker  foreach c : patent_codecs
374*61046927SAndroid Build Coastguard Worker    if selected_codecs.contains(c)
375*61046927SAndroid Build Coastguard Worker      _codecs += c
376*61046927SAndroid Build Coastguard Worker    endif
377*61046927SAndroid Build Coastguard Worker  endforeach
378*61046927SAndroid Build Coastguard Workerendif
379*61046927SAndroid Build Coastguard Workerforeach c : all_codecs
380*61046927SAndroid Build Coastguard Worker   pre_args += '-DVIDEO_CODEC_@0@=@1@'.format(c.to_upper(), _codecs.contains(c).to_int())
381*61046927SAndroid Build Coastguard Workerendforeach
382*61046927SAndroid Build Coastguard Worker
383*61046927SAndroid Build Coastguard Worker_platforms = get_option('platforms')
384*61046927SAndroid Build Coastguard Workerif _platforms.contains('auto')
385*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm
386*61046927SAndroid Build Coastguard Worker    _platforms = ['x11', 'wayland']
387*61046927SAndroid Build Coastguard Worker  elif host_machine.system() == 'cygwin'
388*61046927SAndroid Build Coastguard Worker    _platforms = ['x11']
389*61046927SAndroid Build Coastguard Worker  elif host_machine.system() == 'haiku'
390*61046927SAndroid Build Coastguard Worker    _platforms = ['haiku']
391*61046927SAndroid Build Coastguard Worker  elif host_machine.system() == 'windows'
392*61046927SAndroid Build Coastguard Worker    _platforms = ['windows']
393*61046927SAndroid Build Coastguard Worker  elif host_machine.system() == 'darwin'
394*61046927SAndroid Build Coastguard Worker    _platforms = ['x11', 'macos']
395*61046927SAndroid Build Coastguard Worker  else
396*61046927SAndroid Build Coastguard Worker    error('Unknown OS @0@. Please pass -Dplatforms to set platforms. Patches gladly accepted to fix this.'.format(
397*61046927SAndroid Build Coastguard Worker          host_machine.system()))
398*61046927SAndroid Build Coastguard Worker  endif
399*61046927SAndroid Build Coastguard Workerendif
400*61046927SAndroid Build Coastguard Worker
401*61046927SAndroid Build Coastguard Workerwith_platform_android = _platforms.contains('android')
402*61046927SAndroid Build Coastguard Workerwith_platform_x11 = _platforms.contains('x11')
403*61046927SAndroid Build Coastguard Workerwith_platform_xcb = _platforms.contains('xcb')
404*61046927SAndroid Build Coastguard Workerwith_platform_wayland = _platforms.contains('wayland')
405*61046927SAndroid Build Coastguard Workerwith_platform_haiku = _platforms.contains('haiku')
406*61046927SAndroid Build Coastguard Workerwith_platform_windows = _platforms.contains('windows')
407*61046927SAndroid Build Coastguard Workerwith_platform_macos = _platforms.contains('macos')
408*61046927SAndroid Build Coastguard Worker
409*61046927SAndroid Build Coastguard Workerwith_glx = get_option('glx')
410*61046927SAndroid Build Coastguard Workerif with_glx == 'auto'
411*61046927SAndroid Build Coastguard Worker  if not with_opengl
412*61046927SAndroid Build Coastguard Worker    with_glx = 'disabled'
413*61046927SAndroid Build Coastguard Worker  elif with_platform_android
414*61046927SAndroid Build Coastguard Worker    with_glx = 'disabled'
415*61046927SAndroid Build Coastguard Worker  elif with_dri
416*61046927SAndroid Build Coastguard Worker    with_glx = 'dri'
417*61046927SAndroid Build Coastguard Worker  elif with_platform_haiku
418*61046927SAndroid Build Coastguard Worker    with_glx = 'disabled'
419*61046927SAndroid Build Coastguard Worker  elif host_machine.system() == 'windows'
420*61046927SAndroid Build Coastguard Worker    with_glx = 'disabled'
421*61046927SAndroid Build Coastguard Worker  elif with_gallium
422*61046927SAndroid Build Coastguard Worker    # Even when building just gallium drivers the user probably wants dri
423*61046927SAndroid Build Coastguard Worker    with_glx = 'dri'
424*61046927SAndroid Build Coastguard Worker  elif with_platform_x11 and with_any_opengl and not with_any_vk
425*61046927SAndroid Build Coastguard Worker    # The automatic behavior should not be to turn on xlib based glx when
426*61046927SAndroid Build Coastguard Worker    # building only vulkan drivers
427*61046927SAndroid Build Coastguard Worker    with_glx = 'xlib'
428*61046927SAndroid Build Coastguard Worker  else
429*61046927SAndroid Build Coastguard Worker    with_glx = 'disabled'
430*61046927SAndroid Build Coastguard Worker  endif
431*61046927SAndroid Build Coastguard Workerendif
432*61046927SAndroid Build Coastguard Workerif with_glx == 'dri'
433*61046927SAndroid Build Coastguard Worker   if with_gallium
434*61046927SAndroid Build Coastguard Worker      with_dri = true
435*61046927SAndroid Build Coastguard Worker   endif
436*61046927SAndroid Build Coastguard Workerendif
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Workerif not with_opengl and with_glx != 'disabled'
439*61046927SAndroid Build Coastguard Worker  error('Building GLX without OpenGL is not supported.')
440*61046927SAndroid Build Coastguard Workerendif
441*61046927SAndroid Build Coastguard Worker
442*61046927SAndroid Build Coastguard Workerif not (with_dri or with_gallium or with_glx != 'disabled')
443*61046927SAndroid Build Coastguard Worker  with_gles1 = false
444*61046927SAndroid Build Coastguard Worker  with_gles2 = false
445*61046927SAndroid Build Coastguard Worker  with_opengl = false
446*61046927SAndroid Build Coastguard Worker  with_any_opengl = false
447*61046927SAndroid Build Coastguard Worker  with_shared_glapi = false
448*61046927SAndroid Build Coastguard Workerendif
449*61046927SAndroid Build Coastguard Worker
450*61046927SAndroid Build Coastguard Workerwith_gbm = get_option('gbm') \
451*61046927SAndroid Build Coastguard Worker  .require(system_has_kms_drm, error_message : 'GBM only supports DRM/KMS platforms') \
452*61046927SAndroid Build Coastguard Worker  .disable_auto_if(not with_dri) \
453*61046927SAndroid Build Coastguard Worker  .allowed()
454*61046927SAndroid Build Coastguard Worker
455*61046927SAndroid Build Coastguard Workerwith_xlib_lease = get_option('xlib-lease') \
456*61046927SAndroid Build Coastguard Worker  .require(with_platform_x11 and (system_has_kms_drm or with_dri_platform == 'apple'), error_message : 'xlib-lease requires X11 and KMS/DRM support') \
457*61046927SAndroid Build Coastguard Worker  .allowed()
458*61046927SAndroid Build Coastguard Worker
459*61046927SAndroid Build Coastguard Workerwith_egl = get_option('egl') \
460*61046927SAndroid Build Coastguard Worker  .require(with_platform_windows or with_platform_haiku or with_dri or with_platform_android, error_message : 'EGL requires DRI, Haiku, Windows or Android') \
461*61046927SAndroid Build Coastguard Worker  .require(with_shared_glapi, error_message : 'EGL requires shared-glapi') \
462*61046927SAndroid Build Coastguard Worker  .require(with_glx != 'xlib', error_message :'EGL requires DRI, but GLX is being built with xlib support') \
463*61046927SAndroid Build Coastguard Worker  .disable_auto_if(with_platform_haiku) \
464*61046927SAndroid Build Coastguard Worker  .allowed()
465*61046927SAndroid Build Coastguard Worker
466*61046927SAndroid Build Coastguard Workerif with_egl
467*61046927SAndroid Build Coastguard Worker  _platforms += 'surfaceless'
468*61046927SAndroid Build Coastguard Worker  if with_gbm and not with_platform_android
469*61046927SAndroid Build Coastguard Worker    _platforms += 'drm'
470*61046927SAndroid Build Coastguard Worker  endif
471*61046927SAndroid Build Coastguard Worker
472*61046927SAndroid Build Coastguard Worker  egl_native_platform = get_option('egl-native-platform')
473*61046927SAndroid Build Coastguard Worker  if egl_native_platform.contains('auto')
474*61046927SAndroid Build Coastguard Worker    egl_native_platform = _platforms[0]
475*61046927SAndroid Build Coastguard Worker  endif
476*61046927SAndroid Build Coastguard Workerendif
477*61046927SAndroid Build Coastguard Worker
478*61046927SAndroid Build Coastguard Workerif with_egl and not _platforms.contains(egl_native_platform)
479*61046927SAndroid Build Coastguard Worker  error('-Degl-native-platform does not specify an enabled platform')
480*61046927SAndroid Build Coastguard Workerendif
481*61046927SAndroid Build Coastguard Worker
482*61046927SAndroid Build Coastguard Workerif 'x11' in _platforms
483*61046927SAndroid Build Coastguard Worker  _platforms += 'xcb'
484*61046927SAndroid Build Coastguard Workerendif
485*61046927SAndroid Build Coastguard Worker
486*61046927SAndroid Build Coastguard Workerforeach platform : _platforms
487*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_@0@_PLATFORM'.format(platform.to_upper())
488*61046927SAndroid Build Coastguard Workerendforeach
489*61046927SAndroid Build Coastguard Worker
490*61046927SAndroid Build Coastguard Workerif with_platform_android and get_option('platform-sdk-version') >= 29
491*61046927SAndroid Build Coastguard Worker  # By default the NDK compiler, at least, emits emutls references instead of
492*61046927SAndroid Build Coastguard Worker  # ELF TLS, even when building targeting newer API levels.  Make it actually do
493*61046927SAndroid Build Coastguard Worker  # ELF TLS instead.
494*61046927SAndroid Build Coastguard Worker  c_cpp_args += '-fno-emulated-tls'
495*61046927SAndroid Build Coastguard Workerendif
496*61046927SAndroid Build Coastguard Worker
497*61046927SAndroid Build Coastguard Worker# -mtls-dialect=gnu2 speeds up non-initial-exec TLS significantly but requires
498*61046927SAndroid Build Coastguard Worker# full toolchain (including libc) support.
499*61046927SAndroid Build Coastguard Workerhave_mtls_dialect = false
500*61046927SAndroid Build Coastguard Workerforeach c_arg : get_option('c_args')
501*61046927SAndroid Build Coastguard Worker  if c_arg.startswith('-mtls-dialect=')
502*61046927SAndroid Build Coastguard Worker    have_mtls_dialect = true
503*61046927SAndroid Build Coastguard Worker    break
504*61046927SAndroid Build Coastguard Worker  endif
505*61046927SAndroid Build Coastguard Workerendforeach
506*61046927SAndroid Build Coastguard Workerif not have_mtls_dialect
507*61046927SAndroid Build Coastguard Worker  # need .run to check libc support. meson aborts when calling .run when
508*61046927SAndroid Build Coastguard Worker  # cross-compiling, but because this is just an optimization we can skip it
509*61046927SAndroid Build Coastguard Worker  if meson.is_cross_build() and not meson.can_run_host_binaries()
510*61046927SAndroid Build Coastguard Worker    warning('cannot auto-detect -mtls-dialect when cross-compiling, using compiler default')
511*61046927SAndroid Build Coastguard Worker  else
512*61046927SAndroid Build Coastguard Worker    # The way to specify the TLSDESC dialect is architecture-specific.
513*61046927SAndroid Build Coastguard Worker    # We probe both because there is not a fallback guaranteed to work for all
514*61046927SAndroid Build Coastguard Worker    # future architectures.
515*61046927SAndroid Build Coastguard Worker    foreach tlsdesc_arg : ['-mtls-dialect=gnu2', '-mtls-dialect=desc']
516*61046927SAndroid Build Coastguard Worker      # -fpic to force dynamic tls, otherwise TLS relaxation defeats check
517*61046927SAndroid Build Coastguard Worker      tlsdesc_test = cc.run('int __thread x; int main() { return x; }',
518*61046927SAndroid Build Coastguard Worker                            args: [tlsdesc_arg, '-fpic'],
519*61046927SAndroid Build Coastguard Worker                            name: tlsdesc_arg)
520*61046927SAndroid Build Coastguard Worker      if tlsdesc_test.returncode() == 0 and (
521*61046927SAndroid Build Coastguard Worker            # check for lld 13 bug: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5665
522*61046927SAndroid Build Coastguard Worker            host_machine.cpu_family() != 'x86_64' or
523*61046927SAndroid Build Coastguard Worker            # get_linker_id misses LDFLAGS=-fuse-ld=lld: https://github.com/mesonbuild/meson/issues/6377
524*61046927SAndroid Build Coastguard Worker            #cc.get_linker_id() != 'ld.lld' or
525*61046927SAndroid Build Coastguard Worker            cc.links('''int __thread x; int y; int main() { __asm__(
526*61046927SAndroid Build Coastguard Worker                  "leaq x@TLSDESC(%rip), %rax\n"
527*61046927SAndroid Build Coastguard Worker                  "movq y@GOTPCREL(%rip), %rdx\n"
528*61046927SAndroid Build Coastguard Worker                  "call *x@TLSCALL(%rax)\n"); }''', name: 'split TLSDESC')
529*61046927SAndroid Build Coastguard Worker            )
530*61046927SAndroid Build Coastguard Worker        c_cpp_args += tlsdesc_arg
531*61046927SAndroid Build Coastguard Worker        break
532*61046927SAndroid Build Coastguard Worker      endif
533*61046927SAndroid Build Coastguard Worker    endforeach
534*61046927SAndroid Build Coastguard Worker  endif
535*61046927SAndroid Build Coastguard Workerendif
536*61046927SAndroid Build Coastguard Worker
537*61046927SAndroid Build Coastguard Workerif with_glx != 'disabled'
538*61046927SAndroid Build Coastguard Worker  if not (with_platform_x11 and with_any_opengl)
539*61046927SAndroid Build Coastguard Worker    error('Cannot build GLX support without X11 platform support and at least one OpenGL API')
540*61046927SAndroid Build Coastguard Worker  elif with_glx == 'xlib'
541*61046927SAndroid Build Coastguard Worker    if not with_gallium
542*61046927SAndroid Build Coastguard Worker      error('xlib based GLX requires at least one gallium driver')
543*61046927SAndroid Build Coastguard Worker    elif not with_gallium_swrast
544*61046927SAndroid Build Coastguard Worker      error('xlib based GLX requires softpipe or llvmpipe.')
545*61046927SAndroid Build Coastguard Worker    elif with_dri
546*61046927SAndroid Build Coastguard Worker      error('xlib conflicts with any dri driver')
547*61046927SAndroid Build Coastguard Worker    endif
548*61046927SAndroid Build Coastguard Worker  elif with_glx == 'dri'
549*61046927SAndroid Build Coastguard Worker    if not with_shared_glapi
550*61046927SAndroid Build Coastguard Worker      error('dri based GLX requires shared-glapi')
551*61046927SAndroid Build Coastguard Worker    endif
552*61046927SAndroid Build Coastguard Worker  endif
553*61046927SAndroid Build Coastguard Workerendif
554*61046927SAndroid Build Coastguard Worker
555*61046927SAndroid Build Coastguard Worker_glvnd = get_option('glvnd') \
556*61046927SAndroid Build Coastguard Worker  .require(not with_platform_windows,
557*61046927SAndroid Build Coastguard Worker           error_message: 'glvnd cannot be used on Windows') \
558*61046927SAndroid Build Coastguard Worker  .require(with_glx != 'xlib',
559*61046927SAndroid Build Coastguard Worker           error_message: 'Cannot build glvnd support for GLX that is not DRI based.') \
560*61046927SAndroid Build Coastguard Worker  .require(with_glx != 'disabled' or with_egl,
561*61046927SAndroid Build Coastguard Worker           error_message: 'glvnd requires DRI based GLX and/or EGL') \
562*61046927SAndroid Build Coastguard Worker  .require(get_option('egl-lib-suffix') == '',
563*61046927SAndroid Build Coastguard Worker           error_message: '''EGL lib suffix can't be used with libglvnd''')
564*61046927SAndroid Build Coastguard Workerdep_glvnd = dependency('libglvnd', version : '>= 1.3.2', required : _glvnd)
565*61046927SAndroid Build Coastguard Workerwith_glvnd = dep_glvnd.found()
566*61046927SAndroid Build Coastguard Workerpre_args += '-DUSE_LIBGLVND=@0@'.format(with_glvnd.to_int())
567*61046927SAndroid Build Coastguard Workerglvnd_vendor_name = get_option('glvnd-vendor-name')
568*61046927SAndroid Build Coastguard Worker
569*61046927SAndroid Build Coastguard Workerif with_vulkan_icd_dir == ''
570*61046927SAndroid Build Coastguard Worker  with_vulkan_icd_dir = join_paths(get_option('datadir'), 'vulkan/icd.d')
571*61046927SAndroid Build Coastguard Workerendif
572*61046927SAndroid Build Coastguard Worker
573*61046927SAndroid Build Coastguard Workerwith_dri2 = (with_dri or with_any_vk) and (with_dri_platform == 'drm' or with_dri_platform == 'apple')
574*61046927SAndroid Build Coastguard Worker
575*61046927SAndroid Build Coastguard Workerwith_x11_dri2 = with_dri2 and get_option('legacy-x11').contains('dri2')
576*61046927SAndroid Build Coastguard Worker
577*61046927SAndroid Build Coastguard Workerif with_dri
578*61046927SAndroid Build Coastguard Worker  if with_glx == 'disabled' and not with_egl and not with_gbm
579*61046927SAndroid Build Coastguard Worker    error('building dri drivers require at least one windowing system')
580*61046927SAndroid Build Coastguard Worker  endif
581*61046927SAndroid Build Coastguard Workerendif
582*61046927SAndroid Build Coastguard Worker
583*61046927SAndroid Build Coastguard Workerdep_dxheaders = null_dep
584*61046927SAndroid Build Coastguard Workerif with_gallium_d3d12 or with_microsoft_clc or with_microsoft_vk
585*61046927SAndroid Build Coastguard Worker  dep_dxheaders = dependency('directx-headers', required : false)
586*61046927SAndroid Build Coastguard Worker  if not dep_dxheaders.found()
587*61046927SAndroid Build Coastguard Worker    dep_dxheaders = dependency('DirectX-Headers',
588*61046927SAndroid Build Coastguard Worker      version : '>= 1.614.1',
589*61046927SAndroid Build Coastguard Worker      fallback : ['DirectX-Headers', 'dep_dxheaders'],
590*61046927SAndroid Build Coastguard Worker      required : with_gallium_d3d12 or with_microsoft_vk
591*61046927SAndroid Build Coastguard Worker    )
592*61046927SAndroid Build Coastguard Worker  endif
593*61046927SAndroid Build Coastguard Workerendif
594*61046927SAndroid Build Coastguard Worker
595*61046927SAndroid Build Coastguard Worker_with_gallium_d3d12_video = get_option('gallium-d3d12-video')
596*61046927SAndroid Build Coastguard Workerwith_gallium_d3d12_video = false
597*61046927SAndroid Build Coastguard Workerif with_gallium_d3d12 and not _with_gallium_d3d12_video.disabled()
598*61046927SAndroid Build Coastguard Worker  with_gallium_d3d12_video = true
599*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_GALLIUM_D3D12_VIDEO'
600*61046927SAndroid Build Coastguard Workerendif
601*61046927SAndroid Build Coastguard Worker
602*61046927SAndroid Build Coastguard Worker_vdpau_drivers = [
603*61046927SAndroid Build Coastguard Worker  with_gallium_d3d12_video,
604*61046927SAndroid Build Coastguard Worker  with_gallium_nouveau,
605*61046927SAndroid Build Coastguard Worker  with_gallium_r600,
606*61046927SAndroid Build Coastguard Worker  with_gallium_radeonsi,
607*61046927SAndroid Build Coastguard Worker  with_gallium_virgl,
608*61046927SAndroid Build Coastguard Worker]
609*61046927SAndroid Build Coastguard Worker
610*61046927SAndroid Build Coastguard Workervdpau = get_option('gallium-vdpau') \
611*61046927SAndroid Build Coastguard Worker  .require(system_has_kms_drm, error_message : 'VDPAU state tracker can only be build on unix-like OSes.') \
612*61046927SAndroid Build Coastguard Worker  .require(with_platform_x11, error_message : 'VDPAU state tracker requires X11 support.') \
613*61046927SAndroid Build Coastguard Worker  .require(_vdpau_drivers.contains(true), error_message : 'VDPAU state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau, d3d12 (with option gallium-d3d12-video, virgl).')
614*61046927SAndroid Build Coastguard Worker
615*61046927SAndroid Build Coastguard Workerdep_vdpau = dependency('vdpau', version : '>= 1.5', required : vdpau)
616*61046927SAndroid Build Coastguard Workerif dep_vdpau.found()
617*61046927SAndroid Build Coastguard Worker  dep_vdpau = dep_vdpau.partial_dependency(compile_args : true)
618*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_ST_VDPAU'
619*61046927SAndroid Build Coastguard Workerendif
620*61046927SAndroid Build Coastguard Workerwith_gallium_vdpau = dep_vdpau.found()
621*61046927SAndroid Build Coastguard Worker
622*61046927SAndroid Build Coastguard Workervdpau_drivers_path = get_option('vdpau-libs-path')
623*61046927SAndroid Build Coastguard Workerif vdpau_drivers_path == ''
624*61046927SAndroid Build Coastguard Worker  vdpau_drivers_path = join_paths(get_option('libdir'), 'vdpau')
625*61046927SAndroid Build Coastguard Workerendif
626*61046927SAndroid Build Coastguard Worker
627*61046927SAndroid Build Coastguard Worker# GLSL has interesting version output and Meson doesn't parse it correctly as of
628*61046927SAndroid Build Coastguard Worker# Meson 1.4.0
629*61046927SAndroid Build Coastguard Workerprog_glslang = find_program('glslangValidator', native : true,
630*61046927SAndroid Build Coastguard Worker                            required : with_vulkan_overlay_layer or with_aco_tests or with_amd_vk or with_intel_vk)
631*61046927SAndroid Build Coastguard Workerif prog_glslang.found()
632*61046927SAndroid Build Coastguard Worker  # Check if glslang has depfile support. Support was added in 11.3.0, but
633*61046927SAndroid Build Coastguard Worker  # Windows path support was broken until 11.9.0.
634*61046927SAndroid Build Coastguard Worker  #
635*61046927SAndroid Build Coastguard Worker  # It is intentional to check the build machine, since we need to ensure that
636*61046927SAndroid Build Coastguard Worker  # glslang will output valid paths on the build platform
637*61046927SAndroid Build Coastguard Worker  _glslang_check = build_machine.system() == 'windows' ? '>= 11.9.0' : '>= 11.3.0'
638*61046927SAndroid Build Coastguard Worker  if run_command(prog_glslang, ['--version'], check : false).stdout().split(':')[2].version_compare(_glslang_check)
639*61046927SAndroid Build Coastguard Worker    glslang_depfile = ['--depfile', '@DEPFILE@']
640*61046927SAndroid Build Coastguard Worker  else
641*61046927SAndroid Build Coastguard Worker    glslang_depfile = []
642*61046927SAndroid Build Coastguard Worker  endif
643*61046927SAndroid Build Coastguard Worker  if run_command(prog_glslang, [ '--quiet', '--version' ], check : false).returncode() == 0
644*61046927SAndroid Build Coastguard Worker    glslang_quiet = ['--quiet']
645*61046927SAndroid Build Coastguard Worker  else
646*61046927SAndroid Build Coastguard Worker    glslang_quiet = []
647*61046927SAndroid Build Coastguard Worker  endif
648*61046927SAndroid Build Coastguard Workerendif
649*61046927SAndroid Build Coastguard Worker
650*61046927SAndroid Build Coastguard Worker_va_drivers = [
651*61046927SAndroid Build Coastguard Worker  with_gallium_d3d12_video,
652*61046927SAndroid Build Coastguard Worker  with_gallium_nouveau,
653*61046927SAndroid Build Coastguard Worker  with_gallium_r600,
654*61046927SAndroid Build Coastguard Worker  with_gallium_radeonsi,
655*61046927SAndroid Build Coastguard Worker  with_gallium_virgl,
656*61046927SAndroid Build Coastguard Worker]
657*61046927SAndroid Build Coastguard Worker
658*61046927SAndroid Build Coastguard Worker_va = get_option('gallium-va') \
659*61046927SAndroid Build Coastguard Worker  .require(_va_drivers.contains(true),
660*61046927SAndroid Build Coastguard Worker           error_message : 'VA state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau, d3d12 (with option gallium-d3d12-video), virgl.')
661*61046927SAndroid Build Coastguard Worker_dep_va_name = host_machine.system() == 'windows' ? 'libva-win32' : 'libva'
662*61046927SAndroid Build Coastguard Workerdep_va = dependency(_dep_va_name, version : '>= 1.8.0', required : _va)
663*61046927SAndroid Build Coastguard Workerif dep_va.found()
664*61046927SAndroid Build Coastguard Worker  dep_va_headers = dep_va.partial_dependency(compile_args : true)
665*61046927SAndroid Build Coastguard Worker  if cc.has_header_symbol('va/va.h', 'VASurfaceAttribDRMFormatModifiers',
666*61046927SAndroid Build Coastguard Worker                          dependencies: dep_va_headers)
667*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAVE_VA_SURFACE_ATTRIB_DRM_FORMAT_MODIFIERS'
668*61046927SAndroid Build Coastguard Worker  endif
669*61046927SAndroid Build Coastguard Workerendif
670*61046927SAndroid Build Coastguard Workerwith_gallium_va = dep_va.found()
671*61046927SAndroid Build Coastguard Worker
672*61046927SAndroid Build Coastguard Workerva_drivers_path = get_option('va-libs-path')
673*61046927SAndroid Build Coastguard Workerif va_drivers_path == ''
674*61046927SAndroid Build Coastguard Worker  va_drivers_path = join_paths(get_option('libdir'), 'dri')
675*61046927SAndroid Build Coastguard Workerendif
676*61046927SAndroid Build Coastguard Worker
677*61046927SAndroid Build Coastguard Workerwith_gallium_xa = get_option('gallium-xa') \
678*61046927SAndroid Build Coastguard Worker  .require(system_has_kms_drm, error_message : 'XA state tracker can only be built on unix-like OSes.') \
679*61046927SAndroid Build Coastguard Worker  .require(with_gallium_nouveau or with_gallium_freedreno or with_gallium_i915 or with_gallium_svga,
680*61046927SAndroid Build Coastguard Worker           error_message : 'XA state tracker requires at least one of the following gallium drivers: nouveau, freedreno, i915, svga.') \
681*61046927SAndroid Build Coastguard Worker  .allowed()
682*61046927SAndroid Build Coastguard Worker
683*61046927SAndroid Build Coastguard Workerd3d_drivers_path = get_option('d3d-drivers-path')
684*61046927SAndroid Build Coastguard Workerif d3d_drivers_path == ''
685*61046927SAndroid Build Coastguard Worker  d3d_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'd3d')
686*61046927SAndroid Build Coastguard Workerendif
687*61046927SAndroid Build Coastguard Worker
688*61046927SAndroid Build Coastguard Workerwith_gallium_st_nine =  get_option('gallium-nine')
689*61046927SAndroid Build Coastguard Workerif with_gallium_st_nine
690*61046927SAndroid Build Coastguard Worker  if not with_gallium_swrast
691*61046927SAndroid Build Coastguard Worker    error('The nine state tracker requires gallium softpipe/llvmpipe.')
692*61046927SAndroid Build Coastguard Worker  elif not [
693*61046927SAndroid Build Coastguard Worker             with_gallium_crocus,
694*61046927SAndroid Build Coastguard Worker             with_gallium_freedreno,
695*61046927SAndroid Build Coastguard Worker             with_gallium_i915,
696*61046927SAndroid Build Coastguard Worker             with_gallium_iris,
697*61046927SAndroid Build Coastguard Worker             with_gallium_nouveau,
698*61046927SAndroid Build Coastguard Worker             with_gallium_panfrost,
699*61046927SAndroid Build Coastguard Worker             with_gallium_r300,
700*61046927SAndroid Build Coastguard Worker             with_gallium_r600,
701*61046927SAndroid Build Coastguard Worker             with_gallium_radeonsi,
702*61046927SAndroid Build Coastguard Worker             with_gallium_svga,
703*61046927SAndroid Build Coastguard Worker             with_gallium_zink,
704*61046927SAndroid Build Coastguard Worker           ].contains(true)
705*61046927SAndroid Build Coastguard Worker    error('The nine state tracker requires at least one non-swrast gallium driver.')
706*61046927SAndroid Build Coastguard Worker  endif
707*61046927SAndroid Build Coastguard Workerendif
708*61046927SAndroid Build Coastguard Workerwith_gallium_st_d3d10umd =  get_option('gallium-d3d10umd')
709*61046927SAndroid Build Coastguard Workerif with_gallium_st_d3d10umd
710*61046927SAndroid Build Coastguard Worker  if not with_gallium_swrast
711*61046927SAndroid Build Coastguard Worker    error('The d3d10umd state tracker requires gallium softpipe/llvmpipe.')
712*61046927SAndroid Build Coastguard Worker  endif
713*61046927SAndroid Build Coastguard Workerendif
714*61046927SAndroid Build Coastguard Worker_power8 = get_option('power8')
715*61046927SAndroid Build Coastguard Workerif _power8.allowed()
716*61046927SAndroid Build Coastguard Worker  if host_machine.cpu_family() == 'ppc64' and host_machine.endian() == 'little'
717*61046927SAndroid Build Coastguard Worker    if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.8')
718*61046927SAndroid Build Coastguard Worker      error('Altivec is not supported with gcc version < 4.8.')
719*61046927SAndroid Build Coastguard Worker    endif
720*61046927SAndroid Build Coastguard Worker    if cc.compiles('''
721*61046927SAndroid Build Coastguard Worker        #include <altivec.h>
722*61046927SAndroid Build Coastguard Worker        int main() {
723*61046927SAndroid Build Coastguard Worker          vector unsigned char r;
724*61046927SAndroid Build Coastguard Worker          vector unsigned int v = vec_splat_u32 (1);
725*61046927SAndroid Build Coastguard Worker          r = __builtin_vec_vgbbd ((vector unsigned char) v);
726*61046927SAndroid Build Coastguard Worker          return 0;
727*61046927SAndroid Build Coastguard Worker        }''',
728*61046927SAndroid Build Coastguard Worker        args : '-mpower8-vector',
729*61046927SAndroid Build Coastguard Worker        name : 'POWER8 intrinsics')
730*61046927SAndroid Build Coastguard Worker      pre_args += ['-D_ARCH_PWR8']
731*61046927SAndroid Build Coastguard Worker      c_cpp_args += '-mpower8-vector'
732*61046927SAndroid Build Coastguard Worker    elif _power8.enabled()
733*61046927SAndroid Build Coastguard Worker      error('POWER8 intrinsic support required but not found.')
734*61046927SAndroid Build Coastguard Worker    endif
735*61046927SAndroid Build Coastguard Worker  endif
736*61046927SAndroid Build Coastguard Workerendif
737*61046927SAndroid Build Coastguard Worker
738*61046927SAndroid Build Coastguard Workerif get_option('vmware-mks-stats')
739*61046927SAndroid Build Coastguard Worker  if not with_gallium_svga
740*61046927SAndroid Build Coastguard Worker    error('vmware-mks-stats requires gallium VMware/svga driver.')
741*61046927SAndroid Build Coastguard Worker  endif
742*61046927SAndroid Build Coastguard Worker  pre_args += '-DVMX86_STATS=1'
743*61046927SAndroid Build Coastguard Workerendif
744*61046927SAndroid Build Coastguard Worker
745*61046927SAndroid Build Coastguard Worker_opencl = get_option('gallium-opencl')
746*61046927SAndroid Build Coastguard Worker_rtti = get_option('cpp_rtti')
747*61046927SAndroid Build Coastguard Workerif _opencl != 'disabled'
748*61046927SAndroid Build Coastguard Worker  if not with_gallium
749*61046927SAndroid Build Coastguard Worker    error('OpenCL Clover implementation requires at least one gallium driver.')
750*61046927SAndroid Build Coastguard Worker  endif
751*61046927SAndroid Build Coastguard Worker  if not _rtti
752*61046927SAndroid Build Coastguard Worker    error('The Clover OpenCL state tracker requires rtti')
753*61046927SAndroid Build Coastguard Worker  endif
754*61046927SAndroid Build Coastguard Worker
755*61046927SAndroid Build Coastguard Worker  with_gallium_clover = true
756*61046927SAndroid Build Coastguard Worker  with_opencl_icd = _opencl == 'icd'
757*61046927SAndroid Build Coastguard Workerelse
758*61046927SAndroid Build Coastguard Worker  with_gallium_clover = false
759*61046927SAndroid Build Coastguard Worker  with_opencl_icd = false
760*61046927SAndroid Build Coastguard Workerendif
761*61046927SAndroid Build Coastguard Worker
762*61046927SAndroid Build Coastguard Workerwith_gallium_rusticl = get_option('gallium-rusticl')
763*61046927SAndroid Build Coastguard Workerif with_gallium_rusticl
764*61046927SAndroid Build Coastguard Worker  if not with_gallium
765*61046927SAndroid Build Coastguard Worker    error('rusticl requires at least one gallium driver.')
766*61046927SAndroid Build Coastguard Worker  endif
767*61046927SAndroid Build Coastguard Workerendif
768*61046927SAndroid Build Coastguard Worker
769*61046927SAndroid Build Coastguard Workerif with_gallium_rusticl or with_nouveau_vk or with_tools.contains('etnaviv')
770*61046927SAndroid Build Coastguard Worker  if with_gallium_rusticl
771*61046927SAndroid Build Coastguard Worker    # uses rust.bindgen.output_inline_wrapper needing 1.4.0
772*61046927SAndroid Build Coastguard Worker    if meson.version().version_compare('< 1.4.0')
773*61046927SAndroid Build Coastguard Worker      error('Rusticl requires meson 1.4.0 or newer')
774*61046927SAndroid Build Coastguard Worker    endif
775*61046927SAndroid Build Coastguard Worker  else
776*61046927SAndroid Build Coastguard Worker    # see https://github.com/mesonbuild/meson/issues/12758 (backported to 1.3.2)
777*61046927SAndroid Build Coastguard Worker    if meson.version().version_compare('< 1.3.2')
778*61046927SAndroid Build Coastguard Worker      error('Mesa Rust support requires meson 1.3.2 or newer')
779*61046927SAndroid Build Coastguard Worker    endif
780*61046927SAndroid Build Coastguard Worker  endif
781*61046927SAndroid Build Coastguard Worker
782*61046927SAndroid Build Coastguard Worker  add_languages('rust', required: true)
783*61046927SAndroid Build Coastguard Worker  rustc = meson.get_compiler('rust')
784*61046927SAndroid Build Coastguard Worker  rust = import('rust')
785*61046927SAndroid Build Coastguard Worker
786*61046927SAndroid Build Coastguard Worker  if rustc.version().version_compare('< 1.76')
787*61046927SAndroid Build Coastguard Worker    error('Mesa requires Rust 1.76.0 or newer')
788*61046927SAndroid Build Coastguard Worker  endif
789*61046927SAndroid Build Coastguard Worker
790*61046927SAndroid Build Coastguard Worker  bindgen_version = find_program('bindgen').version()
791*61046927SAndroid Build Coastguard Worker  if bindgen_version == 'unknown'
792*61046927SAndroid Build Coastguard Worker    error('Failed to detect bindgen version. If you are using bindgen 0.69.0, ' +
793*61046927SAndroid Build Coastguard Worker          'please either update to 0.69.1 or downgrade to 0.68.1. ' +
794*61046927SAndroid Build Coastguard Worker          'You can install the latest version for your user with `cargo install bindgen-cli`.')
795*61046927SAndroid Build Coastguard Worker  endif
796*61046927SAndroid Build Coastguard Worker
797*61046927SAndroid Build Coastguard Worker  if bindgen_version.version_compare('< 0.65')
798*61046927SAndroid Build Coastguard Worker    error('Mesa requires bindgen 0.65 or newer. ' +
799*61046927SAndroid Build Coastguard Worker          'If your distribution does not ship a recent enough version, ' +
800*61046927SAndroid Build Coastguard Worker          'you can install the latest version for your user with `cargo install bindgen-cli`.')
801*61046927SAndroid Build Coastguard Worker  endif
802*61046927SAndroid Build Coastguard Workerendif
803*61046927SAndroid Build Coastguard Worker
804*61046927SAndroid Build Coastguard Workerwith_clover_spirv = with_gallium_clover and get_option('opencl-spirv')
805*61046927SAndroid Build Coastguard Workerwith_clc = with_microsoft_clc or with_intel_clc or with_gallium_asahi or with_asahi_vk or with_gallium_rusticl or with_clover_spirv
806*61046927SAndroid Build Coastguard Worker
807*61046927SAndroid Build Coastguard Workerdep_clc = null_dep
808*61046927SAndroid Build Coastguard Workerif with_gallium_clover or with_clc
809*61046927SAndroid Build Coastguard Worker  dep_clc = dependency('libclc')
810*61046927SAndroid Build Coastguard Workerendif
811*61046927SAndroid Build Coastguard Worker
812*61046927SAndroid Build Coastguard Workergl_pkgconfig_c_flags = []
813*61046927SAndroid Build Coastguard Workerwith_glx_indirect_rendering = false
814*61046927SAndroid Build Coastguard Workerif with_platform_x11
815*61046927SAndroid Build Coastguard Worker  if with_glx == 'xlib'
816*61046927SAndroid Build Coastguard Worker    pre_args += '-DUSE_XSHM'
817*61046927SAndroid Build Coastguard Worker  else
818*61046927SAndroid Build Coastguard Worker    with_glx_indirect_rendering = true
819*61046927SAndroid Build Coastguard Worker    pre_args += '-DGLX_INDIRECT_RENDERING'
820*61046927SAndroid Build Coastguard Worker    if with_glx_direct
821*61046927SAndroid Build Coastguard Worker      pre_args += '-DGLX_DIRECT_RENDERING'
822*61046927SAndroid Build Coastguard Worker    endif
823*61046927SAndroid Build Coastguard Worker    if with_dri_platform == 'drm'
824*61046927SAndroid Build Coastguard Worker      pre_args += '-DGLX_USE_DRM'
825*61046927SAndroid Build Coastguard Worker    elif with_dri_platform == 'apple'
826*61046927SAndroid Build Coastguard Worker      pre_args += '-DGLX_USE_APPLEGL'
827*61046927SAndroid Build Coastguard Worker      # Check to see if more than just the default 'swrast' is required
828*61046927SAndroid Build Coastguard Worker      if (not with_gallium_softpipe) or 1 < gallium_drivers.length()
829*61046927SAndroid Build Coastguard Worker        # Switch the MacOS code from "forwarding to the OpenGL.framework" mode
830*61046927SAndroid Build Coastguard Worker        # and into actual Gallium Driver mode
831*61046927SAndroid Build Coastguard Worker        pre_args += '-DGLX_USE_APPLE'
832*61046927SAndroid Build Coastguard Worker      endif
833*61046927SAndroid Build Coastguard Worker    elif with_dri_platform == 'windows'
834*61046927SAndroid Build Coastguard Worker      pre_args += '-DGLX_USE_WINDOWSGL'
835*61046927SAndroid Build Coastguard Worker    endif
836*61046927SAndroid Build Coastguard Worker  endif
837*61046927SAndroid Build Coastguard Workerendif
838*61046927SAndroid Build Coastguard Worker
839*61046927SAndroid Build Coastguard Workerwith_glapi_export_proto_entry_points = false
840*61046927SAndroid Build Coastguard Workerif with_shared_glapi and not with_glx_indirect_rendering
841*61046927SAndroid Build Coastguard Worker  # Imply !defined(GLX_INDIRECT_RENDERING)
842*61046927SAndroid Build Coastguard Worker  with_glapi_export_proto_entry_points = true
843*61046927SAndroid Build Coastguard Workerendif
844*61046927SAndroid Build Coastguard Workerpre_args += '-DGLAPI_EXPORT_PROTO_ENTRY_POINTS=@0@'.format(with_glapi_export_proto_entry_points.to_int())
845*61046927SAndroid Build Coastguard Worker
846*61046927SAndroid Build Coastguard Workerwith_android_stub = get_option('android-stub')
847*61046927SAndroid Build Coastguard Workerif with_android_stub and not with_platform_android
848*61046927SAndroid Build Coastguard Worker  error('`-D android-stub=true` makes no sense without `-D platforms=android`')
849*61046927SAndroid Build Coastguard Workerendif
850*61046927SAndroid Build Coastguard Worker
851*61046927SAndroid Build Coastguard Workerwith_libbacktrace = get_option('android-libbacktrace') \
852*61046927SAndroid Build Coastguard Worker  .require(with_platform_android, error_message : '`-D android-libbacktrace=enabled` makes no sense without `-D platforms=android`') \
853*61046927SAndroid Build Coastguard Worker  .disable_auto_if(not with_platform_android) \
854*61046927SAndroid Build Coastguard Worker  .allowed()
855*61046927SAndroid Build Coastguard Worker
856*61046927SAndroid Build Coastguard Workerif with_libbacktrace
857*61046927SAndroid Build Coastguard Worker  cpp_args += '-DWITH_LIBBACKTRACE'
858*61046927SAndroid Build Coastguard Workerendif
859*61046927SAndroid Build Coastguard Worker
860*61046927SAndroid Build Coastguard Workerif with_platform_android
861*61046927SAndroid Build Coastguard Worker  dep_android_mapper4 = null_dep
862*61046927SAndroid Build Coastguard Worker  if not with_android_stub
863*61046927SAndroid Build Coastguard Worker    dep_android = [
864*61046927SAndroid Build Coastguard Worker      dependency('cutils'),
865*61046927SAndroid Build Coastguard Worker      dependency('hardware'),
866*61046927SAndroid Build Coastguard Worker      dependency('log'),
867*61046927SAndroid Build Coastguard Worker      dependency('sync'),
868*61046927SAndroid Build Coastguard Worker    ]
869*61046927SAndroid Build Coastguard Worker    if with_libbacktrace
870*61046927SAndroid Build Coastguard Worker      dep_android += dependency('backtrace')
871*61046927SAndroid Build Coastguard Worker    endif
872*61046927SAndroid Build Coastguard Worker    if get_option('platform-sdk-version') >= 26
873*61046927SAndroid Build Coastguard Worker      dep_android += dependency('nativewindow')
874*61046927SAndroid Build Coastguard Worker    endif
875*61046927SAndroid Build Coastguard Worker    if get_option('platform-sdk-version') >= 30
876*61046927SAndroid Build Coastguard Worker      dep_android_mapper4 = dependency('android.hardware.graphics.mapper', version : '>= 4.0', required : false)
877*61046927SAndroid Build Coastguard Worker    endif
878*61046927SAndroid Build Coastguard Worker  endif
879*61046927SAndroid Build Coastguard Worker  pre_args += '-DANDROID_API_LEVEL=' + get_option('platform-sdk-version').to_string()
880*61046927SAndroid Build Coastguard Worker  if get_option('android-strict')
881*61046927SAndroid Build Coastguard Worker    pre_args += '-DANDROID_STRICT'
882*61046927SAndroid Build Coastguard Worker  endif
883*61046927SAndroid Build Coastguard Workerendif
884*61046927SAndroid Build Coastguard Worker
885*61046927SAndroid Build Coastguard Worker# On Android, seccomp kills the process on kernels without
886*61046927SAndroid Build Coastguard Worker# CONFIG_KCMP/CONFIG_CHECKPOINT_RESTORE if it attemps to use KCMP.
887*61046927SAndroid Build Coastguard Worker# Since we can't detect that, err on the side of caution and disable
888*61046927SAndroid Build Coastguard Worker# KCMP by default on Android.
889*61046927SAndroid Build Coastguard Workerif get_option('allow-kcmp') \
890*61046927SAndroid Build Coastguard Worker    .disable_auto_if(with_platform_android) \
891*61046927SAndroid Build Coastguard Worker    .allowed()
892*61046927SAndroid Build Coastguard Worker  pre_args += '-DALLOW_KCMP'
893*61046927SAndroid Build Coastguard Workerendif
894*61046927SAndroid Build Coastguard Worker
895*61046927SAndroid Build Coastguard Workerprog_python = import('python').find_installation('python3')
896*61046927SAndroid Build Coastguard Workerhas_mako = run_command(
897*61046927SAndroid Build Coastguard Worker  prog_python, '-c',
898*61046927SAndroid Build Coastguard Worker  '''
899*61046927SAndroid Build Coastguard Workertry:
900*61046927SAndroid Build Coastguard Worker  from packaging.version import Version
901*61046927SAndroid Build Coastguard Workerexcept:
902*61046927SAndroid Build Coastguard Worker  from distutils.version import StrictVersion as Version
903*61046927SAndroid Build Coastguard Workerimport mako
904*61046927SAndroid Build Coastguard Workerassert Version(mako.__version__) >= Version("0.8.0")
905*61046927SAndroid Build Coastguard Worker  ''', check: false)
906*61046927SAndroid Build Coastguard Workerif has_mako.returncode() != 0
907*61046927SAndroid Build Coastguard Worker  error('Python (3.x) mako module >= 0.8.0 required to build mesa.')
908*61046927SAndroid Build Coastguard Workerendif
909*61046927SAndroid Build Coastguard Worker
910*61046927SAndroid Build Coastguard Workerhas_yaml = run_command(
911*61046927SAndroid Build Coastguard Worker  prog_python, '-c',
912*61046927SAndroid Build Coastguard Worker  '''
913*61046927SAndroid Build Coastguard Workerimport yaml
914*61046927SAndroid Build Coastguard Worker  ''', check: false)
915*61046927SAndroid Build Coastguard Workerif has_yaml.returncode() != 0
916*61046927SAndroid Build Coastguard Worker  error('Python (3.x) yaml module (PyYAML) required to build mesa.')
917*61046927SAndroid Build Coastguard Workerendif
918*61046927SAndroid Build Coastguard Worker
919*61046927SAndroid Build Coastguard Workerif cc.get_id() == 'gcc' and cc.version().version_compare('< 4.4.6')
920*61046927SAndroid Build Coastguard Worker  error('When using GCC, version 4.4.6 or later is required.')
921*61046927SAndroid Build Coastguard Workerendif
922*61046927SAndroid Build Coastguard Worker
923*61046927SAndroid Build Coastguard Worker# Support systems without ETIME (e.g. FreeBSD)
924*61046927SAndroid Build Coastguard Workerif cc.get_define('ETIME', prefix : '#include <errno.h>') == ''
925*61046927SAndroid Build Coastguard Worker  pre_args += '-DETIME=ETIMEDOUT'
926*61046927SAndroid Build Coastguard Workerendif
927*61046927SAndroid Build Coastguard Worker
928*61046927SAndroid Build Coastguard Worker# Define MESA_DEBUG to 1 for debug builds only (debugoptimized is not included on this one);
929*61046927SAndroid Build Coastguard Worker# otherwise define MESA_DEBUG to 0
930*61046927SAndroid Build Coastguard Workerpre_args += '-DMESA_DEBUG=@0@'.format(with_mesa_debug.to_int())
931*61046927SAndroid Build Coastguard Worker
932*61046927SAndroid Build Coastguard Workerwith_split_debug = get_option('split-debug') \
933*61046927SAndroid Build Coastguard Worker  .disable_if(not cc.has_argument('-gsplit-dwarf'),
934*61046927SAndroid Build Coastguard Worker    error_message : 'split-debug requires compiler -gsplit-dwarf support') \
935*61046927SAndroid Build Coastguard Worker  .disable_if(not cc.has_link_argument('-Wl,--gdb-index'),
936*61046927SAndroid Build Coastguard Worker    error_message : 'split-debug requires the linker argument -Wl,--gdb-index')
937*61046927SAndroid Build Coastguard Worker
938*61046927SAndroid Build Coastguard Workerif with_split_debug.allowed() and get_option('debug')
939*61046927SAndroid Build Coastguard Worker  add_project_arguments('-gsplit-dwarf', language : ['c', 'cpp'])
940*61046927SAndroid Build Coastguard Worker  add_project_link_arguments('-Wl,--gdb-index', language : ['c', 'cpp'])
941*61046927SAndroid Build Coastguard Workerendif
942*61046927SAndroid Build Coastguard Worker
943*61046927SAndroid Build Coastguard Workerwith_shader_cache = get_option('shader-cache') \
944*61046927SAndroid Build Coastguard Worker  .require(host_machine.system() != 'windows', error_message : 'Shader Cache does not currently work on Windows') \
945*61046927SAndroid Build Coastguard Worker  .allowed()
946*61046927SAndroid Build Coastguard Worker
947*61046927SAndroid Build Coastguard Workerif with_shader_cache
948*61046927SAndroid Build Coastguard Worker  pre_args += '-DENABLE_SHADER_CACHE'
949*61046927SAndroid Build Coastguard Worker  if not get_option('shader-cache-default')
950*61046927SAndroid Build Coastguard Worker    pre_args += '-DSHADER_CACHE_DISABLE_BY_DEFAULT'
951*61046927SAndroid Build Coastguard Worker  endif
952*61046927SAndroid Build Coastguard Worker
953*61046927SAndroid Build Coastguard Worker  shader_cache_max_size = get_option('shader-cache-max-size')
954*61046927SAndroid Build Coastguard Worker  if shader_cache_max_size != ''
955*61046927SAndroid Build Coastguard Worker    pre_args += '-DMESA_SHADER_CACHE_MAX_SIZE="@0@"'.format(shader_cache_max_size)
956*61046927SAndroid Build Coastguard Worker  endif
957*61046927SAndroid Build Coastguard Workerendif
958*61046927SAndroid Build Coastguard Worker
959*61046927SAndroid Build Coastguard Worker# Check for GCC style builtins
960*61046927SAndroid Build Coastguard Workerforeach b : ['bswap32', 'bswap64', 'clz', 'clzll', 'ctz', 'expect', 'ffs',
961*61046927SAndroid Build Coastguard Worker             'ffsll', 'popcount', 'popcountll', 'unreachable', 'types_compatible_p']
962*61046927SAndroid Build Coastguard Worker  if cc.has_function(b)
963*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAVE___BUILTIN_@0@'.format(b.to_upper())
964*61046927SAndroid Build Coastguard Worker  endif
965*61046927SAndroid Build Coastguard Workerendforeach
966*61046927SAndroid Build Coastguard Worker
967*61046927SAndroid Build Coastguard Worker# check for GCC __attribute__
968*61046927SAndroid Build Coastguard Worker_attributes = [
969*61046927SAndroid Build Coastguard Worker  'const', 'flatten', 'malloc', 'pure', 'unused', 'warn_unused_result',
970*61046927SAndroid Build Coastguard Worker  'weak', 'format', 'packed', 'returns_nonnull', 'alias', 'noreturn',
971*61046927SAndroid Build Coastguard Worker  'optimize',
972*61046927SAndroid Build Coastguard Worker]
973*61046927SAndroid Build Coastguard Workerforeach a : cc.get_supported_function_attributes(_attributes)
974*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_FUNC_ATTRIBUTE_@0@'.format(a.to_upper())
975*61046927SAndroid Build Coastguard Workerendforeach
976*61046927SAndroid Build Coastguard Workerif cc.has_function_attribute('visibility:hidden')
977*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_FUNC_ATTRIBUTE_VISIBILITY'
978*61046927SAndroid Build Coastguard Workerendif
979*61046927SAndroid Build Coastguard Workerif cc.compiles('__uint128_t foo(void) { return 0; }',
980*61046927SAndroid Build Coastguard Worker               name : '__uint128_t')
981*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_UINT128'
982*61046927SAndroid Build Coastguard Workerendif
983*61046927SAndroid Build Coastguard Worker
984*61046927SAndroid Build Coastguard Workerif cc.has_function('reallocarray')
985*61046927SAndroid Build Coastguard Worker   pre_args += '-DHAVE_REALLOCARRAY'
986*61046927SAndroid Build Coastguard Workerendif
987*61046927SAndroid Build Coastguard Workerif cc.has_function('fmemopen')
988*61046927SAndroid Build Coastguard Worker   pre_args += '-DHAVE_FMEMOPEN'
989*61046927SAndroid Build Coastguard Workerendif
990*61046927SAndroid Build Coastguard Worker
991*61046927SAndroid Build Coastguard Worker# TODO: this is very incomplete
992*61046927SAndroid Build Coastguard Workerif ['linux', 'cygwin', 'gnu', 'freebsd', 'gnu/kfreebsd', 'haiku', 'android', 'managarm'].contains(host_machine.system())
993*61046927SAndroid Build Coastguard Worker  pre_args += '-D_GNU_SOURCE'
994*61046927SAndroid Build Coastguard Workerelif host_machine.system() == 'sunos'
995*61046927SAndroid Build Coastguard Worker  pre_args += '-D__EXTENSIONS__'
996*61046927SAndroid Build Coastguard Workerelif host_machine.system() == 'windows'
997*61046927SAndroid Build Coastguard Worker  pre_args += [
998*61046927SAndroid Build Coastguard Worker    '-D_WINDOWS', '-D_WIN32_WINNT=0x0A00', '-DWINVER=0x0A00',
999*61046927SAndroid Build Coastguard Worker    '-DPIPE_SUBSYSTEM_WINDOWS_USER',
1000*61046927SAndroid Build Coastguard Worker    '-D_USE_MATH_DEFINES',  # XXX: scons didn't use this for mingw
1001*61046927SAndroid Build Coastguard Worker  ]
1002*61046927SAndroid Build Coastguard Worker  if cc.get_argument_syntax() == 'msvc'
1003*61046927SAndroid Build Coastguard Worker    pre_args += [
1004*61046927SAndroid Build Coastguard Worker      '-DVC_EXTRALEAN',
1005*61046927SAndroid Build Coastguard Worker      '-D_CRT_SECURE_NO_WARNINGS',
1006*61046927SAndroid Build Coastguard Worker      '-D_CRT_SECURE_NO_DEPRECATE',
1007*61046927SAndroid Build Coastguard Worker      '-D_SCL_SECURE_NO_WARNINGS',
1008*61046927SAndroid Build Coastguard Worker      '-D_SCL_SECURE_NO_DEPRECATE',
1009*61046927SAndroid Build Coastguard Worker      '-D_ALLOW_KEYWORD_MACROS',
1010*61046927SAndroid Build Coastguard Worker      '-D_HAS_EXCEPTIONS=0', # Tell C++ STL to not use exceptions
1011*61046927SAndroid Build Coastguard Worker      '-DNOMINMAX',
1012*61046927SAndroid Build Coastguard Worker    ]
1013*61046927SAndroid Build Coastguard Worker  else
1014*61046927SAndroid Build Coastguard Worker    # When the target is not mingw/ucrt
1015*61046927SAndroid Build Coastguard Worker    # NOTE: clang's stddef.h are conflict with mingw/ucrt's stddef.h
1016*61046927SAndroid Build Coastguard Worker    # So do not include headers that defined in clang for detecting
1017*61046927SAndroid Build Coastguard Worker    # _UCRT
1018*61046927SAndroid Build Coastguard Worker    if cc.compiles('''
1019*61046927SAndroid Build Coastguard Worker      #include <string.h>
1020*61046927SAndroid Build Coastguard Worker      #if defined(__MINGW32__) && defined(_UCRT)
1021*61046927SAndroid Build Coastguard Worker      #error
1022*61046927SAndroid Build Coastguard Worker      #endif
1023*61046927SAndroid Build Coastguard Worker      int main(void) { return 0; }''')
1024*61046927SAndroid Build Coastguard Worker      pre_args += ['-D__MSVCRT_VERSION__=0x0700']
1025*61046927SAndroid Build Coastguard Worker    endif
1026*61046927SAndroid Build Coastguard Worker  endif
1027*61046927SAndroid Build Coastguard Workerelif host_machine.system() == 'openbsd'
1028*61046927SAndroid Build Coastguard Worker  pre_args += '-D_ISOC11_SOURCE'
1029*61046927SAndroid Build Coastguard Workerendif
1030*61046927SAndroid Build Coastguard Worker
1031*61046927SAndroid Build Coastguard Worker# Check for generic C arguments
1032*61046927SAndroid Build Coastguard Workerc_msvc_compat_args = []
1033*61046927SAndroid Build Coastguard Workerno_override_init_args = []
1034*61046927SAndroid Build Coastguard Workercpp_msvc_compat_args = []
1035*61046927SAndroid Build Coastguard Workerld_args_gc_sections = []
1036*61046927SAndroid Build Coastguard Workerif cc.get_argument_syntax() == 'msvc'
1037*61046927SAndroid Build Coastguard Worker  _trial = [
1038*61046927SAndroid Build Coastguard Worker    '/wd4018',  # signed/unsigned mismatch
1039*61046927SAndroid Build Coastguard Worker    '/wd4056',  # overflow in floating-point constant arithmetic
1040*61046927SAndroid Build Coastguard Worker    '/wd4244',  # conversion from 'type1' to 'type2', possible loss of data
1041*61046927SAndroid Build Coastguard Worker    '/wd4267',  # 'var' : conversion from 'size_t' to 'type', possible loss of data
1042*61046927SAndroid Build Coastguard Worker    '/wd4305',  # truncation from 'type1' to 'type2'
1043*61046927SAndroid Build Coastguard Worker    '/wd4351',  # new behavior: elements of array 'array' will be default initialized
1044*61046927SAndroid Build Coastguard Worker    '/wd4756',  # overflow in constant arithmetic
1045*61046927SAndroid Build Coastguard Worker    '/wd4800',  # forcing value to bool 'true' or 'false' (performance warning)
1046*61046927SAndroid Build Coastguard Worker    '/wd4996',  # disabled deprecated POSIX name warnings
1047*61046927SAndroid Build Coastguard Worker    '/wd4291',  # no matching operator delete found
1048*61046927SAndroid Build Coastguard Worker    '/wd4146',  # unary minus operator applied to unsigned type, result still unsigned
1049*61046927SAndroid Build Coastguard Worker    '/wd4200',  # nonstandard extension used: zero-sized array in struct/union
1050*61046927SAndroid Build Coastguard Worker    '/wd4624',  # destructor was implicitly defined as deleted [from LLVM]
1051*61046927SAndroid Build Coastguard Worker    '/wd4309',  # 'initializing': truncation of constant value
1052*61046927SAndroid Build Coastguard Worker    '/wd4838',  # conversion from 'int' to 'const char' requires a narrowing conversion
1053*61046927SAndroid Build Coastguard Worker    '/wd5105',  # macro expansion producing 'defined' has undefined behavior (winbase.h, need Windows SDK upgrade)
1054*61046927SAndroid Build Coastguard Worker    '/we4020',  # Error when passing the wrong number of parameters
1055*61046927SAndroid Build Coastguard Worker    '/we4024',  # Error when passing different type of parameter
1056*61046927SAndroid Build Coastguard Worker    '/we4189',  # 'identifier' : local variable is initialized but not referenced
1057*61046927SAndroid Build Coastguard Worker    '/Zc:__cplusplus', #Set __cplusplus macro to match the /std:c++<version> on the command line
1058*61046927SAndroid Build Coastguard Worker  ]
1059*61046927SAndroid Build Coastguard Worker  c_args += cc.get_supported_arguments(_trial)
1060*61046927SAndroid Build Coastguard Worker  cpp_args += cpp.get_supported_arguments(_trial)
1061*61046927SAndroid Build Coastguard Workerelse
1062*61046927SAndroid Build Coastguard Worker  _trial_c = [
1063*61046927SAndroid Build Coastguard Worker    '-Werror=implicit-function-declaration',
1064*61046927SAndroid Build Coastguard Worker    '-Werror=missing-prototypes',
1065*61046927SAndroid Build Coastguard Worker    '-Werror=return-type',
1066*61046927SAndroid Build Coastguard Worker    '-Werror=empty-body',
1067*61046927SAndroid Build Coastguard Worker    '-Werror=incompatible-pointer-types',
1068*61046927SAndroid Build Coastguard Worker    '-Werror=int-conversion',
1069*61046927SAndroid Build Coastguard Worker    '-Wimplicit-fallthrough',
1070*61046927SAndroid Build Coastguard Worker    '-Wmisleading-indentation',
1071*61046927SAndroid Build Coastguard Worker    '-Wno-missing-field-initializers',
1072*61046927SAndroid Build Coastguard Worker    '-Wno-format-truncation',
1073*61046927SAndroid Build Coastguard Worker    '-Wno-nonnull-compare',
1074*61046927SAndroid Build Coastguard Worker    '-fno-math-errno',
1075*61046927SAndroid Build Coastguard Worker    '-fno-trapping-math',
1076*61046927SAndroid Build Coastguard Worker    '-Qunused-arguments',
1077*61046927SAndroid Build Coastguard Worker    '-fno-common',
1078*61046927SAndroid Build Coastguard Worker    '-Wno-unknown-pragmas',
1079*61046927SAndroid Build Coastguard Worker    # Clang
1080*61046927SAndroid Build Coastguard Worker    '-Wno-microsoft-enum-value',
1081*61046927SAndroid Build Coastguard Worker    '-Wno-unused-function',
1082*61046927SAndroid Build Coastguard Worker  ]
1083*61046927SAndroid Build Coastguard Worker  _trial_cpp = [
1084*61046927SAndroid Build Coastguard Worker    '-Werror=return-type',
1085*61046927SAndroid Build Coastguard Worker    '-Werror=empty-body',
1086*61046927SAndroid Build Coastguard Worker    '-Wmisleading-indentation',
1087*61046927SAndroid Build Coastguard Worker    '-Wno-non-virtual-dtor',
1088*61046927SAndroid Build Coastguard Worker    '-Wno-missing-field-initializers',
1089*61046927SAndroid Build Coastguard Worker    '-Wno-format-truncation',
1090*61046927SAndroid Build Coastguard Worker    '-fno-math-errno',
1091*61046927SAndroid Build Coastguard Worker    '-fno-trapping-math',
1092*61046927SAndroid Build Coastguard Worker    '-Qunused-arguments',
1093*61046927SAndroid Build Coastguard Worker    # Some classes use custom new operator which zeroes memory, however
1094*61046927SAndroid Build Coastguard Worker    # gcc does aggressive dead-store elimination which threats all writes
1095*61046927SAndroid Build Coastguard Worker    # to the memory before the constructor as "dead stores".
1096*61046927SAndroid Build Coastguard Worker    # For now we disable this optimization.
1097*61046927SAndroid Build Coastguard Worker    '-flifetime-dse=1',
1098*61046927SAndroid Build Coastguard Worker    '-Wno-unknown-pragmas',
1099*61046927SAndroid Build Coastguard Worker    # Clang
1100*61046927SAndroid Build Coastguard Worker    '-Wno-microsoft-enum-value',
1101*61046927SAndroid Build Coastguard Worker  ]
1102*61046927SAndroid Build Coastguard Worker
1103*61046927SAndroid Build Coastguard Worker  # MinGW chokes on format specifiers and I can't get it all working
1104*61046927SAndroid Build Coastguard Worker  if not (cc.get_argument_syntax() == 'gcc' and host_machine.system() == 'windows')
1105*61046927SAndroid Build Coastguard Worker    _trial_c += ['-Werror=format', '-Wformat-security']
1106*61046927SAndroid Build Coastguard Worker    _trial_cpp += ['-Werror=format', '-Wformat-security']
1107*61046927SAndroid Build Coastguard Worker  endif
1108*61046927SAndroid Build Coastguard Worker
1109*61046927SAndroid Build Coastguard Worker  # FreeBSD annotated <pthread.h> but Mesa isn't ready
1110*61046927SAndroid Build Coastguard Worker  if not (cc.get_id() == 'clang' and host_machine.system() == 'freebsd')
1111*61046927SAndroid Build Coastguard Worker    _trial_c += ['-Werror=thread-safety']
1112*61046927SAndroid Build Coastguard Worker  endif
1113*61046927SAndroid Build Coastguard Worker
1114*61046927SAndroid Build Coastguard Worker  # If the compiler supports it, put function and data symbols in their
1115*61046927SAndroid Build Coastguard Worker  # own sections and GC the sections after linking.  This lets drivers
1116*61046927SAndroid Build Coastguard Worker  # drop shared code unused by that specific driver (particularly
1117*61046927SAndroid Build Coastguard Worker  # relevant for Vulkan drivers).
1118*61046927SAndroid Build Coastguard Worker  if cc.links('static char unused() { return 5; } int main() { return 0; }',
1119*61046927SAndroid Build Coastguard Worker              args : '-Wl,--gc-sections', name : 'gc-sections')
1120*61046927SAndroid Build Coastguard Worker    ld_args_gc_sections += '-Wl,--gc-sections'
1121*61046927SAndroid Build Coastguard Worker    _trial_c += ['-ffunction-sections', '-fdata-sections']
1122*61046927SAndroid Build Coastguard Worker    _trial_cpp += ['-ffunction-sections', '-fdata-sections']
1123*61046927SAndroid Build Coastguard Worker  endif
1124*61046927SAndroid Build Coastguard Worker
1125*61046927SAndroid Build Coastguard Worker  # Variables that are only used for assertions are considered unused when assertions
1126*61046927SAndroid Build Coastguard Worker  # are disabled. Don't treat this as an error, since we build with -Werror even if
1127*61046927SAndroid Build Coastguard Worker  # assertions are disabled.
1128*61046927SAndroid Build Coastguard Worker  if with_mesa_ndebug
1129*61046927SAndroid Build Coastguard Worker    _trial_c += ['-Wno-unused-variable', '-Wno-unused-but-set-variable', '/wd4189']
1130*61046927SAndroid Build Coastguard Worker    _trial_cpp += ['-Wno-unused-variable', '-Wno-unused-but-set-variable', '/wd4189']
1131*61046927SAndroid Build Coastguard Worker  endif
1132*61046927SAndroid Build Coastguard Worker
1133*61046927SAndroid Build Coastguard Worker  c_args += cc.get_supported_arguments(_trial_c)
1134*61046927SAndroid Build Coastguard Worker  cpp_args += cpp.get_supported_arguments(_trial_cpp)
1135*61046927SAndroid Build Coastguard Worker
1136*61046927SAndroid Build Coastguard Worker  no_override_init_args += cc.get_supported_arguments(
1137*61046927SAndroid Build Coastguard Worker    ['-Wno-override-init', '-Wno-initializer-overrides']
1138*61046927SAndroid Build Coastguard Worker  )
1139*61046927SAndroid Build Coastguard Worker
1140*61046927SAndroid Build Coastguard Worker  # Check for C and C++ arguments for MSVC compatibility. These are only used
1141*61046927SAndroid Build Coastguard Worker  # in parts of the mesa code base that need to compile with MSVC, mainly
1142*61046927SAndroid Build Coastguard Worker  # common code
1143*61046927SAndroid Build Coastguard Worker  _trial_msvc = ['-Werror=pointer-arith', '-Werror=vla', '-Werror=gnu-empty-initializer']
1144*61046927SAndroid Build Coastguard Worker  c_msvc_compat_args += cc.get_supported_arguments(_trial_msvc)
1145*61046927SAndroid Build Coastguard Worker  cpp_msvc_compat_args += cpp.get_supported_arguments(_trial_msvc)
1146*61046927SAndroid Build Coastguard Workerendif
1147*61046927SAndroid Build Coastguard Worker
1148*61046927SAndroid Build Coastguard Worker# set linker arguments
1149*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'windows'
1150*61046927SAndroid Build Coastguard Worker  if cc.get_argument_syntax() == 'msvc'
1151*61046927SAndroid Build Coastguard Worker    add_project_link_arguments(
1152*61046927SAndroid Build Coastguard Worker      '/fixed:no',
1153*61046927SAndroid Build Coastguard Worker      '/dynamicbase',
1154*61046927SAndroid Build Coastguard Worker      '/nxcompat',
1155*61046927SAndroid Build Coastguard Worker      language : ['c', 'cpp'],
1156*61046927SAndroid Build Coastguard Worker    )
1157*61046927SAndroid Build Coastguard Worker    if get_option('buildtype') != 'debug'
1158*61046927SAndroid Build Coastguard Worker      add_project_link_arguments(
1159*61046927SAndroid Build Coastguard Worker        '/incremental:no',
1160*61046927SAndroid Build Coastguard Worker        language : ['c', 'cpp'],
1161*61046927SAndroid Build Coastguard Worker      )
1162*61046927SAndroid Build Coastguard Worker    endif
1163*61046927SAndroid Build Coastguard Worker  else
1164*61046927SAndroid Build Coastguard Worker    add_project_link_arguments(
1165*61046927SAndroid Build Coastguard Worker      cc.get_supported_link_arguments(
1166*61046927SAndroid Build Coastguard Worker        '-Wl,--nxcompat',
1167*61046927SAndroid Build Coastguard Worker        '-Wl,--dynamicbase',
1168*61046927SAndroid Build Coastguard Worker        '-static-libgcc',
1169*61046927SAndroid Build Coastguard Worker        '-static-libstdc++',
1170*61046927SAndroid Build Coastguard Worker      ),
1171*61046927SAndroid Build Coastguard Worker      language : ['c'],
1172*61046927SAndroid Build Coastguard Worker    )
1173*61046927SAndroid Build Coastguard Worker    add_project_link_arguments(
1174*61046927SAndroid Build Coastguard Worker      cpp.get_supported_link_arguments(
1175*61046927SAndroid Build Coastguard Worker        '-Wl,--nxcompat',
1176*61046927SAndroid Build Coastguard Worker        '-Wl,--dynamicbase',
1177*61046927SAndroid Build Coastguard Worker        '-static-libgcc',
1178*61046927SAndroid Build Coastguard Worker        '-static-libstdc++',
1179*61046927SAndroid Build Coastguard Worker      ),
1180*61046927SAndroid Build Coastguard Worker      language : ['cpp'],
1181*61046927SAndroid Build Coastguard Worker    )
1182*61046927SAndroid Build Coastguard Worker  endif
1183*61046927SAndroid Build Coastguard Workerendif
1184*61046927SAndroid Build Coastguard Worker
1185*61046927SAndroid Build Coastguard Workersse2_arg = []
1186*61046927SAndroid Build Coastguard Workersse2_args = []
1187*61046927SAndroid Build Coastguard Workersse41_args = []
1188*61046927SAndroid Build Coastguard Workerwith_sse41 = false
1189*61046927SAndroid Build Coastguard Workerif host_machine.cpu_family().startswith('x86')
1190*61046927SAndroid Build Coastguard Worker  pre_args += '-DUSE_SSE41'
1191*61046927SAndroid Build Coastguard Worker  with_sse41 = true
1192*61046927SAndroid Build Coastguard Worker
1193*61046927SAndroid Build Coastguard Worker  if cc.get_id() != 'msvc'
1194*61046927SAndroid Build Coastguard Worker    sse41_args = ['-msse4.1']
1195*61046927SAndroid Build Coastguard Worker
1196*61046927SAndroid Build Coastguard Worker    if host_machine.cpu_family() == 'x86'
1197*61046927SAndroid Build Coastguard Worker      # x86_64 have sse2 by default, so sse2 args only for x86
1198*61046927SAndroid Build Coastguard Worker      sse2_arg = ['-msse2', '-mfpmath=sse']
1199*61046927SAndroid Build Coastguard Worker      sse2_args = [sse2_arg, '-mstackrealign']
1200*61046927SAndroid Build Coastguard Worker      if get_option('sse2')
1201*61046927SAndroid Build Coastguard Worker        # These settings make generated GCC code match MSVC and follow
1202*61046927SAndroid Build Coastguard Worker        # GCC advice on https://gcc.gnu.org/wiki/FloatingPointMath#x86note
1203*61046927SAndroid Build Coastguard Worker        #
1204*61046927SAndroid Build Coastguard Worker        # NOTE: We need to ensure stack is realigned given that we
1205*61046927SAndroid Build Coastguard Worker        # produce shared objects, and have no control over the stack
1206*61046927SAndroid Build Coastguard Worker        # alignment policy of the application. Therefore we need
1207*61046927SAndroid Build Coastguard Worker        # -mstackrealign or -mincoming-stack-boundary=2.
1208*61046927SAndroid Build Coastguard Worker        #
1209*61046927SAndroid Build Coastguard Worker        # XXX: We could have SSE without -mstackrealign if we always used
1210*61046927SAndroid Build Coastguard Worker        # __attribute__((force_align_arg_pointer)), but that's not
1211*61046927SAndroid Build Coastguard Worker        # always the case.
1212*61046927SAndroid Build Coastguard Worker        c_cpp_args += sse2_args
1213*61046927SAndroid Build Coastguard Worker        # sse2_args are adopted into c_cpp_args to avoid duplicated sse2 command line args
1214*61046927SAndroid Build Coastguard Worker        sse2_arg = []
1215*61046927SAndroid Build Coastguard Worker        sse2_args = []
1216*61046927SAndroid Build Coastguard Worker      else
1217*61046927SAndroid Build Coastguard Worker        # GCC on x86 (not x86_64) with -msse* assumes a 16 byte aligned stack, but
1218*61046927SAndroid Build Coastguard Worker        # that's not guaranteed
1219*61046927SAndroid Build Coastguard Worker        sse41_args += '-mstackrealign'
1220*61046927SAndroid Build Coastguard Worker      endif
1221*61046927SAndroid Build Coastguard Worker    endif
1222*61046927SAndroid Build Coastguard Worker  endif
1223*61046927SAndroid Build Coastguard Workerendif
1224*61046927SAndroid Build Coastguard Worker
1225*61046927SAndroid Build Coastguard Worker# Detect __builtin_ia32_clflushopt support
1226*61046927SAndroid Build Coastguard Workerif cc.has_function('__builtin_ia32_clflushopt', args : '-mclflushopt')
1227*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE___BUILTIN_IA32_CLFLUSHOPT'
1228*61046927SAndroid Build Coastguard Worker  clflushopt_args = ['-mclflushopt']
1229*61046927SAndroid Build Coastguard Worker  with_clflushopt = true
1230*61046927SAndroid Build Coastguard Workerelse
1231*61046927SAndroid Build Coastguard Worker  clflushopt_args = []
1232*61046927SAndroid Build Coastguard Worker  with_clflushopt = false
1233*61046927SAndroid Build Coastguard Workerendif
1234*61046927SAndroid Build Coastguard Worker
1235*61046927SAndroid Build Coastguard Worker# Check for GCC style atomics
1236*61046927SAndroid Build Coastguard Workerdep_atomic = null_dep
1237*61046927SAndroid Build Coastguard Worker
1238*61046927SAndroid Build Coastguard Workerif cc.compiles('''#include <stdint.h>
1239*61046927SAndroid Build Coastguard Worker                  int main() {
1240*61046927SAndroid Build Coastguard Worker                    struct {
1241*61046927SAndroid Build Coastguard Worker                      uint64_t *v;
1242*61046927SAndroid Build Coastguard Worker                    } x;
1243*61046927SAndroid Build Coastguard Worker                    return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) &
1244*61046927SAndroid Build Coastguard Worker                           (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL);
1245*61046927SAndroid Build Coastguard Worker
1246*61046927SAndroid Build Coastguard Worker                  }''',
1247*61046927SAndroid Build Coastguard Worker               name : 'GCC atomic builtins')
1248*61046927SAndroid Build Coastguard Worker  pre_args += '-DUSE_GCC_ATOMIC_BUILTINS'
1249*61046927SAndroid Build Coastguard Worker
1250*61046927SAndroid Build Coastguard Worker  # Not all atomic calls can be turned into lock-free instructions, in which
1251*61046927SAndroid Build Coastguard Worker  # GCC will make calls into the libatomic library. Check whether we need to
1252*61046927SAndroid Build Coastguard Worker  # link with -latomic.
1253*61046927SAndroid Build Coastguard Worker  #
1254*61046927SAndroid Build Coastguard Worker  # This can happen for 64-bit atomic operations on 32-bit architectures such
1255*61046927SAndroid Build Coastguard Worker  # as ARM.
1256*61046927SAndroid Build Coastguard Worker  if not cc.links('''#include <stdint.h>
1257*61046927SAndroid Build Coastguard Worker                     int main() {
1258*61046927SAndroid Build Coastguard Worker                       struct {
1259*61046927SAndroid Build Coastguard Worker                         uint64_t *v;
1260*61046927SAndroid Build Coastguard Worker                       } x;
1261*61046927SAndroid Build Coastguard Worker                       return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) &
1262*61046927SAndroid Build Coastguard Worker                              (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL);
1263*61046927SAndroid Build Coastguard Worker                     }''',
1264*61046927SAndroid Build Coastguard Worker                  name : 'GCC atomic builtins required -latomic')
1265*61046927SAndroid Build Coastguard Worker    dep_atomic = cc.find_library('atomic')
1266*61046927SAndroid Build Coastguard Worker  endif
1267*61046927SAndroid Build Coastguard Workerendif
1268*61046927SAndroid Build Coastguard Workerif not cc.links('''#include <stdint.h>
1269*61046927SAndroid Build Coastguard Worker                   uint64_t v;
1270*61046927SAndroid Build Coastguard Worker                   int main() {
1271*61046927SAndroid Build Coastguard Worker                     return __sync_add_and_fetch(&v, (uint64_t)1);
1272*61046927SAndroid Build Coastguard Worker                   }''',
1273*61046927SAndroid Build Coastguard Worker                dependencies : dep_atomic,
1274*61046927SAndroid Build Coastguard Worker                name : 'GCC 64bit atomics')
1275*61046927SAndroid Build Coastguard Worker  pre_args += '-DMISSING_64BIT_ATOMICS'
1276*61046927SAndroid Build Coastguard Workerendif
1277*61046927SAndroid Build Coastguard Worker
1278*61046927SAndroid Build Coastguard Workerdep_ws2_32 = cc.find_library('ws2_32', required : with_platform_windows)
1279*61046927SAndroid Build Coastguard Worker
1280*61046927SAndroid Build Coastguard Worker# TODO: shared/static? Is this even worth doing?
1281*61046927SAndroid Build Coastguard Worker
1282*61046927SAndroid Build Coastguard Workerwith_asm_arch = ''
1283*61046927SAndroid Build Coastguard Workerif host_machine.cpu_family() == 'x86'
1284*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm or host_machine.system() == 'gnu'
1285*61046927SAndroid Build Coastguard Worker    with_asm_arch = 'x86'
1286*61046927SAndroid Build Coastguard Worker    pre_args += ['-DUSE_X86_ASM']
1287*61046927SAndroid Build Coastguard Worker
1288*61046927SAndroid Build Coastguard Worker    if with_glx_read_only_text
1289*61046927SAndroid Build Coastguard Worker      pre_args += ['-DGLX_X86_READONLY_TEXT']
1290*61046927SAndroid Build Coastguard Worker    endif
1291*61046927SAndroid Build Coastguard Worker  endif
1292*61046927SAndroid Build Coastguard Workerelif host_machine.cpu_family() == 'x86_64'
1293*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm
1294*61046927SAndroid Build Coastguard Worker    with_asm_arch = 'x86_64'
1295*61046927SAndroid Build Coastguard Worker    pre_args += ['-DUSE_X86_64_ASM']
1296*61046927SAndroid Build Coastguard Worker  endif
1297*61046927SAndroid Build Coastguard Workerelif host_machine.cpu_family() == 'arm'
1298*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm
1299*61046927SAndroid Build Coastguard Worker    with_asm_arch = 'arm'
1300*61046927SAndroid Build Coastguard Worker    pre_args += ['-DUSE_ARM_ASM']
1301*61046927SAndroid Build Coastguard Worker  endif
1302*61046927SAndroid Build Coastguard Workerelif host_machine.cpu_family() == 'aarch64'
1303*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm
1304*61046927SAndroid Build Coastguard Worker    with_asm_arch = 'aarch64'
1305*61046927SAndroid Build Coastguard Worker    pre_args += ['-DUSE_AARCH64_ASM']
1306*61046927SAndroid Build Coastguard Worker  endif
1307*61046927SAndroid Build Coastguard Workerelif host_machine.cpu_family() == 'sparc64'
1308*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm
1309*61046927SAndroid Build Coastguard Worker    with_asm_arch = 'sparc'
1310*61046927SAndroid Build Coastguard Worker    pre_args += ['-DUSE_SPARC_ASM']
1311*61046927SAndroid Build Coastguard Worker  endif
1312*61046927SAndroid Build Coastguard Workerelif host_machine.cpu_family() == 'ppc64' and host_machine.endian() == 'little'
1313*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm
1314*61046927SAndroid Build Coastguard Worker    with_asm_arch = 'ppc64le'
1315*61046927SAndroid Build Coastguard Worker    pre_args += ['-DUSE_PPC64LE_ASM']
1316*61046927SAndroid Build Coastguard Worker  endif
1317*61046927SAndroid Build Coastguard Workerelif host_machine.cpu_family() == 'mips64' and host_machine.endian() == 'little'
1318*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm
1319*61046927SAndroid Build Coastguard Worker    with_asm_arch = 'mips64el'
1320*61046927SAndroid Build Coastguard Worker    pre_args += ['-DUSE_MIPS64EL_ASM']
1321*61046927SAndroid Build Coastguard Worker  endif
1322*61046927SAndroid Build Coastguard Workerelif host_machine.cpu_family() == 'loongarch64'
1323*61046927SAndroid Build Coastguard Worker  if system_has_kms_drm
1324*61046927SAndroid Build Coastguard Worker    with_asm_arch = 'loongarch64'
1325*61046927SAndroid Build Coastguard Worker    pre_args += ['-DUSE_LOONGARCH64_ASM']
1326*61046927SAndroid Build Coastguard Worker  endif
1327*61046927SAndroid Build Coastguard Workerendif
1328*61046927SAndroid Build Coastguard Worker
1329*61046927SAndroid Build Coastguard Worker# Check for standard headers and functions
1330*61046927SAndroid Build Coastguard Workerif (cc.has_header_symbol('sys/sysmacros.h', 'major') and
1331*61046927SAndroid Build Coastguard Worker  cc.has_header_symbol('sys/sysmacros.h', 'minor') and
1332*61046927SAndroid Build Coastguard Worker  cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
1333*61046927SAndroid Build Coastguard Worker  pre_args += '-DMAJOR_IN_SYSMACROS'
1334*61046927SAndroid Build Coastguard Workerendif
1335*61046927SAndroid Build Coastguard Workerif (cc.has_header_symbol('sys/mkdev.h', 'major') and
1336*61046927SAndroid Build Coastguard Worker  cc.has_header_symbol('sys/mkdev.h', 'minor') and
1337*61046927SAndroid Build Coastguard Worker  cc.has_header_symbol('sys/mkdev.h', 'makedev'))
1338*61046927SAndroid Build Coastguard Worker  pre_args += '-DMAJOR_IN_MKDEV'
1339*61046927SAndroid Build Coastguard Workerendif
1340*61046927SAndroid Build Coastguard Worker
1341*61046927SAndroid Build Coastguard Workerif cc.check_header('sched.h')
1342*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAS_SCHED_H'
1343*61046927SAndroid Build Coastguard Worker  if cc.has_function('sched_getaffinity')
1344*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAS_SCHED_GETAFFINITY'
1345*61046927SAndroid Build Coastguard Worker  endif
1346*61046927SAndroid Build Coastguard Workerendif
1347*61046927SAndroid Build Coastguard Worker
1348*61046927SAndroid Build Coastguard Workerif not ['linux'].contains(host_machine.system())
1349*61046927SAndroid Build Coastguard Worker  # Deprecated on Linux and requires <sys/types.h> on FreeBSD and OpenBSD
1350*61046927SAndroid Build Coastguard Worker  if cc.check_header('sys/sysctl.h', prefix : '#include <sys/types.h>')
1351*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAVE_SYS_SYSCTL_H'
1352*61046927SAndroid Build Coastguard Worker  endif
1353*61046927SAndroid Build Coastguard Workerendif
1354*61046927SAndroid Build Coastguard Worker
1355*61046927SAndroid Build Coastguard Workerforeach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h',
1356*61046927SAndroid Build Coastguard Worker             'cet.h', 'pthread_np.h', 'sys/inotify.h', 'linux/udmabuf.h']
1357*61046927SAndroid Build Coastguard Worker  if cc.check_header(h)
1358*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify())
1359*61046927SAndroid Build Coastguard Worker  endif
1360*61046927SAndroid Build Coastguard Workerendforeach
1361*61046927SAndroid Build Coastguard Worker
1362*61046927SAndroid Build Coastguard Workerfunctions_to_detect = {
1363*61046927SAndroid Build Coastguard Worker  'strtof': '',
1364*61046927SAndroid Build Coastguard Worker  'mkostemp': '',
1365*61046927SAndroid Build Coastguard Worker  'memfd_create': '',
1366*61046927SAndroid Build Coastguard Worker  'random_r': '',
1367*61046927SAndroid Build Coastguard Worker  'flock': '',
1368*61046927SAndroid Build Coastguard Worker  'strtok_r': '',
1369*61046927SAndroid Build Coastguard Worker  'getrandom': '',
1370*61046927SAndroid Build Coastguard Worker  'qsort_s': '',
1371*61046927SAndroid Build Coastguard Worker  'posix_fallocate': '',
1372*61046927SAndroid Build Coastguard Worker  'secure_getenv': '',
1373*61046927SAndroid Build Coastguard Worker}
1374*61046927SAndroid Build Coastguard Worker
1375*61046927SAndroid Build Coastguard Workerforeach f, prefix: functions_to_detect
1376*61046927SAndroid Build Coastguard Worker  if cc.has_function(f, prefix: prefix)
1377*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAVE_@0@'.format(f.to_upper())
1378*61046927SAndroid Build Coastguard Worker  endif
1379*61046927SAndroid Build Coastguard Workerendforeach
1380*61046927SAndroid Build Coastguard Worker
1381*61046927SAndroid Build Coastguard Workerif cpp.links('''
1382*61046927SAndroid Build Coastguard Worker    #define _GNU_SOURCE
1383*61046927SAndroid Build Coastguard Worker    #include <stdlib.h>
1384*61046927SAndroid Build Coastguard Worker
1385*61046927SAndroid Build Coastguard Worker    static int dcomp(const void *l, const void *r, void *t) { return 0; }
1386*61046927SAndroid Build Coastguard Worker
1387*61046927SAndroid Build Coastguard Worker    int main(int ac, char **av) {
1388*61046927SAndroid Build Coastguard Worker      int arr[] = { 1 };
1389*61046927SAndroid Build Coastguard Worker      void *t = NULL;
1390*61046927SAndroid Build Coastguard Worker      qsort_r((void*)&arr[0], 1, 1, dcomp, t);
1391*61046927SAndroid Build Coastguard Worker      return (0);
1392*61046927SAndroid Build Coastguard Worker    }''',
1393*61046927SAndroid Build Coastguard Worker    args : pre_args,
1394*61046927SAndroid Build Coastguard Worker    name : 'GNU qsort_r')
1395*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_GNU_QSORT_R'
1396*61046927SAndroid Build Coastguard Workerelif cpp.links('''
1397*61046927SAndroid Build Coastguard Worker    #include <stdlib.h>
1398*61046927SAndroid Build Coastguard Worker
1399*61046927SAndroid Build Coastguard Worker    static int dcomp(void *t, const void *l, const void *r) { return 0; }
1400*61046927SAndroid Build Coastguard Worker
1401*61046927SAndroid Build Coastguard Worker    int main(int ac, char **av) {
1402*61046927SAndroid Build Coastguard Worker      int arr[] = { 1 };
1403*61046927SAndroid Build Coastguard Worker      void *t = NULL;
1404*61046927SAndroid Build Coastguard Worker      qsort_r((void*)&arr[0], 1, 1, t, dcomp);
1405*61046927SAndroid Build Coastguard Worker      return (0);
1406*61046927SAndroid Build Coastguard Worker    }''',
1407*61046927SAndroid Build Coastguard Worker    args : pre_args,
1408*61046927SAndroid Build Coastguard Worker    name : 'BSD qsort_r')
1409*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_BSD_QSORT_R'
1410*61046927SAndroid Build Coastguard Workerendif
1411*61046927SAndroid Build Coastguard Worker
1412*61046927SAndroid Build Coastguard Workerif cc.has_header_symbol('time.h', 'struct timespec')
1413*61046927SAndroid Build Coastguard Worker   pre_args += '-DHAVE_STRUCT_TIMESPEC'
1414*61046927SAndroid Build Coastguard Workerendif
1415*61046927SAndroid Build Coastguard Worker
1416*61046927SAndroid Build Coastguard Workerwith_c11_threads = false
1417*61046927SAndroid Build Coastguard Workerif cc.has_function('thrd_create', prefix: '#include <threads.h>')
1418*61046927SAndroid Build Coastguard Worker  if with_platform_android
1419*61046927SAndroid Build Coastguard Worker    # Current only Android's c11 <threads.h> are verified
1420*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAVE_THRD_CREATE'
1421*61046927SAndroid Build Coastguard Worker    with_c11_threads = true
1422*61046927SAndroid Build Coastguard Worker  endif
1423*61046927SAndroid Build Coastguard Workerendif
1424*61046927SAndroid Build Coastguard Worker
1425*61046927SAndroid Build Coastguard Workerif cc.has_header_symbol('errno.h', 'program_invocation_name',
1426*61046927SAndroid Build Coastguard Worker                        args : '-D_GNU_SOURCE')
1427*61046927SAndroid Build Coastguard Worker   pre_args += '-DHAVE_PROGRAM_INVOCATION_NAME'
1428*61046927SAndroid Build Coastguard Workerelif with_tools.contains('intel')
1429*61046927SAndroid Build Coastguard Worker  error('Intel tools require the program_invocation_name variable')
1430*61046927SAndroid Build Coastguard Workerendif
1431*61046927SAndroid Build Coastguard Worker
1432*61046927SAndroid Build Coastguard Workerif cc.has_header_symbol('math.h', 'issignaling',
1433*61046927SAndroid Build Coastguard Worker                        args : '-D_GNU_SOURCE')
1434*61046927SAndroid Build Coastguard Worker   pre_args += '-DHAVE_ISSIGNALING'
1435*61046927SAndroid Build Coastguard Workerendif
1436*61046927SAndroid Build Coastguard Worker
1437*61046927SAndroid Build Coastguard Worker# MinGW provides a __builtin_posix_memalign function, but not a posix_memalign.
1438*61046927SAndroid Build Coastguard Worker# This means that this check will succeed, but then compilation will later
1439*61046927SAndroid Build Coastguard Worker# fail. MSVC doesn't have this function at all, so only check for it on
1440*61046927SAndroid Build Coastguard Worker# non-windows platforms.
1441*61046927SAndroid Build Coastguard Workerif host_machine.system() != 'windows'
1442*61046927SAndroid Build Coastguard Worker  if cc.has_function('posix_memalign')
1443*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAVE_POSIX_MEMALIGN'
1444*61046927SAndroid Build Coastguard Worker  endif
1445*61046927SAndroid Build Coastguard Workerendif
1446*61046927SAndroid Build Coastguard Worker
1447*61046927SAndroid Build Coastguard Workerif cc.has_member('struct dirent', 'd_type', prefix: '''#include <sys/types.h>
1448*61046927SAndroid Build Coastguard Worker   #include <dirent.h>''')
1449*61046927SAndroid Build Coastguard Worker   pre_args += '-DHAVE_DIRENT_D_TYPE'
1450*61046927SAndroid Build Coastguard Workerendif
1451*61046927SAndroid Build Coastguard Worker
1452*61046927SAndroid Build Coastguard Worker# strtod locale support
1453*61046927SAndroid Build Coastguard Workerif cc.links('''
1454*61046927SAndroid Build Coastguard Worker    #define _GNU_SOURCE
1455*61046927SAndroid Build Coastguard Worker    #include <stdlib.h>
1456*61046927SAndroid Build Coastguard Worker    #include <locale.h>
1457*61046927SAndroid Build Coastguard Worker    #ifdef HAVE_XLOCALE_H
1458*61046927SAndroid Build Coastguard Worker    #include <xlocale.h>
1459*61046927SAndroid Build Coastguard Worker    #endif
1460*61046927SAndroid Build Coastguard Worker    int main() {
1461*61046927SAndroid Build Coastguard Worker      locale_t loc = newlocale(LC_CTYPE_MASK, "C", NULL);
1462*61046927SAndroid Build Coastguard Worker      const char *s = "1.0";
1463*61046927SAndroid Build Coastguard Worker      char *end;
1464*61046927SAndroid Build Coastguard Worker      double d = strtod_l(s, &end, loc);
1465*61046927SAndroid Build Coastguard Worker      float f = strtof_l(s, &end, loc);
1466*61046927SAndroid Build Coastguard Worker      freelocale(loc);
1467*61046927SAndroid Build Coastguard Worker      return 0;
1468*61046927SAndroid Build Coastguard Worker    }''',
1469*61046927SAndroid Build Coastguard Worker    args : pre_args,
1470*61046927SAndroid Build Coastguard Worker    name : 'strtod has locale support')
1471*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_STRTOD_L'
1472*61046927SAndroid Build Coastguard Workerendif
1473*61046927SAndroid Build Coastguard Worker
1474*61046927SAndroid Build Coastguard Worker# Check for some linker flags
1475*61046927SAndroid Build Coastguard Workerld_args_bsymbolic = []
1476*61046927SAndroid Build Coastguard Workerif cc.links('int main() { return 0; }', args : '-Wl,-Bsymbolic', name : 'Bsymbolic')
1477*61046927SAndroid Build Coastguard Worker  ld_args_bsymbolic += '-Wl,-Bsymbolic'
1478*61046927SAndroid Build Coastguard Workerendif
1479*61046927SAndroid Build Coastguard Workerwith_ld_version_script = false
1480*61046927SAndroid Build Coastguard Workerif cc.links('int main() { return 0; }',
1481*61046927SAndroid Build Coastguard Worker            args : '-Wl,--version-script=@0@'.format(
1482*61046927SAndroid Build Coastguard Worker              join_paths(meson.current_source_dir(), 'build-support/conftest.map')),
1483*61046927SAndroid Build Coastguard Worker            name : 'version-script')
1484*61046927SAndroid Build Coastguard Worker  with_ld_version_script = true
1485*61046927SAndroid Build Coastguard Workerendif
1486*61046927SAndroid Build Coastguard Workerwith_ld_dynamic_list = false
1487*61046927SAndroid Build Coastguard Workerif cc.links('int main() { return 0; }',
1488*61046927SAndroid Build Coastguard Worker            args : '-Wl,--dynamic-list=@0@'.format(
1489*61046927SAndroid Build Coastguard Worker              join_paths(meson.current_source_dir(), 'build-support/conftest.dyn')),
1490*61046927SAndroid Build Coastguard Worker            name : 'dynamic-list')
1491*61046927SAndroid Build Coastguard Worker  with_ld_dynamic_list = true
1492*61046927SAndroid Build Coastguard Workerendif
1493*61046927SAndroid Build Coastguard Worker
1494*61046927SAndroid Build Coastguard Workerld_args_build_id = cc.get_supported_link_arguments('-Wl,--build-id=sha1')
1495*61046927SAndroid Build Coastguard Worker
1496*61046927SAndroid Build Coastguard Worker# check for dl support
1497*61046927SAndroid Build Coastguard Workerdep_dl = null_dep
1498*61046927SAndroid Build Coastguard Workerif host_machine.system() != 'windows'
1499*61046927SAndroid Build Coastguard Worker  if not cc.has_function('dlopen')
1500*61046927SAndroid Build Coastguard Worker    dep_dl = cc.find_library('dl', required : true)
1501*61046927SAndroid Build Coastguard Worker  endif
1502*61046927SAndroid Build Coastguard Worker  if cc.has_function('dladdr', dependencies : dep_dl)
1503*61046927SAndroid Build Coastguard Worker    # This is really only required for util/disk_cache.h
1504*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAVE_DLADDR'
1505*61046927SAndroid Build Coastguard Worker  endif
1506*61046927SAndroid Build Coastguard Workerendif
1507*61046927SAndroid Build Coastguard Worker
1508*61046927SAndroid Build Coastguard Workerif cc.has_function('dl_iterate_phdr')
1509*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_DL_ITERATE_PHDR'
1510*61046927SAndroid Build Coastguard Workerelif with_intel_vk or with_intel_hasvk
1511*61046927SAndroid Build Coastguard Worker  error('Intel "Anvil" Vulkan driver requires the dl_iterate_phdr function')
1512*61046927SAndroid Build Coastguard Workerendif
1513*61046927SAndroid Build Coastguard Worker
1514*61046927SAndroid Build Coastguard Workerif with_any_intel and ['x86', 'x86_64'].contains(host_machine.cpu_family())
1515*61046927SAndroid Build Coastguard Worker  pre_args += '-DSUPPORT_INTEL_INTEGRATED_GPUS'
1516*61046927SAndroid Build Coastguard Workerendif
1517*61046927SAndroid Build Coastguard Worker
1518*61046927SAndroid Build Coastguard Workerif with_gallium_i915 and host_machine.cpu_family().startswith('x86') == false
1519*61046927SAndroid Build Coastguard Worker  error('Intel "i915" Gallium driver requires x86 or x86_64 CPU family')
1520*61046927SAndroid Build Coastguard Workerendif
1521*61046927SAndroid Build Coastguard Worker
1522*61046927SAndroid Build Coastguard Worker# Determine whether or not the rt library is needed for time functions
1523*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'windows' or cc.has_function('clock_gettime')
1524*61046927SAndroid Build Coastguard Worker  dep_clock = null_dep
1525*61046927SAndroid Build Coastguard Workerelse
1526*61046927SAndroid Build Coastguard Worker  dep_clock = cc.find_library('rt')
1527*61046927SAndroid Build Coastguard Workerendif
1528*61046927SAndroid Build Coastguard Worker
1529*61046927SAndroid Build Coastguard Worker# IMPORTANT: We can't upgrade Zlib beyond 1.2.5 because it would break Viewperf.
1530*61046927SAndroid Build Coastguard Workerdep_zlib = dependency('zlib', version : '>= 1.2.3',
1531*61046927SAndroid Build Coastguard Worker                      allow_fallback: true,
1532*61046927SAndroid Build Coastguard Worker                      required : get_option('zlib'))
1533*61046927SAndroid Build Coastguard Workerif dep_zlib.found()
1534*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_ZLIB'
1535*61046927SAndroid Build Coastguard Workerendif
1536*61046927SAndroid Build Coastguard Worker
1537*61046927SAndroid Build Coastguard Workerdep_zstd = dependency('libzstd', required : get_option('zstd'))
1538*61046927SAndroid Build Coastguard Workerif dep_zstd.found()
1539*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_ZSTD'
1540*61046927SAndroid Build Coastguard Workerendif
1541*61046927SAndroid Build Coastguard Worker
1542*61046927SAndroid Build Coastguard Workerwith_compression = dep_zlib.found() or dep_zstd.found()
1543*61046927SAndroid Build Coastguard Workerif with_compression
1544*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_COMPRESSION'
1545*61046927SAndroid Build Coastguard Workerelif with_shader_cache
1546*61046927SAndroid Build Coastguard Worker  error('Shader Cache requires compression')
1547*61046927SAndroid Build Coastguard Workerendif
1548*61046927SAndroid Build Coastguard Worker
1549*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'windows'
1550*61046927SAndroid Build Coastguard Worker  # For MSVC and MinGW we aren't using pthreads, and dependency('threads') will add linkage
1551*61046927SAndroid Build Coastguard Worker  # to pthread for MinGW, so leave the dependency null_dep for Windows. For Windows linking to
1552*61046927SAndroid Build Coastguard Worker  # kernel32 is enough for c11/threads.h and it's already linked by meson by default
1553*61046927SAndroid Build Coastguard Worker  dep_thread = null_dep
1554*61046927SAndroid Build Coastguard Workerelse
1555*61046927SAndroid Build Coastguard Worker  dep_thread = dependency('threads')
1556*61046927SAndroid Build Coastguard Workerendif
1557*61046927SAndroid Build Coastguard Workerif dep_thread.found()
1558*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_PTHREAD'
1559*61046927SAndroid Build Coastguard Worker  if host_machine.system() != 'netbsd' and cc.has_function(
1560*61046927SAndroid Build Coastguard Worker      'pthread_setaffinity_np',
1561*61046927SAndroid Build Coastguard Worker      dependencies : dep_thread,
1562*61046927SAndroid Build Coastguard Worker      prefix : '#include <pthread.h>',
1563*61046927SAndroid Build Coastguard Worker      args : '-D_GNU_SOURCE')
1564*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAVE_PTHREAD_SETAFFINITY'
1565*61046927SAndroid Build Coastguard Worker  endif
1566*61046927SAndroid Build Coastguard Workerendif
1567*61046927SAndroid Build Coastguard Worker
1568*61046927SAndroid Build Coastguard Workerwith_expat = get_option('expat') \
1569*61046927SAndroid Build Coastguard Worker  .disable_auto_if(with_platform_android or with_platform_windows)
1570*61046927SAndroid Build Coastguard Worker
1571*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'darwin'
1572*61046927SAndroid Build Coastguard Worker  dep_expat = meson.get_compiler('c').find_library('expat', required : with_expat)
1573*61046927SAndroid Build Coastguard Workerelse
1574*61046927SAndroid Build Coastguard Worker  dep_expat = dependency('expat', allow_fallback: true,
1575*61046927SAndroid Build Coastguard Worker                         required : with_expat)
1576*61046927SAndroid Build Coastguard Workerendif
1577*61046927SAndroid Build Coastguard Worker
1578*61046927SAndroid Build Coastguard Worker# TODO: with Meson 1.1.0 this can be replaced with with_expat.enable_if(with_intel_tools)
1579*61046927SAndroid Build Coastguard Workerif with_intel_tools and not dep_expat.found()
1580*61046927SAndroid Build Coastguard Worker  error('Intel tools require expat')
1581*61046927SAndroid Build Coastguard Workerendif
1582*61046927SAndroid Build Coastguard Worker
1583*61046927SAndroid Build Coastguard Worker# We don't require expat on Android or Windows
1584*61046927SAndroid Build Coastguard Workeruse_xmlconfig = get_option('xmlconfig') \
1585*61046927SAndroid Build Coastguard Worker  .require(not (with_platform_android or with_platform_windows),
1586*61046927SAndroid Build Coastguard Worker           error_message : 'xmlconfig not available on Android or Windows') \
1587*61046927SAndroid Build Coastguard Worker  .require(dep_expat.found(),
1588*61046927SAndroid Build Coastguard Worker           error_message : 'requires expat') \
1589*61046927SAndroid Build Coastguard Worker  .allowed()
1590*61046927SAndroid Build Coastguard Worker
1591*61046927SAndroid Build Coastguard Worker# Predefined macros for windows
1592*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'windows'
1593*61046927SAndroid Build Coastguard Worker  pre_args += '-DWIN32_LEAN_AND_MEAN' # http://msdn2.microsoft.com/en-us/library/6dwk3a1z.aspx
1594*61046927SAndroid Build Coastguard Workerendif
1595*61046927SAndroid Build Coastguard Worker# this only exists on linux so either this is linux and it will be found, or
1596*61046927SAndroid Build Coastguard Worker# it's not linux and wont
1597*61046927SAndroid Build Coastguard Workerdep_m = cc.find_library('m', required : false)
1598*61046927SAndroid Build Coastguard Worker
1599*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'windows'
1600*61046927SAndroid Build Coastguard Worker  dep_regex = meson.get_compiler('c').find_library('regex', required : false)
1601*61046927SAndroid Build Coastguard Worker  if not dep_regex.found()
1602*61046927SAndroid Build Coastguard Worker    dep_regex = declare_dependency(compile_args : ['-DNO_REGEX'])
1603*61046927SAndroid Build Coastguard Worker  endif
1604*61046927SAndroid Build Coastguard Workerelse
1605*61046927SAndroid Build Coastguard Worker  dep_regex = null_dep
1606*61046927SAndroid Build Coastguard Workerendif
1607*61046927SAndroid Build Coastguard Worker
1608*61046927SAndroid Build Coastguard Workerif with_platform_haiku
1609*61046927SAndroid Build Coastguard Worker  dep_network = cc.find_library('network')
1610*61046927SAndroid Build Coastguard Workerendif
1611*61046927SAndroid Build Coastguard Worker
1612*61046927SAndroid Build Coastguard Workerdep_futex = null_dep
1613*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'windows'
1614*61046927SAndroid Build Coastguard Worker  if (get_option('min-windows-version') < 8)
1615*61046927SAndroid Build Coastguard Worker    pre_args += '-DWINDOWS_NO_FUTEX'
1616*61046927SAndroid Build Coastguard Worker  else
1617*61046927SAndroid Build Coastguard Worker    dep_futex = cc.find_library('synchronization', required : true)
1618*61046927SAndroid Build Coastguard Worker  endif
1619*61046927SAndroid Build Coastguard Workerendif
1620*61046927SAndroid Build Coastguard Worker
1621*61046927SAndroid Build Coastguard Worker# Check for libdrm. Various drivers have different libdrm version requirements,
1622*61046927SAndroid Build Coastguard Worker# but we always want to use the same version for all libdrm modules. That means
1623*61046927SAndroid Build Coastguard Worker# even if driver foo requires 2.4.0 and driver bar requires 2.4.3, if foo and
1624*61046927SAndroid Build Coastguard Worker# bar are both on use 2.4.3 for both of them
1625*61046927SAndroid Build Coastguard Workerdep_libdrm_amdgpu = null_dep
1626*61046927SAndroid Build Coastguard Workerdep_libdrm_radeon = null_dep
1627*61046927SAndroid Build Coastguard Workerdep_libdrm_intel = null_dep
1628*61046927SAndroid Build Coastguard Worker
1629*61046927SAndroid Build Coastguard Worker_drm_amdgpu_ver = '2.4.121'
1630*61046927SAndroid Build Coastguard Worker_drm_radeon_ver = '2.4.71'
1631*61046927SAndroid Build Coastguard Worker_drm_intel_ver = '2.4.75'
1632*61046927SAndroid Build Coastguard Worker_drm_ver = '2.4.109'
1633*61046927SAndroid Build Coastguard Worker
1634*61046927SAndroid Build Coastguard Worker_libdrm_checks = [
1635*61046927SAndroid Build Coastguard Worker  ['intel', with_gallium_i915],
1636*61046927SAndroid Build Coastguard Worker  ['amdgpu', (with_amd_vk and not with_platform_windows) or with_gallium_radeonsi],
1637*61046927SAndroid Build Coastguard Worker  ['radeon', (with_gallium_radeonsi or with_gallium_r300 or with_gallium_r600)],
1638*61046927SAndroid Build Coastguard Worker]
1639*61046927SAndroid Build Coastguard Worker
1640*61046927SAndroid Build Coastguard Worker# Loop over the enables versions and get the highest libdrm requirement for all
1641*61046927SAndroid Build Coastguard Worker# active drivers.
1642*61046927SAndroid Build Coastguard Worker_drm_blame = ''
1643*61046927SAndroid Build Coastguard Workerforeach d : _libdrm_checks
1644*61046927SAndroid Build Coastguard Worker  ver = get_variable('_drm_@0@_ver'.format(d[0]))
1645*61046927SAndroid Build Coastguard Worker  if d[1] and ver.version_compare('>' + _drm_ver)
1646*61046927SAndroid Build Coastguard Worker    _drm_ver = ver
1647*61046927SAndroid Build Coastguard Worker    _drm_blame = d[0]
1648*61046927SAndroid Build Coastguard Worker  endif
1649*61046927SAndroid Build Coastguard Workerendforeach
1650*61046927SAndroid Build Coastguard Workerif _drm_blame != ''
1651*61046927SAndroid Build Coastguard Worker  message('libdrm @0@ needed because @1@ has the highest requirement'.format(_drm_ver, _drm_blame))
1652*61046927SAndroid Build Coastguard Workerendif
1653*61046927SAndroid Build Coastguard Worker
1654*61046927SAndroid Build Coastguard Worker# Then get each libdrm module
1655*61046927SAndroid Build Coastguard Workerforeach d : _libdrm_checks
1656*61046927SAndroid Build Coastguard Worker  if d[1]
1657*61046927SAndroid Build Coastguard Worker    set_variable(
1658*61046927SAndroid Build Coastguard Worker      'dep_libdrm_' + d[0],
1659*61046927SAndroid Build Coastguard Worker      dependency('libdrm_' + d[0], version : '>=' + _drm_ver)
1660*61046927SAndroid Build Coastguard Worker    )
1661*61046927SAndroid Build Coastguard Worker  endif
1662*61046927SAndroid Build Coastguard Workerendforeach
1663*61046927SAndroid Build Coastguard Worker
1664*61046927SAndroid Build Coastguard Workerwith_gallium_drisw_kms = false
1665*61046927SAndroid Build Coastguard Workerif system_has_kms_drm
1666*61046927SAndroid Build Coastguard Worker  dep_libdrm = dependency(
1667*61046927SAndroid Build Coastguard Worker    'libdrm', version : '>=' + _drm_ver,
1668*61046927SAndroid Build Coastguard Worker    required : with_dri2 or with_dri or with_gbm
1669*61046927SAndroid Build Coastguard Worker  )
1670*61046927SAndroid Build Coastguard Workerelse
1671*61046927SAndroid Build Coastguard Worker  # We should prevent libdrm from being available when the target doesn't have it to avoid transitive
1672*61046927SAndroid Build Coastguard Worker  # dependencies (such as vk-runtime) linking to it
1673*61046927SAndroid Build Coastguard Worker  dep_libdrm = null_dep
1674*61046927SAndroid Build Coastguard Workerendif
1675*61046927SAndroid Build Coastguard Workerif dep_libdrm.found()
1676*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_LIBDRM'
1677*61046927SAndroid Build Coastguard Worker  if with_dri_platform == 'drm' and with_dri
1678*61046927SAndroid Build Coastguard Worker    with_gallium_drisw_kms = true
1679*61046927SAndroid Build Coastguard Worker  endif
1680*61046927SAndroid Build Coastguard Workerendif
1681*61046927SAndroid Build Coastguard Worker
1682*61046927SAndroid Build Coastguard Workerdep_libudev = dependency('libudev', required : false)
1683*61046927SAndroid Build Coastguard Workerif dep_libudev.found()
1684*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_LIBUDEV'
1685*61046927SAndroid Build Coastguard Workerendif
1686*61046927SAndroid Build Coastguard Worker
1687*61046927SAndroid Build Coastguard Workerllvm_modules = ['bitwriter', 'engine', 'mcdisassembler', 'mcjit', 'core', 'executionengine', 'scalaropts', 'transformutils', 'instcombine']
1688*61046927SAndroid Build Coastguard Workerllvm_optional_modules = ['coroutines']
1689*61046927SAndroid Build Coastguard Workerif with_amd_vk or with_gallium_radeonsi or with_gallium_r600
1690*61046927SAndroid Build Coastguard Worker  llvm_modules += ['amdgpu', 'bitreader', 'ipo']
1691*61046927SAndroid Build Coastguard Worker  if with_gallium_r600
1692*61046927SAndroid Build Coastguard Worker    llvm_modules += 'asmparser'
1693*61046927SAndroid Build Coastguard Worker  endif
1694*61046927SAndroid Build Coastguard Workerendif
1695*61046927SAndroid Build Coastguard Workerif with_gallium_clover
1696*61046927SAndroid Build Coastguard Worker  llvm_modules += [
1697*61046927SAndroid Build Coastguard Worker    'linker', 'coverage', 'instrumentation', 'ipo', 'irreader',
1698*61046927SAndroid Build Coastguard Worker    'lto', 'option', 'objcarcopts', 'profiledata'
1699*61046927SAndroid Build Coastguard Worker  ]
1700*61046927SAndroid Build Coastguard Worker  # all-targets is needed to support static linking LLVM build with multiple targets
1701*61046927SAndroid Build Coastguard Worker  # windowsdriver is needded with LLVM>=15, but we don't know what LLVM verrsion we are using yet
1702*61046927SAndroid Build Coastguard Worker  llvm_optional_modules += ['all-targets', 'frontendopenmp', 'windowsdriver']
1703*61046927SAndroid Build Coastguard Workerendif
1704*61046927SAndroid Build Coastguard Workerif with_clc
1705*61046927SAndroid Build Coastguard Worker  llvm_modules += ['coverage', 'target', 'linker', 'irreader', 'option', 'libdriver', 'lto']
1706*61046927SAndroid Build Coastguard Worker  # all-targets is needed to support static linking LLVM build with multiple targets.
1707*61046927SAndroid Build Coastguard Worker  # windowsdriver is needded with LLVM>=15 and frontendhlsl is needed with LLVM>=16,
1708*61046927SAndroid Build Coastguard Worker  # but we don't know what LLVM version we are using yet
1709*61046927SAndroid Build Coastguard Worker  llvm_optional_modules += ['all-targets', 'windowsdriver', 'frontendhlsl', 'frontenddriver']
1710*61046927SAndroid Build Coastguard Workerendif
1711*61046927SAndroid Build Coastguard Workerdraw_with_llvm = get_option('draw-use-llvm')
1712*61046927SAndroid Build Coastguard Workerif draw_with_llvm
1713*61046927SAndroid Build Coastguard Worker  llvm_modules += 'native'
1714*61046927SAndroid Build Coastguard Worker  # lto is needded with LLVM>=15, but we don't know what LLVM verrsion we are using yet
1715*61046927SAndroid Build Coastguard Worker  llvm_optional_modules += ['lto']
1716*61046927SAndroid Build Coastguard Workerendif
1717*61046927SAndroid Build Coastguard Workeramd_with_llvm = get_option('amd-use-llvm')
1718*61046927SAndroid Build Coastguard Worker
1719*61046927SAndroid Build Coastguard Worker# MCJIT is deprecated in LLVM and will not accept new architecture ports,
1720*61046927SAndroid Build Coastguard Worker# so any architecture not in the exhaustive list will have to rely on LLVM
1721*61046927SAndroid Build Coastguard Worker# ORCJIT for llvmpipe functionality.
1722*61046927SAndroid Build Coastguard Workerllvm_has_mcjit = host_machine.cpu_family() in ['aarch64', 'arm', 'ppc', 'ppc64', 's390x', 'x86', 'x86_64']
1723*61046927SAndroid Build Coastguard Workerllvm_with_orcjit = get_option('llvm-orcjit') or not llvm_has_mcjit
1724*61046927SAndroid Build Coastguard Worker
1725*61046927SAndroid Build Coastguard Workerif with_amd_vk or with_gallium_radeonsi or with_clc or llvm_with_orcjit
1726*61046927SAndroid Build Coastguard Worker  _llvm_version = '>= 15.0.0'
1727*61046927SAndroid Build Coastguard Workerelif with_gallium_clover
1728*61046927SAndroid Build Coastguard Worker  _llvm_version = '>= 11.0.0'
1729*61046927SAndroid Build Coastguard Workerelse
1730*61046927SAndroid Build Coastguard Worker  _llvm_version = '>= 5.0.0'
1731*61046927SAndroid Build Coastguard Workerendif
1732*61046927SAndroid Build Coastguard Worker
1733*61046927SAndroid Build Coastguard Worker_shared_llvm = get_option('shared-llvm') \
1734*61046927SAndroid Build Coastguard Worker  .disable_auto_if(host_machine.system() == 'windows') \
1735*61046927SAndroid Build Coastguard Worker  .allowed()
1736*61046927SAndroid Build Coastguard Worker
1737*61046927SAndroid Build Coastguard Worker_llvm = get_option('llvm')
1738*61046927SAndroid Build Coastguard Workerdep_llvm = null_dep
1739*61046927SAndroid Build Coastguard Workerwith_llvm = false
1740*61046927SAndroid Build Coastguard Workerif _llvm.allowed()
1741*61046927SAndroid Build Coastguard Worker  dep_llvm = dependency(
1742*61046927SAndroid Build Coastguard Worker    'llvm',
1743*61046927SAndroid Build Coastguard Worker    method : host_machine.system() == 'windows' ? 'auto' : 'config-tool',
1744*61046927SAndroid Build Coastguard Worker    version : _llvm_version,
1745*61046927SAndroid Build Coastguard Worker    modules : llvm_modules,
1746*61046927SAndroid Build Coastguard Worker    optional_modules : llvm_optional_modules,
1747*61046927SAndroid Build Coastguard Worker    required : (
1748*61046927SAndroid Build Coastguard Worker      with_amd_vk or with_gallium_radeonsi or with_gallium_clover or with_clc
1749*61046927SAndroid Build Coastguard Worker      or _llvm.enabled()
1750*61046927SAndroid Build Coastguard Worker    ),
1751*61046927SAndroid Build Coastguard Worker    static : not _shared_llvm,
1752*61046927SAndroid Build Coastguard Worker    fallback : ['llvm', 'dep_llvm'],
1753*61046927SAndroid Build Coastguard Worker    include_type : 'system',
1754*61046927SAndroid Build Coastguard Worker  )
1755*61046927SAndroid Build Coastguard Worker  with_llvm = dep_llvm.found()
1756*61046927SAndroid Build Coastguard Workerendif
1757*61046927SAndroid Build Coastguard Workerif with_llvm
1758*61046927SAndroid Build Coastguard Worker  pre_args += '-DMESA_LLVM_VERSION_STRING="@0@"'.format(dep_llvm.version())
1759*61046927SAndroid Build Coastguard Worker  pre_args += '-DLLVM_IS_SHARED=@0@'.format(_shared_llvm.to_int())
1760*61046927SAndroid Build Coastguard Worker
1761*61046927SAndroid Build Coastguard Worker  if (with_swrast_vk or with_gallium_llvmpipe) and not draw_with_llvm
1762*61046927SAndroid Build Coastguard Worker    error('Lavapipe and llvmpipe require LLVM draw support.')
1763*61046927SAndroid Build Coastguard Worker  endif
1764*61046927SAndroid Build Coastguard Worker
1765*61046927SAndroid Build Coastguard Worker  if with_gallium_r600 and not amd_with_llvm
1766*61046927SAndroid Build Coastguard Worker    error('R600 requires LLVM AMD support.')
1767*61046927SAndroid Build Coastguard Worker  endif
1768*61046927SAndroid Build Coastguard Worker
1769*61046927SAndroid Build Coastguard Worker  if host_machine.system() != 'windows'
1770*61046927SAndroid Build Coastguard Worker    # LLVM can be built without rtti, turning off rtti changes the ABI of C++
1771*61046927SAndroid Build Coastguard Worker    # programs, so we need to build all C++ code in mesa without rtti as well to
1772*61046927SAndroid Build Coastguard Worker    # ensure that linking works. Note that Win32 compilers does handle mismatching RTTI
1773*61046927SAndroid Build Coastguard Worker    # without issues, so only apply this for other compilers.
1774*61046927SAndroid Build Coastguard Worker    if dep_llvm.type_name() == 'internal'
1775*61046927SAndroid Build Coastguard Worker      _llvm_rtti = subproject('llvm').get_variable('has_rtti', true)
1776*61046927SAndroid Build Coastguard Worker    else
1777*61046927SAndroid Build Coastguard Worker      # The CMake finder will return 'ON', the llvm-config will return 'YES'
1778*61046927SAndroid Build Coastguard Worker      _llvm_rtti = ['ON', 'YES'].contains(dep_llvm.get_variable(cmake : 'LLVM_ENABLE_RTTI', configtool: 'has-rtti'))
1779*61046927SAndroid Build Coastguard Worker    endif
1780*61046927SAndroid Build Coastguard Worker    if _rtti != _llvm_rtti
1781*61046927SAndroid Build Coastguard Worker      if _llvm_rtti
1782*61046927SAndroid Build Coastguard Worker        error('LLVM was built with RTTI, cannot build Mesa with RTTI disabled. Remove cpp_rtti disable switch or use LLVM built without LLVM_ENABLE_RTTI.')
1783*61046927SAndroid Build Coastguard Worker      else
1784*61046927SAndroid Build Coastguard Worker        error('LLVM was built without RTTI, so Mesa must also disable RTTI. Use an LLVM built with LLVM_ENABLE_RTTI or add cpp_rtti=false.')
1785*61046927SAndroid Build Coastguard Worker      endif
1786*61046927SAndroid Build Coastguard Worker    endif
1787*61046927SAndroid Build Coastguard Worker  endif
1788*61046927SAndroid Build Coastguard Worker
1789*61046927SAndroid Build Coastguard Worker  if cc.get_argument_syntax() == 'msvc'
1790*61046927SAndroid Build Coastguard Worker    # Suppress "/DELAYLOAD:ole32.dll/shell32.dll ignored" warnings that LLVM adds
1791*61046927SAndroid Build Coastguard Worker    add_project_link_arguments(
1792*61046927SAndroid Build Coastguard Worker      '/ignore:4199',
1793*61046927SAndroid Build Coastguard Worker      language : ['c', 'cpp'],
1794*61046927SAndroid Build Coastguard Worker    )
1795*61046927SAndroid Build Coastguard Worker  endif
1796*61046927SAndroid Build Coastguard Workerelif with_amd_vk and with_aco_tests
1797*61046927SAndroid Build Coastguard Worker  error('ACO tests require LLVM, but LLVM is disabled.')
1798*61046927SAndroid Build Coastguard Workerelif with_swrast_vk
1799*61046927SAndroid Build Coastguard Worker  error('lavapipe requires LLVM and is enabled, but LLVM is disabled.')
1800*61046927SAndroid Build Coastguard Workerelif with_any_llvmpipe
1801*61046927SAndroid Build Coastguard Worker  error('llvmpipe requires LLVM and is enabled, but LLVM is disabled.')
1802*61046927SAndroid Build Coastguard Workerelif with_gallium_clover
1803*61046927SAndroid Build Coastguard Worker  error('The OpenCL "Clover" state tracker requires LLVM, but LLVM is disabled.')
1804*61046927SAndroid Build Coastguard Workerelif with_clc
1805*61046927SAndroid Build Coastguard Worker  error('The CLC compiler requires LLVM, but LLVM is disabled.')
1806*61046927SAndroid Build Coastguard Workerelse
1807*61046927SAndroid Build Coastguard Worker  draw_with_llvm = false
1808*61046927SAndroid Build Coastguard Workerendif
1809*61046927SAndroid Build Coastguard Workeramd_with_llvm = amd_with_llvm and with_llvm
1810*61046927SAndroid Build Coastguard Workerpre_args += '-DLLVM_AVAILABLE=@0@'.format(with_llvm.to_int())
1811*61046927SAndroid Build Coastguard Workerpre_args += '-DDRAW_LLVM_AVAILABLE=@0@'.format((with_llvm and draw_with_llvm).to_int())
1812*61046927SAndroid Build Coastguard Workerpre_args += '-DAMD_LLVM_AVAILABLE=@0@'.format(amd_with_llvm.to_int())
1813*61046927SAndroid Build Coastguard Workerpre_args += '-DGALLIVM_USE_ORCJIT=@0@'.format((with_llvm and llvm_with_orcjit).to_int())
1814*61046927SAndroid Build Coastguard Worker
1815*61046927SAndroid Build Coastguard Workerif with_clover_spirv or with_clc
1816*61046927SAndroid Build Coastguard Worker  chosen_llvm_version_array = dep_llvm.version().split('.')
1817*61046927SAndroid Build Coastguard Worker  chosen_llvm_version_major = chosen_llvm_version_array[0].to_int()
1818*61046927SAndroid Build Coastguard Worker  chosen_llvm_version_minor = chosen_llvm_version_array[1].to_int()
1819*61046927SAndroid Build Coastguard Worker
1820*61046927SAndroid Build Coastguard Worker  # Require an SPIRV-LLVM-Translator version compatible with the chosen LLVM
1821*61046927SAndroid Build Coastguard Worker  # one.
1822*61046927SAndroid Build Coastguard Worker
1823*61046927SAndroid Build Coastguard Worker  # This first version check is still needed as maybe LLVM 8.0 was picked but
1824*61046927SAndroid Build Coastguard Worker  # we do not want to accept SPIRV-LLVM-Translator 8.0.0.1 as that version
1825*61046927SAndroid Build Coastguard Worker  # does not have the required API and those are only available starting from
1826*61046927SAndroid Build Coastguard Worker  # 8.0.1.3.
1827*61046927SAndroid Build Coastguard Worker  _llvmspirvlib_min_version = '>= 8.0.1.3'
1828*61046927SAndroid Build Coastguard Worker  if with_clc
1829*61046927SAndroid Build Coastguard Worker    _llvmspirvlib_min_version = '>= 15.0.0.0'
1830*61046927SAndroid Build Coastguard Worker  endif
1831*61046927SAndroid Build Coastguard Worker
1832*61046927SAndroid Build Coastguard Worker  _llvmspirvlib_version = [
1833*61046927SAndroid Build Coastguard Worker    _llvmspirvlib_min_version,
1834*61046927SAndroid Build Coastguard Worker    '>= @0@.@1@'.format(chosen_llvm_version_major, chosen_llvm_version_minor),
1835*61046927SAndroid Build Coastguard Worker    '< @0@.@1@'.format(chosen_llvm_version_major, chosen_llvm_version_minor + 1) ]
1836*61046927SAndroid Build Coastguard Worker
1837*61046927SAndroid Build Coastguard Worker  # LLVMSPIRVLib is available at https://github.com/KhronosGroup/SPIRV-LLVM-Translator
1838*61046927SAndroid Build Coastguard Worker  dep_llvmspirvlib = dependency('LLVMSPIRVLib', required : true, version : _llvmspirvlib_version)
1839*61046927SAndroid Build Coastguard Workerelse
1840*61046927SAndroid Build Coastguard Worker  dep_llvmspirvlib = null_dep
1841*61046927SAndroid Build Coastguard Workerendif
1842*61046927SAndroid Build Coastguard Worker
1843*61046927SAndroid Build Coastguard Workerdep_spirv_tools = dependency(
1844*61046927SAndroid Build Coastguard Worker  'SPIRV-Tools',
1845*61046927SAndroid Build Coastguard Worker  required : with_clover_spirv or with_clc,
1846*61046927SAndroid Build Coastguard Worker  version : '>= 2018.0'
1847*61046927SAndroid Build Coastguard Worker)
1848*61046927SAndroid Build Coastguard Workerif dep_spirv_tools.found()
1849*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_SPIRV_TOOLS'
1850*61046927SAndroid Build Coastguard Workerendif
1851*61046927SAndroid Build Coastguard Worker
1852*61046927SAndroid Build Coastguard Workerdep_clang = null_dep
1853*61046927SAndroid Build Coastguard Workerif with_clc
1854*61046927SAndroid Build Coastguard Worker  llvm_libdir = dep_llvm.get_variable(cmake : 'LLVM_LIBRARY_DIR', configtool: 'libdir')
1855*61046927SAndroid Build Coastguard Worker
1856*61046927SAndroid Build Coastguard Worker  dep_clang = cpp.find_library('clang-cpp', dirs : llvm_libdir, required : false)
1857*61046927SAndroid Build Coastguard Worker
1858*61046927SAndroid Build Coastguard Worker  if not dep_clang.found() or not _shared_llvm
1859*61046927SAndroid Build Coastguard Worker    clang_modules = [
1860*61046927SAndroid Build Coastguard Worker      'clangBasic', 'clangAST', 'clangCodeGen', 'clangLex',
1861*61046927SAndroid Build Coastguard Worker      'clangDriver', 'clangFrontend', 'clangFrontendTool',
1862*61046927SAndroid Build Coastguard Worker      'clangHandleCXX', 'clangHandleLLVM', 'clangSerialization',
1863*61046927SAndroid Build Coastguard Worker      'clangSema', 'clangParse', 'clangEdit', 'clangAnalysis'
1864*61046927SAndroid Build Coastguard Worker    ]
1865*61046927SAndroid Build Coastguard Worker    if dep_llvm.version().version_compare('>= 15.0')
1866*61046927SAndroid Build Coastguard Worker      clang_modules += 'clangSupport'
1867*61046927SAndroid Build Coastguard Worker    endif
1868*61046927SAndroid Build Coastguard Worker    if dep_llvm.version().version_compare('>= 16.0')
1869*61046927SAndroid Build Coastguard Worker      clang_modules += 'clangASTMatchers'
1870*61046927SAndroid Build Coastguard Worker    endif
1871*61046927SAndroid Build Coastguard Worker    if dep_llvm.version().version_compare('>= 18.0')
1872*61046927SAndroid Build Coastguard Worker      clang_modules += 'clangAPINotes'
1873*61046927SAndroid Build Coastguard Worker    endif
1874*61046927SAndroid Build Coastguard Worker
1875*61046927SAndroid Build Coastguard Worker    dep_clang = []
1876*61046927SAndroid Build Coastguard Worker    foreach m : clang_modules
1877*61046927SAndroid Build Coastguard Worker      dep_clang += cpp.find_library(m, dirs : llvm_libdir, required : true)
1878*61046927SAndroid Build Coastguard Worker    endforeach
1879*61046927SAndroid Build Coastguard Worker  endif
1880*61046927SAndroid Build Coastguard Workerendif
1881*61046927SAndroid Build Coastguard Worker
1882*61046927SAndroid Build Coastguard Workerdep_lua = dependency('lua54', 'lua5.4', 'lua-5.4',
1883*61046927SAndroid Build Coastguard Worker                     'lua53', 'lua5.3', 'lua-5.3',
1884*61046927SAndroid Build Coastguard Worker                     'lua', required: false,
1885*61046927SAndroid Build Coastguard Worker                     allow_fallback: with_tools.contains('freedreno'),
1886*61046927SAndroid Build Coastguard Worker                     version: '>=5.3')
1887*61046927SAndroid Build Coastguard Worker
1888*61046927SAndroid Build Coastguard Worker# Be explicit about only using this lib on Windows, to avoid picking
1889*61046927SAndroid Build Coastguard Worker# up random libs with the generic name 'libversion'
1890*61046927SAndroid Build Coastguard Workerdep_version = null_dep
1891*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'windows'
1892*61046927SAndroid Build Coastguard Worker  dep_version = cpp.find_library('version')
1893*61046927SAndroid Build Coastguard Workerendif
1894*61046927SAndroid Build Coastguard Worker
1895*61046927SAndroid Build Coastguard Workerdep_elf = dependency('libelf', required : false)
1896*61046927SAndroid Build Coastguard Workerif not with_platform_windows and not dep_elf.found()
1897*61046927SAndroid Build Coastguard Worker  dep_elf = cc.find_library('elf', required : false)
1898*61046927SAndroid Build Coastguard Workerendif
1899*61046927SAndroid Build Coastguard Workerif dep_elf.found()
1900*61046927SAndroid Build Coastguard Worker  pre_args += '-DUSE_LIBELF'
1901*61046927SAndroid Build Coastguard Workerelif with_gallium_radeonsi
1902*61046927SAndroid Build Coastguard Worker  error('Gallium driver radeonsi requires libelf')
1903*61046927SAndroid Build Coastguard Workerendif
1904*61046927SAndroid Build Coastguard Worker
1905*61046927SAndroid Build Coastguard Workerdep_valgrind = dependency('valgrind', required : get_option('valgrind'))
1906*61046927SAndroid Build Coastguard Workerif dep_valgrind.found()
1907*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_VALGRIND'
1908*61046927SAndroid Build Coastguard Workerendif
1909*61046927SAndroid Build Coastguard Worker
1910*61046927SAndroid Build Coastguard Worker# AddressSanitizer's leak reports need all the symbols to be present at exit to
1911*61046927SAndroid Build Coastguard Worker# decode well, which runs afoul of our dlopen()/dlclose()ing of the DRI drivers.
1912*61046927SAndroid Build Coastguard Worker# Set a flag so we can skip the dlclose for asan builds.
1913*61046927SAndroid Build Coastguard Workerif ['address', 'address,undefined'].contains(get_option('b_sanitize'))
1914*61046927SAndroid Build Coastguard Worker  asan_c_args = ['-DBUILT_WITH_ASAN=1']
1915*61046927SAndroid Build Coastguard Workerelse
1916*61046927SAndroid Build Coastguard Worker  asan_c_args = ['-DBUILT_WITH_ASAN=0']
1917*61046927SAndroid Build Coastguard Workerendif
1918*61046927SAndroid Build Coastguard Worker
1919*61046927SAndroid Build Coastguard Worker# ThreadSanitizer can't deal with futexes, and reports races for cases we don't care about
1920*61046927SAndroid Build Coastguard Worker# so add a define to work silence these issues.
1921*61046927SAndroid Build Coastguard Workerif get_option('b_sanitize') == 'thread'
1922*61046927SAndroid Build Coastguard Worker  pre_args += '-DTHREAD_SANITIZER=1'
1923*61046927SAndroid Build Coastguard Worker  # meson versions prior to 1.4 will warn "Consider using the built-in option for sanitizers ..."
1924*61046927SAndroid Build Coastguard Worker  # later on because it only checks whether the option starts with "-fsanitize",
1925*61046927SAndroid Build Coastguard Worker  # but there is no built-in option for adding a blacklist
1926*61046927SAndroid Build Coastguard Worker  tsan_blacklist = '-fsanitize-blacklist=@0@'.format(join_paths(meson.project_source_root(), 'build-support', 'tsan-blacklist.txt'))
1927*61046927SAndroid Build Coastguard Worker  if cc.has_argument(tsan_blacklist)
1928*61046927SAndroid Build Coastguard Worker    pre_args += tsan_blacklist
1929*61046927SAndroid Build Coastguard Worker  else
1930*61046927SAndroid Build Coastguard Worker    warning('Compiler does not support "-fsanitize-blacklist", expected race conditions will not be surpressed')
1931*61046927SAndroid Build Coastguard Worker  endif
1932*61046927SAndroid Build Coastguard Workerelse
1933*61046927SAndroid Build Coastguard Worker  pre_args += '-DTHREAD_SANITIZER=0'
1934*61046927SAndroid Build Coastguard Workerendif
1935*61046927SAndroid Build Coastguard Worker
1936*61046927SAndroid Build Coastguard Workeryacc_is_bison = true
1937*61046927SAndroid Build Coastguard Workerneeds_flex_bison = with_any_opengl or with_freedreno_vk or with_intel_tools or with_gallium
1938*61046927SAndroid Build Coastguard Worker
1939*61046927SAndroid Build Coastguard Workerif build_machine.system() == 'windows'
1940*61046927SAndroid Build Coastguard Worker  # Prefer the winflexbison versions, they're much easier to install and have
1941*61046927SAndroid Build Coastguard Worker  # better windows support.
1942*61046927SAndroid Build Coastguard Worker
1943*61046927SAndroid Build Coastguard Worker  prog_flex = find_program('win_flex', required : false)
1944*61046927SAndroid Build Coastguard Worker  if prog_flex.found()
1945*61046927SAndroid Build Coastguard Worker    # windows compatibility (uses <io.h> instead of <unistd.h> and _isatty,
1946*61046927SAndroid Build Coastguard Worker    # _fileno functions)
1947*61046927SAndroid Build Coastguard Worker    prog_flex = [prog_flex, '--wincompat']
1948*61046927SAndroid Build Coastguard Worker  else
1949*61046927SAndroid Build Coastguard Worker    prog_flex = [find_program('flex', 'lex', required : needs_flex_bison, disabler : true)]
1950*61046927SAndroid Build Coastguard Worker  endif
1951*61046927SAndroid Build Coastguard Worker  # Force flex to use const keyword in prototypes, as relies on __cplusplus or
1952*61046927SAndroid Build Coastguard Worker  # __STDC__ macro to determine whether it's safe to use const keyword
1953*61046927SAndroid Build Coastguard Worker  prog_flex += '-DYY_USE_CONST='
1954*61046927SAndroid Build Coastguard Worker
1955*61046927SAndroid Build Coastguard Worker  prog_flex_cpp = prog_flex
1956*61046927SAndroid Build Coastguard Worker  # Convince win_flex to use <inttypes.h> for C++ files
1957*61046927SAndroid Build Coastguard Worker  # Note that we are using a C99 version here rather than C11,
1958*61046927SAndroid Build Coastguard Worker  # because using a C11 version can cause the MSVC CRT headers to define
1959*61046927SAndroid Build Coastguard Worker  # static_assert to _Static_assert, which breaks other parts of the CRT
1960*61046927SAndroid Build Coastguard Worker  prog_flex_cpp += '-D__STDC_VERSION__=199901'
1961*61046927SAndroid Build Coastguard Worker
1962*61046927SAndroid Build Coastguard Worker  prog_bison = find_program('win_bison', required : false)
1963*61046927SAndroid Build Coastguard Worker  if not prog_bison.found()
1964*61046927SAndroid Build Coastguard Worker    prog_bison = find_program('bison', 'yacc', required : needs_flex_bison, disabler : true)
1965*61046927SAndroid Build Coastguard Worker  endif
1966*61046927SAndroid Build Coastguard Workerelse
1967*61046927SAndroid Build Coastguard Worker  prog_bison = find_program('bison', required : false)
1968*61046927SAndroid Build Coastguard Worker
1969*61046927SAndroid Build Coastguard Worker  if not prog_bison.found()
1970*61046927SAndroid Build Coastguard Worker    prog_bison = find_program('byacc', required : needs_flex_bison, disabler : true)
1971*61046927SAndroid Build Coastguard Worker    yacc_is_bison = false
1972*61046927SAndroid Build Coastguard Worker  endif
1973*61046927SAndroid Build Coastguard Worker
1974*61046927SAndroid Build Coastguard Worker  # Disable deprecated keyword warnings, since we have to use them for
1975*61046927SAndroid Build Coastguard Worker  # old-bison compat.  See discussion in
1976*61046927SAndroid Build Coastguard Worker  # https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2161
1977*61046927SAndroid Build Coastguard Worker  if find_program('bison', required : false, version : '> 2.3').found()
1978*61046927SAndroid Build Coastguard Worker    prog_bison = [prog_bison, '-Wno-deprecated']
1979*61046927SAndroid Build Coastguard Worker  endif
1980*61046927SAndroid Build Coastguard Worker
1981*61046927SAndroid Build Coastguard Worker  prog_flex = find_program('flex', required : needs_flex_bison, disabler : true)
1982*61046927SAndroid Build Coastguard Worker  prog_flex_cpp = prog_flex
1983*61046927SAndroid Build Coastguard Workerendif
1984*61046927SAndroid Build Coastguard Worker
1985*61046927SAndroid Build Coastguard Workerdep_selinux = null_dep
1986*61046927SAndroid Build Coastguard Workerif get_option('selinux')
1987*61046927SAndroid Build Coastguard Worker  dep_selinux = dependency('libselinux')
1988*61046927SAndroid Build Coastguard Worker  pre_args += '-DMESA_SELINUX'
1989*61046927SAndroid Build Coastguard Workerendif
1990*61046927SAndroid Build Coastguard Worker
1991*61046927SAndroid Build Coastguard Worker_libunwind = get_option('libunwind') \
1992*61046927SAndroid Build Coastguard Worker  .require(not with_platform_android, error_message : 'Android requires the use of the backtrace library, not libunwind')
1993*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'darwin'
1994*61046927SAndroid Build Coastguard Worker  dep_unwind = meson.get_compiler('c').find_library('System', required : _libunwind)
1995*61046927SAndroid Build Coastguard Workerelse
1996*61046927SAndroid Build Coastguard Worker  dep_unwind = dependency('libunwind', required : _libunwind)
1997*61046927SAndroid Build Coastguard Workerendif
1998*61046927SAndroid Build Coastguard Workerif dep_unwind.found()
1999*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_LIBUNWIND'
2000*61046927SAndroid Build Coastguard Workerendif
2001*61046927SAndroid Build Coastguard Worker
2002*61046927SAndroid Build Coastguard Workerif with_osmesa
2003*61046927SAndroid Build Coastguard Worker  if not with_gallium_swrast
2004*61046927SAndroid Build Coastguard Worker    error('OSMesa gallium requires gallium softpipe or llvmpipe.')
2005*61046927SAndroid Build Coastguard Worker  endif
2006*61046927SAndroid Build Coastguard Worker  if host_machine.system() == 'windows'
2007*61046927SAndroid Build Coastguard Worker    osmesa_lib_name = 'osmesa'
2008*61046927SAndroid Build Coastguard Worker  else
2009*61046927SAndroid Build Coastguard Worker    osmesa_lib_name = 'OSMesa'
2010*61046927SAndroid Build Coastguard Worker  endif
2011*61046927SAndroid Build Coastguard Workerendif
2012*61046927SAndroid Build Coastguard Worker
2013*61046927SAndroid Build Coastguard Worker# TODO: symbol mangling
2014*61046927SAndroid Build Coastguard Worker
2015*61046927SAndroid Build Coastguard Workerif with_platform_wayland
2016*61046927SAndroid Build Coastguard Worker  dep_wl_scanner = dependency('wayland-scanner', native: true)
2017*61046927SAndroid Build Coastguard Worker  prog_wl_scanner = find_program(dep_wl_scanner.get_variable(pkgconfig : 'wayland_scanner'))
2018*61046927SAndroid Build Coastguard Worker  if dep_wl_scanner.version().version_compare('>= 1.15')
2019*61046927SAndroid Build Coastguard Worker    wl_scanner_arg = 'private-code'
2020*61046927SAndroid Build Coastguard Worker  else
2021*61046927SAndroid Build Coastguard Worker    wl_scanner_arg = 'code'
2022*61046927SAndroid Build Coastguard Worker  endif
2023*61046927SAndroid Build Coastguard Worker  dep_wl_protocols = dependency('wayland-protocols', version : '>= 1.34')
2024*61046927SAndroid Build Coastguard Worker  dep_wayland_client = dependency('wayland-client', version : '>=1.18')
2025*61046927SAndroid Build Coastguard Worker  dep_wayland_server = dependency('wayland-server', version : '>=1.18')
2026*61046927SAndroid Build Coastguard Worker  if with_egl
2027*61046927SAndroid Build Coastguard Worker    dep_wayland_egl = dependency('wayland-egl-backend', version : '>= 3')
2028*61046927SAndroid Build Coastguard Worker    dep_wayland_egl_headers = dep_wayland_egl.partial_dependency(compile_args : true)
2029*61046927SAndroid Build Coastguard Worker  endif
2030*61046927SAndroid Build Coastguard Worker  pre_args += '-DWL_HIDE_DEPRECATED'
2031*61046927SAndroid Build Coastguard Worker  if cc.has_function(
2032*61046927SAndroid Build Coastguard Worker      'wl_display_dispatch_queue_timeout',
2033*61046927SAndroid Build Coastguard Worker      prefix : '#include <wayland-client.h>',
2034*61046927SAndroid Build Coastguard Worker      dependencies: dep_wayland_client)
2035*61046927SAndroid Build Coastguard Worker    pre_args += ['-DHAVE_WL_DISPATCH_QUEUE_TIMEOUT']
2036*61046927SAndroid Build Coastguard Worker  endif
2037*61046927SAndroid Build Coastguard Worker  if cc.has_function(
2038*61046927SAndroid Build Coastguard Worker      'wl_display_create_queue_with_name',
2039*61046927SAndroid Build Coastguard Worker      prefix : '#include <wayland-client.h>',
2040*61046927SAndroid Build Coastguard Worker      dependencies: dep_wayland_client)
2041*61046927SAndroid Build Coastguard Worker    pre_args += ['-DHAVE_WL_CREATE_QUEUE_WITH_NAME']
2042*61046927SAndroid Build Coastguard Worker  endif
2043*61046927SAndroid Build Coastguard Workerendif
2044*61046927SAndroid Build Coastguard Worker
2045*61046927SAndroid Build Coastguard Workerdep_x11 = null_dep
2046*61046927SAndroid Build Coastguard Workerdep_xext = null_dep
2047*61046927SAndroid Build Coastguard Workerdep_xfixes = null_dep
2048*61046927SAndroid Build Coastguard Workerdep_x11_xcb = null_dep
2049*61046927SAndroid Build Coastguard Workerdep_xcb = null_dep
2050*61046927SAndroid Build Coastguard Workerdep_xcb_keysyms = null_dep
2051*61046927SAndroid Build Coastguard Workerdep_xcb_glx = null_dep
2052*61046927SAndroid Build Coastguard Workerdep_xcb_dri2 = null_dep
2053*61046927SAndroid Build Coastguard Workerdep_xcb_dri3 = null_dep
2054*61046927SAndroid Build Coastguard Workerdep_dri2proto = null_dep
2055*61046927SAndroid Build Coastguard Workerdep_glproto = null_dep
2056*61046927SAndroid Build Coastguard Workerdep_xxf86vm = null_dep
2057*61046927SAndroid Build Coastguard Workerdep_xcb_dri3 = null_dep
2058*61046927SAndroid Build Coastguard Workerdep_xcb_present = null_dep
2059*61046927SAndroid Build Coastguard Workerdep_xcb_sync = null_dep
2060*61046927SAndroid Build Coastguard Workerdep_xcb_xfixes = null_dep
2061*61046927SAndroid Build Coastguard Workerdep_xshmfence = null_dep
2062*61046927SAndroid Build Coastguard Workerdep_xcb_xrandr = null_dep
2063*61046927SAndroid Build Coastguard Workerdep_xcb_shm = null_dep
2064*61046927SAndroid Build Coastguard Workerdep_xlib_xrandr = null_dep
2065*61046927SAndroid Build Coastguard Workerdep_openmp = null_dep
2066*61046927SAndroid Build Coastguard Worker
2067*61046927SAndroid Build Coastguard Worker# Even if we find OpenMP, Gitlab CI fails to link with gcc/i386 and clang/anyarch.
2068*61046927SAndroid Build Coastguard Workerif host_machine.cpu_family() == 'x86_64' and cc.get_id() == 'gcc'
2069*61046927SAndroid Build Coastguard Worker  dep_openmp = dependency('openmp', required : false)
2070*61046927SAndroid Build Coastguard Worker  if dep_openmp.found()
2071*61046927SAndroid Build Coastguard Worker    pre_args += ['-DHAVE_OPENMP']
2072*61046927SAndroid Build Coastguard Worker  endif
2073*61046927SAndroid Build Coastguard Workerendif
2074*61046927SAndroid Build Coastguard Worker
2075*61046927SAndroid Build Coastguard Workerwith_dri3_explicit_sync = false
2076*61046927SAndroid Build Coastguard Workerwith_xcb_keysyms = false
2077*61046927SAndroid Build Coastguard Workerif with_platform_x11
2078*61046927SAndroid Build Coastguard Worker  dep_xcb = dependency('xcb')
2079*61046927SAndroid Build Coastguard Worker  dep_xcb_xrandr = dependency('xcb-randr')
2080*61046927SAndroid Build Coastguard Worker  if with_glx == 'xlib'
2081*61046927SAndroid Build Coastguard Worker    dep_x11 = dependency('x11')
2082*61046927SAndroid Build Coastguard Worker    dep_xext = dependency('xext')
2083*61046927SAndroid Build Coastguard Worker  elif with_glx == 'dri'
2084*61046927SAndroid Build Coastguard Worker    dep_x11 = dependency('x11')
2085*61046927SAndroid Build Coastguard Worker    dep_xext = dependency('xext')
2086*61046927SAndroid Build Coastguard Worker    dep_xfixes = dependency('xfixes', version : '>= 2.0')
2087*61046927SAndroid Build Coastguard Worker    dep_xcb_glx = dependency('xcb-glx', version : '>= 1.8.1')
2088*61046927SAndroid Build Coastguard Worker    dep_xcb_shm = dependency('xcb-shm')
2089*61046927SAndroid Build Coastguard Worker  elif with_gallium_rusticl
2090*61046927SAndroid Build Coastguard Worker    # needed for GL sharing extension
2091*61046927SAndroid Build Coastguard Worker    dep_x11 = dependency('x11')
2092*61046927SAndroid Build Coastguard Worker  endif
2093*61046927SAndroid Build Coastguard Worker  if (with_any_vk or with_glx == 'dri' or with_egl or
2094*61046927SAndroid Build Coastguard Worker       (with_gallium_vdpau or with_gallium_va))
2095*61046927SAndroid Build Coastguard Worker    dep_xcb = dependency('xcb')
2096*61046927SAndroid Build Coastguard Worker    dep_xcb_keysyms = dependency('xcb-keysyms', required : false)
2097*61046927SAndroid Build Coastguard Worker    with_xcb_keysyms = dep_xcb_keysyms.found()
2098*61046927SAndroid Build Coastguard Worker    if with_xcb_keysyms
2099*61046927SAndroid Build Coastguard Worker      pre_args += '-DXCB_KEYSYMS_AVAILABLE'
2100*61046927SAndroid Build Coastguard Worker    endif
2101*61046927SAndroid Build Coastguard Worker    dep_x11_xcb = dependency('x11-xcb')
2102*61046927SAndroid Build Coastguard Worker    dep_xcb_dri2 = dependency('xcb-dri2', version : '>= 1.8', required : with_x11_dri2)
2103*61046927SAndroid Build Coastguard Worker    if with_dri_platform == 'drm' and not dep_libdrm.found()
2104*61046927SAndroid Build Coastguard Worker      error('libdrm required for gallium video statetrackers when using x11')
2105*61046927SAndroid Build Coastguard Worker    endif
2106*61046927SAndroid Build Coastguard Worker  endif
2107*61046927SAndroid Build Coastguard Worker  if with_dri_platform == 'drm'
2108*61046927SAndroid Build Coastguard Worker    dep_xcb_dri2 = dependency('xcb-dri2', version : '>= 1.8', required : with_x11_dri2)
2109*61046927SAndroid Build Coastguard Worker
2110*61046927SAndroid Build Coastguard Worker    dep_xcb_dri3 = dependency('xcb-dri3', version : '>= 1.13')
2111*61046927SAndroid Build Coastguard Worker    dep_xcb_present = dependency('xcb-present', version : '>= 1.13')
2112*61046927SAndroid Build Coastguard Worker    if (dep_xcb_dri3.version().version_compare('>= 1.17') and
2113*61046927SAndroid Build Coastguard Worker        dep_xcb_present.version().version_compare('>= 1.17'))
2114*61046927SAndroid Build Coastguard Worker      with_dri3_explicit_sync = true
2115*61046927SAndroid Build Coastguard Worker    endif
2116*61046927SAndroid Build Coastguard Worker    dep_xcb_shm = dependency('xcb-shm')
2117*61046927SAndroid Build Coastguard Worker    dep_xcb_sync = dependency('xcb-sync')
2118*61046927SAndroid Build Coastguard Worker    dep_xshmfence = dependency('xshmfence', version : '>= 1.1')
2119*61046927SAndroid Build Coastguard Worker    pre_args += '-DHAVE_X11_DRM'
2120*61046927SAndroid Build Coastguard Worker  endif
2121*61046927SAndroid Build Coastguard Worker  if with_glx == 'dri' or with_glx == 'xlib'
2122*61046927SAndroid Build Coastguard Worker    dep_glproto = dependency('glproto', version : '>= 1.4.14')
2123*61046927SAndroid Build Coastguard Worker  endif
2124*61046927SAndroid Build Coastguard Worker  if with_glx == 'dri'
2125*61046927SAndroid Build Coastguard Worker    if with_dri_platform == 'drm'
2126*61046927SAndroid Build Coastguard Worker      dep_dri2proto = dependency('dri2proto', version : '>= 2.8')
2127*61046927SAndroid Build Coastguard Worker      if with_glx_direct
2128*61046927SAndroid Build Coastguard Worker        dep_xxf86vm = dependency('xxf86vm')
2129*61046927SAndroid Build Coastguard Worker      endif
2130*61046927SAndroid Build Coastguard Worker    endif
2131*61046927SAndroid Build Coastguard Worker  endif
2132*61046927SAndroid Build Coastguard Worker  if (with_egl or
2133*61046927SAndroid Build Coastguard Worker      with_dri or
2134*61046927SAndroid Build Coastguard Worker      with_any_vk or
2135*61046927SAndroid Build Coastguard Worker      with_gallium_vdpau or with_gallium_xa)
2136*61046927SAndroid Build Coastguard Worker    dep_xcb_xfixes = dependency('xcb-xfixes')
2137*61046927SAndroid Build Coastguard Worker  endif
2138*61046927SAndroid Build Coastguard Worker  if with_xlib_lease or with_any_vk
2139*61046927SAndroid Build Coastguard Worker    dep_xcb_xrandr = dependency('xcb-randr')
2140*61046927SAndroid Build Coastguard Worker  endif
2141*61046927SAndroid Build Coastguard Worker  if with_xlib_lease
2142*61046927SAndroid Build Coastguard Worker    dep_xlib_xrandr = dependency('xrandr', version : '>= 1.3')
2143*61046927SAndroid Build Coastguard Worker  endif
2144*61046927SAndroid Build Coastguard Workerendif
2145*61046927SAndroid Build Coastguard Worker
2146*61046927SAndroid Build Coastguard Workerif with_dri
2147*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_DRI'
2148*61046927SAndroid Build Coastguard Workerendif
2149*61046927SAndroid Build Coastguard Workerif with_dri2
2150*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_DRI2'
2151*61046927SAndroid Build Coastguard Workerendif
2152*61046927SAndroid Build Coastguard Workerif with_x11_dri2
2153*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_X11_DRI2'
2154*61046927SAndroid Build Coastguard Workerendif
2155*61046927SAndroid Build Coastguard Workerif with_dri3_explicit_sync
2156*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_DRI3_EXPLICIT_SYNC'
2157*61046927SAndroid Build Coastguard Workerendif
2158*61046927SAndroid Build Coastguard Workerif with_gallium_drisw_kms
2159*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_DRISW_KMS'
2160*61046927SAndroid Build Coastguard Workerendif
2161*61046927SAndroid Build Coastguard Worker
2162*61046927SAndroid Build Coastguard Workerif get_option('gallium-extra-hud')
2163*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_GALLIUM_EXTRA_HUD=1'
2164*61046927SAndroid Build Coastguard Workerendif
2165*61046927SAndroid Build Coastguard Worker
2166*61046927SAndroid Build Coastguard Workerdep_lmsensors = cc.find_library('sensors', required : get_option('lmsensors'))
2167*61046927SAndroid Build Coastguard Workerif dep_lmsensors.found()
2168*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_LIBSENSORS=1'
2169*61046927SAndroid Build Coastguard Workerendif
2170*61046927SAndroid Build Coastguard Worker
2171*61046927SAndroid Build Coastguard Worker_shader_replacement = get_option('custom-shader-replacement')
2172*61046927SAndroid Build Coastguard Workerif _shader_replacement == ''
2173*61046927SAndroid Build Coastguard Workerelse
2174*61046927SAndroid Build Coastguard Worker  pre_args += '-DCUSTOM_SHADER_REPLACEMENT'
2175*61046927SAndroid Build Coastguard Workerendif
2176*61046927SAndroid Build Coastguard Worker
2177*61046927SAndroid Build Coastguard Workerwith_perfetto = get_option('perfetto')
2178*61046927SAndroid Build Coastguard Workerwith_datasources = get_option('datasources')
2179*61046927SAndroid Build Coastguard Workerwith_any_datasource = with_datasources.length() != 0
2180*61046927SAndroid Build Coastguard Workerif with_perfetto
2181*61046927SAndroid Build Coastguard Worker  dep_perfetto = dependency('perfetto', fallback: ['perfetto', 'dep_perfetto'])
2182*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_PERFETTO'
2183*61046927SAndroid Build Coastguard Workerendif
2184*61046927SAndroid Build Coastguard Worker
2185*61046927SAndroid Build Coastguard Workerwith_teflon = get_option('teflon')
2186*61046927SAndroid Build Coastguard Workerif with_teflon and with_tests
2187*61046927SAndroid Build Coastguard Worker  dep_xtensor = dependency('xtensor')
2188*61046927SAndroid Build Coastguard Worker  dep_flatbuffers = dependency('flatbuffers')
2189*61046927SAndroid Build Coastguard Worker  prog_flatc = find_program('flatc')
2190*61046927SAndroid Build Coastguard Workerendif
2191*61046927SAndroid Build Coastguard Worker
2192*61046927SAndroid Build Coastguard Workerwith_gpuvis = get_option('gpuvis')
2193*61046927SAndroid Build Coastguard Workerif with_gpuvis
2194*61046927SAndroid Build Coastguard Worker  pre_args += '-DHAVE_GPUVIS'
2195*61046927SAndroid Build Coastguard Workerendif
2196*61046927SAndroid Build Coastguard Worker
2197*61046927SAndroid Build Coastguard Workeradd_project_arguments(pre_args, language : ['c', 'cpp'])
2198*61046927SAndroid Build Coastguard Workeradd_project_arguments(c_cpp_args, language : ['c', 'cpp'])
2199*61046927SAndroid Build Coastguard Worker
2200*61046927SAndroid Build Coastguard Workeradd_project_arguments(c_args,   language : ['c'])
2201*61046927SAndroid Build Coastguard Workeradd_project_arguments(cpp_args, language : ['cpp'])
2202*61046927SAndroid Build Coastguard Worker
2203*61046927SAndroid Build Coastguard Workergl_priv_reqs = []
2204*61046927SAndroid Build Coastguard Worker
2205*61046927SAndroid Build Coastguard Workerif with_glx == 'xlib'
2206*61046927SAndroid Build Coastguard Worker  gl_priv_reqs += ['x11', 'xext', 'xcb']
2207*61046927SAndroid Build Coastguard Workerelif with_glx == 'dri'
2208*61046927SAndroid Build Coastguard Worker  gl_priv_reqs += [
2209*61046927SAndroid Build Coastguard Worker    'x11', 'xext', 'xfixes', 'x11-xcb', 'xcb',
2210*61046927SAndroid Build Coastguard Worker    'xcb-glx >= 1.8.1']
2211*61046927SAndroid Build Coastguard Worker  if with_dri_platform == 'drm'
2212*61046927SAndroid Build Coastguard Worker    gl_priv_reqs += 'xcb-dri2 >= 1.8'
2213*61046927SAndroid Build Coastguard Worker    if with_glx_direct
2214*61046927SAndroid Build Coastguard Worker      gl_priv_reqs += 'xxf86vm'
2215*61046927SAndroid Build Coastguard Worker    endif
2216*61046927SAndroid Build Coastguard Worker  endif
2217*61046927SAndroid Build Coastguard Workerendif
2218*61046927SAndroid Build Coastguard Workerif dep_libdrm.found()
2219*61046927SAndroid Build Coastguard Worker  gl_priv_reqs += 'libdrm >= 2.4.75'
2220*61046927SAndroid Build Coastguard Workerendif
2221*61046927SAndroid Build Coastguard Worker
2222*61046927SAndroid Build Coastguard Workergl_priv_libs = []
2223*61046927SAndroid Build Coastguard Workerif dep_thread.found()
2224*61046927SAndroid Build Coastguard Worker  gl_priv_libs += ['-lpthread', '-pthread']
2225*61046927SAndroid Build Coastguard Workerendif
2226*61046927SAndroid Build Coastguard Workerif dep_m.found()
2227*61046927SAndroid Build Coastguard Worker  gl_priv_libs += '-lm'
2228*61046927SAndroid Build Coastguard Workerendif
2229*61046927SAndroid Build Coastguard Workerif dep_dl.found()
2230*61046927SAndroid Build Coastguard Worker  gl_priv_libs += '-ldl'
2231*61046927SAndroid Build Coastguard Workerendif
2232*61046927SAndroid Build Coastguard Worker
2233*61046927SAndroid Build Coastguard Worker# FIXME: autotools lists this as incomplete
2234*61046927SAndroid Build Coastguard Workergbm_priv_libs = []
2235*61046927SAndroid Build Coastguard Workerif dep_dl.found()
2236*61046927SAndroid Build Coastguard Worker  gbm_priv_libs += '-ldl'
2237*61046927SAndroid Build Coastguard Workerendif
2238*61046927SAndroid Build Coastguard Worker
2239*61046927SAndroid Build Coastguard Workerpkg = import('pkgconfig')
2240*61046927SAndroid Build Coastguard Worker
2241*61046927SAndroid Build Coastguard Workerif host_machine.system() == 'windows'
2242*61046927SAndroid Build Coastguard Worker  prog_dumpbin = find_program('dumpbin', required : false)
2243*61046927SAndroid Build Coastguard Worker  with_symbols_check = prog_dumpbin.found() and with_tests
2244*61046927SAndroid Build Coastguard Worker  if with_symbols_check
2245*61046927SAndroid Build Coastguard Worker    symbols_check_args = ['--dumpbin', prog_dumpbin.full_path()]
2246*61046927SAndroid Build Coastguard Worker  endif
2247*61046927SAndroid Build Coastguard Workerelse
2248*61046927SAndroid Build Coastguard Worker  prog_nm = find_program('nm')
2249*61046927SAndroid Build Coastguard Worker  with_symbols_check = with_tests
2250*61046927SAndroid Build Coastguard Worker  symbols_check_args = ['--nm', prog_nm.full_path()]
2251*61046927SAndroid Build Coastguard Workerendif
2252*61046927SAndroid Build Coastguard Worker
2253*61046927SAndroid Build Coastguard Worker# This quirk needs to be applied to sources with functions defined in assembly
2254*61046927SAndroid Build Coastguard Worker# as GCC LTO drops them. See: https://bugs.freedesktop.org/show_bug.cgi?id=109391
2255*61046927SAndroid Build Coastguard Workergcc_lto_quirk = (cc.get_id() == 'gcc') ? ['-fno-lto'] : []
2256*61046927SAndroid Build Coastguard Worker
2257*61046927SAndroid Build Coastguard Workerdevenv = environment()
2258*61046927SAndroid Build Coastguard Worker
2259*61046927SAndroid Build Coastguard Workerdir_compiler_nir = join_paths(meson.current_source_dir(), 'src/compiler/nir/')
2260*61046927SAndroid Build Coastguard Workerdir_source_root = meson.project_source_root()
2261*61046927SAndroid Build Coastguard Worker
2262*61046927SAndroid Build Coastguard Worker
2263*61046927SAndroid Build Coastguard Workersubdir('include')
2264*61046927SAndroid Build Coastguard Workersubdir('bin')
2265*61046927SAndroid Build Coastguard Workersubdir('src')
2266*61046927SAndroid Build Coastguard Worker
2267*61046927SAndroid Build Coastguard Workermeson.add_devenv(devenv)
2268*61046927SAndroid Build Coastguard Worker
2269*61046927SAndroid Build Coastguard Workersphinx = find_program('sphinx-build', version : '>= 4.3',
2270*61046927SAndroid Build Coastguard Worker                      required: get_option('html-docs'))
2271*61046927SAndroid Build Coastguard Workerif sphinx.found()
2272*61046927SAndroid Build Coastguard Worker  subdir('docs')
2273*61046927SAndroid Build Coastguard Workerendif
2274*61046927SAndroid Build Coastguard Worker
2275*61046927SAndroid Build Coastguard Workersummary(
2276*61046927SAndroid Build Coastguard Worker  {
2277*61046927SAndroid Build Coastguard Worker    'prefix': get_option('prefix'),
2278*61046927SAndroid Build Coastguard Worker    'libdir': get_option('libdir'),
2279*61046927SAndroid Build Coastguard Worker    'includedir': get_option('includedir'),
2280*61046927SAndroid Build Coastguard Worker  },
2281*61046927SAndroid Build Coastguard Worker  section: 'Directories'
2282*61046927SAndroid Build Coastguard Worker)
2283*61046927SAndroid Build Coastguard Worker
2284*61046927SAndroid Build Coastguard Workersummary(
2285*61046927SAndroid Build Coastguard Worker  {
2286*61046927SAndroid Build Coastguard Worker    'c_cpp_args': c_cpp_args,
2287*61046927SAndroid Build Coastguard Worker  },
2288*61046927SAndroid Build Coastguard Worker  section: 'Common C and C++ arguments'
2289*61046927SAndroid Build Coastguard Worker)
2290*61046927SAndroid Build Coastguard Worker
2291*61046927SAndroid Build Coastguard Workersummary(
2292*61046927SAndroid Build Coastguard Worker  {
2293*61046927SAndroid Build Coastguard Worker    'OpenGL': with_opengl,
2294*61046927SAndroid Build Coastguard Worker    'ES1': with_gles1,
2295*61046927SAndroid Build Coastguard Worker    'ES2': with_gles2,
2296*61046927SAndroid Build Coastguard Worker    'Shared glapi': with_shared_glapi,
2297*61046927SAndroid Build Coastguard Worker    'GLVND': with_glvnd,
2298*61046927SAndroid Build Coastguard Worker  },
2299*61046927SAndroid Build Coastguard Worker  section: 'OpenGL', bool_yn: true
2300*61046927SAndroid Build Coastguard Worker)
2301*61046927SAndroid Build Coastguard Worker
2302*61046927SAndroid Build Coastguard Workersummary(
2303*61046927SAndroid Build Coastguard Worker  {
2304*61046927SAndroid Build Coastguard Worker    'Platform': with_dri_platform,
2305*61046927SAndroid Build Coastguard Worker    'Driver dir': dri_drivers_path,
2306*61046927SAndroid Build Coastguard Worker  },
2307*61046927SAndroid Build Coastguard Worker  section: 'DRI', bool_yn: true, list_sep: ' '
2308*61046927SAndroid Build Coastguard Worker)
2309*61046927SAndroid Build Coastguard Worker
2310*61046927SAndroid Build Coastguard Workersummary(
2311*61046927SAndroid Build Coastguard Worker  {
2312*61046927SAndroid Build Coastguard Worker    'Enabled': with_glx != 'disabled',
2313*61046927SAndroid Build Coastguard Worker    'Provider': with_glx == 'disabled' ? 'None' : with_glx
2314*61046927SAndroid Build Coastguard Worker  },
2315*61046927SAndroid Build Coastguard Worker  section: 'GLX', bool_yn: true, list_sep: ' '
2316*61046927SAndroid Build Coastguard Worker)
2317*61046927SAndroid Build Coastguard Worker
2318*61046927SAndroid Build Coastguard Workeregl_summary = {'Enabled': with_egl}
2319*61046927SAndroid Build Coastguard Workerif with_egl
2320*61046927SAndroid Build Coastguard Worker  egl_drivers = []
2321*61046927SAndroid Build Coastguard Worker  if with_dri
2322*61046927SAndroid Build Coastguard Worker    egl_drivers += 'builtin:egl_dri2'
2323*61046927SAndroid Build Coastguard Worker  endif
2324*61046927SAndroid Build Coastguard Worker  if with_dri_platform == 'drm'
2325*61046927SAndroid Build Coastguard Worker    egl_drivers += 'builtin:egl_dri3'
2326*61046927SAndroid Build Coastguard Worker  endif
2327*61046927SAndroid Build Coastguard Worker  if with_platform_windows
2328*61046927SAndroid Build Coastguard Worker    egl_drivers += 'builtin:wgl'
2329*61046927SAndroid Build Coastguard Worker  endif
2330*61046927SAndroid Build Coastguard Worker  egl_summary += {'Drivers': egl_drivers}
2331*61046927SAndroid Build Coastguard Worker  egl_summary += {'Platforms': _platforms}
2332*61046927SAndroid Build Coastguard Workerendif
2333*61046927SAndroid Build Coastguard Workersummary(egl_summary, section: 'EGL', bool_yn: true, list_sep: ' ')
2334*61046927SAndroid Build Coastguard Worker
2335*61046927SAndroid Build Coastguard Workergbm_summary = {'Enabled': with_gbm}
2336*61046927SAndroid Build Coastguard Workerif with_gbm
2337*61046927SAndroid Build Coastguard Worker  gbm_summary += {'Backends path': gbm_backends_path}
2338*61046927SAndroid Build Coastguard Workerendif
2339*61046927SAndroid Build Coastguard Workersummary(gbm_summary, section: 'GBM', bool_yn: true, list_sep: ' ')
2340*61046927SAndroid Build Coastguard Worker
2341*61046927SAndroid Build Coastguard Workervulkan_summary = {'Drivers': _vulkan_drivers.length() != 0 ? _vulkan_drivers : false }
2342*61046927SAndroid Build Coastguard Workerif with_any_vk
2343*61046927SAndroid Build Coastguard Worker  vulkan_summary += {'Platforms': _platforms}
2344*61046927SAndroid Build Coastguard Worker  vulkan_summary += {'ICD dir': with_vulkan_icd_dir}
2345*61046927SAndroid Build Coastguard Worker  if with_any_vulkan_layers
2346*61046927SAndroid Build Coastguard Worker    vulkan_summary += {'Layers': get_option('vulkan-layers')}
2347*61046927SAndroid Build Coastguard Worker  endif
2348*61046927SAndroid Build Coastguard Worker  vulkan_summary += {'Intel Ray tracing': with_intel_vk_rt}
2349*61046927SAndroid Build Coastguard Workerendif
2350*61046927SAndroid Build Coastguard Workersummary(vulkan_summary, section: 'Vulkan', bool_yn: true, list_sep: ' ')
2351*61046927SAndroid Build Coastguard Worker
2352*61046927SAndroid Build Coastguard Workervideo_summary = {'Codecs': _codecs.length() != 0 ? _codecs : false}
2353*61046927SAndroid Build Coastguard Workervideo_apis = []
2354*61046927SAndroid Build Coastguard Workerif with_gallium_vdpau
2355*61046927SAndroid Build Coastguard Worker  video_apis += 'vdpau'
2356*61046927SAndroid Build Coastguard Workerendif
2357*61046927SAndroid Build Coastguard Workerif with_gallium_va
2358*61046927SAndroid Build Coastguard Worker  video_apis += 'va'
2359*61046927SAndroid Build Coastguard Workerendif
2360*61046927SAndroid Build Coastguard Workerif with_any_vk
2361*61046927SAndroid Build Coastguard Worker  video_apis += 'vulkan'
2362*61046927SAndroid Build Coastguard Workerendif
2363*61046927SAndroid Build Coastguard Workerif with_gallium_xa
2364*61046927SAndroid Build Coastguard Worker  video_apis += 'xa'
2365*61046927SAndroid Build Coastguard Workerendif
2366*61046927SAndroid Build Coastguard Workervideo_summary += {'APIs': video_apis.length() != 0 ? video_apis : false}
2367*61046927SAndroid Build Coastguard Workersummary(video_summary, section: 'Video', bool_yn: true, list_sep: ' ')
2368*61046927SAndroid Build Coastguard Worker
2369*61046927SAndroid Build Coastguard Workerllvm_summary = {'Enabled': with_llvm}
2370*61046927SAndroid Build Coastguard Workerif with_llvm
2371*61046927SAndroid Build Coastguard Worker  llvm_summary += {'Version': dep_llvm.version()}
2372*61046927SAndroid Build Coastguard Workerendif
2373*61046927SAndroid Build Coastguard Workersummary(llvm_summary, section: 'LLVM', bool_yn: true, list_sep: ' ')
2374*61046927SAndroid Build Coastguard Worker
2375*61046927SAndroid Build Coastguard Workergallium_summary = {'Enabled': with_gallium}
2376*61046927SAndroid Build Coastguard Workerif with_gallium
2377*61046927SAndroid Build Coastguard Worker  gallium_summary += {'Drivers': gallium_drivers}
2378*61046927SAndroid Build Coastguard Worker  gallium_summary += {'Platforms': _platforms}
2379*61046927SAndroid Build Coastguard Worker
2380*61046927SAndroid Build Coastguard Worker  gallium_frontends = ['mesa']
2381*61046927SAndroid Build Coastguard Worker  if with_gallium_xa
2382*61046927SAndroid Build Coastguard Worker    gallium_frontends += 'xa'
2383*61046927SAndroid Build Coastguard Worker  endif
2384*61046927SAndroid Build Coastguard Worker  if with_gallium_vdpau
2385*61046927SAndroid Build Coastguard Worker    gallium_frontends += 'vdpau'
2386*61046927SAndroid Build Coastguard Worker  endif
2387*61046927SAndroid Build Coastguard Worker  if with_gallium_va
2388*61046927SAndroid Build Coastguard Worker    gallium_frontends += 'va'
2389*61046927SAndroid Build Coastguard Worker  endif
2390*61046927SAndroid Build Coastguard Worker  if with_gallium_st_nine
2391*61046927SAndroid Build Coastguard Worker    gallium_frontends += 'nine'
2392*61046927SAndroid Build Coastguard Worker  endif
2393*61046927SAndroid Build Coastguard Worker  if with_gallium_clover
2394*61046927SAndroid Build Coastguard Worker    gallium_frontends += 'clover'
2395*61046927SAndroid Build Coastguard Worker  endif
2396*61046927SAndroid Build Coastguard Worker  if with_gallium_rusticl
2397*61046927SAndroid Build Coastguard Worker    gallium_frontends += 'rusticl'
2398*61046927SAndroid Build Coastguard Worker  endif
2399*61046927SAndroid Build Coastguard Worker  gallium_summary += {'Frontends': gallium_frontends}
2400*61046927SAndroid Build Coastguard Worker  gallium_summary += {'Off-screen rendering (OSMesa)': with_osmesa ? 'lib' + osmesa_lib_name : false}
2401*61046927SAndroid Build Coastguard Worker  gallium_summary += {'HUD lm-sensors': dep_lmsensors.found()}
2402*61046927SAndroid Build Coastguard Workerendif
2403*61046927SAndroid Build Coastguard Workersummary(gallium_summary, section: 'Gallium', bool_yn: true, list_sep: ' ')
2404*61046927SAndroid Build Coastguard Worker
2405*61046927SAndroid Build Coastguard Workerperfetto_summary = {'Enabled': with_perfetto}
2406*61046927SAndroid Build Coastguard Workerif with_perfetto and with_any_datasource
2407*61046927SAndroid Build Coastguard Worker  perfetto_summary += {'Data source': with_datasources}
2408*61046927SAndroid Build Coastguard Workerendif
2409*61046927SAndroid Build Coastguard Workersummary(perfetto_summary, section: 'Perfetto', bool_yn: true, list_sep: ' ')
2410*61046927SAndroid Build Coastguard Worker
2411*61046927SAndroid Build Coastguard Workerteflon_summary = {'Enabled': with_teflon}
2412*61046927SAndroid Build Coastguard Workersummary(teflon_summary, section: 'Teflon (TensorFlow Lite delegate)', bool_yn: true, list_sep: ' ')
2413