Skip to content

Cross-compiling for iOS on Linux: #10964

Open
@acarlstein

Description

@acarlstein

Your Godot version:
4.4.1

Issue description:

The documentation for Cross-compiling for iOS on Linux seems outdated.
Many of the components (pbzx, xar, etc.) are wrong but they can still be obtained.

Some steps like the one below doesn't work because something is missing.

cp -r xcode/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/* iPhoneSDK/iPhoneOS${IOS_SDK_VERSION}.sdk/usr/include/c++

Or, there is no a clear example of the path (in this case for the chain):

scons platform=ios arch=arm64 target=template_release IOS_SDK_PATH="$IOS_SDK_PATH" IOS_TOOLCHAIN_PATH="$IOS_TOOLCHAIN_PATH" ios_triple="arm-apple-darwin11-"

Where IOS_TOOLCHAIN_PATH could be, in my case:

  • This: $HOME/iostoolchain/usr/bin
  • or this: $HOME/iostoolchain/usr
  • or this: $HOME/iostoolchain

Finally, it takes days for whoever is trying this the first time.
I can't even make it work yet.

I think that creating an installation bash file is required for sanity sake.

URL to the documentation page (if already existing):

(Cross-compiling for iOS on Linux)[https://docs.godotengine.org/en/stable/contributing/development/compiling/cross-compiling_for_ios_on_linux.html#cross-compiling-for-ios-on-linux]

install_ios_cross_compile.sh

First draft of the script:

#!/usr/bin/env bash
# filepath: install_ios_cross_compile.sh

set -e

# Default values from your environment
XCODE_PATH="${XCODE_PATH:-$HOME/xcode}"
IOS_SDK_VERSION="${IOS_SDK_VERSION:-16.4}"
IOS_SDK_PATH="${IOS_SDK_PATH:-$HOME/iPhoneSDK/iPhoneOS$IOS_SDK_VERSION.sdk}"
IOS_TOOLCHAIN_PATH="${IOS_TOOLCHAIN_PATH:-$HOME/iostoolchain/usr/bin}"
NONINTERACTIVE=0

# Parse arguments
for arg in "$@"; do
    case $arg in
        -y|--yes)
        NONINTERACTIVE=1
        shift
        ;;
    esac
done

ask() {
    if [ "$NONINTERACTIVE" -eq 1 ]; then
        return 0
    fi
    read -p "$1 [Y/n] " yn
    case $yn in
        [Nn]*) return 1 ;;
        *) return 0 ;;
    esac
}

install_package() {
    PKG="$1"
    if ! dpkg -s "$PKG" >/dev/null 2>&1; then
        if ask "Install $PKG?"; then
            sudo apt-get update
            sudo apt-get install -y "$PKG"
        else
            echo "Please install $PKG manually and re-run the script."
            exit 1
        fi
    fi
}

echo "Checking required programs..."

install_package clang
install_package git
install_package automake
install_package autogen
install_package libtool
install_package xz-utils
install_package cpio
install_package fuse
install_package libfuse2

# xar
if ! command -v xar >/dev/null 2>&1; then
    echo "xar not found."
    echo "You can build it from https://mackyle.github.io/xar/ or use your package manager."
    if ask "Try to install xar from apt?"; then
        sudo apt-get install -y xar
    else
        echo "Please install xar manually and re-run the script."
        exit 1
    fi
fi

# pbzx
if ! command -v pbzx >/dev/null 2>&1; then
    echo "pbzx not found."
    echo "You can get pbzx from https://github.com/NiklasRosenstein/pbzx"
    if ask "Clone and install pbzx to ~/pbzx?"; then
        git clone https://github.com/NiklasRosenstein/pbzx.git ~/pbzx
        sudo install ~/pbzx/pbzx /usr/local/bin/
    else
        echo "Please install pbzx manually and re-run the script."
        exit 1
    fi
fi

# Check for Xcode .xip
if [ ! -d "$XCODE_PATH" ]; then
    echo "Xcode not found at $XCODE_PATH."
    echo "Please download the Xcode .xip from https://developer.apple.com/download/all/?q=Xcode"
    echo "and extract it to $XCODE_PATH."
    exit 1
fi

# Prepare SDK
if [ -d "$IOS_SDK_PATH" ]; then
    echo "iOS SDK already exists at $IOS_SDK_PATH."
    if ask "Skip SDK extraction?"; then
        :
    else
        rm -rf "$IOS_SDK_PATH"
    fi
fi

if [ ! -d "$IOS_SDK_PATH" ]; then
    if ask "Extract iOS SDK version $IOS_SDK_VERSION from Xcode?"; then
        mkdir -p "$IOS_SDK_PATH"
        cp -r "$XCODE_PATH/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/"* "$IOS_SDK_PATH/"
        cp -r "$XCODE_PATH/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/"* "$IOS_SDK_PATH/usr/include/c++/"
    fi
fi

# Pack SDK
SDK_ARCHIVE="$HOME/iPhoneSDK/iPhoneOS${IOS_SDK_VERSION}.sdk.tar.xz"
if [ -f "$SDK_ARCHIVE" ]; then
    echo "SDK archive $SDK_ARCHIVE already exists."
    if ask "Skip SDK archiving?"; then
        :
    else
        rm -f "$SDK_ARCHIVE"
    fi
fi

if [ ! -f "$SDK_ARCHIVE" ]; then
    if ask "Pack the SDK into $SDK_ARCHIVE?"; then
        cd "$(dirname "$IOS_SDK_PATH")"
        tar -cf - "$(basename "$IOS_SDK_PATH")" | xz -9 -c - > "$SDK_ARCHIVE"
    fi
fi

# Build cctools
if [ -d "$HOME/cctools-port" ]; then
    echo "cctools-port already cloned."
    if ask "Skip cctools-port clone?"; then
        :
    else
        rm -rf "$HOME/cctools-port"
    fi
fi

if [ ! -d "$HOME/cctools-port" ]; then
    git clone https://github.com/tpoechtrager/cctools-port.git "$HOME/cctools-port"
fi

if [ -d "$HOME/cctools-port/usage_examples/ios_toolchain/target/bin" ]; then
    echo "cctools already built."
    if ask "Skip cctools build?"; then
        :
    else
        rm -rf "$HOME/cctools-port/usage_examples/ios_toolchain/target"
    fi
fi

if [ ! -d "$HOME/cctools-port/usage_examples/ios_toolchain/target/bin" ]; then
    cd "$HOME/cctools-port/usage_examples/ios_toolchain"
    ./build.sh "$SDK_ARCHIVE" arm64
fi

# Copy toolchain
if [ -d "$IOS_TOOLCHAIN_PATH" ]; then
    echo "Toolchain already exists at $IOS_TOOLCHAIN_PATH."
    if ask "Skip copying toolchain?"; then
        :
    else
        rm -rf "$IOS_TOOLCHAIN_PATH"
    fi
fi

if [ ! -d "$IOS_TOOLCHAIN_PATH" ]; then
    mkdir -p "$(dirname "$IOS_TOOLCHAIN_PATH")"
    cp -r "$HOME/cctools-port/usage_examples/ios_toolchain/target/bin" "$(dirname "$IOS_TOOLCHAIN_PATH")/"
fi

echo "Setup complete!"
echo "You can now build Godot for iOS using:"
echo "  scons platform=ios arch=arm64 target=template_release IOS_SDK_PATH=\"$IOS_SDK_PATH\" IOS_TOOLCHAIN_PATH=\"$IOS_TOOLCHAIN_PATH\" ios_triple=\"arm-apple-darwin11-\""

# End of script

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:manualIssues and PRs related to the Manual/Tutorials section of the documentationbugplatform:iosIssues or PRs related specifically to iostopic:buildsystem

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions