1*4882a593Smuzhiyunproject( 2*4882a593Smuzhiyun 'libmali', 'c', 3*4882a593Smuzhiyun version : '1.9.0', 4*4882a593Smuzhiyun meson_version : '>=0.54.0', 5*4882a593Smuzhiyun default_options : ['b_asneeded=false']) 6*4882a593Smuzhiyun 7*4882a593Smuzhiyunmali_version = meson.project_version() 8*4882a593Smuzhiyun 9*4882a593Smuzhiyunfs = import('fs') 10*4882a593Smuzhiyunpkgconfig = import('pkgconfig') 11*4882a593Smuzhiyun 12*4882a593Smuzhiyuncc = meson.get_compiler('c') 13*4882a593Smuzhiyun 14*4882a593Smuzhiyunif get_option('arch') != 'auto' 15*4882a593Smuzhiyun arch = get_option('arch') 16*4882a593Smuzhiyunelse 17*4882a593Smuzhiyun arch = host_machine.cpu_family() 18*4882a593Smuzhiyunendif 19*4882a593Smuzhiyun 20*4882a593Smuzhiyungpu = get_option('gpu') 21*4882a593Smuzhiyunversion = get_option('version') 22*4882a593Smuzhiyunsubversion = get_option('subversion') 23*4882a593Smuzhiyunplatform = get_option('platform') 24*4882a593Smuzhiyunopencl_icd = get_option('opencl-icd') 25*4882a593Smuzhiyunvendor_package = get_option('vendor-package') 26*4882a593Smuzhiyunhooks_opts = get_option('hooks') 27*4882a593Smuzhiyunwrappers_opts = get_option('wrappers') 28*4882a593Smuzhiyunoptimize = get_option('optimize-level') 29*4882a593Smuzhiyun 30*4882a593Smuzhiyunmessage('Building for ' + '|'.join([arch, gpu, version, subversion, 31*4882a593Smuzhiyun platform, optimize])) 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun# Grab libraries with specified configs 34*4882a593Smuzhiyuncmd = run_command('scripts/grabber.sh', 35*4882a593Smuzhiyun arch, gpu, version, subversion, platform, optimize, check : false) 36*4882a593Smuzhiyunlibs = cmd.stdout().strip().split(' ') 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun# Use the first one as default library 39*4882a593Smuzhiyundefault_lib = libs[0] 40*4882a593Smuzhiyunif default_lib == '' 41*4882a593Smuzhiyun error('Failed to find matched library') 42*4882a593Smuzhiyunendif 43*4882a593Smuzhiyun 44*4882a593Smuzhiyunmessage('Source libraries: @0@'.format(libs)) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyunis_rk3288 = gpu == 'midgard-t76x' 47*4882a593Smuzhiyunis_utgard = gpu.split('-')[0] == 'utgard' 48*4882a593Smuzhiyunis_px3se = gpu == 'utgard-400' and subversion == 'r3p0' 49*4882a593Smuzhiyun 50*4882a593Smuzhiyunplatforms = platform.split('-') 51*4882a593Smuzhiyunhas_gbm = platforms.contains('gbm') 52*4882a593Smuzhiyunhas_x11 = platforms.contains('x11') 53*4882a593Smuzhiyunhas_wayland = platforms.contains('wayland') 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun# Required packages 56*4882a593Smuzhiyunrequires = [] 57*4882a593Smuzhiyunif has_gbm 58*4882a593Smuzhiyun requires = ['libdrm'] 59*4882a593Smuzhiyunendif 60*4882a593Smuzhiyunif has_wayland 61*4882a593Smuzhiyun requires = ['libdrm', 'wayland-client', 'wayland-server'] 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun if is_px3se 64*4882a593Smuzhiyun requires += ['libffi', 'libcrypto'] 65*4882a593Smuzhiyun endif 66*4882a593Smuzhiyunendif 67*4882a593Smuzhiyunif has_x11 68*4882a593Smuzhiyun requires = ['libdrm', 'x11', 'xcb'] 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun if is_utgard 71*4882a593Smuzhiyun requires += ['xfixes', 'xext', 'xau', 'xdmcp', 'xdamage'] 72*4882a593Smuzhiyun else 73*4882a593Smuzhiyun requires += ['x11-xcb', 'xcb-dri2'] 74*4882a593Smuzhiyun endif 75*4882a593Smuzhiyunendif 76*4882a593Smuzhiyun 77*4882a593Smuzhiyunif wrappers_opts.auto() and is_utgard 78*4882a593Smuzhiyun wrappers = false 79*4882a593Smuzhiyun warning('Wrappers are disabled for utgard by default') 80*4882a593Smuzhiyunelse 81*4882a593Smuzhiyun wrappers = not wrappers_opts.disabled() 82*4882a593Smuzhiyunendif 83*4882a593Smuzhiyun 84*4882a593Smuzhiyunif wrappers 85*4882a593Smuzhiyun message('Provide wrappers') 86*4882a593Smuzhiyunelse 87*4882a593Smuzhiyun # The vendor package requires soname of wrappers. 88*4882a593Smuzhiyun if vendor_package 89*4882a593Smuzhiyun error('Cannot provide vendor package without wrappers') 90*4882a593Smuzhiyun endif 91*4882a593Smuzhiyunendif 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun# Install wrapper libraries into vendor dir 94*4882a593Smuzhiyunif vendor_package 95*4882a593Smuzhiyun message('Build vendor package') 96*4882a593Smuzhiyun wrapper_libdir = get_option('libdir') / 'mali' 97*4882a593Smuzhiyunelse 98*4882a593Smuzhiyun wrapper_libdir = get_option('libdir') 99*4882a593Smuzhiyunendif 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun# Wrap library name : version 102*4882a593Smuzhiyungbm_wrappers = {'gbm' : '1'} 103*4882a593Smuzhiyunegl_wrappers = {'EGL' : '1'} 104*4882a593Smuzhiyunglesv1_wrappers = {'GLESv1_CM' : '1'} 105*4882a593Smuzhiyunglesv2_wrappers = {'GLESv2' : '2'} 106*4882a593Smuzhiyunwayland_wrappers = {'wayland-egl' : '1'} 107*4882a593Smuzhiyuncl_wrappers = opencl_icd ? {'MaliOpenCL' : '1'} : {'OpenCL' : '1'} 108*4882a593Smuzhiyunvk_wrappers = {'MaliVulkan' : '1'} 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun# Source dir : dest dir 111*4882a593Smuzhiyungbm_headers = { 112*4882a593Smuzhiyun 'include/GBM' : '', 113*4882a593Smuzhiyun} 114*4882a593Smuzhiyunegl_headers = { 115*4882a593Smuzhiyun 'include/KHR' : 'KHR', 116*4882a593Smuzhiyun 'include/EGL' : 'EGL', 117*4882a593Smuzhiyun} 118*4882a593Smuzhiyunglesv1_headers = { 119*4882a593Smuzhiyun 'include/KHR' : 'KHR', 120*4882a593Smuzhiyun 'include/GLES' : 'GLES', 121*4882a593Smuzhiyun} 122*4882a593Smuzhiyunglesv2_headers = { 123*4882a593Smuzhiyun 'include/KHR' : 'KHR', 124*4882a593Smuzhiyun 'include/GLES2' : 'GLES2', 125*4882a593Smuzhiyun 'include/GLES3' : 'GLES3', 126*4882a593Smuzhiyun} 127*4882a593Smuzhiyunwayland_egl_headers = { 128*4882a593Smuzhiyun 'include/WAYLAND' : '', 129*4882a593Smuzhiyun} 130*4882a593Smuzhiyuncl_headers = { 131*4882a593Smuzhiyun 'include/CL' : 'CL', 132*4882a593Smuzhiyun} 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun# Load original mali library for later function checks and linking 135*4882a593Smuzhiyunmali = cc.find_library(fs.stem(default_lib), 136*4882a593Smuzhiyun dirs : meson.current_source_dir() / fs.parent(default_lib)) 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun# Provide newer GBM version with hook library 139*4882a593Smuzhiyunif hooks_opts 140*4882a593Smuzhiyun gbm_version = '21.2.6' 141*4882a593Smuzhiyunelif cc.has_function('gbm_bo_get_fd_for_plane', dependencies : mali) 142*4882a593Smuzhiyun gbm_version = '21.1.0' 143*4882a593Smuzhiyunelif cc.has_function('gbm_bo_get_modifier', dependencies : mali) 144*4882a593Smuzhiyun gbm_version = '17.1.0' 145*4882a593Smuzhiyunelse 146*4882a593Smuzhiyun gbm_version = '10.4.0' 147*4882a593Smuzhiyunendif 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun# Package name : required symbol, wrappers, headers, package version 150*4882a593Smuzhiyunmap = { 151*4882a593Smuzhiyun 'gbm' : ['gbm_create_device', gbm_wrappers, gbm_headers, gbm_version], 152*4882a593Smuzhiyun 'egl' : ['eglCreateContext', egl_wrappers, egl_headers, '7.10'], 153*4882a593Smuzhiyun 'glesv1_cm' : ['eglCreateContext', glesv1_wrappers, glesv1_headers, '7.10'], 154*4882a593Smuzhiyun 'glesv2' : ['eglCreateContext', glesv2_wrappers, glesv2_headers, '7.10'], 155*4882a593Smuzhiyun 'wayland-egl' : ['wl_egl_window_create', wayland_wrappers, 156*4882a593Smuzhiyun wayland_egl_headers, '18.1.0'], 157*4882a593Smuzhiyun 'OpenCL' : ['clCreateContext', cl_wrappers, cl_headers, '1.2'], 158*4882a593Smuzhiyun 'vulkan' : ['vk_icdGetInstanceProcAddr', vk_wrappers, {}, mali_version], 159*4882a593Smuzhiyun} 160*4882a593Smuzhiyun 161*4882a593Smuzhiyunlibhook = [] 162*4882a593Smuzhiyunif hooks_opts 163*4882a593Smuzhiyun # Build hook library 164*4882a593Smuzhiyun subdir('hook') 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun # Recommend to link hook library before libmali 167*4882a593Smuzhiyun mali_ldflags = libhook_ldflags 168*4882a593Smuzhiyunelse 169*4882a593Smuzhiyun mali_ldflags = [] 170*4882a593Smuzhiyunendif 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun# Create dummy source for building dummy libraries 173*4882a593Smuzhiyundummy_source = join_paths(meson.current_build_dir(), 'dummy.c') 174*4882a593Smuzhiyunrun_command('touch', dummy_source, check : false) 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun# Create a dummy library which will be replaced by the prebuilt mali library 177*4882a593Smuzhiyunlibmali = shared_library( 178*4882a593Smuzhiyun 'mali', 179*4882a593Smuzhiyun dummy_source, 180*4882a593Smuzhiyun install : true, 181*4882a593Smuzhiyun version : mali_version) 182*4882a593Smuzhiyun 183*4882a593Smuzhiyunmali_ldflags += ['-L${libdir}', '-lmali'] 184*4882a593Smuzhiyun 185*4882a593Smuzhiyunpkgconfig.generate( 186*4882a593Smuzhiyun libraries : mali_ldflags, 187*4882a593Smuzhiyun requires : requires, 188*4882a593Smuzhiyun name : 'mali', 189*4882a593Smuzhiyun description : 'Mali GPU User-Space Binary Driver') 190*4882a593Smuzhiyun 191*4882a593Smuzhiyunif is_utgard 192*4882a593Smuzhiyun # The utgard DDK requires libMali.so 193*4882a593Smuzhiyun custom_target( 194*4882a593Smuzhiyun 'libMali', 195*4882a593Smuzhiyun output : 'libMali.so', 196*4882a593Smuzhiyun command : ['echo'], 197*4882a593Smuzhiyun capture : true, 198*4882a593Smuzhiyun install_dir : get_option('libdir'), 199*4882a593Smuzhiyun install : true) 200*4882a593Smuzhiyunendif 201*4882a593Smuzhiyun 202*4882a593Smuzhiyunforeach name, values : map 203*4882a593Smuzhiyun symbol = values[0] 204*4882a593Smuzhiyun wrapper_libs = values[1] 205*4882a593Smuzhiyun headers = values[2] 206*4882a593Smuzhiyun pkg_version = values[3] 207*4882a593Smuzhiyun is_opencl_icd = opencl_icd and name == 'OpenCL' 208*4882a593Smuzhiyun is_vulkan_icd = name == 'vulkan' 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun if not cc.has_function(symbol, dependencies : mali) 211*4882a593Smuzhiyun continue 212*4882a593Smuzhiyun endif 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun foreach wrapper, version : wrapper_libs 215*4882a593Smuzhiyun shared_library( 216*4882a593Smuzhiyun wrapper, 217*4882a593Smuzhiyun dummy_source, 218*4882a593Smuzhiyun link_with : [libhook, libmali], 219*4882a593Smuzhiyun install : true, 220*4882a593Smuzhiyun install_dir : wrapper_libdir, 221*4882a593Smuzhiyun version : version) 222*4882a593Smuzhiyun endforeach 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun # Install ICD OpenCL vendor config 225*4882a593Smuzhiyun if is_opencl_icd 226*4882a593Smuzhiyun custom_target( 227*4882a593Smuzhiyun 'OpenCL vendor icd', 228*4882a593Smuzhiyun output : 'mali.icd', 229*4882a593Smuzhiyun command : ['echo', 'libMaliOpenCL.so.1'], 230*4882a593Smuzhiyun capture : true, 231*4882a593Smuzhiyun install_dir : get_option('sysconfdir') / 'OpenCL' / 'vendors', 232*4882a593Smuzhiyun install : true) 233*4882a593Smuzhiyun endif 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun # Install ICD Vulkan vendor config 236*4882a593Smuzhiyun if is_vulkan_icd 237*4882a593Smuzhiyun custom_target( 238*4882a593Smuzhiyun 'Vulkan vendor icd', 239*4882a593Smuzhiyun input : 'data/vulkan/mali.json.in', 240*4882a593Smuzhiyun output : 'mali.json', 241*4882a593Smuzhiyun command : ['sed', 's/@LIB@/libMaliVulkan.so.1/', '@INPUT@'], 242*4882a593Smuzhiyun capture : true, 243*4882a593Smuzhiyun install_dir : get_option('datadir') / 'vulkan' / 'icd.d', 244*4882a593Smuzhiyun install : true) 245*4882a593Smuzhiyun endif 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun # No {headers, pkgconfig} for {ICD, vendor packages} 248*4882a593Smuzhiyun if is_opencl_icd or is_vulkan_icd or vendor_package 249*4882a593Smuzhiyun continue 250*4882a593Smuzhiyun endif 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun foreach src, dst : headers 253*4882a593Smuzhiyun install_subdir( 254*4882a593Smuzhiyun src, 255*4882a593Smuzhiyun install_dir : get_option('includedir') / dst, 256*4882a593Smuzhiyun install_mode : ['rw-r--r--', 'root'], 257*4882a593Smuzhiyun strip_directory : true) 258*4882a593Smuzhiyun endforeach 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun pkgconfig.generate( 261*4882a593Smuzhiyun libraries : mali_ldflags, 262*4882a593Smuzhiyun requires : requires, 263*4882a593Smuzhiyun version : pkg_version, 264*4882a593Smuzhiyun name : name, 265*4882a593Smuzhiyun description : 'Mali GPU User-Space Binary Driver Wrappers') 266*4882a593Smuzhiyunendforeach 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun# Install optional overlay 269*4882a593Smuzhiyunif get_option('with-overlay') 270*4882a593Smuzhiyun if is_px3se 271*4882a593Smuzhiyun install_data('overlay/S10libmali_px3se', 272*4882a593Smuzhiyun install_dir : get_option('sysconfdir') / 'init.d') 273*4882a593Smuzhiyun install_data('overlay/px3seBase', install_dir : get_option('bindir')) 274*4882a593Smuzhiyun endif 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun if is_rk3288 and subversion == 'all' 277*4882a593Smuzhiyun install_data('overlay/S10libmali_rk3288', 278*4882a593Smuzhiyun install_dir : get_option('sysconfdir') / 'init.d') 279*4882a593Smuzhiyun endif 280*4882a593Smuzhiyunendif 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun# Install firmwares 283*4882a593Smuzhiyunif gpu == 'valhall-g610' 284*4882a593Smuzhiyun install_data('firmware/g610/mali_csffw.bin', install_dir : '/lib/firmware') 285*4882a593Smuzhiyunendif 286*4882a593Smuzhiyun 287*4882a593Smuzhiyunif vendor_package 288*4882a593Smuzhiyun # Install vendor ld config 289*4882a593Smuzhiyun custom_target( 290*4882a593Smuzhiyun 'vendor ld config', 291*4882a593Smuzhiyun output : '00-' + arch + '-mali.conf', 292*4882a593Smuzhiyun command : ['echo', get_option('prefix') / wrapper_libdir], 293*4882a593Smuzhiyun capture : true, 294*4882a593Smuzhiyun install_dir : '/etc/ld.so.conf.d', 295*4882a593Smuzhiyun install : true) 296*4882a593Smuzhiyunelif get_option('khr-header') 297*4882a593Smuzhiyun # Install optional KHR header 298*4882a593Smuzhiyun install_data( 299*4882a593Smuzhiyun 'include/KHR/mali_khrplatform.h', 300*4882a593Smuzhiyun install_dir : get_option('includedir') / 'KHR', 301*4882a593Smuzhiyun install_mode : ['rw-r--r--', 'root'], 302*4882a593Smuzhiyun rename : 'khrplatform.h') 303*4882a593Smuzhiyunendif 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun# Install target libraries 306*4882a593Smuzhiyuninstall_data(libs, install_dir : get_option('libdir')) 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun# Replace dummy libmali library 309*4882a593Smuzhiyunmeson.add_install_script('scripts/fixup_dummy.sh', 310*4882a593Smuzhiyun get_option('libdir'), default_lib) 311*4882a593Smuzhiyun 312*4882a593Smuzhiyunif not wrappers 313*4882a593Smuzhiyun # Disable wrappers 314*4882a593Smuzhiyun meson.add_install_script('scripts/fixup_nowrap.sh', get_option('libdir')) 315*4882a593Smuzhiyunendif 316*4882a593Smuzhiyun 317*4882a593Smuzhiyunif not has_x11 and not vendor_package 318*4882a593Smuzhiyun # Disable X11 in EGL header 319*4882a593Smuzhiyun meson.add_install_script('scripts/fixup_nox11.sh', get_option('includedir')) 320*4882a593Smuzhiyunendif 321