diff --git a/coin/provisioning/common/unix/install-ffmpeg-ios.sh b/coin/provisioning/common/unix/install-ffmpeg-ios.sh index 2f18b5c4..806a01f4 100755 --- a/coin/provisioning/common/unix/install-ffmpeg-ios.sh +++ b/coin/provisioning/common/unix/install-ffmpeg-ios.sh @@ -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=" + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${framework_name} + CFBundleIdentifier + ${framework_id} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${framework_name} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 7.0.2 + CFBundleVersion + 7.0.2 + CFBundleSignature + ???? + ${minimum_version_key} + ${minimum_os_version} + CFBundleSupportedPlatforms + + ${supported_platforms} + + NSPrincipalClass + + +" + 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