compile_all.py 5.8 KB
Newer Older
Enrico Pozzobon committed
1 2 3 4
#!/usr/bin/env python3

import os
import sys
Enrico Pozzobon committed
5
import stat
Enrico Pozzobon committed
6
import shutil
Enrico Pozzobon committed
7
import random
Enrico Pozzobon committed
8 9
import subprocess

Enrico Pozzobon committed
10

Enrico Pozzobon committed
11
def build(algo_dir, template_dir, build_dir):
Enrico Pozzobon committed
12
    # create a new directory for the build
Enrico Pozzobon committed
13 14 15 16 17
    while build_dir is None:
        r = "%09d" % random.randint(0, 999999999)
        d = os.path.join("build", r)
        if not os.path.isdir(d):
            build_dir = d
18
    print("Building in %s" % build_dir)
Enrico Pozzobon committed
19 20
   
    # copy all the files from the submitted algorithm into the build directory
Enrico Pozzobon committed
21 22
    shutil.copytree(algo_dir, build_dir)

Enrico Pozzobon committed
23
    # remove the test vectors generator if it is there
Enrico Pozzobon committed
24 25 26 27
    c = os.path.join(build_dir, "genkat_aead.c")
    if os.path.exists(c):
        os.remove(c)

Enrico Pozzobon committed
28
    # find all c and h files, since they will be added to the makefile
29 30 31 32 33 34 35 36 37
    hfiles = []
    cfiles = []
    for r, d, f in os.walk(build_dir):
        for file in f:
            if file.endswith(".c"):
                cfiles.append(file)
            elif file.endswith(".h"):
                hfiles.append(file)

Enrico Pozzobon committed
38
    # copy all the files from the template directory into the build directory
39 40 41 42 43 44 45 46 47 48
    for f in os.listdir(template_dir):
        dst = os.path.join(build_dir, f)
        src = os.path.join(template_dir, f)
        if os.path.isfile(src) or os.path.islink(src):
            shutil.copy2(src, dst)
        elif os.path.isdir(src):
            shutil.copytree(src, dst)
        else:
            raise Exception("I don't know what %s is" % src)

Enrico Pozzobon committed
49
    # prepare the environmental variables for the makefile
Enrico Pozzobon committed
50 51 52 53
    env = os.environ
    env['SRC_FILES'] = ' '.join(cfiles)
    env['HDR_FILES'] = ' '.join(hfiles)

Enrico Pozzobon committed
54
    # enter the directory and execute the makefile
Enrico Pozzobon committed
55
    wd = os.getcwd()
Enrico Pozzobon committed
56
    os.chdir(build_dir)
Enrico Pozzobon committed
57
    try:
58
        if os.path.isfile('./configure'):
Enrico Pozzobon committed
59 60 61
            p = subprocess.Popen(["./configure"])
            p.wait()
            assert p.returncode == 0
62

Enrico Pozzobon committed
63 64 65
        p = subprocess.Popen(['make'])
        p.wait()
        assert p.returncode == 0
Enrico Pozzobon committed
66

67 68 69 70 71 72
        if os.path.isfile('./cleanup'):
            p = subprocess.Popen(["./cleanup"])
            p.wait()
            assert p.returncode == 0


Enrico Pozzobon committed
73
    finally:
74 75
        sys.stdout.flush()
        sys.stderr.flush()
Enrico Pozzobon committed
76 77
        os.chdir(wd)

Enrico Pozzobon committed
78
    # if execution arrives here, the build was successful
Enrico Pozzobon committed
79 80
    return build_dir

Enrico Pozzobon committed
81 82

# Find test vectors in directory or one of the parent directories
Enrico Pozzobon committed
83 84
def find_test_vectors(d):
    kat = None
Enrico Pozzobon committed
85
    while True:
Enrico Pozzobon committed
86 87 88 89 90 91 92
        if d == '':
            raise Exception("Test vector not found")
        for f in os.listdir(d):
            if f.startswith("LWC_AEAD_KAT_") and f.endswith(".txt"):
                if kat is not None:
                    raise Exception("Multiple test vectors?")
                kat = f
Enrico Pozzobon committed
93 94 95 96
        if kat is None:
            d = os.path.split(d)[0]
        else:
            break
Enrico Pozzobon committed
97 98
    kat = os.path.join(d, kat)
    return kat
Enrico Pozzobon committed
99

