Home | History | Annotate | Line # | Download | only in scripts
gen_run_tests.py revision 1.1.1.1.14.1
      1  1.1.1.1.14.1  perseant #!/usr/bin/env python3
      2           1.1  christos 
      3           1.1  christos import sys
      4           1.1  christos from itertools import combinations
      5           1.1  christos from os import uname
      6           1.1  christos from multiprocessing import cpu_count
      7  1.1.1.1.14.1  perseant from subprocess import call
      8           1.1  christos 
      9           1.1  christos # Later, we want to test extended vaddr support.  Apparently, the "real" way of
     10           1.1  christos # checking this is flaky on OS X.
     11           1.1  christos bits_64 = sys.maxsize > 2**32
     12           1.1  christos 
     13           1.1  christos nparallel = cpu_count() * 2
     14           1.1  christos 
     15           1.1  christos uname = uname()[0]
     16           1.1  christos 
     17  1.1.1.1.14.1  perseant if call("command -v gmake", shell=True) == 0:
     18  1.1.1.1.14.1  perseant     make_cmd = 'gmake'
     19  1.1.1.1.14.1  perseant else:
     20  1.1.1.1.14.1  perseant     make_cmd = 'make'
     21  1.1.1.1.14.1  perseant 
     22           1.1  christos def powerset(items):
     23           1.1  christos     result = []
     24  1.1.1.1.14.1  perseant     for i in range(len(items) + 1):
     25           1.1  christos         result += combinations(items, i)
     26           1.1  christos     return result
     27           1.1  christos 
     28  1.1.1.1.14.1  perseant possible_compilers = []
     29  1.1.1.1.14.1  perseant for cc, cxx in (['gcc', 'g++'], ['clang', 'clang++']):
     30  1.1.1.1.14.1  perseant     try:
     31  1.1.1.1.14.1  perseant         cmd_ret = call([cc, "-v"])
     32  1.1.1.1.14.1  perseant         if cmd_ret == 0:
     33  1.1.1.1.14.1  perseant             possible_compilers.append((cc, cxx))
     34  1.1.1.1.14.1  perseant     except:
     35  1.1.1.1.14.1  perseant         pass
     36           1.1  christos possible_compiler_opts = [
     37           1.1  christos     '-m32',
     38           1.1  christos ]
     39           1.1  christos possible_config_opts = [
     40           1.1  christos     '--enable-debug',
     41           1.1  christos     '--enable-prof',
     42           1.1  christos     '--disable-stats',
     43  1.1.1.1.14.1  perseant     '--enable-opt-safety-checks',
     44  1.1.1.1.14.1  perseant     '--with-lg-page=16',
     45           1.1  christos ]
     46           1.1  christos if bits_64:
     47           1.1  christos     possible_config_opts.append('--with-lg-vaddr=56')
     48           1.1  christos 
     49           1.1  christos possible_malloc_conf_opts = [
     50           1.1  christos     'tcache:false',
     51           1.1  christos     'dss:primary',
     52           1.1  christos     'percpu_arena:percpu',
     53           1.1  christos     'background_thread:true',
     54           1.1  christos ]
     55           1.1  christos 
     56  1.1.1.1.14.1  perseant print('set -e')
     57  1.1.1.1.14.1  perseant print('if [ -f Makefile ] ; then %(make_cmd)s relclean ; fi' % {'make_cmd':
     58  1.1.1.1.14.1  perseant     make_cmd})
     59  1.1.1.1.14.1  perseant print('autoconf')
     60  1.1.1.1.14.1  perseant print('rm -rf run_tests.out')
     61  1.1.1.1.14.1  perseant print('mkdir run_tests.out')
     62  1.1.1.1.14.1  perseant print('cd run_tests.out')
     63           1.1  christos 
     64           1.1  christos ind = 0
     65           1.1  christos for cc, cxx in possible_compilers:
     66           1.1  christos     for compiler_opts in powerset(possible_compiler_opts):
     67           1.1  christos         for config_opts in powerset(possible_config_opts):
     68           1.1  christos             for malloc_conf_opts in powerset(possible_malloc_conf_opts):
     69  1.1.1.1.14.1  perseant                 if cc == 'clang' \
     70           1.1  christos                   and '-m32' in possible_compiler_opts \
     71           1.1  christos                   and '--enable-prof' in config_opts:
     72           1.1  christos                     continue
     73           1.1  christos                 config_line = (
     74           1.1  christos                     'EXTRA_CFLAGS=-Werror EXTRA_CXXFLAGS=-Werror '
     75           1.1  christos                     + 'CC="{} {}" '.format(cc, " ".join(compiler_opts))
     76           1.1  christos                     + 'CXX="{} {}" '.format(cxx, " ".join(compiler_opts))
     77           1.1  christos                     + '../../configure '
     78           1.1  christos                     + " ".join(config_opts) + (' --with-malloc-conf=' +
     79           1.1  christos                     ",".join(malloc_conf_opts) if len(malloc_conf_opts) > 0
     80           1.1  christos                     else '')
     81           1.1  christos                 )
     82           1.1  christos 
     83           1.1  christos                 # We don't want to test large vaddr spaces in 32-bit mode.
     84  1.1.1.1.14.1  perseant                 if ('-m32' in compiler_opts and '--with-lg-vaddr=56' in
     85  1.1.1.1.14.1  perseant                     config_opts):
     86  1.1.1.1.14.1  perseant                     continue
     87           1.1  christos 
     88           1.1  christos                 # Per CPU arenas are only supported on Linux.
     89           1.1  christos                 linux_supported = ('percpu_arena:percpu' in malloc_conf_opts \
     90           1.1  christos                   or 'background_thread:true' in malloc_conf_opts)
     91           1.1  christos                 # Heap profiling and dss are not supported on OS X.
     92           1.1  christos                 darwin_unsupported = ('--enable-prof' in config_opts or \
     93           1.1  christos                   'dss:primary' in malloc_conf_opts)
     94           1.1  christos                 if (uname == 'Linux' and linux_supported) \
     95           1.1  christos                   or (not linux_supported and (uname != 'Darwin' or \
     96           1.1  christos                   not darwin_unsupported)):
     97  1.1.1.1.14.1  perseant                     print("""cat <<EOF > run_test_%(ind)d.sh
     98           1.1  christos #!/bin/sh
     99           1.1  christos 
    100           1.1  christos set -e
    101           1.1  christos 
    102           1.1  christos abort() {
    103           1.1  christos     echo "==> Error" >> run_test.log
    104           1.1  christos     echo "Error; see run_tests.out/run_test_%(ind)d.out/run_test.log"
    105           1.1  christos     exit 255 # Special exit code tells xargs to terminate.
    106           1.1  christos }
    107           1.1  christos 
    108           1.1  christos # Environment variables are not supported.
    109           1.1  christos run_cmd() {
    110           1.1  christos     echo "==> \$@" >> run_test.log
    111           1.1  christos     \$@ >> run_test.log 2>&1 || abort
    112           1.1  christos }
    113           1.1  christos 
    114           1.1  christos echo "=> run_test_%(ind)d: %(config_line)s"
    115           1.1  christos mkdir run_test_%(ind)d.out
    116           1.1  christos cd run_test_%(ind)d.out
    117           1.1  christos 
    118           1.1  christos echo "==> %(config_line)s" >> run_test.log
    119           1.1  christos %(config_line)s >> run_test.log 2>&1 || abort
    120           1.1  christos 
    121  1.1.1.1.14.1  perseant run_cmd %(make_cmd)s all tests
    122  1.1.1.1.14.1  perseant run_cmd %(make_cmd)s check
    123  1.1.1.1.14.1  perseant run_cmd %(make_cmd)s distclean
    124           1.1  christos EOF
    125  1.1.1.1.14.1  perseant chmod 755 run_test_%(ind)d.sh""" % {'ind': ind, 'config_line': config_line,
    126  1.1.1.1.14.1  perseant       'make_cmd': make_cmd})
    127           1.1  christos                     ind += 1
    128           1.1  christos 
    129  1.1.1.1.14.1  perseant print('for i in `seq 0 %(last_ind)d` ; do echo run_test_${i}.sh ; done | xargs'
    130  1.1.1.1.14.1  perseant     ' -P %(nparallel)d -n 1 sh' % {'last_ind': ind-1, 'nparallel': nparallel})
    131