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