chore: update C core #1565
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Name cannot contain commas because of setup-emsdk job | |
name: Build and test | |
on: [push, pull_request] | |
env: | |
CIBW_ENVIRONMENT_PASS_LINUX: PYTEST_TIMEOUT | |
CIBW_TEST_COMMAND: "cd {project} && pip install --prefer-binary '.[test]' && python -m pytest -v tests" | |
CIBW_SKIP: "cp36-* cp37-* pp37-*" | |
PYTEST_TIMEOUT: 60 | |
MACOSX_DEPLOYMENT_TARGET: "10.9" | |
jobs: | |
build_wheel_linux: | |
name: Build wheels on Linux (${{ matrix.wheel_arch }}) | |
runs-on: ubuntu-20.04 | |
strategy: | |
fail-fast: false | |
matrix: | |
wheel_arch: [x86_64, i686] | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
fetch-depth: 0 | |
- uses: actions/setup-python@v5 | |
name: Install Python | |
with: | |
python-version: '3.8' | |
- name: Build wheels (manylinux) | |
uses: pypa/cibuildwheel@v2.17.0 | |
env: | |
CIBW_BEFORE_BUILD: "yum install -y flex bison libxml2-devel zlib-devel cairo-devel && pip install -U cmake pip wheel && python setup.py build_c_core" | |
CIBW_BUILD: "*-manylinux_${{ matrix.wheel_arch }}" | |
# Skip tests for Python 3.10 onwards because SciPy does not have | |
# 32-bit wheels for Linux | |
CIBW_TEST_SKIP: "cp310-manylinux_i686 cp311-manylinux_i686 cp312-manylinux_i686" | |
- name: Build wheels (musllinux) | |
uses: pypa/cibuildwheel@v2.17.0 | |
env: | |
CIBW_BEFORE_BUILD: "apk add flex bison libxml2-dev zlib-dev cairo-dev && pip install -U cmake pip wheel && python setup.py build_c_core" | |
CIBW_BUILD: "*-musllinux_${{ matrix.wheel_arch }}" | |
CIBW_TEST_COMMAND: "cd {project} && pip install --prefer-binary '.[test-musl]' && python -m pytest -v tests" | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: ./wheelhouse/*.whl | |
build_wheel_linux_aarch64_manylinux: | |
name: Build wheels on Linux (aarch64/manylinux) | |
runs-on: ubuntu-20.04 | |
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
fetch-depth: 0 | |
- name: Set up QEMU | |
id: qemu | |
uses: docker/setup-qemu-action@v3 | |
- name: Build wheels (manylinux) | |
uses: pypa/cibuildwheel@v2.17.0 | |
env: | |
CIBW_BEFORE_BUILD: "yum install -y flex bison libxml2-devel zlib-devel cairo-devel && pip install -U cmake pip wheel && python setup.py build_c_core" | |
CIBW_ARCHS_LINUX: aarch64 | |
CIBW_BUILD: "*-manylinux_aarch64" | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: ./wheelhouse/*.whl | |
build_wheel_linux_aarch64_musllinux: | |
name: Build wheels on Linux (aarch64/musllinux) | |
runs-on: ubuntu-20.04 | |
if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
fetch-depth: 0 | |
- name: Set up QEMU | |
id: qemu | |
uses: docker/setup-qemu-action@v3 | |
- name: Build wheels (musllinux) | |
uses: pypa/cibuildwheel@v2.17.0 | |
env: | |
CIBW_BEFORE_BUILD: "apk add flex bison libxml2-dev zlib-dev cairo-dev && pip install -U cmake pip wheel && python setup.py build_c_core" | |
CIBW_ARCHS_LINUX: aarch64 | |
CIBW_BUILD: "*-musllinux_aarch64" | |
CIBW_TEST_COMMAND: "cd {project} && pip install --prefer-binary '.[test-musl]' && python -m pytest -v tests" | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: ./wheelhouse/*.whl | |
build_wheel_macos: | |
name: Build wheels on macOS (${{ matrix.wheel_arch }}) | |
runs-on: macos-latest | |
env: | |
LLVM_VERSION: "14.0.5" | |
strategy: | |
matrix: | |
include: | |
- cmake_arch: x86_64 | |
wheel_arch: x86_64 | |
- cmake_arch: arm64 | |
cmake_extra_args: -DF2C_EXTERNAL_ARITH_HEADER=../../../etc/arith_apple_m1.h -DIEEE754_DOUBLE_ENDIANNESS_MATCHES=ON | |
wheel_arch: arm64 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
fetch-depth: 0 | |
- name: Cache installed C core | |
id: cache-c-core | |
uses: actions/cache@v4 | |
with: | |
path: vendor/install | |
key: C-core-cache-${{ runner.os }}-${{ matrix.cmake_arch }}-llvm${{ env.LLVM_VERSION }}-${{ hashFiles('.git/modules/**/HEAD') }} | |
- name: Cache C core dependencies | |
id: cache-c-deps | |
uses: actions/cache@v4 | |
with: | |
path: ~/local | |
key: deps-cache-v2-${{ runner.os }}-${{ matrix.cmake_arch }}-llvm${{ env.LLVM_VERSION }} | |
- uses: actions/setup-python@v5 | |
name: Install Python | |
with: | |
python-version: '3.8' | |
- name: Install OS dependencies | |
if: steps.cache-c-core.outputs.cache-hit != 'true' || steps.cache-c-deps.outputs.cache-hit != 'true' # Only needed when building the C core or libomp | |
run: | |
brew install ninja autoconf automake libtool cmake | |
- name: Install OpenMP library | |
if: steps.cache-c-deps.outputs.cache-hit != 'true' | |
run: | | |
wget https://github.com/llvm/llvm-project/releases/download/llvmorg-$LLVM_VERSION/openmp-$LLVM_VERSION.src.tar.xz | |
tar xf openmp-$LLVM_VERSION.src.tar.xz | |
cd openmp-$LLVM_VERSION.src | |
mkdir build && cd build | |
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/local -DLIBOMP_ENABLE_SHARED=OFF -DCMAKE_OSX_ARCHITECTURES=${{ matrix.cmake_arch }} | |
cmake --build . | |
cmake --install . | |
- name: Build wheels | |
uses: pypa/cibuildwheel@v2.17.0 | |
env: | |
CIBW_ARCHS_MACOS: "${{ matrix.wheel_arch }}" | |
CIBW_BEFORE_BUILD: "python setup.py build_c_core" | |
CIBW_ENVIRONMENT: "LDFLAGS=-L$HOME/local/lib" | |
IGRAPH_CMAKE_EXTRA_ARGS: -DCMAKE_OSX_ARCHITECTURES=${{ matrix.cmake_arch }} ${{ matrix.cmake_extra_args }} -DCMAKE_PREFIX_PATH=$HOME/local | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: ./wheelhouse/*.whl | |
build_wheel_wasm: | |
name: Build wheels for WebAssembly | |
runs-on: ubuntu-20.04 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
fetch-depth: 0 | |
- uses: actions/setup-python@v5 | |
name: Install Python | |
with: | |
python-version: '3.11.2' | |
- name: Install OS dependencies | |
run: | |
sudo apt install ninja-build cmake flex bison | |
- uses: mymindstorm/setup-emsdk@v14 | |
with: | |
version: '3.1.45' | |
actions-cache-folder: 'emsdk-cache' | |
- name: Build wheel | |
run: | | |
pip install pyodide-build==0.24.1 | |
python3 scripts/fix_pyodide_build.py | |
pyodide build | |
- name: Setup upterm session | |
uses: lhotari/action-upterm@v1 | |
if: ${{ failure() }} | |
with: | |
limit-access-to-actor: true | |
wait-timeout-minutes: 5 | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: ./dist/*.whl | |
build_wheel_win: | |
name: Build wheels on Windows (${{ matrix.cmake_arch }}) | |
runs-on: windows-2019 | |
strategy: | |
matrix: | |
include: | |
- cmake_arch: Win32 | |
wheel_arch: win32 | |
vcpkg_arch: x86 | |
- cmake_arch: x64 | |
wheel_arch: win_amd64 | |
vcpkg_arch: x64 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
fetch-depth: 0 | |
- uses: actions/setup-python@v5 | |
name: Install Python | |
with: | |
python-version: '3.8' | |
- name: Cache installed C core | |
id: cache-c-core | |
uses: actions/cache@v4 | |
with: | |
path: vendor/install | |
key: C-core-cache-${{ runner.os }}-${{ matrix.cmake_arch }}-${{ hashFiles('.git/modules/**/HEAD') }} | |
- name: Cache VCPKG | |
uses: actions/cache@v4 | |
with: | |
path: C:/vcpkg/installed/ | |
key: vcpkg-${{ runner.os }}-${{ matrix.vcpkg_arch }} | |
- name: Install build dependencies | |
if: steps.cache-c-core.outputs.cache-hit != 'true' # Only needed when building the C core | |
run: choco install winflexbison3 ninja | |
- name: Install VCPKG libraries | |
run: | | |
%VCPKG_INSTALLATION_ROOT%\vcpkg.exe integrate install | |
%VCPKG_INSTALLATION_ROOT%\vcpkg.exe install libxml2:${{ matrix.vcpkg_arch }}-windows-static-md | |
shell: cmd | |
- name: Build wheels | |
uses: pypa/cibuildwheel@v2.17.0 | |
env: | |
CIBW_BEFORE_BUILD: "python setup.py build_c_core" | |
CIBW_BUILD: "*-${{ matrix.wheel_arch }}" | |
CIBW_TEST_COMMAND: "cd /d {project} && pip install --prefer-binary \".[test]\" && python -m pytest tests" | |
# Skip tests for Python 3.10 onwards because SciPy does not have | |
# 32-bit wheels for Windows | |
CIBW_TEST_SKIP: "cp310-win32 cp311-win32 cp312-win32" | |
IGRAPH_CMAKE_EXTRA_ARGS: -DCMAKE_BUILD_TYPE=RelWithDebInfo -DVCPKG_TARGET_TRIPLET=${{ matrix.vcpkg_arch }}-windows-static-md -DCMAKE_TOOLCHAIN_FILE=c:/vcpkg/scripts/buildsystems/vcpkg.cmake -A ${{ matrix.cmake_arch }} | |
IGRAPH_EXTRA_LIBRARY_PATH: C:/vcpkg/installed/${{ matrix.vcpkg_arch }}-windows-static-md/lib/ | |
IGRAPH_STATIC_EXTENSION: True | |
IGRAPH_EXTRA_LIBRARIES: libxml2,lzma,zlib,iconv,charset | |
IGRAPH_EXTRA_DYNAMIC_LIBRARIES: wsock32,ws2_32 | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: ./wheelhouse/*.whl | |
build_sdist: | |
name: Build sdist and test extra dependencies | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
fetch-depth: 0 | |
- name: Cache installed C core | |
id: cache-c-core | |
uses: actions/cache@v4 | |
with: | |
path: | | |
vendor/install | |
key: C-core-cache-${{ runner.os }}-${{ hashFiles('.git/modules/**/HEAD') }} | |
- name: Install OS dependencies | |
if: steps.cache-c-core.outputs.cache-hit != 'true' # Only needed when building the C core | |
run: | |
sudo apt install ninja-build cmake flex bison | |
- uses: actions/setup-python@v5 | |
name: Install Python | |
with: | |
python-version: '3.8' | |
- name: Build sdist | |
run: | | |
python setup.py build_c_core | |
python setup.py sdist | |
python setup.py install | |
- name: Test | |
run: | | |
pip install --prefer-binary cairocffi numpy scipy pandas networkx pytest pytest-timeout | |
python -m pytest -v tests | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: dist/*.tar.gz | |
# When updating 'runs-on', the ASan/UBSan library paths/versions must also be updated for LD_PRELOAD | |
# for the "Test" step below. | |
build_with_sanitizer: | |
name: Build with sanitizers for debugging purposes | |
runs-on: ubuntu-20.04 | |
env: | |
IGRAPH_CMAKE_EXTRA_ARGS: -DFORCE_COLORED_OUTPUT=ON | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
fetch-depth: 0 | |
- name: Cache installed C core | |
id: cache-c-core | |
uses: actions/cache@v4 | |
with: | |
path: | | |
vendor/build | |
vendor/install | |
key: C-core-build-sanitizer-v1-${{ runner.os }}-${{ hashFiles('.git/modules/vendor/source/igraph/HEAD') }} | |
- name: Install OS dependencies | |
if: steps.cache-c-core.outputs.cache-hit != 'true' # Only needed when building the C core | |
run: | |
sudo apt install ninja-build cmake flex bison | |
- uses: actions/setup-python@v5 | |
name: Install Python | |
with: | |
python-version: '3.12' | |
- name: Install test dependencies | |
run: | | |
pip install --prefer-binary pytest pytest-timeout setuptools | |
- name: Build C core | |
env: | |
IGRAPH_USE_SANITIZERS: 1 | |
run: | | |
python setup.py build_c_core | |
- name: Build and install Python extension | |
env: | |
IGRAPH_USE_SANITIZERS: 1 | |
run: | | |
# NOTE: install calls "build" first | |
python setup.py install | |
# Only pytest, and nothing else should be run in this section due to the presence of LD_PRELOAD. | |
# The ASan/UBSan library versions need to be updated when switching to a newer Ubuntu/GCC. | |
# LD_PRELOAD needs to be specified in the "run" section to ensure that we | |
# do not pick up memory leaks in the wrapper shell (e.g., /bin/bash) | |
- name: Test | |
env: | |
ASAN_OPTIONS: "detect_stack_use_after_return=1" | |
LSAN_OPTIONS: "suppressions=etc/lsan-suppr.txt:print_suppressions=false" | |
run: | | |
LD_PRELOAD=/lib/x86_64-linux-gnu/libasan.so.5:/lib/x86_64-linux-gnu/libubsan.so.1 python -m pytest --capture=sys tests |