X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=meson.build;h=b8c19999f019e7e8cf02707cbac978eeedcde0ca;hb=7e0e53a077850ecb1ff86c481475f8fd79fb51fc;hp=ff529d339226ebfa426eef0f9332a4bf2222609e;hpb=5157a4276500c77e2210e853b262be1d1b30aedf;p=mesa.git diff --git a/meson.build b/meson.build index ff529d33922..b8c19999f01 100644 --- a/meson.build +++ b/meson.build @@ -25,8 +25,8 @@ project( [find_program('python', 'python2', 'python3'), 'bin/meson_get_version.py'] ).stdout(), license : 'MIT', - meson_version : '>= 0.45', - default_options : ['buildtype=debugoptimized', 'b_ndebug=if-release', 'c_std=c99', 'cpp_std=c++11'] + meson_version : '>= 0.46', + default_options : ['buildtype=debugoptimized', 'b_ndebug=if-release', 'c_std=c99', 'cpp_std=c++14'] ) cc = meson.get_compiler('c') @@ -49,14 +49,24 @@ with_vulkan_icd_dir = get_option('vulkan-icd-dir') with_tests = get_option('build-tests') with_valgrind = get_option('valgrind') with_libunwind = get_option('libunwind') -with_asm = get_option('asm') with_glx_read_only_text = get_option('glx-read-only-text') with_glx_direct = get_option('glx-direct') with_osmesa = get_option('osmesa') with_swr_arches = get_option('swr-arches') with_tools = get_option('tools') if with_tools.contains('all') - with_tools = ['etnaviv', 'freedreno', 'glsl', 'intel', 'nir', 'nouveau', 'xvmc'] + with_tools = [ + 'drm-shim', + 'etnaviv', + 'freedreno', + 'glsl', + 'intel', + 'intel-ui', + 'lima', + 'nir', + 'nouveau', + 'xvmc', + ] endif dri_drivers_path = get_option('dri-drivers-path') @@ -79,7 +89,14 @@ if host_machine.system() == 'windows' endif endif with_opengl = get_option('opengl') -with_shared_glapi = get_option('shared-glapi') + +# Default shared glapi off for windows, on elsewhere. +_sg = get_option('shared-glapi') +if _sg == 'auto' + with_shared_glapi = host_machine.system() != 'windows' +else + with_shared_glapi = _sg == 'true' +endif # shared-glapi is required if at least two OpenGL APIs are being built if not with_shared_glapi @@ -105,9 +122,9 @@ with_gles1 = with_gles1 != 'false' with_gles2 = with_gles2 != 'false' with_any_opengl = with_opengl or with_gles1 or with_gles2 # Only build shared_glapi if at least one OpenGL API is enabled -with_shared_glapi = get_option('shared-glapi') and with_any_opengl +with_shared_glapi = with_shared_glapi and with_any_opengl -system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'dragonfly', 'linux'].contains(host_machine.system()) +system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'gnu/kfreebsd', 'dragonfly', 'linux'].contains(host_machine.system()) dri_drivers = get_option('dri-drivers') if dri_drivers.contains('auto') @@ -150,7 +167,7 @@ if gallium_drivers.contains('auto') elif ['arm', 'aarch64'].contains(host_machine.cpu_family()) gallium_drivers = [ 'kmsro', 'v3d', 'vc4', 'freedreno', 'etnaviv', 'nouveau', - 'tegra', 'virgl', 'lima', 'swrast' + 'tegra', 'virgl', 'lima', 'panfrost', 'swrast' ] else error('Unknown architecture @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format( @@ -244,6 +261,7 @@ endif if host_machine.system() == 'darwin' with_dri_platform = 'apple' + pre_args += '-DBUILDING_MESA' elif ['windows', 'cygwin'].contains(host_machine.system()) with_dri_platform = 'windows' elif system_has_kms_drm @@ -259,10 +277,12 @@ _platforms = get_option('platforms') if _platforms.contains('auto') if system_has_kms_drm _platforms = ['x11', 'wayland', 'drm', 'surfaceless'] - elif ['darwin', 'windows', 'cygwin'].contains(host_machine.system()) + elif ['darwin', 'cygwin'].contains(host_machine.system()) _platforms = ['x11', 'surfaceless'] elif ['haiku'].contains(host_machine.system()) _platforms = ['haiku'] + elif host_machine.system() == 'windows' + _platforms = ['windows'] else error('Unknown OS @0@. Please pass -Dplatforms to set platforms. Patches gladly accepted to fix this.'.format( host_machine.system())) @@ -275,6 +295,7 @@ with_platform_wayland = _platforms.contains('wayland') with_platform_drm = _platforms.contains('drm') with_platform_haiku = _platforms.contains('haiku') with_platform_surfaceless = _platforms.contains('surfaceless') +with_platform_windows = _platforms.contains('windows') with_platforms = false if _platforms.length() != 0 and _platforms != [''] @@ -299,6 +320,8 @@ if with_glx == 'auto' with_glx = 'dri' elif with_platform_haiku with_glx = 'disabled' + elif host_machine.system() == 'windows' + with_glx = 'disabled' elif with_gallium # Even when building just gallium drivers the user probably wants dri with_glx = 'dri' @@ -316,7 +339,7 @@ if with_glx == 'dri' endif endif -if not (with_dri or with_gallium or with_glx == 'xlib' or with_glx == 'gallium-xlib') +if not (with_dri or with_gallium or with_glx != 'disabled') with_gles1 = false with_gles2 = false with_opengl = false @@ -366,7 +389,11 @@ if with_egl and not (with_platform_drm or with_platform_surfaceless or with_plat endif endif -pre_args += '-DGLX_USE_TLS' +# Android uses emutls for versions <= P/28. For USE_ELF_TLS we need ELF TLS. +if not with_platform_android or get_option('platform-sdk-version') >= 29 + pre_args += '-DUSE_ELF_TLS' +endif + if with_glx != 'disabled' if not (with_platform_x11 and with_any_opengl) error('Cannot build GLX support without X11 platform support and at least one OpenGL API') @@ -383,9 +410,7 @@ if with_glx != 'disabled' error('xlib conflicts with any dri driver') endif elif with_glx == 'dri' - if not with_dri - error('dri based GLX requires at least one DRI driver') - elif not with_shared_glapi + if not with_shared_glapi error('dri based GLX requires shared-glapi') endif endif @@ -393,7 +418,9 @@ endif with_glvnd = get_option('glvnd') if with_glvnd - if with_glx == 'xlib' or with_glx == 'gallium-xlib' + if with_platform_windows + error('glvnd cannot be used on Windows') + elif with_glx == 'xlib' or with_glx == 'gallium-xlib' error('Cannot build glvnd support for GLX that is not DRI based.') elif with_glx == 'disabled' and not with_egl error('glvnd requires DRI based GLX and/or EGL') @@ -746,7 +773,11 @@ if with_platform_haiku pre_args += '-DHAVE_HAIKU_PLATFORM' endif -prog_python = import('python3').find_python() +if meson.version().version_compare('>=0.50') + prog_python = import('python').find_installation('python3') +else + prog_python = import('python3').find_python() +endif has_mako = run_command( prog_python, '-c', ''' @@ -762,6 +793,11 @@ if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.4.6') error('When using GCC, version 4.4.6 or later is required.') endif +# Support systems without ETIME (e.g. FreeBSD) +if cc.get_define('ETIME', prefix : '#include ') == '' + pre_args += '-DETIME=ETIMEDOUT' +endif + # Define DEBUG for debug builds only (debugoptimized is not included on this one) if get_option('buildtype') == 'debug' pre_args += '-DDEBUG' @@ -832,7 +868,7 @@ if cc.compiles('__uint128_t foo(void) { return 0; }', endif # TODO: this is very incomplete -if ['linux', 'cygwin', 'gnu'].contains(host_machine.system()) +if ['linux', 'cygwin', 'gnu', 'gnu/kfreebsd'].contains(host_machine.system()) pre_args += '-D_GNU_SOURCE' endif @@ -968,69 +1004,42 @@ endif # TODO: shared/static? Is this even worth doing? -# When cross compiling we generally need to turn off the use of assembly, -# because mesa's assembly relies on building an executable for the host system, -# and running it to get information about struct sizes. There is at least one -# case of cross compiling where we can use asm, and that's x86_64 -> x86 when -# host OS == build OS, since in that case the build machine can run the host's -# binaries. -if with_asm and meson.is_cross_build() - if build_machine.system() != host_machine.system() - # TODO: It may be possible to do this with an exe_wrapper (like wine). - message('Cross compiling from one OS to another, disabling assembly.') - with_asm = false - elif not (build_machine.cpu_family().startswith('x86') and host_machine.cpu_family() == 'x86') - # FIXME: Gentoo always sets -m32 for x86_64 -> x86 builds, resulting in an - # x86 -> x86 cross compile. We use startswith rather than == to handle this - # case. - # TODO: There may be other cases where the 64 bit version of the - # architecture can run 32 bit binaries (aarch64 and armv7 for example) - message(''' - Cross compiling to different architectures, and the host cannot run - the build machine's binaries. Disabling assembly. - ''') - with_asm = false - endif -endif - with_asm_arch = '' -if with_asm - if host_machine.cpu_family() == 'x86' - if system_has_kms_drm or host_machine.system() == 'gnu' - with_asm_arch = 'x86' - pre_args += ['-DUSE_X86_ASM', '-DUSE_MMX_ASM', '-DUSE_3DNOW_ASM', - '-DUSE_SSE_ASM'] - - if with_glx_read_only_text - pre_args += ['-DGLX_X86_READONLY_TEXT'] - endif - endif - elif host_machine.cpu_family() == 'x86_64' - if system_has_kms_drm - with_asm_arch = 'x86_64' - pre_args += ['-DUSE_X86_64_ASM'] - endif - elif host_machine.cpu_family() == 'arm' - if system_has_kms_drm - with_asm_arch = 'arm' - pre_args += ['-DUSE_ARM_ASM'] - endif - elif host_machine.cpu_family() == 'aarch64' - if system_has_kms_drm - with_asm_arch = 'aarch64' - pre_args += ['-DUSE_AARCH64_ASM'] - endif - elif host_machine.cpu_family() == 'sparc64' - if system_has_kms_drm - with_asm_arch = 'sparc' - pre_args += ['-DUSE_SPARC_ASM'] - endif - elif host_machine.cpu_family().startswith('ppc64') and host_machine.endian() == 'little' - if system_has_kms_drm - with_asm_arch = 'ppc64le' - pre_args += ['-DUSE_PPC64LE_ASM'] +if host_machine.cpu_family() == 'x86' + if system_has_kms_drm or host_machine.system() == 'gnu' + with_asm_arch = 'x86' + pre_args += ['-DUSE_X86_ASM', '-DUSE_MMX_ASM', '-DUSE_3DNOW_ASM', + '-DUSE_SSE_ASM'] + + if with_glx_read_only_text + pre_args += ['-DGLX_X86_READONLY_TEXT'] endif endif +elif host_machine.cpu_family() == 'x86_64' + if system_has_kms_drm + with_asm_arch = 'x86_64' + pre_args += ['-DUSE_X86_64_ASM'] + endif +elif host_machine.cpu_family() == 'arm' + if system_has_kms_drm + with_asm_arch = 'arm' + pre_args += ['-DUSE_ARM_ASM'] + endif +elif host_machine.cpu_family() == 'aarch64' + if system_has_kms_drm + with_asm_arch = 'aarch64' + pre_args += ['-DUSE_AARCH64_ASM'] + endif +elif host_machine.cpu_family() == 'sparc64' + if system_has_kms_drm + with_asm_arch = 'sparc' + pre_args += ['-DUSE_SPARC_ASM'] + endif +elif host_machine.cpu_family().startswith('ppc64') and host_machine.endian() == 'little' + if system_has_kms_drm + with_asm_arch = 'ppc64le' + pre_args += ['-DUSE_PPC64LE_ASM'] + endif endif # Check for standard headers and functions @@ -1040,18 +1049,25 @@ elif cc.has_header_symbol('sys/mkdev.h', 'major') pre_args += '-DMAJOR_IN_MKDEV' endif -foreach h : ['xlocale.h', 'sys/sysctl.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'execinfo.h', 'sys/shm.h'] +foreach h : ['xlocale.h', 'sys/sysctl.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'execinfo.h', 'sys/shm.h', 'cet.h'] if cc.compiles('#include <@0@>'.format(h), name : '@0@'.format(h)) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) endif endforeach -foreach f : ['strtof', 'mkostemp', 'posix_memalign', 'timespec_get', 'memfd_create'] +foreach f : ['strtof', 'mkostemp', 'posix_memalign', 'timespec_get', 'memfd_create', 'random_r'] if cc.has_function(f) pre_args += '-DHAVE_@0@'.format(f.to_upper()) endif endforeach +if cc.has_header_symbol('errno.h', 'program_invocation_name', + args : '-D_GNU_SOURCE') + pre_args += '-DHAVE_PROGRAM_INVOCATION_NAME' +elif with_tools.contains('intel') + error('Intel tools require the program_invocation_name variable') +endif + # strtod locale support if cc.links(''' #define _GNU_SOURCE @@ -1104,14 +1120,15 @@ if build_machine.system() != 'darwin' endif # check for dl support -if cc.has_function('dlopen') - dep_dl = null_dep -else - dep_dl = cc.find_library('dl') -endif -if cc.has_function('dladdr', dependencies : dep_dl) - # This is really only required for megadrivers - pre_args += '-DHAVE_DLADDR' +dep_dl = null_dep +if host_machine.system() != 'windows' + if not cc.has_function('dlopen') + dep_dl = cc.find_library('dl') + endif + if cc.has_function('dladdr', dependencies : dep_dl) + # This is really only required for megadrivers + pre_args += '-DHAVE_DLADDR' + endif endif if cc.has_function('dl_iterate_phdr') @@ -1130,7 +1147,7 @@ else endif # TODO: some of these may be conditional -dep_zlib = dependency('zlib', version : '>= 1.2.3') +dep_zlib = dependency('zlib', version : '>= 1.2.3', fallback : ['zlib', 'zlib_dep']) pre_args += '-DHAVE_ZLIB' dep_thread = dependency('threads') if dep_thread.found() and host_machine.system() != 'windows' @@ -1142,8 +1159,14 @@ if dep_thread.found() and host_machine.system() != 'windows' args : '-D_GNU_SOURCE') pre_args += '-DHAVE_PTHREAD_SETAFFINITY' endif + if cc.has_function( + 'pthread_setaffinity_np', + dependencies : dep_thread, + prefix : '#include ') + pre_args += '-DPTHREAD_SETAFFINITY_IN_NP_HEADER' + endif endif -dep_expat = dependency('expat') +dep_expat = dependency('expat', fallback : ['expat', 'expat_dep']) # this only exists on linux so either this is linux and it will be found, or # it's not linux and wont dep_m = cc.find_library('m', required : false) @@ -1157,11 +1180,11 @@ dep_libdrm_radeon = null_dep dep_libdrm_nouveau = null_dep dep_libdrm_intel = null_dep -_drm_amdgpu_ver = '2.4.97' +_drm_amdgpu_ver = '2.4.99' _drm_radeon_ver = '2.4.71' _drm_nouveau_ver = '2.4.66' _drm_intel_ver = '2.4.75' -_drm_ver = '2.4.75' +_drm_ver = '2.4.81' _libdrm_checks = [ ['intel', with_dri_i915 or with_gallium_i915], @@ -1235,13 +1258,11 @@ if with_gallium_opencl endif if with_amd_vk or with_gallium_radeonsi - _llvm_version = '>= 7.0.0' + _llvm_version = '>= 8.0.0' elif with_gallium_swr _llvm_version = '>= 6.0.0' -elif with_gallium_opencl or with_gallium_r600 - _llvm_version = '>= 3.9.0' else - _llvm_version = '>= 3.3.0' + _llvm_version = '>= 3.9.0' endif _shared_llvm = get_option('shared-llvm') @@ -1260,30 +1281,18 @@ if _llvm != 'false' with_gallium_opencl or _llvm == 'true' ), static : not _shared_llvm, + method : 'config-tool', ) with_llvm = dep_llvm.found() endif if with_llvm - _llvm_version = dep_llvm.version().split('.') - pre_args += [ - '-DHAVE_LLVM=0x0@0@0@1@'.format(_llvm_version[0], _llvm_version[1]), - '-DMESA_LLVM_VERSION_STRING="@0@"'.format(dep_llvm.version()), - ] + pre_args += '-DLLVM_AVAILABLE' + pre_args += '-DMESA_LLVM_VERSION_STRING="@0@"'.format(dep_llvm.version()) # LLVM can be built without rtti, turning off rtti changes the ABI of C++ # programs, so we need to build all C++ code in mesa without rtti as well to # ensure that linking works. - # - # In meson 0.51.0 we can use cmake to find LLVM in addittion to meson's - # builtin llvm-config based finder. A new generic variable getter method - # has also been added, so we'll use that if we can, to cover the cmake case. - if meson.version().version_compare('>=0.51') - # The CMake finder will return 'ON', the llvm-config will return 'YES' - _rtti = ['ON', 'YES'].contains(dep_llvm.get_variable(cmake : 'LLVM_ENABLE_RTTI', configtool: 'has-rtti')) - else - _rtti = dep_llvm.get_configtool_variable('has-rtti') == 'YES' - endif - if not _rtti + if dep_llvm.get_configtool_variable('has-rtti') == 'NO' if with_gallium_nouveau error('The Nouveau driver requires rtti. You either need to turn off nouveau or use an LLVM built with LLVM_ENABLE_RTTI.') elif with_gallium_opencl @@ -1343,9 +1352,6 @@ else endif if with_osmesa != 'none' - if with_osmesa == 'classic' and not with_dri_swrast - error('OSMesa classic requires dri (classic) swrast.') - endif if with_osmesa == 'gallium' and not with_gallium_softpipe error('OSMesa gallium requires gallium softpipe or llvmpipe.') endif @@ -1515,10 +1521,6 @@ endif pkg = import('pkgconfig') prog_nm = find_program('nm', required : false) -env_test = environment() -if prog_nm.found() - env_test.set('NM', prog_nm.path()) -endif # This quirk needs to be applied to sources with functions defined in assembly # as GCC LTO drops them. See: https://bugs.freedesktop.org/show_bug.cgi?id=109391 @@ -1544,8 +1546,8 @@ lines = ['', with_gles2 ? 'yes' : 'no'), ] -lines += '' if with_osmesa != 'none' + lines += '' suffix = '' if with_osmesa == 'gallium' suffix = '(Gallium)' @@ -1555,8 +1557,8 @@ else lines += 'OSMesa: no' endif -lines += '' if with_dri + lines += '' lines += 'DRI platform: ' + with_dri_platform if dri_drivers.length() != 0 and dri_drivers != [''] lines += 'DRI drivers: ' + ' '.join(dri_drivers) @@ -1566,8 +1568,8 @@ if with_dri lines += 'DRI driver dir: ' + dri_drivers_path endif -lines += '' if with_glx != 'disabled' + lines += '' if with_glx == 'dri' lines += 'GLX: DRI-based' elif with_glx == 'xlib'