Enrico Pozzobon committed
100

101
def main(argv):
Enrico Pozzobon committed
102
    submissions_dir = "all-lwc-submission-files"
103 104 105 106
    template_dir = "templates/linux"
    if len(argv) > 1:
        template_dir = argv[1]
    print("Using template %s" % template_dir)
Enrico Pozzobon committed
107 108
    subs = os.listdir(submissions_dir)

Enrico Pozzobon committed
109
    # get all the submissions by looking for files named "api.h"
Enrico Pozzobon committed
110
    files = []
Enrico Pozzobon committed
111 112 113
    for submission in subs:
        implementations_dir = os.path.join(submissions_dir, submission, "Implementations", "crypto_aead")

Enrico Pozzobon committed
114 115 116 117 118 119 120 121 122 123
        if not os.path.isdir(implementations_dir):
            continue

        if "NOT ACCEPTED" in implementations_dir:
            continue

        print()
        print("###  %s  ###" % submission)

        c = 0
Enrico Pozzobon committed
124 125 126
        # r=root, d=directories, f = files
        for r, d, f in os.walk(implementations_dir):
            for file in f:
Enrico Pozzobon committed
127
                if file == "api.h":
Enrico Pozzobon committed
128
                    f = os.path.join(r, file)
Enrico Pozzobon committed
129 130

                    # Source directory d
Enrico Pozzobon committed
131 132
                    d = os.path.split(f)[0]
                    assert os.path.isdir(d)
Enrico Pozzobon committed
133
                    print(d)
Enrico Pozzobon committed
134 135

                    # Test vectors file t
Enrico Pozzobon committed
136 137
                    t = find_test_vectors(d)
                    print(t)
Enrico Pozzobon committed
138 139 140 141 142 143 144 145

                    # base name n
                    pieces = r.split(os.sep)
                    n = submission + "." + ".".join(pieces[4:])
                    print(n)

                    # Put all in a tuple and count
                    files.append((t, d, n))
Enrico Pozzobon committed
146 147 148 149 150 151 152
                    c += 1

        if c == 0:
            raise Exception("No implementations found")



153
    # For testing, we only do the first 1
154
    #files = files[:1]
Enrico Pozzobon committed
155

Enrico Pozzobon committed
156
    # Clear the build directory as it is a leftover from the previous execution
Enrico Pozzobon committed
157 158
    if os.path.isdir('build'):
        shutil.rmtree('build')
Enrico Pozzobon committed
159
    os.mkdir('build')
Enrico Pozzobon committed
160 161 162

    print()

Enrico Pozzobon committed
163 164 165 166
    # Write a script that executes all the tests one after the other
    test_script_path = os.path.join("build", "test_all.sh")
    with open(test_script_path, 'w') as test_script:
        test_script.write("#!/bin/sh\n")
Enrico Pozzobon committed
167 168
        test_script.write("mkdir -p logs\n")
        test_script.write("mkdir -p measurements\n")
Enrico Pozzobon committed
169
        for i, (t, d, name) in enumerate(files):
Enrico Pozzobon committed
170 171
            print()
            print(d)
172
            try:
Enrico Pozzobon committed
173 174 175
                build_dir = os.path.join("build", name)
                b = build(d, template_dir, build_dir)
                test_script.write("\n\necho \"TEST NUMBER %03d: TESTING %s\"\n" % (i, d))
176
                test_script.write("python3 -u ./test.py %s %s 2> %s | tee %s\n" % (
Enrico Pozzobon committed
177 178 179 180
                        t,
                        os.path.join(b, 'test'),
                        os.path.join(b, 'test_stderr.log'),
                        os.path.join(b, 'test_stdout.log'))
181
                )
Enrico Pozzobon committed
182

183
                print("COMPILATION SUCCESS FOR %s" % d)
Enrico Pozzobon committed
184
            except Exception as ex:
185
                print("COMPILATION FAILED FOR %s" % d)
Enrico Pozzobon committed
186
                print(ex)
187

Enrico Pozzobon committed
188 189
    st = os.stat(test_script_path)
    os.chmod(test_script_path, st.st_mode | stat.S_IEXEC)
Enrico Pozzobon committed
190

191 192 193 194
    print()
    print()
    print("Now execute ' %s ' to start the test" % test_script_path)

Enrico Pozzobon committed
195 196 197

if __name__ == "__main__":
    sys.exit(main(sys.argv))