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

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

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

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

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