xref: /OK3568_Linux_fs/external/libmali/meson.build (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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