Skip to content

iOS cross-compilationlink

Cross-compilation for iOS consists of the two steps below.

  • On the macOS host, build the IREE compiler. We can run it to create IREE modules.
  • Build the IREE runtime on the macOS host for iOS devices and the simulator. We can then run the IREE module on the simulator.

Prerequisiteslink

Install Xcode and iOS SDKlink

For cross-compilation, you need Xcode. It comes with the SDKs for iOS devices and the simulator, as well as the simctl tool for controlling the simulator from the command line.

Host environment setuplink

On your host platform, you should already be able to build IREE from source. Please make sure you've gone through the steps in getting started.

Configure and buildlink

Build the IREE compiler for the Hostlink

Build and install on your macOS host:

cmake -S . -B ../iree-build/ -GNinja \
  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
  -DCMAKE_INSTALL_PREFIX=../iree-build/install

cmake --build ../iree-build/ --target install

Cross-compile the IREE runtime for iOSlink

Build the runtime for the iOS Simulator.

cmake -S . -B ../build-ios-sim -GNinja \
  -DCMAKE_SYSTEM_NAME=iOS \
  -DCMAKE_OSX_SYSROOT=$(xcodebuild -version -sdk iphonesimulator Path) \
  -DCMAKE_OSX_ARCHITECTURES=arm64 \
  -DCMAKE_SYSTEM_PROCESSOR=arm64 \
  -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \
  -DCMAKE_IOS_INSTALL_COMBINED=YES \
  -DIREE_HOST_BIN_DIR="$PWD/../iree-build/install/bin" \
  -DCMAKE_INSTALL_PREFIX=../build-ios-sim/install \
  -DIREE_BUILD_COMPILER=OFF

cmake --build ../build-ios-sim --config Release --target install

Or, we can build the runtime for iOS devices it by changing the value of the -DCMAKE OSX SYSROOT option to:

  -DCMAKE_OSX_SYSROOT=$(xcodebuild -version -sdk iphoneos Path)

Running IREE modules on the iOS Simulatorlink

Run the IREE compiler on the host to generate a module.

../iree-build/install/bin/iree-compile \
  --iree-hal-target-backends=vmvx \
  samples/models/simple_abs.mlir \
  -o /tmp/simple_abs_vmvx.vmfb

We could test the generated module by running the macOS version of iree-run-module on the host.

../iree-build/install/bin/iree-run-module \
  --module=/tmp/simple_abs_vmvx.vmfb \
  --device=local-task \
  --function=abs \
  --input="f32=-5"

To run it on the iOS simulator, we need to copy the vmfb file into the iree-run-module iOS app bundle.

cp /tmp/simple_abs_vmvx.vmfb \
   ../build-ios-sim/install/bin/iree-run-module.app/

Open the iOS Simulator Manager on the host.

open -a Simulator

After creating and booting a simulator in this app, you can list it from the command-line.

xcrun simctl list devices | grep Booted

This is what should come out of the command:

    iPhone 14 Pro (12341234-ABCD-ABCD-ABCD-123412341234) (Booted)

where iPhone 14 Pro is the device being simulated and 12341234-ABCD-ABCD-ABCD-123412341234 is the simulator's unique device ID (UDID).

Install the app iree-run-module on the simulator, given its UDID.

xcrun simctl install <UDID> ../build-ios-sim/install/bin/iree-run-module.app

Check the path to the installed bundle, where the simple_abs_vmvx.vmfb module should be found.

ls $(xcrun simctl get_app_container <UDID> dev.iree.iree-run-module)

The string dev.iree.iree-run-module is the bundle identifier of the iOS app. The CMake building process generates it and saves it in the property list (plist) file ../build-ios-sim/install/bin/iree-run-module.app/Info.plist.

Launch the iree-run-module app on the simulator to run the IREE module simple_abs_vmvx.vmfb.

xcrun simctl launch --console \
  <UDID> \
  dev.iree.runmodule \
  --device=local-task \
  --function=abs \
  --input="f32=-5" \
  --module=$(xcrun simctl get_app_container <UDID> dev.iree.iree-run-module)/simple_abs_vmvx.vmfb