.travis.yml 10.5 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
    install:
Boris Staletic's avatar
Boris Staletic committed
19
    # breathe 4.14 doesn't work with bit fields. See https://github.com/michaeljones/breathe/issues/462
20
21
    # Latest breathe + Sphinx causes warnings and errors out
    - $PY_CMD -m pip install --user --upgrade "sphinx<3" sphinx_rtd_theme breathe==4.13.1 flake8 pep8-naming pytest
22
23
    - 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"
24
25
26
27
28
29
30
31
32
33
34
35
    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
36
      cmake -DCMAKE_BUILD_TYPE=Debug -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DPYTHON_EXECUTABLE=$(which $PY_CMD) .
37
      make pytest -j 2 && make cpptest -j 2
38
39
  # The following are regular test configurations, including optional dependencies.
  # With regard to each other they differ in Python version, C++ standard and compiler.
40
  - os: linux
Henry Schreiner's avatar
Henry Schreiner committed
41
42
    dist: trusty
    name: Python 2.7, c++11, gcc 4.8
43
44
45
    env: PYTHON=2.7 CPP=11 GCC=4.8
    addons:
      apt:
Henry Schreiner's avatar
Henry Schreiner committed
46
47
48
        packages:
          - cmake=2.\*
          - cmake-data=2.\*
49
  - os: linux
Henry Schreiner's avatar
Henry Schreiner committed
50
51
    dist: trusty
    name: Python 3.6, c++11, gcc 4.8
52
    env: PYTHON=3.6 CPP=11 GCC=4.8
53
54
    addons:
      apt:
Henry Schreiner's avatar
Henry Schreiner committed
55
56
57
58
59
60
61
62
63
        sources:
          - deadsnakes
        packages:
          - python3.6-dev
          - python3.6-venv
          - cmake=2.\*
          - cmake-data=2.\*
  - os: linux
    dist: trusty
64
    env: PYTHON=2.7 CPP=14 GCC=6 CMAKE=1
65
    name: Python 2.7, c++14, gcc 6, CMake test
Henry Schreiner's avatar
Henry Schreiner committed
66
67
68
69
70
71
72
73
74
75
76
    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.
77
    services: docker
Henry Schreiner's avatar
Henry Schreiner committed
78
79
80
    env: DOCKER=debian:stretch PYTHON=3.5 CPP=14 GCC=6 DEBUG=1
  - os: linux
    dist: xenial
81
    env: PYTHON=3.6 CPP=17 GCC=7
Henry Schreiner's avatar
Henry Schreiner committed
82
83
84
85
86
87
88
89
90
91
    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
92
  - os: linux
Henry Schreiner's avatar
Henry Schreiner committed
93
94
95
    dist: xenial
    env: PYTHON=3.6 CPP=17 CLANG=7
    name: Python 3.6, c++17, Clang 7
96
97
    addons:
      apt:
Henry Schreiner's avatar
Henry Schreiner committed
98
99
100
101
102
103
104
105
106
107
108
109
        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???
110
111
112
  - os: linux
    dist: xenial
    env: PYTHON=3.8 CPP=17 GCC=7
113
    name: Python 3.8, c++17, gcc 7
114
115
116
117
118
119
120
121
122
    addons:
      apt:
        sources:
          - deadsnakes
          - ubuntu-toolchain-r-test
        packages:
          - g++-7
          - python3.8-dev
          - python3.8-venv
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  - os: linux
    dist: xenial
    env: PYTHON=3.9 CPP=17 GCC=7
    name: Python 3.9 beta, c++17, gcc 7 (w/o numpy/scipy) # TODO: update build name when the numpy/scipy wheels become available
    addons:
      apt:
        sources:
          - deadsnakes
          - ubuntu-toolchain-r-test
        packages:
          - g++-7
          - python3.9-dev
          - python3.9-venv
    # Currently there are no numpy/scipy wheels available for python3.9
    # TODO: remove next install and script clause when the wheels become available
138
139
140
141
142
143
    install:
      - $PY_CMD -m pip install --user --upgrade pytest
    script:
      - |
        # Barebones build
        cmake -DCMAKE_BUILD_TYPE=Debug -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DPYTHON_EXECUTABLE=$(which $PY_CMD) .
144
        make pytest -j 2 && make cpptest -j 2
145
  - os: osx
Henry Schreiner's avatar
Henry Schreiner committed
146
    name: Python 2.7, c++14, AppleClang 7.3, CMake test
147
    osx_image: xcode7.3
