[Compat] Compatible with PaddlePaddle #39
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
| name: Build Wheels for Paddle | |
| on: | |
| push: | |
| branches: [paddle] | |
| tags: ["v*"] | |
| pull_request: | |
| merge_group: | |
| workflow_dispatch: | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref_name }}-${{ github.ref_type == 'branch' && github.sha }}-${{ github.event_name == 'workflow_dispatch' }} | |
| cancel-in-progress: true | |
| permissions: | |
| id-token: write | |
| contents: write | |
| defaults: | |
| run: | |
| shell: bash -l -eo pipefail {0} | |
| jobs: | |
| build-paddlecodec-wheel: | |
| runs-on: ubuntu-latest | |
| container: | |
| image: pytorch/manylinux2_28-builder:cpu | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] | |
| permissions: | |
| id-token: write | |
| contents: read | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| - name: Setup conda environment | |
| uses: conda-incubator/setup-miniconda@v3 | |
| with: | |
| auto-update-conda: true | |
| miniforge-version: latest | |
| activate-environment: build | |
| python-version: ${{ matrix.python-version }} | |
| - name: Install build dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install build wheel setuptools | |
| - name: Install PaddlePaddle nightly | |
| run: | | |
| pip install --pre paddlepaddle -i https://www.paddlepaddle.org.cn/packages/nightly/cpu/ | |
| - name: Run pre-build script | |
| run: | | |
| bash packaging/pre_build_script.sh | |
| - name: Build wheel | |
| run: | | |
| # Use pre-built FFmpeg from PyTorch S3 | |
| export BUILD_AGAINST_ALL_FFMPEG_FROM_S3=1 | |
| export TORCHCODEC_CMAKE_BUILD_DIR=$(pwd)/build_cmake | |
| python -m build --wheel -vvv --no-isolation | |
| - name: Repair wheel | |
| run: | | |
| pip install auditwheel | |
| # 1. Extract internal libraries from the wheel to a temporary directory | |
| # This allows auditwheel to find them when checking dependencies | |
| mkdir -p temp_libs | |
| unzip -j dist/*.whl "torchcodec/*.so" -d temp_libs || true | |
| # 2. Prepare LD_LIBRARY_PATH | |
| # FFmpeg libraries | |
| FFMPEG_LIB_PATHS=$(find $(pwd)/build_cmake/_deps -type d -name "lib" | tr '\n' ':') | |
| # PaddlePaddle libraries | |
| PADDLE_PATH=$(python -c "import paddle; print(paddle.__path__[0])") | |
| PADDLE_LIB_PATHS="$PADDLE_PATH/base:$PADDLE_PATH/libs" | |
| # Wheel internal libraries | |
| INTERNAL_LIB_PATH=$(pwd)/temp_libs | |
| export LD_LIBRARY_PATH=${FFMPEG_LIB_PATHS}${PADDLE_LIB_PATHS}:${INTERNAL_LIB_PATH}:${LD_LIBRARY_PATH} | |
| # 3. Repair wheel with auditwheel | |
| # We exclude all external libraries because we want to rely on system libraries (like FFmpeg) | |
| # or libraries provided by other packages (like PaddlePaddle). | |
| # auditwheel 6.1.0+ supports wildcards in --exclude. | |
| auditwheel repair dist/*.whl --plat manylinux_2_28_x86_64 -w wheelhouse/ --exclude "*" | |
| # Cleanup | |
| rm -rf temp_libs | |
| rm dist/*.whl | |
| mv wheelhouse/*.whl dist/ | |
| rmdir wheelhouse | |
| - name: Upload wheel artifact | |
| uses: actions/upload-artifact@v5 | |
| with: | |
| name: paddlecodec-wheel-linux-py${{ matrix.python-version }} | |
| path: dist/*.whl | |
| - name: Run post-build script | |
| run: | | |
| bash packaging/post_build_script.sh | |
| - name: List wheel contents | |
| run: | | |
| wheel_path=$(find dist -type f -name "*.whl") | |
| echo "Wheel path: $wheel_path" | |
| unzip -l $wheel_path | |
| test-paddlecodec-wheel: | |
| needs: build-paddlecodec-wheel | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] | |
| # FFmpeg 8.0 depends on libopenvino.so.2520, PaddlePaddle CPU depends on libopenvino.so.2500 | |
| # There has some conflict causing test failures, but it works with PaddlePaddle GPU. | |
| # We skip FFmpeg 8.0 tests for PaddlePaddle CPU builds for now. | |
| ffmpeg-version: ["4.4.2", "5.1.2", "6.1.1", "7.0.1"] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Download wheel artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: paddlecodec-wheel-linux-py${{ matrix.python-version }} | |
| path: dist/ | |
| - name: Install FFmpeg via conda | |
| uses: conda-incubator/setup-miniconda@v3 | |
| with: | |
| auto-update-conda: true | |
| miniforge-version: latest | |
| activate-environment: test | |
| python-version: ${{ matrix.python-version }} | |
| - name: Install FFmpeg from conda-forge | |
| run: | | |
| conda install "ffmpeg=${{ matrix.ffmpeg-version }}" -c conda-forge -y | |
| ffmpeg -version | |
| - name: Install PaddlePaddle nightly in conda env | |
| run: | | |
| pip install --pre paddlepaddle -i https://www.paddlepaddle.org.cn/packages/nightly/cpu/ | |
| - name: Install paddlecodec from wheel | |
| run: | | |
| wheel_path=$(find dist -type f -name "*.whl") | |
| echo "Installing $wheel_path" | |
| pip install $wheel_path -vvv | |
| - name: Install test dependencies | |
| run: | | |
| pip install numpy pytest pillow | |
| - name: Delete src folder | |
| run: | | |
| # Delete src/ to ensure we're testing the installed wheel, not source code | |
| rm -rf src/ | |
| ls -la | |
| - name: Run tests | |
| run: | | |
| pytest --override-ini="addopts=-v" -s test_paddle | |
| publish-pypi: | |
| runs-on: ubuntu-latest | |
| name: Publish to PyPI | |
| if: "startsWith(github.ref, 'refs/tags/')" | |
| needs: | |
| - test-paddlecodec-wheel | |
| permissions: | |
| id-token: write | |
| steps: | |
| - name: Retrieve release distributions | |
| uses: actions/download-artifact@v6 | |
| with: | |
| pattern: paddlecodec-wheel-linux-* | |
| path: dist/ | |
| merge-multiple: true | |
| - name: Publish release distributions to PyPI | |
| uses: pypa/gh-action-pypi-publish@release/v1 | |
| publish-release: | |
| runs-on: ubuntu-latest | |
| name: Publish to GitHub | |
| if: "startsWith(github.ref, 'refs/tags/')" | |
| needs: | |
| - test-paddlecodec-wheel | |
| permissions: | |
| contents: write | |
| steps: | |
| - uses: actions/download-artifact@v6 | |
| with: | |
| pattern: paddlecodec-wheel-linux-* | |
| path: dist/ | |
| merge-multiple: true | |
| - name: Get tag name | |
| run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV | |
| - name: Publish to GitHub | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| draft: true | |
| files: dist/* | |
| tag_name: ${{ env.RELEASE_VERSION }} |