mirror of
git://code.qt.io/qt/qt5.git
synced 2026-02-24 16:05:36 +08:00
FFmpeg provisioning script for Windows loads common configuration options from a file and stores them in a global variable which is modified per toolset (LLVM, MinGW, MSVC, Android). This results in possible side effects when an installation for a certain toolset is appending to the current state of the configuration. Better approach would be to replace global variable usage with additional parameter to InstallFfmpeg function and make each specific installation pass complete set of configuration options that it requires. Fixes: QTBUG-125953 Pick-to: 6.8 6.7 6.5 Change-Id: I2484c8f65485d56efc5e02502fd31839ea14f164 Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io> Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
182 lines
6.7 KiB
PowerShell
182 lines
6.7 KiB
PowerShell
# Copyright (C) 2022 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
|
|
|
|
. "$PSScriptRoot\helpers.ps1"
|
|
|
|
# This script will install FFmpeg
|
|
$msys = "C:\Utils\msys64\usr\bin\bash"
|
|
|
|
$version = "n6.1.1"
|
|
$ffmpeg_name = "ffmpeg-" + $version;
|
|
$sha1 = "7AECCED8A0366BE407329B4E176167534233DA12"
|
|
|
|
$url_cached = "https://ci-files01-hki.ci.qt.io/input/ffmpeg/" + $version + ".zip"
|
|
$url_public = "https://github.com/FFmpeg/FFmpeg/archive/refs/tags/" +$version + ".zip"
|
|
$download_location = "C:\Windows\Temp\" + $ffmpeg_name + ".zip"
|
|
$unzip_location = "C:\"
|
|
|
|
Write-Host "Fetching FFmpeg $version..."
|
|
|
|
Download $url_public $url_cached $download_location
|
|
Verify-Checksum $download_location $sha1
|
|
Extract-7Zip $download_location $unzip_location
|
|
Remove $download_location
|
|
|
|
function GetFfmpegDefaultConfiguration {
|
|
$defaultConfiguration = Get-Content "$PSScriptRoot\..\shared\ffmpeg_config_options.txt"
|
|
Write-Host "FFmpeg default configuration: $defaultConfiguration"
|
|
|
|
return $defaultConfiguration
|
|
}
|
|
|
|
function InstallFfmpeg {
|
|
Param (
|
|
[string]$config,
|
|
[string]$buildSystem,
|
|
[string]$msystem,
|
|
[string]$additionalPath,
|
|
[string]$ffmpegDirEnvVar,
|
|
[string]$toolchain,
|
|
[bool]$shared
|
|
)
|
|
|
|
Write-Host "Configure and compile FFmpeg for $buildSystem with configuration: $config"
|
|
|
|
$oldPath = $env:PATH
|
|
|
|
if ($additionalPath) {
|
|
$env:PATH = "$additionalPath;$env:PATH"
|
|
}
|
|
$env:MSYS2_PATH_TYPE = "inherit"
|
|
$env:MSYSTEM = $msystem
|
|
|
|
$cmd = "cd /c/$ffmpeg_name"
|
|
$cmd += " && mkdir -p build/$buildSystem && cd build/$buildSystem"
|
|
$cmd += " && ../../configure --prefix=installed $config"
|
|
if ($toolchain) {
|
|
$cmd += " --toolchain=$toolchain"
|
|
}
|
|
if ($shared) {
|
|
$cmd += " --enable-shared --disable-static"
|
|
}
|
|
$cmd += " && make install -j"
|
|
|
|
Write-Host "MSYS cmd:"
|
|
Write-Host $cmd
|
|
$buildResult = Start-Process -NoNewWindow -Wait -PassThru -ErrorAction Stop -FilePath "$msys" -ArgumentList ("-lc", "`"$cmd`"")
|
|
|
|
$env:PATH = $oldPath
|
|
|
|
if ($buildResult.ExitCode) {
|
|
Write-Host "Failed to build FFmpeg for $buildSystem"
|
|
return $false
|
|
}
|
|
|
|
Set-EnvironmentVariable $ffmpegDirEnvVar "C:\$ffmpeg_name\build\$buildSystem\installed"
|
|
return $true
|
|
}
|
|
|
|
function InstallMingwFfmpeg {
|
|
$config = GetFfmpegDefaultConfiguration
|
|
$mingwPath = [System.Environment]::GetEnvironmentVariable("MINGW_PATH", [System.EnvironmentVariableTarget]::Machine)
|
|
return InstallFfmpeg -config $config -buildSystem "mingw" -msystem "MINGW" -additionalPath "$mingwPath\bin" -ffmpegDirEnvVar "FFMPEG_DIR_MINGW" -shared $true
|
|
}
|
|
|
|
|
|
function InstallMsvcFfmpeg {
|
|
Param (
|
|
[bool]$isArm64
|
|
)
|
|
|
|
$arch = "amd64"
|
|
$buildSystem = "msvc"
|
|
$ffmpegDirEnvVar = "FFMPEG_DIR_MSVC"
|
|
|
|
$config = GetFfmpegDefaultConfiguration
|
|
|
|
if ($isArm64) {
|
|
$arch = "arm64"
|
|
$buildSystem += "-arm64"
|
|
$ffmpegDirEnvVar += "_ARM64"
|
|
$config += " --enable-cross-compile --arch=arm64 --disable-asm"
|
|
}
|
|
|
|
$result = EnterVSDevShell -Arch $arch
|
|
if (-Not $result) {
|
|
return $false
|
|
}
|
|
|
|
$result = InstallFfmpeg -config $config -buildSystem $buildSystem -msystem "MSYS" -toolchain "msvc" -ffmpegDirEnvVar $ffmpegDirEnvVar -shared $true
|
|
|
|
if ($result) {
|
|
# As ffmpeg build system creates lib*.a file we have to rename them to *.lib files to be recognized by WIN32
|
|
Write-Host "Rename libraries lib*.a -> *.lib"
|
|
try {
|
|
$msvcDir = [System.Environment]::GetEnvironmentVariable("FFMPEG_DIR_MSVC", [System.EnvironmentVariableTarget]::Machine)
|
|
Get-ChildItem "$msvcDir\lib\lib*.a" | ForEach-Object {
|
|
$NewName = $_.Name -replace 'lib(\w+).a$', '$1.lib'
|
|
$Destination = Join-Path -Path $_.Directory.FullName -ChildPath $NewName
|
|
Move-Item -Path $_.FullName -Destination $Destination -Force
|
|
}
|
|
} catch {
|
|
Write-Host "Failed to rename libraries lib*.a -> *.lib"
|
|
return $false
|
|
}
|
|
}
|
|
|
|
return $result
|
|
}
|
|
|
|
|
|
function InstallLlvmMingwFfmpeg {
|
|
$config = GetFfmpegDefaultConfiguration
|
|
return InstallFfmpeg -config $config -buildSystem "llvm-mingw" -msystem "CLANG64" -ffmpegDirEnvVar "FFMPEG_DIR_LLVM_MINGW" -additionalPath "C:\llvm-mingw\bin" -shared $true
|
|
}
|
|
|
|
function InstallAndroidArmv7 {
|
|
$target_toolchain_arch="armv7a-linux-androideabi"
|
|
$target_arch="armv7-a"
|
|
$target_cpu="armv7-a"
|
|
$api_version="24"
|
|
|
|
$ndkVersionLatest = "r26b"
|
|
$ndkFolderLatest = "/c/Utils/Android/android-ndk-$ndkVersionLatest"
|
|
|
|
$toolchain="${ndkFolderLatest}/toolchains/llvm/prebuilt/windows-x86_64"
|
|
$toolchain_bin="${toolchain}/bin"
|
|
$sysroot="${toolchain}/sysroot"
|
|
$cxx="${toolchain_bin}/${target_toolchain_arch}${api_version}-clang++"
|
|
$cc="${toolchain_bin}/${target_toolchain_arch}${api_version}-clang"
|
|
$ld="${toolchain_bin}/ld.exe"
|
|
$ar="${toolchain_bin}/llvm-ar.exe"
|
|
$ranlib="${toolchain_bin}/llvm-ranlib.exe"
|
|
$nm="${toolchain_bin}/llvm-nm.exe"
|
|
$strip="${toolchain_bin}/llvm-strip.exe"
|
|
$openssl_path = [System.Environment]::GetEnvironmentVariable("OPENSSL_ANDROID_HOME_DEFAULT", [System.EnvironmentVariableTarget]::Machine)
|
|
$openssl_path = $openssl_path.Replace("\", "/")
|
|
|
|
$config = GetFfmpegDefaultConfiguration
|
|
$config += " --enable-cross-compile --target-os=android --enable-jni --enable-mediacodec --enable-openssl --enable-pthreads --enable-neon --disable-asm --disable-indev=android_camera"
|
|
$config += " --arch=$target_arch --cpu=${target_cpu} --sysroot=${sysroot} --sysinclude=${sysroot}/usr/include/"
|
|
$config += " --cc=${cc} --cxx=${cxx} --ar=${ar} --ranlib=${ranlib}"
|
|
$config += " --extra-cflags=-I$envOPENSSL_ANDROID_HOME_DEFAULT/include --extra-ldflags=-L$env:OPENSSL_ANDROID_HOME_DEFAULT/armeabi-v7a"
|
|
$config += " --extra-cflags=-I${openssl_path}/include --extra-ldflags=-L${openssl_path}/armeabi-v7a"
|
|
|
|
return InstallFfmpeg -config $config -buildSystem "android-arm" -msystem "ANDROID_CLANG" -ffmpegDirEnvVar "FFMPEG_DIR_ANDROID_ARMV7"
|
|
}
|
|
|
|
$mingwRes = InstallMingwFfmpeg
|
|
$llvmMingwRes = InstallLlvmMingwFfmpeg
|
|
$androidArmV7Res = InstallAndroidArmv7
|
|
$msvcRes = InstallMsvcFfmpeg -isArm64 $false
|
|
$msvcArm64Res = InstallMsvcFfmpeg -isArm64 $true
|
|
|
|
Write-Host "Ffmpeg installation results:"
|
|
Write-Host " mingw:" $(if ($mingwRes) { "OK" } else { "FAIL" })
|
|
Write-Host " msvc:" $(if ($msvcRes) { "OK" } else { "FAIL" })
|
|
Write-Host " msvc-arm64:" $(if ($msvcArm64Res) { "OK" } else { "FAIL" })
|
|
Write-Host " llvm-mingw:" $(if ($llvmMingwRes) { "OK" } else { "FAIL" })
|
|
Write-Host " android-armv7:" $(if ($androidArmV7Res) { "OK" } else { "FAIL" })
|
|
|
|
exit $(if ($mingwRes -and $msvcRes -and $msvcArm64Res -and $llvmMingwRes -and $androidArmV7Res) { 0 } else { 1 })
|