xref: /OK3568_Linux_fs/yocto/poky/meta/recipes-graphics/mesa/mesa.inc (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1SUMMARY = "A free implementation of the OpenGL API"
2DESCRIPTION = "Mesa is an open-source implementation of the OpenGL specification - \
3a system for rendering interactive 3D graphics.  \
4A variety of device drivers allows Mesa to be used in many different environments \
5ranging from software emulation to complete hardware acceleration for modern GPUs. \
6Mesa is used as part of the overall Direct Rendering Infrastructure and X.org \
7environment."
8
9HOMEPAGE = "http://mesa3d.org"
10BUGTRACKER = "https://bugs.freedesktop.org"
11SECTION = "x11"
12LICENSE = "MIT"
13LIC_FILES_CHKSUM = "file://docs/license.rst;md5=9a383ee9f65a4e939d6630e9b067ff58"
14
15PE = "2"
16
17SRC_URI = "https://mesa.freedesktop.org/archive/mesa-${PV}.tar.xz \
18           file://0001-meson.build-check-for-all-linux-host_os-combinations.patch \
19           file://0002-meson.build-make-TLS-ELF-optional.patch \
20           file://0001-meson-misdetects-64bit-atomics-on-mips-clang.patch \
21           file://0001-futex.h-Define-__NR_futex-if-it-does-not-exist.patch \
22           file://0001-util-format-Check-for-NEON-before-using-it.patch \
23           file://0001-Revert-egl-wayland-deprecate-drm_handle_format-and-d.patch \
24           "
25
26SRC_URI[sha256sum] = "9f2b30f5276a9abaf71aafc6979685e2636189de1a87aea2c9e69744a6d0ebb9"
27
28UPSTREAM_CHECK_GITTAGREGEX = "mesa-(?P<pver>\d+(\.\d+)+)"
29
30#because we cannot rely on the fact that all apps will use pkgconfig,
31#make eglplatform.h independent of MESA_EGL_NO_X11_HEADER
32do_install:append() {
33    if ${@bb.utils.contains('PACKAGECONFIG', 'egl', 'true', 'false', d)}; then
34        sed -i -e 's/^#elif defined(__unix__) && defined(EGL_NO_X11)$/#elif defined(__unix__) \&\& defined(EGL_NO_X11) || ${@bb.utils.contains('PACKAGECONFIG', 'x11', '0', '1', d)}/' ${D}${includedir}/EGL/eglplatform.h
35    fi
36}
37
38DEPENDS = "expat makedepend-native flex-native bison-native libxml2-native zlib chrpath-replacement-native python3-mako-native gettext-native"
39EXTRANATIVEPATH += "chrpath-native"
40PROVIDES = " \
41    ${@bb.utils.contains('PACKAGECONFIG', 'opengl', 'virtual/libgl', '', d)} \
42    ${@bb.utils.contains('PACKAGECONFIG', 'gles', 'virtual/libgles1 virtual/libgles2 virtual/libgles3', '', d)} \
43    ${@bb.utils.contains('PACKAGECONFIG', 'egl', 'virtual/egl', '', d)} \
44    ${@bb.utils.contains('PACKAGECONFIG', 'gbm', 'virtual/libgbm', '', d)} \
45    virtual/mesa \
46    "
47
48inherit meson pkgconfig python3native gettext features_check
49
50BBCLASSEXTEND = "native nativesdk"
51
52ANY_OF_DISTRO_FEATURES:class-target = "opengl vulkan"
53
54PLATFORMS ??= "${@bb.utils.filter('PACKAGECONFIG', 'x11 wayland', d)}"
55
56export YOCTO_ALTERNATE_EXE_PATH = "${STAGING_LIBDIR}/llvm${MESA_LLVM_RELEASE}/llvm-config"
57export YOCTO_ALTERNATE_MULTILIB_NAME = "${base_libdir}"
58export LLVM_CONFIG = "${STAGING_BINDIR_NATIVE}/llvm-config${MESA_LLVM_RELEASE}"
59export WANT_LLVM_RELEASE = "${MESA_LLVM_RELEASE}"
60
61MESA_LLVM_RELEASE ?= "${LLVMVERSION}"
62
63# set the MESA_BUILD_TYPE to either 'release' (default) or 'debug'
64# by default the upstream mesa sources build a debug release
65# here we assume the user will want a release build by default
66MESA_BUILD_TYPE ?= "release"
67def check_buildtype(d):
68    _buildtype = d.getVar('MESA_BUILD_TYPE')
69    if _buildtype not in ['release', 'debug']:
70        bb.fatal("unknown build type (%s), please set MESA_BUILD_TYPE to either 'release' or 'debug'" % _buildtype)
71    if _buildtype == 'debug':
72        return 'debugoptimized'
73    return 'plain'
74MESON_BUILDTYPE = "${@check_buildtype(d)}"
75
76EXTRA_OEMESON = " \
77    -Dshared-glapi=enabled \
78    -Dglx-read-only-text=true \
79    -Dplatforms='${@",".join("${PLATFORMS}".split())}' \
80"
81
82def strip_comma(s):
83    return s.strip(',')
84
85PACKAGECONFIG = " \
86	gallium \
87	${@bb.utils.filter('DISTRO_FEATURES', 'x11 vulkan wayland', d)} \
88	${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'opengl egl gles gbm virgl', '', d)} \
89	${@bb.utils.contains('DISTRO_FEATURES', 'x11 opengl', 'dri3', '', d)} \
90	${@bb.utils.contains('DISTRO_FEATURES', 'x11 vulkan', 'dri3', '', d)} \
91	${@bb.utils.contains('TCLIBC', 'glibc', 'elf-tls', '', d)} \
92"
93
94# "gbm" requires "opengl"
95PACKAGECONFIG[gbm] = "-Dgbm=enabled,-Dgbm=disabled"
96
97X11_DEPS = "xorgproto virtual/libx11 libxext libxxf86vm libxdamage libxfixes xrandr"
98# "x11" requires "opengl"
99PACKAGECONFIG[x11] = ",-Dglx=disabled,${X11_DEPS}"
100PACKAGECONFIG[elf-tls] = "-Delf-tls=true, -Delf-tls=false"
101PACKAGECONFIG[xvmc] = "-Dgallium-xvmc=enabled,-Dgallium-xvmc=disabled,libxvmc"
102PACKAGECONFIG[wayland] = ",,wayland-native wayland libdrm wayland-protocols"
103
104PACKAGECONFIG[dri3] = "-Ddri3=enabled, -Ddri3=disabled, xorgproto libxshmfence"
105
106# Vulkan drivers need dri3 enabled
107# amd could be enabled as well but requires gallium-llvm with llvm >= 3.9
108VULKAN_DRIVERS = ""
109VULKAN_DRIVERS:append:x86:class-target = ",intel"
110VULKAN_DRIVERS:append:x86-64:class-target = ",intel"
111VULKAN_DRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'freedreno', ',freedreno', '', d)}"
112VULKAN_DRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'broadcom', ',broadcom', '', d)}"
113PACKAGECONFIG[vulkan] = "-Dvulkan-drivers=${@strip_comma('${VULKAN_DRIVERS}')}, -Dvulkan-drivers='',"
114
115PACKAGECONFIG[opengl] = "-Dopengl=true, -Dopengl=false"
116
117# "gles" requires "opengl"
118PACKAGECONFIG[gles] = "-Dgles1=enabled -Dgles2=enabled, -Dgles1=disabled -Dgles2=disabled"
119
120# "egl" requires "opengl"
121PACKAGECONFIG[egl] = "-Degl=enabled, -Degl=disabled"
122
123# "opencl" requires libclc from meta-clang and spirv-tools from OE-Core
124PACKAGECONFIG[opencl] = "-Dgallium-opencl=icd -Dopencl-spirv=true,-Dgallium-opencl=disabled -Dopencl-spirv=false,libclc spirv-tools"
125
126PACKAGECONFIG[broadcom] = ""
127PACKAGECONFIG[etnaviv] = ""
128PACKAGECONFIG[freedreno] = ""
129PACKAGECONFIG[kmsro] = ""
130PACKAGECONFIG[vc4] = ""
131PACKAGECONFIG[v3d] = ""
132
133GALLIUMDRIVERS = "swrast"
134# gallium swrast was found to crash Xorg on startup in x32 qemu
135GALLIUMDRIVERS:x86-x32 = ""
136GALLIUMDRIVERS:append:x86:class-target = ",i915,iris,crocus"
137GALLIUMDRIVERS:append:x86-64:class-target = ",i915,iris,crocus"
138
139GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'etnaviv', ',etnaviv', '', d)}"
140GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'freedreno', ',freedreno', '', d)}"
141GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'kmsro', ',kmsro', '', d)}"
142GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'vc4', ',vc4', '', d)}"
143GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'v3d', ',v3d', '', d)}"
144
145# radeonsi requires LLVM
146GALLIUMDRIVERS_RADEONSI = "${@bb.utils.contains('PACKAGECONFIG', 'r600', ',radeonsi', '', d)}"
147GALLIUMDRIVERS_LLVM = "r300,nouveau${GALLIUMDRIVERS_RADEONSI}"
148GALLIUMDRIVERS_LLVM:append:x86:class-target = ",svga"
149GALLIUMDRIVERS_LLVM:append:x86-64:class-target = ",svga"
150
151PACKAGECONFIG[r600] = ""
152PACKAGECONFIG[virgl] = ""
153
154GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'gallium-llvm', ',${GALLIUMDRIVERS_LLVM}', '', d)}"
155GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'r600', ',r600', '', d)}"
156GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'virgl', ',virgl', '', d)}"
157
158PACKAGECONFIG[gallium] = "-Dgallium-drivers=${@strip_comma('${GALLIUMDRIVERS}')}, -Dgallium-drivers='', libdrm"
159PACKAGECONFIG[gallium-llvm] = "-Dllvm=enabled -Dshared-llvm=enabled, -Dllvm=disabled, llvm${MESA_LLVM_RELEASE} llvm-native \
160                               elfutils"
161PACKAGECONFIG[xa]  = "-Dgallium-xa=enabled, -Dgallium-xa=disabled"
162PACKAGECONFIG[va] = "-Dgallium-va=enabled,-Dgallium-va=disabled,libva-initial"
163
164PACKAGECONFIG[vdpau] = "-Dgallium-vdpau=enabled,-Dgallium-vdpau=disabled,libvdpau"
165
166PACKAGECONFIG[lima] = ""
167GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'lima', ',lima', '', d)}"
168
169PACKAGECONFIG[panfrost] = ""
170GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'panfrost', ',panfrost', '', d)}"
171
172PACKAGECONFIG[osmesa] = "-Dosmesa=true,-Dosmesa=false"
173
174PACKAGECONFIG[unwind] = "-Dlibunwind=enabled,-Dlibunwind=disabled,libunwind"
175
176PACKAGECONFIG[lmsensors] = "-Dlmsensors=enabled,-Dlmsensors=disabled,lmsensors"
177
178# llvmpipe is slow if compiled with -fomit-frame-pointer (e.g. -O2)
179FULL_OPTIMIZATION:append = " -fno-omit-frame-pointer"
180
181CFLAGS:append:armv5 = " -DMISSING_64BIT_ATOMICS"
182CFLAGS:append:armv6 = " -DMISSING_64BIT_ATOMICS"
183
184# Remove the mesa dependency on mesa-dev, as mesa is empty
185RDEPENDS:${PN}-dev = ""
186
187# Khronos documentation says that include/GLES2/gl2ext.h can be used for
188# OpenGL ES 3 specification as well as for OpenGL ES 2.
189# There can be applications including GLES2/gl2ext.h instead of GLES3/gl3ext.h
190# meaning we should probably bring in GLES2/gl2ext.h if someone asks for
191# development package of libgles3.
192RDEPENDS:libgles3-mesa-dev += "libgles2-mesa-dev"
193
194RDEPENDS:libopencl-mesa += "${@bb.utils.contains('PACKAGECONFIG', 'opencl', 'libclc spirv-tools', '', d)}"
195
196PACKAGES =+ "libegl-mesa libegl-mesa-dev \
197             libosmesa libosmesa-dev \
198             libgl-mesa libgl-mesa-dev \
199             libglapi libglapi-dev \
200             libgbm libgbm-dev \
201             libgles1-mesa libgles1-mesa-dev \
202             libgles2-mesa libgles2-mesa-dev \
203             libgles3-mesa libgles3-mesa-dev \
204             libopencl-mesa libopencl-mesa-dev \
205             libxatracker libxatracker-dev \
206             mesa-megadriver mesa-vulkan-drivers \
207             mesa-vdpau-drivers \
208            "
209
210do_install:append () {
211    # Drivers never need libtool .la files
212    rm -f ${D}${libdir}/dri/*.la
213    rm -f ${D}${libdir}/egl/*.la
214    rm -f ${D}${libdir}/gallium-pipe/*.la
215    rm -f ${D}${libdir}/gbm/*.la
216
217    # it was packaged in libdricore9.1.3-1 and preventing upgrades when debian.bbclass was used
218    chrpath --delete ${D}${libdir}/dri/*_dri.so || true
219
220    # libwayland-egl has been moved to wayland 1.15+
221    rm -f ${D}${libdir}/libwayland-egl*
222    rm -f ${D}${libdir}/pkgconfig/wayland-egl.pc
223}
224
225# For the packages that make up the OpenGL interfaces, inject variables so that
226# they don't get Debian-renamed (which would remove the -mesa suffix), and
227# RPROVIDEs/RCONFLICTs on the generic libgl name.
228python __anonymous() {
229    pkgconfig = (d.getVar('PACKAGECONFIG') or "").split()
230    suffix = ""
231    if "-native" in d.getVar("PN"):
232        suffix = "-native"
233    for p in (("egl", "libegl", "libegl1"),
234              ("opengl", "libgl", "libgl1"),
235              ("gles", "libgles1", "libglesv1-cm1"),
236              ("gles", "libgles2", "libglesv2-2"),
237              ("gles", "libgles3",),
238              ("opencl", "libopencl",)):
239        if not p[0] in pkgconfig:
240            continue
241        mlprefix = d.getVar("MLPREFIX")
242        fullp = mlprefix + p[1] + "-mesa" + suffix
243        mlprefix = d.getVar("MLPREFIX")
244        pkgs = " " + " ".join(mlprefix + x + suffix for x in p[1:])
245        d.setVar("DEBIAN_NOAUTONAME:" + fullp, "1")
246        d.appendVar("RREPLACES:" + fullp, pkgs)
247        d.appendVar("RPROVIDES:" + fullp, pkgs)
248        d.appendVar("RCONFLICTS:" + fullp, pkgs)
249
250        d.appendVar("RRECOMMENDS:" + fullp, " ${MLPREFIX}mesa-megadriver" + suffix)
251
252        # For -dev, the first element is both the Debian and original name
253        fullp = mlprefix + p[1] + "-mesa-dev" + suffix
254        pkgs = " " + mlprefix + p[1] + "-dev" + suffix
255        d.setVar("DEBIAN_NOAUTONAME:" + fullp, "1")
256        d.appendVar("RREPLACES:" + fullp, pkgs)
257        d.appendVar("RPROVIDES:" + fullp, pkgs)
258        d.appendVar("RCONFLICTS:" + fullp, pkgs)
259}
260
261python mesa_populate_packages() {
262    pkgs = ['mesa', 'mesa-dev', 'mesa-dbg']
263    for pkg in pkgs:
264        d.setVar("RPROVIDES:%s" % pkg, pkg.replace("mesa", "mesa-dri", 1))
265        d.setVar("RCONFLICTS:%s" % pkg, pkg.replace("mesa", "mesa-dri", 1))
266        d.setVar("RREPLACES:%s" % pkg, pkg.replace("mesa", "mesa-dri", 1))
267
268    import re
269    dri_drivers_root = oe.path.join(d.getVar('PKGD'), d.getVar('libdir'), "dri")
270    if os.path.isdir(dri_drivers_root):
271        dri_pkgs = sorted(os.listdir(dri_drivers_root))
272        lib_name = d.expand("${MLPREFIX}mesa-megadriver")
273        for p in dri_pkgs:
274            m = re.match(r'^(.*)_dri\.so$', p)
275            if m:
276                pkg_name = " ${MLPREFIX}mesa-driver-%s" % legitimize_package_name(m.group(1))
277                d.appendVar("RPROVIDES:%s" % lib_name, pkg_name)
278                d.appendVar("RCONFLICTS:%s" % lib_name, pkg_name)
279                d.appendVar("RREPLACES:%s" % lib_name, pkg_name)
280
281    pipe_drivers_root = os.path.join(d.getVar('libdir'), "gallium-pipe")
282    do_split_packages(d, pipe_drivers_root, r'^pipe_(.*)\.so$', 'mesa-driver-pipe-%s', 'Mesa %s pipe driver', extra_depends='')
283}
284
285PACKAGESPLITFUNCS:prepend = "mesa_populate_packages "
286
287PACKAGES_DYNAMIC += "^mesa-driver-.*"
288PACKAGES_DYNAMIC:class-native = "^mesa-driver-.*-native"
289
290FILES:mesa-megadriver = "${libdir}/dri/* ${datadir}/drirc.d"
291FILES:mesa-vulkan-drivers = "${libdir}/libvulkan_*.so ${datadir}/vulkan"
292FILES:${PN}-vdpau-drivers = "${libdir}/vdpau/*.so.*"
293FILES:libegl-mesa = "${libdir}/libEGL.so.*"
294FILES:libgbm = "${libdir}/libgbm.so.*"
295FILES:libgles1-mesa = "${libdir}/libGLESv1*.so.*"
296FILES:libgles2-mesa = "${libdir}/libGLESv2.so.*"
297FILES:libgl-mesa = "${libdir}/libGL.so.*"
298FILES:libopencl-mesa = "${libdir}/libMesaOpenCL.so.* ${sysconfdir}/OpenCL/vendors/mesa.icd"
299FILES:libglapi = "${libdir}/libglapi.so.*"
300FILES:libosmesa = "${libdir}/libOSMesa.so.*"
301FILES:libxatracker = "${libdir}/libxatracker.so.*"
302
303FILES:${PN}-dev = "${libdir}/pkgconfig/dri.pc ${includedir}/vulkan ${libdir}/vdpau/*.so"
304FILES:libegl-mesa-dev = "${libdir}/libEGL.* ${includedir}/EGL ${includedir}/KHR ${libdir}/pkgconfig/egl.pc"
305FILES:libgbm-dev = "${libdir}/libgbm.* ${libdir}/pkgconfig/gbm.pc ${includedir}/gbm.h"
306FILES:libgl-mesa-dev = "${libdir}/libGL.* ${includedir}/GL ${libdir}/pkgconfig/gl.pc"
307FILES:libglapi-dev = "${libdir}/libglapi.*"
308FILES:libgles1-mesa-dev = "${libdir}/libGLESv1*.* ${includedir}/GLES ${libdir}/pkgconfig/glesv1*.pc"
309FILES:libgles2-mesa-dev = "${libdir}/libGLESv2.* ${includedir}/GLES2 ${libdir}/pkgconfig/glesv2.pc"
310FILES:libgles3-mesa-dev = "${includedir}/GLES3"
311FILES:libopencl-mesa-dev = "${libdir}/libMesaOpenCL.so"
312FILES:libosmesa-dev = "${libdir}/libOSMesa.* ${includedir}/GL/osmesa.h ${libdir}/pkgconfig/osmesa.pc"
313FILES:libxatracker-dev = "${libdir}/libxatracker.so ${libdir}/libxatracker.la \
314                          ${includedir}/xa_tracker.h ${includedir}/xa_composite.h ${includedir}/xa_context.h \
315                          ${libdir}/pkgconfig/xatracker.pc"
316
317# Fix upgrade path from mesa to mesa-megadriver
318RREPLACES:mesa-megadriver = "mesa"
319RCONFLICTS:mesa-megadriver = "mesa"
320RPROVIDES:mesa-megadriver = "mesa"
321