aboutsummaryrefslogtreecommitdiffstats
path: root/coin/provisioning/common
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2024-01-23 13:29:27 +0100
committerArtem Dyomin <artem.dyomin@qt.io>2024-03-13 11:54:46 +0000
commita53b63019fc76d36f340ff2dfc607999f08d7053 (patch)
tree6d289009462c0b056c27cf6b4c10e34f574d330b /coin/provisioning/common
parenta84104df1ca3935e62f80f106d7623d399819f90 (diff)
Implement dynamical ffmpeg linking on macOS
* fix dependencies and install names (absolute => relative) * fix compilation build of dylib on xcode 15. * add matching build instructions to yaml. * old macos versions don't have 'realpath', workaround is used. Task-number: QTBUG-120989 Pick-to: 6.7 6.6 6.5 Change-Id: I22e413d8f6d05c8c7d6d09a5926691216e781fd3 Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
Diffstat (limited to 'coin/provisioning/common')
-rwxr-xr-xcoin/provisioning/common/macos/fix_relative_dependencies.sh25
-rwxr-xr-xcoin/provisioning/common/unix/install-ffmpeg.sh39
2 files changed, 52 insertions, 12 deletions
diff --git a/coin/provisioning/common/macos/fix_relative_dependencies.sh b/coin/provisioning/common/macos/fix_relative_dependencies.sh
new file mode 100755
index 00000000..930fc110
--- /dev/null
+++ b/coin/provisioning/common/macos/fix_relative_dependencies.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+set -e
+
+# realpath is not included to macOS <= 12.
+# dir=$(realpath "$1")
+dir=$(cd "$1" && pwd)
+
+dir_length=${#dir}
+dylib_regex="^$dir/.*\.dylib$"
+
+find "$dir" -type f -name '*.dylib' | while read -r library_path; do
+ install_name=$(otool -D "$library_path" | sed -n '2p' | egrep "$dylib_regex" )
+ if [ -n "$install_name" ]; then
+ fixed_install_name="@rpath${install_name:dir_length}"
+ install_name_tool -id "$fixed_install_name" "$library_path"
+ fi
+
+ otool -L "$library_path" | awk '/\t/ {print $1}' | egrep "$dylib_regex" | while read -r dependency_path; do
+ fixed_dependency_path="@loader_path${dependency_path:dir_length}"
+ install_name_tool -change "$dependency_path" "$fixed_dependency_path" "$library_path"
+ done
+done
diff --git a/coin/provisioning/common/unix/install-ffmpeg.sh b/coin/provisioning/common/unix/install-ffmpeg.sh
index 541bec13..11495b6b 100755
--- a/coin/provisioning/common/unix/install-ffmpeg.sh
+++ b/coin/provisioning/common/unix/install-ffmpeg.sh
@@ -46,7 +46,6 @@ install_ff_nvcodec_headers() {
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig"
}
-
build_ffmpeg() {
local arch="$1"
local prefix="$2"
@@ -79,20 +78,36 @@ if [ "$os" == "linux" ]; then
sudo mv "$ffmpeg_source_dir/build/installed/usr/local/$ffmpeg_name" "/usr/local"
SetEnvVar "FFMPEG_DIR" "/usr/local/$ffmpeg_name"
-elif [ "$os" == "macos" ]; then
- brew install yasm
- export MACOSX_DEPLOYMENT_TARGET=12
- build_ffmpeg
- sudo mv "$ffmpeg_source_dir/build/installed/usr/local/$ffmpeg_name" "/usr/local"
- SetEnvVar "FFMPEG_DIR" "/usr/local/$ffmpeg_name"
+elif [ "$os" == "macos" ] || [ "$os" == "macos-universal" ]; then
+ ffmpeg_config_options+=" --enable-shared --disable-static"
-elif [ "$os" == "macos-universal" ]; then
brew install yasm
export MACOSX_DEPLOYMENT_TARGET=12
- build_ffmpeg "arm64"
- build_ffmpeg "x86_64"
+ fix_relative_dependencies="${BASH_SOURCE%/*}/../macos/fix_relative_dependencies.sh"
- sudo "${BASH_SOURCE%/*}/../macos/makeuniversal.sh" "$ffmpeg_source_dir/build/arm64/installed" "$ffmpeg_source_dir/build/x86_64/installed"
- SetEnvVar "FFMPEG_DIR" "/usr/local/$ffmpeg_name"
+ xcode_major_version=$(xcodebuild -version | awk 'NR==1 {split($2, a, "."); print a[1]}')
+ if [ $xcode_major_version -ge 15 ]; then
+ # fix the error: duplicate symbol '_av_ac3_parse_header'
+ ffmpeg_config_options+=" --extra-ldflags=-Wl,-ld_classic"
+ fi
+
+ if [ "$os" == "macos" ]; then
+ build_ffmpeg
+ install_dir="$ffmpeg_source_dir/build/installed"
+ "$fix_relative_dependencies" "$install_dir/usr/local/$ffmpeg_name/lib"
+ sudo mv "$install_dir/usr/local/$ffmpeg_name" "/usr/local"
+ else
+ build_ffmpeg "arm64"
+ build_ffmpeg "x86_64"
+
+ arm64_install_dir="$ffmpeg_source_dir/build/arm64/installed"
+ x86_64_install_dir="$ffmpeg_source_dir/build/x86_64/installed"
+
+ "$fix_relative_dependencies" "$arm64_install_dir/usr/local/$ffmpeg_name/lib"
+ "$fix_relative_dependencies" "$x86_64_install_dir/usr/local/$ffmpeg_name/lib"
+ sudo "${BASH_SOURCE%/*}/../macos/makeuniversal.sh" "$arm64_install_dir" "$x86_64_install_dir"
+ fi
+
+ SetEnvVar "FFMPEG_DIR" "/usr/local/$ffmpeg_name"
fi