Improve ffmpeg to support for android on windows (#3312)

* add msys2 dep for ffmpeg

* run configure as shell

* add android ci on windows

* fix os

* fix os again

* improve ci

* fix if else

* dump dirs

* fix ndk path

* modify path type

* translate path

* add verbose info

* fix cross prefix

* restore ci

* limit jobs

* add verbose info

* add verbose info

* improve msys2 deps

* fix msys2

* do some test

* improve msys2 deps

* enable verbose

* use mingw64 msystem

* improve gcc deps

* improve mingw64
pull/3320/head
ruki 1 year ago committed by GitHub
parent b73f12a399
commit b88904dbee
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 58
      .github/workflows/android_windows.yml
  2. 76
      packages/f/ffmpeg/xmake.lua
  3. 35
      packages/m/msys2/xmake.lua

@ -0,0 +1,58 @@
name: Android (Windows)
on:
pull_request:
branches:
- dev
jobs:
build:
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
arch: [armeabi-v7a, arm64-v8a]
ndk: ["r22", "r26c"]
ndk_sdkver: ["29"]
concurrency:
group: ${{ github.ref }}-${{ github.base_ref }}-${{ github.head_ref }}-Android-Windows-${{ matrix.arch }}-${{ matrix.ndk }}-${{ matrix.ndk_sdkver }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v1
- uses: xmake-io/github-action-setup-xmake@v1
with:
xmake-version: branch@master
- name: Configure Pagefile
uses: al-cheb/configure-pagefile-action@v1.2
with:
minimum-size: 8GB
maximum-size: 32GB
disk-root: "D:"
- name: Prepare
run: |
if ("${{ matrix.ndk }}" -eq "r26c") {
curl -fsSL "https://dl.google.com/android/repository/android-ndk-r26c-windows.zip" -o android-ndk-r26c-windows.zip
Expand-Archive ./android-ndk-r26c-windows.zip -DestinationPath ./ndk
} else {
curl -fsSL "https://dl.google.com/android/repository/android-ndk-r22-windows-x86_64.zip" -o android-ndk-r22-windows-x86_64.zip
Expand-Archive ./android-ndk-r22-windows-x86_64.zip -DestinationPath ./ndk
}
- name: Tests
run: |
git clone https://github.com/xmake-io/xmake.git --recurse-submodules -b master xmakesrc
cd xmakesrc/core
xmake
cd ../..
Copy-Item ./xmakesrc/core/build/xmake.exe ./xmakesrc/xmake
Copy-Item ./xmakesrc/scripts/xrepo.bat ./xmakesrc/xmake
Copy-Item ./xmakesrc/scripts/xrepo.ps1 ./xmakesrc/xmake
$Env:XMAKE_MAIN_REPO = "https://github.com/xmake-io/xmake-repo.git"
$Env:XMAKE_PROGRAM_DIR = $(Resolve-Path ./xmakesrc/xmake)
Set-Item -Path Env:Path -Value ($Env:XMAKE_PROGRAM_DIR + ";" + $Env:Path)
xmake --version
xmake l ./scripts/test.lua -D -p android --ndk=D:/a/xmake-repo/xmake-repo/ndk/android-ndk-${{ matrix.ndk }} --ndk_sdkver=${{ matrix.ndk_sdkver }} -a ${{ matrix.arch }}

@ -61,32 +61,30 @@ package("ffmpeg")
add_deps("yasm")
end
if on_fetch then
on_fetch("mingw", "linux", "macosx", function (package, opt)
import("lib.detect.find_tool")
if opt.system then
local result
for _, name in ipairs({"libavcodec", "libavdevice", "libavfilter", "libavformat", "libavutil", "libpostproc", "libswresample", "libswscale"}) do
local pkginfo = package:find_package("pkgconfig::" .. name, opt)
if pkginfo then
pkginfo.version = nil
if not result then
result = pkginfo
else
result = result .. pkginfo
end
on_fetch("mingw", "linux", "macosx", function (package, opt)
import("lib.detect.find_tool")
if opt.system then
local result
for _, name in ipairs({"libavcodec", "libavdevice", "libavfilter", "libavformat", "libavutil", "libpostproc", "libswresample", "libswscale"}) do
local pkginfo = package:find_package("pkgconfig::" .. name, opt)
if pkginfo then
pkginfo.version = nil
if not result then
result = pkginfo
else
return
result = result .. pkginfo
end
else
return
end
local ffmpeg = find_tool("ffmpeg", {check = "-help", version = true, command = "-version", parse = "%d+%.?%d+%.?%d+", force = true})
if ffmpeg then
result.version = ffmpeg.version
end
return result
end
end)
end
local ffmpeg = find_tool("ffmpeg", {check = "-help", version = true, command = "-version", parse = "%d+%.?%d+%.?%d+", force = true})
if ffmpeg then
result.version = ffmpeg.version
end
return result
end
end)
on_load("linux", "macosx", "android", function (package)
local configdeps = {zlib = "zlib",
@ -108,6 +106,9 @@ package("ffmpeg")
if not package:config("gpl") then
package:set("license", "LGPL-3.0")
end
if is_subhost("windows") and os.arch() == "x64" then
package:add("deps", "msys2", {configs = {msystem = "MINGW64", mingw64_gcc = true, base_devel = true}})
end
end)
on_install("windows|x64", "mingw|x86_64", function (package)
@ -122,7 +123,7 @@ package("ffmpeg")
package:addenv("PATH", "bin")
end)
on_install("linux", "macosx", "android@linux,macosx", function (package)
on_install("linux", "macosx", "android", function (package)
local configs = {"--enable-version3",
"--disable-doc"}
if package:config("gpl") then
@ -182,6 +183,12 @@ package("ffmpeg")
else
raise("unknown arch(%s) for android!", package:arch())
end
local function _translate_path(p)
if p and is_host("windows") then
return p:gsub("\\", "/")
end
return p
end
local sysroot = path.join(path.directory(bin), "sysroot")
local cflags = table.join(table.wrap(package:config("cxflags")), table.wrap(package:config("cflags")), table.wrap(get_config("cxflags")), get_config("cflags"))
local cxxflags = table.join(table.wrap(package:config("cxflags")), table.wrap(package:config("cxxflags")), table.wrap(get_config("cxflags")), get_config("cxxflags"))
@ -201,19 +208,20 @@ package("ffmpeg")
table.insert(configs, "--disable-avdevice")
table.insert(configs, "--arch=" .. arch)
table.insert(configs, "--cpu=" .. cpu)
table.insert(configs, "--cc=" .. path.join(bin, triple .. ndk_sdkver .. "-clang"))
table.insert(configs, "--cxx=" .. path.join(bin, triple .. ndk_sdkver .. "-clang++"))
table.insert(configs, "--ar=" .. path.join(bin, "llvm-ar"))
table.insert(configs, "--ranlib=" .. path.join(bin, "llvm-ranlib"))
table.insert(configs, "--strip=" .. path.join(bin, "llvm-strip"))
table.insert(configs, "--cc=" .. _translate_path(path.join(bin, triple .. ndk_sdkver .. "-clang")))
table.insert(configs, "--cxx=" .. _translate_path(path.join(bin, triple .. ndk_sdkver .. "-clang++")))
table.insert(configs, "--ar=" .. _translate_path(path.join(bin, "llvm-ar")))
table.insert(configs, "--ranlib=" .. _translate_path(path.join(bin, "llvm-ranlib")))
table.insert(configs, "--strip=" .. _translate_path(path.join(bin, "llvm-strip")))
table.insert(configs, "--extra-cflags=" .. table.concat(cflags, ' '))
table.insert(configs, "--extra-cxxflags=" .. table.concat(cxxflags, ' '))
table.insert(configs, "--sysroot=" .. sysroot)
table.insert(configs, "--cross-prefix=" .. cross_prefix)
table.insert(configs, "--prefix=" .. package:installdir())
os.vrunv("./configure", configs)
local argv = {"-j4"}
if option.get("verbose") then
table.insert(configs, "--sysroot=" .. _translate_path(sysroot))
table.insert(configs, "--cross-prefix=" .. _translate_path(cross_prefix))
table.insert(configs, "--prefix=" .. _translate_path(package:installdir()))
os.vrunv("./configure", configs, {shell = true})
local njob = option.get("jobs") or tostring(os.default_njob())
local argv = {"-j" .. njob}
if option.get("verbose") or is_host("windows") then -- we always need enable it on windows, otherwise it will fail.
table.insert(argv, "V=1")
end
os.vrunv("make", argv)

@ -6,23 +6,52 @@ package("msys2")
add_deps("msys2-base")
add_configs("msystem", {description = "Set msys2 system.", type = "string", values = {"MSYS", "MINGW32", "MINGW64", "UCRT64", "CLANG32", "CLANG64", "CLANGARM64"}})
add_configs("pathtype", {description = "Set path type.", default = "inherit", type = "string", values = {"inherit"}})
add_configs("make", {description = "Install gnumake.", default = false, type = "boolean"})
add_configs("gcc", {description = "Install gcc.", default = false, type = "boolean"})
add_configs("diffutils", {description = "Install diffutils.", default = false, type = "boolean"})
add_configs("base_devel", {description = "Install base-devel.", default = false, type = "boolean"})
add_configs("mingw64_gcc", {description = "Install mingw64 gcc.", default = false, type = "boolean"})
add_configs("mingw64_toolchain", {description = "Install mingw64 toolchain.", default = false, type = "boolean"})
add_configs("mingw32_gcc", {description = "Install mingw32 gcc.", default = false, type = "boolean"})
add_configs("mingw32_toolchain", {description = "Install mingw32 toolchain.", default = false, type = "boolean"})
set_policy("package.precompiled", false)
on_install("@windows|x64", function (package)
local msys2_base = package:dep("msys2-base")
local bash = path.join(msys2_base:installdir("usr/bin"), "bash.exe")
local msystem = package:config("msystem")
if msystem then
package:addenv("MSYSTEM", msystem)
local bash = path.join(msys2_base:installdir("usr/bin"), "bash.exe")
if msystem == "MINGW64" then
os.vrunv(bash, {"-leo", "pipefail", "-c", "pacman --noconfirm -S --needed --overwrite * mingw-w64-x86_64-toolchain"})
package:addenv("PATH", msys2_base:installdir("mingw64/bin"))
elseif msystem == "MINGW32" then
os.vrunv(bash, {"-leo", "pipefail", "-c", "pacman --noconfirm -S --needed --overwrite * mingw-w64-i686-toolchain"})
package:addenv("PATH", msys2_base:installdir("mingw32/bin"))
end
end
local pathtype = package:config("pathtype")
if pathtype then
package:addenv("MSYS2_PATH_TYPE", pathtype)
end
package:addenv("CHERE_INVOKING", "1")
-- install additional packages
local packages = {
"gcc", "make", "diffutils",
base_devel = "base-devel",
mingw32_gcc = "mingw-w64-i686-gcc",
mingw32_toolchain = "mingw-w64-i686-toolchain",
mingw64_gcc = "mingw-w64-x86_64-gcc",
mingw64_toolchain = "mingw-w64-x86_64-toolchain"}
for k, v in pairs(packages) do
local configname = type(k) == "number" and v or k
local packagename = v
if package:config(configname) then
os.vrunv(bash, {"-leo", "pipefail", "-c", "pacman --noconfirm -S --needed --overwrite * " .. packagename})
end
end
end)
on_test(function (package)

Loading…
Cancel
Save