From 910262005439402de84155b1e6304324103ce129 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Sat, 14 Feb 2026 16:46:28 +0200 Subject: [PATCH 1/4] Cache libavif and webp builds --- .ci/install.sh | 2 +- .github/workflows/docs.yml | 16 +++++ .github/workflows/test.yml | 18 +++++ depends/install_libavif.sh | 140 ++++++++++++++++++++++--------------- depends/install_webp.sh | 31 ++++++-- 5 files changed, 146 insertions(+), 61 deletions(-) diff --git a/.ci/install.sh b/.ci/install.sh index aeb5e65145d..9553eb8f442 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -53,7 +53,7 @@ pushd depends && ./install_imagequant.sh && popd pushd depends && sudo ./install_raqm.sh && popd # libavif -pushd depends && sudo ./install_libavif.sh && popd +pushd depends && ./install_libavif.sh && popd # extra test images pushd depends && ./install_extra_test_images.sh && popd diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 44af3e3dfdb..857881c0102 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -48,6 +48,13 @@ jobs: - name: Build system information run: python3 .github/workflows/system-info.py + - name: Cache libavif + uses: actions/cache@v5 + id: cache-libavif + with: + path: ~/cache-libavif + key: ${{ runner.os }}-libavif-${{ hashFiles('depends/install_libavif.sh', 'depends/libavif-svt4.patch') }} + - name: Cache libimagequant uses: actions/cache@v5 id: cache-libimagequant @@ -55,12 +62,21 @@ jobs: path: ~/cache-libimagequant key: ${{ runner.os }}-libimagequant-${{ hashFiles('depends/install_imagequant.sh') }} + - name: Cache libwebp + uses: actions/cache@v5 + id: cache-libwebp + with: + path: ~/cache-libwebp + key: ${{ runner.os }}-libwebp-${{ hashFiles('depends/install_webp.sh') }} + - name: Install Linux dependencies run: | .ci/install.sh env: GHA_PYTHON_VERSION: "3.x" + GHA_LIBAVIF_CACHE_HIT: ${{ steps.cache-libavif.outputs.cache-hit }} GHA_LIBIMAGEQUANT_CACHE_HIT: ${{ steps.cache-libimagequant.outputs.cache-hit }} + GHA_LIBWEBP_CACHE_HIT: ${{ steps.cache-libwebp.outputs.cache-hit }} - name: Build run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 103d915c047..7d0af9d9e9f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -90,6 +90,14 @@ jobs: - name: Build system information run: python3 .github/workflows/system-info.py + - name: Cache libavif + if: startsWith(matrix.os, 'ubuntu') + uses: actions/cache@v5 + id: cache-libavif + with: + path: ~/cache-libavif + key: ${{ runner.os }}-libavif-${{ hashFiles('depends/install_libavif.sh', 'depends/libavif-svt4.patch') }} + - name: Cache libimagequant if: startsWith(matrix.os, 'ubuntu') uses: actions/cache@v5 @@ -98,13 +106,23 @@ jobs: path: ~/cache-libimagequant key: ${{ runner.os }}-libimagequant-${{ hashFiles('depends/install_imagequant.sh') }} + - name: Cache libwebp + if: startsWith(matrix.os, 'ubuntu') + uses: actions/cache@v5 + id: cache-libwebp + with: + path: ~/cache-libwebp + key: ${{ runner.os }}-libwebp-${{ hashFiles('depends/install_webp.sh') }} + - name: Install Linux dependencies if: startsWith(matrix.os, 'ubuntu') run: | .ci/install.sh env: GHA_PYTHON_VERSION: ${{ matrix.python-version }} + GHA_LIBAVIF_CACHE_HIT: ${{ steps.cache-libavif.outputs.cache-hit }} GHA_LIBIMAGEQUANT_CACHE_HIT: ${{ steps.cache-libimagequant.outputs.cache-hit }} + GHA_LIBWEBP_CACHE_HIT: ${{ steps.cache-libwebp.outputs.cache-hit }} - name: Install macOS dependencies if: startsWith(matrix.os, 'macOS') diff --git a/depends/install_libavif.sh b/depends/install_libavif.sh index a6686f3ef3a..181c1aad965 100755 --- a/depends/install_libavif.sh +++ b/depends/install_libavif.sh @@ -3,66 +3,94 @@ set -eo pipefail version=1.3.0 -./download-and-extract.sh libavif-$version https://github.com/AOMediaCodec/libavif/archive/refs/tags/v$version.tar.gz +if [[ "$GHA_LIBAVIF_CACHE_HIT" == "true" ]]; then -pushd libavif-$version + LIBDIR=/usr/lib/x86_64-linux-gnu -# Apply patch for SVT-AV1 4.0 compatibility -# Pending release of https://github.com/AOMediaCodec/libavif/pull/2971 -patch -p1 < ../libavif-svt4.patch + # Copy cached files into place + sudo cp ~/cache-libavif/lib/* $LIBDIR/ + sudo cp -r ~/cache-libavif/include/avif /usr/include/ + sudo cp ~/cache-libavif/pkgconfig/* $LIBDIR/pkgconfig/ + sudo cp -r ~/cache-libavif/cmake/libavif $LIBDIR/cmake/ -if [ $(uname) == "Darwin" ] && [ -x "$(command -v brew)" ]; then - PREFIX=$(brew --prefix) else - PREFIX=/usr -fi - -PKGCONFIG=${PKGCONFIG:-pkg-config} - -LIBAVIF_CMAKE_FLAGS=() -HAS_DECODER=0 -HAS_ENCODER=0 - -if $PKGCONFIG --exists aom; then - LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_AOM=SYSTEM) - HAS_ENCODER=1 - HAS_DECODER=1 -fi - -if $PKGCONFIG --exists dav1d; then - LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_DAV1D=SYSTEM) - HAS_DECODER=1 -fi -if $PKGCONFIG --exists libgav1; then - LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_LIBGAV1=SYSTEM) - HAS_DECODER=1 -fi + ./download-and-extract.sh libavif-$version https://github.com/AOMediaCodec/libavif/archive/refs/tags/v$version.tar.gz + + pushd libavif-$version + + # Apply patch for SVT-AV1 4.0 compatibility + # Pending release of https://github.com/AOMediaCodec/libavif/pull/2971 + patch -p1 < ../libavif-svt4.patch + + if [ $(uname) == "Darwin" ] && [ -x "$(command -v brew)" ]; then + PREFIX=$(brew --prefix) + else + PREFIX=/usr + fi + + PKGCONFIG=${PKGCONFIG:-pkg-config} + + LIBAVIF_CMAKE_FLAGS=() + HAS_DECODER=0 + HAS_ENCODER=0 + + if $PKGCONFIG --exists aom; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_AOM=SYSTEM) + HAS_ENCODER=1 + HAS_DECODER=1 + fi + + if $PKGCONFIG --exists dav1d; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_DAV1D=SYSTEM) + HAS_DECODER=1 + fi + + if $PKGCONFIG --exists libgav1; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_LIBGAV1=SYSTEM) + HAS_DECODER=1 + fi + + if $PKGCONFIG --exists rav1e; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_RAV1E=SYSTEM) + HAS_ENCODER=1 + fi + + if $PKGCONFIG --exists SvtAv1Enc; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_SVT=SYSTEM) + HAS_ENCODER=1 + fi + + if [ "$HAS_ENCODER" != 1 ] || [ "$HAS_DECODER" != 1 ]; then + LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_AOM=LOCAL) + fi + + cmake \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DCMAKE_INSTALL_NAME_DIR=$PREFIX/lib \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_MACOSX_RPATH=OFF \ + -DAVIF_LIBSHARPYUV=LOCAL \ + -DAVIF_LIBYUV=LOCAL \ + "${LIBAVIF_CMAKE_FLAGS[@]}" \ + . + + sudo make install + + if [ -n "$GITHUB_ACTIONS" ] && [ "$(uname)" != "Darwin" ]; then + # Copy to cache + LIBDIR=/usr/lib/x86_64-linux-gnu + rm -rf ~/cache-libavif + mkdir -p ~/cache-libavif/lib + mkdir -p ~/cache-libavif/include + mkdir -p ~/cache-libavif/pkgconfig + mkdir -p ~/cache-libavif/cmake + cp $LIBDIR/libavif.so* ~/cache-libavif/lib/ + cp -r /usr/include/avif ~/cache-libavif/include/ + cp $LIBDIR/pkgconfig/libavif.pc ~/cache-libavif/pkgconfig/ + cp -r $LIBDIR/cmake/libavif ~/cache-libavif/cmake/ + fi + + popd -if $PKGCONFIG --exists rav1e; then - LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_RAV1E=SYSTEM) - HAS_ENCODER=1 fi - -if $PKGCONFIG --exists SvtAv1Enc; then - LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_SVT=SYSTEM) - HAS_ENCODER=1 -fi - -if [ "$HAS_ENCODER" != 1 ] || [ "$HAS_DECODER" != 1 ]; then - LIBAVIF_CMAKE_FLAGS+=(-DAVIF_CODEC_AOM=LOCAL) -fi - -cmake \ - -DCMAKE_INSTALL_PREFIX=$PREFIX \ - -DCMAKE_INSTALL_NAME_DIR=$PREFIX/lib \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_MACOSX_RPATH=OFF \ - -DAVIF_LIBSHARPYUV=LOCAL \ - -DAVIF_LIBYUV=LOCAL \ - "${LIBAVIF_CMAKE_FLAGS[@]}" \ - . - -make install - -popd diff --git a/depends/install_webp.sh b/depends/install_webp.sh index d7f3cd2f5d0..80442b797ff 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -3,10 +3,33 @@ archive=libwebp-1.6.0 -./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/main/$archive.tar.gz +if [[ "$GHA_LIBWEBP_CACHE_HIT" == "true" ]]; then -pushd $archive + # Copy cached files into place + sudo cp ~/cache-libwebp/lib/* /usr/lib/ + sudo cp -r ~/cache-libwebp/include/webp /usr/include/ + sudo cp ~/cache-libwebp/pkgconfig/* /usr/lib/pkgconfig/ -./configure --prefix=/usr --enable-libwebpmux --enable-libwebpdemux && make -j4 && sudo make -j4 install +else -popd + ./download-and-extract.sh $archive https://raw.githubusercontent.com/python-pillow/pillow-depends/main/$archive.tar.gz + + pushd $archive + + ./configure --prefix=/usr --enable-libwebpmux --enable-libwebpdemux && make -j4 && sudo make -j4 install + + if [ -n "$GITHUB_ACTIONS" ]; then + # Copy to cache + rm -rf ~/cache-libwebp + mkdir -p ~/cache-libwebp/lib + mkdir -p ~/cache-libwebp/include + mkdir -p ~/cache-libwebp/pkgconfig + cp /usr/lib/libwebp*.so* /usr/lib/libwebp*.a ~/cache-libwebp/lib/ + cp /usr/lib/libsharpyuv*.so* /usr/lib/libsharpyuv*.a ~/cache-libwebp/lib/ + cp -r /usr/include/webp ~/cache-libwebp/include/ + cp /usr/lib/pkgconfig/libwebp*.pc /usr/lib/pkgconfig/libsharpyuv.pc ~/cache-libwebp/pkgconfig/ + fi + + popd + +fi From aa9036865e977303220a3155a7ec885b0318f660 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Mon, 16 Feb 2026 18:38:40 +1100 Subject: [PATCH 2/4] Do not copy pkgconfig or cmake (#147) Co-authored-by: Andrew Murray --- depends/install_libavif.sh | 6 ------ depends/install_webp.sh | 2 -- 2 files changed, 8 deletions(-) diff --git a/depends/install_libavif.sh b/depends/install_libavif.sh index 181c1aad965..0089bf2b5fd 100755 --- a/depends/install_libavif.sh +++ b/depends/install_libavif.sh @@ -10,8 +10,6 @@ if [[ "$GHA_LIBAVIF_CACHE_HIT" == "true" ]]; then # Copy cached files into place sudo cp ~/cache-libavif/lib/* $LIBDIR/ sudo cp -r ~/cache-libavif/include/avif /usr/include/ - sudo cp ~/cache-libavif/pkgconfig/* $LIBDIR/pkgconfig/ - sudo cp -r ~/cache-libavif/cmake/libavif $LIBDIR/cmake/ else @@ -83,12 +81,8 @@ else rm -rf ~/cache-libavif mkdir -p ~/cache-libavif/lib mkdir -p ~/cache-libavif/include - mkdir -p ~/cache-libavif/pkgconfig - mkdir -p ~/cache-libavif/cmake cp $LIBDIR/libavif.so* ~/cache-libavif/lib/ cp -r /usr/include/avif ~/cache-libavif/include/ - cp $LIBDIR/pkgconfig/libavif.pc ~/cache-libavif/pkgconfig/ - cp -r $LIBDIR/cmake/libavif ~/cache-libavif/cmake/ fi popd diff --git a/depends/install_webp.sh b/depends/install_webp.sh index 80442b797ff..0b064ca39e4 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -8,7 +8,6 @@ if [[ "$GHA_LIBWEBP_CACHE_HIT" == "true" ]]; then # Copy cached files into place sudo cp ~/cache-libwebp/lib/* /usr/lib/ sudo cp -r ~/cache-libwebp/include/webp /usr/include/ - sudo cp ~/cache-libwebp/pkgconfig/* /usr/lib/pkgconfig/ else @@ -27,7 +26,6 @@ else cp /usr/lib/libwebp*.so* /usr/lib/libwebp*.a ~/cache-libwebp/lib/ cp /usr/lib/libsharpyuv*.so* /usr/lib/libsharpyuv*.a ~/cache-libwebp/lib/ cp -r /usr/include/webp ~/cache-libwebp/include/ - cp /usr/lib/pkgconfig/libwebp*.pc /usr/lib/pkgconfig/libsharpyuv.pc ~/cache-libwebp/pkgconfig/ fi popd From de6f6b87011915649473904b59fed620f8326a1f Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 16 Feb 2026 11:21:03 +0200 Subject: [PATCH 3/4] Clean up caching Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- depends/install_webp.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/install_webp.sh b/depends/install_webp.sh index 0b064ca39e4..1f1ea645141 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -24,7 +24,7 @@ else mkdir -p ~/cache-libwebp/include mkdir -p ~/cache-libwebp/pkgconfig cp /usr/lib/libwebp*.so* /usr/lib/libwebp*.a ~/cache-libwebp/lib/ - cp /usr/lib/libsharpyuv*.so* /usr/lib/libsharpyuv*.a ~/cache-libwebp/lib/ + cp /usr/lib/libsharpyuv.so* /usr/lib/libsharpyuv.a ~/cache-libwebp/lib/ cp -r /usr/include/webp ~/cache-libwebp/include/ fi From 96225428aa065bfdbc1273bd13fbcf61f8cfd761 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 16 Feb 2026 11:22:24 +0200 Subject: [PATCH 4/4] Clean up caching Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- depends/install_webp.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/depends/install_webp.sh b/depends/install_webp.sh index 1f1ea645141..c328fe2c86a 100755 --- a/depends/install_webp.sh +++ b/depends/install_webp.sh @@ -22,7 +22,6 @@ else rm -rf ~/cache-libwebp mkdir -p ~/cache-libwebp/lib mkdir -p ~/cache-libwebp/include - mkdir -p ~/cache-libwebp/pkgconfig cp /usr/lib/libwebp*.so* /usr/lib/libwebp*.a ~/cache-libwebp/lib/ cp /usr/lib/libsharpyuv.so* /usr/lib/libsharpyuv.a ~/cache-libwebp/lib/ cp -r /usr/include/webp ~/cache-libwebp/include/