diff --git a/meta/recipes-graphics/xorg-driver/xorg-driver-common.inc b/meta/recipes-graphics/xorg-driver/xorg-driver-common.inc index 38848676f4..dd964d466d 100644 --- a/meta/recipes-graphics/xorg-driver/xorg-driver-common.inc +++ b/meta/recipes-graphics/xorg-driver/xorg-driver-common.inc @@ -20,20 +20,6 @@ inherit_defer ${XORGBUILDCLASS} # depends on virtual/xserver REQUIRED_DISTRO_FEATURES = "x11" -# Function to add the relevant ABI dependency to drivers, which should be called -# from a PACKAGEFUNC. -def _add_xorg_abi_depends(d, name): - # Map of ABI names exposed in the dependencies to pkg-config variables - abis = { - "video": "abi_videodrv", - "input": "abi_xinput" - } - - output = os.popen("pkg-config xorg-server --variable=%s" % abis[name]).read() - mlprefix = d.getVar('MLPREFIX') or '' - abi = "%sxorg-abi-%s-%s" % (mlprefix, name, output.split(".")[0]) - - pn = d.getVar("PN") - d.appendVar('RDEPENDS:' + pn, ' ' + abi) - SECURITY_LDFLAGS = "${SECURITY_X_LDFLAGS}" + +require recipes-graphics/xorg-xserver/xserver-abi.inc diff --git a/meta/recipes-graphics/xorg-driver/xorg-driver-input.inc b/meta/recipes-graphics/xorg-driver/xorg-driver-input.inc index 4efb90278c..269a78931e 100644 --- a/meta/recipes-graphics/xorg-driver/xorg-driver-input.inc +++ b/meta/recipes-graphics/xorg-driver/xorg-driver-input.inc @@ -1,7 +1,7 @@ require xorg-driver-common.inc python add_xorg_abi_depends() { - _add_xorg_abi_depends(d, "input") + _add_xorg_abi_depends(d, "xinput") } PACKAGEFUNCS =+ "add_xorg_abi_depends" diff --git a/meta/recipes-graphics/xorg-driver/xorg-driver-video.inc b/meta/recipes-graphics/xorg-driver/xorg-driver-video.inc index c9365d8954..18441210c2 100644 --- a/meta/recipes-graphics/xorg-driver/xorg-driver-video.inc +++ b/meta/recipes-graphics/xorg-driver/xorg-driver-video.inc @@ -1,6 +1,6 @@ require xorg-driver-common.inc python add_xorg_abi_depends() { - _add_xorg_abi_depends(d, "video") + _add_xorg_abi_depends(d, "videodrv") } PACKAGEFUNCS =+ "add_xorg_abi_depends" diff --git a/meta/recipes-graphics/xorg-xserver/xserver-abi.inc b/meta/recipes-graphics/xorg-xserver/xserver-abi.inc new file mode 100644 index 0000000000..9731185649 --- /dev/null +++ b/meta/recipes-graphics/xorg-xserver/xserver-abi.inc @@ -0,0 +1,48 @@ +# Add runtime provides for the ABI versions, so that drivers can depend on the +# relevant version. This should be called from PACKAGEFUNCS. +python add_xorg_abi_provides() { + import subprocess + + pn = d.getVar("PN") + mlprefix = d.getVar("MLPREFIX") or "" + + # Set PKG_CONFIG_PATH so pkg-config looks at the .pc files that are going + # into the new package, not the staged ones. + newenv = dict(os.environ) + newenv["PKG_CONFIG_PATH"] = d.expand("${PKGD}${libdir}/pkgconfig/:") + newenv["PKG_CONFIG_PATH"] + + # Get the list of ABIs that the pc file declares + cmd = ("pkg-config", "--print-variables", "xorg-server") + output = subprocess.run(cmd, check=True, capture_output=True, text=True, env=newenv).stdout + abis = [var for var in output.splitlines() if var.startswith("abi_")] + + # Set RPROVIDES for those ABIs with the major version + for abi in abis: + cmd = ("pkg-config", "--variable", abi, "xorg-server") + version = subprocess.run(cmd, check=True, capture_output=True, text=True, env=newenv).stdout + major = version.split(".")[0] + + provides = " %sxorg-%s-%s" % (mlprefix, abi.replace("_", "-"), major) + d.appendVar("RPROVIDES:" + pn, provides) +} + +# Add the specified ABI dependency to the specified package. +# If package is not set then PN is used. +# This should be called via a shim function in PACKAGEFUNCS. +def _add_xorg_abi_depends(d, abi, package=None): + import subprocess + + if not package: + package = d.getVar("PN") + + # Set PKG_CONFIG_PATH to cater for the case where xserver is + # itself providing drivers. + newenv = dict(os.environ) + newenv["PKG_CONFIG_PATH"] = d.expand("${PKGD}${libdir}/pkgconfig/:") + newenv["PKG_CONFIG_PATH"] + + mlprefix = d.getVar("MLPREFIX") or "" + cmd = ("pkg-config", "xorg-server", "--variable=abi_%s" % abi) + output = subprocess.run(cmd, text=True, capture_output=True, check=True, env=newenv).stdout + abi = "%sxorg-abi-%s-%s" % (mlprefix, abi, output.split(".")[0]) + + d.appendVar('RDEPENDS:' + package, ' ' + abi) diff --git a/meta/recipes-graphics/xorg-xserver/xserver-xorg.inc b/meta/recipes-graphics/xorg-xserver/xserver-xorg.inc index e2754426cf..3eb0de7b35 100644 --- a/meta/recipes-graphics/xorg-xserver/xserver-xorg.inc +++ b/meta/recipes-graphics/xorg-xserver/xserver-xorg.inc @@ -79,7 +79,6 @@ PACKAGES =+ "${PN}-sdl \ xf86-video-modesetting" SUMMARY:xf86-video-modesetting = "X.Org X server -- modesetting display driver" -INSANE_SKIP:${MLPREFIX}xf86-video-modesetting = "xorg-driver-abi" XSERVER_RDEPENDS = "xkeyboard-config rgb xserver-xf86-config xkbcomp xf86-input-libinput" RDEPENDS:${PN} += "${XSERVER_RDEPENDS}" @@ -149,31 +148,12 @@ do_install:append () { sed -i -e 's,${libdir}/xorg/modules,${prefix}/lib*/xorg/modules,' ${D}${mandir}/man5/xorg.conf.5 } -# Add runtime provides for the ABI versions of the video and input subsystems, -# so that drivers can depend on the relevant version. -python populate_packages:prepend() { - import subprocess +require xserver-abi.inc - # Set PKG_CONFIG_PATH so pkg-config looks at the .pc files that are going - # into the new package, not the staged ones. - newenv = dict(os.environ) - newenv["PKG_CONFIG_PATH"] = d.expand("${PKGD}${libdir}/pkgconfig/") - - def get_abi(name): - abis = { - "video": "abi_videodrv", - "input": "abi_xinput" - } - p = subprocess.Popen(args="pkg-config --variable=%s xorg-server" % abis[name], - shell=True, env=newenv, stdout=subprocess.PIPE) - stdout, stderr = p.communicate() - output = stdout.decode("utf-8").split(".")[0] - mlprefix = d.getVar('MLPREFIX') or '' - return "%sxorg-abi-%s-%s" % (mlprefix, name, output) - - pn = d.getVar("PN") - d.appendVar("RPROVIDES:" + pn, " " + get_abi("input")) - d.appendVar("RPROVIDES:" + pn, " " + get_abi("video")) +python add_xorg_abi_depends() { + _add_xorg_abi_depends(d, "videodrv", d.expand("${MLPREFIX}xf86-video-modesetting")) } +PACKAGEFUNCS =+ "add_xorg_abi_provides add_xorg_abi_depends" + CVE_STATUS[CVE-2023-5574] = "${@bb.utils.contains('PACKAGECONFIG', 'xvfb', 'unpatched', 'not-applicable-config: specific to Xvfb', d)}"