Skip to content

Commit d731d83

Browse files
committed
feat(pkg): compat.opencv 三平台化 macOS(linux + macosx),headless highgui
compat.opencv 现在从源码在 linux-x86_64 + macosx-arm64 两平台构建(windows 待后续)。 - 描述符重构为 xpm.{linux,macosx} + mcpp 中性公共键(language/deps/targets/features) + 每平台 mcpp.{linux,macosx} 块(各自完整快照:include_dirs/SIMD flags/sources/ 全部 generated_files)。零全局 generated_files(遵守 emplace-no-overwrite)。 - macOS: headless highgui(BUILTIN_BACKEND=NONE,与 linux 一致)—— OpenCV 5 在 APPLE+clang 无条件置 HAVE_COCOA 拉入 window_cocoa.mm(.mm mcpp 不支持),快照 workflow 补丁禁用之。aarch64 NEON SIMD dispatch。videoio 经 compat.ffmpeg(已三平台)。 - 新工具 tools/compat-opencv/merge_opencv.lua:把每平台单 OS 描述符合并为多平台描述符 (lua 解析+确定性重序列化,长括号字符串零损)。gen_descriptor.py 修复空 SIMD 基线 '{ , "-w" }' -> '{ "-w" }'。新增 headless macOS 快照 workflow。 - 成员放宽:opencv + opencv-unifont -> +cfg(macos)(测试守卫 __linux__ -> __linux__||__APPLE__)。 opencv-dnn 暂留 linux(dnn 为 x86 专属源,需 macOS dnn 快照)。opencv-module* 待 opencv-m 模块包放宽后。 已本地验证:mcpp xpkg parse --all-os 双平台 OK;macOS 全量构建+运行通过(PR#95 spike: core/imgproc/imgcodecs/headless-highgui/videoio+ffmpeg mp4 往返,aarch64 NEON)。
1 parent 3dab455 commit d731d83

8 files changed

Lines changed: 4162 additions & 727 deletions

File tree

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# TEMP spike: capture a macOS-arm64 FULL-profile compat.opencv config snapshot on
2+
# a real macos-15 runner (core/imgproc/imgcodecs/highgui/videoio + WITH_FFMPEG —
3+
# module parity with linux), emit the descriptor via gen_descriptor.py, upload it.
4+
# Builds a static ffmpeg 8.1.2 prefix first (cmake's videoio-FFmpeg discovery;
5+
# consumers get the libs from the compat.ffmpeg dependency instead).
6+
name: snapshot-macos-opencv
7+
on: { workflow_dispatch: {}, push: { branches: [feat/opencv-3platform] } }
8+
jobs:
9+
snapshot:
10+
runs-on: macos-15
11+
timeout-minutes: 120
12+
steps:
13+
- uses: actions/checkout@v4
14+
- run: brew install cmake ninja nasm
15+
- run: pip3 install --break-system-packages numpy || pip3 install numpy
16+
- name: fetch sources (ffmpeg 8.1.2 + opencv 5.0.0)
17+
run: |
18+
set -eux
19+
curl -L -fsS -o ffmpeg.tar.gz https://ffmpeg.org/releases/ffmpeg-8.1.2.tar.gz
20+
echo "32faba5ef67340d54724941eae1425580791195312a4fd13bf6f820a2818bf22 ffmpeg.tar.gz" | shasum -a 256 -c -
21+
tar -xzf ffmpeg.tar.gz
22+
curl -L -fsS -o opencv.tar.gz https://github.com/opencv/opencv/archive/refs/tags/5.0.0.tar.gz
23+
echo "b0528f5a1d379d59d4701cb28c36e22214cc51cf64594e5b56f2d3e6c0233095 opencv.tar.gz" | shasum -a 256 -c -
24+
tar -xzf opencv.tar.gz
25+
echo "OPENCV_SRC=$PWD/opencv-5.0.0" >> "$GITHUB_ENV"
26+
# Headless highgui on macOS to MATCH linux (same API surface, no GUI backend):
27+
# mcpp cannot compile window_cocoa.mm (.mm/Objective-C++ unsupported), and
28+
# OpenCV 5 has no WITH_COCOA switch — HAVE_COCOA is set unconditionally on
29+
# APPLE+clang in cmake/OpenCVFindLibsGUI.cmake. Neutralize that one line so the
30+
# highgui elseif-chain falls through to the headless path (like linux w/o GTK/Qt).
31+
sed -i.bak 's/set(HAVE_COCOA YES)/message(STATUS "mcpp: HAVE_COCOA disabled -> headless highgui (matches linux)")/' \
32+
"$PWD/opencv-5.0.0/cmake/OpenCVFindLibsGUI.cmake"
33+
grep -n 'HAVE_COCOA\|mcpp: HAVE_COCOA' "$PWD/opencv-5.0.0/cmake/OpenCVFindLibsGUI.cmake" || true
34+
- name: build static ffmpeg prefix (videoio backend discovery)
35+
run: |
36+
set -eux
37+
mkdir ffbuild && cd ffbuild
38+
../ffmpeg-8.1.2/configure --cc=clang --prefix="$PWD/../ffprefix" \
39+
--enable-shared --disable-static --disable-programs --disable-doc \
40+
--disable-autodetect --enable-pic
41+
make -j"$(sysctl -n hw.ncpu)" && make install
42+
echo "FFMPEG_PREFIX=$PWD/../ffprefix" >> "$GITHUB_ENV"
43+
- name: cmake configure opencv (full profile, aarch64, ffmpeg videoio)
44+
run: |
45+
set -eux
46+
PKG_CONFIG_LIBDIR="$FFMPEG_PREFIX/lib/pkgconfig" \
47+
cmake -G Ninja -S "$OPENCV_SRC" -B bld -DCMAKE_BUILD_TYPE=Release \
48+
-DBUILD_LIST=core,imgproc,imgcodecs,highgui,videoio \
49+
-DBUILD_SHARED_LIBS=OFF -DBUILD_ZLIB=ON -DBUILD_PNG=ON -DBUILD_JPEG=ON \
50+
-DWITH_TIFF=OFF -DWITH_WEBP=OFF -DWITH_OPENJPEG=OFF -DWITH_JASPER=OFF \
51+
-DWITH_OPENEXR=OFF -DWITH_AVIF=OFF -DWITH_JPEGXL=OFF -DWITH_IMGCODEC_GIF=OFF \
52+
-DWITH_OPENCL=OFF -DWITH_IPP=OFF -DWITH_LAPACK=OFF -DWITH_EIGEN=OFF -DWITH_ITT=OFF \
53+
-DWITH_QT=OFF -DWITH_OPENGL=OFF -DWITH_FFMPEG=ON -DWITH_GSTREAMER=OFF \
54+
-DWITH_AVFOUNDATION=OFF -DWITH_V4L=OFF -DWITH_OBSENSOR=OFF \
55+
-DWITH_PROTOBUF=OFF -DWITH_CAROTENE=OFF -DWITH_FLATBUFFERS=OFF \
56+
-DWITH_KLEIDICV=OFF -DWITH_NDSRVP=OFF -DWITH_HAL_RVV=OFF \
57+
-DWITH_UNIFONT=OFF -DWITH_ADE=OFF \
58+
-DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_EXAMPLES=OFF \
59+
-DBUILD_opencv_apps=OFF -DBUILD_JAVA=OFF -DBUILD_opencv_python3=OFF
60+
- name: reference build (materialize generators) + dump commands
61+
run: |
62+
ninja -C bld -k 0 > bld/ninja-build.log 2>&1 || true
63+
ninja -C bld -t commands > bld/ninja-cmds.log
64+
grep -q cap_ffmpeg bld/ninja-cmds.log || { echo 'FATAL: cap_ffmpeg not compiled — ffmpeg videoio backend not active'; exit 1; }
65+
echo "cap_ffmpeg TUs: $(grep -c cap_ffmpeg bld/ninja-cmds.log)"
66+
- name: gen descriptor
67+
run: |
68+
set -eux
69+
FFMPEG_PREFIX="$FFMPEG_PREFIX" python3 tools/compat-opencv/gen_descriptor.py \
70+
"$OPENCV_SRC" bld 5.0.0 \
71+
b0528f5a1d379d59d4701cb28c36e22214cc51cf64594e5b56f2d3e6c0233095 \
72+
compat.opencv.macgen.lua
73+
sed -e 's/^ linux = {/ macosx = {/' \
74+
-e 's/name = "compat.opencv"/name = "compat.opencvmac"/' \
75+
compat.opencv.macgen.lua > compat.opencvmac.lua
76+
grep -oE '\.(neon[a-z0-9_]*|fp16)\.cpp' bld/ninja-cmds.log | sort | uniq -c || true
77+
- uses: actions/upload-artifact@v4
78+
if: always()
79+
with:
80+
name: opencv-macos-full-snapshot
81+
path: |
82+
compat.opencvmac.lua
83+
compat.opencv.macgen.lua
84+
bld/cvconfig.h
85+
bld/ninja-cmds.log
86+
bld/ninja-build.log

0 commit comments

Comments
 (0)