xref: /openbmc/openbmc/poky/meta/recipes-devtools/gcc/gcc-testsuite.inc (revision 8460358c3d24c71d9d38fd126c745854a6301564)
1inherit qemu
2
3TOOLCHAIN_TEST_TARGET ??= "user"
4TOOLCHAIN_TEST_HOST ??= "localhost"
5TOOLCHAIN_TEST_HOST_USER ??= "root"
6TOOLCHAIN_TEST_HOST_PORT ??= "2222"
7
8MAKE_CHECK_BOARDFLAGS ??= ""
9MAKE_CHECK_BOARDARGS ??= "--target_board=${TOOLCHAIN_TEST_TARGET}${MAKE_CHECK_BOARDFLAGS}"
10
11python () {
12    # Provide the targets compiler args via targets options. This allows dejagnu to
13    # correctly mark incompatible tests as UNSUPPORTED (e.g. needs soft-float
14    # but running on hard-float target).
15    #
16    # These options are called "multilib_flags" within the gcc test suite. Most
17    # architectures handle these options in a sensible way such that tests that
18    # are incompatible with the provided multilib are marked as UNSUPPORTED.
19    #
20    # Note: multilib flags are added to the compile command after the args
21    # provided by any test (through dg-options), CFLAGS_FOR_TARGET is always
22    # added to the compile command before any other args but is not interpted
23    # as options like multilib flags.
24    #
25    # i686, x86-64 and aarch64 are special, since most toolchains built for
26    # these targets don't do multilib the tests do not get correctly marked as
27    # UNSUPPORTED. More importantly the test suite itself does not handle
28    # overriding the multilib flags where it could (like other archs do). As
29    # such do not pass the target compiler args for these targets.
30    args = d.getVar("TUNE_CCARGS").split()
31    if d.getVar("TUNE_ARCH") in ["i686", "x86_64", "aarch64"]:
32        args = []
33    d.setVar("MAKE_CHECK_BOARDFLAGS", ("/" + "/".join(args)) if len(args) != 0 else "")
34}
35
36python check_prepare() {
37    def generate_qemu_linux_user_config(d):
38        content = []
39        content.append('load_generic_config "sim"')
40        content.append('load_base_board_description "basic-sim"')
41        content.append('process_multilib_options ""')
42
43        # qemu args
44        qemu_binary = qemu_target_binary(d)
45        if not qemu_binary:
46            bb.fatal("Missing target qemu linux-user binary")
47
48        args = []
49        # QEMU_OPTIONS is not always valid due to -cross recipe
50        args += ["-r", d.getVar("OLDEST_KERNEL")]
51        # enable all valid instructions, since the test suite itself does not
52        # limit itself to the target cpu options.
53        #   - valid for x86*, powerpc, arm, arm64
54        if qemu_binary.endswith(("x86_64", "i386", "arm", "aarch64")):
55            args += ["-cpu", "max"]
56        elif qemu_binary.endswith(("ppc", "mips", "mips64")):
57            extra = d.getVar("QEMU_EXTRAOPTIONS_%s" % d.getVar('PACKAGE_ARCH'))
58            if extra:
59                args += extra.split()
60        # For mips64 we could set a maximal CPU (e.g. Loongson-3A4000) however they either have MSA
61        # or Loongson-MMI vector extensions, not both and qemu lacks complete support for MMI
62        sysroot = d.getVar("RECIPE_SYSROOT")
63        args += ["-L", sysroot]
64        # lib paths are static here instead of using $libdir since this is used by a -cross recipe
65        libpaths = [sysroot + "/usr/lib", sysroot + "/lib"]
66        args += ["-E", "LD_LIBRARY_PATH={0}".format(":".join(libpaths))]
67
68        content.append('set_board_info is_simulator 1')
69        content.append('set_board_info sim "{0}"'.format(qemu_binary))
70        content.append('set_board_info sim,options "{0}"'.format(" ".join(args)))
71
72        # target build/test config
73        content.append('set_board_info target_install {%s}' % d.getVar("TARGET_SYS"))
74        content.append('set_board_info ldscript ""')
75        #content.append('set_board_info needs_status_wrapper 1') # qemu-linux-user return codes work, and abort works fine
76        content.append('set_board_info gcc,stack_size 16834')
77        content.append('set_board_info gdb,nosignals 1')
78        content.append('set_board_info gcc,timeout 60')
79
80        return "\n".join(content)
81
82    def generate_remote_ssh_linux_config(d):
83        content = []
84        content.append('load_generic_config "unix"')
85        content.append('process_multilib_options ""')
86        content.append("set_board_info hostname {0}".format(d.getVar("TOOLCHAIN_TEST_HOST")))
87        content.append("set_board_info username {0}".format(d.getVar("TOOLCHAIN_TEST_HOST_USER")))
88
89        port = d.getVar("TOOLCHAIN_TEST_HOST_PORT")
90        content.append("set_board_info rsh_prog \"/usr/bin/ssh -p {0} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no\"".format(port))
91        content.append("set_board_info rcp_prog \"/usr/bin/scp -P {0} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no\"".format(port))
92
93        return "\n".join(content)
94
95    dejagnudir = d.expand("${WORKDIR}/dejagnu")
96    if not os.path.isdir(dejagnudir):
97        os.makedirs(dejagnudir)
98
99    # write out target qemu board config
100    with open(os.path.join(dejagnudir, "user.exp"), "w") as f:
101        f.write(generate_qemu_linux_user_config(d))
102
103    # write out target ssh board config
104    with open(os.path.join(dejagnudir, "linux-ssh.exp"), "w") as f:
105        f.write(generate_remote_ssh_linux_config(d))
106
107    # generate site.exp to provide boards
108    with open(os.path.join(dejagnudir, "site.exp"), "w") as f:
109        f.write("lappend boards_dir {0}\n".format(dejagnudir))
110        f.write("set CFLAGS_FOR_TARGET \"{0}\"\n".format(d.getVar("TOOLCHAIN_OPTIONS")))
111}
112
113