.travis.yml 8.62 KB
Newer Older
1
language: cpp
2
3
matrix:
  include:
4
5
6
7
8
9
10
  # This config does a few things:
  # - Checks C++ and Python code styles (check-style.sh and flake8).
  # - Makes sure sphinx can build the docs without any errors or warnings.
  # - Tests setup.py sdist and install (all header files should be present).
  # - Makes sure that everything still works without optional deps (numpy/scipy/eigen) and
  #   also tests the automatic discovery functions in CMake (Python version, C++ standard).
  - os: linux
11
    dist: xenial # Necessary to run doxygen 1.8.15
Henry Schreiner's avatar
Henry Schreiner committed
12
    name: Style, docs, and pip
13
14
    cache: false
    before_install:
15
16
    - pyenv global $(pyenv whence 2to3)  # activate all python versions
    - PY_CMD=python3
17
    - $PY_CMD -m pip install --user --upgrade pip wheel setuptools
Boris Staletic's avatar
Boris Staletic committed
18
19
    install:
    - $PY_CMD -m pip install --user --upgrade sphinx sphinx_rtd_theme breathe flake8 pep8-naming pytest
20
21
    - curl -fsSL https://sourceforge.net/projects/doxygen/files/rel-1.8.15/doxygen-1.8.15.linux.bin.tar.gz/download | tar xz
    - export PATH="$PWD/doxygen-1.8.15/bin:$PATH"
