diff --git a/coin/provisioning/common/unix/install-ffmpeg-ios.sh b/coin/provisioning/common/unix/install-ffmpeg-ios.sh index 67ba9f9d..6ae99c20 100755 --- a/coin/provisioning/common/unix/install-ffmpeg-ios.sh +++ b/coin/provisioning/common/unix/install-ffmpeg-ios.sh @@ -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