os: linux
language: python

addons:
  apt:
    packages:
      - gdb
      - python-dbg
      - python3-dbg
      - libzmq-dev  # needed by IPython/Tornado
      #- gcc-8
      #- g++-8

cache:
  pip: true
  directories:
    - $HOME/.ccache

python:
  - 3.8
  - 2.7
  - 3.9-dev
  - 3.7
  - 3.6
  - 3.5
  - 3.4

env:
  global:
    - USE_CCACHE=1
    - CCACHE_SLOPPINESS=pch_defines,time_macros
    - CCACHE_COMPRESS=1
    - CCACHE_MAXSIZE=250M
    - PATH="/usr/lib/ccache:$HOME/miniconda/bin:$PATH"
    - BACKEND=c,cpp
  matrix:
    - BACKEND=c
    - BACKEND=cpp

matrix:
  include:
    # slowest first
    - os: osx
      env: PY=2
      python: 2
      language: c
      compiler: clang
      cache: false
    - os: osx
      env: PY=3
      python: 3
      language: c
      compiler: clang
      cache: false
# Disabled: coverage analysis takes excessively long, several times longer than without.
#    - python: 3.7
#      env: COVERAGE=1
    - python: 3.7
      env: TEST_CODE_STYLE=1
    - python: 3.8
      env: LIMITED_API=--limited-api EXCLUDE=--no-file
    - python: 3.7
      env: LIMITED_API=--limited-api EXCLUDE=--no-file
    - python: 3.6
      env: LIMITED_API=--limited-api EXCLUDE=--no-file
    - env: STACKLESS=true BACKEND=c PY=2
      python: 2.7
    - env: STACKLESS=true BACKEND=c PY=3
      python: 3.6
    - python: pypy
      env: BACKEND=c
    - python: pypy3
      env: BACKEND=c
# a secondary pypy tests which is allowed to fail and which specifically
# tests known bugs
    - python: pypy
      env: BACKEND=c EXCLUDE="--listfile=tests/pypy_bugs.txt --listfile=tests/pypy2_bugs.txt bugs"
    - python: pypy3
      env: BACKEND=c EXCLUDE="--listfile=tests/pypy_bugs.txt bugs"
  allow_failures:
    - python: 3.9-dev
    - env: BACKEND=c EXCLUDE="--listfile=tests/pypy_bugs.txt bugs"
    - env: BACKEND=c EXCLUDE="--listfile=tests/pypy_bugs.txt --listfile=tests/pypy2_bugs.txt bugs"

branches:
  only:
    - master
    - release

before_install:
  - |
    if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
      # adding apt repos in travis is really fragile => retry a couple of times.
      for i in {1..10}; do travis_retry sudo apt-add-repository --yes 'ppa:ubuntu-toolchain-r/test' && break; sleep 2; done
      for i in {1..10}; do travis_retry sudo apt-get update && travis_retry sudo apt-get install --yes gcc-8  $(if [ -z "${BACKEND##*cpp*}" ]; then echo -n "g++-8"; fi ) && break; sleep 2; done
      sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 60 $(if [ -z "${BACKEND##*cpp*}" ]; then echo " --slave /usr/bin/g++ g++ /usr/bin/g++-8"; fi)
      sudo update-alternatives --set gcc /usr/bin/gcc-8
      export CC=gcc
      if [ -z "${BACKEND##*cpp*}" ]; then sudo update-alternatives --set g++ /usr/bin/g++-8; export CXX=g++; fi
    fi

  - |
    if [[ "$TRAVIS_OS_NAME" == "osx" ]] || [[ "$STACKLESS" == "true" ]]; then # Install Miniconda
      if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then CONDA_PLATFORM=MacOSX; else CONDA_PLATFORM=Linux; fi
      travis_retry curl -s -o miniconda.sh https://repo.continuum.io/miniconda/Miniconda$PY-latest-${CONDA_PLATFORM}-x86_64.sh
      bash miniconda.sh -b -p $HOME/miniconda && rm miniconda.sh
      #conda install --quiet --yes nomkl --file=test-requirements.txt --file=test-requirements-cpython.txt
      if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
        which clang && clang --version && export CC=clang || true
        which clang++ && clang++ --version && export CXX=clang++ || true
      fi
    fi

  - if [ -n "$CC" ]; then which $CC; $CC --version; fi
  - if [ -n "$CXX" ]; then which $CXX; $CXX --version; fi

  - if [[ "$STACKLESS" == "true" ]]; then
      conda config --add channels stackless;
      travis_retry conda install --quiet --yes stackless;
    fi

install:
  - python -c 'import sys; print("Python %s" % (sys.version,))'
  - if [ -n "${TRAVIS_PYTHON_VERSION##*-dev}" ]; then pip install -r test-requirements.txt $( [ -z "${TRAVIS_PYTHON_VERSION##pypy*}" -o -z "${TRAVIS_PYTHON_VERSION##3.[4789]*}" ] || echo " -r test-requirements-cpython.txt" ) ; fi
#  - CFLAGS="-O2 -ggdb -Wall -Wextra $(python -c 'import sys; print("-fno-strict-aliasing" if sys.version_info[0] == 2 else "")')" python setup.py build

before_script: ccache -s || true

script:
  - PYTHON_DBG="python$( python -c 'import sys; print("%d.%d" % sys.version_info[:2])' )-dbg"
  - if [ "$TEST_CODE_STYLE" = "1" ]; then
      STYLE_ARGS="--no-unit --no-doctest --no-file --no-pyregr --no-examples";
    else
      STYLE_ARGS=--no-code-style;
      if $PYTHON_DBG -V >&2; then CFLAGS="-O0 -ggdb" $PYTHON_DBG runtests.py -vv --no-code-style Debugger --backends=$BACKEND; fi;
      if [ -z "${BACKEND##*cpp*}" -a -n "${TRAVIS_PYTHON_VERSION##*-dev}" ]; then pip install pythran; fi;
      if [ "$BACKEND" != "cpp" -a -n "${TRAVIS_PYTHON_VERSION##2*}"  -a -n "${TRAVIS_PYTHON_VERSION##pypy*}" -a -n "${TRAVIS_PYTHON_VERSION##*-dev}" -a -n "${TRAVIS_PYTHON_VERSION##*3.4}" ]; then pip install mypy; fi;
    fi
# Need to clear the ccache? Try something like this:
#  - if [ -n "${BACKEND##*cpp*}" -a -z "${TRAVIS_PYTHON_VERSION##*3.4}" ]; then ccache -C || true; fi
  - if [ "$COVERAGE" != "1" ]; then CFLAGS="-O2 -ggdb -Wall -Wextra $(python -c 'import sys; print("-fno-strict-aliasing" if sys.version_info[0] == 2 else "")')" python setup.py build_ext -i; fi
  - CFLAGS="-O0 -ggdb -Wall -Wextra" python runtests.py -vv $STYLE_ARGS -x Debugger --backends=$BACKEND $LIMITED_API $EXCLUDE $(if [ "$COVERAGE" == "1" ]; then echo " --coverage"; fi) $(if [ -z "$TEST_CODE_STYLE" ]; then echo " -j7 "; fi)
  - ccache -s || true
