1language: cpp 2matrix: 3 include: 4 # This config does a few things: 5 # - Checks C++ and Python code styles (check-style.sh and flake8). 6 # - Makes sure sphinx can build the docs without any errors or warnings. 7 # - Tests setup.py sdist and install (all header files should be present). 8 # - Makes sure that everything still works without optional deps (numpy/scipy/eigen) and 9 # also tests the automatic discovery functions in CMake (Python version, C++ standard). 10 - os: linux 11 dist: xenial # Necessary to run doxygen 1.8.15 12 name: Style, docs, and pip 13 cache: false 14 before_install: 15 - pyenv global $(pyenv whence 2to3) # activate all python versions 16 - PY_CMD=python3 17 - $PY_CMD -m pip install --user --upgrade pip wheel setuptools 18 install: 19 - $PY_CMD -m pip install --user --upgrade sphinx sphinx_rtd_theme breathe flake8 pep8-naming pytest 20 - curl -fsSL https://sourceforge.net/projects/doxygen/files/rel-1.8.15/doxygen-1.8.15.linux.bin.tar.gz/download | tar xz 21 - export PATH="$PWD/doxygen-1.8.15/bin:$PATH" 22 script: 23 - tools/check-style.sh 24 - flake8 25 - $PY_CMD -m sphinx -W -b html docs docs/.build 26 - | 27 # Make sure setup.py distributes and installs all the headers 28 $PY_CMD setup.py sdist 29 $PY_CMD -m pip install --user -U ./dist/* 30 installed=$($PY_CMD -c "import pybind11; print(pybind11.get_include(True) + '/pybind11')") 31 diff -rq $installed ./include/pybind11 32 - | 33 # Barebones build 34 cmake -DCMAKE_BUILD_TYPE=Debug -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DPYTHON_EXECUTABLE=$(which $PY_CMD) . 35 make pytest -j 2 36 make cpptest -j 2 37 # The following are regular test configurations, including optional dependencies. 38 # With regard to each other they differ in Python version, C++ standard and compiler. 39 - os: linux 40 dist: trusty 41 name: Python 2.7, c++11, gcc 4.8 42 env: PYTHON=2.7 CPP=11 GCC=4.8 43 addons: 44 apt: 45 packages: 46 - cmake=2.\* 47 - cmake-data=2.\* 48 - os: linux 49 dist: trusty 50 name: Python 3.6, c++11, gcc 4.8 51 env: PYTHON=3.6 CPP=11 GCC=4.8 52 addons: 53 apt: 54 sources: 55 - deadsnakes 56 packages: 57 - python3.6-dev 58 - python3.6-venv 59 - cmake=2.\* 60 - cmake-data=2.\* 61 - os: linux 62 dist: trusty 63 env: PYTHON=2.7 CPP=14 GCC=6 CMAKE=1 64 name: Python 2.7, c++14, gcc 4.8, CMake test 65 addons: 66 apt: 67 sources: 68 - ubuntu-toolchain-r-test 69 packages: 70 - g++-6 71 - os: linux 72 dist: trusty 73 name: Python 3.5, c++14, gcc 6, Debug build 74 # N.B. `ensurepip` could be installed transitively by `python3.5-venv`, but 75 # seems to have apt conflicts (at least for Trusty). Use Docker instead. 76 services: docker 77 env: DOCKER=debian:stretch PYTHON=3.5 CPP=14 GCC=6 DEBUG=1 78 - os: linux 79 dist: xenial 80 env: PYTHON=3.6 CPP=17 GCC=7 81 name: Python 3.6, c++17, gcc 7 82 addons: 83 apt: 84 sources: 85 - deadsnakes 86 - ubuntu-toolchain-r-test 87 packages: 88 - g++-7 89 - python3.6-dev 90 - python3.6-venv 91 - os: linux 92 dist: xenial 93 env: PYTHON=3.6 CPP=17 CLANG=7 94 name: Python 3.6, c++17, Clang 7 95 addons: 96 apt: 97 sources: 98 - deadsnakes 99 - llvm-toolchain-xenial-7 100 packages: 101 - python3.6-dev 102 - python3.6-venv 103 - clang-7 104 - libclang-7-dev 105 - llvm-7-dev 106 - lld-7 107 - libc++-7-dev 108 - libc++abi-7-dev # Why is this necessary??? 109 - os: osx 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 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 118 - os: linux 119 dist: trusty 120 env: PYPY=5.8 PYTHON=2.7 CPP=11 GCC=4.8 121 name: PyPy 5.8, Python 2.7, c++11, gcc 4.8 122 addons: 123 apt: 124 packages: 125 - libblas-dev 126 - liblapack-dev 127 - gfortran 128 # Build in 32-bit mode and tests against the CMake-installed version 129 - os: linux 130 dist: trusty 131 services: docker 132 env: DOCKER=i386/debian:stretch PYTHON=3.5 CPP=14 GCC=6 INSTALL=1 133 name: Python 3.4, c++14, gcc 6, 32-bit 134 script: 135 - | 136 # Consolidated 32-bit Docker Build + Install 137 set -ex 138 $SCRIPT_RUN_PREFIX sh -c " 139 set -ex 140 cmake ${CMAKE_EXTRA_ARGS} -DPYBIND11_INSTALL=1 -DPYBIND11_TEST=0 . 141 make install 142 cp -a tests /pybind11-tests 143 mkdir /build-tests && cd /build-tests 144 cmake ../pybind11-tests ${CMAKE_EXTRA_ARGS} -DPYBIND11_WERROR=ON 145 make pytest -j 2" 146 set +ex 147cache: 148 directories: 149 - $HOME/.local/bin 150 - $HOME/.local/lib 151 - $HOME/.local/include 152 - $HOME/Library/Python 153before_install: 154- | 155 # Configure build variables 156 set -ex 157 if [ "$TRAVIS_OS_NAME" = "linux" ]; then 158 if [ -n "$CLANG" ]; then 159 export CXX=clang++-$CLANG CC=clang-$CLANG 160 EXTRA_PACKAGES+=" clang-$CLANG llvm-$CLANG-dev" 161 else 162 if [ -z "$GCC" ]; then GCC=4.8 163 else EXTRA_PACKAGES+=" g++-$GCC" 164 fi 165 export CXX=g++-$GCC CC=gcc-$GCC 166 fi 167 elif [ "$TRAVIS_OS_NAME" = "osx" ]; then 168 export CXX=clang++ CC=clang; 169 fi 170 if [ -n "$CPP" ]; then CPP=-std=c++$CPP; fi 171 if [ "${PYTHON:0:1}" = "3" ]; then PY=3; fi 172 if [ -n "$DEBUG" ]; then CMAKE_EXTRA_ARGS+=" -DCMAKE_BUILD_TYPE=Debug"; fi 173 set +ex 174- | 175 # Initialize environment 176 set -ex 177 if [ -n "$DOCKER" ]; then 178 docker pull $DOCKER 179 180 containerid=$(docker run --detach --tty \ 181 --volume="$PWD":/pybind11 --workdir=/pybind11 \ 182 --env="CC=$CC" --env="CXX=$CXX" --env="DEBIAN_FRONTEND=$DEBIAN_FRONTEND" \ 183 --env=GCC_COLORS=\ \ 184 $DOCKER) 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 if [ "$PYPY" = "5.8" ]; then 189 curl -fSL https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.8.0-linux64.tar.bz2 | tar xj 190 PY_CMD=$(echo `pwd`/pypy2-v5.8.0-linux64/bin/pypy) 191 CMAKE_EXTRA_ARGS+=" -DPYTHON_EXECUTABLE:FILEPATH=$PY_CMD" 192 else 193 PY_CMD=python$PYTHON 194 if [ "$TRAVIS_OS_NAME" = "osx" ]; then 195 if [ "$PY" = "3" ]; then 196 brew update && brew upgrade python 197 else 198 curl -fsSL https://bootstrap.pypa.io/get-pip.py | $PY_CMD - --user 199 fi 200 fi 201 fi 202 if [ "$PY" = 3 ] || [ -n "$PYPY" ]; then 203 $PY_CMD -m ensurepip --user 204 fi 205 $PY_CMD --version 206 $PY_CMD -m pip install --user --upgrade pip wheel 207 fi 208 set +ex 209install: 210- | 211 # Install dependencies 212 set -ex 213 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 225 if [ "$CLANG" = "7" ]; then 226 export CXXFLAGS="-stdlib=libc++" 227 fi 228 229 export NPY_NUM_BUILD_JOBS=2 230 echo "Installing pytest, numpy, scipy..." 231 local PIP_CMD="" 232 if [ -n $PYPY ]; then 233 # For expediency, install only versions that are available on the extra index. 234 travis_wait 30 \ 235 $PY_CMD -m pip install --user --upgrade --extra-index-url https://imaginary.ca/trusty-pypi \ 236 pytest numpy==1.15.4 scipy==1.2.0 237 else 238 $PY_CMD -m pip install --user --upgrade pytest numpy scipy 239 fi 240 echo "done." 241 242 mkdir eigen 243 curl -fsSL https://bitbucket.org/eigen/eigen/get/3.3.4.tar.bz2 | \ 244 tar --extract -j --directory=eigen --strip-components=1 245 export CMAKE_INCLUDE_PATH="${CMAKE_INCLUDE_PATH:+$CMAKE_INCLUDE_PATH:}$PWD/eigen" 246 fi 247 set +ex 248script: 249- | 250 # CMake Configuration 251 set -ex 252 $SCRIPT_RUN_PREFIX cmake ${CMAKE_EXTRA_ARGS} \ 253 -DPYBIND11_PYTHON_VERSION=$PYTHON \ 254 -DPYBIND11_CPP_STANDARD=$CPP \ 255 -DPYBIND11_WERROR=${WERROR:-ON} \ 256 -DDOWNLOAD_CATCH=${DOWNLOAD_CATCH:-ON} \ 257 . 258 set +ex 259- | 260 # pytest 261 set -ex 262 $SCRIPT_RUN_PREFIX make pytest -j 2 VERBOSE=1 263 set +ex 264- | 265 # cpptest 266 set -ex 267 $SCRIPT_RUN_PREFIX make cpptest -j 2 268 set +ex 269- | 270 # CMake Build Interface 271 set -ex 272 if [ -n "$CMAKE" ]; then $SCRIPT_RUN_PREFIX make test_cmake_build; fi 273 set +ex 274after_failure: cat tests/test_cmake_build/*.log* 275after_script: 276- | 277 # Cleanup (Docker) 278 set -ex 279 if [ -n "$DOCKER" ]; then docker stop "$containerid"; docker rm "$containerid"; fi 280 set +ex 281