name: CI on: workflow_dispatch: pull_request: push: branches: - master - stable - v* jobs: # This is the "main" test suite, which tests a large number of different # versions of default compilers and Python versions in GitHub Actions. standard: strategy: fail-fast: false matrix: runs-on: [ubuntu-latest, windows-latest, macos-latest] arch: [x64] python: - 2.7 - 3.5 - 3.8 - 3.9 - pypy2 - pypy3 # Items in here will either be added to the build matrix (if not # present), or add new keys to an existing matrix element if all the # existing keys match. # # We support three optional keys: args (both build), args1 (first # build), and args2 (second build). include: # Just add a key - runs-on: ubuntu-latest python: 3.6 arch: x64 args: > -DPYBIND11_FINDPYTHON=ON - runs-on: windows-latest python: 3.6 arch: x64 args: > -DPYBIND11_FINDPYTHON=ON - runs-on: ubuntu-latest python: 3.8 arch: x64 args: > -DPYBIND11_FINDPYTHON=ON # New runs - runs-on: windows-2016 python: 3.7 arch: x86 args2: > -DCMAKE_CXX_FLAGS="/permissive- /EHsc /GR" - runs-on: windows-latest python: 3.7 arch: x64 # These items will be removed from the build matrix, keys must match. exclude: # Currently 32bit only, and we build 64bit - runs-on: windows-latest python: pypy2 arch: x64 - runs-on: windows-latest python: pypy3 arch: x64 # TODO: renable # Currently segfaults on macOS Python 3.9 - runs-on: macos-latest python: 3.9 arch: x64 name: "🐍 ${{ matrix.python }} • ${{ matrix.runs-on }} • ${{ matrix.arch }} ${{ matrix.args }}" runs-on: ${{ matrix.runs-on }} steps: - uses: actions/checkout@v2 - name: Setup Python ${{ matrix.python }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python }} architecture: ${{ matrix.arch }} - name: Setup Boost (Windows / Linux latest) shell: bash run: echo "BOOST_ROOT=$BOOST_ROOT_1_72_0" >> $GITHUB_ENV - name: Update CMake uses: jwlawson/actions-setup-cmake@v1.4 - name: Cache wheels if: runner.os == 'macOS' uses: actions/cache@v2 with: # This path is specific to macOS - we really only need it for PyPy NumPy wheels # See https://github.com/actions/cache/blob/master/examples.md#python---pip # for ways to do this more generally path: ~/Library/Caches/pip # Look to see if there is a cache hit for the corresponding requirements file key: ${{ runner.os }}-pip-${{ matrix.python }}-${{ matrix.arch }}-${{ hashFiles('tests/requirements.txt') }} - name: Prepare env run: python -m pip install -r tests/requirements.txt --prefer-binary - name: Setup annotations on Linux if: runner.os == 'Linux' run: python -m pip install pytest-github-actions-annotate-failures # First build - C++11 mode and inplace - name: Configure C++11 ${{ matrix.args }} run: > cmake -S . -B . -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DDOWNLOAD_EIGEN=ON -DCMAKE_CXX_STANDARD=11 ${{ matrix.args }} - name: Build C++11 run: cmake --build . -j 2 - name: Python tests C++11 run: cmake --build . --target pytest -j 2 - name: C++11 tests # TODO: Figure out how to load the DLL on Python 3.8+ if: "!(runner.os == 'Windows' && (matrix.python == 3.8 || matrix.python == 3.9))" run: cmake --build . --target cpptest -j 2 - name: Interface test C++11 run: cmake --build . --target test_cmake_build - name: Clean directory run: git clean -fdx # Second build - C++17 mode and in a build directory - name: Configure ${{ matrix.args2 }} run: > cmake -S . -B build2 -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DDOWNLOAD_EIGEN=ON -DCMAKE_CXX_STANDARD=17 ${{ matrix.args }} ${{ matrix.args2 }} - name: Build run: cmake --build build2 -j 2 - name: Python tests run: cmake --build build2 --target pytest - name: C++ tests # TODO: Figure out how to load the DLL on Python 3.8+ if: "!(runner.os == 'Windows' && (matrix.python == 3.8 || matrix.python == 3.9))" run: cmake --build build2 --target cpptest - name: Interface test run: cmake --build build2 --target test_cmake_build # Eventually Microsoft might have an action for setting up # MSVC, but for now, this action works: - name: Prepare compiler environment for Windows 🐍 2.7 if: matrix.python == 2.7 && runner.os == 'Windows' uses: ilammy/msvc-dev-cmd@v1 with: arch: x64 # This makes two environment variables available in the following step(s) - name: Set Windows 🐍 2.7 environment variables if: matrix.python == 2.7 && runner.os == 'Windows' shell: bash run: | echo "DISTUTILS_USE_SDK=1" >> $GITHUB_ENV echo "MSSdk=1" >> $GITHUB_ENV # This makes sure the setup_helpers module can build packages using # setuptools - name: Setuptools helpers test run: pytest tests/extra_setuptools # Testing on clang using the excellent silkeh clang docker images clang: runs-on: ubuntu-latest strategy: fail-fast: false matrix: clang: - 3.6 - 3.7 - 3.9 - 5 - 7 - 10 - dev name: "🐍 3 • Clang ${{ matrix.clang }} • x64" container: "silkeh/clang:${{ matrix.clang }}" steps: - uses: actions/checkout@v2 - name: Add wget and python3 run: apt-get update && apt-get install -y python3-dev python3-numpy python3-pytest libeigen3-dev - name: Configure shell: bash run: > cmake -S . -B build -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DPYTHON_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") - name: Build run: cmake --build build -j 2 - name: Python tests run: cmake --build build --target pytest - name: C++ tests run: cmake --build build --target cpptest - name: Interface test run: cmake --build build --target test_cmake_build # Testing NVCC; forces sources to behave like .cu files cuda: runs-on: ubuntu-latest name: "🐍 3.8 • CUDA 11 • Ubuntu 20.04" container: nvidia/cuda:11.0-devel-ubuntu20.04 steps: - uses: actions/checkout@v2 # tzdata will try to ask for the timezone, so set the DEBIAN_FRONTEND - name: Install 🐍 3 run: apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y cmake git python3-dev python3-pytest python3-numpy - name: Configure run: cmake -S . -B build -DPYBIND11_CUDA_TESTS=ON -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON - name: Build run: cmake --build build -j2 --verbose - name: Python tests run: cmake --build build --target pytest # Testing CentOS 8 + PGI compilers centos-nvhpc8: runs-on: ubuntu-latest name: "🐍 3 • CentOS8 / PGI 20.7 • x64" container: centos:8 steps: - uses: actions/checkout@v2 - name: Add Python 3 and a few requirements run: yum update -y && yum install -y git python3-devel python3-numpy python3-pytest make environment-modules - name: Install CMake with pip run: | python3 -m pip install --upgrade pip python3 -m pip install cmake --prefer-binary - name: Install NVidia HPC SDK run: yum -y install https://developer.download.nvidia.com/hpc-sdk/nvhpc-20-7-20.7-1.x86_64.rpm https://developer.download.nvidia.com/hpc-sdk/nvhpc-2020-20.7-1.x86_64.rpm - name: Configure shell: bash run: | source /etc/profile.d/modules.sh module load /opt/nvidia/hpc_sdk/modulefiles/nvhpc/20.7 cmake -S . -B build -DDOWNLOAD_CATCH=ON -DCMAKE_CXX_STANDARD=14 -DPYTHON_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") - name: Build run: cmake --build build -j 2 --verbose - name: Python tests run: cmake --build build --target pytest - name: C++ tests run: cmake --build build --target cpptest - name: Interface test run: cmake --build build --target test_cmake_build # Testing on CentOS 7 + PGI compilers, which seems to require more workarounds centos-nvhpc7: runs-on: ubuntu-latest name: "🐍 3 • CentOS7 / PGI 20.9 • x64" container: centos:7 steps: - uses: actions/checkout@v2 - name: Add Python 3 and a few requirements run: yum update -y && yum install -y epel-release && yum install -y git python3-devel make environment-modules cmake3 - name: Install NVidia HPC SDK run: yum -y install https://developer.download.nvidia.com/hpc-sdk/20.9/nvhpc-20-9-20.9-1.x86_64.rpm https://developer.download.nvidia.com/hpc-sdk/20.9/nvhpc-2020-20.9-1.x86_64.rpm # On CentOS 7, we have to filter a few tests (compiler internal error) # and allow deeper templete recursion (not needed on CentOS 8 with a newer # standard library). On some systems, you many need further workarounds: # https://github.com/pybind/pybind11/pull/2475 - name: Configure shell: bash run: | source /etc/profile.d/modules.sh module load /opt/nvidia/hpc_sdk/modulefiles/nvhpc/20.9 cmake3 -S . -B build -DDOWNLOAD_CATCH=ON \ -DCMAKE_CXX_STANDARD=11 \ -DPYTHON_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") \ -DCMAKE_CXX_FLAGS="-Wc,--pending_instantiations=0" \ -DPYBIND11_TEST_FILTER="test_smart_ptr.cpp;test_virtual_functions.cpp" # Building before installing Pip should produce a warning but not an error - name: Build run: cmake3 --build build -j 2 --verbose - name: Install CMake with pip run: | python3 -m pip install --upgrade pip python3 -m pip install pytest - name: Python tests run: cmake3 --build build --target pytest - name: C++ tests run: cmake3 --build build --target cpptest - name: Interface test run: cmake3 --build build --target test_cmake_build # Testing on GCC using the GCC docker images (only recent images supported) gcc: runs-on: ubuntu-latest strategy: fail-fast: false matrix: gcc: - 7 - latest name: "🐍 3 • GCC ${{ matrix.gcc }} • x64" container: "gcc:${{ matrix.gcc }}" steps: - uses: actions/checkout@v1 - name: Add Python 3 run: apt-get update; apt-get install -y python3-dev python3-numpy python3-pytest python3-pip libeigen3-dev - name: Update pip run: python3 -m pip install --upgrade pip - name: Setup CMake 3.18 uses: jwlawson/actions-setup-cmake@v1.4 with: cmake-version: 3.18 - name: Configure shell: bash run: > cmake -S . -B build -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DCMAKE_CXX_STANDARD=11 -DPYTHON_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") - name: Build run: cmake --build build -j 2 - name: Python tests run: cmake --build build --target pytest - name: C++ tests run: cmake --build build --target cpptest - name: Interface test run: cmake --build build --target test_cmake_build # Testing on CentOS (manylinux uses a centos base, and this is an easy way # to get GCC 4.8, which is the manylinux1 compiler). centos: runs-on: ubuntu-latest strategy: fail-fast: false matrix: centos: - 7 # GCC 4.8 - 8 name: "🐍 3 • CentOS ${{ matrix.centos }} • x64" container: "centos:${{ matrix.centos }}" steps: - uses: actions/checkout@v2 - name: Add Python 3 run: yum update -y && yum install -y python3-devel gcc-c++ make git - name: Update pip run: python3 -m pip install --upgrade pip - name: Install dependencies run: python3 -m pip install cmake -r tests/requirements.txt --prefer-binary - name: Configure shell: bash run: > cmake -S . -B build -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DDOWNLOAD_EIGEN=ON -DCMAKE_CXX_STANDARD=11 -DPYTHON_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") - name: Build run: cmake --build build -j 2 - name: Python tests run: cmake --build build --target pytest - name: C++ tests run: cmake --build build --target cpptest - name: Interface test run: cmake --build build --target test_cmake_build # This tests an "install" with the CMake tools install-classic: name: "🐍 3.5 • Debian • x86 • Install" runs-on: ubuntu-latest container: i386/debian:stretch steps: - uses: actions/checkout@v1 - name: Install requirements run: | apt-get update apt-get install -y git make cmake g++ libeigen3-dev python3-dev python3-pip pip3 install "pytest==3.1.*" - name: Configure for install run: > cmake . -DPYBIND11_INSTALL=1 -DPYBIND11_TEST=0 -DPYTHON_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") - name: Make and install run: make install - name: Copy tests to new directory run: cp -a tests /pybind11-tests - name: Make a new test directory run: mkdir /build-tests - name: Configure tests run: > cmake ../pybind11-tests -DDOWNLOAD_CATCH=ON -DPYBIND11_WERROR=ON -DPYTHON_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") working-directory: /build-tests - name: Run tests run: make pytest -j 2 working-directory: /build-tests # This verifies that the documentation is not horribly broken, and does a # basic sanity check on the SDist. doxygen: name: "Documentation build test" runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 - name: Install Doxygen run: sudo apt-get install -y doxygen librsvg2-bin # Changed to rsvg-convert in 20.04 - name: Install docs & setup requirements run: python3 -m pip install -r docs/requirements.txt - name: Build docs run: python3 -m sphinx -W -b html docs docs/.build - name: Make SDist run: python3 setup.py sdist - run: git status --ignored - name: Check local include dir run: > ls pybind11; python3 -c "import pybind11, pathlib; assert (a := pybind11.get_include()) == (b := str(pathlib.Path('include').resolve())), f'{a} != {b}'" - name: Compare Dists (headers only) working-directory: include run: | python3 -m pip install --user -U ../dist/* installed=$(python3 -c "import pybind11; print(pybind11.get_include() + '/pybind11')") diff -rq $installed ./pybind11