22
23
24
25
26
27
28
29
30
31
32
33
    script:
    - tools/check-style.sh
    - flake8
    - $PY_CMD -m sphinx -W -b html docs docs/.build
    - |
      # Make sure setup.py distributes and installs all the headers
      $PY_CMD setup.py sdist
      $PY_CMD -m pip install --user -U ./dist/*
      installed=$($PY_CMD -c "import pybind11; print(pybind11.get_include(True) + '/pybind11')")
      diff -rq $installed ./include/pybind11
    - |
      # Barebones build
Henry Schreiner's avatar
Henry Schreiner committed
34
      cmake -DCMAKE_BUILD_TYPE=Debug -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DPYTHON_EXECUTABLE=$(which $PY_CMD) .
35
36
37
38
      make pytest -j 2
      make cpptest -j 2
  # The following are regular test configurations, including optional dependencies.
  # With regard to each other they differ in Python version, C++ standard and compiler.
39
  - os: linux
Henry Schreiner's avatar
Henry Schreiner committed
40
41
    dist: trusty
    name: Python 2.7, c++11, gcc 4.8
42
43
44
    env: PYTHON=2.7 CPP=11 GCC=4.8
    addons:
      apt:
Henry Schreiner's avatar
Henry Schreiner committed
45
46
47
        packages:
          - cmake=2.\*
          - cmake-data=2.\*
48
  - os: linux
Henry Schreiner's avatar
Henry Schreiner committed
49
50
    dist: trusty
    name: Python 3.6, c++11, gcc 4.8
51
    env: PYTHON=3.6 CPP=11 GCC=4.8
52
53
    addons:
      apt:
Henry Schreiner's avatar
Henry Schreiner committed
54
55
56
57
58
59
60
61
62
        sources:
          - deadsnakes
        packages:
          - python3.6-dev
          - python3.6-venv
          - cmake=2.\*
          - cmake-data=2.\*
  - os: linux
    dist: trusty
63
    env: PYTHON=2.7 CPP=14 GCC=6 CMAKE=1
64
    name: Python 2.7, c++14, gcc 6, CMake test
Henry Schreiner's avatar
Henry Schreiner committed
65
66
67
68
69
70
71
72
73
74
75
    addons:
      apt:
        sources:
          - ubuntu-toolchain-r-test
        packages:
          - g++-6
  - os: linux
    dist: trusty
    name: Python 3.5, c++14, gcc 6, Debug build
    # N.B. `ensurepip` could be installed transitively by `python3.5-venv`, but
    # seems to have apt conflicts (at least for Trusty). Use Docker instead.
76
    services: docker
Henry Schreiner's avatar
Henry Schreiner committed
77
78
79
    env: DOCKER=debian:stretch PYTHON=3.5 CPP=14 GCC=6 DEBUG=1
  - os: linux
    dist: xenial
80
    env: PYTHON=3.6 CPP=17 GCC=7
Henry Schreiner's avatar
Henry Schreiner committed
81
82
83
84
85
86
87
88
89
90
    name: Python 3.6, c++17, gcc 7
    addons:
      apt:
        sources:
          - deadsnakes
          - ubuntu-toolchain-r-test
        packages:
          - g++-7
          - python3.6-dev
          - python3.6-venv
91
  - os: linux
Henry Schreiner's avatar
Henry Schreiner committed
92
93
94
    dist: xenial
    env: PYTHON=3.6 CPP=17 CLANG=7
    name: Python 3.6, c++17, Clang 7
95
96
    addons:
      apt:
Henry Schreiner's avatar
Henry Schreiner committed
97
98
99
100
101
102
103
104
105
106
107
108
        sources:
          - deadsnakes
          - llvm-toolchain-xenial-7
        packages:
          - python3.6-dev
          - python3.6-venv
          - clang-7
          - libclang-7-dev
          - llvm-7-dev
          - lld-7
          - libc++-7-dev
          - libc++abi-7-dev  # Why is this necessary???
109
  - os: osx
Henry Schreiner's avatar
Henry Schreiner committed
110
    name: Python 2.7, c++14, AppleClang 7.3, CMake test
111
    osx_image: xcode7.3
112
    env: PYTHON=2.7 CPP=14 CLANG CMAKE=1
113
  - os: osx
Henry Schreiner's avatar
Henry Schreiner committed
114
    name: Python 3.7, c++14, AppleClang 9, Debug build
115
    osx_image: xcode9
116
    env: PYTHON=3.7 CPP=14 CLANG DEBUG=1
117
  # Test a PyPy 2.7 build
Wenzel Jakob's avatar
Wenzel Jakob committed
118
  - os: linux
Henry Schreiner's avatar
Henry Schreiner committed
119
    dist: trusty
120
    env: PYPY=5.8 PYTHON=2.7 CPP=11 GCC=4.8
Henry Schreiner's avatar
Henry Schreiner committed
121
    name: PyPy 5.8, Python 2.7, c++11, gcc 4.8
Wenzel Jakob's avatar
Wenzel Jakob committed
122
123
    addons:
      apt:
Henry Schreiner's avatar
Henry Schreiner committed
124
125
126
127
        packages:
          - libblas-dev
          - liblapack-dev
          - gfortran
128
  # Build in 32-bit mode and tests against the CMake-installed version
Henry Schreiner's avatar
Henry Schreiner committed
129
130
  - os: linux
    dist: trusty
Jason Rhinelander's avatar
Jason Rhinelander committed
131
    services: docker
Henry Schreiner's avatar
Henry Schreiner committed
132
    env: DOCKER=i386/debian:stretch PYTHON=3.5 CPP=14 GCC=6 INSTALL=1
133
    name: Python 3.5, c++14, gcc 6, 32-bit
Jason Rhinelander's avatar
Jason Rhinelander committed
134
135
    script:
      - |
Henry Schreiner's avatar
Henry Schreiner committed
136
137
138
139
140
141
142
143
144
145
146
        # Consolidated 32-bit Docker Build + Install
        set -ex
        $SCRIPT_RUN_PREFIX sh -c "
          set -ex
          cmake ${CMAKE_EXTRA_ARGS} -DPYBIND11_INSTALL=1 -DPYBIND11_TEST=0 .
          make install
          cp -a tests /pybind11-tests
          mkdir /build-tests && cd /build-tests
          cmake ../pybind11-tests ${CMAKE_EXTRA_ARGS} -DPYBIND11_WERROR=ON
          make pytest -j 2"
        set +ex
Wenzel Jakob's avatar
Wenzel Jakob committed
147
148
cache:
  directories:
149
150
  - $HOME/.local/bin
  - $HOME/.local/lib
151
  - $HOME/.local/include
152
  - $HOME/Library/Python
153
154
before_install:
- |
155
  # Configure build variables
Henry Schreiner's avatar
Henry Schreiner committed
156
  set -ex
157
  if [ "$TRAVIS_OS_NAME" = "linux" ]; then
Jason Rhinelander's avatar
Jason Rhinelander committed
158
    if [ -n "$CLANG" ]; then
159
      export CXX=clang++-$CLANG CC=clang-$CLANG
160
      EXTRA_PACKAGES+=" clang-$CLANG llvm-$CLANG-dev"
Jason Rhinelander's avatar
Jason Rhinelander committed
161
    else
Jason Rhinelander's avatar
Jason Rhinelander committed
162
      if [ -z "$GCC" ]; then GCC=4.8
163
      else EXTRA_PACKAGES+=" g++-$GCC"
Jason Rhinelander's avatar
Jason Rhinelander committed
164
165
166
      fi
      export CXX=g++-$GCC CC=gcc-$GCC
    fi
167
168
169
  elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
    export CXX=clang++ CC=clang;
  fi
Jason Rhinelander's avatar
Jason Rhinelander committed
170
171
  if [ -n "$CPP" ]; then CPP=-std=c++$CPP; fi
  if [ "${PYTHON:0:1}" = "3" ]; then PY=3; fi
172
  if [ -n "$DEBUG" ]; then CMAKE_EXTRA_ARGS+=" -DCMAKE_BUILD_TYPE=Debug"; fi
Henry Schreiner's avatar
Henry Schreiner committed
173
  set +ex
174
- |
Wenzel Jakob's avatar
Wenzel Jakob committed
175
  # Initialize environment
Henry Schreiner's avatar
Henry Schreiner committed
176
  set -ex
177
  if [ -n "$DOCKER" ]; then
178
    docker pull $DOCKER
179

Jason Rhinelander's avatar
Jason Rhinelander committed
180
    containerid=$(docker run --detach --tty \
181
182
183
184
      --volume="$PWD":/pybind11 --workdir=/pybind11 \
      --env="CC=$CC" --env="CXX=$CXX" --env="DEBIAN_FRONTEND=$DEBIAN_FRONTEND" \
      --env=GCC_COLORS=\  \
      $DOCKER)
Jason Rhinelander's avatar
Jason Rhinelander committed
185
    SCRIPT_RUN_PREFIX="docker exec --tty $containerid"
186
    $SCRIPT_RUN_PREFIX sh -c 'for s in 0 15; do sleep $s; apt-get update && apt-get -qy dist-upgrade && break; done'
187
  else
188
189
190
    if [ "$PYPY" = "5.8" ]; then
      curl -fSL https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.8.0-linux64.tar.bz2 | tar xj
      PY_CMD=$(echo `pwd`/pypy2-v5.8.0-linux64/bin/pypy)
191
      CMAKE_EXTRA_ARGS+=" -DPYTHON_EXECUTABLE:FILEPATH=$PY_CMD"
192
    else
Jason Rhinelander's avatar
Jason Rhinelander committed
193
      PY_CMD=python$PYTHON
194
195
      if [ "$TRAVIS_OS_NAME" = "osx" ]; then
        if [ "$PY" = "3" ]; then
Jason Rhinelander's avatar
Jason Rhinelander committed
196
          brew update && brew upgrade python
197
198
199
        else
          curl -fsSL https://bootstrap.pypa.io/get-pip.py | $PY_CMD - --user
        fi
200
      fi
201
    fi
202
203
204
    if [ "$PY" = 3 ] || [ -n "$PYPY" ]; then
      $PY_CMD -m ensurepip --user
    fi
Henry Schreiner's avatar
Henry Schreiner committed
205
    $PY_CMD --version
206
    $PY_CMD -m pip install --user --upgrade pip wheel
207
  fi
Henry Schreiner's avatar
Henry Schreiner committed
208
  set +ex
209
install:
210
- |
211
  # Install dependencies
Henry Schreiner's avatar
Henry Schreiner committed
212
213
  set -ex
  cmake --version
214
  if [ -n "$DOCKER" ]; then
215
    if [ -n "$DEBUG" ]; then
216
      PY_DEBUG="python$PYTHON-dbg python$PY-scipy-dbg"
217
      CMAKE_EXTRA_ARGS+=" -DPYTHON_EXECUTABLE=/usr/bin/python${PYTHON}dm"
218
    fi
219
    $SCRIPT_RUN_PREFIX sh -c "for s in 0 15; do sleep \$s; \
220
      apt-get -qy --no-install-recommends install \
221
        $PY_DEBUG python$PYTHON-dev python$PY-pytest python$PY-scipy \
222
        libeigen3-dev libboost-dev cmake make ${EXTRA_PACKAGES} && break; done"
223
  else
224

Henry Schreiner's avatar
Henry Schreiner committed
225
226
    if [ "$CLANG" = "7" ]; then
      export CXXFLAGS="-stdlib=libc++"
227
    fi
228

229
230
    export NPY_NUM_BUILD_JOBS=2
    echo "Installing pytest, numpy, scipy..."
Henry Schreiner's avatar
Henry Schreiner committed
231
232
233
234
235
236
237
238
239
    local PIP_CMD=""
    if [ -n $PYPY ]; then
      # For expediency, install only versions that are available on the extra index.
      travis_wait 30 \
        $PY_CMD -m pip install --user --upgrade --extra-index-url https://imaginary.ca/trusty-pypi \
          pytest numpy==1.15.4 scipy==1.2.0
    else
      $PY_CMD -m pip install --user --upgrade pytest numpy scipy
    fi
240
    echo "done."
241

242
243
244
245
    mkdir eigen
    curl -fsSL https://bitbucket.org/eigen/eigen/get/3.3.4.tar.bz2 | \
        tar --extract -j --directory=eigen --strip-components=1
    export CMAKE_INCLUDE_PATH="${CMAKE_INCLUDE_PATH:+$CMAKE_INCLUDE_PATH:}$PWD/eigen"
246
  fi
Henry Schreiner's avatar
Henry Schreiner committed
247
  set +ex
248
script:
Henry Schreiner's avatar
Henry Schreiner committed
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
- |
  # CMake Configuration
  set -ex
  $SCRIPT_RUN_PREFIX cmake ${CMAKE_EXTRA_ARGS} \
    -DPYBIND11_PYTHON_VERSION=$PYTHON \
    -DPYBIND11_CPP_STANDARD=$CPP \
    -DPYBIND11_WERROR=${WERROR:-ON} \
    -DDOWNLOAD_CATCH=${DOWNLOAD_CATCH:-ON} \
    .
  set +ex
- |
  # pytest
  set -ex
  $SCRIPT_RUN_PREFIX make pytest -j 2 VERBOSE=1
  set +ex
- |
  # cpptest
  set -ex
  $SCRIPT_RUN_PREFIX make cpptest -j 2
  set +ex
- |
  # CMake Build Interface
  set -ex
  if [ -n "$CMAKE" ]; then $SCRIPT_RUN_PREFIX make test_cmake_build; fi
  set +ex
274
after_failure: cat tests/test_cmake_build/*.log*
275
after_script:
Henry Schreiner's avatar
Henry Schreiner committed
276
277
278
279
280
- |
  # Cleanup (Docker)
  set -ex
  if [ -n "$DOCKER" ]; then docker stop "$containerid"; docker rm "$containerid"; fi
  set +ex