From 3ec7ac6fbea0e3140611df81c498a25ad8376154 Mon Sep 17 00:00:00 2001 From: Ivan Avdeev Date: Thu, 31 Jul 2025 14:25:30 +0300 Subject: [PATCH 01/14] Create Dockerfile_x86_64 --- docker/musllinux/Dockerfile_x86_64 | 160 +++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 docker/musllinux/Dockerfile_x86_64 diff --git a/docker/musllinux/Dockerfile_x86_64 b/docker/musllinux/Dockerfile_x86_64 new file mode 100644 index 00000000..aba27d0f --- /dev/null +++ b/docker/musllinux/Dockerfile_x86_64 @@ -0,0 +1,160 @@ +# +FROM quay.io/pypa/musllinux_1_2_x86_64:latest + +ARG CCACHE_VERSION=3.7.9 +ARG FFMPEG_VERSION=6.1.1 +ARG FREETYPE_VERSION=2.13.3 +ARG LIBPNG_VERSION=1.6.48 +ARG VPX_VERSION=v1.15.1 +ARG NASM_VERSION=2.15.04 +ARG OPENSSL_VERSION=1_1_1w +ARG YASM_VERSION=1.3.0 +ARG AOM_VERSION=v3.12.1 +ARG AVIF_VERSION=v1.3.0 + +ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH + +RUN apk add --no-cache \ + build-base \ + diffutils \ + cmake \ + bash \ + git \ + curl \ + wget \ + tar \ + xz \ + zlib-dev \ + xz-dev \ + nasm \ + yasm \ + pkgconfig \ + openssl-dev \ + libjpeg-turbo-dev \ + fontconfig-dev \ + freetype-dev \ + expat-dev \ + libpng-dev \ + alsa-lib-dev \ + musl-dev \ + ttf-dejavu \ + linux-headers \ + perl + +RUN apk del libpng-dev + +### libpng +RUN mkdir ~/libpng_sources && \ + cd ~/libpng_sources && \ + curl -O -L https://download.sourceforge.net/libpng/libpng-${LIBPNG_VERSION}.tar.gz && \ + tar -xf libpng-${LIBPNG_VERSION}.tar.gz && \ + cd libpng-${LIBPNG_VERSION} && \ + ./configure --prefix=/usr/local && \ + make && \ + make install && \ + cd .. && \ + rm -rf ~/libpng_sources + +### freetype +RUN mkdir ~/freetype_sources && \ + cd ~/freetype_sources && \ + curl -O -L https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \ + tar -xf freetype-${FREETYPE_VERSION}.tar.gz && \ + cd freetype-${FREETYPE_VERSION} && \ + ./configure --prefix="/ffmpeg_build" --enable-freetype-config && \ + make && \ + make install && \ + cd .. && \ + rm -rf ~/freetype_sources + +### OpenSSL +RUN mkdir ~/openssl_sources && \ + cd ~/openssl_sources && \ + curl -O -L https://github.com/openssl/openssl/archive/OpenSSL_${OPENSSL_VERSION}.tar.gz && \ + tar -xf OpenSSL_${OPENSSL_VERSION}.tar.gz && \ + cd openssl-OpenSSL_${OPENSSL_VERSION} && \ + ./config --prefix="/ffmpeg_build" --openssldir="/ffmpeg_build" no-pinshared shared zlib && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install_sw && \ + cd .. && \ + rm -rf ~/openssl_build ~/openssl_sources + +### libvpx +RUN mkdir ~/libvpx_sources && \ + cd ~/libvpx_sources && \ + git clone --depth 1 -b ${VPX_VERSION} https://chromium.googlesource.com/webm/libvpx.git && \ + cd libvpx && \ + ./configure --prefix="/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm --enable-pic --enable-shared && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd .. && \ + rm -rf ~/libvpx_sources + + +### aom +RUN mkdir -p /tmp/aom_sources && \ + cd /tmp/aom_sources && \ + git clone --depth 1 -b ${AOM_VERSION} https://aomedia.googlesource.com/aom && \ + mkdir build && cd build && \ + cmake \ + -DCMAKE_C_COMPILER=$(dirname $(which g++))/gcc \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_SHARED_LIBS=ON \ + -DENABLE_TESTS=OFF \ + -DENABLE_EXAMPLES=OFF \ + ../aom && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install +### avif +RUN mkdir ~/avif_sources && \ + cd ~/avif_sources && \ + git clone -b ${AVIF_VERSION} https://github.com/AOMediaCodec/libavif.git && \ + mkdir build && cd build && \ + cmake -DCMAKE_INSTALL_PREFIX=/usr -DAVIF_CODEC_AOM=SYSTEM -DAVIF_LIBYUV=LOCAL -DAVIF_BUILD_APPS=OFF ../libavif && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd .. && \ + rm -rf ~/avif_sources + +### ffmpeg +RUN mkdir -p /ffmpeg_sources && \ + cd /ffmpeg_sources && \ + curl -LO https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz && \ + tar -xf ffmpeg-${FFMPEG_VERSION}.tar.gz && \ + cd ffmpeg-${FFMPEG_VERSION} && \ + PKG_CONFIG_PATH="/ffmpeg_build/lib/pkgconfig" ./configure \ + --prefix="/ffmpeg_build" \ + --extra-cflags="-I/ffmpeg_build/include" \ + --extra-ldflags="-L/ffmpeg_build/lib" \ + --enable-openssl \ + --enable-libvpx \ + --enable-shared \ + --enable-pic \ + --disable-indev=v4l2 \ + --disable-outdev=v4l2 && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + rm -rf /ffmpeg_sources + +### ccache +RUN curl -O -L https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}.tar.gz && \ + tar -xf ccache-${CCACHE_VERSION}.tar.gz && \ + cd ccache-${CCACHE_VERSION} && \ + ./configure && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd .. && \ + rm -rf ccache-${CCACHE_VERSION}.tar.gz + +# user`s UID is 1001 +RUN adduser -D -u 1001 ci && mkdir /io && chown ci:ci /io && \ + chown -R ci:ci /ffmpeg_build + +USER ci + +RUN git config --global --add safe.directory /io +ENV PATH="/ffmpeg_build/bin:$PATH" +ENV PKG_CONFIG_PATH /usr/local/lib/pkgconfig:/ffmpeg_build/lib/pkgconfig +ENV LDFLAGS -L/ffmpeg_build/lib +ENV PATH "$HOME/bin:$PATH" +ENV LD_LIBRARY_PATH="/ffmpeg_build/lib:$LD_LIBRARY_PATH" From 7bd1825cef8d82d86bc2f3f62055a64dc7a1a370 Mon Sep 17 00:00:00 2001 From: Brett Date: Thu, 11 Sep 2025 12:01:21 -0400 Subject: [PATCH 02/14] allow numpy>2 --- setup.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 7c470824..eea13434 100755 --- a/setup.py +++ b/setup.py @@ -22,11 +22,9 @@ def main(): build_java = "ON" if get_build_env_var_by_name("java") else "OFF" build_rolling = get_build_env_var_by_name("rolling") - # NOTE: since 2.3.0 numpy upgraded from manylinux2014 to manylinux_2_28 - # see https://numpy.org/doc/stable/release/2.3.0-notes.html#numpy-2-3-0-release-notes install_requires = [ 'numpy<2.0; python_version<"3.9"', - 'numpy(>=2, <2.3.0); python_version>="3.9"', + 'numpy>=2; python_version>="3.9"', ] python_version = cmaker.CMaker.get_python_version() From 18249e5812176bb4e2583943d9eb3e74bf6cddd2 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov <2536374+asmorkalov@users.noreply.github.com> Date: Mon, 8 Dec 2025 11:41:37 +0300 Subject: [PATCH 03/14] New manylinux_2_28 based invironment (#1148) * New manylinux_2_28 based invironment. * Fixed typo. --- docker/manylinux_2_28/Dockerfile_aarch64 | 114 +++++++++++++++++++++++ docker/manylinux_2_28/Dockerfile_x86_64 | 114 +++++++++++++++++++++++ 2 files changed, 228 insertions(+) create mode 100644 docker/manylinux_2_28/Dockerfile_aarch64 create mode 100644 docker/manylinux_2_28/Dockerfile_x86_64 diff --git a/docker/manylinux_2_28/Dockerfile_aarch64 b/docker/manylinux_2_28/Dockerfile_aarch64 new file mode 100644 index 00000000..e1241d99 --- /dev/null +++ b/docker/manylinux_2_28/Dockerfile_aarch64 @@ -0,0 +1,114 @@ +# Version: 20251013 +# Image name: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64 + +FROM quay.io/pypa/manylinux_2_28_aarch64:latest + +ARG FFMPEG_VERSION=5.1.6 +ARG FREETYPE_VERSION=2.13.3 +ARG LIBPNG_VERSION=1.6.48 +ARG VPX_VERSION=v1.15.1 +ARG QT_VERSION=5.15.16 +ARG AOM_VERSION=v3.12.1 +ARG AVIF_VERSION=v1.3.0 + +ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH + +# epel-release need for aarch64 to get openblas packages +RUN yum install zlib-devel curl-devel xcb-util-renderutil-devel xcb-util-devel xcb-util-image-devel xcb-util-keysyms-devel xcb-util-wm-devel mesa-libGL-devel libxkbcommon-devel libxkbcommon-x11-devel libXi-devel lapack-devel epel-release -y && \ + yum install openblas-devel dejavu-sans-fonts ccache yasm nasm ninja-build openssl openssl-devel -y && \ + # libpng will be built from source + yum remove libpng -y + +RUN mkdir ~/libpng_sources && \ + cd ~/libpng_sources && \ + curl -O -L https://download.sourceforge.net/libpng/libpng-${LIBPNG_VERSION}.tar.gz && \ + tar -xf libpng-${LIBPNG_VERSION}.tar.gz && \ + cd libpng-${LIBPNG_VERSION} && \ + ./configure --prefix=/usr/local && \ + make && \ + make install && \ + cd .. && \ + rm -rf ~/libpng_sources + +RUN mkdir ~/freetype_sources && \ + cd ~/freetype_sources && \ + curl -O -L https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \ + tar -xf freetype-${FREETYPE_VERSION}.tar.gz && \ + cd freetype-${FREETYPE_VERSION} && \ + ./configure --prefix="/ffmpeg_build" --enable-freetype-config && \ + make && \ + make install && \ + cd .. && \ + rm -rf ~/freetype_sources + +RUN curl -O -L https://download.qt.io/archive/qt/5.15/${QT_VERSION}/single/qt-everywhere-opensource-src-${QT_VERSION}.tar.xz && \ + tar -xf qt-everywhere-opensource-src-${QT_VERSION}.tar.xz && \ + cd qt-everywhere-src-${QT_VERSION} && \ + export MAKEFLAGS=-j$(nproc) && \ + ./configure -prefix /opt/Qt${QT_VERSION} -release -opensource -confirm-license -qtnamespace QtOpenCVPython -xcb -xcb-xlib -bundled-xcb-xinput -no-openssl -no-dbus -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtmultimedia -skip qtpurchasing -skip qtqa -skip qtremoteobjects -skip qtrepotools -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qttranslations -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip xmlpatterns -skip declarative -make libs && \ + make && \ + make install && \ + cd .. && \ + rm -rf qt-everywhere* + +ENV QTDIR /opt/Qt${QT_VERSION} +ENV PATH "$QTDIR/bin:$PATH" + +RUN mkdir ~/libvpx_sources && \ + cd ~/libvpx_sources && \ + git clone --depth 1 -b ${VPX_VERSION} https://chromium.googlesource.com/webm/libvpx.git && \ + cd libvpx && \ + ./configure --prefix="/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm --enable-pic --enable-shared && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd .. && \ + rm -rf ~/libvpx_sources + +RUN mkdir ~/aom_sources && \ + cd ~/aom_sources && \ + git clone --depth 1 -b ${AOM_VERSION} https://aomedia.googlesource.com/aom && \ + mkdir build && cd build && \ + cmake -DCMAKE_C_COMPILER=$(dirname $(which g++))/gcc -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_SHARED_LIBS=ON -DENABLE_TESTS=OFF ../aom/ && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd / && rm -rf ~/aom_sources + +RUN mkdir ~/avif_sources && \ + cd ~/avif_sources && \ + git clone -b ${AVIF_VERSION} https://github.com/AOMediaCodec/libavif.git && \ + mkdir build && cd build && \ + cmake -DCMAKE_INSTALL_PREFIX=/usr -DAVIF_CODEC_AOM=SYSTEM -DAVIF_LIBYUV=LOCAL -DAVIF_BUILD_APPS=OFF ../libavif && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd / && rm -rf ~/avif_sources + +RUN mkdir ~/ffmpeg_sources && \ + cd ~/ffmpeg_sources && \ + curl -O -L https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz && \ + tar -xf ffmpeg-${FFMPEG_VERSION}.tar.gz && \ + cd ffmpeg-${FFMPEG_VERSION} && \ + PATH=~/bin:$PATH && \ + PKG_CONFIG_PATH="/ffmpeg_build/lib/pkgconfig" ./configure --prefix="/ffmpeg_build" --extra-cflags="-I/ffmpeg_build/include" --extra-ldflags="-L/ffmpeg_build/lib" --enable-openssl --enable-libvpx --enable-shared --enable-pic --bindir="$HOME/bin" && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + echo "/ffmpeg_build/lib/" >> /etc/ld.so.conf && \ + ldconfig && \ + rm -rf ~/ffmpeg_sources + +# Self-hosted runner UID is 1004 +RUN useradd ci -m -s /bin/bash -G users --uid=1004 && \ + mkdir /io && \ + chown -R ci:ci /io && \ + # This needs to find ffmpeg packages from ci user + chown -R ci:ci /ffmpeg_build && \ + # This calls in mutlibuild scripts and cannot be run without permissions + chown -R ci:ci /opt/_internal/pipx/venvs/auditwheel + +USER ci + +# Git security vulnerability: https://github.blog/2022-04-12-git-security-vulnerability-announced +RUN git config --global --add safe.directory /io + +ENV PKG_CONFIG_PATH /usr/local/lib/pkgconfig:/ffmpeg_build/lib/pkgconfig +ENV LDFLAGS -L/ffmpeg_build/lib +ENV PATH "$HOME/bin:$PATH" diff --git a/docker/manylinux_2_28/Dockerfile_x86_64 b/docker/manylinux_2_28/Dockerfile_x86_64 new file mode 100644 index 00000000..7fd75ebd --- /dev/null +++ b/docker/manylinux_2_28/Dockerfile_x86_64 @@ -0,0 +1,114 @@ +# Version: 20251013 +# Image name: quay.io/opencv-ci/opencv-python-manylinux_2_28-x86-64 + +FROM quay.io/pypa/manylinux_2_28_x86_64:latest + +ARG FFMPEG_VERSION=5.1.6 +ARG FREETYPE_VERSION=2.13.3 +ARG LIBPNG_VERSION=1.6.48 +ARG VPX_VERSION=v1.15.1 +ARG QT_VERSION=5.15.16 +ARG AOM_VERSION=v3.12.1 +ARG AVIF_VERSION=v1.3.0 + +ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH + +# epel-release need for aarch64 to get openblas packages +RUN yum install zlib-devel curl-devel xcb-util-renderutil-devel xcb-util-devel xcb-util-image-devel xcb-util-keysyms-devel xcb-util-wm-devel mesa-libGL-devel libxkbcommon-devel libxkbcommon-x11-devel libXi-devel lapack-devel epel-release -y && \ + yum install openblas-devel dejavu-sans-fonts ccache yasm nasm ninja-build openssl openssl-devel -y && \ + # libpng will be built from source + yum remove libpng -y + +RUN mkdir ~/libpng_sources && \ + cd ~/libpng_sources && \ + curl -O -L https://download.sourceforge.net/libpng/libpng-${LIBPNG_VERSION}.tar.gz && \ + tar -xf libpng-${LIBPNG_VERSION}.tar.gz && \ + cd libpng-${LIBPNG_VERSION} && \ + ./configure --prefix=/usr/local && \ + make && \ + make install && \ + cd .. && \ + rm -rf ~/libpng_sources + +RUN mkdir ~/freetype_sources && \ + cd ~/freetype_sources && \ + curl -O -L https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \ + tar -xf freetype-${FREETYPE_VERSION}.tar.gz && \ + cd freetype-${FREETYPE_VERSION} && \ + ./configure --prefix="/ffmpeg_build" --enable-freetype-config && \ + make && \ + make install && \ + cd .. && \ + rm -rf ~/freetype_sources + +RUN curl -O -L https://download.qt.io/archive/qt/5.15/${QT_VERSION}/single/qt-everywhere-opensource-src-${QT_VERSION}.tar.xz && \ + tar -xf qt-everywhere-opensource-src-${QT_VERSION}.tar.xz && \ + cd qt-everywhere-src-${QT_VERSION} && \ + export MAKEFLAGS=-j$(nproc) && \ + ./configure -prefix /opt/Qt${QT_VERSION} -release -opensource -confirm-license -qtnamespace QtOpenCVPython -xcb -xcb-xlib -bundled-xcb-xinput -no-openssl -no-dbus -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtmultimedia -skip qtpurchasing -skip qtqa -skip qtremoteobjects -skip qtrepotools -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qttranslations -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip xmlpatterns -skip declarative -make libs && \ + make && \ + make install && \ + cd .. && \ + rm -rf qt-everywhere* + +ENV QTDIR /opt/Qt${QT_VERSION} +ENV PATH "$QTDIR/bin:$PATH" + +RUN mkdir ~/libvpx_sources && \ + cd ~/libvpx_sources && \ + git clone --depth 1 -b ${VPX_VERSION} https://chromium.googlesource.com/webm/libvpx.git && \ + cd libvpx && \ + ./configure --prefix="/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm --enable-pic --enable-shared && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd .. && \ + rm -rf ~/libvpx_sources + +RUN mkdir ~/aom_sources && \ + cd ~/aom_sources && \ + git clone --depth 1 -b ${AOM_VERSION} https://aomedia.googlesource.com/aom && \ + mkdir build && cd build && \ + cmake -DCMAKE_C_COMPILER=$(dirname $(which g++))/gcc -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_SHARED_LIBS=ON -DENABLE_TESTS=OFF ../aom/ && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd / && rm -rf ~/aom_sources + +RUN mkdir ~/avif_sources && \ + cd ~/avif_sources && \ + git clone -b ${AVIF_VERSION} https://github.com/AOMediaCodec/libavif.git && \ + mkdir build && cd build && \ + cmake -DCMAKE_INSTALL_PREFIX=/usr -DAVIF_CODEC_AOM=SYSTEM -DAVIF_LIBYUV=LOCAL -DAVIF_BUILD_APPS=OFF ../libavif && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd / && rm -rf ~/avif_sources + +RUN mkdir ~/ffmpeg_sources && \ + cd ~/ffmpeg_sources && \ + curl -O -L https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz && \ + tar -xf ffmpeg-${FFMPEG_VERSION}.tar.gz && \ + cd ffmpeg-${FFMPEG_VERSION} && \ + PATH=~/bin:$PATH && \ + PKG_CONFIG_PATH="/ffmpeg_build/lib/pkgconfig" ./configure --prefix="/ffmpeg_build" --extra-cflags="-I/ffmpeg_build/include" --extra-ldflags="-L/ffmpeg_build/lib" --enable-openssl --enable-libvpx --enable-shared --enable-pic --bindir="$HOME/bin" && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + echo "/ffmpeg_build/lib/" >> /etc/ld.so.conf && \ + ldconfig && \ + rm -rf ~/ffmpeg_sources + +# GitHub Actions user`s UID is 1001 +RUN useradd ci -m -s /bin/bash -G users --uid=1001 && \ + mkdir /io && \ + chown -R ci:ci /io && \ + # This needs to find ffmpeg packages from ci user + chown -R ci:ci /ffmpeg_build && \ + # This calls in mutlibuild scripts and cannot be run without permissions + chown -R ci:ci /opt/_internal/pipx/venvs/auditwheel + +USER ci + +# Git security vulnerability: https://github.blog/2022-04-12-git-security-vulnerability-announced +RUN git config --global --add safe.directory /io + +ENV PKG_CONFIG_PATH /usr/local/lib/pkgconfig:/ffmpeg_build/lib/pkgconfig +ENV LDFLAGS -L/ffmpeg_build/lib +ENV PATH "$HOME/bin:$PATH" From 0795a08f37e33e0d837bb3ca04a65c65b52ad6a8 Mon Sep 17 00:00:00 2001 From: Ivan Avdeev Date: Wed, 10 Dec 2025 12:47:41 +0200 Subject: [PATCH 04/14] manylinux_2_28 pipelines --------- Co-authored-by: Alexander Smorkalov --- .github/workflows/build_wheels_linux.yml | 52 ++++++++++++++------ .github/workflows/build_wheels_linux_arm.yml | 2 +- travis_config.sh | 2 +- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build_wheels_linux.yml b/.github/workflows/build_wheels_linux.yml index cc7b0636..0293d82f 100644 --- a/.github/workflows/build_wheels_linux.yml +++ b/.github/workflows/build_wheels_linux.yml @@ -18,34 +18,50 @@ on: jobs: Build: - runs-on: ubuntu-22.04 + runs-on: ${{ matrix.platform == 'aarch64' && 'opencv-cn-lin-arm64' || 'ubuntu-22.04' }} defaults: run: shell: bash strategy: fail-fast: false - matrix: - python-version: ['3.9'] - platform: [x64] - with_contrib: [0, 1] - without_gui: [0, 1] + matrix: + python-version: ['3.9'] + platform: [x86_64, aarch64] + manylinux: [2014, 2_28] + with_contrib: [0, 1] + without_gui: [0, 1] build_sdist: [0] + include: + - platform: aarch64 + manylinux: 2014 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64:20250630 + - platform: x86_64 + manylinux: 2014 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20250630 + - platform: x86_64 + manylinux: 2_28 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-x86-64:20251013 + - platform: aarch64 + manylinux: 2_28 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64:20251013 + env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true REPO_DIR: . PROJECT_SPEC: opencv-python MB_PYTHON_VERSION: ${{ matrix.python-version }} TRAVIS_PYTHON_VERSION: ${{ matrix.python-version }} - MB_ML_VER: 2014 + MB_ML_VER: ${{ matrix.manylinux }} TRAVIS_BUILD_DIR: ${{ github.workspace }} CONFIG_PATH: travis_config.sh - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20250630 + DOCKER_IMAGE: ${{ matrix.DOCKER_IMAGE }} USE_CCACHE: 0 UNICODE_WIDTH: 32 - PLAT: x86_64 + PLAT: ${{ matrix.platform }} SDIST: ${{ matrix.build_sdist || 0 }} ENABLE_HEADLESS: ${{ matrix.without_gui }} ENABLE_CONTRIB: ${{ matrix.with_contrib }} + steps: - name: Cleanup run: find . -mindepth 1 -delete @@ -60,17 +76,18 @@ jobs: with: submodules: false fetch-depth: 0 + - name: Build a package run: source scripts/build.sh - name: Saving a wheel accordingly to matrix uses: actions/upload-artifact@v4 with: - name: wheel-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} + name: wheel-${{ matrix.platform }}-${{ matrix.manylinux }}-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} path: wheelhouse/opencv*.whl Test: needs: [Build] - runs-on: ubuntu-22.04 + runs-on: ${{ matrix.platform == 'aarch64' && 'opencv-cn-lin-arm64' || 'ubuntu-22.04' }} defaults: run: shell: bash @@ -78,17 +95,23 @@ jobs: fail-fast: false matrix: python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] - platform: [x64] + platform: [x86_64, aarch64] + manylinux: [2014, 2_28] with_contrib: [0, 1] without_gui: [0, 1] build_sdist: [0] + env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true MB_PYTHON_VERSION: ${{ matrix.python-version }} NP_TEST_DEP: numpy==1.19.4 NP_TEST_DEP_LATEST: numpy==2.2.6 CONFIG_PATH: travis_config.sh - PLAT: x86_64 + PLAT: ${{ matrix.platform }} + SDIST: ${{ matrix.build_sdist || 0 }} + ENABLE_HEADLESS: ${{ matrix.without_gui }} + ENABLE_CONTRIB: ${{ matrix.with_contrib }} + DOCKER_TEST_IMAGE: ${{ matrix.platform == 'aarch64' && 'quay.io/opencv-ci/multibuild-focal_arm64v8:2025-11-13' || '' }} steps: - name: Cleanup run: find . -mindepth 1 -delete @@ -98,12 +121,13 @@ jobs: with: submodules: true fetch-depth: 0 + - name: Setup Environment variables run: if [ "3.10" == "${{ matrix.python-version }}" -o "3.11" == "${{ matrix.python-version }}" -o "3.12" == "${{ matrix.python-version }}" -o "3.13" == "${{ matrix.python-version }}" ]; then echo "TEST_DEPENDS=$(echo $NP_TEST_DEP_LATEST)" >> $GITHUB_ENV; else echo "TEST_DEPENDS=$(echo $NP_TEST_DEP)" >> $GITHUB_ENV; fi - name: Download a wheel accordingly to matrix uses: actions/download-artifact@v4 with: - name: wheel-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} + name: wheel-${{ matrix.platform }}-${{ matrix.manylinux }}-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} path: wheelhouse/ - name: Package installation and run tests run: source scripts/install.sh diff --git a/.github/workflows/build_wheels_linux_arm.yml b/.github/workflows/build_wheels_linux_arm.yml index 58b06747..1dda358a 100644 --- a/.github/workflows/build_wheels_linux_arm.yml +++ b/.github/workflows/build_wheels_linux_arm.yml @@ -89,7 +89,7 @@ jobs: NP_TEST_DEP: numpy==1.19.4 NP_TEST_DEP_LATEST: numpy==2.2.6 CONFIG_PATH: travis_config.sh - DOCKER_TEST_IMAGE: multibuild/focal_arm64v8 + DOCKER_TEST_IMAGE: quay.io/opencv-ci/multibuild-focal_arm64v8:2025-11-13 UNICODE_WIDTH: 32 steps: - name: Cleanup diff --git a/travis_config.sh b/travis_config.sh index 2e5e1a0e..96d8002b 100644 --- a/travis_config.sh +++ b/travis_config.sh @@ -39,7 +39,7 @@ else CURRENT_ARCH=$(uname -m) if [[ $CURRENT_ARCH == 'aarch64' ]]; then # To avoid network issues with pypi.org on OpenCV CN machines - export PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple + #export PIP_INDEX_URL=https://pypi.org/simple echo "Running for linux aarch64" fi fi From 55f1129b11d989942cc39c450eaebc1cdaddea5c Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov <2536374+asmorkalov@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:11:11 +0300 Subject: [PATCH 05/14] Update OpenCV to current 4.x branch. (#1161) --- opencv | 2 +- opencv_contrib | 2 +- opencv_extra | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/opencv b/opencv index 49486f61..334b7146 160000 --- a/opencv +++ b/opencv @@ -1 +1 @@ -Subproject commit 49486f61fb25722cbcf586b7f4320921d46fb38e +Subproject commit 334b7146f5ebfc204557893a6757cec80146e907 diff --git a/opencv_contrib b/opencv_contrib index d943e1d6..5ed0a377 160000 --- a/opencv_contrib +++ b/opencv_contrib @@ -1 +1 @@ -Subproject commit d943e1d61c8bc556a13783e1546ee7c1a9e0b1cf +Subproject commit 5ed0a377b6ad6abf545770384e632ff35eebad64 diff --git a/opencv_extra b/opencv_extra index b6db059e..bbd6332e 160000 --- a/opencv_extra +++ b/opencv_extra @@ -1 +1 @@ -Subproject commit b6db059e9b80072d80d009d2ab344f8606a8e964 +Subproject commit bbd6332ef6f048f079b43ea70f95133dc88ed039 From 2ff0bf81664b92e584c0be30054f512771d3204d Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Thu, 11 Dec 2025 14:19:17 +0300 Subject: [PATCH 06/14] Added Musllinux environment for ARM. --- docker/musllinux_1_2/Dockerfile_aarch64 | 166 ++++++++++++++++++ .../Dockerfile_x86_64 | 3 +- 2 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 docker/musllinux_1_2/Dockerfile_aarch64 rename docker/{musllinux => musllinux_1_2}/Dockerfile_x86_64 (98%) diff --git a/docker/musllinux_1_2/Dockerfile_aarch64 b/docker/musllinux_1_2/Dockerfile_aarch64 new file mode 100644 index 00000000..ceb02adf --- /dev/null +++ b/docker/musllinux_1_2/Dockerfile_aarch64 @@ -0,0 +1,166 @@ +# version: 20251211 +# Image name: quay.io/opencv-ci/opencv-python-musllinux_1_2-aarch64 +FROM quay.io/pypa/musllinux_1_2_aarch64:latest + +ARG CCACHE_VERSION=3.7.9 +ARG FFMPEG_VERSION=6.1.1 +ARG FREETYPE_VERSION=2.13.3 +ARG LIBPNG_VERSION=1.6.48 +ARG VPX_VERSION=v1.15.1 +ARG NASM_VERSION=2.15.04 +ARG OPENSSL_VERSION=1_1_1w +ARG YASM_VERSION=1.3.0 +ARG AOM_VERSION=v3.12.1 +ARG AVIF_VERSION=v1.3.0 + +ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH + +RUN apk add --no-cache \ + build-base \ + diffutils \ + cmake \ + bash \ + git \ + curl \ + wget \ + tar \ + xz \ + zlib-dev \ + xz-dev \ + nasm \ + yasm \ + pkgconfig \ + openssl-dev \ + libjpeg-turbo-dev \ + fontconfig-dev \ + freetype-dev \ + expat-dev \ + libpng-dev \ + alsa-lib-dev \ + musl-dev \ + ttf-dejavu \ + linux-headers \ + perl + +RUN apk del libpng-dev + +### libpng +RUN mkdir ~/libpng_sources && \ + cd ~/libpng_sources && \ + curl -O -L https://download.sourceforge.net/libpng/libpng-${LIBPNG_VERSION}.tar.gz && \ + tar -xf libpng-${LIBPNG_VERSION}.tar.gz && \ + cd libpng-${LIBPNG_VERSION} && \ + ./configure --prefix=/usr/local && \ + make && \ + make install && \ + cd .. && \ + rm -rf ~/libpng_sources + +### freetype +RUN mkdir ~/freetype_sources && \ + cd ~/freetype_sources && \ + curl -O -L https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \ + tar -xf freetype-${FREETYPE_VERSION}.tar.gz && \ + cd freetype-${FREETYPE_VERSION} && \ + ./configure --prefix="/ffmpeg_build" --enable-freetype-config && \ + make && \ + make install && \ + cd .. && \ + rm -rf ~/freetype_sources + +### OpenSSL +RUN mkdir ~/openssl_sources && \ + cd ~/openssl_sources && \ + curl -O -L https://github.com/openssl/openssl/archive/OpenSSL_${OPENSSL_VERSION}.tar.gz && \ + tar -xf OpenSSL_${OPENSSL_VERSION}.tar.gz && \ + cd openssl-OpenSSL_${OPENSSL_VERSION} && \ + ./config --prefix="/ffmpeg_build" --openssldir="/ffmpeg_build" no-pinshared shared zlib && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install_sw && \ + cd .. && \ + rm -rf ~/openssl_build ~/openssl_sources + +### libvpx +RUN mkdir ~/libvpx_sources && \ + cd ~/libvpx_sources && \ + git clone --depth 1 -b ${VPX_VERSION} https://chromium.googlesource.com/webm/libvpx.git && \ + cd libvpx && \ + ./configure --prefix="/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm --enable-pic --enable-shared && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd .. && \ + rm -rf ~/libvpx_sources + + +### aom +RUN mkdir -p /tmp/aom_sources && \ + cd /tmp/aom_sources && \ + git clone --depth 1 -b ${AOM_VERSION} https://aomedia.googlesource.com/aom && \ + mkdir build && cd build && \ + cmake \ + -DCMAKE_C_COMPILER=$(dirname $(which g++))/gcc \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_SHARED_LIBS=ON \ + -DENABLE_TESTS=OFF \ + -DENABLE_EXAMPLES=OFF \ + ../aom && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install +### avif +RUN mkdir ~/avif_sources && \ + cd ~/avif_sources && \ + git clone -b ${AVIF_VERSION} https://github.com/AOMediaCodec/libavif.git && \ + mkdir build && cd build && \ + cmake -DCMAKE_INSTALL_PREFIX=/usr -DAVIF_CODEC_AOM=SYSTEM -DAVIF_LIBYUV=LOCAL -DAVIF_BUILD_APPS=OFF ../libavif && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd .. && \ + rm -rf ~/avif_sources + +### ffmpeg +RUN mkdir -p /ffmpeg_sources && \ + cd /ffmpeg_sources && \ + curl -LO https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.gz && \ + tar -xf ffmpeg-${FFMPEG_VERSION}.tar.gz && \ + cd ffmpeg-${FFMPEG_VERSION} && \ + PKG_CONFIG_PATH="/ffmpeg_build/lib/pkgconfig" ./configure \ + --prefix="/ffmpeg_build" \ + --extra-cflags="-I/ffmpeg_build/include" \ + --extra-ldflags="-L/ffmpeg_build/lib" \ + --enable-openssl \ + --enable-libvpx \ + --enable-shared \ + --enable-pic \ + --disable-indev=v4l2 \ + --disable-outdev=v4l2 && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + rm -rf /ffmpeg_sources + +### ccache +RUN curl -O -L https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}.tar.gz && \ + tar -xf ccache-${CCACHE_VERSION}.tar.gz && \ + cd ccache-${CCACHE_VERSION} && \ + ./configure && \ + make -j$(getconf _NPROCESSORS_ONLN) && \ + make install && \ + cd .. && \ + rm -rf ccache-${CCACHE_VERSION}.tar.gz + +# Self-hosted runner UID is 1004 +RUN useradd ci -m -s /bin/bash -G users --uid=1004 && \ + mkdir /io && \ + chown -R ci:ci /io && \ + # This needs to find ffmpeg packages from ci user + chown -R ci:ci /ffmpeg_build && \ + # This calls in mutlibuild scripts and cannot be run without permissions + chown -R ci:ci /opt/_internal/pipx/venvs/auditwheel + +USER ci + +RUN git config --global --add safe.directory /io +ENV PATH="/ffmpeg_build/bin:$PATH" +ENV PKG_CONFIG_PATH /usr/local/lib/pkgconfig:/ffmpeg_build/lib/pkgconfig +ENV LDFLAGS -L/ffmpeg_build/lib +ENV PATH "$HOME/bin:$PATH" +ENV LD_LIBRARY_PATH="/ffmpeg_build/lib:$LD_LIBRARY_PATH" diff --git a/docker/musllinux/Dockerfile_x86_64 b/docker/musllinux_1_2/Dockerfile_x86_64 similarity index 98% rename from docker/musllinux/Dockerfile_x86_64 rename to docker/musllinux_1_2/Dockerfile_x86_64 index aba27d0f..babdf95f 100644 --- a/docker/musllinux/Dockerfile_x86_64 +++ b/docker/musllinux_1_2/Dockerfile_x86_64 @@ -1,4 +1,5 @@ -# +# version: 20251211 +# Image name: quay.io/opencv-ci/opencv-python-musllinux_1_2-x86-64 FROM quay.io/pypa/musllinux_1_2_x86_64:latest ARG CCACHE_VERSION=3.7.9 From cb22e27c795df5361bf0740c693e3dbf632f6e85 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Thu, 11 Dec 2025 15:13:48 +0300 Subject: [PATCH 07/14] Removed duplicated ARM builds. --- .github/workflows/build_wheels_linux_arm.yml | 189 ------------------ .github/workflows/build_wheels_macos.yml | 2 +- .github/workflows/build_wheels_macos_m1.yml | 2 +- ...s_linux.yml => build_wheels_manylinux.yml} | 5 +- .github/workflows/build_wheels_windows.yml | 2 +- 5 files changed, 5 insertions(+), 195 deletions(-) delete mode 100644 .github/workflows/build_wheels_linux_arm.yml rename .github/workflows/{build_wheels_linux.yml => build_wheels_manylinux.yml} (99%) diff --git a/.github/workflows/build_wheels_linux_arm.yml b/.github/workflows/build_wheels_linux_arm.yml deleted file mode 100644 index 1dda358a..00000000 --- a/.github/workflows/build_wheels_linux_arm.yml +++ /dev/null @@ -1,189 +0,0 @@ -name: Linux ARM64 - -on: - pull_request: - branches: - - 4.x - - 5.x - paths-ignore: - - '.github/workflows/build_wheels_linux.yml' - - '.github/workflows/build_wheels_windows*' - - '.github/workflows/build_wheels_macos*' - release: - types: [published, edited] - schedule: - - cron: '0 3 * * 6' - workflow_dispatch: - - -jobs: - Build: - runs-on: opencv-cn-lin-arm64 - defaults: - run: - shell: bash - strategy: - fail-fast: false - matrix: - python-version: ['3.9'] - platform: [x64] - with_contrib: [0, 1] - without_gui: [0, 1] - build_sdist: [0] - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: true - REPO_DIR: . - PROJECT_SPEC: opencv-python - MB_PYTHON_VERSION: ${{ matrix.python-version }} - TRAVIS_PYTHON_VERSION: ${{ matrix.python-version }} - PLAT: aarch64 - MB_ML_VER: 2014 - TRAVIS_BUILD_DIR: ${{ github.workspace }} - CONFIG_PATH: travis_config.sh - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64:20250630 - USE_CCACHE: 0 - UNICODE_WIDTH: 32 - SDIST: ${{ matrix.build_sdist || 0 }} - ENABLE_HEADLESS: ${{ matrix.without_gui }} - ENABLE_CONTRIB: ${{ matrix.with_contrib }} - steps: - - name: Cleanup - run: find . -mindepth 1 -delete - working-directory: ${{ github.workspace }} - - name: Setup environment - run: | - if [[ "${{ github.event_name }}" == "schedule" || "${{ github.event_name }}" == "workflow_dispatch" ]]; then - echo "ENABLE_ROLLING=1" >> $GITHUB_ENV - fi - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: false - fetch-depth: 0 - - name: Build a package - run: source scripts/build.sh - - name: Saving a wheel accordingly to matrix - uses: actions/upload-artifact@v4 - with: - name: wheel-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} - path: wheelhouse/opencv*.whl - - Test: - needs: [Build] - runs-on: opencv-cn-lin-arm64 - defaults: - run: - shell: bash - strategy: - fail-fast: false - matrix: - python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] - platform: [x64] - with_contrib: [0, 1] - without_gui: [0, 1] - build_sdist: [0] - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: true - MB_PYTHON_VERSION: ${{ matrix.python-version }} - PLAT: aarch64 - NP_TEST_DEP: numpy==1.19.4 - NP_TEST_DEP_LATEST: numpy==2.2.6 - CONFIG_PATH: travis_config.sh - DOCKER_TEST_IMAGE: quay.io/opencv-ci/multibuild-focal_arm64v8:2025-11-13 - UNICODE_WIDTH: 32 - steps: - - name: Cleanup - run: find . -mindepth 1 -delete - working-directory: ${{ github.workspace }} - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: true - fetch-depth: 0 - - name: Setup Environment variables - run: if [ "3.10" == "${{ matrix.python-version }}" -o "3.11" == "${{ matrix.python-version }}" -o "3.12" == "${{ matrix.python-version }}" -o "3.13" == "${{ matrix.python-version }}" ]; then echo "TEST_DEPENDS=$(echo $NP_TEST_DEP_LATEST)" >> $GITHUB_ENV; else echo "TEST_DEPENDS=$(echo $NP_TEST_DEP)" >> $GITHUB_ENV; fi - - name: Download a wheel accordingly to matrix - uses: actions/download-artifact@v4 - with: - name: wheel-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} - path: wheelhouse/ - - name: Package installation and run tests - run: source scripts/install.sh - - Release_rolling: - if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} - needs: [Build, Test] - runs-on: ubuntu-22.04 - environment: opencv-python-rolling-release - defaults: - run: - shell: bash - steps: - - uses: actions/download-artifact@v4 - with: - name: wheels - path: wheelhouse/ - - name: Upload wheels for opencv_python_rolling - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_PYTHON_ROLLING_USERNAME }} -p ${{ secrets.OPENCV_PYTHON_ROLLING_PASSWORD }} --skip-existing wheelhouse/opencv_python_rolling-* - - name: Upload wheels for opencv_contrib_python_rolling - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_CONTRIB_PYTHON_ROLLING_USERNAME }} -p ${{ secrets.OPENCV_CONTRIB_PYTHON_ROLLING_PASSWORD }} --skip-existing wheelhouse/opencv_contrib_python_rolling-* - - name: Upload wheels for opencv_python_headless_rolling - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_PYTHON_HEADLESS_ROLLING_USERNAME }} -p ${{ secrets.OPENCV_PYTHON_HEADLESS_ROLLING_PASSWORD }} --skip-existing wheelhouse/opencv_python_headless_rolling-* - - name: Upload wheels for opencv_contrib_python_headless_rolling - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_CONTRIB_PYTHON_HEADLESS_ROLLING_USERNAME }} -p ${{ secrets.OPENCV_CONTRIB_PYTHON_HEADLESS_ROLLING_PASSWORD }} --skip-existing wheelhouse/opencv_contrib_python_headless_rolling-* - - Pre-release: - if: github.event_name == 'release' && github.event.release.prerelease - needs: [Build, Test] - runs-on: ubuntu-22.04 - environment: test-opencv-python-release - defaults: - run: - shell: bash - steps: - - uses: actions/download-artifact@v4 - with: - name: wheels - path: wheelhouse/ - - name: Upload all wheels - run: | - python -m pip install twine - python -m twine upload --repository testpypi -u ${{ secrets.PYPI_USERNAME }} -p ${{ secrets.PYPI_PASSWORD }} --skip-existing wheelhouse/opencv_* - - Release: - if: github.event_name == 'release' && !github.event.release.prerelease - needs: [Build, Test] - runs-on: ubuntu-22.04 - environment: opencv-python-release - defaults: - run: - shell: bash - steps: - - uses: actions/download-artifact@v4 - with: - name: wheels - path: wheelhouse/ - - name: Upload wheels for opencv_python - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_PYTHON_USERNAME }} -p ${{ secrets.OPENCV_PYTHON_PASSWORD }} --skip-existing wheelhouse/opencv_python-* - - name: Upload wheels for opencv_contrib_python - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_CONTRIB_PYTHON_USERNAME }} -p ${{ secrets.OPENCV_CONTRIB_PYTHON_PASSWORD }} --skip-existing wheelhouse/opencv_contrib_python-* - - name: Upload wheels for opencv_python_headless - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_PYTHON_HEADLESS_USERNAME }} -p ${{ secrets.OPENCV_PYTHON_HEADLESS_PASSWORD }} --skip-existing wheelhouse/opencv_python_headless-* - - name: Upload wheels for opencv_contrib_python_headless - run: | - python -m pip install twine - python -m twine upload -u ${{ secrets.OPENCV_CONTRIB_PYTHON_HEADLESS_USERNAME }} -p ${{ secrets.OPENCV_CONTRIB_PYTHON_HEADLESS_PASSWORD }} --skip-existing wheelhouse/opencv_contrib_python_headless-* diff --git a/.github/workflows/build_wheels_macos.yml b/.github/workflows/build_wheels_macos.yml index 6a84bda0..106b10cc 100644 --- a/.github/workflows/build_wheels_macos.yml +++ b/.github/workflows/build_wheels_macos.yml @@ -6,7 +6,7 @@ on: - 4.x - 5.x paths-ignore: - - '.github/workflows/build_wheels_linux*' + - '.github/workflows/build_wheels_manylinux*' - '.github/workflows/build_wheels_windows*' - '.github/workflows/build_wheels_macos_m1.yml' release: diff --git a/.github/workflows/build_wheels_macos_m1.yml b/.github/workflows/build_wheels_macos_m1.yml index 875efbf7..e38d286f 100644 --- a/.github/workflows/build_wheels_macos_m1.yml +++ b/.github/workflows/build_wheels_macos_m1.yml @@ -6,7 +6,7 @@ on: - 4.x - 5.x paths-ignore: - - '.github/workflows/build_wheels_linux*' + - '.github/workflows/build_wheels_manylinux*' - '.github/workflows/build_wheels_windows*' - '.github/workflows/build_wheels_macos.yml' release: diff --git a/.github/workflows/build_wheels_linux.yml b/.github/workflows/build_wheels_manylinux.yml similarity index 99% rename from .github/workflows/build_wheels_linux.yml rename to .github/workflows/build_wheels_manylinux.yml index 0293d82f..b8e47334 100644 --- a/.github/workflows/build_wheels_linux.yml +++ b/.github/workflows/build_wheels_manylinux.yml @@ -1,4 +1,4 @@ -name: Linux x86_64 +name: Manylinux on: pull_request: @@ -6,7 +6,6 @@ on: - 4.x - 5.x paths-ignore: - - '.github/workflows/build_wheels_linux_arm.yml' - '.github/workflows/build_wheels_windows*' - '.github/workflows/build_wheels_macos*' release: @@ -76,7 +75,7 @@ jobs: with: submodules: false fetch-depth: 0 - + - name: Build a package run: source scripts/build.sh - name: Saving a wheel accordingly to matrix diff --git a/.github/workflows/build_wheels_windows.yml b/.github/workflows/build_wheels_windows.yml index 1ee786a9..580bdd57 100644 --- a/.github/workflows/build_wheels_windows.yml +++ b/.github/workflows/build_wheels_windows.yml @@ -6,7 +6,7 @@ on: - 4.x - 5.x paths-ignore: - - '.github/workflows/build_wheels_linux*' + - '.github/workflows/build_wheels_manylinux*' - '.github/workflows/build_wheels_macos*' release: types: [published, edited] From 5dd66a1b731e04d165e0d82bdac40292093821e3 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Thu, 1 Jan 2026 12:50:54 +0300 Subject: [PATCH 08/14] Update submodules to release 4.13.0 --- opencv | 2 +- opencv_contrib | 2 +- opencv_extra | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/opencv b/opencv index 334b7146..fe38fc60 160000 --- a/opencv +++ b/opencv @@ -1 +1 @@ -Subproject commit 334b7146f5ebfc204557893a6757cec80146e907 +Subproject commit fe38fc608f6acb8b68953438a62305d8318f4fcd diff --git a/opencv_contrib b/opencv_contrib index 5ed0a377..d99ad2a1 160000 --- a/opencv_contrib +++ b/opencv_contrib @@ -1 +1 @@ -Subproject commit 5ed0a377b6ad6abf545770384e632ff35eebad64 +Subproject commit d99ad2a188210cc35067c2e60076eed7c2442bc3 diff --git a/opencv_extra b/opencv_extra index bbd6332e..c322faf6 160000 --- a/opencv_extra +++ b/opencv_extra @@ -1 +1 @@ -Subproject commit bbd6332ef6f048f079b43ea70f95133dc88ed039 +Subproject commit c322faf6f5d10649c4215a16203b923e36c4ba6f From c6101c43ba49b7870752ddbf6e1b462773a4beb7 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Tue, 6 Jan 2026 12:14:23 +0300 Subject: [PATCH 09/14] Cherry-pick Numpy 2.4.x types fix. --- opencv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencv b/opencv index fe38fc60..b4c5ec40 160000 --- a/opencv +++ b/opencv @@ -1 +1 @@ -Subproject commit fe38fc608f6acb8b68953438a62305d8318f4fcd +Subproject commit b4c5ec4042f097e2a5b386b9d413ec7333d0a184 From d098302f7f209e24e8a7189f3731f3bdc7fed316 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Fri, 2 Jan 2026 18:21:07 +0300 Subject: [PATCH 10/14] Dependencies update for 4.13.0 release. --- .github/workflows/build_wheels_manylinux.yml | 10 +++++----- docker/manylinux2014/Dockerfile_aarch64 | 14 +++++++------- docker/manylinux2014/Dockerfile_x86_64 | 14 +++++++------- docker/manylinux_2_28/Dockerfile_aarch64 | 14 +++++++------- docker/manylinux_2_28/Dockerfile_x86_64 | 14 +++++++------- patches/patchQtPlugins | 2 +- travis_config.sh | 2 +- 7 files changed, 35 insertions(+), 35 deletions(-) diff --git a/.github/workflows/build_wheels_manylinux.yml b/.github/workflows/build_wheels_manylinux.yml index b8e47334..d24c1ebc 100644 --- a/.github/workflows/build_wheels_manylinux.yml +++ b/.github/workflows/build_wheels_manylinux.yml @@ -33,16 +33,16 @@ jobs: include: - platform: aarch64 manylinux: 2014 - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64:20250630 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64:20260102 - platform: x86_64 manylinux: 2014 - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20250630 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20260102 - platform: x86_64 manylinux: 2_28 - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-x86-64:20251013 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-x86-64:20260102 - platform: aarch64 manylinux: 2_28 - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64:20251013 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64:20260102 env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true @@ -155,7 +155,7 @@ jobs: NP_TEST_DEP: numpy==1.19.4 TRAVIS_BUILD_DIR: ${{ github.workspace }} CONFIG_PATH: travis_config.sh - DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20250630 + DOCKER_IMAGE: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64:20260102 USE_CCACHE: 1 UNICODE_WIDTH: 32 SDIST: ${{ matrix.build_sdist || 0 }} diff --git a/docker/manylinux2014/Dockerfile_aarch64 b/docker/manylinux2014/Dockerfile_aarch64 index 98cd3125..c995e00c 100644 --- a/docker/manylinux2014/Dockerfile_aarch64 +++ b/docker/manylinux2014/Dockerfile_aarch64 @@ -1,18 +1,18 @@ -# Version: 20250630 +# Version: 20260102 # Image name: quay.io/opencv-ci/opencv-python-manylinux2014-aarch64 FROM quay.io/pypa/manylinux2014_aarch64:latest ARG CCACHE_VERSION=3.7.9 -ARG FFMPEG_VERSION=5.1.6 -ARG FREETYPE_VERSION=2.13.3 -ARG LIBPNG_VERSION=1.6.48 -ARG VPX_VERSION=v1.15.1 +ARG FFMPEG_VERSION=8.0.1 +ARG FREETYPE_VERSION=2.14.1 +ARG LIBPNG_VERSION=1.6.53 +ARG VPX_VERSION=v1.15.2 ARG NASM_VERSION=2.15.04 ARG OPENSSL_VERSION=1_1_1w -ARG QT_VERSION=5.15.16 +ARG QT_VERSION=5.15.18 ARG YASM_VERSION=1.3.0 -ARG AOM_VERSION=v3.12.1 +ARG AOM_VERSION=v3.13.1 ARG AVIF_VERSION=v1.3.0 ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH diff --git a/docker/manylinux2014/Dockerfile_x86_64 b/docker/manylinux2014/Dockerfile_x86_64 index 3ed3aa49..c48a2370 100644 --- a/docker/manylinux2014/Dockerfile_x86_64 +++ b/docker/manylinux2014/Dockerfile_x86_64 @@ -1,18 +1,18 @@ -# Version: 20250630 +# Version: 20260102 # Image name: quay.io/opencv-ci/opencv-python-manylinux2014-x86-64 FROM quay.io/pypa/manylinux2014_x86_64:latest ARG CCACHE_VERSION=3.7.9 -ARG FFMPEG_VERSION=5.1.6 -ARG FREETYPE_VERSION=2.13.3 -ARG LIBPNG_VERSION=1.6.48 -ARG VPX_VERSION=v1.15.1 +ARG FFMPEG_VERSION=8.0.1 +ARG FREETYPE_VERSION=2.14.1 +ARG LIBPNG_VERSION=1.6.53 +ARG VPX_VERSION=v1.15.2 ARG NASM_VERSION=2.15.04 ARG OPENSSL_VERSION=1_1_1w -ARG QT_VERSION=5.15.16 +ARG QT_VERSION=5.15.18 ARG YASM_VERSION=1.3.0 -ARG AOM_VERSION=v3.12.1 +ARG AOM_VERSION=v3.13.1 ARG AVIF_VERSION=v1.3.0 ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH diff --git a/docker/manylinux_2_28/Dockerfile_aarch64 b/docker/manylinux_2_28/Dockerfile_aarch64 index e1241d99..5fe6d93a 100644 --- a/docker/manylinux_2_28/Dockerfile_aarch64 +++ b/docker/manylinux_2_28/Dockerfile_aarch64 @@ -1,14 +1,14 @@ -# Version: 20251013 +# Version: 20260102 # Image name: quay.io/opencv-ci/opencv-python-manylinux_2_28-aarch64 FROM quay.io/pypa/manylinux_2_28_aarch64:latest -ARG FFMPEG_VERSION=5.1.6 -ARG FREETYPE_VERSION=2.13.3 -ARG LIBPNG_VERSION=1.6.48 -ARG VPX_VERSION=v1.15.1 -ARG QT_VERSION=5.15.16 -ARG AOM_VERSION=v3.12.1 +ARG FFMPEG_VERSION=8.0.1 +ARG FREETYPE_VERSION=2.14.1 +ARG LIBPNG_VERSION=1.6.53 +ARG VPX_VERSION=v1.15.2 +ARG QT_VERSION=5.15.18 +ARG AOM_VERSION=v3.13.1 ARG AVIF_VERSION=v1.3.0 ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH diff --git a/docker/manylinux_2_28/Dockerfile_x86_64 b/docker/manylinux_2_28/Dockerfile_x86_64 index 7fd75ebd..c8de6208 100644 --- a/docker/manylinux_2_28/Dockerfile_x86_64 +++ b/docker/manylinux_2_28/Dockerfile_x86_64 @@ -1,14 +1,14 @@ -# Version: 20251013 +# Version: 20260102 # Image name: quay.io/opencv-ci/opencv-python-manylinux_2_28-x86-64 FROM quay.io/pypa/manylinux_2_28_x86_64:latest -ARG FFMPEG_VERSION=5.1.6 -ARG FREETYPE_VERSION=2.13.3 -ARG LIBPNG_VERSION=1.6.48 -ARG VPX_VERSION=v1.15.1 -ARG QT_VERSION=5.15.16 -ARG AOM_VERSION=v3.12.1 +ARG FFMPEG_VERSION=8.0.1 +ARG FREETYPE_VERSION=2.14.1 +ARG LIBPNG_VERSION=1.6.53 +ARG VPX_VERSION=v1.15.2 +ARG QT_VERSION=5.15.18 +ARG AOM_VERSION=v3.13.1 ARG AVIF_VERSION=v1.3.0 ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH diff --git a/patches/patchQtPlugins b/patches/patchQtPlugins index b274aa08..ea11c7ae 100644 --- a/patches/patchQtPlugins +++ b/patches/patchQtPlugins @@ -9,7 +9,7 @@ index 4c0b3880fc..dffa0a4caa 100644 + install(DIRECTORY ${Qt5_DIR}/../../../plugins DESTINATION lib/qt) + endif() + if(UNIX AND NOT APPLE) -+ install(DIRECTORY /opt/Qt5.15.16/plugins DESTINATION lib/qt) ++ install(DIRECTORY /opt/Qt5.15.18/plugins DESTINATION lib/qt) + install(DIRECTORY /usr/share/fonts DESTINATION lib/qt) + endif() if(HAVE_QT_OPENGL) diff --git a/travis_config.sh b/travis_config.sh index 96d8002b..8fbaf2e2 100644 --- a/travis_config.sh +++ b/travis_config.sh @@ -34,7 +34,7 @@ if [ -n "$IS_OSX" ]; then export MAKEFLAGS="-j$(sysctl -n hw.ncpu)" else echo " > Linux environment " - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/Qt5.15.16/lib + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/Qt5.15.18/lib export MAKEFLAGS="-j$(grep -E '^processor[[:space:]]*:' /proc/cpuinfo | wc -l)" CURRENT_ARCH=$(uname -m) if [[ $CURRENT_ARCH == 'aarch64' ]]; then From 66e31281aa617b4e19b31b3d2ce18deecf32f8e8 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Wed, 7 Jan 2026 11:25:37 +0300 Subject: [PATCH 11/14] Switched MacOS Intel builds to own host. --- .github/workflows/build_wheels_macos.yml | 60 +++++++++--------------- 1 file changed, 22 insertions(+), 38 deletions(-) diff --git a/.github/workflows/build_wheels_macos.yml b/.github/workflows/build_wheels_macos.yml index 106b10cc..bfc61749 100644 --- a/.github/workflows/build_wheels_macos.yml +++ b/.github/workflows/build_wheels_macos.yml @@ -18,10 +18,7 @@ on: jobs: Build: - runs-on: macos-13 - defaults: - run: - shell: bash + runs-on: python-macos-intel strategy: fail-fast: false matrix: @@ -31,6 +28,7 @@ jobs: without_gui: [0, 1] build_sdist: [0] env: + CI_BUILD: 1 ACTIONS_ALLOW_UNSECURE_COMMANDS: true REPO_DIR: . PROJECT_SPEC: opencv-python @@ -46,6 +44,7 @@ jobs: SDIST: ${{ matrix.build_sdist || 0 }} ENABLE_HEADLESS: ${{ matrix.without_gui }} ENABLE_CONTRIB: ${{ matrix.with_contrib }} + PIP_INDEX_URL: https://pypi.tuna.tsinghua.edu.cn/simple steps: - name: Cleanup run: find . -mindepth 1 -delete @@ -55,12 +54,6 @@ jobs: if [[ "${{ github.event_name }}" == "schedule" || "${{ github.event_name }}" == "workflow_dispatch" ]]; then echo "ENABLE_ROLLING=1" >> $GITHUB_ENV fi - # hack for image issue on mac: https://github.com/actions/runner-images/issues/6817 - rm /usr/local/bin/2to3* - rm /usr/local/bin/idle3* - rm /usr/local/bin/pydoc3* - rm /usr/local/bin/python3* - # end hack - name: Checkout uses: actions/checkout@v3 with: @@ -68,21 +61,13 @@ jobs: fetch-depth: 0 - name: Build a package run: | - set -e - # Check out and prepare the source - # Multibuild doesn't have releases, so --depth would break eventually (see - # https://superuser.com/questions/1240216/server-does-not-allow-request-for-unadvertised) git submodule update --init multibuild - source multibuild/common_utils.sh - # https://github.com/matthew-brett/multibuild/issues/116 - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export ARCH_FLAGS=" "; fi - source multibuild/travis_steps.sh - # This sets -x - # source travis_multibuild_customize.sh echo $ENABLE_CONTRIB > contrib.enabled echo $ENABLE_HEADLESS > headless.enabled - set -x - build_wheel $REPO_DIR $PLAT + export MACOSX_DEPLOYMENT_TARGET=14.0 + python${{ matrix.python-version }} -m pip install toml && python${{ matrix.python-version }} -c 'import toml; c = toml.load("pyproject.toml"); print("\n".join(c["build-system"]["requires"]))' | python${{ matrix.python-version }} -m pip install -r /dev/stdin + python${{ matrix.python-version }} setup.py bdist_wheel --py-limited-api=cp37 --dist-dir=wheelhouse -v + delocate-wheel ${{ github.workspace }}/wheelhouse/opencv* - name: Saving a wheel accordingly to matrix uses: actions/upload-artifact@v4 with: @@ -91,10 +76,7 @@ jobs: Test: needs: [Build] - runs-on: macos-13 - defaults: - run: - shell: bash + runs-on: python-macos-intel strategy: fail-fast: false matrix: @@ -112,6 +94,7 @@ jobs: PLAT: x86_64 OPENCV_TEST_DATA_PATH: ${{ github.workspace }}/opencv_extra/testdata PYLINT_TEST_FILE: ${{ github.workspace }}/opencv/samples/python/squares.py + PIP_INDEX_URL: https://pypi.tuna.tsinghua.edu.cn/simple steps: - name: Cleanup run: find . -mindepth 1 -delete @@ -121,32 +104,33 @@ jobs: with: submodules: true fetch-depth: 0 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - architecture: ${{ matrix.platform }} - - name: Setup Environment variables - run: if ["3.10" == "${{ matrix.python-version }}" -o "3.11" == "${{ matrix.python-version }}" -o "3.12" == "${{ matrix.python-version }}" -o "3.13" == "${{ matrix.python-version }}" ]; then echo "TEST_DEPENDS=$(echo $NP_TEST_DEP_LATEST)" >> $GITHUB_ENV; else echo "TEST_DEPENDS=$(echo $NP_TEST_DEP)" >> $GITHUB_ENV; fi - name: Download a wheel accordingly to matrix uses: actions/download-artifact@v4 with: name: wheel-${{ matrix.with_contrib }}-${{ matrix.without_gui }}-${{ matrix.build_sdist }} path: wheelhouse/ + - name: Create Venv for test + run: | + test -d "${{ github.workspace }}/opencv_test" && rm -rf "${{ github.workspace }}/opencv_test" + python${{ matrix.python-version }} -m venv ${{ github.workspace }}/opencv_test - name: Package installation run: | - python -m pip install wheelhouse/opencv*.whl + source ${{ github.workspace }}/opencv_test/bin/activate + python${{ matrix.python-version }} -m pip install --upgrade pip + python${{ matrix.python-version }} -m pip install --no-cache --force-reinstall wheelhouse/opencv*.whl cd ${{ github.workspace }}/tests - python get_build_info.py + python${{ matrix.python-version }} get_build_info.py - name: Run tests run: | + source ${{ github.workspace }}/opencv_test/bin/activate cd ${{ github.workspace }}/opencv - python modules/python/test/test.py -v --repo . + python${{ matrix.python-version }} modules/python/test/test.py -v --repo . - name: Pylint test run: | - python -m pip install pylint==2.15.9 + source ${{ github.workspace }}/opencv_test/bin/activate + python${{ matrix.python-version }} -m pip install pylint==2.15.9 cd ${{ github.workspace }}/tests - python -m pylint $PYLINT_TEST_FILE + python${{ matrix.python-version }} -m pylint $PYLINT_TEST_FILE Release_rolling: if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} From 8e765e87de75033d35bf7c189c8d002f16c8711c Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Wed, 14 Jan 2026 07:48:32 +0300 Subject: [PATCH 12/14] Added Python 3.14 support to CI. --- .github/workflows/build_wheels_macos.yml | 2 +- .github/workflows/build_wheels_macos_m1.yml | 2 +- .github/workflows/build_wheels_manylinux.yml | 26 ++++++++++---------- pyproject.toml | 1 + setup.py | 1 + 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build_wheels_macos.yml b/.github/workflows/build_wheels_macos.yml index bfc61749..49398859 100644 --- a/.github/workflows/build_wheels_macos.yml +++ b/.github/workflows/build_wheels_macos.yml @@ -80,7 +80,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] + python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] platform: [x64] with_contrib: [0, 1] without_gui: [0, 1] diff --git a/.github/workflows/build_wheels_macos_m1.yml b/.github/workflows/build_wheels_macos_m1.yml index e38d286f..85265a5a 100644 --- a/.github/workflows/build_wheels_macos_m1.yml +++ b/.github/workflows/build_wheels_macos_m1.yml @@ -68,7 +68,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] + python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] platform: [x64] with_contrib: [0, 1] without_gui: [0, 1] diff --git a/.github/workflows/build_wheels_manylinux.yml b/.github/workflows/build_wheels_manylinux.yml index d24c1ebc..8abf61fb 100644 --- a/.github/workflows/build_wheels_manylinux.yml +++ b/.github/workflows/build_wheels_manylinux.yml @@ -23,12 +23,12 @@ jobs: shell: bash strategy: fail-fast: false - matrix: - python-version: ['3.9'] - platform: [x86_64, aarch64] - manylinux: [2014, 2_28] - with_contrib: [0, 1] - without_gui: [0, 1] + matrix: + python-version: ['3.9'] + platform: [x86_64, aarch64] + manylinux: [2014, 2_28] + with_contrib: [0, 1] + without_gui: [0, 1] build_sdist: [0] include: - platform: aarch64 @@ -60,7 +60,7 @@ jobs: SDIST: ${{ matrix.build_sdist || 0 }} ENABLE_HEADLESS: ${{ matrix.without_gui }} ENABLE_CONTRIB: ${{ matrix.with_contrib }} - + steps: - name: Cleanup run: find . -mindepth 1 -delete @@ -94,12 +94,12 @@ jobs: fail-fast: false matrix: python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] - platform: [x86_64, aarch64] + platform: [x86_64, aarch64] manylinux: [2014, 2_28] with_contrib: [0, 1] without_gui: [0, 1] build_sdist: [0] - + env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true MB_PYTHON_VERSION: ${{ matrix.python-version }} @@ -107,7 +107,7 @@ jobs: NP_TEST_DEP_LATEST: numpy==2.2.6 CONFIG_PATH: travis_config.sh PLAT: ${{ matrix.platform }} - SDIST: ${{ matrix.build_sdist || 0 }} + SDIST: ${{ matrix.build_sdist || 0 }} ENABLE_HEADLESS: ${{ matrix.without_gui }} ENABLE_CONTRIB: ${{ matrix.with_contrib }} DOCKER_TEST_IMAGE: ${{ matrix.platform == 'aarch64' && 'quay.io/opencv-ci/multibuild-focal_arm64v8:2025-11-13' || '' }} @@ -120,9 +120,9 @@ jobs: with: submodules: true fetch-depth: 0 - + - name: Setup Environment variables - run: if [ "3.10" == "${{ matrix.python-version }}" -o "3.11" == "${{ matrix.python-version }}" -o "3.12" == "${{ matrix.python-version }}" -o "3.13" == "${{ matrix.python-version }}" ]; then echo "TEST_DEPENDS=$(echo $NP_TEST_DEP_LATEST)" >> $GITHUB_ENV; else echo "TEST_DEPENDS=$(echo $NP_TEST_DEP)" >> $GITHUB_ENV; fi + run: if [ "3.10" == "${{ matrix.python-version }}" -o "3.11" == "${{ matrix.python-version }}" -o "3.12" == "${{ matrix.python-version }}" -o "3.13" == "${{ matrix.python-version }}" -o "3.14" == "${{ matrix.python-version }}" ]; then echo "TEST_DEPENDS=$(echo $NP_TEST_DEP_LATEST)" >> $GITHUB_ENV; else echo "TEST_DEPENDS=$(echo $NP_TEST_DEP)" >> $GITHUB_ENV; fi - name: Download a wheel accordingly to matrix uses: actions/download-artifact@v4 with: @@ -240,7 +240,7 @@ jobs: - uses: actions/download-artifact@v4 with: path: wheelhouse/ - + - name: Upload all wheels run: | python -m pip install twine diff --git a/pyproject.toml b/pyproject.toml index 58fba213..ff65d776 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,6 +3,7 @@ requires = [ "numpy<2.0; python_version<'3.9'", "numpy==2.0.2; python_version>='3.9' and python_version<'3.13'", "numpy==2.1.3; python_version=='3.13'", + "numpy==2.3.2; python_version=='3.14'", "packaging", "pip", "scikit-build>=0.14.0", diff --git a/setup.py b/setup.py index eea13434..e25e51b2 100755 --- a/setup.py +++ b/setup.py @@ -298,6 +298,7 @@ def main(): "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: C++", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Scientific/Engineering", From 7f792fe4647847400649717fd011f6be6fc43a22 Mon Sep 17 00:00:00 2001 From: Kumataro Date: Wed, 21 Jan 2026 22:42:37 +0900 Subject: [PATCH 13/14] Add KAZE and AKAZE license --- LICENSE-3RD-PARTY.txt | 62 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/LICENSE-3RD-PARTY.txt b/LICENSE-3RD-PARTY.txt index b5e8f5e9..86c43de8 100644 --- a/LICENSE-3RD-PARTY.txt +++ b/LICENSE-3RD-PARTY.txt @@ -3511,3 +3511,65 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ + +KAZE Features library is redistributed within all opencv-python packages. + +Copyright (c) 2012, Pablo Fernández Alcantarilla +All Rights Reserved + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the copyright holders nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ + +AKAZE Features library is redistributed within all opencv-python packages. + +Copyright (c) 2014, Pablo Fernandez Alcantarilla, Jesus Nuevo +All Rights Reserved + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the copyright holders nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From e42eb55649e98e2cd885b00db5fb83b8ce683216 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Fri, 23 Jan 2026 11:55:51 +0300 Subject: [PATCH 14/14] Disable libavdevice for headless builds on Linux to get rid of X libs dependency. --- setup.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup.py b/setup.py index e25e51b2..d0c57b48 100755 --- a/setup.py +++ b/setup.py @@ -216,6 +216,10 @@ def main(): # see: https://github.com/opencv/opencv-python/issues/771 cmake_args.append("-DWITH_MSMF=OFF") cmake_args.append("-DWITH_OBSENSOR=OFF") # Orbbec cameras backend uses MSMF API + # see: https://github.com/opencv/opencv/issues/28438 + # libavdevice is enabled by default, but brings libxcb dependency + if sys.platform.startswith("linux"): + cmake_args.append("-DOPENCV_FFMPEG_ENABLE_LIBAVDEVICE=OFF") if sys.platform.startswith("linux") and not is64 and "bdist_wheel" in sys.argv: subprocess.check_call("patch -p0 < patches/patchOpenEXR", shell=True)