148
    env: PYTHON=2.7 CPP=14 CLANG CMAKE=1
149
  - os: osx
150
    name: Python 3.8, c++14, AppleClang 9, Debug build
151
    osx_image: xcode9.4
152
    env: PYTHON=3.8 CPP=14 CLANG DEBUG=1
153
  # Test a PyPy 2.7 build
Wenzel Jakob's avatar
Wenzel Jakob committed
154
  - os: linux
Henry Schreiner's avatar
Henry Schreiner committed
155
    dist: trusty
156
157
158
159
160
161
162
163
164
165
166
167
    env: PYPY=7.3.1 PYTHON=2.7 CPP=11 GCC=4.8
    name: PyPy 7.3, Python 2.7, c++11, gcc 4.8
    addons:
      apt:
        packages:
          - libblas-dev
          - liblapack-dev
          - gfortran
  - os: linux
    dist: xenial
    env: PYPY=7.3.1 PYTHON=3.6 CPP=11 GCC=5
    name: PyPy 7.3, Python 3.6, c++11, gcc 5
Wenzel Jakob's avatar
Wenzel Jakob committed
168
169
    addons:
      apt:
Henry Schreiner's avatar
Henry Schreiner committed
170
171
172
173
        packages:
          - libblas-dev
          - liblapack-dev
          - gfortran
174
          - g++-5
175
  # Build in 32-bit mode and tests against the CMake-installed version
Henry Schreiner's avatar
Henry Schreiner committed
176
177
  - os: linux
    dist: trusty
Jason Rhinelander's avatar
Jason Rhinelander committed
178
    services: docker
Henry Schreiner's avatar
Henry Schreiner committed
179
    env: DOCKER=i386/debian:stretch PYTHON=3.5 CPP=14 GCC=6 INSTALL=1
180
    name: Python 3.5, c++14, gcc 6, 32-bit
Jason Rhinelander's avatar
Jason Rhinelander committed
181
182
    script:
      - |
Henry Schreiner's avatar
Henry Schreiner committed
183
184
185
186
187
188
189
190
191
192
193
        # 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
194
195
  allow_failures:
    - name: Python 3.9 beta, c++17, gcc 7 (w/o numpy/scipy)
Isuru Fernando's avatar
Isuru Fernando committed
196
    - name: PyPy 7.3, Python 2.7, c++11, gcc 4.8
Wenzel Jakob's avatar
Wenzel Jakob committed
197
198
cache:
  directories:
199
200
  - $HOME/.local/bin
  - $HOME/.local/lib
201
  - $HOME/.local/include
202
  - $HOME/Library/Python
203
204
before_install:
- |
205
  # Configure build variables
Henry Schreiner's avatar
Henry Schreiner committed
206
  set -ex
207
  if [ "$TRAVIS_OS_NAME" = "linux" ]; then
Jason Rhinelander's avatar
Jason Rhinelander committed
208
    if [ -n "$CLANG" ]; then
209
      export CXX=clang++-$CLANG CC=clang-$CLANG
210
      EXTRA_PACKAGES+=" clang-$CLANG llvm-$CLANG-dev"
Jason Rhinelander's avatar
Jason Rhinelander committed
211
    else
Jason Rhinelander's avatar
Jason Rhinelander committed
212
      if [ -z "$GCC" ]; then GCC=4.8
213
      else EXTRA_PACKAGES+=" g++-$GCC"
Jason Rhinelander's avatar
Jason Rhinelander committed
214
215
216
      fi
      export CXX=g++-$GCC CC=gcc-$GCC
    fi
217
218
219
  elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
    export CXX=clang++ CC=clang;
  fi
Jason Rhinelander's avatar
Jason Rhinelander committed
220
221
  if [ -n "$CPP" ]; then CPP=-std=c++$CPP; fi
  if [ "${PYTHON:0:1}" = "3" ]; then PY=3; fi
222
  if [ -n "$DEBUG" ]; then CMAKE_EXTRA_ARGS+=" -DCMAKE_BUILD_TYPE=Debug"; fi
Henry Schreiner's avatar
Henry Schreiner committed
223
  set +ex
224
- |
Wenzel Jakob's avatar
Wenzel Jakob committed
225
  # Initialize environment
Henry Schreiner's avatar
Henry Schreiner committed
226
  set -ex
227
  if [ -n "$DOCKER" ]; then
228
    docker pull $DOCKER
229

