summaryrefslogtreecommitdiffstats
path: root/meta/recipes-core
diff options
context:
space:
mode:
authorNathan Rossi <nathan@nathanrossi.com>2019-09-03 16:56:41 (GMT)
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-09-06 11:45:47 (GMT)
commit182267b3052de9539bd0a72ffdfc41e54ed3b298 (patch)
tree1c8ae95d36d29bd66a459906317e7ac259b051d1 /meta/recipes-core
parent6ccf0746cf91bf9e792e9dfe41389eeb286db803 (diff)
downloadpoky-182267b3052de9539bd0a72ffdfc41e54ed3b298.tar.gz
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>
Diffstat (limited to 'meta/recipes-core')
-rw-r--r--meta/recipes-core/glibc/glibc-testsuite_2.30.bb51
-rw-r--r--meta/recipes-core/glibc/glibc/check-test-wrapper71
2 files changed, 122 insertions, 0 deletions
diff --git a/meta/recipes-core/glibc/glibc-testsuite_2.30.bb b/meta/recipes-core/glibc/glibc-testsuite_2.30.bb
new file mode 100644
index 0000000..88764d9
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc-testsuite_2.30.bb
@@ -0,0 +1,51 @@
1require glibc_${PV}.bb
2
3# handle PN differences
4FILESEXTRAPATHS_prepend := "${THISDIR}/glibc:"
5
6# strip provides
7PROVIDES = ""
8# setup depends
9INHIBIT_DEFAULT_DEPS = ""
10
11DEPENDS += "glibc-locale libgcc gcc-runtime"
12
13# remove the initial depends
14DEPENDS_remove = "libgcc-initial"
15
16inherit qemu
17
18SRC_URI += "file://check-test-wrapper"
19
20DEPENDS += "${@'qemu-native' if d.getVar('TOOLCHAIN_TEST_TARGET') == 'user' else ''}"
21
22TOOLCHAIN_TEST_TARGET ??= "user"
23TOOLCHAIN_TEST_HOST ??= "localhost"
24TOOLCHAIN_TEST_HOST_USER ??= "root"
25TOOLCHAIN_TEST_HOST_PORT ??= "2222"
26
27do_check[dirs] += "${B}"
28do_check[nostamp] = "1"
29do_check () {
30 chmod 0755 ${WORKDIR}/check-test-wrapper
31
32 # clean out previous test results
33 oe_runmake tests-clean
34 # makefiles don't clean entirely (and also sometimes fails due to too many args)
35 find ${B} -type f -name "*.out" -delete
36 find ${B} -type f -name "*.test-result" -delete
37 find ${B}/catgets -name "*.cat" -delete
38 find ${B}/conform -name "symlist-*" -delete
39 [ ! -e ${B}/timezone/testdata ] || rm -rf ${B}/timezone/testdata
40
41 oe_runmake -i \
42 QEMU_SYSROOT="${RECIPE_SYSROOT}" \
43 QEMU_OPTIONS="${@qemu_target_binary(d)} ${QEMU_OPTIONS}" \
44 SSH_HOST="${TOOLCHAIN_TEST_HOST}" \
45 SSH_HOST_USER="${TOOLCHAIN_TEST_HOST_USER}" \
46 SSH_HOST_PORT="${TOOLCHAIN_TEST_HOST_PORT}" \
47 test-wrapper="${WORKDIR}/check-test-wrapper ${TOOLCHAIN_TEST_TARGET}" \
48 check
49}
50addtask do_check after do_compile
51
diff --git a/meta/recipes-core/glibc/glibc/check-test-wrapper b/meta/recipes-core/glibc/glibc/check-test-wrapper
new file mode 100644
index 0000000..f8e04e0
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/check-test-wrapper
@@ -0,0 +1,71 @@
1#!/usr/bin/env python3
2import sys
3import os
4import subprocess
5
6env = os.environ.copy()
7args = sys.argv[1:]
8targettype = args.pop(0)
9
10if targettype == "user":
11 qemuargs = os.environ.get("QEMU_OPTIONS", "").split()
12 if not os.path.exists(qemuargs[0]):
13 # ensure qemu args has a valid absolute path
14 for i in os.environ.get("PATH", "").split(":"):
15 if os.path.exists(os.path.join(i, qemuargs[0])):
16 qemuargs[0] = os.path.join(i, qemuargs[0])
17 break
18 sysroot = os.environ.get("QEMU_SYSROOT", None)
19 if not sysroot:
20 sys.exit(-1)
21 libpaths = [sysroot + "/usr/lib", sysroot + "/lib"]
22
23 if args[0] == "env":
24 args.pop(0)
25 if len(args) == 0:
26 args = ["env"]
27 else:
28 # process options
29 while args[0].startswith("-"):
30 opt = args.pop(0).lstrip("-")
31 if "i" in opt:
32 env.clear()
33 # process environment vars
34 while "=" in args[0]:
35 key, val = args.pop(0).split("=", 1)
36 if key == "LD_LIBRARY_PATH":
37 libpaths += val.split(":")
38 else:
39 env[key] = val
40 if args[0] == "cp":
41 # ignore copies, the filesystem is the same
42 sys.exit(0)
43
44 qemuargs += ["-L", sysroot]
45 qemuargs += ["-E", "LD_LIBRARY_PATH={}".format(":".join(libpaths))]
46 command = qemuargs + args
47elif targettype == "ssh":
48 host = os.environ.get("SSH_HOST", None)
49 user = os.environ.get("SSH_HOST_USER", None)
50 port = os.environ.get("SSH_HOST_PORT", None)
51
52 command = ["ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no"]
53 if port:
54 command += ["-p", str(port)]
55 if not host:
56 sys.exit(-1)
57 command += ["{}@{}".format(user, host) if user else host]
58
59 # wrap and replace quotes for correct transformation on ssh
60 wrapped = " ".join(["'{0}'".format(i.replace("'", r"'\''")) for i in ["cd", os.getcwd()]]) + "; "
61 wrapped += " ".join(["'{0}'".format(i.replace("'", r"'\''")) for i in args])
62 command += ["sh", "-c", "\"{}\"".format(wrapped)]
63else:
64 sys.exit(-1)
65
66try:
67 r = subprocess.run(command, timeout = 1800, env = env)
68 sys.exit(r.returncode)
69except subprocess.TimeoutExpired:
70 sys.exit(-1)
71