inherit qemu TOOLCHAIN_TEST_TARGET ??= "user" TOOLCHAIN_TEST_HOST ??= "localhost" TOOLCHAIN_TEST_HOST_USER ??= "root" TOOLCHAIN_TEST_HOST_PORT ??= "2222" MAKE_CHECK_BOARDFLAGS ??= "" MAKE_CHECK_BOARDARGS ??= "--target_board=${TOOLCHAIN_TEST_TARGET}${MAKE_CHECK_BOARDFLAGS}" python () { # Provide the targets compiler args via targets options. This allows dejagnu to # correctly mark incompatible tests as UNSUPPORTED (e.g. needs soft-float # but running on hard-float target). # # These options are called "multilib_flags" within the gcc test suite. Most # architectures handle these options in a sensible way such that tests that # are incompatible with the provided multilib are marked as UNSUPPORTED. # # Note: multilib flags are added to the compile command after the args # provided by any test (through dg-options), CFLAGS_FOR_TARGET is always # added to the compile command before any other args but is not interpted # as options like multilib flags. # # i686, x86-64 and aarch64 are special, since most toolchains built for # these targets don't do multilib the tests do not get correctly marked as # UNSUPPORTED. More importantly the test suite itself does not handle # overriding the multilib flags where it could (like other archs do). As # such do not pass the target compiler args for these targets. args = d.getVar("TUNE_CCARGS").split() if d.getVar("TUNE_ARCH") in ["i686", "x86_64", "aarch64"]: args = [] d.setVar("MAKE_CHECK_BOARDFLAGS", ("/" + "/".join(args)) if len(args) != 0 else "") } python check_prepare() { def generate_qemu_linux_user_config(d): content = [] content.append('load_generic_config "sim"') content.append('load_base_board_description "basic-sim"') content.append('process_multilib_options ""') # qemu args qemu_binary = qemu_target_binary(d) if not qemu_binary: bb.fatal("Missing target qemu linux-user binary") args = [] # QEMU_OPTIONS is not always valid due to -cross recipe args += ["-r", d.getVar("OLDEST_KERNEL")] # enable all valid instructions, since the test suite itself does not # limit itself to the target cpu options. # - valid for x86*, powerpc, arm, arm64 if qemu_binary.lstrip("qemu-") in ["x86_64", "i386", "ppc", "arm", "aarch64"]: args += ["-cpu", "max"] sysroot = d.getVar("RECIPE_SYSROOT") args += ["-L", sysroot] # lib paths are static here instead of using $libdir since this is used by a -cross recipe libpaths = [sysroot + "/usr/lib", sysroot + "/lib"] args += ["-E", "LD_LIBRARY_PATH={0}".format(":".join(libpaths))] content.append('set_board_info is_simulator 1') content.append('set_board_info sim "{0}"'.format(qemu_binary)) content.append('set_board_info sim,options "{0}"'.format(" ".join(args))) # target build/test config content.append('set_board_info target_install {%s}' % d.getVar("TARGET_SYS")) content.append('set_board_info ldscript ""') #content.append('set_board_info needs_status_wrapper 1') # qemu-linux-user return codes work, and abort works fine content.append('set_board_info gcc,stack_size 16834') content.append('set_board_info gdb,nosignals 1') content.append('set_board_info gcc,timeout 60') return "\n".join(content) def generate_remote_ssh_linux_config(d): content = [] content.append('load_generic_config "unix"') content.append('process_multilib_options ""') content.append("set_board_info hostname {0}".format(d.getVar("TOOLCHAIN_TEST_HOST"))) content.append("set_board_info username {0}".format(d.getVar("TOOLCHAIN_TEST_HOST_USER"))) port = d.getVar("TOOLCHAIN_TEST_HOST_PORT") content.append("set_board_info rsh_prog \"/usr/bin/ssh -p {0} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no\"".format(port)) content.append("set_board_info rcp_prog \"/usr/bin/scp -P {0} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no\"".format(port)) return "\n".join(content) dejagnudir = d.expand("${WORKDIR}/dejagnu") if not os.path.isdir(dejagnudir): os.makedirs(dejagnudir) # write out target qemu board config with open(os.path.join(dejagnudir, "user.exp"), "w") as f: f.write(generate_qemu_linux_user_config(d)) # write out target ssh board config with open(os.path.join(dejagnudir, "ssh.exp"), "w") as f: f.write(generate_remote_ssh_linux_config(d)) # generate site.exp to provide boards with open(os.path.join(dejagnudir, "site.exp"), "w") as f: f.write("lappend boards_dir {0}\n".format(dejagnudir)) f.write("set CFLAGS_FOR_TARGET \"{0}\"\n".format(d.getVar("TOOLCHAIN_OPTIONS"))) }