.travis.yml 10.5 KB
Newer Older
1
language: cpp
2
3
4
5
6
7
8

branches:
  only:
  - master
  - stable
  - /^v\d/

9
10
matrix:
  include:
11
12
13
14
15
16
17
  # 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
18
    dist: xenial # Necessary to run doxygen 1.8.15
19
    name: Docs and pip
20
21
    cache: false
    before_install:
22
23
    - pyenv global $(pyenv whence 2to3)  # activate all python versions
    - PY_CMD=python3
24
    - $PY_CMD -m pip install --user --upgrade pip wheel setuptools
Boris Staletic's avatar
Boris Staletic committed
25
    install:
Boris Staletic's avatar
Boris Staletic committed
26
    # breathe 4.14 doesn't work with bit fields. See https://github.com/michaeljones/breathe/issues/462
27
    # Latest breathe + Sphinx causes warnings and errors out
28
    - $PY_CMD -m pip install --user --upgrade "sphinx<3" sphinx_rtd_theme breathe==4.13.1 pytest
29
30
    - 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"
31
32
33
34
35
36
37
38
39
40
    script:
    - $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
41
      cmake -DCMAKE_BUILD_TYPE=Debug -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DPYTHON_EXECUTABLE=$(which $PY_CMD) .
42
      make pytest -j 2 && make cpptest -j 2
43

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

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

Henry Schreiner's avatar
Henry Schreiner committed
281
282
    if [ "$CLANG" = "7" ]; then
      export CXXFLAGS="-stdlib=libc++"
283
    fi
284

285
    export NPY_NUM_BUILD_JOBS=2
Henry Schreiner's avatar
Henry Schreiner committed
286
    local PIP_CMD=""
287
    if [ -n "$PYPY" ]; then
Henry Schreiner's avatar
Henry Schreiner committed
288
      # For expediency, install only versions that are available on the extra index.
Isuru Fernando's avatar
Isuru Fernando committed
289
290
291
292
      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
293
      travis_wait 30 \
294
        $PY_CMD -m pip install --user --upgrade pytest
Henry Schreiner's avatar
Henry Schreiner committed
295
    else
Isuru Fernando's avatar
Isuru Fernando committed
296
      echo "Installing pytest, numpy, scipy..."
Henry Schreiner's avatar
Henry Schreiner committed
297
298
      $PY_CMD -m pip install --user --upgrade pytest numpy scipy
    fi
299
    echo "done."
300

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