| 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] | |
| python: | |
| - 2.7 | |
| - 3.5 | |
| - 3.6 | |
| - 3.7 | |
| - 3.8 | |
| - 3.9 | |
| # - 3.10.0-alpha.1 - need next release for pybind11 fix | |
| - 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 | |
| args: > | |
| -DPYBIND11_FINDPYTHON=ON | |
| - runs-on: windows-latest | |
| python: 3.6 | |
| args: > | |
| -DPYBIND11_FINDPYTHON=ON | |
| - runs-on: ubuntu-latest | |
| python: 3.8 | |
| args: > | |
| -DPYBIND11_FINDPYTHON=ON | |
| # 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 | |
| - runs-on: windows-latest | |
| python: pypy3 | |
| # Let's drop a few macOS runs since that tends to be 2.7 or 3.8+ | |
| - runs-on: macos-latest | |
| python: 3.6 | |
| - runs-on: macos-latest | |
| python: 3.7 | |
| name: "🐍 ${{ matrix.python }} • ${{ matrix.runs-on }} • x64 ${{ 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 }} | |
| - 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 }}-x64-${{ 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 | |
| - 7 | |
| - 9 | |
| - dev | |
| std: | |
| - 11 | |
| include: | |
| - clang: 5 | |
| std: 14 | |
| - clang: 10 | |
| std: 20 | |
| - clang: 10 | |
| std: 17 | |
| name: "🐍 3 • Clang ${{ matrix.clang }} • C++${{ matrix.std }} • 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 | |
| -DCMAKE_CXX_STANDARD=${{ matrix.std }} | |
| -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 | |
| std: | |
| - 11 | |
| include: | |
| - gcc: 10 | |
| std: 20 | |
| name: "🐍 3 • GCC ${{ matrix.gcc }} • C++${{ matrix.std }}• 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=${{ matrix.std }} | |
| -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 | |
| win32: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python: | |
| - 3.5 | |
| - 3.6 | |
| - 3.7 | |
| - 3.8 | |
| - 3.9 | |
| - pypy3 | |
| # TODO: fix hang on pypy2 | |
| include: | |
| - python: 3.9 | |
| args: -DCMAKE_CXX_STANDARD=20 -DDOWNLOAD_EIGEN=OFF | |
| - python: 3.8 | |
| args: -DCMAKE_CXX_STANDARD=17 | |
| name: "🐍 ${{ matrix.python }} • MSVC 2019 • x86 ${{ matrix.args }}" | |
| runs-on: windows-latest | |
| steps: | |
| - uses: actions/checkout@v2 | |
| - name: Setup Python ${{ matrix.python }} | |
| uses: actions/setup-python@v2 | |
| with: | |
| python-version: ${{ matrix.python }} | |
| architecture: x86 | |
| - name: Update CMake | |
| uses: jwlawson/actions-setup-cmake@v1.4 | |
| - name: Prepare MSVC | |
| uses: ilammy/msvc-dev-cmd@v1 | |
| with: | |
| arch: x86 | |
| - name: Prepare env | |
| run: python -m pip install -r tests/requirements.txt --prefer-binary | |
| # First build - C++11 mode and inplace | |
| - name: Configure ${{ matrix.args }} | |
| run: > | |
| cmake -S . -B build | |
| -G "Visual Studio 16 2019" -A Win32 | |
| -DPYBIND11_WERROR=ON | |
| -DDOWNLOAD_CATCH=ON | |
| -DDOWNLOAD_EIGEN=ON | |
| ${{ matrix.args }} | |
| - name: Build C++11 | |
| run: cmake --build build -j 2 | |
| - name: Run tests | |
| run: cmake --build build -t pytest | |
| win32-msvc2015: | |
| name: "🐍 ${{ matrix.python }} • MSVC 2015 • x64" | |
| runs-on: windows-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python: | |
| - 2.7 | |
| - 3.6 | |
| - 3.7 | |
| # todo: check/cpptest does not support 3.8+ yet | |
| steps: | |
| - uses: actions/checkout@v2 | |
| - name: Setup 🐍 ${{ matrix.python }} | |
| uses: actions/setup-python@v2 | |
| with: | |
| python-version: ${{ matrix.python }} | |
| - name: Update CMake | |
| uses: jwlawson/actions-setup-cmake@v1.4 | |
| - name: Prepare MSVC | |
| uses: ilammy/msvc-dev-cmd@v1 | |
| with: | |
| toolset: 14.0 | |
| - name: Prepare env | |
| run: python -m pip install -r tests/requirements.txt --prefer-binary | |
| # First build - C++11 mode and inplace | |
| - name: Configure | |
| run: > | |
| cmake -S . -B build | |
| -G "Visual Studio 14 2015" -A x64 | |
| -DPYBIND11_WERROR=ON | |
| -DDOWNLOAD_CATCH=ON | |
| -DDOWNLOAD_EIGEN=ON | |
| - name: Build C++14 | |
| run: cmake --build build -j 2 | |
| - name: Run all checks | |
| run: cmake --build build -t check | |
| win32-msvc2017: | |
| name: "🐍 ${{ matrix.python }} • MSVC 2017 • x64" | |
| runs-on: windows-2016 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python: | |
| - 2.7 | |
| - 3.5 | |
| - 3.7 | |
| std: | |
| - 14 | |
| include: | |
| - python: 2.7 | |
| std: 17 | |
| args: > | |
| -DCMAKE_CXX_FLAGS="/permissive- /EHsc /GR" | |
| steps: | |
| - uses: actions/checkout@v2 | |
| - name: Setup 🐍 ${{ matrix.python }} | |
| uses: actions/setup-python@v2 | |
| with: | |
| python-version: ${{ matrix.python }} | |
| - name: Update CMake | |
| uses: jwlawson/actions-setup-cmake@v1.4 | |
| - name: Prepare env | |
| run: python -m pip install -r tests/requirements.txt --prefer-binary | |
| # First build - C++11 mode and inplace | |
| - name: Configure | |
| run: > | |
| cmake -S . -B build | |
| -G "Visual Studio 15 2017" -A x64 | |
| -DPYBIND11_WERROR=ON | |
| -DDOWNLOAD_CATCH=ON | |
| -DDOWNLOAD_EIGEN=ON | |
| -DCMAKE_CXX_STANDARD=${{ matrix.std }} | |
| ${{ matrix.args }} | |
| - name: Build ${{ matrix.std }} | |
| run: cmake --build build -j 2 | |
| - name: Run all checks | |
| run: cmake --build build -t check |