Update provisioning script to build FFmpeg for iOS

as xcframeworks so that we can provide both arm64 and arm64-simulator
versions (the former can be used in App Store, the latter when
working with a simulator).

Task-number: QTBUG-132313
Change-Id: Ic683f58dffcef8a06adb4a915c4e3abc4ab219e5
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
(cherry picked from commit 1968adc126)
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Reviewed-by: Jukka Jokiniva <jukka.jokiniva@qt.io>
(cherry picked from commit 27be5c2f98)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Timur Pocheptsov
2024-12-19 14:55:56 +01:00
committed by Qt Cherry-pick Bot
parent 5aec4aa157
commit d15dfbd2b4

View File

@@ -28,48 +28,49 @@ fi
ffmpeg_config_options=$(cat "${BASH_SOURCE%/*}/../shared/ffmpeg_config_options.txt")
build_ffmpeg_ios() {
local target_arch=$1
local target_platform=$1
if [ "$target_platform" == "arm64-simulator" ]; then
target_sdk="iphonesimulator"
target_platform="arm64"
minos="-mios-simulator-version-min=16.0"
else
target_sdk="iphoneos"
target_platform="arm64"
minos="-miphoneos-version-min=16.0"
# TODO: consider non-arm simulator?
fi
if [ "$target_arch" == "x86_64" ]; then
target_sdk="iphonesimulator"
target_arch="x86_64"
minos="-mios-simulator-version-min=13.0"
else
target_sdk="iphoneos"
target_arch="arm64"
minos="-miphoneos-version-min=13.0"
fi
# Note: unlike similar install-ffmpeg scripts, not $target_platform,
# but $1 (which can be arm64-simulator with arm64 target_platform).
local build_dir="$ffmpeg_source_dir/build_ios/$1"
sudo mkdir -p "$build_dir"
pushd "$build_dir"
local build_dir="$ffmpeg_source_dir/build_ios/$target_arch"
sudo mkdir -p "$build_dir"
pushd "$build_dir"
# shellcheck disable=SC2086
sudo "$ffmpeg_source_dir/configure" $ffmpeg_config_options \
# shellcheck disable=SC2086
sudo "$ffmpeg_source_dir/configure" $ffmpeg_config_options \
--sysroot="$(xcrun --sdk "$target_sdk" --show-sdk-path)" \
--enable-cross-compile \
--enable-optimizations \
--prefix=$prefix \
--arch=$target_arch \
--cc="xcrun --sdk ${target_sdk} clang -arch $target_arch" \
--cxx="xcrun --sdk ${target_sdk} clang++ -arch $target_arch" \
--ar="$(xcrun --sdk ${target_sdk} --find ar)" \
--ranlib="$(xcrun --sdk ${target_sdk} --find ranlib)" \
--strip="$(xcrun --sdk ${target_sdk} --find strip)" \
--nm="$(xcrun --sdk ${target_sdk} --find nm)" \
--target-os=darwin \
--extra-cflags="$minos" \
--extra-cxxflags="$minos" \
--enable-cross-compile \
--enable-shared \
--disable-static \
--install-name-dir='@rpath/Frameworks' \
--enable-swscale \
--enable-pthreads \
--disable-audiotoolbox
--enable-cross-compile \
--enable-optimizations \
--prefix=$prefix \
--arch=$target_platform \
--cc="xcrun --sdk ${target_sdk} clang -arch $target_platform" \
--cxx="xcrun --sdk ${target_sdk} clang++ -arch $target_platform" \
--ar="$(xcrun --sdk ${target_sdk} --find ar)" \
--ranlib="$(xcrun --sdk ${target_sdk} --find ranlib)" \
--strip="$(xcrun --sdk ${target_sdk} --find strip)" \
--nm="$(xcrun --sdk ${target_sdk} --find nm)" \
--target-os=darwin \
--extra-ldflags="$minos" \
--enable-cross-compile \
--enable-shared \
--disable-static \
--install-name-dir='@rpath' \
--enable-swscale \
--enable-pthreads \
--disable-audiotoolbox
sudo make install DESTDIR="$build_dir/installed" -j4
popd
sudo make install DESTDIR="$build_dir/installed" -j4
popd
}
install_ffmpeg() {
@@ -98,11 +99,106 @@ install_ffmpeg() {
popd >/dev/null
done
sudo cp -r $1$prefix/include $prefix
echo "LS done."
}
build_ffmpeg_ios "x86_64"
build_info_plist() {
local file_path="$1"
local framework_name="$2"
local framework_id="$3"
local minimum_version_key="MinimumOSVersion"
local minimum_os_version="16.0"
local supported_platforms="iPhoneOS"
info_plist="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
<plist version=\"1.0\">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${framework_name}</string>
<key>CFBundleIdentifier</key>
<string>${framework_id}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${framework_name}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>7.0.2</string>
<key>CFBundleVersion</key>
<string>7.0.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>${minimum_version_key}</key>
<string>${minimum_os_version}</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>${supported_platforms}</string>
</array>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>"
echo $info_plist | sudo tee ${file_path} 1>/dev/null
}
create_framework() {
# Create a 'traditional' framework from the corresponding dylib.
local framework_name="$1"
local platform="$2" # For now it's either arm64 or arm64-simulator, see below.
local ffmpeg_library_path="$ffmpeg_source_dir/build_ios/${platform}/installed/usr/local/ios/ffmpeg"
local framework_complete_path="${ffmpeg_library_path}/framework/${framework_name}.framework/${framework_name}"
sudo mkdir -p "${ffmpeg_library_path}/framework/${framework_name}.framework"
sudo cp "${ffmpeg_library_path}/lib/${framework_name}.dylib" "${ffmpeg_library_path}/framework/${framework_name}.framework/${framework_name}"
# Fix LC_ID_DYLIB (to be libavcodec.framework/libavcodec instead of @rpath/libavcodec.xx.yy.dylib
sudo install_name_tool -id @rpath/${framework_name}.framework/${framework_name} "${framework_complete_path}"
build_info_plist "${ffmpeg_library_path}/framework/${framework_name}.framework/Info.plist" "${framework_name}" "io.qt.ffmpegkit."${framework_name}
# Fix all FFmpeg-related LC_LOAD_DYLIB, similar to how we fixed LC_ID_DYLIB above:
otool -L "$framework_complete_path" | awk '/\t/ {print $1}' | egrep "$dylib_regex" | while read -r dependency_path; do
found_name=$(tmp=${dependency_path/*\/}; echo ${tmp/\.*})
if [ "$found_name" != "$framework_name" ]
then
sudo install_name_tool -change "$dependency_path" @rpath/${found_name}.framework/${found_name} "${framework_complete_path}"
fi
done
#sudo mkdir -p "$prefix/framework/"
#sudo cp -r "${ffmpeg_library_path}/framework/${framework_name}.framework" "$prefix/framework/"
}
create_xcframework() {
# Create 'traditional' framework from the corresponding dylib,
# also creating
local framework_name="$1"
local fw1="$ffmpeg_source_dir/build_ios/arm64/installed/usr/local/ios/ffmpeg/framework/${framework_name}.framework"
local fw2="$ffmpeg_source_dir/build_ios/arm64-simulator/installed/usr/local/ios/ffmpeg/framework/${framework_name}.framework"
sudo mkdir -p "$prefix/framework/"
sudo xcodebuild -create-xcframework -framework $fw1 -framework $fw2 -output "${prefix}/framework/${framework_name}.xcframework"
}
build_ffmpeg_ios "arm64-simulator"
build_ffmpeg_ios "arm64"
install_ffmpeg "$ffmpeg_source_dir/build_ios/x86_64/installed" "$ffmpeg_source_dir/build_ios/arm64/installed"
ffmpeg_libs="libavcodec libavdevice libavfilter libavformat libavutil libswresample libswscale"
for name in $ffmpeg_libs; do
create_framework $name "arm64"
create_framework $name "arm64-simulator"
done
# Create corresponding (xc)frameworks containing both arm64 and arm64-simulator frameworks:
for name in $ffmpeg_libs; do
create_xcframework $name
done
install_ffmpeg "$ffmpeg_source_dir/build_ios/arm64/installed"
SetEnvVar "FFMPEG_DIR_IOS" $prefix