Build Wheels for Sequenzo #129
This file contains hidden or 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
| # GitHub Actions workflow for Sequenzo package | |
| name: Build Wheels for Sequenzo | |
| on: | |
| push: | |
| tags: | |
| - "v*" | |
| pull_request: | |
| branches: [ main ] | |
| workflow_dispatch: | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| jobs: | |
| build: | |
| name: Build ${{ matrix.os }} Py${{ matrix.python-version }} | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| python-version: ['3.9', '3.10', '3.11'] | |
| steps: | |
| - name: Checkout source with submodules | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Set up Python | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| # Add OpenMP support | |
| - name: Install OpenMP (macOS) | |
| if: runner.os == 'macOS' | |
| run: | | |
| brew install libomp | |
| echo "CC=clang" >> $GITHUB_ENV | |
| echo "CXX=clang++" >> $GITHUB_ENV | |
| echo "LDFLAGS=-L$(brew --prefix libomp)/lib" >> $GITHUB_ENV | |
| echo "CPPFLAGS=-I$(brew --prefix libomp)/include" >> $GITHUB_ENV | |
| echo "SEQUENZO_ENABLE_OPENMP=1" >> $GITHUB_ENV | |
| - name: Install OpenMP (Linux) | |
| if: runner.os == 'Linux' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y libomp-dev | |
| echo "SEQUENZO_ENABLE_OPENMP=1" >> $GITHUB_ENV | |
| - name: Setup MSVC with OpenMP (Windows) | |
| if: runner.os == 'Windows' | |
| uses: ilammy/msvc-dev-cmd@v1 | |
| with: | |
| arch: x64 | |
| - name: Enable OpenMP (Windows) | |
| if: runner.os == 'Windows' | |
| run: | | |
| echo "SEQUENZO_ENABLE_OPENMP=1" >> $env:GITHUB_ENV | |
| # 强制使用预编译包,避免源码编译问题 | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install --only-binary=all --prefer-binary "numpy<2.0" "scipy<1.14" | |
| pip install --prefer-binary Cython pybind11 build "cibuildwheel==2.23.3" twine | |
| # 针对 fastcluster,尝试安装预编译版本 | |
| pip install --only-binary=fastcluster fastcluster || pip install fastcluster | |
| - name: Build Cython wheels on macOS | |
| if: runner.os == 'macOS' | |
| run: | | |
| python setup.py build_ext --inplace | |
| python -m build | |
| - name: Clean previous build outputs | |
| if: runner.os != 'macOS' | |
| run: | | |
| rm -rf build/ dist/ *.egg-info | |
| find . -name "*.so" -delete | |
| shell: bash | |
| - name: Build wheels with cibuildwheel | |
| if: runner.os != 'macOS' | |
| run: python -m cibuildwheel --output-dir dist | |
| env: | |
| CIBW_SKIP: "*-musllinux*" # 跳过 musllinux | |
| CIBW_ARCHS_WINDOWS: "AMD64" | |
| CIBW_ARCHS_LINUX: "x86_64" | |
| CIBW_BUILD_VERBOSITY: "3" | |
| # 环境变量配置 | |
| CIBW_ENVIRONMENT_LINUX: > | |
| SEQUENZO_ENABLE_OPENMP=1 | |
| PIP_PREFER_BINARY=1 | |
| CIBW_ENVIRONMENT_WINDOWS: > | |
| SEQUENZO_ENABLE_OPENMP=1 | |
| PIP_PREFER_BINARY=1 | |
| # Linux: 安装更完整的依赖 | |
| CIBW_BEFORE_BUILD_LINUX: > | |
| yum install -y libgomp-devel openblas-devel lapack-devel || | |
| apt-get update && apt-get install -y libomp-dev libopenblas-dev liblapack-dev || | |
| echo "Dependency installation attempted" | |
| # 使用预编译包安装依赖 | |
| CIBW_BEFORE_BUILD: > | |
| pip install --upgrade pip && | |
| pip install --only-binary=all "numpy<2.0" "scipy<1.14" && | |
| pip install --prefer-binary fastcluster || echo "fastcluster installation attempted" | |
| # 测试命令 | |
| CIBW_TEST_COMMAND: > | |
| python -c "import sequenzo; print('Sequenzo import successful'); | |
| import importlib; | |
| mod = importlib.util.find_spec('sequenzo.clustering.clustering_c_code'); | |
| print('C++ extensions loaded' if mod else 'WARNING: C++ extensions not found')" | |
| - name: Show dist content | |
| run: ls -lah dist/ | |
| shell: bash | |
| - name: Check wheels | |
| run: twine check dist/* | |
| - name: Verify OpenMP Support | |
| run: | | |
| echo "=== 验证构建的wheel中的OpenMP支持 ===" | |
| python -c " | |
| import subprocess | |
| import sys | |
| import os | |
| wheel_files = [f for f in os.listdir('dist') if f.endswith('.whl') and 'cp${{ matrix.python-version }}' in f.replace('.', '')] | |
| if wheel_files: | |
| wheel_file = wheel_files[0] | |
| print(f'Installing wheel: {wheel_file}') | |
| subprocess.run([sys.executable, '-m', 'pip', 'install', '--force-reinstall', f'dist/{wheel_file}'], check=True) | |
| import sequenzo | |
| print('Sequenzo导入成功') | |
| try: | |
| import sequenzo.clustering.clustering_c_code as cc | |
| print('C++扩展加载成功') | |
| except ImportError as e: | |
| print(f'ERROR C++扩展加载失败: {e}') | |
| else: | |
| print('ERROR 未找到对应的wheel文件') | |
| " | |
| shell: bash | |
| - name: Upload wheels | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: wheels-${{ matrix.os }}-${{ matrix.python-version }} | |
| path: dist/ |