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:
committed by
Richard Purdie
parent
6ccf0746cf
commit
182267b305
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user