Add python wheel build pipeline (#123) #1
Workflow file for this run
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 Wheel | |
| on: [push, pull_request, workflow_dispatch] | |
| env: | |
| dav1d_version: "1.5.3" | |
| libxml2_version: "v2.15.3" | |
| nv_version: "n13.0.19.0" | |
| libmfx_version: "master" | |
| libvpx_version: "v1.16.0" | |
| glslang_version: "16.3.0" | |
| BUILD_COMMANDS: | | |
| set -e | |
| JOBS=$(nproc 2>/dev/null || sysctl -n hw.logicalcpu || echo 2) | |
| REPO_ROOT=$(pwd) | |
| # Patch obuparse MinGW-w64 (UCRT64) | |
| if [[ "$PREFIX" == "/ucrt64" ]]; then | |
| sed -i 's|#define off_t __int64|// #define off_t __int64|g' obuparse/tools/obudump.c | |
| sed -i 's|#define fseeko _fseeki64|// #define fseeko _fseeki64|g' obuparse/tools/obudump.c | |
| sed -i 's|#define ftello _fseeki64|// #define ftello _fseeki64|g' obuparse/tools/obudump.c | |
| fi | |
| # dav1d | |
| wget "https://code.videolan.org/videolan/dav1d/-/archive/$dav1d_version/dav1d-$dav1d_version.tar.bz2" -O - | tar xfvj - | |
| cd dav1d-"$dav1d_version" | |
| meson setup build -Dprefix="$PREFIX" -Denable_tools=false -Denable_examples=false -Denable_tests=false --default-library=static --buildtype=release --strip | |
| meson compile -C build | |
| $SUDO meson install -C build | |
| cd .. && rm -rf dav1d-"$dav1d_version" | |
| # mfx_dispatch build (Linux/Windows only) | |
| if [[ "$EXTRA_FFMPEG_FLAGS" == *"--enable-libmfx"* ]]; then | |
| git clone -b "$libmfx_version" --depth 1 https://github.com/lu-zero/mfx_dispatch | |
| cd mfx_dispatch | |
| autoreconf -i | |
| CPPFLAGS="-O2 -s -pipe" ./configure --prefix="$PREFIX" | |
| make -j$(nproc) | |
| $SUDO make -j "$JOBS" install | |
| cd .. && rm -rf mfx_dispatch | |
| fi | |
| # nv-codec-headers (Linux/Windows only) | |
| if [[ "$EXTRA_FFMPEG_FLAGS" == *"--enable-nvdec"* ]]; then | |
| git clone -b "$nv_version" --depth 1 https://git.videolan.org/git/ffmpeg/nv-codec-headers | |
| cd nv-codec-headers | |
| $SUDO make install PREFIX="$PREFIX" | |
| cd .. && rm -rf nv-codec-headers | |
| fi | |
| # libxml2 | |
| git clone -b "$libxml2_version" --depth 1 https://github.com/gnome/libxml2 | |
| cd libxml2 | |
| cmake -B build -G Ninja -DLIBXML2_WITH_TESTS=OFF -DLIBXML2_WITH_HTTP=OFF -DLIBXML2_WITH_FTP=OFF -DLIBXML2_WITH_HTML=ON -DLIBXML2_WITH_C14N=ON -DLIBXML2_WITH_CATALOG=OFF -DLIBXML2_WITH_DEBUG=OFF -DLIBXML2_WITH_DOCB=ON -DLIBXML2_WITH_ICONV=OFF -DLIBXML2_WITH_ISO8859X=ON -DLIBXML2_WITH_ZLIB=ON -DLIBXML2_WITH_ICU=OFF -DLIBXML2_WITH_LZMA=OFF -DLIBXML2_WITH_LEGACY=ON -DLIBXML2_WITH_MEM_DEBUG=OFF -DLIBXML2_WITH_MODULES=ON -DLIBXML2_WITH_OUTPUT=ON -DLIBXML2_WITH_PATTERN=ON -DLIBXML2_WITH_PUSH=ON -DLIBXML2_WITH_PYTHON=OFF -DLIBXML2_WITH_READER=ON -DLIBXML2_WITH_REGEXPS=ON -DLIBXML2_WITH_RUN_DEBUG=OFF -DLIBXML2_WITH_SAX1=ON -DLIBXML2_WITH_SCHEMAS=ON -DLIBXML2_WITH_SCHEMATRON=ON -DLIBXML2_WITH_THREADS=ON -DLIBXML2_WITH_THREAD_ALLOC=OFF -DLIBXML2_WITH_TREE=ON -DLIBXML2_WITH_VALID=ON -DLIBXML2_WITH_WRITER=ON -DLIBXML2_WITH_XINCLUDE=ON -DLIBXML2_WITH_XPATH=ON -DLIBXML2_WITH_XPTR=ON -DCMAKE_C_FLAGS_RELEASE="-DIN_LIBXML" -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="$PREFIX" -DCMAKE_INSTALL_PREFIX="$PREFIX" -D BUILD_SHARED_LIBS=OFF -DLIBXML2_WITH_PROGRAMS=OFF -DCMAKE_CL_SHOWINCLUDES_PREFIX="Note: including file:" | |
| ninja -C build | |
| $SUDO ninja -C build install | |
| cd .. && rm -rf libxml2 | |
| # libvpx | |
| git clone -b "$libvpx_version" --depth 1 https://github.com/webmproject/libvpx | |
| cd libvpx | |
| VPX_TARGET="" | |
| if [[ "$PREFIX" == "/ucrt64" ]]; then | |
| VPX_TARGET="--target=x86_64-win64-gcc" | |
| fi | |
| ./configure --prefix="$PREFIX" $VPX_TARGET --disable-examples --disable-tools --disable-docs --disable-unit-tests --enable-vp9-highbitdepth --disable-debug-libs --disable-shared --as=nasm --enable-runtime-cpu-detect --disable-debug --disable-vp8 --disable-vp9-encoder --disable-postproc --disable-webm-io --disable-libyuv | |
| make -j "$JOBS" | |
| $SUDO make -j "$JOBS" install | |
| cd .. && rm -rf libvpx | |
| # glslang | |
| git clone -b "$glslang_version" --depth 1 https://github.com/KhronosGroup/glslang | |
| cd glslang | |
| python3 ./update_glslang_sources.py | |
| cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$PREFIX" -DBUILD_SHARED_LIBS=OFF -DENABLE_OPT=OFF -DENABLE_HLSL=OFF -DENABLE_SPIRV=ON -DENABLE_GLSLANG_BINARIES=ON -DGLSLANG_TESTS=OFF | |
| ninja -C build | |
| $SUDO ninja -C build install | |
| cd .. && rm -rf glslang | |
| # FFmpeg | |
| cd $REPO_ROOT/FFmpeg | |
| ./configure --prefix="$PREFIX" --disable-muxers --disable-avdevice --disable-encoders --disable-filters --disable-devices --disable-network --enable-libdav1d --enable-zlib --enable-libxml2 --enable-libvpx --disable-programs --disable-doc --disable-debug --enable-gpl --enable-pic --disable-nvenc --enable-hwaccel=ffv1_vulkan --disable-bzlib --disable-iconv --disable-lzma --extra-cflags="-fPIC" --extra-ldflags="-fPIC" $EXTRA_FFMPEG_FLAGS || { | |
| echo "=====================================================================" | |
| echo "❌ FFmpeg configure FAILED! Dumping ffbuild/config.log..." | |
| echo "=====================================================================" | |
| cat ffbuild/config.log | |
| echo "=====================================================================" | |
| exit 1 | |
| } | |
| make -j "$JOBS" | |
| $SUDO make -j "$JOBS" install | |
| cd .. | |
| jobs: | |
| build-non-windows-wheel: | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| arch: linux_x86_64 | |
| - os: ubuntu-24.04-arm | |
| arch: linux_aarch64 | |
| - os: macos-15-intel | |
| arch: macosx_x86_64 | |
| - os: macos-15 | |
| arch: macosx_arm64 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v7 | |
| with: | |
| fetch-depth: 0 | |
| submodules: true | |
| - uses: pypa/cibuildwheel@v4.1.0 | |
| env: | |
| CIBW_BUILD: cp314-* | |
| CIBW_BUILD_FRONTEND: uv | |
| CIBW_ENVIRONMENT: > | |
| dav1d_version=${{ env.dav1d_version }} | |
| libxml2_version=${{ env.libxml2_version }} | |
| nv_version=${{ env.nv_version }} | |
| libmfx_version=${{ env.libmfx_version }} | |
| libvpx_version=${{ env.libvpx_version }} | |
| glslang_version=${{ env.glslang_version }} | |
| PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib64/pkgconfig | |
| CMAKE_ARGS="-DZLIB_USE_STATIC_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_C_FLAGS=-fPIC -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_MODULE_LINKER_FLAGS=-Wl,-Bsymbolic" | |
| CIBW_ENVIRONMENT_MACOS: > | |
| MACOSX_DEPLOYMENT_TARGET=15 | |
| CMAKE_ARGS="-DZLIB_USE_STATIC_LIBS=OFF" | |
| CIBW_BEFORE_ALL_LINUX: | | |
| set -e | |
| if command -v dnf >/dev/null 2>&1; then | |
| dnf install -y epel-release dnf-plugins-core | |
| dnf -y install wget curl git make gcc gcc-c++ cmake ninja-build nasm zlib-devel pkgconf-pkg-config diffutils python3-pip vulkan-headers vulkan-loader-devel autoconf automake libtool | |
| else | |
| apk add --no-cache wget curl git make gcc g++ cmake ninja nasm zlib-dev pkgconfig diffutils python3 py3-pip vulkan-headers vulkan-loader-dev autoconf automake libtool make | |
| fi && | |
| pip3 install meson | |
| ARCH=$(uname -m) | |
| if [[ "$ARCH" == "x86_64" ]]; then | |
| export PREFIX=/usr SUDO="" EXTRA_FFMPEG_FLAGS="--enable-cuvid --enable-nvdec --enable-libmfx" | |
| else | |
| export PREFIX=/usr SUDO="" EXTRA_FFMPEG_FLAGS="--enable-cuvid --enable-nvdec" | |
| fi | |
| ${{ env.BUILD_COMMANDS }} | |
| CIBW_BEFORE_ALL_MACOS: | | |
| brew install cmake meson nasm ninja pkg-config zlib wget vulkan-headers vulkan-loader autoconf automake libtool | |
| export PREFIX=/usr/local SUDO="sudo" EXTRA_FFMPEG_FLAGS="--disable-videotoolbox --disable-audiotoolbox" | |
| ${{ env.BUILD_COMMANDS }} | |
| with: | |
| output-dir: dist | |
| extras: uv | |
| - uses: actions/upload-artifact@v7.0.1 | |
| with: | |
| name: lsmashsource-${{ matrix.arch }} | |
| path: dist | |
| build-windows-wheel: | |
| runs-on: windows-latest | |
| defaults: | |
| run: | |
| shell: msys2 {0} | |
| steps: | |
| - uses: actions/checkout@v7 | |
| with: | |
| fetch-depth: 0 | |
| submodules: true | |
| - uses: msys2/setup-msys2@v2.32.0 | |
| with: | |
| msystem: UCRT64 | |
| update: true | |
| install: >- | |
| mingw-w64-ucrt-x86_64-cmake | |
| mingw-w64-ucrt-x86_64-gcc | |
| mingw-w64-ucrt-x86_64-meson | |
| mingw-w64-ucrt-x86_64-ninja | |
| mingw-w64-ucrt-x86_64-nasm | |
| mingw-w64-ucrt-x86_64-pkgconf | |
| mingw-w64-ucrt-x86_64-zlib | |
| mingw-w64-ucrt-x86_64-vulkan-headers | |
| mingw-w64-ucrt-x86_64-vulkan-loader | |
| mingw-w64-ucrt-x86_64-glslang | |
| mingw-w64-ucrt-x86_64-autotools | |
| mingw-w64-ucrt-x86_64-python | |
| mingw-w64-ucrt-x86_64-python-pip | |
| mingw-w64-ucrt-x86_64-python-wheel | |
| git | |
| make | |
| wget | |
| diffutils | |
| - name: Build Dependencies and Plugin | |
| run: | | |
| export PREFIX=/ucrt64 SUDO="" EXTRA_FFMPEG_FLAGS="--enable-cuvid --enable-nvdec --enable-libmfx --enable-w32threads --pkg-config-flags=-static" | |
| ${{ env.BUILD_COMMANDS }} | |
| python -m pip install build scikit-build-core --break-system-packages | |
| export LDFLAGS="-static-libgcc -static-libstdc++ -static" | |
| python -m build --wheel --outdir dist | |
| python -m wheel tags --platform-tag=win_amd64 --remove dist/*.whl | |
| - uses: actions/upload-artifact@v7.0.1 | |
| with: | |
| name: lsmashsource-sdist | |
| path: dist/*.tar.gz | |
| - uses: actions/upload-artifact@v7.0.1 | |
| with: | |
| name: lsmashsource-win_amd64 | |
| path: dist/*.whl |