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