oeqa/sdk/meson: generalise test case

Refactor this test case so the generic "build a meson project" code is
separated out and can be reused.

Also currently meson inside eSDKs only works with fully populated eSDKs,
but our testing uses minimal eSDKS, so skip the test if the eSDK is a
minimal build.  A bug has been filed to resolve this.

(From OE-Core rev: 575e0bf52db0467d88af4b5fe467b682f10ca62a)

Signed-off-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Ross Burton 2025-05-10 09:43:44 +01:00 committed by Richard Purdie
parent ff06a1b425
commit fa6d138447

View File

@ -10,37 +10,54 @@ import tempfile
import unittest import unittest
from oeqa.sdk.case import OESDKTestCase from oeqa.sdk.case import OESDKTestCase
from oeqa.sdkext.context import OESDKExtTestContext
from oeqa.utils.subprocesstweak import errors_have_output from oeqa.utils.subprocesstweak import errors_have_output
errors_have_output() errors_have_output()
class MesonTest(OESDKTestCase): class MesonTestBase(OESDKTestCase):
"""
Test that Meson builds correctly.
"""
def setUp(self): def setUp(self):
libc = self.td.get("TCLIBC") libc = self.td.get("TCLIBC")
if libc in [ 'newlib' ]: if libc in [ 'newlib' ]:
raise unittest.SkipTest("MesonTest class: SDK doesn't contain a supported C library") raise unittest.SkipTest("MesonTest class: SDK doesn't contain a supported C library")
if isinstance(self.tc, OESDKExtTestContext):
self.skipTest(f"{self.id()} does not support eSDK (https://bugzilla.yoctoproject.org/show_bug.cgi?id=15854)")
self.ensure_host_package("meson") self.ensure_host_package("meson")
self.ensure_host_package("pkgconfig")
def build_meson(self, sourcedir, builddir, installdir=None, options=""):
"""
Given a source tree in sourcedir, configure it to build in builddir with
the specified options, and if installdir is set also install.
"""
log = self._run(f"meson setup --warnlevel 1 {builddir} {sourcedir} {options}")
# Check that Meson thinks we're doing a cross build and not a native
self.assertIn("Build type: cross build", log)
self._run(f"meson compile -C {builddir} -v")
if installdir:
self._run(f"meson install -C {builddir} --destdir {installdir}")
class MesonTest(MesonTestBase):
"""
Test that Meson builds correctly.
"""
def test_epoxy(self): def test_epoxy(self):
with tempfile.TemporaryDirectory(prefix="epoxy", dir=self.tc.sdk_dir) as testdir: with tempfile.TemporaryDirectory(prefix="epoxy", dir=self.tc.sdk_dir) as testdir:
tarball = self.fetch(testdir, self.td["DL_DIR"], "https://github.com/anholt/libepoxy/releases/download/1.5.3/libepoxy-1.5.3.tar.xz") tarball = self.fetch(testdir, self.td["DL_DIR"], "https://github.com/anholt/libepoxy/releases/download/1.5.3/libepoxy-1.5.3.tar.xz")
dirs = {} sourcedir = os.path.join(testdir, "libepoxy-1.5.3")
dirs["source"] = os.path.join(testdir, "libepoxy-1.5.3") builddir = os.path.join(testdir, "build")
dirs["build"] = os.path.join(testdir, "build") installdir = os.path.join(testdir, "install")
dirs["install"] = os.path.join(testdir, "install")
subprocess.check_output(["tar", "xf", tarball, "-C", testdir], stderr=subprocess.STDOUT) subprocess.check_output(["tar", "xf", tarball, "-C", testdir], stderr=subprocess.STDOUT)
self.assertTrue(os.path.isdir(dirs["source"])) self.assertTrue(os.path.isdir(sourcedir))
os.makedirs(dirs["build"])
log = self._run("meson --warnlevel 1 -Degl=no -Dglx=no -Dx11=false {build} {source}".format(**dirs)) os.makedirs(builddir)
# Check that Meson thinks we're doing a cross build and not a native self.build_meson(sourcedir, builddir, installdir, "-Degl=no -Dglx=no -Dx11=false")
self.assertIn("Build type: cross build", log) self.assertTrue(os.path.isdir(installdir))
self._run("ninja -C {build} -v".format(**dirs)) self.check_elf(os.path.join(installdir, "usr", "local", "lib", "libepoxy.so"))
self._run("DESTDIR={install} ninja -C {build} -v install".format(**dirs))
self.check_elf(os.path.join(dirs["install"], "usr", "local", "lib", "libepoxy.so"))