.travis.yml 9.71 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
20
    # breathe 4.14 doesn't work with bit fields. See https://github.com/michaeljones/breathe/issues/462
    - $PY_CMD -m pip install --user --upgrade sphinx sphinx_rtd_theme breathe==4.13.1 flake8 pep8-naming pytest
21
22
    - 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"
23
24
25
26
27
28
29
30
31
32
33
34
    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
35
      cmake -DCMAKE_BUILD_TYPE=Debug -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DPYTHON_EXECUTABLE=$(which $PY_CMD) .
36
      make pytest -j 2 && make cpptest -j 2
37
38
  # 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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
  - os: linux
    dist: xenial
    env: PYTHON=3.8 CPP=17 GCC=7
    name: Python 3.8, 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.8-dev
          - python3.8-venv
    # Currently there is no numpy/scipy wheels available for python3.8
    # TODO: remove next before_install, install and script clause when the wheels become available
    before_install:
      - pyenv global $(pyenv whence 2to3)  # activate all python versions
      - PY_CMD=python3
      - $PY_CMD -m pip install --user --upgrade pip wheel setuptools
    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) .
134
        make pytest -j 2 && make cpptest -j 2
135
  - os: osx
Henry Schreiner's avatar
Henry Schreiner committed
136
    name: Python 2.7, c++14, AppleClang 7.3, CMake test
137
    osx_image: xcode7.3
138
    env: PYTHON=2.7 CPP=14 CLANG CMAKE=1
139
  - os: osx
Henry Schreiner's avatar
Henry Schreiner committed
140
    name: Python 3.7, c++14, AppleClang 9, Debug build
141
    osx_image: xcode9
142
    env: PYTHON=3.7 CPP=14 CLANG DEBUG=1
143
  # Test a PyPy 2.7 build
Wenzel Jakob's avatar
Wenzel Jakob committed
144
  - os: linux
Henry Schreiner's avatar
Henry Schreiner committed
145
    dist: trusty
146
    env: PYPY=5.8 PYTHON=2.7 CPP=11 GCC=4.8
Henry Schreiner's avatar
Henry Schreiner committed
147
    name: PyPy 5.8, Python 2.7, c++11, gcc 4.8
Wenzel Jakob's avatar
Wenzel Jakob committed
148
149
    addons:
      apt:
Henry Schreiner's avatar
Henry Schreiner committed
150
151
152
153
        packages:
          - libblas-dev
          - liblapack-dev
          - gfortran
154
  # Build in 32-bit mode and tests against the CMake-installed version
Henry Schreiner's avatar
Henry Schreiner committed
155
156
  - os: linux
    dist: trusty
Jason Rhinelander's avatar
Jason Rhinelander committed
157
    services: docker
Henry Schreiner's avatar
Henry Schreiner committed
158
    env: DOCKER=i386/debian:stretch PYTHON=3.5 CPP=14 GCC=6 INSTALL=1
159
    name: Python 3.5, c++14, gcc 6, 32-bit
Jason Rhinelander's avatar
Jason Rhinelander committed
160
161
    script:
      - |
Henry Schreiner's avatar
Henry Schreiner committed
162
163
164
165
166
167
168
169
170
171
172
        # 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
173
174
cache:
  directories:
175
176
  - $HOME/.local/bin
  - $HOME/.local/lib
177
  - $HOME/.local/include
178
  - $HOME/Library/Python
179
180
before_install:
- |
181
  # Configure build variables
Henry Schreiner's avatar
Henry Schreiner committed
182
  set -ex
183
  if [ "$TRAVIS_OS_NAME" = "linux" ]; then
Jason Rhinelander's avatar
Jason Rhinelander committed
184
    if [ -n "$CLANG" ]; then
185
      export CXX=clang++-$CLANG CC=clang-$CLANG
186
      EXTRA_PACKAGES+=" clang-$CLANG llvm-$CLANG-dev"
Jason Rhinelander's avatar
Jason Rhinelander committed
187
    else
Jason Rhinelander's avatar
Jason Rhinelander committed
188
      if [ -z "$GCC" ]; then GCC=4.8
189
      else EXTRA_PACKAGES+=" g++-$GCC"
Jason Rhinelander's avatar
Jason Rhinelander committed
190
191
192
      fi
      export CXX=g++-$GCC CC=gcc-$GCC
    fi
