meson.build revision bbff01ce
100a23bdaSmrg# Copyright © 2017-2018 Intel Corporation 200a23bdaSmrg 300a23bdaSmrg# Permission is hereby granted, free of charge, to any person obtaining a copy 400a23bdaSmrg# of this software and associated documentation files (the "Software"), to deal 500a23bdaSmrg# in the Software without restriction, including without limitation the rights 600a23bdaSmrg# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 700a23bdaSmrg# copies of the Software, and to permit persons to whom the Software is 800a23bdaSmrg# furnished to do so, subject to the following conditions: 900a23bdaSmrg 1000a23bdaSmrg# The above copyright notice and this permission notice shall be included in 1100a23bdaSmrg# all copies or substantial portions of the Software. 1200a23bdaSmrg 1300a23bdaSmrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1400a23bdaSmrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1500a23bdaSmrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1600a23bdaSmrg# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1700a23bdaSmrg# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1800a23bdaSmrg# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1900a23bdaSmrg# SOFTWARE. 2000a23bdaSmrg 2100a23bdaSmrgproject( 2200a23bdaSmrg 'libdrm', 2300a23bdaSmrg ['c'], 24bbff01ceSmrg version : '2.4.122', 2500a23bdaSmrg license : 'MIT', 26bbff01ceSmrg meson_version : '>= 0.59', 27b0ab5608Smrg default_options : ['buildtype=debugoptimized', 'c_std=c11'], 2800a23bdaSmrg) 2900a23bdaSmrg 30b0ab5608Smrgif ['windows', 'darwin'].contains(host_machine.system()) 31b0ab5608Smrg error('unsupported OS: @0@'.format(host_machine.system())) 32b0ab5608Smrgendif 33b0ab5608Smrg 3400a23bdaSmrgpkg = import('pkgconfig') 3500a23bdaSmrg 367cdc0497Smrgconfig = configuration_data() 377cdc0497Smrg 387cdc0497Smrgconfig.set10('UDEV', get_option('udev')) 3900a23bdaSmrgwith_freedreno_kgsl = get_option('freedreno-kgsl') 4000a23bdaSmrgwith_install_tests = get_option('install-test-programs') 41b0ab5608Smrgwith_tests = get_option('tests') 4200a23bdaSmrg 4300a23bdaSmrgdep_threads = dependency('threads') 4400a23bdaSmrg 4500a23bdaSmrgcc = meson.get_compiler('c') 4600a23bdaSmrg 4749ef06a4Smrgandroid = cc.compiles('''int func() { return __ANDROID__; }''') 4849ef06a4Smrg 499bd392adSmrgsymbols_check = find_program('symbols-check.py') 509bd392adSmrgprog_nm = find_program('nm') 519bd392adSmrg 5200a23bdaSmrg# Check for atomics 5300a23bdaSmrgintel_atomics = false 5400a23bdaSmrglib_atomics = false 5500a23bdaSmrg 564babd585Smrgpython3 = import('python').find_installation() 570ed5401bSmrgformat_mod_static_table = custom_target( 580ed5401bSmrg 'format_mod_static_table', 590ed5401bSmrg output : 'generated_static_table_fourcc.h', 600ed5401bSmrg input : 'include/drm/drm_fourcc.h', 614babd585Smrg command : [python3, files('gen_table_fourcc.py'), '@INPUT@', '@OUTPUT@']) 624babd585Smrg 637cdc0497Smrgdep_atomic_ops = dependency('atomic_ops', required : false) 649bd392adSmrgif cc.links(''' 6500a23bdaSmrg int atomic_add(int *i) { return __sync_add_and_fetch (i, 1); } 6600a23bdaSmrg int atomic_cmpxchg(int *i, int j, int k) { return __sync_val_compare_and_swap (i, j, k); } 679bd392adSmrg int main() { } 6800a23bdaSmrg ''', 6900a23bdaSmrg name : 'Intel Atomics') 7000a23bdaSmrg intel_atomics = true 7100a23bdaSmrg with_atomics = true 727cdc0497Smrg dep_atomic_ops = [] 737cdc0497Smrgelif dep_atomic_ops.found() 7400a23bdaSmrg lib_atomics = true 7500a23bdaSmrg with_atomics = true 7600a23bdaSmrgelif cc.has_function('atomic_cas_uint') 7700a23bdaSmrg with_atomics = true 7800a23bdaSmrgelse 7900a23bdaSmrg with_atomics = false 8000a23bdaSmrgendif 8100a23bdaSmrg 8200a23bdaSmrgconfig.set10('HAVE_LIBDRM_ATOMIC_PRIMITIVES', intel_atomics) 8300a23bdaSmrgconfig.set10('HAVE_LIB_ATOMIC_OPS', lib_atomics) 8400a23bdaSmrg 85b0ab5608Smrgdep_pciaccess = dependency('pciaccess', version : '>= 0.10', required : get_option('intel')) 86b0ab5608Smrg 87bbff01ceSmrgwith_intel = get_option('intel') \ 88bbff01ceSmrg .require(with_atomics, error_message : 'libdrm_intel requires atomics') \ 89bbff01ceSmrg .require(dep_pciaccess.found(), error_message : 'libdrm_intel requires libpciaccess') \ 90bbff01ceSmrg .disable_auto_if(not host_machine.cpu_family().startswith('x86')) \ 91bbff01ceSmrg .allowed() 920ed5401bSmrgsummary('Intel', with_intel) 9300a23bdaSmrg 94bbff01ceSmrgwith_radeon = get_option('radeon') \ 95bbff01ceSmrg .require(with_atomics, error_message : 'libdrm_radeon requires atomics') \ 96bbff01ceSmrg .allowed() 970ed5401bSmrgsummary('Radeon', with_radeon) 9800a23bdaSmrg 99bbff01ceSmrgwith_amdgpu = get_option('amdgpu') \ 100bbff01ceSmrg .require(with_atomics, error_message : 'libdrm_amdgpu requires atomics') \ 101bbff01ceSmrg .allowed() 1020ed5401bSmrgsummary('AMDGPU', with_amdgpu) 10300a23bdaSmrg 104bbff01ceSmrgwith_nouveau = get_option('nouveau') \ 105bbff01ceSmrg .require(with_atomics, error_message : 'libdrm_nouveau requires atomics') \ 106bbff01ceSmrg .allowed() 1070ed5401bSmrgsummary('Nouveau', with_nouveau) 10800a23bdaSmrg 109bbff01ceSmrgwith_vmwgfx = get_option('vmwgfx').allowed() 1100ed5401bSmrgsummary('vmwgfx', with_vmwgfx) 11100a23bdaSmrg 112bbff01ceSmrgwith_omap = get_option('omap') \ 113bbff01ceSmrg .require(with_atomics, error_message : 'libdrm_omap requires atomics') \ 114bbff01ceSmrg .enabled() 1150ed5401bSmrgsummary('OMAP', with_omap) 11600a23bdaSmrg 117bbff01ceSmrgwith_freedreno = get_option('freedreno') \ 118bbff01ceSmrg .require(with_atomics, error_message : 'libdrm_freedreno requires atomics') \ 119bbff01ceSmrg .disable_auto_if(not ['arm', 'aarch64'].contains(host_machine.cpu_family())) \ 120bbff01ceSmrg .allowed() 1210ed5401bSmrgsummary('Freedreno', with_freedreno) 1220ed5401bSmrgsummary('Freedreon-kgsl', with_freedreno_kgsl) 12300a23bdaSmrg 124bbff01ceSmrgwith_tegra = get_option('tegra') \ 125bbff01ceSmrg .require(with_atomics, error_message : 'libdrm_tegra requires atomics') \ 126bbff01ceSmrg .disable_auto_if(not ['arm', 'aarch64'].contains(host_machine.cpu_family())) \ 127bbff01ceSmrg .enabled() 1280ed5401bSmrgsummary('Tegra', with_tegra) 12900a23bdaSmrg 130bbff01ceSmrgwith_etnaviv = get_option('etnaviv') \ 131bbff01ceSmrg .require(with_atomics, error_message : 'libdrm_etnaviv requires atomics') \ 132bbff01ceSmrg .disable_auto_if(not ['arm', 'aarch64', 'arc', 'mips', 'mips64', 'loongarch64'].contains(host_machine.cpu_family())) \ 133bbff01ceSmrg .allowed() 1340ed5401bSmrgsummary('Etnaviv', with_etnaviv) 13500a23bdaSmrg 136b0ab5608Smrgwith_exynos = get_option('exynos').enabled() 1370ed5401bSmrgsummary('EXYNOS', with_exynos) 13800a23bdaSmrg 139bbff01ceSmrgwith_vc4 = get_option('vc4') \ 140bbff01ceSmrg .disable_auto_if(not ['arm', 'aarch64'].contains(host_machine.cpu_family())) \ 141bbff01ceSmrg .allowed() 1420ed5401bSmrgsummary('VC4', with_vc4) 14300a23bdaSmrg 14400a23bdaSmrg# Among others FreeBSD does not have a separate dl library. 14500a23bdaSmrgif not cc.has_function('dlsym') 14600a23bdaSmrg dep_dl = cc.find_library('dl', required : with_nouveau) 14700a23bdaSmrgelse 14800a23bdaSmrg dep_dl = [] 14900a23bdaSmrgendif 15000a23bdaSmrg# clock_gettime might require -rt, or it might not. find out 15100a23bdaSmrgif not cc.has_function('clock_gettime', prefix : '#define _GNU_SOURCE\n#include <time.h>') 15200a23bdaSmrg # XXX: untested 15300a23bdaSmrg dep_rt = cc.find_library('rt') 15400a23bdaSmrgelse 15500a23bdaSmrg dep_rt = [] 15600a23bdaSmrgendif 1579bd392adSmrg 1589bd392adSmrg# The header is not required on Linux, and is in fact deprecated in glibc 2.30+ 1599bd392adSmrgif ['linux'].contains(host_machine.system()) 1609bd392adSmrg config.set10('HAVE_SYS_SYSCTL_H', false) 1619bd392adSmrgelse 1629bd392adSmrg # From Niclas Zeising: 1639bd392adSmrg # FreeBSD requires sys/types.h for sys/sysctl.h, so add it as part of 1649bd392adSmrg # the includes when checking for headers. 1659bd392adSmrg config.set10('HAVE_SYS_SYSCTL_H', 1669bd392adSmrg cc.compiles('#include <sys/types.h>\n#include <sys/sysctl.h>', name : 'sys/sysctl.h works')) 1679bd392adSmrgendif 1689bd392adSmrg 1699bd392adSmrgforeach header : ['sys/select.h', 'alloca.h'] 1700ed5401bSmrg config.set10('HAVE_' + header.underscorify().to_upper(), cc.check_header(header)) 1717cdc0497Smrgendforeach 1729bd392adSmrg 17388f8a8d2Smrgif (cc.has_header_symbol('sys/sysmacros.h', 'major') and 17488f8a8d2Smrg cc.has_header_symbol('sys/sysmacros.h', 'minor') and 17588f8a8d2Smrg cc.has_header_symbol('sys/sysmacros.h', 'makedev')) 17600a23bdaSmrg config.set10('MAJOR_IN_SYSMACROS', true) 17788f8a8d2Smrgendif 17888f8a8d2Smrgif (cc.has_header_symbol('sys/mkdev.h', 'major') and 17988f8a8d2Smrg cc.has_header_symbol('sys/mkdev.h', 'minor') and 18088f8a8d2Smrg cc.has_header_symbol('sys/mkdev.h', 'makedev')) 18100a23bdaSmrg config.set10('MAJOR_IN_MKDEV', true) 18200a23bdaSmrgendif 1837cdc0497Smrgconfig.set10('HAVE_OPEN_MEMSTREAM', cc.has_function('open_memstream')) 18400a23bdaSmrg 1850ed5401bSmrglibdrm_c_args = cc.get_supported_arguments([ 1860ed5401bSmrg '-Wsign-compare', '-Werror=undef', '-Werror=implicit-function-declaration', 1870ed5401bSmrg '-Wpointer-arith', '-Wwrite-strings', '-Wstrict-prototypes', 1880ed5401bSmrg '-Wmissing-prototypes', '-Wmissing-declarations', '-Wnested-externs', 1890ed5401bSmrg '-Wpacked', '-Wswitch-enum', '-Wmissing-format-attribute', 1900ed5401bSmrg '-Wstrict-aliasing=2', '-Winit-self', '-Winline', '-Wshadow', 1910ed5401bSmrg '-Wdeclaration-after-statement', '-Wold-style-definition', 1920ed5401bSmrg '-Wno-unused-parameter', '-Wno-attributes', '-Wno-long-long', 1930ed5401bSmrg '-Wno-missing-field-initializers']) 19400a23bdaSmrg 19500a23bdaSmrgdep_cunit = dependency('cunit', version : '>= 2.1', required : false) 196b0ab5608Smrgdep_cairo = dependency('cairo', required : get_option('cairo-tests')) 197b0ab5608Smrgwith_cairo_tests = dep_cairo.found() 198b0ab5608Smrg 199b0ab5608Smrgvalgrind_version = [] 200b0ab5608Smrgif with_freedreno 201b0ab5608Smrg valgrind_version = '>=3.10.0' 20200a23bdaSmrgendif 203b0ab5608Smrgdep_valgrind = dependency('valgrind', required : get_option('valgrind'), version : valgrind_version) 204b0ab5608Smrgwith_valgrind = dep_valgrind.found() 20500a23bdaSmrg 206b0ab5608Smrgprog_rst2man = find_program('rst2man', 'rst2man.py', required: get_option('man-pages')) 207b0ab5608Smrgwith_man_pages = prog_rst2man.found() 20800a23bdaSmrg 2090ed5401bSmrgconfig.set10('HAVE_VISIBILITY', cc.has_function_attribute('visibility:hidden')) 21000a23bdaSmrg 21100a23bdaSmrgforeach t : [ 21200a23bdaSmrg [with_exynos, 'EXYNOS'], 21300a23bdaSmrg [with_freedreno_kgsl, 'FREEDRENO_KGSL'], 21400a23bdaSmrg [with_intel, 'INTEL'], 21500a23bdaSmrg [with_nouveau, 'NOUVEAU'], 21600a23bdaSmrg [with_radeon, 'RADEON'], 21700a23bdaSmrg [with_vc4, 'VC4'], 21800a23bdaSmrg [with_vmwgfx, 'VMWGFX'], 21900a23bdaSmrg [with_cairo_tests, 'CAIRO'], 22000a23bdaSmrg [with_valgrind, 'VALGRIND'], 22100a23bdaSmrg ] 22200a23bdaSmrg config.set10('HAVE_@0@'.format(t[1]), t[0]) 22300a23bdaSmrgendforeach 22400a23bdaSmrgif with_freedreno_kgsl and not with_freedreno 22500a23bdaSmrg error('cannot enable freedreno-kgsl without freedreno support') 22600a23bdaSmrgendif 22700a23bdaSmrgconfig.set10('_GNU_SOURCE', true) 228bbff01ceSmrg 229bbff01ceSmrgif target_machine.endian() == 'big' 230bbff01ceSmrg config.set('HAVE_BIG_ENDIAN', 1) 231bbff01ceSmrgendif 232bbff01ceSmrg 23300a23bdaSmrgconfig_file = configure_file( 23400a23bdaSmrg configuration : config, 23500a23bdaSmrg output : 'config.h', 23600a23bdaSmrg) 237bbff01ceSmrgadd_project_arguments('-include', meson.current_build_dir() / 'config.h', language : 'c') 23800a23bdaSmrg 23900a23bdaSmrginc_root = include_directories('.') 24000a23bdaSmrginc_drm = include_directories('include/drm') 24100a23bdaSmrg 24249ef06a4Smrglibdrm_files = [files( 24349ef06a4Smrg 'xf86drm.c', 'xf86drmHash.c', 'xf86drmRandom.c', 'xf86drmSL.c', 24449ef06a4Smrg 'xf86drmMode.c' 24549ef06a4Smrg ), 24649ef06a4Smrg config_file, format_mod_static_table 24749ef06a4Smrg] 24849ef06a4Smrg 2490ed5401bSmrg# Build an unversioned so on android 25049ef06a4Smrgif android 2510ed5401bSmrg libdrm_kw = {} 25249ef06a4Smrgelse 2530ed5401bSmrg libdrm_kw = {'version' : '2.4.0'} 2540ed5401bSmrgendif 2550ed5401bSmrg 2560ed5401bSmrglibdrm = library( 2570ed5401bSmrg 'drm', 2580ed5401bSmrg libdrm_files, 2590ed5401bSmrg c_args : libdrm_c_args, 260bbff01ceSmrg dependencies : [dep_valgrind, dep_rt], 2610ed5401bSmrg include_directories : inc_drm, 2620ed5401bSmrg install : true, 2630ed5401bSmrg kwargs : libdrm_kw, 2640ed5401bSmrg gnu_symbol_visibility : 'hidden', 2650ed5401bSmrg) 26600a23bdaSmrg 2679bd392adSmrgtest( 2689bd392adSmrg 'core-symbols-check', 2699bd392adSmrg symbols_check, 2709bd392adSmrg args : [ 2719bd392adSmrg '--lib', libdrm, 2729bd392adSmrg '--symbols-file', files('core-symbols.txt'), 273bbff01ceSmrg '--nm', prog_nm.full_path(), 2749bd392adSmrg ], 2759bd392adSmrg) 2769bd392adSmrg 27700a23bdaSmrgext_libdrm = declare_dependency( 27800a23bdaSmrg link_with : libdrm, 27900a23bdaSmrg include_directories : [inc_root, inc_drm], 28000a23bdaSmrg) 28100a23bdaSmrg 2820ed5401bSmrgif meson.version().version_compare('>= 0.54.0') 2830ed5401bSmrg meson.override_dependency('libdrm', ext_libdrm) 2840ed5401bSmrgendif 2850ed5401bSmrg 28600a23bdaSmrginstall_headers('libsync.h', 'xf86drm.h', 'xf86drmMode.h') 28700a23bdaSmrginstall_headers( 28800a23bdaSmrg 'include/drm/drm.h', 'include/drm/drm_fourcc.h', 'include/drm/drm_mode.h', 28900a23bdaSmrg 'include/drm/drm_sarea.h', 'include/drm/i915_drm.h', 29000a23bdaSmrg 'include/drm/mach64_drm.h', 'include/drm/mga_drm.h', 2917cdc0497Smrg 'include/drm/msm_drm.h', 'include/drm/nouveau_drm.h', 2927cdc0497Smrg 'include/drm/qxl_drm.h', 'include/drm/r128_drm.h', 2937cdc0497Smrg 'include/drm/radeon_drm.h', 'include/drm/amdgpu_drm.h', 2947cdc0497Smrg 'include/drm/savage_drm.h', 'include/drm/sis_drm.h', 2957cdc0497Smrg 'include/drm/tegra_drm.h', 'include/drm/vc4_drm.h', 29600a23bdaSmrg 'include/drm/via_drm.h', 'include/drm/virtgpu_drm.h', 29700a23bdaSmrg subdir : 'libdrm', 29800a23bdaSmrg) 29900a23bdaSmrgif with_vmwgfx 30000a23bdaSmrg install_headers('include/drm/vmwgfx_drm.h', subdir : 'libdrm') 30100a23bdaSmrgendif 30200a23bdaSmrg 30300a23bdaSmrgpkg.generate( 3040ed5401bSmrg libdrm, 30500a23bdaSmrg name : 'libdrm', 30600a23bdaSmrg subdirs : ['.', 'libdrm'], 30700a23bdaSmrg description : 'Userspace interface to kernel DRM services', 30800a23bdaSmrg) 30900a23bdaSmrg 31000a23bdaSmrgif with_intel 31100a23bdaSmrg subdir('intel') 31200a23bdaSmrgendif 31300a23bdaSmrgif with_nouveau 31400a23bdaSmrg subdir('nouveau') 31500a23bdaSmrgendif 31600a23bdaSmrgif with_radeon 31700a23bdaSmrg subdir('radeon') 31800a23bdaSmrgendif 31900a23bdaSmrgif with_amdgpu 32000a23bdaSmrg subdir('amdgpu') 32100a23bdaSmrgendif 32200a23bdaSmrgif with_omap 32300a23bdaSmrg subdir('omap') 32400a23bdaSmrgendif 32500a23bdaSmrgif with_exynos 32600a23bdaSmrg subdir('exynos') 32700a23bdaSmrgendif 32800a23bdaSmrgif with_freedreno 32900a23bdaSmrg subdir('freedreno') 33000a23bdaSmrgendif 33100a23bdaSmrgif with_tegra 33200a23bdaSmrg subdir('tegra') 33300a23bdaSmrgendif 33400a23bdaSmrgif with_vc4 33500a23bdaSmrg subdir('vc4') 33600a23bdaSmrgendif 33700a23bdaSmrgif with_etnaviv 33800a23bdaSmrg subdir('etnaviv') 33900a23bdaSmrgendif 34000a23bdaSmrgif with_man_pages 34100a23bdaSmrg subdir('man') 34200a23bdaSmrgendif 34300a23bdaSmrgsubdir('data') 344b0ab5608Smrgif with_tests 345b0ab5608Smrg subdir('tests') 346b0ab5608Smrgendif 347