mirror of
git://code.qt.io/qt/qt5.git
synced 2026-02-01 19:36:04 +08:00
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). Pick-to: 6.8 6.9 Task-number: QTBUG-132313 Change-Id: Ic683f58dffcef8a06adb4a915c4e3abc4ab219e5 Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
This commit is contained in:
@@ -13,19 +13,21 @@ prefix="/usr/local/ios/ffmpeg"
|
||||
dylib_regex="^@rpath/.*\.dylib$"
|
||||
|
||||
build_ffmpeg_ios() {
|
||||
local target_arch=$1
|
||||
|
||||
if [ "$target_arch" == "x86_64" ]; then
|
||||
local target_platform=$1
|
||||
if [ "$target_platform" == "arm64-simulator" ]; then
|
||||
target_sdk="iphonesimulator"
|
||||
target_arch="x86_64"
|
||||
minos="-mios-simulator-version-min=14.0"
|
||||
target_platform="arm64"
|
||||
minos="-mios-simulator-version-min=16.0"
|
||||
else
|
||||
target_sdk="iphoneos"
|
||||
target_arch="arm64"
|
||||
minos="-miphoneos-version-min=14.0"
|
||||
target_platform="arm64"
|
||||
minos="-miphoneos-version-min=16.0"
|
||||
# TODO: consider non-arm simulator?
|
||||
fi
|
||||
|
||||
local build_dir="$ffmpeg_source_dir/build_ios/$target_arch"
|
||||
# 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"
|
||||
|
||||
@@ -35,20 +37,19 @@ build_ffmpeg_ios() {
|
||||
--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" \
|
||||
--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-cflags="$minos" \
|
||||
--extra-cxxflags="$minos" \
|
||||
--extra-ldflags="$minos" \
|
||||
--enable-cross-compile \
|
||||
--enable-shared \
|
||||
--disable-static \
|
||||
--install-name-dir='@rpath/Frameworks' \
|
||||
--install-name-dir='@rpath' \
|
||||
--enable-swscale \
|
||||
--enable-pthreads \
|
||||
--disable-audiotoolbox
|
||||
@@ -130,36 +131,59 @@ build_info_plist() {
|
||||
|
||||
|
||||
create_framework() {
|
||||
# Create a 'traditional' framework from the corresponding dylib.
|
||||
local framework_name="$1"
|
||||
local ffmpeg_library_path="$ffmpeg_source_dir/build_ios/arm64/installed/usr/local/ios/ffmpeg"
|
||||
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}"
|
||||
|
||||
sudo install_name_tool -id @rpath/Frameworks/${framework_name}.framework/${framework_name} "${framework_complete_path}"
|
||||
sudo vtool -set-build-version ios 16.0 -input ${framework_complete_path} -output ${framework_complete_path}
|
||||
# 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/Frameworks/${found_name}.framework/${found_name} "${framework_complete_path}"
|
||||
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/"
|
||||
#sudo mkdir -p "$prefix/framework/"
|
||||
#sudo cp -r "${ffmpeg_library_path}/framework/${framework_name}.framework" "$prefix/framework/"
|
||||
}
|
||||
|
||||
build_ffmpeg_ios "x86_64"
|
||||
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"
|
||||
|
||||
ffmpeg_libs="libavcodec libavdevice libavfilter libavformat libavutil libswresample libswscale"
|
||||
|
||||
for name in $ffmpeg_libs; do
|
||||
create_framework $name
|
||||
create_framework $name "arm64"
|
||||
create_framework $name "arm64-simulator"
|
||||
done
|
||||
|
||||
install_ffmpeg "$ffmpeg_source_dir/build_ios/x86_64/installed" "$ffmpeg_source_dir/build_ios/arm64/installed"
|
||||
# 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"
|
||||
|
||||
set_ffmpeg_dir_env_var "FFMPEG_DIR_IOS" $prefix
|
||||
|
||||
Reference in New Issue
Block a user