193
194
195
  elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
    export CXX=clang++ CC=clang;
  fi
Jason Rhinelander's avatar
Jason Rhinelander committed
196
197
  if [ -n "$CPP" ]; then CPP=-std=c++$CPP; fi
  if [ "${PYTHON:0:1}" = "3" ]; then PY=3; fi
198
  if [ -n "$DEBUG" ]; then CMAKE_EXTRA_ARGS+=" -DCMAKE_BUILD_TYPE=Debug"; fi
Henry Schreiner's avatar
Henry Schreiner committed
199
  set +ex
200
- |
Wenzel Jakob's avatar
Wenzel Jakob committed
201
  # Initialize environment
Henry Schreiner's avatar
Henry Schreiner committed
202
  set -ex
203
  if [ -n "$DOCKER" ]; then
204
    docker pull $DOCKER
205

Jason Rhinelander's avatar
Jason Rhinelander committed
206
    containerid=$(docker run --detach --tty \
207
208
209
210
      --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
211
    SCRIPT_RUN_PREFIX="docker exec --tty $containerid"
212
    $SCRIPT_RUN_PREFIX sh -c 'for s in 0 15; do sleep $s; apt-get update && apt-get -qy dist-upgrade && break; done'
213
  else
214
215
216
    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)
217
      CMAKE_EXTRA_ARGS+=" -DPYTHON_EXECUTABLE:FILEPATH=$PY_CMD"
218
    else
Jason Rhinelander's avatar
Jason Rhinelander committed
219
      PY_CMD=python$PYTHON
220
221
      if [ "$TRAVIS_OS_NAME" = "osx" ]; then
        if [ "$PY" = "3" ]; then
Jason Rhinelander's avatar
Jason Rhinelander committed
222
          brew update && brew upgrade python
223
224
225
        else
          curl -fsSL https://bootstrap.pypa.io/get-pip.py | $PY_CMD - --user
        fi
226
      fi
227
    fi
228
229
230
    if [ "$PY" = 3 ] || [ -n "$PYPY" ]; then
      $PY_CMD -m ensurepip --user
    fi
Henry Schreiner's avatar
Henry Schreiner committed
231
    $PY_CMD --version
232
    $PY_CMD -m pip install --user --upgrade pip wheel
233
  fi
Henry Schreiner's avatar
Henry Schreiner committed
234
  set +ex
235
install:
236
- |
237
  # Install dependencies
Henry Schreiner's avatar
Henry Schreiner committed
238
239
  set -ex
  cmake --version
240
  if [ -n "$DOCKER" ]; then
241
    if [ -n "$DEBUG" ]; then
242
      PY_DEBUG="python$PYTHON-dbg python$PY-scipy-dbg"
243
      CMAKE_EXTRA_ARGS+=" -DPYTHON_EXECUTABLE=/usr/bin/python${PYTHON}dm"
244
    fi
245
    $SCRIPT_RUN_PREFIX sh -c "for s in 0 15; do sleep \$s; \
246
      apt-get -qy --no-install-recommends install \
247
        $PY_DEBUG python$PYTHON-dev python$PY-pytest python$PY-scipy \
248
        libeigen3-dev libboost-dev cmake make ${EXTRA_PACKAGES} && break; done"
249
  else
250

Henry Schreiner's avatar
Henry Schreiner committed
251
252
    if [ "$CLANG" = "7" ]; then
      export CXXFLAGS="-stdlib=libc++"
253
    fi
254

255
256
    export NPY_NUM_BUILD_JOBS=2
    echo "Installing pytest, numpy, scipy..."
Henry Schreiner's avatar
Henry Schreiner committed
257
258
259
260
261
262
263
264
265
    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
266
    echo "done."
267

268
269
270
271
    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"
272
  fi
Henry Schreiner's avatar
Henry Schreiner committed
273
  set +ex
274
script:
Henry Schreiner's avatar
Henry Schreiner committed
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
- |
  # 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
300
after_failure: cat tests/test_cmake_build/*.log*
301
after_script:
Henry Schreiner's avatar
Henry Schreiner committed
302
303
304
305
306
- |
  # Cleanup (Docker)
  set -ex
  if [ -n "$DOCKER" ]; then docker stop "$containerid"; docker rm "$containerid"; fi
  set +ex