Jason Rhinelander's avatar
Jason Rhinelander committed
230
    containerid=$(docker run --detach --tty \
231
232
233
234
      --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
235
    SCRIPT_RUN_PREFIX="docker exec --tty $containerid"
236
    $SCRIPT_RUN_PREFIX sh -c 'for s in 0 15; do sleep $s; apt-get update && apt-get -qy dist-upgrade && break; done'
237
  else
238
239
240
    if [ -n "$PYPY" ]; then
      curl -fSL https://bitbucket.org/pypy/pypy/downloads/pypy$PYTHON-v$PYPY-linux64.tar.bz2 | tar xj
      PY_CMD=$(echo `pwd`/pypy$PYTHON-v$PYPY-linux64/bin/pypy$PY)
241
      CMAKE_EXTRA_ARGS+=" -DPYTHON_EXECUTABLE:FILEPATH=$PY_CMD"
242
    else
Jason Rhinelander's avatar
Jason Rhinelander committed
243
      PY_CMD=python$PYTHON
244
245
      if [ "$TRAVIS_OS_NAME" = "osx" ]; then
        if [ "$PY" = "3" ]; then
246
          brew update && brew unlink python@2 && (brew upgrade python || brew install python)
247
248
249
        else
          curl -fsSL https://bootstrap.pypa.io/get-pip.py | $PY_CMD - --user
        fi
250
      fi
251
    fi
252
253
254
    if [ "$PY" = 3 ] || [ -n "$PYPY" ]; then
      $PY_CMD -m ensurepip --user
    fi
Henry Schreiner's avatar
Henry Schreiner committed
255
    $PY_CMD --version
256
    $PY_CMD -m pip install --user --upgrade pip wheel
257
  fi
Henry Schreiner's avatar
Henry Schreiner committed
258
  set +ex
259
install:
260
- |
261
  # Install dependencies
Henry Schreiner's avatar
Henry Schreiner committed
262
263
  set -ex
  cmake --version
264
  if [ -n "$DOCKER" ]; then
265
    if [ -n "$DEBUG" ]; then
266
      PY_DEBUG="python$PYTHON-dbg python$PY-scipy-dbg"
267
      CMAKE_EXTRA_ARGS+=" -DPYTHON_EXECUTABLE=/usr/bin/python${PYTHON}dm"
268
    fi
269
    $SCRIPT_RUN_PREFIX sh -c "for s in 0 15; do sleep \$s; \
270
      apt-get -qy --no-install-recommends install \
271
        $PY_DEBUG python$PYTHON-dev python$PY-pytest python$PY-scipy \
272
        libeigen3-dev libboost-dev cmake make ${EXTRA_PACKAGES} && break; done"
273
  else
274

Henry Schreiner's avatar
Henry Schreiner committed
275
276
    if [ "$CLANG" = "7" ]; then
      export CXXFLAGS="-stdlib=libc++"
277
    fi
278

279
    export NPY_NUM_BUILD_JOBS=2
Henry Schreiner's avatar
Henry Schreiner committed
280
    local PIP_CMD=""
281
    if [ -n "$PYPY" ]; then
Henry Schreiner's avatar
Henry Schreiner committed
282
      # For expediency, install only versions that are available on the extra index.
Isuru Fernando's avatar
Isuru Fernando committed
283
284
285
286
      echo "Not installing numpy, scipy as working wheels are not available"
      # travis_wait 30 $PY_CMD -m pip install --user --upgrade --extra-index-url https://antocuni.github.io/pypy-wheels/manylinux2010 \
      #    numpy scipy
      echo "Installing pytest"
Henry Schreiner's avatar
Henry Schreiner committed
287
      travis_wait 30 \
288
        $PY_CMD -m pip install --user --upgrade pytest
Henry Schreiner's avatar
Henry Schreiner committed
289
    else
Isuru Fernando's avatar
Isuru Fernando committed
290
      echo "Installing pytest, numpy, scipy..."
Henry Schreiner's avatar
Henry Schreiner committed
291
292
      $PY_CMD -m pip install --user --upgrade pytest numpy scipy
    fi
293
    echo "done."
294

295
296
297
298
    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"
299
  fi
Henry Schreiner's avatar
Henry Schreiner committed
300
  set +ex
301
script:
Henry Schreiner's avatar
Henry Schreiner committed
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
- |
  # 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
327
after_failure: cat tests/test_cmake_build/*.log*
328
after_script:
Henry Schreiner's avatar
Henry Schreiner committed
329
330
331
332
333
- |
  # Cleanup (Docker)
  set -ex
  if [ -n "$DOCKER" ]; then docker stop "$containerid"; docker rm "$containerid"; fi
  set +ex