Exemple #1
0
def copy_system_libraries(env, kitdir, files, extra_ld_library_paths=[]):
    """copy system libraries to kit on Linux systems. Return True on success."""

    # Make a temporary environment for running ldd that includes any required
    # LD_LIBRARY_PATH additions.
    osenv = None
    if extra_ld_library_paths:
        osenv = copy.deepcopy(os.environ)
        s = None
        if 'LD_LIBRARY_PATH' in osenv:
            s = osenv['LD_LIBRARY_PATH']
        osenv['LD_LIBRARY_PATH'] = ":".join(extra_ld_library_paths)
        if s:
            osenv['LD_LIBRARY_PATH'] += ":" + s

    okay = True
    if env.on_linux() or env.on_freebsd() or env.on_netbsd():
        system_libraries = set()
        for binary_executable in files:
            if os.path.exists(binary_executable):
                (retval, lines, stderr) = mbuild.run_command(
                    "ldd {}".format(binary_executable), osenv=osenv)
                for line in lines:
                    line = line.rstrip()
                    print("\t{}".format(line))
                if retval != 0:  # error handling
                    if len(lines) >= 1:
                        if lines[0].find("not a dynamic executable") != -1:
                            continue
                        elif lines[0].find(
                                "not a dynamic ELF executable") != -1:
                            continue
                    mbuild.warn("Could not run ldd on [%s]" %
                                binary_executable)
                    return False
                if env.on_freebsd() or env.on_netbsd():
                    lines = lines[1:]
                ldd_okay, files = _grab_ldd_libraries(lines)
                if not ldd_okay:
                    okay = False
                for lib in files:
                    if not _file_to_avoid(env, lib):
                        system_libraries.add(lib)

        for slib in system_libraries:
            mbuild.msgb("TO COPY", slib)
        for slib in system_libraries:
            mbuild.copy_file(src=slib, tgt=kitdir)
    return okay
Exemple #2
0
def work(args):
    print("Testing performance...")

    if not os.path.exists(args.input):
        mbuild.warn("Performance test input binary not found: {}".format(
            args.input))
        return 2
    if not os.path.exists(args.xed):
        mbuild.warn("Performance test executable binary not found: {}".format(
            args.xed))
        return 2

    s = args.xed + ' -v 0 -i ' + args.input
    cpd = []

    print("Skipping {} samples...".format(args.skip))
    for sample in range(0, args.skip):
        (status, stdout, stderr) = mbuild.run_command(s)

    print("Running  {} tests...".format(args.samples))
    for sample in range(0, args.samples):
        (status, stdout, stderr) = mbuild.run_command(s)
        found = False
        if status == 0 and stdout:
            for line in stdout:
                if '#Total cycles/instruction DECODE' in line:
                    chunks = line.strip().split()
                    cpd_one = float(chunks[-1])
                    found = True
        if status and stdout:
            print("Error messages from sample {0:d}:".format(sample))
            for line in stdout:
                print("   ", line, end=' ')
        if found:
            cpd.append(cpd_one)

    if len(cpd) == args.samples:

        expected = 450.0  # cycles / decode

        cpd_min = min(cpd)
        cpd_max = max(cpd)
        cpd_avg = sum(cpd) / len(cpd)
        print(
            textwrap.fill("Samples: " +
                          ", ".join(["{0:6.2f}".format(x) for x in cpd]),
                          subsequent_indent="         "))

        print("Minimum: {0:6.2f}".format(cpd_min))
        print("Average: {0:6.2f}".format(cpd_avg))
        print("Maximum: {0:6.2f}".format(cpd_max))
        print("Range  : {0:6.2f}".format(cpd_max - cpd_min))
        print("Stddev : {0:6.2f}".format(standard_deviation(cpd)))

        if cpd_avg > expected:
            s = ["PERFORMANCE DEGREDATION: "]
            s.append("Observed {0:.2f} vs Expected {1:.2f}".format(
                cpd_avg, expected))
            print("".join(s))
            return 1  # error
        print("Success. Average less than {0:.2f}".format(expected))

        if args.graph:
            graph_it(cpd)
        return 0  # success
    print("MISSING SAMPLES")
    return 2