]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
xserver-xorg: rewrite ABI dependency generation
authorRoss Burton <ross.burton@arm.com>
Fri, 22 Nov 2024 14:21:58 +0000 (14:21 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Sat, 23 Nov 2024 14:28:29 +0000 (14:28 +0000)
This was motivated by remembering that both xserver-xorg and xorgxrdp
need to ignore the xorg-driver-abi test in do_package_qa because the
logic to generate the required dependencies is contained in
xorg-driver-common.inc, so can't be reused easily by the xserver (which
ships the modesetting driver) or xorgxrdp (which ships drivers and more).

Merge both the RPROVIDES (xserver) and RDEPENDS (driver) functions into a
single xserver-abi.inc to ensure that their logic remains in sync.

Generalise the names: instead of hardcoding 'input' and 'video' extract
the ABI names from the pkg-config file directly. This means 'input' is
now 'xinput' and 'video' is now 'videodrv', also 'ansic' and 'extension'
are new ABIs exposed.

Rewrite the RDEPENDS generation so that it is more flexible, and can be
used from inside the xserver-xorg recipe to generate RDEPENDS for the
modesetting driver. This means that recipe can remove the INSANE_SKIP.

There's an argument that this new .inc file could be a bbclass, I'm
undecided on this myself right now and this patch is essentially a
rationalisation of the existing code.

Signed-off-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/recipes-graphics/xorg-driver/xorg-driver-common.inc
meta/recipes-graphics/xorg-driver/xorg-driver-input.inc
meta/recipes-graphics/xorg-driver/xorg-driver-video.inc
meta/recipes-graphics/xorg-xserver/xserver-abi.inc [new file with mode: 0644]
meta/recipes-graphics/xorg-xserver/xserver-xorg.inc

index 38848676f414a32e53a50d25a6adfeda98178736..dd964d466d0ff73da222cf931db84914c1d6a906 100644 (file)
@@ -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
index 4efb90278c5ec26c8a41b102a688709d232763bf..269a78931e390ea4c90d5c0dbf2685618c4027a7 100644 (file)
@@ -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"
 
index c9365d8954a8b8218a4a19b945664984488ee32d..18441210c2ef36ad3bb039f460d9bb3062d3f5c4 100644 (file)
@@ -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 (file)
index 0000000..9731185
--- /dev/null
@@ -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)
index e2754426cf1e2ed105e5b526200aee02bedf0106..3eb0de7b35306020cb4b1e486f54cfb11c9910a9 100644 (file)
@@ -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
-
-    # 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"))
+require xserver-abi.inc
+
+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)}"