2020-07-28 16:55:54 +08:00
|
|
|
project(
|
|
|
|
|
'libmali', 'c',
|
|
|
|
|
version : '1.9.0',
|
2020-08-13 16:18:24 +08:00
|
|
|
meson_version : '>=0.49.0',
|
2020-11-13 17:29:14 +08:00
|
|
|
default_options : ['b_asneeded=false', 'b_lundef=false'])
|
2020-07-28 16:55:54 +08:00
|
|
|
|
2021-01-27 16:51:03 +08:00
|
|
|
mali_version = meson.project_version()
|
|
|
|
|
|
2020-07-28 16:55:54 +08:00
|
|
|
pkgconfig = import('pkgconfig')
|
|
|
|
|
|
|
|
|
|
if get_option('arch') != 'auto'
|
|
|
|
|
arch = get_option('arch')
|
|
|
|
|
else
|
|
|
|
|
arch = host_machine.cpu_family()
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
gpu = get_option('gpu')
|
|
|
|
|
version = get_option('version')
|
|
|
|
|
subversion = get_option('subversion')
|
|
|
|
|
platform = get_option('platform')
|
2021-03-10 04:08:30 +08:00
|
|
|
opencl_icd = get_option('opencl-icd')
|
|
|
|
|
vendor_package = get_option('vendor-package')
|
2021-07-14 17:50:23 +08:00
|
|
|
wrappers_opts = get_option('wrappers')
|
2020-07-28 16:55:54 +08:00
|
|
|
|
2020-12-10 14:59:48 +08:00
|
|
|
message('Building for ' + '|'.join([arch, gpu, version, subversion, platform]))
|
|
|
|
|
|
2020-07-28 16:55:54 +08:00
|
|
|
# Grab libraries with specified configs
|
2020-11-13 17:29:14 +08:00
|
|
|
cmd = run_command('grabber.sh', arch, gpu, version, subversion, platform)
|
|
|
|
|
libs = cmd.stdout().strip().split('\n')
|
2020-07-28 16:55:54 +08:00
|
|
|
|
|
|
|
|
# Use the first one as default library
|
|
|
|
|
default_lib = libs[0]
|
|
|
|
|
if default_lib == ''
|
2021-03-26 21:35:07 +08:00
|
|
|
error('Failed to find matched library')
|
2020-07-28 16:55:54 +08:00
|
|
|
endif
|
|
|
|
|
|
2021-03-26 21:35:07 +08:00
|
|
|
message('Source libraries: @0@'.format(libs))
|
|
|
|
|
|
2021-07-22 10:49:11 +08:00
|
|
|
# Required packages
|
|
|
|
|
requires = []
|
|
|
|
|
if platform == 'gbm'
|
|
|
|
|
requires = ['libdrm']
|
|
|
|
|
elif platform == 'wayland'
|
|
|
|
|
requires = ['libdrm', 'wayland-client', 'wayland-server']
|
|
|
|
|
|
|
|
|
|
if gpu == 'utgard-400' and subversion == 'r3p0'
|
|
|
|
|
requires += ['libffi', 'libcrypto']
|
|
|
|
|
endif
|
|
|
|
|
elif platform == 'x11'
|
|
|
|
|
requires = ['libdrm', 'x11', 'xcb']
|
|
|
|
|
|
|
|
|
|
if gpu.split('-')[0] != 'utgard'
|
|
|
|
|
requires += ['x11-xcb', 'xcb-dri2']
|
|
|
|
|
else
|
|
|
|
|
requires += ['xfixes', 'xext', 'xau', 'xdmcp', 'xdamage']
|
|
|
|
|
endif
|
|
|
|
|
endif
|
|
|
|
|
|
2021-07-14 17:50:23 +08:00
|
|
|
if wrappers_opts.auto() and gpu.split('-')[0] == 'utgard'
|
|
|
|
|
wrappers = false
|
|
|
|
|
warning('Wrappers are disabled for utgard by default')
|
2021-03-26 21:35:07 +08:00
|
|
|
else
|
2021-07-14 17:50:23 +08:00
|
|
|
wrappers = not wrappers_opts.disabled()
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
if wrappers
|
|
|
|
|
message('Provide wrappers')
|
|
|
|
|
else
|
|
|
|
|
# The vendor package requires soname of wrappers.
|
2021-03-26 21:35:07 +08:00
|
|
|
if vendor_package
|
2021-07-14 17:50:23 +08:00
|
|
|
error('Cannot provide vendor package without wrappers')
|
2021-03-26 21:35:07 +08:00
|
|
|
endif
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
# Install wrapper libraries into vendor dir
|
|
|
|
|
if vendor_package
|
|
|
|
|
message('Build vendor package')
|
|
|
|
|
wrapper_libdir = get_option('libdir') / 'mali'
|
|
|
|
|
else
|
|
|
|
|
wrapper_libdir = get_option('libdir')
|
|
|
|
|
endif
|
2020-07-28 16:55:54 +08:00
|
|
|
|
|
|
|
|
# Wrap library name : version
|
|
|
|
|
mali_wrappers = {'Mali' : '1'}
|
|
|
|
|
gbm_wrappers = {'gbm' : '1'}
|
|
|
|
|
egl_wrappers = {'EGL' : '1'}
|
|
|
|
|
glesv1_wrappers = {'GLESv1_CM' : '1'}
|
|
|
|
|
glesv2_wrappers = {'GLESv2' : '2'}
|
|
|
|
|
wayland_wrappers = {'wayland-egl' : '1'}
|
2021-03-10 04:08:30 +08:00
|
|
|
cl_wrappers = opencl_icd ? {'MaliOpenCL' : '1'} : {'OpenCL' : '1'}
|
2020-07-28 16:55:54 +08:00
|
|
|
|
2020-11-13 17:29:14 +08:00
|
|
|
# Source dir : dest dir
|
2020-07-28 16:55:54 +08:00
|
|
|
mali_headers = {
|
2021-01-30 04:14:08 +08:00
|
|
|
'include/KHR' : 'KHR',
|
2020-11-13 17:29:14 +08:00
|
|
|
}
|
|
|
|
|
gbm_headers = {
|
2021-01-30 04:14:08 +08:00
|
|
|
'include/GBM' : '',
|
2020-07-28 16:55:54 +08:00
|
|
|
}
|
|
|
|
|
egl_headers = {
|
2021-01-30 04:14:08 +08:00
|
|
|
'include/EGL' : 'EGL',
|
2020-07-28 16:55:54 +08:00
|
|
|
}
|
|
|
|
|
glesv1_headers = {
|
2021-01-30 04:14:08 +08:00
|
|
|
'include/GLES' : 'GLES',
|
2020-07-28 16:55:54 +08:00
|
|
|
}
|
|
|
|
|
glesv2_headers = {
|
2021-01-30 04:14:08 +08:00
|
|
|
'include/GLES2' : 'GLES2',
|
|
|
|
|
'include/GLES3' : 'GLES3',
|
2020-07-28 16:55:54 +08:00
|
|
|
}
|
|
|
|
|
cl_headers = {
|
2021-01-30 04:14:08 +08:00
|
|
|
'include/CL' : 'CL',
|
2020-07-28 16:55:54 +08:00
|
|
|
}
|
|
|
|
|
|
2021-07-14 17:50:23 +08:00
|
|
|
# Provide newer GBM version with wrappers
|
|
|
|
|
gbm_version = wrappers ? '20.1.5' : '10.4.0'
|
2021-03-26 21:35:07 +08:00
|
|
|
|
2020-07-28 16:55:54 +08:00
|
|
|
# Package name : required symbol, wrappers, headers, package version
|
|
|
|
|
map = {
|
2021-03-10 04:08:30 +08:00
|
|
|
'Mali' : ['', mali_wrappers, mali_headers, mali_version],
|
2021-03-26 21:35:07 +08:00
|
|
|
'gbm' : ['gbm_create_device', gbm_wrappers, gbm_headers, gbm_version],
|
2020-07-28 16:55:54 +08:00
|
|
|
'egl' : ['eglCreateContext', egl_wrappers, egl_headers, '7.10'],
|
|
|
|
|
'glesv1_cm' : ['eglCreateContext', glesv1_wrappers, glesv1_headers, '7.10'],
|
|
|
|
|
'glesv2' : ['eglCreateContext', glesv2_wrappers, glesv2_headers, '7.10'],
|
|
|
|
|
'wayland-egl' : ['wl_egl_window_create', wayland_wrappers, {}, '18.1.0'],
|
|
|
|
|
'OpenCL' : ['clCreateContext', cl_wrappers, cl_headers, '1.2'],
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Create dummy source for building libraries
|
2020-08-13 16:18:41 +08:00
|
|
|
dummy_source = join_paths(meson.current_build_dir(), 'dummy.c')
|
|
|
|
|
run_command('touch', dummy_source)
|
2020-07-28 16:55:54 +08:00
|
|
|
|
|
|
|
|
# Create a dummy library for building wrappers
|
|
|
|
|
libmali = shared_library(
|
|
|
|
|
'mali',
|
2020-08-13 16:18:41 +08:00
|
|
|
dummy_source,
|
2020-07-28 16:55:54 +08:00
|
|
|
install : true,
|
2021-01-27 16:51:03 +08:00
|
|
|
version : mali_version)
|
2020-07-28 16:55:54 +08:00
|
|
|
|
2021-03-10 04:08:30 +08:00
|
|
|
pkgconfig.generate(
|
|
|
|
|
libmali,
|
2021-07-22 10:49:11 +08:00
|
|
|
requires : requires,
|
2021-03-10 04:08:30 +08:00
|
|
|
description : 'Mali GPU User-Space Binary Driver')
|
|
|
|
|
|
2020-08-13 16:18:41 +08:00
|
|
|
# The gbm functions might be missing
|
|
|
|
|
gbm_check_funcs = [
|
|
|
|
|
'gbm_bo_map',
|
|
|
|
|
'gbm_bo_unmap',
|
|
|
|
|
'gbm_bo_get_offset',
|
|
|
|
|
'gbm_bo_get_plane_count',
|
|
|
|
|
'gbm_device_get_format_modifier_plane_count',
|
|
|
|
|
'gbm_bo_get_handle_for_plane',
|
|
|
|
|
'gbm_bo_get_stride_for_plane',
|
|
|
|
|
'gbm_bo_get_modifier',
|
|
|
|
|
'gbm_bo_create_with_modifiers',
|
|
|
|
|
'gbm_surface_create_with_modifiers',
|
|
|
|
|
'gbm_bo_get_bpp',
|
|
|
|
|
'gbm_format_get_name',
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# Create libgbm wrapper for missing functions
|
|
|
|
|
libgbm = []
|
|
|
|
|
gbm_symbol = map['gbm'][0]
|
|
|
|
|
if run_command('grep', '-q', gbm_symbol, default_lib).returncode() == 0
|
|
|
|
|
libgbm_version = gbm_wrappers['gbm']
|
2021-01-27 16:51:03 +08:00
|
|
|
libgbm_cflags = [
|
|
|
|
|
'-DLIBMALI_SO="libmali.so.' + mali_version.split('.')[0] + '"',
|
|
|
|
|
]
|
2020-08-13 16:18:41 +08:00
|
|
|
|
|
|
|
|
libdrm_dep = dependency('libdrm', version : '>= 2.4.0')
|
|
|
|
|
if not libdrm_dep.found()
|
|
|
|
|
error('libdrm not found.')
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
foreach symbol : gbm_check_funcs
|
|
|
|
|
if run_command('grep', '-q', symbol, default_lib).returncode() == 0
|
|
|
|
|
libgbm_cflags += '-DHAS_' + symbol
|
|
|
|
|
endif
|
|
|
|
|
endforeach
|
|
|
|
|
|
2020-10-20 08:26:50 +08:00
|
|
|
libdl_dep = meson.get_compiler('c').find_library('dl', required : false)
|
2020-08-13 16:18:41 +08:00
|
|
|
libgbm = shared_library(
|
|
|
|
|
'gbm',
|
|
|
|
|
'gbm_wrapper.c',
|
|
|
|
|
c_args : libgbm_cflags,
|
2020-11-13 17:29:14 +08:00
|
|
|
include_directories : include_directories('include/GBM'),
|
2020-10-20 08:26:50 +08:00
|
|
|
dependencies : [libdl_dep, libdrm_dep],
|
2020-08-13 16:18:41 +08:00
|
|
|
link_with : libmali,
|
|
|
|
|
install : true,
|
2021-03-10 04:08:30 +08:00
|
|
|
install_dir : wrapper_libdir,
|
2020-08-13 16:18:41 +08:00
|
|
|
version : libgbm_version)
|
|
|
|
|
endif
|
|
|
|
|
|
2020-07-28 16:55:54 +08:00
|
|
|
foreach name, values : map
|
|
|
|
|
symbol = values[0]
|
2021-07-14 17:50:23 +08:00
|
|
|
wrapper_libs = values[1]
|
2020-07-28 16:55:54 +08:00
|
|
|
headers = values[2]
|
|
|
|
|
pkg_version = values[3]
|
2020-08-13 16:18:41 +08:00
|
|
|
wrapper_ldflags = []
|
2021-03-10 04:08:30 +08:00
|
|
|
is_opencl_icd = opencl_icd and name == 'OpenCL'
|
2020-07-28 16:55:54 +08:00
|
|
|
|
|
|
|
|
if run_command('grep', '-q', symbol, default_lib).returncode() != 0
|
|
|
|
|
continue
|
|
|
|
|
endif
|
|
|
|
|
|
2021-07-14 17:50:23 +08:00
|
|
|
foreach wrapper, version : wrapper_libs
|
2020-08-13 16:18:41 +08:00
|
|
|
wrapper_ldflags += '-l' + wrapper
|
|
|
|
|
|
|
|
|
|
if wrapper != 'gbm'
|
|
|
|
|
shared_library(
|
|
|
|
|
wrapper,
|
|
|
|
|
dummy_source,
|
|
|
|
|
link_with : [libgbm, libmali],
|
|
|
|
|
install : true,
|
2021-03-10 04:08:30 +08:00
|
|
|
install_dir : wrapper_libdir,
|
2020-08-13 16:18:41 +08:00
|
|
|
version : version)
|
|
|
|
|
endif
|
2020-07-28 16:55:54 +08:00
|
|
|
endforeach
|
|
|
|
|
|
2021-03-10 04:08:30 +08:00
|
|
|
# Install ICD OpenCL vendor config
|
|
|
|
|
if is_opencl_icd
|
2020-09-27 17:12:55 +08:00
|
|
|
custom_target(
|
|
|
|
|
'vendor icd',
|
2020-11-13 17:29:14 +08:00
|
|
|
output : 'mali.icd',
|
2020-09-27 17:12:55 +08:00
|
|
|
command : ['echo', 'libMaliOpenCL.so.1'],
|
|
|
|
|
capture : true,
|
|
|
|
|
install_dir : get_option('sysconfdir') / 'OpenCL' / 'vendors',
|
2020-11-13 17:29:14 +08:00
|
|
|
install : true)
|
2021-03-10 04:08:30 +08:00
|
|
|
endif
|
2020-09-27 17:12:55 +08:00
|
|
|
|
2021-03-10 04:08:30 +08:00
|
|
|
# No {headers, pkgconfig} for {ICD OpenGL, vendor packages}
|
|
|
|
|
if is_opencl_icd or vendor_package
|
2020-09-27 17:12:55 +08:00
|
|
|
continue
|
|
|
|
|
endif
|
|
|
|
|
|
2020-11-13 17:29:14 +08:00
|
|
|
foreach src, dst : headers
|
|
|
|
|
install_subdir(
|
|
|
|
|
src,
|
2021-01-30 04:14:08 +08:00
|
|
|
install_dir : get_option('includedir') / dst,
|
2020-11-13 17:29:14 +08:00
|
|
|
install_mode : ['rw-r--r--', 'root'],
|
|
|
|
|
strip_directory : true)
|
2020-07-28 16:55:54 +08:00
|
|
|
endforeach
|
|
|
|
|
|
|
|
|
|
pkgconfig.generate(
|
2020-08-13 16:18:41 +08:00
|
|
|
libraries : ['-L${libdir} -lmali', wrapper_ldflags],
|
2021-07-22 10:49:11 +08:00
|
|
|
requires : requires,
|
2020-07-28 16:55:54 +08:00
|
|
|
version : pkg_version,
|
|
|
|
|
name : name,
|
2021-03-10 04:08:30 +08:00
|
|
|
description : 'Mali GPU User-Space Binary Driver Wrappers')
|
2020-07-28 16:55:54 +08:00
|
|
|
endforeach
|
|
|
|
|
|
|
|
|
|
# Install optional overlay
|
|
|
|
|
if get_option('with-overlay')
|
|
|
|
|
if gpu == 'utgard-400' and subversion == 'r3p0'
|
|
|
|
|
install_data('overlay/S10libmali_px3se', install_dir : get_option('sysconfdir') / 'init.d')
|
|
|
|
|
install_data('overlay/px3seBase', install_dir : get_option('bindir'))
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
if gpu == 'midgard-t76x' and subversion == 'all'
|
|
|
|
|
install_data('overlay/S10libmali_rk3288', install_dir : get_option('sysconfdir') / 'init.d')
|
|
|
|
|
endif
|
|
|
|
|
endif
|
|
|
|
|
|
2021-03-10 04:08:30 +08:00
|
|
|
if vendor_package
|
|
|
|
|
# Install vendor ld config
|
|
|
|
|
custom_target(
|
|
|
|
|
'vendor ld config',
|
|
|
|
|
output : '00-' + arch + '-mali.conf',
|
|
|
|
|
command : ['echo', get_option('prefix') / wrapper_libdir],
|
|
|
|
|
capture : true,
|
|
|
|
|
install_dir : '/etc/ld.so.conf.d',
|
|
|
|
|
install : true)
|
|
|
|
|
elif get_option('khr-header')
|
|
|
|
|
# Install optional KHR header
|
2021-01-30 04:27:08 +08:00
|
|
|
install_data(
|
|
|
|
|
'include/KHR/mali_khrplatform.h',
|
|
|
|
|
install_dir : get_option('includedir') / 'KHR',
|
|
|
|
|
install_mode : ['rw-r--r--', 'root'],
|
|
|
|
|
rename : 'khrplatform.h')
|
|
|
|
|
endif
|
|
|
|
|
|
2021-03-26 21:35:07 +08:00
|
|
|
# Install target libraries
|
2020-07-28 16:55:54 +08:00
|
|
|
install_data(libs, install_dir : get_option('libdir'))
|
2021-03-26 21:35:07 +08:00
|
|
|
|
|
|
|
|
# Fixup dummy library
|
|
|
|
|
meson.add_install_script('fixup_dummy.sh', get_option('libdir'), default_lib)
|
|
|
|
|
|
2021-07-14 17:50:23 +08:00
|
|
|
if not wrappers
|
2021-03-26 21:35:07 +08:00
|
|
|
# Fixup wrappers
|
|
|
|
|
meson.add_install_script('fixup_wrappers.sh', get_option('libdir'))
|
|
|
|
|
endif
|
2021-07-22 11:20:00 +08:00
|
|
|
|
2021-08-26 15:23:01 +08:00
|
|
|
if platform != 'x11' and not vendor_package
|
2021-07-22 11:20:00 +08:00
|
|
|
# Fixup EGL header
|
|
|
|
|
meson.add_install_script('fixup_nox11.sh',
|
|
|
|
|
get_option('includedir') / 'EGL' / 'eglplatform.h')
|
|
|
|
|
endif
|