1
0
mirror of https://git.yoctoproject.org/poky synced 2026-06-05 02:20:12 +00:00

glibc-testsuite: Create a recipe to implement glibc test suite

A recipe needs to be created for the test suite due to the dependency
chain between libgcc -> glibc -> libgcc-initial, and the requirements of
the test suite to have libgcc for compilation and execution.

The glibc test suite does not use dejagnu like the gcc test suites do.
Instead a test wrapper script is used along with the assumed dependency
of having the same filesystem available on build host and target. For
qemu linux-user the same filesystem is inherently available, for remote
targets NFS is used. Separate test wrapper scripts are created for qemu
linux-user or ssh targets, with the same TOOLCHAIN_TEST_* variables used for
configuration.

(From OE-Core rev: 6c4d581c35ebd51c4b080ac38175d93f0480f97d)

Signed-off-by: Nathan Rossi <nathan@nathanrossi.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Nathan Rossi
2019-09-03 16:56:41 +00:00
committed by Richard Purdie
parent 6ccf0746cf
commit 182267b305
3 changed files with 123 additions and 0 deletions
+1
View File
@@ -217,6 +217,7 @@ RECIPE_MAINTAINER_pn-glibc = "Khem Raj <raj.khem@gmail.com>"
RECIPE_MAINTAINER_pn-glibc-locale = "Khem Raj <raj.khem@gmail.com>"
RECIPE_MAINTAINER_pn-glibc-mtrace = "Khem Raj <raj.khem@gmail.com>"
RECIPE_MAINTAINER_pn-glibc-scripts = "Khem Raj <raj.khem@gmail.com>"
RECIPE_MAINTAINER_pn-glibc-testsuite = "Khem Raj <raj.khem@gmail.com>"
RECIPE_MAINTAINER_pn-glide = "Otavio Salvador <otavio.salvador@ossystems.com.br>"
RECIPE_MAINTAINER_pn-gmp = "Khem Raj <raj.khem@gmail.com>"
RECIPE_MAINTAINER_pn-gnome-desktop-testing = "Ross Burton <ross.burton@intel.com>"
@@ -0,0 +1,51 @@
require glibc_${PV}.bb
# handle PN differences
FILESEXTRAPATHS_prepend := "${THISDIR}/glibc:"
# strip provides
PROVIDES = ""
# setup depends
INHIBIT_DEFAULT_DEPS = ""
DEPENDS += "glibc-locale libgcc gcc-runtime"
# remove the initial depends
DEPENDS_remove = "libgcc-initial"
inherit qemu
SRC_URI += "file://check-test-wrapper"
DEPENDS += "${@'qemu-native' if d.getVar('TOOLCHAIN_TEST_TARGET') == 'user' else ''}"
TOOLCHAIN_TEST_TARGET ??= "user"
TOOLCHAIN_TEST_HOST ??= "localhost"
TOOLCHAIN_TEST_HOST_USER ??= "root"
TOOLCHAIN_TEST_HOST_PORT ??= "2222"
do_check[dirs] += "${B}"
do_check[nostamp] = "1"
do_check () {
chmod 0755 ${WORKDIR}/check-test-wrapper
# clean out previous test results
oe_runmake tests-clean
# makefiles don't clean entirely (and also sometimes fails due to too many args)
find ${B} -type f -name "*.out" -delete
find ${B} -type f -name "*.test-result" -delete
find ${B}/catgets -name "*.cat" -delete
find ${B}/conform -name "symlist-*" -delete
[ ! -e ${B}/timezone/testdata ] || rm -rf ${B}/timezone/testdata
oe_runmake -i \
QEMU_SYSROOT="${RECIPE_SYSROOT}" \
QEMU_OPTIONS="${@qemu_target_binary(d)} ${QEMU_OPTIONS}" \
SSH_HOST="${TOOLCHAIN_TEST_HOST}" \
SSH_HOST_USER="${TOOLCHAIN_TEST_HOST_USER}" \
SSH_HOST_PORT="${TOOLCHAIN_TEST_HOST_PORT}" \
test-wrapper="${WORKDIR}/check-test-wrapper ${TOOLCHAIN_TEST_TARGET}" \
check
}
addtask do_check after do_compile
@@ -0,0 +1,71 @@
#!/usr/bin/env python3
import sys
import os
import subprocess
env = os.environ.copy()
args = sys.argv[1:]
targettype = args.pop(0)
if targettype == "user":
qemuargs = os.environ.get("QEMU_OPTIONS", "").split()
if not os.path.exists(qemuargs[0]):
# ensure qemu args has a valid absolute path
for i in os.environ.get("PATH", "").split(":"):
if os.path.exists(os.path.join(i, qemuargs[0])):
qemuargs[0] = os.path.join(i, qemuargs[0])
break
sysroot = os.environ.get("QEMU_SYSROOT", None)
if not sysroot:
sys.exit(-1)
libpaths = [sysroot + "/usr/lib", sysroot + "/lib"]
if args[0] == "env":
args.pop(0)
if len(args) == 0:
args = ["env"]
else:
# process options
while args[0].startswith("-"):
opt = args.pop(0).lstrip("-")
if "i" in opt:
env.clear()
# process environment vars
while "=" in args[0]:
key, val = args.pop(0).split("=", 1)
if key == "LD_LIBRARY_PATH":
libpaths += val.split(":")
else:
env[key] = val
if args[0] == "cp":
# ignore copies, the filesystem is the same
sys.exit(0)
qemuargs += ["-L", sysroot]
qemuargs += ["-E", "LD_LIBRARY_PATH={}".format(":".join(libpaths))]
command = qemuargs + args
elif targettype == "ssh":
host = os.environ.get("SSH_HOST", None)
user = os.environ.get("SSH_HOST_USER", None)
port = os.environ.get("SSH_HOST_PORT", None)
command = ["ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no"]
if port:
command += ["-p", str(port)]
if not host:
sys.exit(-1)
command += ["{}@{}".format(user, host) if user else host]
# wrap and replace quotes for correct transformation on ssh
wrapped = " ".join(["'{0}'".format(i.replace("'", r"'\''")) for i in ["cd", os.getcwd()]]) + "; "
wrapped += " ".join(["'{0}'".format(i.replace("'", r"'\''")) for i in args])
command += ["sh", "-c", "\"{}\"".format(wrapped)]
else:
sys.exit(-1)
try:
r = subprocess.run(command, timeout = 1800, env = env)
sys.exit(r.returncode)
except subprocess.TimeoutExpired:
sys.exit(-1)