2021-06-22 05:07:10 +08:00
|
|
|
#!/usr/bin/env python3
|
2017-01-26 04:58:50 +08:00
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
from itertools import combinations, chain
|
|
|
|
from enum import Enum, auto
|
|
|
|
|
|
|
|
|
|
|
|
LINUX = 'linux'
|
|
|
|
OSX = 'osx'
|
|
|
|
|
|
|
|
|
|
|
|
AMD64 = 'amd64'
|
|
|
|
ARM64 = 'arm64'
|
|
|
|
PPC64LE = 'ppc64le'
|
|
|
|
|
|
|
|
|
|
|
|
TRAVIS_TEMPLATE = """
|
|
|
|
# This config file is generated by ./scripts/gen_travis.py.
|
|
|
|
# Do not edit by hand.
|
2017-01-26 04:58:50 +08:00
|
|
|
|
|
|
|
language: generic
|
2021-06-22 05:07:10 +08:00
|
|
|
dist: focal
|
2017-01-26 04:58:50 +08:00
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
jobs:
|
2017-01-26 04:58:50 +08:00
|
|
|
include:
|
2021-10-14 03:35:52 +08:00
|
|
|
{jobs}
|
2017-01-26 04:58:50 +08:00
|
|
|
|
|
|
|
before_script:
|
|
|
|
- autoconf
|
2018-07-11 21:18:40 +08:00
|
|
|
- scripts/gen_travis.py > travis_script && diff .travis.yml travis_script
|
2021-10-14 03:35:52 +08:00
|
|
|
# If COMPILER_FLAGS are not empty, add them to CC and CXX
|
|
|
|
- ./configure ${{COMPILER_FLAGS:+ CC="$CC $COMPILER_FLAGS" \
|
|
|
|
CXX="$CXX $COMPILER_FLAGS"}} $CONFIGURE_FLAGS
|
2017-01-26 04:58:50 +08:00
|
|
|
- make -j3
|
|
|
|
- make -j3 tests
|
|
|
|
|
|
|
|
script:
|
|
|
|
- make check
|
|
|
|
"""
|
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
|
|
|
|
class Option(object):
|
|
|
|
class Type:
|
|
|
|
COMPILER = auto()
|
|
|
|
COMPILER_FLAG = auto()
|
|
|
|
CONFIGURE_FLAG = auto()
|
|
|
|
MALLOC_CONF = auto()
|
|
|
|
|
|
|
|
def __init__(self, type, value):
|
|
|
|
self.type = type
|
|
|
|
self.value = value
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def as_compiler(value):
|
|
|
|
return Option(Option.Type.COMPILER, value)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def as_compiler_flag(value):
|
|
|
|
return Option(Option.Type.COMPILER_FLAG, value)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def as_configure_flag(value):
|
|
|
|
return Option(Option.Type.CONFIGURE_FLAG, value)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def as_malloc_conf(value):
|
|
|
|
return Option(Option.Type.MALLOC_CONF, value)
|
|
|
|
|
|
|
|
def __eq__(self, obj):
|
|
|
|
return (isinstance(obj, Option) and obj.type == self.type
|
|
|
|
and obj.value == self.value)
|
|
|
|
|
|
|
|
|
2017-01-26 04:58:50 +08:00
|
|
|
# The 'default' configuration is gcc, on linux, with no compiler or configure
|
|
|
|
# flags. We also test with clang, -m32, --enable-debug, --enable-prof,
|
2017-04-21 08:21:37 +08:00
|
|
|
# --disable-stats, and --with-malloc-conf=tcache:false. To avoid abusing
|
|
|
|
# travis though, we don't test all 2**7 = 128 possible combinations of these;
|
|
|
|
# instead, we only test combinations of up to 2 'unusual' settings, under the
|
|
|
|
# hope that bugs involving interactions of such settings are rare.
|
2017-01-26 04:58:50 +08:00
|
|
|
MAX_UNUSUAL_OPTIONS = 2
|
|
|
|
|
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
GCC = Option.as_compiler('CC=gcc CXX=g++')
|
|
|
|
CLANG = Option.as_compiler('CC=clang CXX=clang++')
|
|
|
|
|
|
|
|
|
|
|
|
compiler_default = GCC
|
|
|
|
compilers_unusual = [CLANG,]
|
|
|
|
|
2020-09-11 16:07:10 +08:00
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
compiler_flag_unusuals = [Option.as_compiler_flag(opt) for opt in ('-m32',)]
|
2017-01-26 04:58:50 +08:00
|
|
|
|
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
configure_flag_unusuals = [Option.as_configure_flag(opt) for opt in (
|
2017-04-21 08:21:37 +08:00
|
|
|
'--enable-debug',
|
|
|
|
'--enable-prof',
|
|
|
|
'--disable-stats',
|
2019-02-07 05:36:56 +08:00
|
|
|
'--disable-libdl',
|
2019-03-23 08:08:53 +08:00
|
|
|
'--enable-opt-safety-checks',
|
2019-09-12 01:31:30 +08:00
|
|
|
'--with-lg-page=16',
|
2021-10-14 03:35:52 +08:00
|
|
|
)]
|
2017-05-23 08:15:57 +08:00
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
|
|
|
|
malloc_conf_unusuals = [Option.as_malloc_conf(opt) for opt in (
|
2017-05-23 08:15:57 +08:00
|
|
|
'tcache:false',
|
|
|
|
'dss:primary',
|
2017-05-24 01:53:36 +08:00
|
|
|
'percpu_arena:percpu',
|
2017-06-01 02:56:31 +08:00
|
|
|
'background_thread:true',
|
2021-10-14 03:35:52 +08:00
|
|
|
)]
|
|
|
|
|
2017-01-26 04:58:50 +08:00
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
all_unusuals = (compilers_unusual + compiler_flag_unusuals
|
|
|
|
+ configure_flag_unusuals + malloc_conf_unusuals)
|
2017-01-26 04:58:50 +08:00
|
|
|
|
|
|
|
|
2018-07-10 20:41:20 +08:00
|
|
|
gcc_multilib_set = False
|
2021-10-14 03:35:52 +08:00
|
|
|
|
|
|
|
|
|
|
|
def get_extra_cflags(os, compiler):
|
|
|
|
# We get some spurious errors when -Warray-bounds is enabled.
|
|
|
|
extra_cflags = ['-Werror', '-Wno-array-bounds']
|
|
|
|
if compiler == CLANG.value or os == OSX:
|
|
|
|
extra_cflags += [
|
|
|
|
'-Wno-unknown-warning-option',
|
|
|
|
'-Wno-ignored-attributes'
|
|
|
|
]
|
|
|
|
if os == OSX:
|
|
|
|
extra_cflags += [
|
|
|
|
'-Wno-deprecated-declarations',
|
|
|
|
]
|
|
|
|
return extra_cflags
|
|
|
|
|
|
|
|
|
2018-07-10 20:41:20 +08:00
|
|
|
# Formats a job from a combination of flags
|
2021-10-14 03:35:52 +08:00
|
|
|
def format_job(os, arch, combination):
|
2018-07-10 20:41:20 +08:00
|
|
|
global gcc_multilib_set
|
2017-05-23 08:15:57 +08:00
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
compiler = [x.value for x in combination if x.type == Option.Type.COMPILER]
|
|
|
|
assert(len(compiler) <= 1)
|
|
|
|
if not compiler:
|
|
|
|
compiler = compiler_default.value
|
|
|
|
else:
|
|
|
|
compiler = compiler[0]
|
|
|
|
compiler_flags = [x.value for x in combination if x.type == Option.Type.COMPILER_FLAG]
|
|
|
|
configure_flags = [x.value for x in combination if x.type == Option.Type.CONFIGURE_FLAG]
|
|
|
|
malloc_conf = [x.value for x in combination if x.type == Option.Type.MALLOC_CONF]
|
2017-01-26 04:58:50 +08:00
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
if len(malloc_conf) > 0:
|
|
|
|
configure_flags.append('--with-malloc-conf=' + ','.join(malloc_conf))
|
2017-01-26 04:58:50 +08:00
|
|
|
|
2018-07-10 20:41:20 +08:00
|
|
|
job = ""
|
2021-10-14 03:35:52 +08:00
|
|
|
job += ' - os: {}\n'.format(os)
|
|
|
|
job += ' arch: {}\n'.format(arch)
|
2020-09-11 16:07:10 +08:00
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
if '-m32' in compiler_flags and os == 'linux':
|
2018-07-10 20:41:20 +08:00
|
|
|
job += ' addons:'
|
|
|
|
if gcc_multilib_set:
|
|
|
|
job += ' *gcc_multilib\n'
|
|
|
|
else:
|
|
|
|
job += ' &gcc_multilib\n'
|
|
|
|
job += ' apt:\n'
|
|
|
|
job += ' packages:\n'
|
|
|
|
job += ' - gcc-multilib\n'
|
2021-06-22 05:07:10 +08:00
|
|
|
job += ' - g++-multilib\n'
|
2018-07-10 20:41:20 +08:00
|
|
|
gcc_multilib_set = True
|
2020-09-11 16:07:10 +08:00
|
|
|
|
|
|
|
env_string = ('{} COMPILER_FLAGS="{}" CONFIGURE_FLAGS="{}" '
|
2021-06-22 05:07:10 +08:00
|
|
|
'EXTRA_CFLAGS="{}"'.format(
|
2021-10-14 03:35:52 +08:00
|
|
|
compiler,
|
|
|
|
' '.join(compiler_flags),
|
|
|
|
' '.join(configure_flags),
|
|
|
|
' '.join(get_extra_cflags(os, compiler))))
|
2020-09-11 16:07:10 +08:00
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
job += ' env: {}'.format(env_string)
|
2018-07-10 20:41:20 +08:00
|
|
|
return job
|
|
|
|
|
|
|
|
|
2021-10-14 03:35:52 +08:00
|
|
|
def generate_unusual_combinations(max_unusual_opts):
|
|
|
|
"""
|
|
|
|
Generates different combinations of non-standard compilers, compiler flags,
|
|
|
|
configure flags and malloc_conf settings.
|
|
|
|
|
|
|
|
@param max_unusual_opts: Limit of unusual options per combination.
|
|
|
|
"""
|
|
|
|
return chain.from_iterable(
|
|
|
|
[combinations(all_unusuals, i) for i in range(max_unusual_opts + 1)])
|
|
|
|
|
|
|
|
|
|
|
|
def included(combination, exclude):
|
|
|
|
"""
|
|
|
|
Checks if the combination of options should be included in the Travis
|
|
|
|
testing matrix.
|
|
|
|
"""
|
|
|
|
return not any(excluded in combination for excluded in exclude)
|
|
|
|
|
|
|
|
|
|
|
|
def generate_jobs(os, arch, exclude, max_unusual_opts):
|
|
|
|
jobs = []
|
|
|
|
for combination in generate_unusual_combinations(max_unusual_opts):
|
|
|
|
if included(combination, exclude):
|
|
|
|
jobs.append(format_job(os, arch, combination))
|
|
|
|
return '\n'.join(jobs)
|
|
|
|
|
|
|
|
|
|
|
|
def generate_linux(arch):
|
|
|
|
os = LINUX
|
|
|
|
|
|
|
|
# Only generate 2 unusual options for AMD64 to reduce matrix size
|
|
|
|
max_unusual_opts = MAX_UNUSUAL_OPTIONS if arch == AMD64 else 1
|
|
|
|
|
|
|
|
exclude = []
|
|
|
|
if arch == PPC64LE:
|
|
|
|
# Avoid 32 bit builds and clang on PowerPC
|
|
|
|
exclude = [Option.as_compiler_flag('-m32')] + compilers_unusual
|
|
|
|
|
|
|
|
return generate_jobs(os, arch, exclude, max_unusual_opts)
|
|
|
|
|
|
|
|
|
|
|
|
def generate_macos(arch):
|
|
|
|
os = OSX
|
|
|
|
|
|
|
|
max_unusual_opts = 1
|
|
|
|
|
|
|
|
exclude = ([Option.as_malloc_conf(opt) for opt in (
|
|
|
|
'dss:primary',
|
|
|
|
'percpu_arena:percpu',
|
|
|
|
'background_thread:true')] +
|
|
|
|
[Option.as_configure_flag('--enable-prof')] +
|
|
|
|
[CLANG,])
|
|
|
|
|
|
|
|
return generate_jobs(os, arch, exclude, max_unusual_opts)
|
|
|
|
|
|
|
|
|
|
|
|
def get_manual_jobs():
|
|
|
|
return """\
|
2018-07-10 19:58:37 +08:00
|
|
|
# Development build
|
2018-07-10 20:41:20 +08:00
|
|
|
- os: linux
|
2021-10-14 03:35:52 +08:00
|
|
|
env: CC=gcc CXX=g++ CONFIGURE_FLAGS="--enable-debug \
|
|
|
|
--disable-cache-oblivious --enable-stats --enable-log --enable-prof" \
|
|
|
|
EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
2018-07-11 21:11:53 +08:00
|
|
|
# --enable-expermental-smallocx:
|
|
|
|
- os: linux
|
2021-10-14 03:35:52 +08:00
|
|
|
env: CC=gcc CXX=g++ CONFIGURE_FLAGS="--enable-debug \
|
|
|
|
--enable-experimental-smallocx --enable-stats --enable-prof" \
|
|
|
|
EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
jobs = '\n'.join((
|
|
|
|
generate_linux(AMD64),
|
|
|
|
generate_linux(PPC64LE),
|
|
|
|
|
|
|
|
generate_macos(AMD64),
|
|
|
|
get_manual_jobs()
|
|
|
|
))
|
|
|
|
|
|
|
|
print(TRAVIS_TEMPLATE.format(jobs=jobs))
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|