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