1*1208bc7eSAndroid Build Coastguard Worker#!/usr/bin/env python 2*1208bc7eSAndroid Build Coastguard Worker 3*1208bc7eSAndroid Build Coastguard Workerimport sys 4*1208bc7eSAndroid Build Coastguard Workerfrom itertools import combinations 5*1208bc7eSAndroid Build Coastguard Workerfrom os import uname 6*1208bc7eSAndroid Build Coastguard Workerfrom multiprocessing import cpu_count 7*1208bc7eSAndroid Build Coastguard Worker 8*1208bc7eSAndroid Build Coastguard Worker# Later, we want to test extended vaddr support. Apparently, the "real" way of 9*1208bc7eSAndroid Build Coastguard Worker# checking this is flaky on OS X. 10*1208bc7eSAndroid Build Coastguard Workerbits_64 = sys.maxsize > 2**32 11*1208bc7eSAndroid Build Coastguard Worker 12*1208bc7eSAndroid Build Coastguard Workernparallel = cpu_count() * 2 13*1208bc7eSAndroid Build Coastguard Worker 14*1208bc7eSAndroid Build Coastguard Workeruname = uname()[0] 15*1208bc7eSAndroid Build Coastguard Worker 16*1208bc7eSAndroid Build Coastguard Workerdef powerset(items): 17*1208bc7eSAndroid Build Coastguard Worker result = [] 18*1208bc7eSAndroid Build Coastguard Worker for i in xrange(len(items) + 1): 19*1208bc7eSAndroid Build Coastguard Worker result += combinations(items, i) 20*1208bc7eSAndroid Build Coastguard Worker return result 21*1208bc7eSAndroid Build Coastguard Worker 22*1208bc7eSAndroid Build Coastguard Workerpossible_compilers = [('gcc', 'g++'), ('clang', 'clang++')] 23*1208bc7eSAndroid Build Coastguard Workerpossible_compiler_opts = [ 24*1208bc7eSAndroid Build Coastguard Worker '-m32', 25*1208bc7eSAndroid Build Coastguard Worker] 26*1208bc7eSAndroid Build Coastguard Workerpossible_config_opts = [ 27*1208bc7eSAndroid Build Coastguard Worker '--enable-debug', 28*1208bc7eSAndroid Build Coastguard Worker '--enable-prof', 29*1208bc7eSAndroid Build Coastguard Worker '--disable-stats', 30*1208bc7eSAndroid Build Coastguard Worker] 31*1208bc7eSAndroid Build Coastguard Workerif bits_64: 32*1208bc7eSAndroid Build Coastguard Worker possible_config_opts.append('--with-lg-vaddr=56') 33*1208bc7eSAndroid Build Coastguard Worker 34*1208bc7eSAndroid Build Coastguard Workerpossible_malloc_conf_opts = [ 35*1208bc7eSAndroid Build Coastguard Worker 'tcache:false', 36*1208bc7eSAndroid Build Coastguard Worker 'dss:primary', 37*1208bc7eSAndroid Build Coastguard Worker 'percpu_arena:percpu', 38*1208bc7eSAndroid Build Coastguard Worker 'background_thread:true', 39*1208bc7eSAndroid Build Coastguard Worker] 40*1208bc7eSAndroid Build Coastguard Worker 41*1208bc7eSAndroid Build Coastguard Workerprint 'set -e' 42*1208bc7eSAndroid Build Coastguard Workerprint 'if [ -f Makefile ] ; then make relclean ; fi' 43*1208bc7eSAndroid Build Coastguard Workerprint 'autoconf' 44*1208bc7eSAndroid Build Coastguard Workerprint 'rm -rf run_tests.out' 45*1208bc7eSAndroid Build Coastguard Workerprint 'mkdir run_tests.out' 46*1208bc7eSAndroid Build Coastguard Workerprint 'cd run_tests.out' 47*1208bc7eSAndroid Build Coastguard Worker 48*1208bc7eSAndroid Build Coastguard Workerind = 0 49*1208bc7eSAndroid Build Coastguard Workerfor cc, cxx in possible_compilers: 50*1208bc7eSAndroid Build Coastguard Worker for compiler_opts in powerset(possible_compiler_opts): 51*1208bc7eSAndroid Build Coastguard Worker for config_opts in powerset(possible_config_opts): 52*1208bc7eSAndroid Build Coastguard Worker for malloc_conf_opts in powerset(possible_malloc_conf_opts): 53*1208bc7eSAndroid Build Coastguard Worker if cc is 'clang' \ 54*1208bc7eSAndroid Build Coastguard Worker and '-m32' in possible_compiler_opts \ 55*1208bc7eSAndroid Build Coastguard Worker and '--enable-prof' in config_opts: 56*1208bc7eSAndroid Build Coastguard Worker continue 57*1208bc7eSAndroid Build Coastguard Worker config_line = ( 58*1208bc7eSAndroid Build Coastguard Worker 'EXTRA_CFLAGS=-Werror EXTRA_CXXFLAGS=-Werror ' 59*1208bc7eSAndroid Build Coastguard Worker + 'CC="{} {}" '.format(cc, " ".join(compiler_opts)) 60*1208bc7eSAndroid Build Coastguard Worker + 'CXX="{} {}" '.format(cxx, " ".join(compiler_opts)) 61*1208bc7eSAndroid Build Coastguard Worker + '../../configure ' 62*1208bc7eSAndroid Build Coastguard Worker + " ".join(config_opts) + (' --with-malloc-conf=' + 63*1208bc7eSAndroid Build Coastguard Worker ",".join(malloc_conf_opts) if len(malloc_conf_opts) > 0 64*1208bc7eSAndroid Build Coastguard Worker else '') 65*1208bc7eSAndroid Build Coastguard Worker ) 66*1208bc7eSAndroid Build Coastguard Worker 67*1208bc7eSAndroid Build Coastguard Worker # We don't want to test large vaddr spaces in 32-bit mode. 68*1208bc7eSAndroid Build Coastguard Worker if ('-m32' in compiler_opts and '--with-lg-vaddr=56' in 69*1208bc7eSAndroid Build Coastguard Worker config_opts): 70*1208bc7eSAndroid Build Coastguard Worker continue 71*1208bc7eSAndroid Build Coastguard Worker 72*1208bc7eSAndroid Build Coastguard Worker # Per CPU arenas are only supported on Linux. 73*1208bc7eSAndroid Build Coastguard Worker linux_supported = ('percpu_arena:percpu' in malloc_conf_opts \ 74*1208bc7eSAndroid Build Coastguard Worker or 'background_thread:true' in malloc_conf_opts) 75*1208bc7eSAndroid Build Coastguard Worker # Heap profiling and dss are not supported on OS X. 76*1208bc7eSAndroid Build Coastguard Worker darwin_unsupported = ('--enable-prof' in config_opts or \ 77*1208bc7eSAndroid Build Coastguard Worker 'dss:primary' in malloc_conf_opts) 78*1208bc7eSAndroid Build Coastguard Worker if (uname == 'Linux' and linux_supported) \ 79*1208bc7eSAndroid Build Coastguard Worker or (not linux_supported and (uname != 'Darwin' or \ 80*1208bc7eSAndroid Build Coastguard Worker not darwin_unsupported)): 81*1208bc7eSAndroid Build Coastguard Worker print """cat <<EOF > run_test_%(ind)d.sh 82*1208bc7eSAndroid Build Coastguard Worker#!/bin/sh 83*1208bc7eSAndroid Build Coastguard Worker 84*1208bc7eSAndroid Build Coastguard Workerset -e 85*1208bc7eSAndroid Build Coastguard Worker 86*1208bc7eSAndroid Build Coastguard Workerabort() { 87*1208bc7eSAndroid Build Coastguard Worker echo "==> Error" >> run_test.log 88*1208bc7eSAndroid Build Coastguard Worker echo "Error; see run_tests.out/run_test_%(ind)d.out/run_test.log" 89*1208bc7eSAndroid Build Coastguard Worker exit 255 # Special exit code tells xargs to terminate. 90*1208bc7eSAndroid Build Coastguard Worker} 91*1208bc7eSAndroid Build Coastguard Worker 92*1208bc7eSAndroid Build Coastguard Worker# Environment variables are not supported. 93*1208bc7eSAndroid Build Coastguard Workerrun_cmd() { 94*1208bc7eSAndroid Build Coastguard Worker echo "==> \$@" >> run_test.log 95*1208bc7eSAndroid Build Coastguard Worker \$@ >> run_test.log 2>&1 || abort 96*1208bc7eSAndroid Build Coastguard Worker} 97*1208bc7eSAndroid Build Coastguard Worker 98*1208bc7eSAndroid Build Coastguard Workerecho "=> run_test_%(ind)d: %(config_line)s" 99*1208bc7eSAndroid Build Coastguard Workermkdir run_test_%(ind)d.out 100*1208bc7eSAndroid Build Coastguard Workercd run_test_%(ind)d.out 101*1208bc7eSAndroid Build Coastguard Worker 102*1208bc7eSAndroid Build Coastguard Workerecho "==> %(config_line)s" >> run_test.log 103*1208bc7eSAndroid Build Coastguard Worker%(config_line)s >> run_test.log 2>&1 || abort 104*1208bc7eSAndroid Build Coastguard Worker 105*1208bc7eSAndroid Build Coastguard Workerrun_cmd make all tests 106*1208bc7eSAndroid Build Coastguard Workerrun_cmd make check 107*1208bc7eSAndroid Build Coastguard Workerrun_cmd make distclean 108*1208bc7eSAndroid Build Coastguard WorkerEOF 109*1208bc7eSAndroid Build Coastguard Workerchmod 755 run_test_%(ind)d.sh""" % {'ind': ind, 'config_line': config_line} 110*1208bc7eSAndroid Build Coastguard Worker ind += 1 111*1208bc7eSAndroid Build Coastguard Worker 112*1208bc7eSAndroid Build Coastguard Workerprint 'for i in `seq 0 %(last_ind)d` ; do echo run_test_${i}.sh ; done | xargs -P %(nparallel)d -n 1 sh' % {'last_ind': ind-1, 'nparallel': nparallel} 113