Build OpenCV Contrib as a .xcframework, for iOS, on a M1

We needed an OpenCV Contrib module in an iOS app, using Swift Package Manager. I thought the hardest part would be using OpenCV. How wrong I was.

Build OpenCV Contrib as a .xcframework, for iOS, on a M1
Photo by Andrea De Santis / Unsplash

Context

We needed an OpenCV Contrib module in an iOS app. When reviewing options, it was decided we would expose a Swift package, wrapping an Objective-C wrapper, that would itself be the one importing OpenCV.

This meant exposing OpenCV as a Swift Package Manager binary target. Which requires us to build a .xcframework.

Goal

Build a .xcframework that we can run on both OS devices and Intel & Apple M1 Mac iPhone / iPad Simulators. Why a .xcframework and not simply a .framework? Because while Swift Package Manager can import binaries, it can only import .xcframework ones, not .framework ones.

Requirements

  • cmake (installable using brew)
  • python3 (because python2.7 is obsolete) (installable using brew)
  • opencv source (via git clone https://github.com/opencv/opencv.git)
  • opencv_contrib source (via git clone https://github.com/opencv/opencv_contrib.git)