1*1208bc7eSAndroid Build Coastguard Worker#!/usr/bin/env python 2*1208bc7eSAndroid Build Coastguard Worker 3*1208bc7eSAndroid Build Coastguard Workerfrom itertools import combinations 4*1208bc7eSAndroid Build Coastguard Worker 5*1208bc7eSAndroid Build Coastguard Workertravis_template = """\ 6*1208bc7eSAndroid Build Coastguard Workerlanguage: generic 7*1208bc7eSAndroid Build Coastguard Worker 8*1208bc7eSAndroid Build Coastguard Workermatrix: 9*1208bc7eSAndroid Build Coastguard Worker include: 10*1208bc7eSAndroid Build Coastguard Worker%s 11*1208bc7eSAndroid Build Coastguard Worker 12*1208bc7eSAndroid Build Coastguard Workerbefore_script: 13*1208bc7eSAndroid Build Coastguard Worker - autoconf 14*1208bc7eSAndroid Build Coastguard Worker - ./configure ${COMPILER_FLAGS:+ \ 15*1208bc7eSAndroid Build Coastguard Worker CC="$CC $COMPILER_FLAGS" \ 16*1208bc7eSAndroid Build Coastguard Worker CXX="$CXX $COMPILER_FLAGS" } \ 17*1208bc7eSAndroid Build Coastguard Worker $CONFIGURE_FLAGS 18*1208bc7eSAndroid Build Coastguard Worker - make -j3 19*1208bc7eSAndroid Build Coastguard Worker - make -j3 tests 20*1208bc7eSAndroid Build Coastguard Worker 21*1208bc7eSAndroid Build Coastguard Workerscript: 22*1208bc7eSAndroid Build Coastguard Worker - make check 23*1208bc7eSAndroid Build Coastguard Worker""" 24*1208bc7eSAndroid Build Coastguard Worker 25*1208bc7eSAndroid Build Coastguard Worker# The 'default' configuration is gcc, on linux, with no compiler or configure 26*1208bc7eSAndroid Build Coastguard Worker# flags. We also test with clang, -m32, --enable-debug, --enable-prof, 27*1208bc7eSAndroid Build Coastguard Worker# --disable-stats, and --with-malloc-conf=tcache:false. To avoid abusing 28*1208bc7eSAndroid Build Coastguard Worker# travis though, we don't test all 2**7 = 128 possible combinations of these; 29*1208bc7eSAndroid Build Coastguard Worker# instead, we only test combinations of up to 2 'unusual' settings, under the 30*1208bc7eSAndroid Build Coastguard Worker# hope that bugs involving interactions of such settings are rare. 31*1208bc7eSAndroid Build Coastguard Worker# Things at once, for C(7, 0) + C(7, 1) + C(7, 2) = 29 32*1208bc7eSAndroid Build Coastguard WorkerMAX_UNUSUAL_OPTIONS = 2 33*1208bc7eSAndroid Build Coastguard Worker 34*1208bc7eSAndroid Build Coastguard Workeros_default = 'linux' 35*1208bc7eSAndroid Build Coastguard Workeros_unusual = 'osx' 36*1208bc7eSAndroid Build Coastguard Worker 37*1208bc7eSAndroid Build Coastguard Workercompilers_default = 'CC=gcc CXX=g++' 38*1208bc7eSAndroid Build Coastguard Workercompilers_unusual = 'CC=clang CXX=clang++' 39*1208bc7eSAndroid Build Coastguard Worker 40*1208bc7eSAndroid Build Coastguard Workercompiler_flag_unusuals = ['-m32'] 41*1208bc7eSAndroid Build Coastguard Worker 42*1208bc7eSAndroid Build Coastguard Workerconfigure_flag_unusuals = [ 43*1208bc7eSAndroid Build Coastguard Worker '--enable-debug', 44*1208bc7eSAndroid Build Coastguard Worker '--enable-prof', 45*1208bc7eSAndroid Build Coastguard Worker '--disable-stats', 46*1208bc7eSAndroid Build Coastguard Worker] 47*1208bc7eSAndroid Build Coastguard Worker 48*1208bc7eSAndroid Build Coastguard Workermalloc_conf_unusuals = [ 49*1208bc7eSAndroid Build Coastguard Worker 'tcache:false', 50*1208bc7eSAndroid Build Coastguard Worker 'dss:primary', 51*1208bc7eSAndroid Build Coastguard Worker 'percpu_arena:percpu', 52*1208bc7eSAndroid Build Coastguard Worker 'background_thread:true', 53*1208bc7eSAndroid Build Coastguard Worker] 54*1208bc7eSAndroid Build Coastguard Worker 55*1208bc7eSAndroid Build Coastguard Workerall_unusuals = ( 56*1208bc7eSAndroid Build Coastguard Worker [os_unusual] + [compilers_unusual] + compiler_flag_unusuals 57*1208bc7eSAndroid Build Coastguard Worker + configure_flag_unusuals + malloc_conf_unusuals 58*1208bc7eSAndroid Build Coastguard Worker) 59*1208bc7eSAndroid Build Coastguard Worker 60*1208bc7eSAndroid Build Coastguard Workerunusual_combinations_to_test = [] 61*1208bc7eSAndroid Build Coastguard Workerfor i in xrange(MAX_UNUSUAL_OPTIONS + 1): 62*1208bc7eSAndroid Build Coastguard Worker unusual_combinations_to_test += combinations(all_unusuals, i) 63*1208bc7eSAndroid Build Coastguard Worker 64*1208bc7eSAndroid Build Coastguard Workerinclude_rows = "" 65*1208bc7eSAndroid Build Coastguard Workerfor unusual_combination in unusual_combinations_to_test: 66*1208bc7eSAndroid Build Coastguard Worker os = os_default 67*1208bc7eSAndroid Build Coastguard Worker if os_unusual in unusual_combination: 68*1208bc7eSAndroid Build Coastguard Worker os = os_unusual 69*1208bc7eSAndroid Build Coastguard Worker 70*1208bc7eSAndroid Build Coastguard Worker compilers = compilers_default 71*1208bc7eSAndroid Build Coastguard Worker if compilers_unusual in unusual_combination: 72*1208bc7eSAndroid Build Coastguard Worker compilers = compilers_unusual 73*1208bc7eSAndroid Build Coastguard Worker 74*1208bc7eSAndroid Build Coastguard Worker compiler_flags = [ 75*1208bc7eSAndroid Build Coastguard Worker x for x in unusual_combination if x in compiler_flag_unusuals] 76*1208bc7eSAndroid Build Coastguard Worker 77*1208bc7eSAndroid Build Coastguard Worker configure_flags = [ 78*1208bc7eSAndroid Build Coastguard Worker x for x in unusual_combination if x in configure_flag_unusuals] 79*1208bc7eSAndroid Build Coastguard Worker 80*1208bc7eSAndroid Build Coastguard Worker malloc_conf = [ 81*1208bc7eSAndroid Build Coastguard Worker x for x in unusual_combination if x in malloc_conf_unusuals] 82*1208bc7eSAndroid Build Coastguard Worker # Filter out unsupported configurations on OS X. 83*1208bc7eSAndroid Build Coastguard Worker if os == 'osx' and ('dss:primary' in malloc_conf or \ 84*1208bc7eSAndroid Build Coastguard Worker 'percpu_arena:percpu' in malloc_conf or 'background_thread:true' \ 85*1208bc7eSAndroid Build Coastguard Worker in malloc_conf): 86*1208bc7eSAndroid Build Coastguard Worker continue 87*1208bc7eSAndroid Build Coastguard Worker if len(malloc_conf) > 0: 88*1208bc7eSAndroid Build Coastguard Worker configure_flags.append('--with-malloc-conf=' + ",".join(malloc_conf)) 89*1208bc7eSAndroid Build Coastguard Worker 90*1208bc7eSAndroid Build Coastguard Worker # Filter out an unsupported configuration - heap profiling on OS X. 91*1208bc7eSAndroid Build Coastguard Worker if os == 'osx' and '--enable-prof' in configure_flags: 92*1208bc7eSAndroid Build Coastguard Worker continue 93*1208bc7eSAndroid Build Coastguard Worker 94*1208bc7eSAndroid Build Coastguard Worker # We get some spurious errors when -Warray-bounds is enabled. 95*1208bc7eSAndroid Build Coastguard Worker env_string = ('{} COMPILER_FLAGS="{}" CONFIGURE_FLAGS="{}" ' 96*1208bc7eSAndroid Build Coastguard Worker 'EXTRA_CFLAGS="-Werror -Wno-array-bounds"').format( 97*1208bc7eSAndroid Build Coastguard Worker compilers, " ".join(compiler_flags), " ".join(configure_flags)) 98*1208bc7eSAndroid Build Coastguard Worker 99*1208bc7eSAndroid Build Coastguard Worker include_rows += ' - os: %s\n' % os 100*1208bc7eSAndroid Build Coastguard Worker include_rows += ' env: %s\n' % env_string 101*1208bc7eSAndroid Build Coastguard Worker if '-m32' in unusual_combination and os == 'linux': 102*1208bc7eSAndroid Build Coastguard Worker include_rows += ' addons:\n' 103*1208bc7eSAndroid Build Coastguard Worker include_rows += ' apt:\n' 104*1208bc7eSAndroid Build Coastguard Worker include_rows += ' packages:\n' 105*1208bc7eSAndroid Build Coastguard Worker include_rows += ' - gcc-multilib\n' 106*1208bc7eSAndroid Build Coastguard Worker 107*1208bc7eSAndroid Build Coastguard Workerprint travis_template % include_rows 108