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