#!/usr/bin/env python import sys from itertools import combinations from os import uname from multiprocessing import cpu_count from subprocess import call # Later, we want to test extended vaddr support. Apparently, the "real" way of # checking this is flaky on OS X. bits_64 = sys.maxsize > 2**32 nparallel = cpu_count() * 2 uname = uname()[0] if call("command -v gmake", shell=True) == 0: make_cmd = 'gmake' else: make_cmd = 'make' def powerset(items): result = [] for i in xrange(len(items) + 1): result += combinations(items, i) return result possible_compilers = [] for cc, cxx in (['gcc', 'g++'], ['clang', 'clang++']): try: cmd_ret = call([cc, "-v"]) if cmd_ret == 0: possible_compilers.append((cc, cxx)) except: pass possible_compiler_opts = [ '-m32', ] possible_config_opts = [ '--enable-debug', '--enable-prof', '--disable-stats', '--enable-opt-safety-checks', ] if bits_64: possible_config_opts.append('--with-lg-vaddr=56') possible_malloc_conf_opts = [ 'tcache:false', 'dss:primary', 'percpu_arena:percpu', 'background_thread:true', ] print 'set -e' print 'if [ -f Makefile ] ; then %(make_cmd)s relclean ; fi' % {'make_cmd': make_cmd} print 'autoconf' print 'rm -rf run_tests.out' print 'mkdir run_tests.out' print 'cd run_tests.out' ind = 0 for cc, cxx in possible_compilers: for compiler_opts in powerset(possible_compiler_opts): for config_opts in powerset(possible_config_opts): for malloc_conf_opts in powerset(possible_malloc_conf_opts): if cc is 'clang' \ and '-m32' in possible_compiler_opts \ and '--enable-prof' in config_opts: continue config_line = ( 'EXTRA_CFLAGS=-Werror EXTRA_CXXFLAGS=-Werror ' + 'CC="{} {}" '.format(cc, " ".join(compiler_opts)) + 'CXX="{} {}" '.format(cxx, " ".join(compiler_opts)) + '../../configure ' + " ".join(config_opts) + (' --with-malloc-conf=' + ",".join(malloc_conf_opts) if len(malloc_conf_opts) > 0 else '') ) # We don't want to test large vaddr spaces in 32-bit mode. if ('-m32' in compiler_opts and '--with-lg-vaddr=56' in config_opts): continue # Per CPU arenas are only supported on Linux. linux_supported = ('percpu_arena:percpu' in malloc_conf_opts \ or 'background_thread:true' in malloc_conf_opts) # Heap profiling and dss are not supported on OS X. darwin_unsupported = ('--enable-prof' in config_opts or \ 'dss:primary' in malloc_conf_opts) if (uname == 'Linux' and linux_supported) \ or (not linux_supported and (uname != 'Darwin' or \ not darwin_unsupported)): print """cat < run_test_%(ind)d.sh #!/bin/sh set -e abort() { echo "==> Error" >> run_test.log echo "Error; see run_tests.out/run_test_%(ind)d.out/run_test.log" exit 255 # Special exit code tells xargs to terminate. } # Environment variables are not supported. run_cmd() { echo "==> \$@" >> run_test.log \$@ >> run_test.log 2>&1 || abort } echo "=> run_test_%(ind)d: %(config_line)s" mkdir run_test_%(ind)d.out cd run_test_%(ind)d.out echo "==> %(config_line)s" >> run_test.log %(config_line)s >> run_test.log 2>&1 || abort run_cmd %(make_cmd)s all tests run_cmd %(make_cmd)s check run_cmd %(make_cmd)s distclean EOF chmod 755 run_test_%(ind)d.sh""" % {'ind': ind, 'config_line': config_line, 'make_cmd': make_cmd} ind += 1 print '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}