1# Copyright © 2017-2020 Intel Corporation 2 3# Permission is hereby granted, free of charge, to any person obtaining a copy 4# of this software and associated documentation files (the "Software"), to deal 5# in the Software without restriction, including without limitation the rights 6# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7# copies of the Software, and to permit persons to whom the Software is 8# furnished to do so, subject to the following conditions: 9 10# The above copyright notice and this permission notice shall be included in 11# all copies or substantial portions of the Software. 12 13# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19# SOFTWARE. 20 21project( 22 'mesa', 23 ['c', 'cpp'], 24 version : run_command( 25 [find_program('python', 'python3'), 'bin/meson_get_version.py'] 26 ).stdout(), 27 license : 'MIT', 28 meson_version : '>= 0.52', 29 default_options : ['buildtype=debugoptimized', 'b_ndebug=if-release', 'c_std=c99', 'cpp_std=c++14'] 30) 31 32cc = meson.get_compiler('c') 33cpp = meson.get_compiler('cpp') 34 35null_dep = dependency('', required : false) 36 37if get_option('layout') != 'mirror' 38 error('`mirror` is the only build directory layout supported') 39endif 40 41# Arguments for the preprocessor, put these in a separate array from the C and 42# C++ (cpp in meson terminology) arguments since they need to be added to the 43# default arguments for both C and C++. 44pre_args = [ 45 '-D__STDC_CONSTANT_MACROS', 46 '-D__STDC_FORMAT_MACROS', 47 '-D__STDC_LIMIT_MACROS', 48 '-DPACKAGE_VERSION="@0@"'.format(meson.project_version()), 49 '-DPACKAGE_BUGREPORT="https://gitlab.freedesktop.org/mesa/mesa/-/issues"', 50] 51 52with_vulkan_icd_dir = get_option('vulkan-icd-dir') 53with_tests = get_option('build-tests') 54with_aco_tests = get_option('build-aco-tests') 55with_glx_read_only_text = get_option('glx-read-only-text') 56with_glx_direct = get_option('glx-direct') 57with_osmesa = get_option('osmesa') 58with_swr_arches = get_option('swr-arches') 59with_vulkan_overlay_layer = get_option('vulkan-overlay-layer') 60with_tools = get_option('tools') 61if with_tools.contains('all') 62 with_tools = [ 63 'drm-shim', 64 'etnaviv', 65 'freedreno', 66 'glsl', 67 'intel', 68 'intel-ui', 69 'lima', 70 'nir', 71 'nouveau', 72 'xvmc', 73 ] 74endif 75with_clc = false 76 77with_intel_tools = with_tools.contains('intel') or with_tools.contains('intel-ui') 78with_imgui = with_intel_tools or with_vulkan_overlay_layer 79 80dri_drivers_path = get_option('dri-drivers-path') 81if dri_drivers_path == '' 82 dri_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'dri') 83endif 84dri_search_path = get_option('dri-search-path') 85if dri_search_path == '' 86 dri_search_path = dri_drivers_path 87endif 88 89with_gles1 = get_option('gles1') 90if with_gles1 == 'true' 91 with_gles1 = 'enabled' 92 warning('gles1 option "true" deprecated, please use "enabled" instead.') 93elif with_gles1 == 'false' 94 with_gles1 = 'disabled' 95 warning('gles1 option "false" deprecated, please use "disabled" instead.') 96endif 97with_gles2 = get_option('gles2') 98if with_gles2 == 'true' 99 with_gles2 = 'enabled' 100 warning('gles2 option "true" deprecated, please use "enabled" instead.') 101elif with_gles2 == 'false' 102 with_gles2 = 'disabled' 103 warning('gles2 option "false" deprecated, please use "disabled" instead.') 104endif 105if host_machine.system() == 'windows' 106 if with_gles1 == 'auto' 107 with_gles1 = 'disabled' 108 endif 109 if with_gles2 == 'auto' 110 with_gles2 = 'disabled' 111 endif 112endif 113with_opengl = get_option('opengl') 114 115# Default shared glapi off for windows, on elsewhere. 116_sg = get_option('shared-glapi') 117if _sg == 'true' 118 _sg = 'enabled' 119 warning('shared-glapi option "true" deprecated, please use "enabled" instead.') 120elif _sg == 'false' 121 _sg = 'disabled' 122 warning('shared-glapi option "false" deprecated, please use "disabled" instead.') 123endif 124if _sg == 'auto' 125 with_shared_glapi = host_machine.system() != 'windows' 126else 127 with_shared_glapi = _sg == 'enabled' 128endif 129 130# shared-glapi is required if at least two OpenGL APIs are being built 131if not with_shared_glapi 132 if ((with_gles1 == 'enabled' and with_gles2 == 'enabled') or 133 (with_gles1 == 'enabled' and with_opengl) or 134 (with_gles2 == 'enabled' and with_opengl)) 135 error('shared-glapi required for building two or more of OpenGL, OpenGL ES 1.x, OpenGL ES 2.x') 136 endif 137 with_gles1 = 'disabled' 138 with_gles2 = 'disabled' 139endif 140 141# We require OpenGL for OpenGL ES 142if not with_opengl 143 if (with_gles1 == 'enabled' or with_gles2 == 'enabled') and not with_opengl 144 error('building OpenGL ES without OpenGL is not supported.') 145 endif 146 with_gles1 = 'disabled' 147 with_gles2 = 'disabled' 148endif 149 150with_gles1 = with_gles1 != 'disabled' 151with_gles2 = with_gles2 != 'disabled' 152with_any_opengl = with_opengl or with_gles1 or with_gles2 153# Only build shared_glapi if at least one OpenGL API is enabled 154with_shared_glapi = with_shared_glapi and with_any_opengl 155 156system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'gnu/kfreebsd', 'dragonfly', 'linux', 'sunos'].contains(host_machine.system()) 157 158dri_drivers = get_option('dri-drivers') 159if dri_drivers.contains('auto') 160 if system_has_kms_drm 161 # TODO: PPC, Sparc 162 if ['x86', 'x86_64'].contains(host_machine.cpu_family()) 163 dri_drivers = ['i915', 'i965', 'r100', 'r200', 'nouveau'] 164 elif ['arm', 'aarch64'].contains(host_machine.cpu_family()) 165 dri_drivers = [] 166 elif ['mips', 'mips64'].contains(host_machine.cpu_family()) 167 dri_drivers = ['r100', 'r200', 'nouveau'] 168 else 169 error('Unknown architecture @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format( 170 host_machine.cpu_family())) 171 endif 172 elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system()) 173 # only swrast would make sense here, but gallium swrast is a much better default 174 dri_drivers = [] 175 else 176 error('Unknown OS @0@. Please pass -Ddri-drivers to set driver options. Patches gladly accepted to fix this.'.format( 177 host_machine.system())) 178 endif 179endif 180 181with_dri_i915 = dri_drivers.contains('i915') 182with_dri_i965 = dri_drivers.contains('i965') 183with_dri_r100 = dri_drivers.contains('r100') 184with_dri_r200 = dri_drivers.contains('r200') 185with_dri_nouveau = dri_drivers.contains('nouveau') 186with_dri_swrast = dri_drivers.contains('swrast') 187 188with_dri = dri_drivers.length() != 0 189 190gallium_drivers = get_option('gallium-drivers') 191if gallium_drivers.contains('auto') 192 if system_has_kms_drm 193 # TODO: PPC, Sparc 194 if ['x86', 'x86_64'].contains(host_machine.cpu_family()) 195 gallium_drivers = [ 196 'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'svga', 'swrast', 197 'iris' 198 ] 199 elif ['arm', 'aarch64'].contains(host_machine.cpu_family()) 200 gallium_drivers = [ 201 'kmsro', 'v3d', 'vc4', 'freedreno', 'etnaviv', 'nouveau', 202 'tegra', 'virgl', 'lima', 'panfrost', 'swrast' 203 ] 204 elif ['mips', 'mips64'].contains(host_machine.cpu_family()) 205 gallium_drivers = [ 206 'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'swrast' 207 ] 208 else 209 error('Unknown architecture @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format( 210 host_machine.cpu_family())) 211 endif 212 elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system()) 213 gallium_drivers = ['swrast'] 214 else 215 error('Unknown OS @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format( 216 host_machine.system())) 217 endif 218endif 219with_gallium_kmsro = gallium_drivers.contains('kmsro') 220with_gallium_radeonsi = gallium_drivers.contains('radeonsi') 221with_gallium_r300 = gallium_drivers.contains('r300') 222with_gallium_r600 = gallium_drivers.contains('r600') 223with_gallium_nouveau = gallium_drivers.contains('nouveau') 224with_gallium_freedreno = gallium_drivers.contains('freedreno') 225with_gallium_softpipe = gallium_drivers.contains('swrast') 226with_gallium_vc4 = gallium_drivers.contains('vc4') 227with_gallium_v3d = gallium_drivers.contains('v3d') 228with_gallium_panfrost = gallium_drivers.contains('panfrost') 229with_gallium_etnaviv = gallium_drivers.contains('etnaviv') 230with_gallium_tegra = gallium_drivers.contains('tegra') 231with_gallium_iris = gallium_drivers.contains('iris') 232with_gallium_i915 = gallium_drivers.contains('i915') 233with_gallium_svga = gallium_drivers.contains('svga') 234with_gallium_virgl = gallium_drivers.contains('virgl') 235with_gallium_swr = gallium_drivers.contains('swr') 236with_gallium_lima = gallium_drivers.contains('lima') 237with_gallium_zink = gallium_drivers.contains('zink') 238 239with_gallium = gallium_drivers.length() != 0 240 241if with_gallium and system_has_kms_drm 242 _glx = get_option('glx') 243 _egl = get_option('egl') 244 if _glx == 'dri' or _egl == 'enabled' or (_glx == 'disabled' and _egl != 'disabled') 245 with_dri = true 246 endif 247endif 248 249_vulkan_drivers = get_option('vulkan-drivers') 250if _vulkan_drivers.contains('auto') 251 if system_has_kms_drm 252 if host_machine.cpu_family().startswith('x86') 253 _vulkan_drivers = ['amd', 'intel', 'swrast'] 254 elif ['arm', 'aarch64'].contains(host_machine.cpu_family()) 255 _vulkan_drivers = ['swrast'] 256 elif ['mips', 'mips64'].contains(host_machine.cpu_family()) 257 _vulkan_drivers = ['amd', 'swrast'] 258 else 259 error('Unknown architecture @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format( 260 host_machine.cpu_family())) 261 endif 262 elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system()) 263 # No vulkan driver supports windows or macOS currently 264 _vulkan_drivers = [] 265 else 266 error('Unknown OS @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format( 267 host_machine.system())) 268 endif 269endif 270 271with_intel_vk = _vulkan_drivers.contains('intel') 272with_amd_vk = _vulkan_drivers.contains('amd') 273with_freedreno_vk = _vulkan_drivers.contains('freedreno') 274with_swrast_vk = _vulkan_drivers.contains('swrast') 275with_freedreno_kgsl = get_option('freedreno-kgsl') 276with_broadcom_vk = _vulkan_drivers.contains('broadcom') 277with_any_vk = _vulkan_drivers.length() != 0 278 279with_any_broadcom = with_gallium_vc4 or with_gallium_v3d or with_broadcom_vk 280with_any_intel = with_dri_i965 or with_intel_vk or with_gallium_iris 281 282if with_swrast_vk and not with_gallium_softpipe 283 error('swrast vulkan requires gallium swrast') 284endif 285if with_dri_swrast and (with_gallium_softpipe or with_gallium_swr) 286 error('Only one swrast provider can be built') 287endif 288if with_dri_i915 and with_gallium_i915 289 error('Only one i915 provider can be built') 290endif 291if with_gallium_kmsro and not (with_gallium_v3d or with_gallium_vc4 or with_gallium_etnaviv or with_gallium_freedreno or with_gallium_panfrost or with_gallium_lima) 292 error('kmsro driver requires one or more renderonly drivers (vc4, etnaviv, freedreno, panfrost, lima)') 293endif 294if with_gallium_tegra and not with_gallium_nouveau 295 error('tegra driver requires nouveau driver') 296endif 297if with_aco_tests and not with_amd_vk 298 error('ACO tests require Radv') 299endif 300 301if host_machine.system() == 'darwin' 302 with_dri_platform = 'apple' 303 pre_args += '-DBUILDING_MESA' 304elif ['windows', 'cygwin'].contains(host_machine.system()) 305 with_dri_platform = 'windows' 306elif system_has_kms_drm 307 with_dri_platform = 'drm' 308else 309 # FIXME: haiku doesn't use dri, and xlib doesn't use dri, probably should 310 # assert here that one of those cases has been met. 311 # FIXME: illumos ends up here as well 312 with_dri_platform = 'none' 313endif 314 315_platforms = get_option('platforms') 316if _platforms.contains('auto') 317 if system_has_kms_drm 318 _platforms = ['x11', 'wayland'] 319 elif ['darwin', 'cygwin'].contains(host_machine.system()) 320 _platforms = ['x11'] 321 elif ['haiku'].contains(host_machine.system()) 322 _platforms = ['haiku'] 323 elif host_machine.system() == 'windows' 324 _platforms = ['windows'] 325 else 326 error('Unknown OS @0@. Please pass -Dplatforms to set platforms. Patches gladly accepted to fix this.'.format( 327 host_machine.system())) 328 endif 329endif 330 331with_platform_android = _platforms.contains('android') 332with_platform_x11 = _platforms.contains('x11') 333with_platform_wayland = _platforms.contains('wayland') 334with_platform_haiku = _platforms.contains('haiku') 335with_platform_windows = _platforms.contains('windows') 336 337if _platforms.length() != 0 338 egl_native_platform = _platforms[0] 339else 340 egl_native_platform = 'surfaceless' 341endif 342 343with_glx = get_option('glx') 344if with_glx == 'auto' 345 if with_platform_android 346 with_glx = 'disabled' 347 elif with_dri 348 with_glx = 'dri' 349 elif with_platform_haiku 350 with_glx = 'disabled' 351 elif host_machine.system() == 'windows' 352 with_glx = 'disabled' 353 elif with_gallium 354 # Even when building just gallium drivers the user probably wants dri 355 with_glx = 'dri' 356 elif with_platform_x11 and with_any_opengl and not with_any_vk 357 # The automatic behavior should not be to turn on xlib based glx when 358 # building only vulkan drivers 359 with_glx = 'xlib' 360 else 361 with_glx = 'disabled' 362 endif 363endif 364if with_glx == 'dri' 365 if with_gallium 366 with_dri = true 367 endif 368endif 369 370if not (with_dri or with_gallium or with_glx != 'disabled') 371 with_gles1 = false 372 with_gles2 = false 373 with_opengl = false 374 with_any_opengl = false 375 with_shared_glapi = false 376endif 377 378_gbm = get_option('gbm') 379if _gbm == 'true' 380 _gbm = 'enabled' 381 warning('gbm option "true" deprecated, please use "enabled" instead.') 382elif _gbm == 'false' 383 _gbm = 'disabled' 384 warning('gbm option "false" deprecated, please use "disabled" instead.') 385endif 386if _gbm == 'auto' 387 with_gbm = system_has_kms_drm and with_dri 388else 389 with_gbm = _gbm == 'enabled' 390endif 391if with_gbm and not system_has_kms_drm 392 error('GBM only supports DRM/KMS platforms') 393endif 394 395_xlib_lease = get_option('xlib-lease') 396if _xlib_lease == 'true' 397 _xlib_lease = 'enabled' 398 warning('xlib_lease option "true" deprecated, please use "enabled" instead.') 399elif _xlib_lease == 'false' 400 _xlib_lease = 'disabled' 401 warning('xlib_lease option "false" deprecated, please use "disabled" instead.') 402endif 403if _xlib_lease == 'auto' 404 with_xlib_lease = with_platform_x11 and system_has_kms_drm 405else 406 with_xlib_lease = _xlib_lease == 'enabled' 407endif 408 409_egl = get_option('egl') 410if _egl == 'true' 411 _egl = 'enabled' 412 warning('egl option "true" deprecated, please use "enabled" instead.') 413elif _egl == 'false' 414 _egl = 'disabled' 415 warning('egl option "false" deprecated, please use "disabled" instead.') 416endif 417if _egl == 'auto' 418 with_egl = ( 419 not ['darwin', 'windows'].contains(host_machine.system()) and 420 with_dri and with_shared_glapi 421 ) 422elif _egl == 'enabled' 423 if not with_dri 424 error('EGL requires dri') 425 elif not with_shared_glapi 426 error('EGL requires shared-glapi') 427 elif not ['disabled', 'dri'].contains(with_glx) 428 error('EGL requires dri, but a GLX is being built without dri') 429 elif ['darwin', 'windows'].contains(host_machine.system()) 430 error('EGL is not available on Windows or MacOS') 431 endif 432 with_egl = true 433else 434 with_egl = false 435endif 436 437# Android uses emutls for versions <= P/28. For USE_ELF_TLS we need ELF TLS. 438use_elf_tls = false 439if not ['windows', 'freebsd', 'openbsd'].contains(host_machine.system()) and (not with_platform_android or get_option('platform-sdk-version') >= 29) 440 pre_args += '-DUSE_ELF_TLS' 441 use_elf_tls = true 442endif 443 444if with_glx != 'disabled' 445 if not (with_platform_x11 and with_any_opengl) 446 error('Cannot build GLX support without X11 platform support and at least one OpenGL API') 447 elif with_glx == 'gallium-xlib' 448 if not with_gallium 449 error('Gallium-xlib based GLX requires at least one gallium driver') 450 elif not with_gallium_softpipe 451 error('Gallium-xlib based GLX requires softpipe or llvmpipe.') 452 elif with_dri 453 error('gallium-xlib conflicts with any dri driver') 454 endif 455 elif with_glx == 'xlib' 456 if with_dri 457 error('xlib conflicts with any dri driver') 458 endif 459 elif with_glx == 'dri' 460 if not with_shared_glapi 461 error('dri based GLX requires shared-glapi') 462 endif 463 endif 464endif 465 466with_glvnd = get_option('glvnd') 467if with_glvnd 468 if with_platform_windows 469 error('glvnd cannot be used on Windows') 470 elif with_glx == 'xlib' or with_glx == 'gallium-xlib' 471 error('Cannot build glvnd support for GLX that is not DRI based.') 472 elif with_glx == 'disabled' and not with_egl 473 error('glvnd requires DRI based GLX and/or EGL') 474 endif 475 if get_option('egl-lib-suffix') != '' 476 error('''EGL lib suffix can't be used with libglvnd''') 477 endif 478endif 479 480if with_vulkan_icd_dir == '' 481 with_vulkan_icd_dir = join_paths(get_option('datadir'), 'vulkan/icd.d') 482endif 483 484# GNU/Hurd includes egl_dri2, without drm. 485with_dri2 = (with_dri or with_any_vk) and (with_dri_platform == 'drm' or 486 host_machine.system() == 'gnu') 487_dri3 = get_option('dri3') 488if _dri3 == 'true' 489 _dri3 = 'enabled' 490 warning('dri3 option "true" deprecated, please use "enabled" instead.') 491elif _dri3 == 'false' 492 _dri3 = 'disabled' 493 warning('dri3 option "false" deprecated, please use "disabled" instead.') 494endif 495if _dri3 == 'auto' 496 with_dri3 = system_has_kms_drm and with_dri2 497else 498 with_dri3 = _dri3 == 'enabled' 499endif 500 501if with_any_vk and (with_platform_x11 and not with_dri3) 502 error('Vulkan drivers require dri3 for X11 support') 503endif 504if with_dri 505 if with_glx == 'disabled' and not with_egl and not with_gbm and with_osmesa != 'classic' 506 error('building dri drivers require at least one windowing system or classic osmesa') 507 endif 508endif 509 510_vdpau = get_option('gallium-vdpau') 511if _vdpau == 'true' 512 _vdpau = 'enabled' 513 warning('gallium-vdpau option "true" deprecated, please use "enabled" instead.') 514elif _vdpau == 'false' 515 _vdpau = 'disabled' 516 warning('gallium-vdpau option "false" deprecated, please use "disabled" instead.') 517endif 518if not system_has_kms_drm 519 if _vdpau == 'enabled' 520 error('VDPAU state tracker can only be build on unix-like OSes.') 521 else 522 _vdpau = 'disabled' 523 endif 524elif not with_platform_x11 525 if _vdpau == 'enabled' 526 error('VDPAU state tracker requires X11 support.') 527 else 528 _vdpau = 'disabled' 529 endif 530elif not (with_gallium_r300 or with_gallium_r600 or with_gallium_radeonsi or 531 with_gallium_nouveau) 532 if _vdpau == 'enabled' 533 error('VDPAU state tracker requires at least one of the following gallium drivers: r300, r600, radeonsi, nouveau.') 534 else 535 _vdpau = 'disabled' 536 endif 537endif 538dep_vdpau = null_dep 539with_gallium_vdpau = false 540if _vdpau != 'disabled' 541 dep_vdpau = dependency('vdpau', version : '>= 1.1', required : _vdpau == 'enabled') 542 if dep_vdpau.found() 543 dep_vdpau = dep_vdpau.partial_dependency(compile_args : true) 544 with_gallium_vdpau = true 545 endif 546endif 547 548if with_gallium_vdpau 549 pre_args += '-DHAVE_ST_VDPAU' 550endif 551vdpau_drivers_path = get_option('vdpau-libs-path') 552if vdpau_drivers_path == '' 553 vdpau_drivers_path = join_paths(get_option('libdir'), 'vdpau') 554endif 555 556if with_gallium_zink 557 dep_vulkan = dependency('vulkan') 558endif 559 560if with_vulkan_overlay_layer or with_aco_tests 561 prog_glslang = find_program('glslangValidator') 562endif 563 564_xvmc = get_option('gallium-xvmc') 565if _xvmc == 'true' 566 _xvmc = 'enabled' 567 warning('gallium-xvmc option "true" deprecated, please use "enabled" instead.') 568elif _xvmc == 'false' 569 _xvmc = 'disabled' 570 warning('gallium-xvmc option "false" deprecated, please use "disabled" instead.') 571endif 572if not system_has_kms_drm 573 if _xvmc == 'enabled' 574 error('XVMC state tracker can only be build on unix-like OSes.') 575 else 576 _xvmc = 'disabled' 577 endif 578elif not with_platform_x11 579 if _xvmc == 'enabled' 580 error('XVMC state tracker requires X11 support.') 581 else 582 _xvmc = 'disabled' 583 endif 584elif not (with_gallium_r600 or with_gallium_nouveau) 585 if _xvmc == 'enabled' 586 error('XVMC state tracker requires at least one of the following gallium drivers: r600, nouveau.') 587 else 588 _xvmc = 'disabled' 589 endif 590endif 591dep_xvmc = null_dep 592dep_xv = null_dep 593with_gallium_xvmc = false 594if _xvmc != 'disabled' 595 dep_xvmc = dependency('xvmc', version : '>= 1.0.6', required : _xvmc == 'enabled') 596 dep_xv = dependency('xv', required : _xvmc == 'enabled') 597 with_gallium_xvmc = dep_xvmc.found() and dep_xv.found() 598endif 599 600xvmc_drivers_path = get_option('xvmc-libs-path') 601if xvmc_drivers_path == '' 602 xvmc_drivers_path = get_option('libdir') 603endif 604 605_omx = get_option('gallium-omx') 606if not system_has_kms_drm 607 if ['auto', 'disabled'].contains(_omx) 608 _omx = 'disabled' 609 else 610 error('OMX state tracker can only be built on unix-like OSes.') 611 endif 612elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau) 613 if ['auto', 'disabled'].contains(_omx) 614 _omx = 'disabled' 615 else 616 error('OMX state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.') 617 endif 618endif 619with_gallium_omx = _omx 620dep_omx = null_dep 621dep_omx_other = [] 622if ['auto', 'bellagio'].contains(_omx) 623 dep_omx = dependency( 624 'libomxil-bellagio', required : _omx == 'bellagio' 625 ) 626 if dep_omx.found() 627 with_gallium_omx = 'bellagio' 628 endif 629endif 630if ['auto', 'tizonia'].contains(_omx) 631 if with_dri and with_egl 632 dep_omx = dependency( 633 'libtizonia', version : '>= 0.10.0', 634 required : _omx == 'tizonia', 635 ) 636 dep_omx_other = [ 637 dependency('libtizplatform', required : _omx == 'tizonia'), 638 dependency('tizilheaders', required : _omx == 'tizonia'), 639 ] 640 if dep_omx.found() and dep_omx_other[0].found() and dep_omx_other[1].found() 641 with_gallium_omx = 'tizonia' 642 endif 643 elif _omx == 'tizonia' 644 error('OMX-Tizonia state tracker requires dri and egl') 645 endif 646endif 647if _omx == 'auto' 648 with_gallium_omx = 'disabled' 649else 650 with_gallium_omx = _omx 651endif 652 653pre_args += [ 654 '-DENABLE_ST_OMX_BELLAGIO=' + (with_gallium_omx == 'bellagio' ? '1' : '0'), 655 '-DENABLE_ST_OMX_TIZONIA=' + (with_gallium_omx == 'tizonia' ? '1' : '0'), 656] 657 658 659omx_drivers_path = get_option('omx-libs-path') 660 661if with_gallium_omx != 'disabled' 662 # Figure out where to put the omx driver. 663 # FIXME: this could all be vastly simplified by adding a 'defined_variable' 664 # argument to meson's get_pkgconfig_variable method. 665 if omx_drivers_path == '' 666 _omx_libdir = dep_omx.get_pkgconfig_variable('libdir') 667 _omx_drivers_dir = dep_omx.get_pkgconfig_variable('pluginsdir') 668 if _omx_libdir == get_option('libdir') 669 omx_drivers_path = _omx_drivers_dir 670 else 671 _omx_base_dir = [] 672 # This will fail on windows. Does OMX run on windows? 673 _omx_libdir = _omx_libdir.split('/') 674 _omx_drivers_dir = _omx_drivers_dir.split('/') 675 foreach o : _omx_drivers_dir 676 if not _omx_libdir.contains(o) 677 _omx_base_dir += o 678 endif 679 endforeach 680 omx_drivers_path = join_paths(get_option('libdir'), _omx_base_dir) 681 endif 682 endif 683endif 684 685_va = get_option('gallium-va') 686if _va == 'true' 687 _va = 'enabled' 688 warning('gallium-va option "true" deprecated, please use "enabled" instead.') 689elif _va == 'false' 690 _va = 'disabled' 691 warning('gallium-va option "false" deprecated, please use "disabled" instead.') 692endif 693if not system_has_kms_drm 694 if _va == 'enabled' 695 error('VA state tracker can only be built on unix-like OSes.') 696 else 697 _va = 'disabled' 698 endif 699elif not (with_gallium_r600 or with_gallium_radeonsi or with_gallium_nouveau) 700 if _va == 'enabled' 701 error('VA state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau.') 702 else 703 _va = 'disabled' 704 endif 705endif 706with_gallium_va = false 707dep_va = null_dep 708if _va != 'disabled' 709 dep_va = dependency('libva', version : '>= 0.38.0', required : _va == 'enabled') 710 if dep_va.found() 711 dep_va_headers = dep_va.partial_dependency(compile_args : true) 712 with_gallium_va = true 713 endif 714endif 715 716va_drivers_path = get_option('va-libs-path') 717if va_drivers_path == '' 718 va_drivers_path = join_paths(get_option('libdir'), 'dri') 719endif 720 721_xa = get_option('gallium-xa') 722if _xa == 'true' 723 _xa = 'enabled' 724 warning('gallium-xa option "true" deprecated, please use "enabled" instead.') 725elif _xa == 'false' 726 _xa = 'disabled' 727 warning('gallium-xa option "false" deprecated, please use "disabled" instead.') 728endif 729if not system_has_kms_drm 730 if _xa == 'enabled' 731 error('XA state tracker can only be built on unix-like OSes.') 732 else 733 _xa = 'disabled' 734 endif 735elif not (with_gallium_nouveau or with_gallium_freedreno or with_gallium_i915 736 or with_gallium_svga) 737 if _xa == 'enabled' 738 error('XA state tracker requires at least one of the following gallium drivers: nouveau, freedreno, i915, svga.') 739 else 740 _xa = 'disabled' 741 endif 742endif 743with_gallium_xa = _xa != 'disabled' 744 745d3d_drivers_path = get_option('d3d-drivers-path') 746if d3d_drivers_path == '' 747 d3d_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'd3d') 748endif 749 750with_gallium_st_nine = get_option('gallium-nine') 751if with_gallium_st_nine 752 if not with_gallium_softpipe 753 error('The nine state tracker requires gallium softpipe/llvmpipe.') 754 elif not (with_gallium_radeonsi or with_gallium_nouveau or with_gallium_r600 755 or with_gallium_r300 or with_gallium_svga or with_gallium_i915 756 or with_gallium_iris) 757 error('The nine state tracker requires at least one non-swrast gallium driver.') 758 endif 759 if not with_dri3 760 error('Using nine with wine requires dri3') 761 endif 762endif 763_power8 = get_option('power8') 764if _power8 == 'true' 765 _power8 = 'enabled' 766 warning('power8 option "true" deprecated, please use "enabled" instead.') 767elif _power8 == 'false' 768 _power8 = 'disabled' 769 warning('power8 option "false" deprecated, please use "disabled" instead.') 770endif 771if _power8 != 'disabled' 772 # on old versions of meson the cpu family would return as ppc64le on little 773 # endian power8, this was changed in 0.48 such that the family would always 774 # be ppc64 regardless of endianness, and then the machine.endian() value 775 # should be checked. Since we support versions < 0.48 we need to use 776 # startswith. 777 if host_machine.cpu_family().startswith('ppc64') and host_machine.endian() == 'little' 778 if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.8') 779 error('Altivec is not supported with gcc version < 4.8.') 780 endif 781 if cc.compiles(''' 782 #include <altivec.h> 783 int main() { 784 vector unsigned char r; 785 vector unsigned int v = vec_splat_u32 (1); 786 r = __builtin_vec_vgbbd ((vector unsigned char) v); 787 return 0; 788 }''', 789 args : '-mpower8-vector', 790 name : 'POWER8 intrinsics') 791 pre_args += ['-D_ARCH_PWR8', '-mpower8-vector'] 792 elif get_option('power8') == 'enabled' 793 error('POWER8 intrinsic support required but not found.') 794 endif 795 endif 796endif 797 798_opencl = get_option('gallium-opencl') 799if _opencl != 'disabled' 800 if not with_gallium 801 error('OpenCL Clover implementation requires at least one gallium driver.') 802 endif 803 804 with_clc = true 805 with_gallium_opencl = true 806 with_opencl_icd = _opencl == 'icd' 807else 808 with_gallium_opencl = false 809 with_opencl_icd = false 810endif 811 812dep_clc = null_dep 813if with_clc 814 dep_clc = dependency('libclc') 815endif 816 817gl_pkgconfig_c_flags = [] 818if with_platform_x11 819 if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm') 820 pre_args += '-DHAVE_X11_PLATFORM' 821 endif 822 if with_glx == 'xlib' or with_glx == 'gallium-xlib' 823 pre_args += '-DUSE_XSHM' 824 else 825 pre_args += '-DGLX_INDIRECT_RENDERING' 826 if with_glx_direct 827 pre_args += '-DGLX_DIRECT_RENDERING' 828 endif 829 if with_dri_platform == 'drm' 830 pre_args += '-DGLX_USE_DRM' 831 elif with_dri_platform == 'apple' 832 pre_args += '-DGLX_USE_APPLEGL' 833 elif with_dri_platform == 'windows' 834 pre_args += '-DGLX_USE_WINDOWSGL' 835 endif 836 endif 837else 838 pre_args += '-DEGL_NO_X11' 839 gl_pkgconfig_c_flags += '-DEGL_NO_X11' 840endif 841if with_gbm 842 pre_args += '-DHAVE_DRM_PLATFORM' 843endif 844 845with_android_stub = get_option('android-stub') 846if with_android_stub and not with_platform_android 847 error('`-D android-stub=true` makes no sense without `-D platforms=android`') 848endif 849 850if with_platform_android 851 if not with_android_stub 852 dep_android = [ 853 dependency('cutils'), 854 dependency('hardware'), 855 dependency('sync'), 856 dependency('backtrace') 857 ] 858 if get_option('platform-sdk-version') >= 26 859 dep_android += dependency('nativewindow') 860 endif 861 endif 862 pre_args += [ 863 '-DHAVE_ANDROID_PLATFORM', 864 '-DANDROID', 865 '-DANDROID_API_LEVEL=' + get_option('platform-sdk-version').to_string() 866 ] 867endif 868if with_platform_haiku 869 pre_args += '-DHAVE_HAIKU_PLATFORM' 870endif 871 872prog_python = import('python').find_installation('python3') 873has_mako = run_command( 874 prog_python, '-c', 875 ''' 876from distutils.version import StrictVersion 877import mako 878assert StrictVersion(mako.__version__) > StrictVersion("0.8.0") 879 ''') 880if has_mako.returncode() != 0 881 error('Python (3.x) mako module >= 0.8.0 required to build mesa.') 882endif 883 884if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.4.6') 885 error('When using GCC, version 4.4.6 or later is required.') 886endif 887 888# Support systems without ETIME (e.g. FreeBSD) 889if cc.get_define('ETIME', prefix : '#include <errno.h>') == '' 890 pre_args += '-DETIME=ETIMEDOUT' 891endif 892 893# Define DEBUG for debug builds only (debugoptimized is not included on this one) 894if get_option('buildtype') == 'debug' 895 pre_args += '-DDEBUG' 896endif 897 898with_shader_cache = false 899_shader_cache = get_option('shader-cache') 900if _shader_cache == 'true' 901 _shader_cache = 'enabled' 902 warning('shader_cache option "true" deprecated, please use "enabled" instead.') 903elif _shader_cache == 'false' 904 _shader_cache = 'disabled' 905 warning('shader_cache option "false" deprecated, please use "disabled" instead.') 906endif 907if _shader_cache != 'disabled' 908 if host_machine.system() == 'windows' 909 if _shader_cache == 'enabled' 910 error('Shader Cache does not currently work on Windows') 911 endif 912 else 913 pre_args += '-DENABLE_SHADER_CACHE' 914 if not get_option('shader-cache-default') 915 pre_args += '-DSHADER_CACHE_DISABLE_BY_DEFAULT' 916 endif 917 with_shader_cache = true 918 endif 919endif 920 921# Check for GCC style builtins 922foreach b : ['bswap32', 'bswap64', 'clz', 'clzll', 'ctz', 'expect', 'ffs', 923 'ffsll', 'popcount', 'popcountll', 'unreachable'] 924 if cc.has_function(b) 925 pre_args += '-DHAVE___BUILTIN_@0@'.format(b.to_upper()) 926 endif 927endforeach 928 929# check for GCC __attribute__ 930_attributes = [ 931 'const', 'flatten', 'malloc', 'pure', 'unused', 'warn_unused_result', 932 'weak', 'format', 'packed', 'returns_nonnull', 'alias', 'noreturn', 933] 934foreach a : cc.get_supported_function_attributes(_attributes) 935 pre_args += '-DHAVE_FUNC_ATTRIBUTE_@0@'.format(a.to_upper()) 936endforeach 937if cc.has_function_attribute('visibility:hidden') 938 pre_args += '-DHAVE_FUNC_ATTRIBUTE_VISIBILITY' 939endif 940if cc.compiles('__uint128_t foo(void) { return 0; }', 941 name : '__uint128_t') 942 pre_args += '-DHAVE_UINT128' 943endif 944 945# TODO: this is very incomplete 946if ['linux', 'cygwin', 'gnu', 'freebsd', 'gnu/kfreebsd'].contains(host_machine.system()) 947 pre_args += '-D_GNU_SOURCE' 948elif host_machine.system() == 'sunos' 949 pre_args += '-D__EXTENSIONS__' 950elif host_machine.system() == 'windows' 951 pre_args += [ 952 '-D_WINDOWS', '-D_WIN32_WINNT=0x0A00', '-DWINVER=0x0A00', 953 '-DPIPE_SUBSYSTEM_WINDOWS_USER', 954 '-D_USE_MATH_DEFINES', # XXX: scons doesn't use this for mingw 955 ] 956 if cc.get_id() == 'msvc' 957 pre_args += [ 958 '-DVC_EXTRALEAN', 959 '-D_CRT_SECURE_NO_WARNINGS', 960 '-D_CRT_SECURE_NO_DEPRECATE', 961 '-D_SCL_SECURE_NO_WARNINGS', 962 '-D_SCL_SECURE_NO_DEPRECATE', 963 '-D_ALLOW_KEYWORD_MACROS', 964 '-D_HAS_EXCEPTIONS=0', # Tell C++ STL to not use exceptions 965 ] 966 else 967 pre_args += ['-D__MSVCRT_VERSION__=0x0700'] 968 endif 969elif host_machine.system() == 'openbsd' 970 pre_args += '-D_ISOC11_SOURCE' 971endif 972 973# Check for generic C arguments 974c_args = [] 975c_msvc_compat_args = [] 976no_override_init_args = [] 977cpp_args = [] 978cpp_msvc_compat_args = [] 979if cc.get_id() == 'msvc' 980 foreach a : ['/wd4018', # signed/unsigned mismatch 981 '/wd4056', # overflow in floating-point constant arithmetic 982 '/wd4244', # conversion from 'type1' to 'type2', possible loss of data 983 '/wd4267', # 'var' : conversion from 'size_t' to 'type', possible loss of data 984 '/wd4305', # trancation from 'type1' to 'type2' 985 '/wd4351', # new behavior: elements of array 'array' will be default initialized 986 '/wd4756', # overflow in constant arithmetic 987 '/wd4800', # forcing value to bool 'true' or 'false' (performance warning) 988 '/wd4996', # disabled deprecated POSIX name warnings 989 '/wd4291', # no matching operator delete found 990 '/wd4146', # unary minus operator applied to unsigned type, result still unsigned 991 '/wd4200', # nonstandard extension used: zero-sized array in struct/union 992 '/wd4624', # destructor was implicitly defined as deleted [from LLVM] 993 '/wd4309', # 'initializing': truncation of constant value 994 '/wd4838', # conversion from 'int' to 'const char' requires a narrowing conversion 995 '/we4020', # Error when passing the wrong number of parameters 996 '/we4024', # Error when passing different type of parameter 997 ] 998 if cc.has_argument(a) 999 c_args += a 1000 endif 1001 if cpp.has_argument(a) 1002 cpp_args += a 1003 endif 1004 endforeach 1005else 1006 _trial = [ 1007 '-Werror=implicit-function-declaration', 1008 '-Werror=missing-prototypes', 1009 '-Werror=return-type', 1010 '-Werror=empty-body', 1011 '-Werror=incompatible-pointer-types', 1012 '-Werror=int-conversion', 1013 '-Wimplicit-fallthrough', 1014 '-Wno-missing-field-initializers', 1015 '-Wno-format-truncation', 1016 '-fno-math-errno', 1017 '-fno-trapping-math', 1018 '-Qunused-arguments', 1019 '-fno-common', 1020 ] 1021 # MinGW chokes on format specifiers and I can't get it all working 1022 if not (cc.get_id() == 'gcc' and host_machine.system() == 'windows') 1023 _trial += ['-Werror=format', '-Wformat-security'] 1024 endif 1025 foreach a : _trial 1026 if cc.has_argument(a) 1027 c_args += a 1028 endif 1029 endforeach 1030 1031 _trial = [ 1032 '-Werror=return-type', 1033 '-Werror=empty-body', 1034 '-Wno-non-virtual-dtor', 1035 '-Wno-missing-field-initializers', 1036 '-Wno-format-truncation', 1037 '-fno-math-errno', 1038 '-fno-trapping-math', 1039 '-Qunused-arguments', 1040 # Some classes use custom new operator which zeroes memory, however 1041 # gcc does aggressive dead-store elimination which threats all writes 1042 # to the memory before the constructor as "dead stores". 1043 # For now we disable this optimization. 1044 '-flifetime-dse=1', 1045 ] 1046 # MinGW chokes on format specifiers and I can't get it all working 1047 if not (cc.get_id() == 'gcc' and host_machine.system() == 'windows') 1048 _trial += ['-Werror=format', '-Wformat-security'] 1049 endif 1050 foreach a : _trial 1051 if cpp.has_argument(a) 1052 cpp_args += a 1053 endif 1054 endforeach 1055 1056 foreach a : ['-Wno-override-init', '-Wno-initializer-overrides'] 1057 if cc.has_argument(a) 1058 no_override_init_args += a 1059 endif 1060 endforeach 1061 1062 # Check for C and C++ arguments for MSVC compatibility. These are only used 1063 # in parts of the mesa code base that need to compile with MSVC, mainly 1064 # common code 1065 foreach a : ['-Werror=pointer-arith', '-Werror=vla', '-Werror=gnu-empty-initializer'] 1066 if cc.has_argument(a) 1067 c_msvc_compat_args += a 1068 endif 1069 if cpp.has_argument(a) 1070 cpp_msvc_compat_args += a 1071 endif 1072 endforeach 1073 1074 if cc.has_argument('-Wmicrosoft-enum-value') # Clang 1075 c_args += '-Wno-microsoft-enum-value' 1076 cpp_args += '-Wno-microsoft-enum-value' 1077 endif 1078endif 1079 1080# set linker arguments 1081if host_machine.system() == 'windows' 1082 if cc.get_id() == 'msvc' 1083 add_project_link_arguments( 1084 '/fixed:no', 1085 '/dynamicbase', 1086 '/nxcompat', 1087 language : ['c', 'cpp'], 1088 ) 1089 if get_option('buildtype') != 'debug' 1090 add_project_link_arguments( 1091 '/incremental:no', 1092 language : ['c', 'cpp'], 1093 ) 1094 endif 1095 else 1096 add_project_link_arguments( 1097 '-Wl,--nxcompat', 1098 '-Wl,--dynamicbase', 1099 '-static-libgcc', 1100 '-static-libstdc++', 1101 language : ['c', 'cpp'], 1102 ) 1103 endif 1104endif 1105 1106if host_machine.cpu_family().startswith('x86') and cc.get_id() != 'msvc' 1107 pre_args += '-DUSE_SSE41' 1108 with_sse41 = true 1109 sse41_args = ['-msse4.1'] 1110 1111 # GCC on x86 (not x86_64) with -msse* assumes a 16 byte aligned stack, but 1112 # that's not guaranteed 1113 if host_machine.cpu_family() == 'x86' 1114 sse41_args += '-mstackrealign' 1115 endif 1116else 1117 with_sse41 = false 1118 sse41_args = [] 1119endif 1120 1121# Check for GCC style atomics 1122dep_atomic = null_dep 1123 1124if cc.compiles('''#include <stdint.h> 1125 int main() { 1126 struct { 1127 uint64_t *v; 1128 } x; 1129 return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) & 1130 (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL); 1131 1132 }''', 1133 name : 'GCC atomic builtins') 1134 pre_args += '-DUSE_GCC_ATOMIC_BUILTINS' 1135 1136 # Not all atomic calls can be turned into lock-free instructions, in which 1137 # GCC will make calls into the libatomic library. Check whether we need to 1138 # link with -latomic. 1139 # 1140 # This can happen for 64-bit atomic operations on 32-bit architectures such 1141 # as ARM. 1142 if not cc.links('''#include <stdint.h> 1143 int main() { 1144 struct { 1145 uint64_t *v; 1146 } x; 1147 return (int)__atomic_load_n(x.v, __ATOMIC_ACQUIRE) & 1148 (int)__atomic_add_fetch(x.v, (uint64_t)1, __ATOMIC_ACQ_REL); 1149 }''', 1150 name : 'GCC atomic builtins required -latomic') 1151 dep_atomic = cc.find_library('atomic') 1152 endif 1153endif 1154if not cc.links('''#include <stdint.h> 1155 uint64_t v; 1156 int main() { 1157 return __sync_add_and_fetch(&v, (uint64_t)1); 1158 }''', 1159 dependencies : dep_atomic, 1160 name : 'GCC 64bit atomics') 1161 pre_args += '-DMISSING_64BIT_ATOMICS' 1162endif 1163 1164dep_ws2_32 = cc.find_library('ws2_32', required : with_platform_windows) 1165 1166# TODO: shared/static? Is this even worth doing? 1167 1168with_asm_arch = '' 1169if host_machine.cpu_family() == 'x86' 1170 if system_has_kms_drm or host_machine.system() == 'gnu' 1171 with_asm_arch = 'x86' 1172 pre_args += ['-DUSE_X86_ASM', '-DUSE_MMX_ASM', '-DUSE_3DNOW_ASM', 1173 '-DUSE_SSE_ASM'] 1174 1175 if with_glx_read_only_text 1176 pre_args += ['-DGLX_X86_READONLY_TEXT'] 1177 endif 1178 endif 1179elif host_machine.cpu_family() == 'x86_64' 1180 if system_has_kms_drm 1181 with_asm_arch = 'x86_64' 1182 pre_args += ['-DUSE_X86_64_ASM'] 1183 endif 1184elif host_machine.cpu_family() == 'arm' 1185 if system_has_kms_drm 1186 with_asm_arch = 'arm' 1187 pre_args += ['-DUSE_ARM_ASM'] 1188 endif 1189elif host_machine.cpu_family() == 'aarch64' 1190 if system_has_kms_drm 1191 with_asm_arch = 'aarch64' 1192 pre_args += ['-DUSE_AARCH64_ASM'] 1193 endif 1194elif host_machine.cpu_family() == 'sparc64' 1195 if system_has_kms_drm 1196 with_asm_arch = 'sparc' 1197 pre_args += ['-DUSE_SPARC_ASM'] 1198 endif 1199elif host_machine.cpu_family().startswith('ppc64') and host_machine.endian() == 'little' 1200 if system_has_kms_drm 1201 with_asm_arch = 'ppc64le' 1202 pre_args += ['-DUSE_PPC64LE_ASM'] 1203 endif 1204endif 1205 1206# Check for standard headers and functions 1207if (cc.has_header_symbol('sys/sysmacros.h', 'major') and 1208 cc.has_header_symbol('sys/sysmacros.h', 'minor') and 1209 cc.has_header_symbol('sys/sysmacros.h', 'makedev')) 1210 pre_args += '-DMAJOR_IN_SYSMACROS' 1211endif 1212if (cc.has_header_symbol('sys/mkdev.h', 'major') and 1213 cc.has_header_symbol('sys/mkdev.h', 'minor') and 1214 cc.has_header_symbol('sys/mkdev.h', 'makedev')) 1215 pre_args += '-DMAJOR_IN_MKDEV' 1216endif 1217 1218if not ['linux'].contains(host_machine.system()) 1219 # Deprecated on Linux and requires <sys/types.h> on FreeBSD and OpenBSD 1220 if cc.check_header('sys/sysctl.h', prefix : '#include <sys/types.h>') 1221 pre_args += '-DHAVE_SYS_SYSCTL_H' 1222 endif 1223endif 1224 1225foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'execinfo.h', 'sys/shm.h', 'cet.h', 'pthread_np.h'] 1226 if cc.check_header(h) 1227 pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) 1228 endif 1229endforeach 1230 1231foreach f : ['strtof', 'mkostemp', 'timespec_get', 'memfd_create', 'random_r', 'flock', 'strtok_r', 'getrandom'] 1232 if cc.has_function(f) 1233 pre_args += '-DHAVE_@0@'.format(f.to_upper()) 1234 endif 1235endforeach 1236 1237if cc.has_header_symbol('errno.h', 'program_invocation_name', 1238 args : '-D_GNU_SOURCE') 1239 pre_args += '-DHAVE_PROGRAM_INVOCATION_NAME' 1240elif with_tools.contains('intel') 1241 error('Intel tools require the program_invocation_name variable') 1242endif 1243 1244# MinGW provides a __builtin_posix_memalign function, but not a posix_memalign. 1245# This means that this check will succeed, but then compilation will later 1246# fail. MSVC doesn't have this function at all, so only check for it on 1247# non-windows platforms. 1248if host_machine.system() != 'windows' 1249 if cc.has_function('posix_memalign') 1250 pre_args += '-DHAVE_POSIX_MEMALIGN' 1251 endif 1252endif 1253 1254if cc.has_member('struct dirent', 'd_type', prefix: '''#include <sys/types.h> 1255 #include <dirent.h>''') 1256 pre_args += '-DHAVE_DIRENT_D_TYPE' 1257endif 1258 1259# strtod locale support 1260if cc.links(''' 1261 #define _GNU_SOURCE 1262 #include <stdlib.h> 1263 #include <locale.h> 1264 #ifdef HAVE_XLOCALE_H 1265 #include <xlocale.h> 1266 #endif 1267 int main() { 1268 locale_t loc = newlocale(LC_CTYPE_MASK, "C", NULL); 1269 const char *s = "1.0"; 1270 char *end; 1271 double d = strtod_l(s, end, loc); 1272 float f = strtof_l(s, end, loc); 1273 freelocale(loc); 1274 return 0; 1275 }''', 1276 args : pre_args, 1277 name : 'strtod has locale support') 1278 pre_args += '-DHAVE_STRTOD_L' 1279endif 1280 1281# Check for some linker flags 1282ld_args_bsymbolic = [] 1283if cc.links('int main() { return 0; }', args : '-Wl,-Bsymbolic', name : 'Bsymbolic') 1284 ld_args_bsymbolic += '-Wl,-Bsymbolic' 1285endif 1286ld_args_gc_sections = [] 1287if cc.links('static char unused() { return 5; } int main() { return 0; }', 1288 args : '-Wl,--gc-sections', name : 'gc-sections') 1289 ld_args_gc_sections += '-Wl,--gc-sections' 1290endif 1291with_ld_version_script = false 1292if cc.links('int main() { return 0; }', 1293 args : '-Wl,--version-script=@0@'.format( 1294 join_paths(meson.source_root(), 'build-support/conftest.map')), 1295 name : 'version-script') 1296 with_ld_version_script = true 1297endif 1298with_ld_dynamic_list = false 1299if cc.links('int main() { return 0; }', 1300 args : '-Wl,--dynamic-list=@0@'.format( 1301 join_paths(meson.source_root(), 'build-support/conftest.dyn')), 1302 name : 'dynamic-list') 1303 with_ld_dynamic_list = true 1304endif 1305 1306ld_args_build_id = cc.get_supported_link_arguments('-Wl,--build-id=sha1') 1307 1308# check for dl support 1309dep_dl = null_dep 1310if not cc.has_function('dlopen') 1311 dep_dl = cc.find_library('dl', required : host_machine.system() != 'windows') 1312endif 1313if cc.has_function('dladdr', dependencies : dep_dl) 1314 # This is really only required for megadrivers 1315 pre_args += '-DHAVE_DLADDR' 1316endif 1317 1318if cc.has_function('dl_iterate_phdr') 1319 pre_args += '-DHAVE_DL_ITERATE_PHDR' 1320elif with_intel_vk 1321 error('Intel "Anvil" Vulkan driver requires the dl_iterate_phdr function') 1322elif with_dri_i965 and with_shader_cache 1323 error('Intel i965 GL driver requires dl_iterate_phdr when built with shader caching.') 1324endif 1325 1326# Determine whether or not the rt library is needed for time functions 1327if host_machine.system() == 'windows' or cc.has_function('clock_gettime') 1328 dep_clock = null_dep 1329else 1330 dep_clock = cc.find_library('rt') 1331endif 1332 1333# TODO: some of these may be conditional 1334dep_zlib = dependency('zlib', version : '>= 1.2.3', fallback : ['zlib', 'zlib_dep']) 1335pre_args += '-DHAVE_ZLIB' 1336 1337_zstd = get_option('zstd') 1338if _zstd == 'true' 1339 _zstd = 'enabled' 1340 warning('zstd option "true" deprecated, please use "enabled" instead.') 1341elif _zstd == 'false' 1342 _zstd = 'disabled' 1343 warning('zstd option "false" deprecated, please use "disabled" instead.') 1344endif 1345if _zstd != 'disabled' 1346 dep_zstd = dependency('libzstd', required : _zstd == 'enabled') 1347 if dep_zstd.found() 1348 pre_args += '-DHAVE_ZSTD' 1349 endif 1350else 1351 dep_zstd = null_dep 1352endif 1353 1354dep_thread = dependency('threads') 1355if dep_thread.found() and host_machine.system() != 'windows' 1356 pre_args += '-DHAVE_PTHREAD' 1357 if host_machine.system() != 'netbsd' and cc.has_function( 1358 'pthread_setaffinity_np', 1359 dependencies : dep_thread, 1360 prefix : '#include <pthread.h>', 1361 args : '-D_GNU_SOURCE') 1362 pre_args += '-DHAVE_PTHREAD_SETAFFINITY' 1363 endif 1364endif 1365if host_machine.system() != 'windows' 1366 dep_expat = dependency('expat', fallback : ['expat', 'expat_dep'], 1367 required: not with_platform_android or with_any_broadcom or with_any_intel) 1368else 1369 dep_expat = null_dep 1370endif 1371# this only exists on linux so either this is linux and it will be found, or 1372# it's not linux and wont 1373dep_m = cc.find_library('m', required : false) 1374 1375# Check for libdrm. Various drivers have different libdrm version requirements, 1376# but we always want to use the same version for all libdrm modules. That means 1377# even if driver foo requires 2.4.0 and driver bar requires 2.4.3, if foo and 1378# bar are both on use 2.4.3 for both of them 1379dep_libdrm_amdgpu = null_dep 1380dep_libdrm_radeon = null_dep 1381dep_libdrm_nouveau = null_dep 1382dep_libdrm_intel = null_dep 1383 1384_drm_amdgpu_ver = '2.4.100' 1385_drm_radeon_ver = '2.4.71' 1386_drm_nouveau_ver = '2.4.102' 1387_drm_intel_ver = '2.4.75' 1388_drm_ver = '2.4.81' 1389 1390_libdrm_checks = [ 1391 ['intel', with_dri_i915 or with_gallium_i915], 1392 ['amdgpu', with_amd_vk or with_gallium_radeonsi], 1393 ['radeon', (with_gallium_radeonsi or with_dri_r100 or with_dri_r200 or 1394 with_gallium_r300 or with_gallium_r600)], 1395 ['nouveau', (with_gallium_nouveau or with_dri_nouveau)], 1396] 1397 1398# VC4 only needs core libdrm support of this version, not a libdrm_vc4 1399# library. 1400if with_gallium_vc4 1401 _drm_ver = '2.4.89' 1402endif 1403 1404# etnaviv only needs core libdrm 1405if with_gallium_etnaviv 1406 _drm_ver = '2.4.89' 1407endif 1408 1409# Loop over the enables versions and get the highest libdrm requirement for all 1410# active drivers. 1411_drm_blame = '' 1412foreach d : _libdrm_checks 1413 ver = get_variable('_drm_@0@_ver'.format(d[0])) 1414 if d[1] and ver.version_compare('>' + _drm_ver) 1415 _drm_ver = ver 1416 _drm_blame = d[0] 1417 endif 1418endforeach 1419if _drm_blame != '' 1420 message('libdrm @0@ needed because @1@ has the highest requirement'.format(_drm_ver, _drm_blame)) 1421endif 1422 1423# Then get each libdrm module 1424foreach d : _libdrm_checks 1425 if d[1] 1426 set_variable( 1427 'dep_libdrm_' + d[0], 1428 dependency('libdrm_' + d[0], version : '>=' + _drm_ver) 1429 ) 1430 endif 1431endforeach 1432 1433with_gallium_drisw_kms = false 1434dep_libdrm = dependency( 1435 'libdrm', version : '>=' + _drm_ver, 1436 # GNU/Hurd includes egl_dri2, without drm. 1437 required : (with_dri2 and host_machine.system() != 'gnu') or with_dri3 1438) 1439if dep_libdrm.found() 1440 pre_args += '-DHAVE_LIBDRM' 1441 if with_dri_platform == 'drm' and with_dri 1442 with_gallium_drisw_kms = true 1443 endif 1444endif 1445 1446llvm_modules = ['bitwriter', 'engine', 'mcdisassembler', 'mcjit', 'core', 'executionengine', 'scalaropts', 'transformutils', 'instcombine'] 1447llvm_optional_modules = ['coroutines'] 1448if with_amd_vk or with_gallium_radeonsi or with_gallium_r600 1449 llvm_modules += ['amdgpu', 'native', 'bitreader', 'ipo'] 1450 if with_gallium_r600 1451 llvm_modules += 'asmparser' 1452 endif 1453endif 1454if with_gallium_opencl 1455 llvm_modules += [ 1456 'all-targets', 'linker', 'coverage', 'instrumentation', 'ipo', 'irreader', 1457 'lto', 'option', 'objcarcopts', 'profiledata', 1458 ] 1459endif 1460 1461if with_amd_vk or with_gallium_radeonsi or with_gallium_opencl 1462 _llvm_version = '>= 8.0.0' 1463elif with_gallium_swr 1464 _llvm_version = '>= 6.0.0' 1465else 1466 _llvm_version = '>= 3.9.0' 1467endif 1468 1469_shared_llvm = get_option('shared-llvm') 1470if _shared_llvm == 'true' 1471 _shared_llvm = 'enabled' 1472 warning('shared_llvm option "true" deprecated, please use "enabled" instead.') 1473elif _shared_llvm == 'false' 1474 _shared_llvm = 'disabled' 1475 warning('shared_llvm option "false" deprecated, please use "disabled" instead.') 1476endif 1477if _shared_llvm == 'auto' 1478 _shared_llvm = (host_machine.system() != 'windows') 1479else 1480 _shared_llvm = (_shared_llvm == 'enabled') 1481endif 1482_llvm = get_option('llvm') 1483if _llvm == 'true' 1484 _llvm = 'enabled' 1485 warning('llvm option "true" deprecated, please use "enabled" instead.') 1486elif _llvm == 'false' 1487 _llvm = 'disabled' 1488 warning('llvm option "false" deprecated, please use "disabled" instead.') 1489endif 1490 1491# the cmake method can only link statically, so don't attempt to use it if we 1492# want to link dynamically. Before 0.54.0 meson will try cmake even when shared 1493# linking is requested, so we need to force the config-tool method to be used 1494# in that case, but in 0.54.0 meson won't try the cmake method if shared 1495# linking is requested. 1496_llvm_method = 'auto' 1497if meson.version().version_compare('< 0.54.0') and _shared_llvm 1498 _llvm_method = 'config-tool' 1499endif 1500 1501dep_llvm = null_dep 1502with_llvm = false 1503if _llvm != 'disabled' 1504 dep_llvm = dependency( 1505 'llvm', 1506 version : _llvm_version, 1507 modules : llvm_modules, 1508 optional_modules : llvm_optional_modules, 1509 required : ( 1510 with_amd_vk or with_gallium_radeonsi or with_gallium_swr or 1511 with_gallium_opencl or _llvm == 'enabled' 1512 ), 1513 static : not _shared_llvm, 1514 method : _llvm_method, 1515 fallback : ['llvm', 'dep_llvm'], 1516 ) 1517 with_llvm = dep_llvm.found() 1518endif 1519if with_llvm 1520 pre_args += '-DLLVM_AVAILABLE' 1521 pre_args += '-DMESA_LLVM_VERSION_STRING="@0@"'.format(dep_llvm.version()) 1522 pre_args += '-DLLVM_IS_SHARED=@0@'.format(_shared_llvm.to_int()) 1523 1524 # LLVM can be built without rtti, turning off rtti changes the ABI of C++ 1525 # programs, so we need to build all C++ code in mesa without rtti as well to 1526 # ensure that linking works. 1527 # 1528 # In meson 0.51.0 we can use cmake to find LLVM in addittion to meson's 1529 # builtin llvm-config based finder. A new generic variable getter method 1530 # has also been added, so we'll use that if we can, to cover the cmake case. 1531 if dep_llvm.type_name() == 'internal' 1532 _rtti = subproject('llvm').get_variable('has_rtti', true) 1533 else 1534 # The CMake finder will return 'ON', the llvm-config will return 'YES' 1535 _rtti = ['ON', 'YES'].contains(dep_llvm.get_variable(cmake : 'LLVM_ENABLE_RTTI', configtool: 'has-rtti')) 1536 endif 1537 if not _rtti 1538 if with_gallium_nouveau 1539 error('The Nouveau driver requires rtti. You either need to turn off nouveau or use an LLVM built with LLVM_ENABLE_RTTI.') 1540 elif with_gallium_opencl 1541 error('The Clover OpenCL state tracker requires rtti, you need to turn off clover or use an LLVM built with LLVM_ENABLE_RTTI.') 1542 endif 1543 if cc.get_id() == 'msvc' 1544 cpp_args += '/GR-' 1545 else 1546 cpp_args += '-fno-rtti' 1547 endif 1548 endif 1549elif with_amd_vk or with_gallium_radeonsi or with_gallium_swr 1550 error('The following drivers require LLVM: Radv, RadeonSI, SWR. One of these is enabled, but LLVM is disabled.') 1551elif with_gallium_opencl 1552 error('The OpenCL "Clover" state tracker requires LLVM, but LLVM is disabled.') 1553endif 1554 1555with_opencl_spirv = _opencl != 'disabled' and get_option('opencl-spirv') 1556if with_opencl_spirv 1557 chosen_llvm_version_array = dep_llvm.version().split('.') 1558 chosen_llvm_version_major = chosen_llvm_version_array[0].to_int() 1559 chosen_llvm_version_minor = chosen_llvm_version_array[1].to_int() 1560 1561 # Require an SPIRV-LLVM-Translator version compatible with the chosen LLVM 1562 # one. 1563 _llvmspirvlib_version = [ 1564 # This first version check is still needed as maybe LLVM 8.0 was picked but 1565 # we do not want to accept SPIRV-LLVM-Translator 8.0.0.1 as that version does 1566 # not have the required API and those are only available starting from 1567 # 8.0.1.3. 1568 '>= 8.0.1.3', 1569 '>= @0@.@1@'.format(chosen_llvm_version_major, chosen_llvm_version_minor), 1570 '< @0@.@1@'.format(chosen_llvm_version_major, chosen_llvm_version_minor + 1) ] 1571 1572 dep_spirv_tools = dependency('SPIRV-Tools', required : true, version : '>= 2018.0') 1573 # LLVMSPIRVLib is available at https://github.com/KhronosGroup/SPIRV-LLVM-Translator 1574 dep_llvmspirvlib = dependency('LLVMSPIRVLib', required : true, version : _llvmspirvlib_version) 1575else 1576 dep_spirv_tools = null_dep 1577 dep_llvmspirvlib = null_dep 1578endif 1579 1580if (with_amd_vk or with_gallium_radeonsi or with_gallium_opencl or 1581 (with_gallium_r600 and with_llvm)) 1582 dep_elf = dependency('libelf', required : false) 1583 if not dep_elf.found() 1584 dep_elf = cc.find_library('elf') 1585 endif 1586else 1587 dep_elf = null_dep 1588endif 1589 1590dep_glvnd = null_dep 1591if with_glvnd 1592 dep_glvnd = dependency('libglvnd', version : '>= 1.3.2') 1593 pre_args += '-DUSE_LIBGLVND=1' 1594endif 1595 1596_valgrind = get_option('valgrind') 1597if _valgrind == 'true' 1598 _valgrind = 'enabled' 1599 warning('valgrind option "true" deprecated, please use "enabled" instead.') 1600elif _valgrind == 'false' 1601 _valgrind = 'disabled' 1602 warning('valgrind option "false" deprecated, please use "disabled" instead.') 1603endif 1604if _valgrind != 'disabled' 1605 dep_valgrind = dependency('valgrind', required : _valgrind == 'enabled') 1606 if dep_valgrind.found() 1607 pre_args += '-DHAVE_VALGRIND' 1608 endif 1609else 1610 dep_valgrind = null_dep 1611endif 1612 1613# pthread stubs. Lets not and say we didn't 1614 1615if host_machine.system() == 'windows' 1616 # Prefer the winflexbison versions, they're much easier to install and have 1617 # better windows support. 1618 1619 prog_flex = find_program('win_flex', required : false) 1620 if prog_flex.found() 1621 # windows compatibility (uses <io.h> instead of <unistd.h> and _isatty, 1622 # _fileno functions) 1623 prog_flex = [prog_flex, '--wincompat', '-D__STDC_VERSION__=199901'] 1624 else 1625 prog_flex = [find_program('lex', 'flex', required : with_any_opengl)] 1626 endif 1627 # Force flex to use const keyword in prototypes, as relies on __cplusplus or 1628 # __STDC__ macro to determine whether it's safe to use const keyword, but 1629 # MSVC never defines __STDC__ unless we disable all MSVC extensions. 1630 prog_flex += '-DYY_USE_CONST=' 1631 1632 prog_bison = find_program('win_bison', required : false) 1633 if not prog_bison.found() 1634 prog_bison = find_program('yacc', 'bison', required : with_any_opengl) 1635 endif 1636else 1637 prog_bison = find_program('bison', required : with_any_opengl) 1638 1639 # Disable deprecated keyword warnings, since we have to use them for 1640 # old-bison compat. See discussion in 1641 # https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2161 1642 if find_program('bison', required : false, version : '> 2.3').found() 1643 prog_bison = [prog_bison, '-Wno-deprecated'] 1644 endif 1645 1646 prog_flex = find_program('flex', required : with_any_opengl) 1647endif 1648 1649dep_selinux = null_dep 1650if get_option('selinux') 1651 dep_selinux = dependency('libselinux') 1652 pre_args += '-DMESA_SELINUX' 1653endif 1654 1655_libunwind = get_option('libunwind') 1656if _libunwind == 'true' 1657 _libunwind = 'enabled' 1658 warning('libunwind option "true" deprecated, please use "enabled" instead.') 1659elif _libunwind == 'false' 1660 _libunwind = 'disabled' 1661 warning('libunwind option "false" deprecated, please use "disabled" instead.') 1662endif 1663if _libunwind != 'disabled' and not with_platform_android 1664 dep_unwind = dependency('libunwind', required : _libunwind == 'enabled') 1665 if dep_unwind.found() 1666 pre_args += '-DHAVE_LIBUNWIND' 1667 endif 1668else 1669 dep_unwind = null_dep 1670endif 1671 1672if with_osmesa != 'none' 1673 if with_osmesa == 'gallium' and not with_gallium_softpipe 1674 error('OSMesa gallium requires gallium softpipe or llvmpipe.') 1675 endif 1676 if host_machine.system() == 'windows' 1677 osmesa_lib_name = 'osmesa' 1678 else 1679 osmesa_lib_name = 'OSMesa' 1680 endif 1681 osmesa_bits = get_option('osmesa-bits') 1682 if osmesa_bits != '8' 1683 if with_dri or with_glx != 'disabled' 1684 error('OSMesa bits must be 8 if building glx or dri based drivers') 1685 endif 1686 osmesa_lib_name = osmesa_lib_name + osmesa_bits 1687 pre_args += [ 1688 '-DCHAN_BITS=@0@'.format(osmesa_bits), '-DDEFAULT_SOFTWARE_DEPTH_BITS=31' 1689 ] 1690 endif 1691endif 1692 1693# TODO: symbol mangling 1694 1695if with_platform_wayland 1696 dep_wl_scanner = dependency('wayland-scanner', native: true) 1697 prog_wl_scanner = find_program(dep_wl_scanner.get_pkgconfig_variable('wayland_scanner')) 1698 if dep_wl_scanner.version().version_compare('>= 1.15') 1699 wl_scanner_arg = 'private-code' 1700 else 1701 wl_scanner_arg = 'code' 1702 endif 1703 dep_wl_protocols = dependency('wayland-protocols', version : '>= 1.8') 1704 dep_wayland_client = dependency('wayland-client', version : '>=1.11') 1705 dep_wayland_server = dependency('wayland-server', version : '>=1.11') 1706 if with_egl 1707 dep_wayland_egl = dependency('wayland-egl-backend', version : '>= 3') 1708 dep_wayland_egl_headers = dep_wayland_egl.partial_dependency(compile_args : true) 1709 endif 1710 wayland_dmabuf_xml = join_paths( 1711 dep_wl_protocols.get_pkgconfig_variable('pkgdatadir'), 'unstable', 1712 'linux-dmabuf', 'linux-dmabuf-unstable-v1.xml' 1713 ) 1714 pre_args += ['-DHAVE_WAYLAND_PLATFORM', '-DWL_HIDE_DEPRECATED'] 1715endif 1716 1717dep_x11 = null_dep 1718dep_xext = null_dep 1719dep_xdamage = null_dep 1720dep_xfixes = null_dep 1721dep_x11_xcb = null_dep 1722dep_xcb = null_dep 1723dep_xcb_glx = null_dep 1724dep_xcb_dri2 = null_dep 1725dep_xcb_dri3 = null_dep 1726dep_dri2proto = null_dep 1727dep_glproto = null_dep 1728dep_xxf86vm = null_dep 1729dep_xcb_dri3 = null_dep 1730dep_xcb_present = null_dep 1731dep_xcb_sync = null_dep 1732dep_xcb_xfixes = null_dep 1733dep_xshmfence = null_dep 1734dep_xcb_xrandr = null_dep 1735dep_xcb_shm = null_dep 1736dep_xlib_xrandr = null_dep 1737if with_platform_x11 1738 if with_glx == 'xlib' or with_glx == 'gallium-xlib' 1739 dep_x11 = dependency('x11') 1740 dep_xext = dependency('xext') 1741 dep_xcb = dependency('xcb') 1742 elif with_glx == 'dri' 1743 dep_x11 = dependency('x11') 1744 dep_xext = dependency('xext') 1745 dep_xdamage = dependency('xdamage', version : '>= 1.1') 1746 dep_xfixes = dependency('xfixes', version : '>= 2.0') 1747 dep_xcb_glx = dependency('xcb-glx', version : '>= 1.8.1') 1748 dep_xcb_shm = dependency('xcb-shm') 1749 endif 1750 if (with_any_vk or with_glx == 'dri' or with_egl or 1751 (with_gallium_vdpau or with_gallium_xvmc or with_gallium_va or 1752 with_gallium_omx != 'disabled')) 1753 dep_xcb = dependency('xcb') 1754 dep_x11_xcb = dependency('x11-xcb') 1755 if with_dri_platform == 'drm' and not dep_libdrm.found() 1756 error('libdrm required for gallium video statetrackers when using x11') 1757 endif 1758 endif 1759 if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm') 1760 dep_xcb_dri2 = dependency('xcb-dri2', version : '>= 1.8') 1761 1762 if with_dri3 1763 pre_args += '-DHAVE_DRI3' 1764 dep_xcb_dri3 = dependency('xcb-dri3') 1765 dep_xcb_present = dependency('xcb-present') 1766 # until xcb-dri3 has been around long enough to make a hard-dependency: 1767 if (dep_xcb_dri3.version().version_compare('>= 1.13') and 1768 dep_xcb_present.version().version_compare('>= 1.13')) 1769 pre_args += '-DHAVE_DRI3_MODIFIERS' 1770 endif 1771 dep_xcb_sync = dependency('xcb-sync') 1772 dep_xshmfence = dependency('xshmfence', version : '>= 1.1') 1773 endif 1774 endif 1775 if with_glx == 'dri' or with_glx == 'gallium-xlib' 1776 dep_glproto = dependency('glproto', version : '>= 1.4.14') 1777 endif 1778 if with_glx == 'dri' 1779 if with_dri_platform == 'drm' 1780 dep_dri2proto = dependency('dri2proto', version : '>= 2.8') 1781 if with_glx_direct 1782 dep_xxf86vm = dependency('xxf86vm') 1783 endif 1784 endif 1785 endif 1786 if (with_egl or 1787 with_dri3 or ( 1788 with_gallium_vdpau or with_gallium_xvmc or with_gallium_xa or 1789 with_gallium_omx != 'disabled')) 1790 dep_xcb_xfixes = dependency('xcb-xfixes') 1791 endif 1792 if with_xlib_lease 1793 dep_xcb_xrandr = dependency('xcb-randr') 1794 dep_xlib_xrandr = dependency('xrandr', version : '>= 1.3') 1795 endif 1796endif 1797 1798if get_option('gallium-extra-hud') 1799 pre_args += '-DHAVE_GALLIUM_EXTRA_HUD=1' 1800endif 1801 1802_sensors = get_option('lmsensors') 1803if _sensors == 'true' 1804 _sensors = 'enabled' 1805 warning('lmsensors option "true" deprecated, please use "enabled" instead.') 1806elif _sensors == 'false' 1807 _sensors = 'disabled' 1808 warning('lmsensors option "false" deprecated, please use "disabled" instead.') 1809endif 1810if _sensors != 'disabled' 1811 dep_lmsensors = cc.find_library('sensors', required : _sensors == 'enabled') 1812 if dep_lmsensors.found() 1813 pre_args += '-DHAVE_LIBSENSORS=1' 1814 endif 1815else 1816 dep_lmsensors = null_dep 1817endif 1818 1819# If the compiler supports it, put function and data symbols in their 1820# own sections and GC the sections after linking. This lets drivers 1821# drop shared code unused by that specific driver (particularly 1822# relevant for Vulkan drivers). 1823if cc.has_link_argument('-Wl,--gc-sections') 1824 foreach a: ['-ffunction-sections', '-fdata-sections'] 1825 if cc.has_argument(a) 1826 add_project_arguments(a, language : ['c', 'cpp']) 1827 endif 1828 endforeach 1829endif 1830 1831foreach a : pre_args 1832 add_project_arguments(a, language : ['c', 'cpp']) 1833endforeach 1834foreach a : c_args 1835 add_project_arguments(a, language : ['c']) 1836endforeach 1837foreach a : cpp_args 1838 add_project_arguments(a, language : ['cpp']) 1839endforeach 1840 1841gl_priv_reqs = [] 1842 1843if with_glx == 'xlib' or with_glx == 'gallium-xlib' 1844 gl_priv_reqs += ['x11', 'xext', 'xcb'] 1845elif with_glx == 'dri' 1846 gl_priv_reqs += [ 1847 'x11', 'xext', 'xdamage >= 1.1', 'xfixes', 'x11-xcb', 'xcb', 1848 'xcb-glx >= 1.8.1'] 1849 if with_dri_platform == 'drm' 1850 gl_priv_reqs += 'xcb-dri2 >= 1.8' 1851 if with_glx_direct 1852 gl_priv_reqs += 'xxf86vm' 1853 endif 1854 endif 1855endif 1856if dep_libdrm.found() 1857 gl_priv_reqs += 'libdrm >= 2.4.75' 1858endif 1859 1860gl_priv_libs = [] 1861if dep_thread.found() 1862 gl_priv_libs += ['-lpthread', '-pthread'] 1863endif 1864if dep_m.found() 1865 gl_priv_libs += '-lm' 1866endif 1867if dep_dl.found() 1868 gl_priv_libs += '-ldl' 1869endif 1870 1871# FIXME: autotools lists this as incomplete 1872gbm_priv_libs = [] 1873if dep_dl.found() 1874 gbm_priv_libs += '-ldl' 1875endif 1876 1877pkg = import('pkgconfig') 1878 1879if host_machine.system() == 'windows' 1880 prog_dumpbin = find_program('dumpbin', required : false) 1881 with_symbols_check = prog_dumpbin.found() and with_tests 1882 symbols_check_args = ['--dumpbin', prog_dumpbin.path()] 1883else 1884 prog_nm = find_program('nm') 1885 with_symbols_check = with_tests 1886 symbols_check_args = ['--nm', prog_nm.path()] 1887endif 1888 1889# This quirk needs to be applied to sources with functions defined in assembly 1890# as GCC LTO drops them. See: https://bugs.freedesktop.org/show_bug.cgi?id=109391 1891gcc_lto_quirk = (cc.get_id() == 'gcc') ? ['-fno-lto'] : [] 1892 1893subdir('include') 1894subdir('bin') 1895subdir('src') 1896 1897# Meson 0.49 and earlier seems to have a bug that fails to evaluate the string- 1898# formatting below unless the first argument is passed as a variable. This has 1899# been fixed in Meson 0.50 and beyond, but we need to keep it like this for now 1900# for backwards compatibility. 1901_with_opengl_string = with_opengl ? 'yes' : 'no' 1902 1903lines = ['', 1904 'prefix: ' + get_option('prefix'), 1905 'libdir: ' + get_option('libdir'), 1906 'includedir: ' + get_option('includedir'), 1907 '', 1908 'OpenGL: @0@ (ES1: @1@ ES2: @2@)'.format(_with_opengl_string, 1909 with_gles1 ? 'yes' : 'no', 1910 with_gles2 ? 'yes' : 'no'), 1911] 1912 1913if with_osmesa != 'none' 1914 lines += '' 1915 suffix = '' 1916 if with_osmesa == 'gallium' 1917 suffix = '(Gallium)' 1918 endif 1919 lines += 'OSMesa: lib' + osmesa_lib_name + suffix 1920else 1921 lines += 'OSMesa: no' 1922endif 1923 1924if with_dri 1925 lines += '' 1926 lines += 'DRI platform: ' + with_dri_platform 1927 if dri_drivers.length() != 0 and dri_drivers != [''] 1928 lines += 'DRI drivers: ' + ' '.join(dri_drivers) 1929 else 1930 lines += 'DRI drivers: no' 1931 endif 1932 lines += 'DRI driver dir: ' + dri_drivers_path 1933endif 1934 1935if with_glx != 'disabled' 1936 lines += '' 1937 if with_glx == 'dri' 1938 lines += 'GLX: DRI-based' 1939 elif with_glx == 'xlib' 1940 lines += 'GLX: Xlib-based' 1941 elif with_glx == 'gallium-xlib' 1942 lines += 'GLX: Xlib-based (Gallium)' 1943 else 1944 lines += 'GLX: ' + with_glx 1945 endif 1946endif 1947 1948lines += '' 1949lines += 'EGL: ' + (with_egl ? 'yes' : 'no') 1950if with_egl 1951 egl_drivers = [] 1952 if with_dri 1953 egl_drivers += 'builtin:egl_dri2' 1954 endif 1955 if with_dri3 1956 egl_drivers += 'builtin:egl_dri3' 1957 endif 1958 lines += 'EGL drivers: ' + ' '.join(egl_drivers) 1959endif 1960lines += 'GBM: ' + (with_gbm ? 'yes' : 'no') 1961if with_egl or with_any_vk 1962 _platforms += 'surfaceless' 1963 if with_gbm 1964 _platforms += 'drm' 1965 endif 1966 lines += 'EGL/Vulkan/VL platforms: ' + ' '.join(_platforms) 1967endif 1968 1969lines += '' 1970if with_any_vk 1971 lines += 'Vulkan drivers: ' + ' '.join(_vulkan_drivers) 1972 lines += 'Vulkan ICD dir: ' + with_vulkan_icd_dir 1973else 1974 lines += 'Vulkan drivers: no' 1975endif 1976 1977lines += '' 1978if with_llvm 1979 lines += 'llvm: yes' 1980 lines += 'llvm-version: ' + dep_llvm.version() 1981else 1982 lines += 'llvm: no' 1983endif 1984 1985lines += '' 1986if with_gallium 1987 lines += 'Gallium drivers: ' + ' '.join(gallium_drivers) 1988 gallium_st = ['mesa'] 1989 if with_gallium_xa 1990 gallium_st += 'xa' 1991 endif 1992 if with_gallium_xvmc 1993 gallium_st += 'xvmc' 1994 endif 1995 if with_gallium_xvmc 1996 gallium_st += 'xvmc' 1997 endif 1998 if with_gallium_vdpau 1999 gallium_st += 'vdpau' 2000 endif 2001 if with_gallium_omx != 'disabled' 2002 gallium_st += 'omx' + with_gallium_omx 2003 endif 2004 if with_gallium_va 2005 gallium_st += 'va' 2006 endif 2007 if with_gallium_st_nine 2008 gallium_st += 'nine' 2009 endif 2010 if with_gallium_opencl 2011 gallium_st += 'clover' 2012 endif 2013 lines += 'Gallium st: ' + ' '.join(gallium_st) 2014else 2015 lines += 'Gallium: no' 2016endif 2017 2018lines += 'HUD lmsensors: ' + (dep_lmsensors.found() ? 'yes' : 'no') 2019 2020lines += '' 2021lines += 'Shared-glapi: ' + (with_shared_glapi ? 'yes' : 'no') 2022 2023 2024indent = ' ' 2025summary = indent + ('\n' + indent).join(lines) 2026message('Configuration summary:\n@0@\n'.format(summary)) 2027